@stackonward/cli 1.4.0 → 1.5.1

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.
Files changed (55) hide show
  1. package/README.md +255 -0
  2. package/dist/index.js +14335 -603
  3. package/dist/index.js.map +1 -1
  4. package/dist/resources/deploy/ci/github/caller.yml +41 -0
  5. package/dist/resources/deploy/ci/onedev/import.yml +40 -0
  6. package/dist/resources/deploy/nginx/cache.conf +17 -0
  7. package/dist/resources/deploy/nginx/compression.conf +23 -0
  8. package/dist/resources/deploy/nginx/proxy.conf +15 -0
  9. package/dist/resources/deploy/profiles/go-service/compose.yaml +19 -0
  10. package/dist/resources/deploy/profiles/nuxt-node/Dockerfile +17 -0
  11. package/dist/resources/deploy/profiles/static-files/nginx/site.conf.template +55 -0
  12. package/dist/resources/deploy/profiles/static-nginx/Dockerfile +18 -0
  13. package/dist/resources/deploy/profiles/static-nginx/nginx/default.conf.template +28 -0
  14. package/dist/resources/deploy/targets/compose-host/deploy.config.example.json +114 -0
  15. package/dist/resources/deploy/traffic/nginx/stackonward-nginx-traffic +96 -0
  16. package/dist/resources/registry.json +30 -30
  17. package/dist/resources/templates/base/.claude/docs/architecture.md +4 -0
  18. package/dist/resources/templates/base/AGENTS.md +15 -0
  19. package/dist/resources/templates/base/CLAUDE.md +15 -0
  20. package/dist/resources/templates/go-backend/.dockerignore +25 -3
  21. package/dist/resources/templates/go-backend/deploy.config.json +26 -0
  22. package/dist/resources/templates/go-backend/docs/runtime-provenance.json +9 -6
  23. package/dist/resources/templates/go-backend/docs/source-provenance.json +33 -22
  24. package/dist/resources/templates/go-backend/internal/common/enums/register_locale.go +7 -0
  25. package/dist/resources/templates/go-backend/internal/common/enums/register_locale_test.go +30 -0
  26. package/dist/resources/templates/go-backend/internal/common/locale/locale.go +102 -76
  27. package/dist/resources/templates/go-backend/internal/common/locale/locale_test.go +168 -45
  28. package/dist/resources/templates/go-backend/internal/core/commandreplay/model.go +5 -5
  29. package/dist/resources/templates/go-backend/internal/core/commandreplay/persistence.go +20 -7
  30. package/dist/resources/templates/go-backend/internal/core/commandreplay/persistence_test.go +51 -22
  31. package/dist/resources/templates/go-backend/internal/core/commandreplay/repository.go +2 -2
  32. package/dist/resources/templates/go-backend/internal/core/commandreplay/service.go +13 -24
  33. package/dist/resources/templates/go-backend/internal/core/commandreplay/service_persistence_test.go +98 -13
  34. package/dist/resources/templates/go-backend/internal/core/commandreplay/service_test.go +61 -36
  35. package/dist/resources/templates/go-backend/internal/core/commandreplay/types.go +6 -6
  36. package/dist/resources/templates/go-backend/internal/core/integrationevent/config.go +24 -0
  37. package/dist/resources/templates/go-backend/internal/core/integrationevent/errors.go +53 -0
  38. package/dist/resources/templates/go-backend/internal/core/integrationevent/model.go +71 -0
  39. package/dist/resources/templates/go-backend/internal/core/integrationevent/persistence.go +193 -0
  40. package/dist/resources/templates/go-backend/internal/core/integrationevent/persistence_postgres_test.go +178 -0
  41. package/dist/resources/templates/go-backend/internal/core/integrationevent/persistence_test.go +168 -0
  42. package/dist/resources/templates/go-backend/internal/core/integrationevent/provider.go +16 -0
  43. package/dist/resources/templates/go-backend/internal/core/integrationevent/registry.go +69 -0
  44. package/dist/resources/templates/go-backend/internal/core/integrationevent/repository.go +17 -0
  45. package/dist/resources/templates/go-backend/internal/core/integrationevent/service.go +283 -0
  46. package/dist/resources/templates/go-backend/internal/core/integrationevent/service_test.go +433 -0
  47. package/dist/resources/templates/go-backend/internal/core/integrationevent/types.go +67 -0
  48. package/dist/resources/templates/go-backend/migrations/000001_infrastructure.down.sql +6 -0
  49. package/dist/resources/templates/go-backend/migrations/000001_infrastructure.up.sql +176 -16
  50. package/dist/resources/templates/go-backend/tests/infrastructure.sql +109 -6
  51. package/dist/resources/templates/nuxt/.claude/docs/stack.md +5 -1
  52. package/dist/resources/templates/nuxt/.dockerignore +19 -0
  53. package/dist/resources/templates/nuxt/deploy.config.json +27 -0
  54. package/dist/resources/templates/nuxt/package.json +8 -8
  55. package/package.json +5 -3
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/utils/constants.ts","../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/project.ts","../src/utils/registry.ts","../src/utils/registry-install.ts","../src/commands/add.ts","../src/utils/nuxt-config.ts","../src/commands/list.ts","../src/commands/apple.ts","../src/apple/contracts.ts","../src/apple/manifest.ts","../src/apple/credentials.ts","../src/apple/api.ts","../src/apple/state.ts","../src/apple/plan.ts","../src/apple/execute.ts","../src/apple/resources/identifiers.ts","../src/apple/resources/metadata.ts","../src/apple/resources/catalog.ts","../src/apple/resources/assets.ts","../src/apple/resources/pricing.ts","../src/apple/resources/offers.ts","../src/apple/resources/app-commerce.ts","../src/apple/resources/review.ts","../src/apple/resources/release.ts","../src/apple/resources/testflight.ts","../src/apple/process.ts","../src/apple/fastlane.ts","../src/apple/resources/build.ts","../src/apple/resources/native.ts","../src/apple/resources/inspection.ts","../src/commands/analytics.ts","../src/analytics/google-tag-manager.ts","../src/analytics/registry.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { init } from \"./commands/init.js\";\nimport { add } from \"./commands/add.js\";\nimport { list } from \"./commands/list.js\";\nimport { registerApple } from \"./commands/apple.js\";\nimport { registerAnalytics } from \"./commands/analytics.js\";\n\ndeclare const __STACKONWARD_CLI_VERSION__: string;\n\nconst program = new Command();\n\nprogram\n .name(\"stackonward\")\n .description(\"Create projects and install reusable components and snippets\")\n .version(__STACKONWARD_CLI_VERSION__);\n\nprogram\n .command(\"init [name]\")\n .description(\"Create a new project from template\")\n .option(\"-t, --template <template>\", \"Template to use\")\n .option(\"-d, --dir <directory>\", \"Target directory\")\n .option(\"--skip-install\", \"Skip dependency installation\")\n .option(\"--skip-git\", \"Skip git initialization\")\n .option(\"--module <module>\", \"Go module path (required for go-backend)\")\n .option(\"--author <author>\", \"Author name\")\n .option(\"-y, --yes\", \"Use defaults without interactive prompts\")\n .action(init);\n\nprogram\n .command(\"add [items...]\")\n .description(\"Add components or snippets to your project\")\n .option(\"-c, --component\", \"Add component(s)\")\n .option(\"-s, --snippet\", \"Add snippet(s)\")\n .option(\"-a, --all\", \"Add all items in category\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-o, --overwrite\", \"Overwrite existing files\")\n .option(\"-p, --path <path>\", \"Custom install path\")\n .action(add);\n\nprogram\n .command(\"list [type]\")\n .description(\"List available templates, components, or snippets\")\n .option(\"-t, --templates\", \"List templates\")\n .option(\"-c, --components\", \"List components\")\n .option(\"-s, --snippets\", \"List snippets\")\n .action(list);\n\nregisterApple(program);\nregisterAnalytics(program);\nawait program.parseAsync();\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { execa } from \"execa\";\nimport { TEMPLATES, PATHS, type TemplateName } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { copyFiles, copyTemplate, isDirEmpty } from \"../utils/fs.js\";\nimport { createInitialCommit, initializeGitRepository, runInstall } from \"../utils/project.js\";\nimport { loadRegistry } from \"../utils/registry.js\";\nimport { buildComponentInstallPlan } from \"../utils/registry-install.js\";\n\ninterface InitOptions {\n template?: string;\n dir?: string;\n skipInstall?: boolean;\n skipGit?: boolean;\n module?: string;\n author?: string;\n yes?: boolean;\n}\n\nconst PROMPT_OPTIONS = {\n onCancel: () => {\n throw new Error(\"Initialization cancelled\");\n },\n};\n\nexport async function init(name: string | undefined, options: InitOptions): Promise<void> {\n logger.br();\n logger.title(\"StackOnward - Project Initializer\");\n logger.br();\n\n if (options.template && !Object.hasOwn(TEMPLATES, options.template)) {\n throw new Error(`Unknown template: ${options.template}`);\n }\n if (options.yes && (!name || !options.template)) {\n throw new Error(\"Project name and --template are required with --yes\");\n }\n\n let projectName = name;\n if (!projectName) {\n const response = await prompts(\n {\n type: \"text\",\n name: \"name\",\n message: \"Project name:\",\n initial: \"my-project\",\n validate: (value: string) =>\n /^[a-z0-9-_]+$/i.test(value) || \"Project name can only contain letters, numbers, - and _\",\n },\n PROMPT_OPTIONS,\n );\n projectName = response.name;\n }\n\n if (!projectName) {\n logger.error(\"Project name is required\");\n process.exit(1);\n }\n\n if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(projectName)) {\n throw new Error(\"Invalid project name\");\n }\n\n const targetDir = options.dir\n ? path.resolve(options.dir)\n : path.resolve(process.cwd(), projectName);\n\n if (!(await isDirEmpty(targetDir))) {\n throw new Error(\n \"Target directory must be empty; initialization does not overwrite existing projects\",\n );\n }\n\n let template = options.template as TemplateName | undefined;\n if (!template || !TEMPLATES[template]) {\n const templateChoices = Object.entries(TEMPLATES).map(([key, value]) => ({\n title: value.name,\n description: value.description,\n value: key,\n }));\n\n const response = await prompts(\n {\n type: \"select\",\n name: \"template\",\n message: \"Select a template:\",\n choices: templateChoices,\n },\n PROMPT_OPTIONS,\n );\n\n template = response.template;\n }\n\n if (!template) {\n logger.error(\"Template selection is required\");\n process.exit(1);\n }\n\n const templateInfo = TEMPLATES[template];\n if (templateInfo.runtime === \"go\") {\n if (!/^[a-z0-9][a-z0-9_-]*$/.test(projectName)) {\n throw new Error(\n \"Go project names must use lowercase letters, numbers, hyphens or underscores\",\n );\n }\n validateGoModule(options.module);\n }\n const templatePath = path.join(PATHS.templates, templateInfo.path);\n\n if (!(await fs.pathExists(templatePath))) {\n logger.error(`Template \"${template}\" not found at ${templatePath}`);\n logger.info(\"Available templates:\");\n Object.entries(TEMPLATES).forEach(([key, val]) => {\n logger.info(` - ${key}: ${val.description}`);\n });\n process.exit(1);\n }\n\n const { author } =\n options.author || options.yes\n ? { author: options.author || process.env.USER || \"\" }\n : await prompts(\n {\n type: \"text\",\n name: \"author\",\n message: \"Author name (for LICENSE and package.json):\",\n initial: process.env.USER || \"your-name\",\n },\n PROMPT_OPTIONS,\n );\n\n const { shouldInstall } = options.skipInstall\n ? { shouldInstall: false }\n : options.yes\n ? { shouldInstall: true }\n : await prompts(\n {\n type: \"confirm\",\n name: \"shouldInstall\",\n message: \"Install dependencies?\",\n initial: true,\n },\n PROMPT_OPTIONS,\n );\n const { shouldGit } = options.skipGit\n ? { shouldGit: false }\n : options.yes\n ? { shouldGit: true }\n : await prompts(\n {\n type: \"confirm\",\n name: \"shouldGit\",\n message: \"Initialize git repository?\",\n initial: true,\n },\n PROMPT_OPTIONS,\n );\n\n const spinner = ora(\"Creating project...\").start();\n\n try {\n await copyTemplate(templatePath, targetDir, {\n projectName,\n PROJECT_NAME: projectName,\n author: author || \"your-name\",\n year: new Date().getFullYear().toString(),\n module: options.module || \"\",\n });\n if (templateInfo.runtime === \"go\") {\n // module 替换可能改变导入排序,生成后使用 Go 官方格式化器。\n await execa(\"gofmt\", [\"-w\", \"cmd\", \"internal\", \"pkg\", \"api\"], { cwd: targetDir });\n }\n // 通用规范集中维护,技术栈规范由所选模板提供。\n if (templateInfo.standards === \"base\") {\n const standardsPath = path.join(PATHS.templates, \"base\");\n await copyTemplate(path.join(standardsPath, \".claude\"), path.join(targetDir, \".claude\"));\n await copyFiles(\n [\"AGENTS.md\", \"CLAUDE.md\"].map((file) => ({\n src: path.join(standardsPath, file),\n dest: path.join(targetDir, file),\n })),\n );\n }\n await installTemplateRegistryItems(templateInfo, targetDir);\n\n spinner.succeed(\"Project created\");\n } catch (error) {\n spinner.fail(\"Failed to create project\");\n throw error;\n }\n\n if (shouldGit) {\n const gitSpinner = ora(\"Initializing git repository...\").start();\n try {\n await initializeGitRepository(targetDir);\n gitSpinner.succeed(\"Git repository initialized\");\n } catch (error) {\n gitSpinner.fail(\"Failed to initialize git repository\");\n throw error;\n }\n }\n\n if (shouldInstall) {\n const installSpinner = ora(\"Installing dependencies...\").start();\n try {\n if (templateInfo.runtime === \"go\") {\n await execa(\"go\", [\"mod\", \"download\"], { cwd: targetDir, stdio: \"inherit\" });\n } else {\n await runInstall(targetDir);\n }\n installSpinner.succeed(\"Dependencies installed\");\n } catch (error) {\n installSpinner.fail(\"Failed to install dependencies\");\n throw error;\n }\n }\n\n if (shouldGit) {\n const commitSpinner = ora(\"Creating initial commit...\").start();\n try {\n await createInitialCommit(targetDir);\n commitSpinner.succeed(\"Initial commit created\");\n } catch (error) {\n commitSpinner.fail(\"Failed to create initial commit\");\n throw error;\n }\n }\n\n logger.br();\n logger.success(\"Project ready!\");\n logger.br();\n logger.info(\"Next steps:\");\n logger.info(` cd ${path.relative(process.cwd(), targetDir)}`);\n if (!shouldInstall) {\n logger.info(templateInfo.runtime === \"go\" ? \" go mod download\" : \" pnpm install\");\n }\n if (templateInfo.runtime === \"go\") logger.info(\" make openapi-install\");\n logger.info(templateInfo.runtime === \"go\" ? \" make check\" : \" pnpm dev\");\n logger.br();\n}\n\nfunction validateGoModule(module: string | undefined): void {\n if (\n !module ||\n !/^[a-z0-9]+(?:[.-][a-z0-9]+)+\\/[a-zA-Z0-9_-]+(?:\\/[a-zA-Z0-9_-]+)*$/.test(module)\n ) {\n throw new Error(\"A valid --module path such as example.com/team/service is required\");\n }\n}\n\nasync function installTemplateRegistryItems(\n templateInfo: (typeof TEMPLATES)[TemplateName],\n targetDir: string,\n): Promise<void> {\n const registryItems = \"registryItems\" in templateInfo ? templateInfo.registryItems : undefined;\n if (!registryItems?.length) {\n return;\n }\n\n const registry = await loadRegistry();\n const installPlan = buildComponentInstallPlan({\n componentKeys: [...registryItems],\n framework: \"nuxt\",\n projectRoot: targetDir,\n registry,\n installContext: \"template\",\n });\n\n await copyFiles(installPlan.filesToCopy, false);\n}\n","import { fileURLToPath } from \"url\";\nimport { dirname, resolve } from \"path\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// 构建制品携带完整资源,安装后不读取调用者或源码仓库目录。\nconst RESOURCE_ROOT = resolve(__dirname, \"resources\");\n\n// Paths to different resource directories\nexport const PATHS = {\n apple: resolve(RESOURCE_ROOT, \"apple\"),\n templates: resolve(RESOURCE_ROOT, \"templates\"),\n components: resolve(RESOURCE_ROOT, \"components\"),\n snippets: resolve(RESOURCE_ROOT, \"snippets\"),\n packagesRegistry: resolve(RESOURCE_ROOT, \"registry.json\"),\n} as const;\n\n// Available templates\nexport const TEMPLATES = {\n \"mcp-server\": {\n runtime: \"node\",\n standards: \"base\",\n name: \"MCP Server\",\n description: \"Model Context Protocol server template\",\n path: \"mcp-server\",\n },\n nuxt: {\n runtime: \"node\",\n standards: \"base\",\n name: \"Nuxt\",\n description: \"Nuxt 4 product-site starter with editable registry-installed source\",\n path: \"nuxt\",\n registryItems: [\"nuxt-site-source\"],\n },\n \"go-backend\": {\n name: \"Go Backend\",\n description:\n \"Source-derived Go backend foundation with Wire and complete engineering standards\",\n path: \"go-backend\",\n runtime: \"go\",\n standards: \"self\",\n },\n} as const;\n\nexport type TemplateName = keyof typeof TEMPLATES;\n\n// Framework detection patterns\nexport const FRAMEWORK_PATTERNS = {\n nuxt: [\"nuxt\"],\n vue: [\"vue\", \"nuxt\"],\n react: [\"react\", \"next\"],\n node: [\"node\", \"express\", \"fastify\", \"mcp\"],\n} as const;\n\n// Default file paths for components\nexport const DEFAULT_PATHS = {\n nuxt: {\n components: \"app/components\",\n composables: \"app/composables\",\n utils: \"app/utils\",\n },\n vue: {\n components: \"src/components\",\n composables: \"src/composables\",\n utils: \"src/utils\",\n },\n react: {\n components: \"src/components\",\n hooks: \"src/hooks\",\n utils: \"src/utils\",\n },\n node: {\n utils: \"src/utils\",\n services: \"src/services\",\n },\n} as const;\n","import { blue, green, red, yellow, cyan, bold, dim } from \"kolorist\";\n\nexport const logger = {\n info: (msg: string) => console.log(blue(\"info\"), msg),\n success: (msg: string) => console.log(green(\"success\"), msg),\n warn: (msg: string) => console.log(yellow(\"warn\"), msg),\n error: (msg: string) => console.log(red(\"error\"), msg),\n\n // Styled outputs\n title: (msg: string) => console.log(bold(cyan(msg))),\n subtitle: (msg: string) => console.log(dim(msg)),\n step: (step: number, total: number, msg: string) => console.log(dim(`[${step}/${total}]`), msg),\n\n // Blank line\n br: () => console.log(),\n\n // Box output for important messages\n box: (title: string, content: string[]) => {\n const maxLen = Math.max(title.length, ...content.map((c) => c.length));\n const border = \"─\".repeat(maxLen + 2);\n\n console.log(`┌${border}┐`);\n console.log(`│ ${bold(title.padEnd(maxLen))} │`);\n console.log(`├${border}┤`);\n content.forEach((line) => {\n console.log(`│ ${line.padEnd(maxLen)} │`);\n });\n console.log(`└${border}┘`);\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { glob } from \"glob\";\n\n/**\n * Copy directory with template variable replacement\n */\nexport async function copyTemplate(\n src: string,\n dest: string,\n variables: Record<string, string> = {},\n): Promise<void> {\n await fs.ensureDir(dest);\n\n const files = await glob(\"**/*\", {\n cwd: src,\n dot: true,\n nodir: true,\n ignore: [\"**/node_modules/**\", \"**/.git/**\", \"**/tmp/**\", \"**/bin/**\"],\n });\n\n for (const file of files) {\n const srcPath = path.join(src, file);\n let destPath = path.join(dest, file);\n if (path.basename(file) === \"_gitignore\") {\n destPath = path.join(path.dirname(destPath), \".gitignore\");\n }\n\n // Replace template variables in filename\n for (const [key, value] of Object.entries(variables)) {\n destPath = destPath.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"), () => value);\n }\n\n await fs.ensureDir(path.dirname(destPath));\n\n // Check if file is text and should be processed\n if (isTextFile(file)) {\n let content = await fs.readFile(srcPath, \"utf-8\");\n\n // Replace template variables in content\n for (const [key, value] of Object.entries(variables)) {\n content = content.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"), () => value);\n }\n\n await fs.writeFile(destPath, content);\n await fs.chmod(destPath, (await fs.stat(srcPath)).mode);\n } else {\n await fs.copy(srcPath, destPath);\n }\n }\n}\n\n/**\n * Copy specific files to destination\n */\nexport async function copyFiles(\n files: { src: string; dest: string }[],\n overwrite = false,\n): Promise<{ copied: string[]; skipped: string[] }> {\n const copied: string[] = [];\n const skipped: string[] = [];\n\n for (const { src, dest } of files) {\n if (!overwrite && (await fs.pathExists(dest))) {\n skipped.push(dest);\n continue;\n }\n\n await fs.ensureDir(path.dirname(dest));\n await fs.copy(src, dest);\n copied.push(dest);\n }\n\n return { copied, skipped };\n}\n\n/**\n * Check if file is a text file that should be processed for template variables\n */\nfunction isTextFile(filename: string): boolean {\n const textExtensions = [\n \".ts\",\n \".go\",\n \".mod\",\n \".sum\",\n \".sh\",\n \".mjs\",\n \".sql\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".vue\",\n \".json\",\n \".md\",\n \".yml\",\n \".yaml\",\n \".html\",\n \".css\",\n \".scss\",\n \".less\",\n \".txt\",\n \".env\",\n \".env.example\",\n \".gitignore\",\n \".prettierrc\",\n \".eslintrc\",\n \".editorconfig\",\n ];\n\n const ext = path.extname(filename).toLowerCase();\n const basename = path.basename(filename);\n\n return (\n textExtensions.includes(ext) || basename.startsWith(\".\") || !ext // Files without extension are often config files\n );\n}\n\n/**\n * Read and parse JSON file\n */\nexport async function readJson<T>(filePath: string): Promise<T | null> {\n try {\n return await fs.readJson(filePath);\n } catch {\n return null;\n }\n}\n\n/**\n * Write JSON file with formatting\n */\nexport async function writeJson(filePath: string, data: unknown): Promise<void> {\n await fs.writeJson(filePath, data, { spaces: 2 });\n}\n\n/**\n * Check if directory is empty\n */\nexport async function isDirEmpty(dir: string): Promise<boolean> {\n if (!(await fs.pathExists(dir))) return true;\n const files = await fs.readdir(dir);\n return files.length === 0;\n}\n\n/**\n * Get relative path from cwd\n */\nexport function relativePath(absolutePath: string): string {\n return path.relative(process.cwd(), absolutePath);\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { execa } from \"execa\";\nimport { type FRAMEWORK_PATTERNS } from \"./constants.js\";\n\nexport interface ProjectInfo {\n name: string;\n root: string;\n packageJson: Record<string, unknown> | null;\n framework: keyof typeof FRAMEWORK_PATTERNS | null;\n hasTypeScript: boolean;\n packageManager: \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n}\n\n/** 从当前目录识别项目。 */\nexport async function detectProject(cwd = process.cwd()): Promise<ProjectInfo> {\n const packageJsonPath = path.join(cwd, \"package.json\");\n const packageJson = (await fs.pathExists(packageJsonPath))\n ? await fs.readJson(packageJsonPath)\n : null;\n\n return {\n name: packageJson?.name || path.basename(cwd),\n root: cwd,\n packageJson,\n framework: detectFramework(packageJson),\n hasTypeScript: await hasTypeScript(cwd),\n packageManager: await detectPackageManager(cwd, packageJson),\n };\n}\n\n/** 从清单依赖识别框架。 */\nfunction detectFramework(\n packageJson: Record<string, unknown> | null,\n): keyof typeof FRAMEWORK_PATTERNS | null {\n if (!packageJson) return null;\n\n const deps = {\n ...(packageJson.dependencies as Record<string, string> | undefined),\n ...(packageJson.devDependencies as Record<string, string> | undefined),\n };\n\n if (deps.nuxt) return \"nuxt\";\n if (deps.vue) return \"vue\";\n if (deps.next || deps.react) return \"react\";\n if (deps.express || deps.fastify || deps[\"@modelcontextprotocol/sdk\"]) return \"node\";\n\n return null;\n}\n\n/** 判断项目是否使用 TypeScript。 */\nasync function hasTypeScript(cwd: string): Promise<boolean> {\n return (\n (await fs.pathExists(path.join(cwd, \"tsconfig.json\"))) ||\n (await fs.pathExists(path.join(cwd, \"tsconfig.base.json\")))\n );\n}\n\n/** 优先使用清单声明,再根据锁文件识别包管理器。 */\nasync function detectPackageManager(\n cwd: string,\n packageJson?: Record<string, unknown> | null,\n): Promise<\"npm\" | \"pnpm\" | \"yarn\" | \"bun\"> {\n const manifest =\n packageJson === undefined\n ? (await fs.pathExists(path.join(cwd, \"package.json\")))\n ? ((await fs.readJson(path.join(cwd, \"package.json\"))) as Record<string, unknown>)\n : null\n : packageJson;\n if (manifest?.packageManager !== undefined) {\n if (typeof manifest.packageManager !== \"string\") {\n throw new Error(\"packageManager must be a string in <name>@<version> format\");\n }\n const match = /^(npm|pnpm|yarn|bun)@[^\\s]+$/.exec(manifest.packageManager);\n if (!match) {\n throw new Error(`Unsupported packageManager: ${manifest.packageManager}`);\n }\n return match[1] as \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n }\n if (await fs.pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (await fs.pathExists(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n if (\n (await fs.pathExists(path.join(cwd, \"bun.lock\"))) ||\n (await fs.pathExists(path.join(cwd, \"bun.lockb\")))\n )\n return \"bun\";\n return \"npm\";\n}\n\n/** 使用项目声明的包管理器安装依赖。 */\nexport async function installDependencies(\n cwd: string,\n deps: string[],\n isDev = false,\n): Promise<void> {\n const pm = await detectPackageManager(cwd);\n\n const args: string[] = [];\n\n switch (pm) {\n case \"pnpm\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-D\");\n break;\n case \"yarn\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-D\");\n break;\n case \"bun\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-d\");\n break;\n default:\n args.push(\"install\", ...deps);\n if (isDev) args.push(\"--save-dev\");\n }\n\n await execa(pm, args, { cwd, stdio: \"inherit\" });\n}\n\n/** 安装项目清单中的完整依赖。 */\nexport async function runInstall(cwd: string): Promise<void> {\n const pm = await detectPackageManager(cwd);\n await execa(pm, [\"install\"], { cwd, stdio: \"inherit\" });\n}\n\n/** 初始化空 Git 仓库。 */\nexport async function initializeGitRepository(cwd: string): Promise<void> {\n await execa(\"git\", [\"init\"], { cwd });\n}\n\n/** 提交完成物化的项目状态。 */\nexport async function createInitialCommit(cwd: string): Promise<void> {\n await execa(\"git\", [\"add\", \"-A\"], { cwd });\n await execa(\"git\", [\"commit\", \"-m\", \"chore: initial commit\"], { cwd });\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { PATHS } from \"./constants.js\";\n\nexport interface ComponentMeta {\n name: string;\n description: string;\n files: RegistryFile[];\n dependencies: string[];\n devDependencies: string[];\n registryDependencies: string[];\n framework: \"nuxt\" | \"vue\" | \"react\" | \"universal\";\n category: string;\n installContext: ComponentInstallContext;\n}\n\nexport type ComponentInstallContext = \"standalone\" | \"template\";\n\nexport interface SnippetMeta {\n name: string;\n description: string;\n files: RegistryFile[];\n dependencies: string[];\n devDependencies: string[];\n framework: \"nuxt\" | \"vue\" | \"react\" | \"node\" | \"universal\";\n category: string;\n}\n\nexport type RegistryFile =\n | string\n | {\n path: string;\n target?: string;\n };\n\n/** 可安装的包:npm 普通依赖,或 Nuxt layer(装包 + patch extends) */\nexport interface PackageMeta {\n name: string;\n description: string;\n type: \"npm\" | \"layer\";\n version?: string;\n}\n\nexport interface Registry {\n components: Record<string, ComponentMeta>;\n snippets: Record<string, SnippetMeta>;\n packages: Record<string, PackageMeta>;\n}\n\nlet registryCache: Registry | null = null;\n\n/**\n * Load the component/snippet registry\n */\nexport async function loadRegistry(): Promise<Registry> {\n if (registryCache) return registryCache;\n\n const componentsRegistry = await loadComponentsRegistry();\n const snippetsRegistry = await loadSnippetsRegistry();\n const packagesRegistry = await loadPackagesRegistry();\n\n registryCache = {\n components: componentsRegistry,\n snippets: snippetsRegistry,\n packages: packagesRegistry,\n };\n\n return registryCache;\n}\n\nasync function loadPackagesRegistry(): Promise<Record<string, PackageMeta>> {\n if (await fs.pathExists(PATHS.packagesRegistry)) {\n return await fs.readJson(PATHS.packagesRegistry);\n }\n return {};\n}\n\nasync function loadComponentsRegistry(): Promise<Record<string, ComponentMeta>> {\n const registryPath = path.join(PATHS.components, \"registry.json\");\n if (await fs.pathExists(registryPath)) {\n return await fs.readJson(registryPath);\n }\n return {};\n}\n\nasync function loadSnippetsRegistry(): Promise<Record<string, SnippetMeta>> {\n const registryPath = path.join(PATHS.snippets, \"registry.json\");\n if (await fs.pathExists(registryPath)) {\n return await fs.readJson(registryPath);\n }\n return {};\n}\n\n/**\n * Resolve all dependencies for a component (including nested registry dependencies)\n */\nexport function resolveComponentDependencies(\n componentName: string,\n registry: Registry,\n installContext: ComponentInstallContext,\n resolved: Set<string> = new Set(),\n): ComponentMeta[] {\n if (resolved.has(componentName)) return [];\n\n const component = registry.components[componentName];\n if (!component) {\n throw new Error(`Component \"${componentName}\" not found in registry`);\n }\n if (component.installContext !== installContext) {\n throw new Error(\n `Component \"${componentName}\" is only available in the ${component.installContext} install context`,\n );\n }\n\n resolved.add(componentName);\n\n const deps: ComponentMeta[] = [];\n\n // Resolve registry dependencies first\n for (const depName of component.registryDependencies) {\n deps.push(...resolveComponentDependencies(depName, registry, installContext, resolved));\n }\n\n deps.push(component);\n return deps;\n}\n\n/**\n * Get all available components for a framework\n */\nexport function getComponentsByFramework(\n registry: Registry,\n framework: \"nuxt\" | \"vue\" | \"react\",\n installContext: ComponentInstallContext,\n): ComponentMeta[] {\n return Object.values(registry.components).filter(\n (c) =>\n c.installContext === installContext &&\n (c.framework === framework ||\n c.framework === \"universal\" ||\n (framework === \"nuxt\" && c.framework === \"vue\")),\n );\n}\n\n/**\n * Get all available snippets for a framework\n */\nexport function getSnippetsByFramework(\n registry: Registry,\n framework: \"nuxt\" | \"vue\" | \"react\" | \"node\",\n): SnippetMeta[] {\n return Object.values(registry.snippets).filter(\n (s) =>\n s.framework === framework ||\n s.framework === \"universal\" ||\n (framework === \"nuxt\" && s.framework === \"vue\"),\n );\n}\n\n/**\n * Group items by category\n */\nexport function groupByCategory<T extends { category: string }>(items: T[]): Record<string, T[]> {\n return items.reduce(\n (acc, item) => {\n if (!acc[item.category]) {\n acc[item.category] = [];\n }\n acc[item.category].push(item);\n return acc;\n },\n {} as Record<string, T[]>,\n );\n}\n","import path from \"path\";\nimport { DEFAULT_PATHS, PATHS } from \"./constants.js\";\nimport {\n resolveComponentDependencies,\n type ComponentInstallContext,\n type ComponentMeta,\n type Registry,\n type RegistryFile,\n} from \"./registry.js\";\n\nexport type ComponentFramework = \"nuxt\" | \"vue\" | \"react\";\n\nexport interface ComponentInstallPlan {\n components: ComponentMeta[];\n dependencies: string[];\n devDependencies: string[];\n filesToCopy: { src: string; dest: string }[];\n}\n\nexport function resolveComponentFramework(framework: string | null): ComponentFramework | null {\n if (framework === \"nuxt\" || framework === \"vue\" || framework === \"react\") {\n return framework;\n }\n return null;\n}\n\nexport function findComponentKey(registry: Registry, component: ComponentMeta): string {\n const match = Object.entries(registry.components).find(\n ([, candidate]) => candidate === component,\n );\n return match?.[0] ?? component.name.toLowerCase();\n}\n\nexport function buildComponentInstallPlan(input: {\n componentKeys: string[];\n framework: ComponentFramework;\n projectRoot: string;\n registry: Registry;\n installContext: ComponentInstallContext;\n targetBase?: string;\n}): ComponentInstallPlan {\n const selectedComponents = input.componentKeys.flatMap((key) =>\n resolveComponentDependencies(key, input.registry, input.installContext),\n );\n const components = [\n ...new Map(\n selectedComponents.map((component) => [\n findComponentKey(input.registry, component),\n component,\n ]),\n ).values(),\n ];\n\n const filesToCopy = components.flatMap((component) =>\n component.files.map((file) =>\n resolveComponentFile({\n component,\n file,\n framework: input.framework,\n projectRoot: input.projectRoot,\n targetBase: input.targetBase,\n }),\n ),\n );\n\n return {\n components,\n dependencies: [...new Set(components.flatMap((component) => component.dependencies))],\n devDependencies: [...new Set(components.flatMap((component) => component.devDependencies))],\n filesToCopy,\n };\n}\n\nfunction resolveComponentFile(input: {\n component: ComponentMeta;\n file: RegistryFile;\n framework: ComponentFramework;\n projectRoot: string;\n targetBase?: string;\n}): { src: string; dest: string } {\n const normalized = typeof input.file === \"string\" ? { path: input.file } : input.file;\n const sourceFramework =\n input.component.framework === \"universal\" ? input.framework : input.component.framework;\n const sourcePath = path.join(PATHS.components, sourceFramework, normalized.path);\n\n if (normalized.target) {\n return {\n src: sourcePath,\n dest: path.resolve(input.projectRoot, normalized.target),\n };\n }\n\n const targetBase =\n input.targetBase || DEFAULT_PATHS[input.framework]?.components || \"src/components\";\n\n return {\n src: sourcePath,\n dest: path.resolve(input.projectRoot, targetBase, path.basename(normalized.path)),\n };\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { PATHS, DEFAULT_PATHS } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { copyFiles } from \"../utils/fs.js\";\nimport { detectProject, installDependencies } from \"../utils/project.js\";\nimport { patchNuxtConfigExtends } from \"../utils/nuxt-config.js\";\nimport {\n buildComponentInstallPlan,\n findComponentKey,\n resolveComponentFramework,\n} from \"../utils/registry-install.js\";\nimport {\n loadRegistry,\n resolveComponentDependencies,\n getComponentsByFramework,\n getSnippetsByFramework,\n groupByCategory,\n type ComponentMeta,\n type PackageMeta,\n type SnippetMeta,\n} from \"../utils/registry.js\";\n\ninterface AddOptions {\n component?: boolean;\n snippet?: boolean;\n all?: boolean;\n yes?: boolean;\n overwrite?: boolean;\n path?: string;\n}\n\nexport async function add(items: string[], options: AddOptions): Promise<void> {\n logger.br();\n\n // Detect project info\n const project = await detectProject();\n\n if (!project.packageJson) {\n logger.error(\"No package.json found. Please run this command in a project directory.\");\n process.exit(1);\n }\n\n // Load registry\n const registry = await loadRegistry();\n\n // Package dispatch (npm / layer) takes precedence for matching names\n const packageItems = items.filter((i) => registry.packages[i]).map((i) => registry.packages[i]!);\n if (packageItems.length > 0) {\n await addPackages(packageItems, project);\n }\n const nonPackageItems = items.filter((i) => !registry.packages[i]);\n if (items.length > 0 && nonPackageItems.length === 0) return;\n\n // Determine what type of items to add\n const isComponent = options.component || (!options.snippet && !options.component);\n const isSnippet = options.snippet;\n\n if (isComponent) {\n await addComponents(nonPackageItems, options, project, registry);\n } else if (isSnippet) {\n await addSnippets(nonPackageItems, options, project, registry);\n }\n}\n\n/** 安装 npm/layer 类型的包;layer 额外 patch 项目 nuxt.config 的 extends */\nasync function addPackages(\n packages: PackageMeta[],\n project: Awaited<ReturnType<typeof detectProject>>,\n): Promise<void> {\n for (const pkg of packages) {\n const spec = pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name;\n const spinner = ora(`Installing ${pkg.name}...`).start();\n try {\n await installDependencies(project.root, [spec]);\n spinner.succeed(`Installed ${pkg.name}`);\n } catch (error) {\n spinner.fail(`Failed to install ${pkg.name}`);\n throw error;\n }\n if (pkg.type === \"layer\") {\n await patchProjectNuxtConfig(project.root, pkg.name);\n }\n }\n}\n\nasync function patchProjectNuxtConfig(root: string, layer: string): Promise<void> {\n const candidates = [\"nuxt.config.ts\", \"nuxt.config.js\", \"nuxt.config.mjs\"];\n for (const file of candidates) {\n const configPath = path.join(root, file);\n if (!(await fs.pathExists(configPath))) continue;\n const source = await fs.readFile(configPath, \"utf8\");\n try {\n const patched = patchNuxtConfigExtends(source, layer);\n if (patched === source) {\n logger.info(`${layer} already in ${file} extends`);\n } else {\n await fs.writeFile(configPath, patched);\n logger.success(`Added ${layer} to ${file} extends`);\n }\n } catch {\n logger.warn(`Could not auto-patch ${file}; add \"${layer}\" to extends manually`);\n }\n return;\n }\n logger.warn(`No nuxt.config found; add \"${layer}\" to your nuxt.config extends manually`);\n}\n\nasync function addComponents(\n items: string[],\n options: AddOptions,\n project: Awaited<ReturnType<typeof detectProject>>,\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n): Promise<void> {\n const framework = resolveComponentFramework(project.framework);\n\n if (!framework) {\n logger.error(\"Could not detect framework. Supported: Nuxt, Vue, React\");\n process.exit(1);\n }\n\n const availableComponents = getComponentsByFramework(registry, framework, \"standalone\");\n\n if (availableComponents.length === 0) {\n logger.warn(`No components available for ${framework}`);\n return;\n }\n\n let selectedComponents: ComponentMeta[] = [];\n\n if (options.all) {\n // Add all components\n selectedComponents = availableComponents;\n } else if (items.length > 0) {\n // Add specified components\n for (const item of items) {\n try {\n const deps = resolveComponentDependencies(item, registry, \"standalone\");\n selectedComponents.push(...deps);\n } catch (error) {\n logger.error((error as Error).message);\n process.exit(1);\n }\n }\n } else {\n // Interactive selection\n const grouped = groupByCategory(availableComponents);\n const choices = Object.entries(grouped).flatMap(([category, components]) => [\n { title: category, disabled: true, value: \"\" },\n ...components.map((c) => ({\n title: ` ${c.name}`,\n description: c.description,\n value: findComponentKey(registry, c),\n })),\n ]);\n\n const response = await prompts({\n type: \"multiselect\",\n name: \"components\",\n message: \"Select components to add:\",\n choices,\n hint: \"- Space to select. Return to submit\",\n });\n\n if (!response.components || response.components.length === 0) {\n logger.info(\"No components selected\");\n return;\n }\n\n for (const name of response.components) {\n const deps = resolveComponentDependencies(name, registry, \"standalone\");\n selectedComponents.push(...deps);\n }\n }\n\n const componentKeys = [\n ...new Set(selectedComponents.map((component) => findComponentKey(registry, component))),\n ];\n\n if (selectedComponents.length === 0) {\n logger.info(\"No components to add\");\n return;\n }\n\n // Confirm\n if (!options.yes) {\n logger.info(\"Components to add:\");\n selectedComponents.forEach((c) => logger.info(` - ${c.name}`));\n logger.br();\n\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Proceed?\",\n initial: true,\n });\n\n if (!confirm) {\n logger.info(\"Cancelled\");\n return;\n }\n }\n\n const installPlan = buildComponentInstallPlan({\n componentKeys,\n framework,\n projectRoot: project.root,\n registry,\n installContext: \"standalone\",\n targetBase: options.path,\n });\n\n // Copy files\n const spinner = ora(\"Adding components...\").start();\n\n try {\n const { copied, skipped } = await copyFiles(installPlan.filesToCopy, options.overwrite);\n\n spinner.succeed(`Added ${copied.length} file(s)`);\n\n if (skipped.length > 0) {\n logger.warn(`Skipped ${skipped.length} existing file(s). Use --overwrite to replace.`);\n }\n } catch (error) {\n spinner.fail(\"Failed to add components\");\n throw error;\n }\n\n // Install dependencies\n const uniqueDeps = installPlan.dependencies;\n const uniqueDevDeps = installPlan.devDependencies;\n\n if (uniqueDeps.length > 0 || uniqueDevDeps.length > 0) {\n const { shouldInstall } = options.yes\n ? { shouldInstall: true }\n : await prompts({\n type: \"confirm\",\n name: \"shouldInstall\",\n message: \"Install required dependencies?\",\n initial: true,\n });\n\n if (shouldInstall) {\n const installSpinner = ora(\"Installing dependencies...\").start();\n try {\n if (uniqueDeps.length > 0) {\n await installDependencies(project.root, uniqueDeps, false);\n }\n if (uniqueDevDeps.length > 0) {\n await installDependencies(project.root, uniqueDevDeps, true);\n }\n installSpinner.succeed(\"Dependencies installed\");\n } catch (error) {\n installSpinner.fail(\"Failed to install some dependencies\");\n }\n }\n }\n\n logger.br();\n logger.success(\"Done!\");\n}\n\nasync function addSnippets(\n items: string[],\n options: AddOptions,\n project: Awaited<ReturnType<typeof detectProject>>,\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n): Promise<void> {\n const framework =\n project.framework === \"nuxt\"\n ? \"nuxt\"\n : project.framework === \"vue\"\n ? \"vue\"\n : project.framework === \"react\"\n ? \"react\"\n : \"node\";\n\n const availableSnippets = getSnippetsByFramework(registry, framework);\n\n if (availableSnippets.length === 0) {\n logger.warn(`No snippets available for ${framework}`);\n return;\n }\n\n let selectedSnippets: SnippetMeta[] = [];\n\n if (options.all) {\n selectedSnippets = availableSnippets;\n } else if (items.length > 0) {\n for (const item of items) {\n const snippet = registry.snippets[item];\n if (!snippet) {\n logger.error(`Snippet \"${item}\" not found`);\n process.exit(1);\n }\n selectedSnippets.push(snippet);\n }\n } else {\n const grouped = groupByCategory(availableSnippets);\n const choices = Object.entries(grouped).flatMap(([category, snippets]) => [\n { title: category, disabled: true, value: \"\" },\n ...snippets.map((s) => ({\n title: ` ${s.name}`,\n description: s.description,\n value: s.name.toLowerCase(),\n })),\n ]);\n\n const response = await prompts({\n type: \"multiselect\",\n name: \"snippets\",\n message: \"Select snippets to add:\",\n choices,\n hint: \"- Space to select. Return to submit\",\n });\n\n if (!response.snippets || response.snippets.length === 0) {\n logger.info(\"No snippets selected\");\n return;\n }\n\n selectedSnippets = response.snippets.map((name: string) => registry.snippets[name]);\n }\n\n if (selectedSnippets.length === 0) {\n logger.info(\"No snippets to add\");\n return;\n }\n\n // Confirm\n if (!options.yes) {\n logger.info(\"Snippets to add:\");\n selectedSnippets.forEach((s) => logger.info(` - ${s.name}`));\n logger.br();\n\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Proceed?\",\n initial: true,\n });\n\n if (!confirm) {\n logger.info(\"Cancelled\");\n return;\n }\n }\n\n // Determine target path\n const targetBase = options.path || DEFAULT_PATHS[framework]?.utils || \"src/utils\";\n const targetDir = path.resolve(project.root, targetBase);\n\n // Copy files\n const spinner = ora(\"Adding snippets...\").start();\n\n const filesToCopy: { src: string; dest: string }[] = [];\n\n for (const snippet of selectedSnippets) {\n // Use snippet's own framework for source path (node, vue, react, or universal -> node)\n const snippetFramework = snippet.framework === \"universal\" ? \"node\" : snippet.framework;\n const snippetDir = path.join(PATHS.snippets, snippetFramework);\n\n for (const file of snippet.files) {\n const normalized = typeof file === \"string\" ? { path: file } : file;\n filesToCopy.push({\n src: path.join(snippetDir, normalized.path),\n dest: normalized.target\n ? path.resolve(project.root, normalized.target)\n : path.join(targetDir, path.basename(normalized.path)),\n });\n }\n }\n\n try {\n const { copied, skipped } = await copyFiles(filesToCopy, options.overwrite);\n spinner.succeed(`Added ${copied.length} file(s)`);\n\n if (skipped.length > 0) {\n logger.warn(`Skipped ${skipped.length} existing file(s)`);\n }\n } catch (error) {\n spinner.fail(\"Failed to add snippets\");\n throw error;\n }\n\n logger.br();\n logger.success(\"Done!\");\n}\n","function escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * 幂等地把一个 layer 加入 nuxt.config 的 `extends` 数组。\n * - 已含该 layer → 原样返回\n * - 已有 extends 数组 → 在数组头插入\n * - 仅有 defineNuxtConfig({ ... }) → 注入 extends\n * - 都识别不了 → 抛错,由调用方提示手动添加\n */\nexport function patchNuxtConfigExtends(source: string, layer: string): string {\n const already = new RegExp(`extends\\\\s*:\\\\s*\\\\[[^\\\\]]*['\"]${escapeRegExp(layer)}['\"]`);\n if (already.test(source)) return source;\n\n const extendsArray = /extends\\s*:\\s*\\[/;\n if (extendsArray.test(source)) {\n return source.replace(extendsArray, (match) => `${match}\"${layer}\", `);\n }\n\n const define = /defineNuxtConfig\\(\\{/;\n if (define.test(source)) {\n return source.replace(define, (match) => `${match}\\n extends: [\"${layer}\"],`);\n }\n\n throw new Error(\n \"Could not locate defineNuxtConfig in nuxt.config; add the layer to `extends` manually\",\n );\n}\n","import { TEMPLATES } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n loadRegistry,\n groupByCategory,\n type ComponentMeta,\n type SnippetMeta,\n} from \"../utils/registry.js\";\n\ninterface ListOptions {\n templates?: boolean;\n components?: boolean;\n snippets?: boolean;\n}\n\nexport async function list(type: string | undefined, options: ListOptions): Promise<void> {\n logger.br();\n\n const showAll = !options.templates && !options.components && !options.snippets && !type;\n const showTemplates = options.templates || type === \"templates\" || showAll;\n const showComponents = options.components || type === \"components\" || showAll;\n const showSnippets = options.snippets || type === \"snippets\" || showAll;\n\n if (showTemplates) {\n listTemplates();\n }\n\n if (showComponents) {\n await listComponents();\n }\n\n if (showSnippets) {\n await listSnippets();\n }\n}\n\nfunction listTemplates(): void {\n logger.title(\"Templates\");\n logger.br();\n\n const entries = Object.entries(TEMPLATES);\n\n if (entries.length === 0) {\n logger.info(\" No templates available\");\n } else {\n for (const [key, template] of entries) {\n logger.info(` ${key}`);\n logger.subtitle(` ${template.description}`);\n }\n }\n\n logger.br();\n logger.subtitle(\" Usage: stackonward init --template <name>\");\n logger.br();\n}\n\nasync function listComponents(): Promise<void> {\n logger.title(\"Components\");\n logger.br();\n\n const registry = await loadRegistry();\n const components = Object.values(registry.components);\n\n if (components.length === 0) {\n logger.info(\" No components available\");\n logger.br();\n return;\n }\n\n // Group by framework first\n const byFramework: Record<string, ComponentMeta[]> = {};\n for (const component of components) {\n const fw = component.framework;\n if (!byFramework[fw]) byFramework[fw] = [];\n byFramework[fw].push(component);\n }\n\n for (const [framework, fwComponents] of Object.entries(byFramework)) {\n logger.info(` [${framework}]`);\n\n const grouped = groupByCategory(fwComponents);\n\n for (const [category, catComponents] of Object.entries(grouped)) {\n logger.subtitle(` ${category}/`);\n for (const component of catComponents) {\n logger.info(` - ${component.name.toLowerCase()}: ${component.description}`);\n }\n }\n\n logger.br();\n }\n\n logger.subtitle(\" Usage: stackonward add <component-name>\");\n logger.br();\n}\n\nasync function listSnippets(): Promise<void> {\n logger.title(\"Snippets\");\n logger.br();\n\n const registry = await loadRegistry();\n const snippets = Object.values(registry.snippets);\n\n if (snippets.length === 0) {\n logger.info(\" No snippets available\");\n logger.br();\n return;\n }\n\n // Group by framework first\n const byFramework: Record<string, SnippetMeta[]> = {};\n for (const snippet of snippets) {\n const fw = snippet.framework;\n if (!byFramework[fw]) byFramework[fw] = [];\n byFramework[fw].push(snippet);\n }\n\n for (const [framework, fwSnippets] of Object.entries(byFramework)) {\n logger.info(` [${framework}]`);\n\n const grouped = groupByCategory(fwSnippets);\n\n for (const [category, catSnippets] of Object.entries(grouped)) {\n logger.subtitle(` ${category}/`);\n for (const snippet of catSnippets) {\n logger.info(` - ${snippet.name.toLowerCase()}: ${snippet.description}`);\n }\n }\n\n logger.br();\n }\n\n logger.subtitle(\" Usage: stackonward add -s <snippet-name>\");\n logger.br();\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { mkdir, writeFile, readFile, realpath } from \"node:fs/promises\";\nimport { copyTemplate, copyFiles, isDirEmpty } from \"../utils/fs.js\";\nimport { PATHS } from \"../utils/constants.js\";\nimport {\n DeliveryError,\n intents,\n parseIntent,\n type CommandResult,\n type DeliveryPlan,\n} from \"../apple/contracts.js\";\nimport {\n loadManifest,\n manifestSchema,\n parseSchema,\n readJsonFile,\n validateStage,\n fileDigest,\n} from \"../apple/manifest.js\";\nimport { loadCredentials } from \"../apple/credentials.js\";\nimport { createAppleGateway } from \"../apple/api.js\";\nimport { bindingPath, readBindings, writePrivateJson } from \"../apple/state.js\";\nimport { PlanBuilder } from \"../apple/plan.js\";\nimport { executePlan } from \"../apple/execute.js\";\nimport { planIdentifiers, findApp } from \"../apple/resources/identifiers.js\";\nimport { planMetadata } from \"../apple/resources/metadata.js\";\nimport { planCatalog } from \"../apple/resources/catalog.js\";\nimport {\n planAssets,\n planCatalogAssets,\n planReviewAttachments,\n createAssetTransfer,\n} from \"../apple/resources/assets.js\";\nimport { planPricing } from \"../apple/resources/pricing.js\";\nimport { planOffers } from \"../apple/resources/offers.js\";\nimport { planAppCommerce } from \"../apple/resources/app-commerce.js\";\nimport { planReview } from \"../apple/resources/review.js\";\nimport { planRelease } from \"../apple/resources/release.js\";\nimport { planTestFlight } from \"../apple/resources/testflight.js\";\nimport { createProcessRunner } from \"../apple/process.js\";\nimport { createAppleBuildTools } from \"../apple/fastlane.js\";\nimport { planSigning, planBuild, planUpload } from \"../apple/resources/build.js\";\nimport { planNative } from \"../apple/resources/native.js\";\nimport { inspectDelivery, runtimeHandoff } from \"../apple/resources/inspection.js\";\nimport { validateImage } from \"../apple/resources/assets.js\";\n\ninterface Options {\n manifest: string;\n account?: string;\n scope: string;\n intent?: string;\n state?: string;\n plan?: string;\n out?: string;\n yes?: boolean;\n json?: boolean;\n offline?: boolean;\n}\n\n/** 输出只使用本工具定义的安全字段,不序列化异常或供应商正文。 */\nasync function guarded(run: () => Promise<unknown>, json = false): Promise<void> {\n try {\n const result = await run();\n process.stdout.write(JSON.stringify(result, null, json ? undefined : 2) + \"\\n\");\n } catch (error) {\n const failure =\n error instanceof DeliveryError ? error : new DeliveryError(\"apple_command_failed\", 5);\n process.stdout.write(\n JSON.stringify({\n schemaVersion: 1,\n outcome: failure.exitCode === 7 ? \"unknown\" : \"failed\",\n code: failure.code,\n field: failure.field,\n httpStatus: failure.httpStatus,\n }) + \"\\n\",\n );\n process.exitCode = failure.exitCode;\n }\n}\n\nexport function registerApple(program: Command): void {\n const apple = program\n .command(\"apple\")\n .description(\"Plan, reconcile and verify Apple app delivery\");\n apple\n .command(\"import-assets <directory> <files...>\")\n .description(\"Copy explicit local artwork into an empty product asset directory\")\n .action((directory: string, files: string[]) =>\n guarded(async () => {\n const target = path.resolve(directory);\n if (!(await isDirEmpty(target)))\n throw new DeliveryError(\"initialization_directory_not_empty\", 2);\n const inputs = await Promise.all(\n files.map(async (filename) => {\n const source = await realpath(filename),\n name = path.basename(source),\n bytes = await readFile(source);\n if (!/\\.(png|jpe?g|mp4|mov)$/i.test(name))\n throw new DeliveryError(\"unsupported_asset_format\", 2);\n if (/\\.(png|jpe?g)$/i.test(name)) validateImage(bytes);\n return { source, name, sha256: fileDigest(bytes) };\n }),\n );\n if (new Set(inputs.map((v) => v.name.toLowerCase())).size !== inputs.length)\n throw new DeliveryError(\"duplicate_asset_filename\", 2);\n const copied = await copyFiles(\n inputs.map((v) => ({ src: v.source, dest: path.join(target, v.name) })),\n );\n if (copied.skipped.length) throw new DeliveryError(\"asset_destination_changed\", 4);\n for (const input of inputs) {\n if (fileDigest(await readFile(path.join(target, input.name))) !== input.sha256)\n throw new DeliveryError(\"asset_source_changed\", 4);\n }\n await writeFile(\n path.join(target, \"provenance.json\"),\n JSON.stringify(\n { schemaVersion: 1, files: inputs.map(({ name, sha256 }) => ({ file: name, sha256 })) },\n null,\n 2,\n ) + \"\\n\",\n { flag: \"wx\" },\n );\n return {\n outcome: \"verified\",\n files: inputs.map(({ name, sha256 }) => ({ file: name, sha256 })),\n };\n }),\n );\n for (const mode of [\"status\", \"export\", \"handoff\"] as const)\n apple\n .command(mode)\n .description(\"Read Apple resources without publishing or changing configuration\")\n .requiredOption(\"--manifest <file>\", \"Product manifest\")\n .requiredOption(\"--account <file>\", \"Private account JSON\")\n .option(\"--state <directory>\", \"Private binding directory\")\n .option(\"--out <file>\", \"New private JSON export file\")\n .option(\"--json\", \"Machine-readable JSON\")\n .action((options: Options) =>\n guarded(async () => {\n const loaded = await loadManifest(path.resolve(options.manifest));\n const credentials = await loadCredentials(path.resolve(options.account!));\n const state = path.resolve(\n options.state ??\n path.join(\n os.homedir(),\n \".stackonward\",\n \"apple\",\n credentials.fingerprint,\n loaded.manifest.app.bundleId,\n ),\n );\n const bindings = await readBindings(\n bindingPath(state, credentials.fingerprint, loaded.manifest.app.bundleId),\n );\n const builder = new PlanBuilder(\n loaded,\n parseIntent(\"setup\", \"reconcile\"),\n credentials.fingerprint,\n Date.now(),\n bindings,\n );\n const api = createAppleGateway(credentials);\n if (mode === \"export\" && !options.out)\n throw new DeliveryError(\"export_destination_required\", 2);\n const result =\n mode === \"handoff\"\n ? await runtimeHandoff(builder, api)\n : {\n schemaVersion: 1,\n bundleId: loaded.manifest.app.bundleId,\n resources: await inspectDelivery(builder, api, mode === \"export\"),\n manualRequirements: builder.requirements,\n };\n if (options.out) {\n const destination = path.resolve(options.out);\n await mkdir(path.dirname(destination), { recursive: true, mode: 0o700 });\n await writeFile(destination, JSON.stringify(result, null, 2) + \"\\n\", {\n flag: \"wx\",\n mode: 0o600,\n });\n }\n return result;\n }, options.json),\n );\n apple\n .command(\"schema\")\n .description(\"Print the versioned manifest JSON Schema\")\n .action(() => guarded(async () => z.toJSONSchema(manifestSchema)));\n apple\n .command(\"init <directory>\")\n .description(\"Create an empty Apple delivery workspace\")\n .requiredOption(\"--bundle-id <id>\", \"Explicit iOS bundle identifier\")\n .requiredOption(\"--name <name>\", \"App display name\")\n .action((directory: string, options: { bundleId: string; name: string }) =>\n guarded(async () => {\n const manifest = parseSchema(manifestSchema, {\n schemaVersion: 1,\n app: { bundleId: options.bundleId, name: options.name, platform: \"IOS\" },\n });\n const target = path.resolve(directory);\n if (!(await isDirEmpty(target)))\n throw new DeliveryError(\"initialization_directory_not_empty\", 2);\n await mkdir(target, { recursive: true });\n await copyTemplate(PATHS.apple, target);\n await writeFile(path.join(target, \"app.json\"), JSON.stringify(manifest, null, 2) + \"\\n\", {\n flag: \"wx\",\n });\n await writeFile(\n path.join(target, \"manifest.schema.json\"),\n JSON.stringify(z.toJSONSchema(manifestSchema), null, 2) + \"\\n\",\n { flag: \"wx\" },\n );\n return {\n schemaVersion: 1,\n outcome: \"verified\",\n directory: target,\n verifiedChecks: [\"manifest\", \"bundled-resources\"],\n };\n }),\n );\n for (const mode of [\"preflight\", \"plan\", \"apply\", \"verify\"] as const) {\n apple\n .command(mode)\n .description(`${mode} one explicitly selected delivery scope`)\n .requiredOption(\"--manifest <file>\", \"Product manifest\")\n .requiredOption(\"--scope <scope>\", `Scope: ${Object.keys(intents).join(\", \")}`)\n .option(\"--intent <action>\", \"Explicit action within the scope\")\n .option(\"--account <file>\", \"Private account JSON (mode 0600)\")\n .option(\"--state <directory>\", \"Private durable state directory\")\n .option(\"--plan <file>\", \"Saved plan to revalidate and apply\")\n .option(\"--out <file>\", \"Save private plan JSON\")\n .option(\"--offline\", \"Validate local configuration only\")\n .option(\"--yes\", \"Execute the exact saved intent\")\n .option(\"--json\", \"Machine-readable JSON\")\n .action((options: Options) => guarded(() => runApple(mode, options), options.json));\n }\n}\n\nasync function runApple(\n mode: \"preflight\" | \"plan\" | \"apply\" | \"verify\",\n options: Options,\n): Promise<unknown> {\n const intent = parseIntent(options.scope, options.intent ?? \"reconcile\");\n const loaded = await loadManifest(path.resolve(options.manifest));\n validateStage(loaded.manifest, intent.scope);\n if (options.offline) {\n if (mode !== \"preflight\") throw new DeliveryError(\"offline_requires_preflight\", 2);\n return {\n schemaVersion: 1,\n scope: intent.scope,\n outcome: \"verified\",\n verifiedChecks: [\"local-manifest\", \"referenced-files\"],\n remoteVerified: false,\n inputDigest: loaded.inputDigest,\n };\n }\n if (!options.account) throw new DeliveryError(\"account_configuration_required\", 2);\n const credentials = await loadCredentials(path.resolve(options.account));\n const state = path.resolve(\n options.state ??\n path.join(\n os.homedir(),\n \".stackonward\",\n \"apple\",\n credentials.fingerprint,\n loaded.manifest.app.bundleId,\n ),\n );\n const controller = new AbortController();\n const cancel = () => controller.abort();\n process.once(\"SIGINT\", cancel);\n process.once(\"SIGTERM\", cancel);\n try {\n const api = createAppleGateway(credentials, { signal: controller.signal });\n const prepare = async () => {\n const current = await loadManifest(path.resolve(options.manifest));\n const bindings = await readBindings(\n bindingPath(state, credentials.fingerprint, current.manifest.app.bundleId),\n );\n const builder = new PlanBuilder(\n current,\n intent,\n credentials.fingerprint,\n Date.now(),\n bindings,\n );\n const transfer = createAssetTransfer({ signal: controller.signal });\n const runner = createProcessRunner(controller.signal);\n const buildTools = createAppleBuildTools(\n current,\n credentials,\n runner,\n PATHS.apple,\n controller.signal,\n );\n switch (intent.scope) {\n case \"setup\":\n await planIdentifiers(builder, api);\n break;\n case \"native\":\n await planNative(builder, credentials, buildTools);\n break;\n case \"metadata\":\n await planMetadata(builder, api);\n break;\n case \"catalog\":\n await planCatalog(builder, api);\n break;\n case \"assets\":\n if (current.manifest.assets) await planAssets(builder, api, transfer);\n if (intent.action === \"reconcile\") {\n await planCatalogAssets(builder, api, transfer);\n await planReviewAttachments(builder, api, transfer);\n }\n break;\n case \"pricing\":\n if (await findApp(builder, api)) {\n if (current.manifest.catalog) {\n await planPricing(builder, api);\n await planOffers(builder, api);\n }\n await planAppCommerce(builder, api);\n }\n break;\n case \"review\":\n if (await findApp(builder, api)) await planReview(builder, api);\n break;\n case \"release\":\n await planRelease(builder, api);\n break;\n case \"testflight\":\n if (await findApp(builder, api)) await planTestFlight(builder, api);\n break;\n case \"signing\":\n await planSigning(builder, credentials, buildTools);\n break;\n case \"build\":\n await planBuild(builder, credentials, buildTools, runner);\n break;\n case \"upload\":\n if (await findApp(builder, api))\n await planUpload(builder, api, credentials, buildTools, runner, controller.signal);\n break;\n }\n return builder.finish();\n };\n if (mode === \"apply\") {\n if (!options.yes || !options.plan)\n throw new DeliveryError(\"saved_plan_and_explicit_execution_required\", 2);\n const saved = (await readJsonFile(path.resolve(options.plan))) as DeliveryPlan;\n if (\n !saved ||\n typeof saved !== \"object\" ||\n saved.scope !== intent.scope ||\n saved.intent?.action !== intent.action ||\n saved.accountFingerprint !== credentials.fingerprint ||\n saved.bundleId !== loaded.manifest.app.bundleId\n )\n throw new DeliveryError(\"plan_identity_mismatch\", 4);\n const result = await executePlan(saved, prepare, state, controller.signal);\n process.exitCode =\n result.receipt.outcome === \"verified\"\n ? 0\n : result.receipt.outcome === \"blocked\"\n ? 6\n : result.receipt.outcome === \"unknown\"\n ? 7\n : result.receipt.outcome === \"cancelled\"\n ? 130\n : 5;\n return result;\n }\n const prepared = await prepare();\n if (mode === \"plan\") {\n if (options.out) await writePrivateJson(path.resolve(options.out), prepared.plan);\n return prepared.plan;\n }\n const outcome =\n prepared.plan.manualRequirements.length ||\n (mode === \"verify\" && prepared.plan.operations.length)\n ? \"blocked\"\n : \"verified\";\n if (outcome === \"blocked\") process.exitCode = prepared.plan.manualRequirements.length ? 6 : 4;\n return {\n schemaVersion: 1,\n scope: intent.scope,\n intent,\n outcome,\n verifiedChecks: [\n \"local-manifest\",\n ...([\"native\", \"build\", \"signing\"].includes(intent.scope)\n ? [\"local-toolchain\"]\n : [\"authenticated-api-read\"]),\n ...(mode === \"verify\" && outcome === \"verified\" ? [\"desired-state\"] : []),\n ],\n pendingOperations: prepared.plan.operations,\n resources: prepared.resources,\n manualRequirements: prepared.plan.manualRequirements,\n } satisfies CommandResult & { pendingOperations: unknown[] };\n } finally {\n process.off(\"SIGINT\", cancel);\n process.off(\"SIGTERM\", cancel);\n }\n}\n","export const intents = {\n setup: [\"reconcile\"],\n native: [\"configure\"],\n metadata: [\"reconcile\"],\n assets: [\"reconcile\", \"remove-owned-assets\"],\n catalog: [\"reconcile\"],\n pricing: [\"reconcile\"],\n signing: [\"initialize\", \"sync\"],\n build: [\"archive\"],\n upload: [\"upload\"],\n testflight: [\"prepare\", \"review\", \"distribute\", \"invite\"],\n review: [\"prepare\", \"submit\", \"withdraw\"],\n release: [\"configure\", \"publish\", \"pause\", \"resume\", \"complete\"],\n} as const;\nexport type Scope = keyof typeof intents;\nexport type Intent = { [S in Scope]: { scope: S; action: (typeof intents)[S][number] } }[Scope];\nexport type Outcome = \"verified\" | \"blocked\" | \"failed\" | \"unknown\" | \"cancelled\";\nexport interface ResourceReference {\n type: string;\n id: string;\n}\nexport interface AppleResource extends ResourceReference {\n attributes: Record<string, unknown>;\n relationships?: Record<string, { data?: ResourceReference | ResourceReference[] | null }>;\n}\nexport interface ManualRequirement {\n code: string;\n stage: Scope;\n reason: string;\n consoleUrl: string;\n evidence: \"remote-readback\" | \"operator-attestation\";\n blockedOperationIds: string[];\n}\nexport interface Operation {\n id: string;\n resourceKey: string;\n action:\n | \"create\"\n | \"update\"\n | \"upload\"\n | \"submit\"\n | \"release\"\n | \"withdraw\"\n | \"distribute\"\n | \"invite\"\n | \"pause\"\n | \"resume\"\n | \"complete\"\n | \"remove-owned-asset\";\n fields: string[];\n dependencies: string[];\n beforeDigest: string;\n desiredDigest: string;\n}\nexport interface DeliveryPlan {\n schemaVersion: 1;\n scope: Scope;\n intent: Intent;\n accountFingerprint: string;\n bundleId: string;\n appId?: string;\n inputDigest: string;\n snapshotDigest: string;\n createdAt: string;\n expiresAt: string;\n operations: Operation[];\n commercialConfiguration?: Record<string, unknown>;\n manualRequirements: ManualRequirement[];\n}\nexport interface ExecutionReceipt {\n executionId: string;\n scope: Scope;\n intent: Intent;\n inputDigest: string;\n outcome: Outcome;\n completed: ResourceReference[];\n pending: string[];\n manualRequirements: ManualRequirement[];\n failure?: { code: string; httpStatus?: number; field?: string; retryable: boolean };\n}\nexport interface CommandResult {\n schemaVersion: 1;\n scope: Scope;\n intent?: Intent;\n outcome: Outcome;\n code?: string;\n verifiedChecks: string[];\n resources: ResourceReference[];\n manualRequirements: ManualRequirement[];\n receiptPath?: string;\n}\nexport interface Clock {\n now(): number;\n sleep(ms: number, signal?: AbortSignal): Promise<void>;\n}\nexport interface ProcessRunner {\n run(\n executable: string,\n args: string[],\n options: {\n cwd: string;\n env: Record<string, string>;\n timeoutMs: number;\n signal?: AbortSignal;\n },\n ): Promise<{ stdout: string; stderr: string }>;\n}\nexport interface AppleGateway {\n list(path: string, query?: Record<string, string>): Promise<AppleResource[]>;\n read(path: string): Promise<AppleResource>;\n create(\n path: string,\n type: string,\n attributes: Record<string, unknown>,\n relationships?: Record<string, unknown>,\n included?: Record<string, unknown>[],\n ): Promise<AppleResource>;\n update(\n path: string,\n resource: ResourceReference,\n attributes: Record<string, unknown>,\n relationships?: Record<string, unknown>,\n ): Promise<AppleResource>;\n remove(path: string): Promise<void>;\n relationship(\n path: string,\n data: ResourceReference[],\n method?: \"POST\" | \"PATCH\" | \"DELETE\",\n ): Promise<void>;\n}\n\n/** 只允许固定错误码进入命令输出,供应商正文和密钥不进入消息。 */\nexport class DeliveryError extends Error {\n constructor(\n readonly code: string,\n readonly exitCode: number,\n readonly field?: string,\n readonly httpStatus?: number,\n readonly retryable = false,\n readonly writeRejected = false,\n ) {\n super(code);\n this.name = \"DeliveryError\";\n }\n}\n\n/** 阶段与动作共同限定执行授权,不接受任意字符串透传到供应商。 */\nexport function parseIntent(scope: string, action: string): Intent {\n if (!Object.hasOwn(intents, scope)) throw new DeliveryError(\"invalid_scope\", 2, \"scope\");\n const selected = scope as Scope;\n if (!(intents[selected] as readonly string[]).includes(action)) {\n throw new DeliveryError(\"invalid_intent\", 2, \"intent\");\n }\n return { scope: selected, action } as Intent;\n}\n","import { z } from \"zod\";\nimport { readFile, realpath, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { DeliveryError, type Scope } from \"./contracts.js\";\n\nconst text = z.string().min(1);\nconst id = z.string().regex(/^[A-Za-z0-9_-]+$/);\nconst locale = z.string().regex(/^[a-z]{2,3}(?:-[A-Za-z]{2,4})?$/);\nconst territory = z.string().regex(/^[A-Z]{3}$/);\nconst file = text;\nconst decimal = z.string().regex(/^(0|[1-9]\\d*)(\\.\\d{1,3})?$/);\nconst url = z.url({ protocol: /^https$/ });\nconst period = z.enum([\n \"ONE_WEEK\",\n \"ONE_MONTH\",\n \"TWO_MONTHS\",\n \"THREE_MONTHS\",\n \"SIX_MONTHS\",\n \"ONE_YEAR\",\n]);\nconst localizedProduct = z.strictObject({\n locale,\n name: text.max(30),\n description: z.string().max(55).optional(),\n});\nconst price = z.strictObject({\n territory,\n customerPrice: decimal,\n currency: z.string().regex(/^[A-Z]{3}$/),\n pricePointId: text.optional(),\n startDate: z.iso.date().optional(),\n preserveCurrentPrice: z.boolean().optional(),\n});\nconst appPrice = price\n .omit({ preserveCurrentPrice: true })\n .extend({ endDate: z.iso.date().optional() });\nconst asset = z.strictObject({\n file,\n locale: locale.optional(),\n displayType: id.optional(),\n order: z.number().int().min(0).optional(),\n previewType: id.optional(),\n previewFrameTimeCode: text.optional(),\n});\nconst fields = z.strictObject({\n name: z.string().max(30).optional(),\n subtitle: z.string().max(30).optional(),\n privacyPolicyUrl: url.optional(),\n privacyChoicesUrl: url.optional(),\n description: z.string().max(4000).optional(),\n keywords: z.string().max(100).optional(),\n promotionalText: z.string().max(170).optional(),\n whatsNew: z.string().max(4000).optional(),\n supportUrl: url.optional(),\n marketingUrl: url.optional(),\n});\nconst group = z.strictObject({\n key: id,\n remoteId: id.optional(),\n name: text,\n localizations: z\n .array(z.strictObject({ locale, name: text.max(75), customAppName: text.max(30).optional() }))\n .default([]),\n});\nconst offerDuration = z.enum([\n \"THREE_DAYS\",\n \"ONE_WEEK\",\n \"TWO_WEEKS\",\n \"ONE_MONTH\",\n \"TWO_MONTHS\",\n \"THREE_MONTHS\",\n \"SIX_MONTHS\",\n \"ONE_YEAR\",\n]);\nconst offerBase = {\n key: id,\n duration: offerDuration,\n numberOfPeriods: z.number().int().positive(),\n offerMode: z.enum([\"FREE_TRIAL\", \"PAY_AS_YOU_GO\", \"PAY_UP_FRONT\"]),\n prices: z.array(z.strictObject({ territory, pricePointId: text.optional() })).min(1),\n};\nconst offer = z.discriminatedUnion(\"kind\", [\n z.strictObject({\n ...offerBase,\n kind: z.literal(\"introductory\"),\n startDate: z.iso.date(),\n endDate: z.iso.date().optional(),\n }),\n z.strictObject({ ...offerBase, kind: z.literal(\"promotional\"), name: text, offerCode: text }),\n z.strictObject({\n ...offerBase,\n kind: z.literal(\"code\"),\n name: text,\n customerEligibilities: z.array(z.enum([\"NEW\", \"EXISTING\", \"EXPIRED\"])).min(1),\n offerEligibility: z.enum([\"STACK_WITH_INTRO_OFFERS\", \"REPLACE_INTRO_OFFERS\"]),\n autoRenewEnabled: z.boolean(),\n }),\n]);\nconst itemBase = {\n productId: z\n .string()\n .regex(/^[A-Za-z0-9_.-]+$/)\n .max(100),\n name: text.max(64),\n familySharable: z.boolean().optional(),\n reviewNote: z.string().optional(),\n localizations: z.array(localizedProduct).default([]),\n promotionalImage: file.optional(),\n reviewScreenshot: file.optional(),\n replaceReviewScreenshotId: id.optional(),\n prices: z.array(price).default([]),\n availability: z\n .strictObject({\n territories: z.array(territory).min(1),\n availableInNewTerritories: z.boolean(),\n })\n .optional(),\n};\nconst subscription = z.strictObject({\n ...itemBase,\n kind: z.literal(\"subscription\"),\n groupKey: id,\n duration: period,\n level: z.number().int().min(1).max(100),\n offers: z.array(offer).default([]),\n});\nconst purchase = z.strictObject({\n ...itemBase,\n kind: z.enum([\"CONSUMABLE\", \"NON_CONSUMABLE\", \"NON_RENEWING_SUBSCRIPTION\"]),\n baseTerritory: territory.optional(),\n prices: z.array(appPrice).default([]),\n});\nexport const manifestSchema = z.strictObject({\n schemaVersion: z.literal(1),\n app: z.strictObject({\n bundleId: z.string().regex(/^[A-Za-z0-9-]+(?:\\.[A-Za-z0-9-]+){2,}$/),\n name: text.max(50),\n platform: z.literal(\"IOS\"),\n sku: text.optional(),\n primaryLocale: locale.optional(),\n appId: z.string().regex(/^\\d+$/).optional(),\n }),\n capabilities: z\n .strictObject({\n signInWithApple: z.literal(true).optional(),\n pushNotifications: z.literal(true).optional(),\n inAppPurchase: z.literal(true).optional(),\n })\n .default({}),\n metadata: z\n .strictObject({\n localizations: z.array(z.strictObject({ locale, file })).default([]),\n primaryCategory: id.optional(),\n secondaryCategory: id.optional(),\n copyright: text.optional(),\n ageRatingFile: file.optional(),\n licenseAgreementFile: file.optional(),\n })\n .optional(),\n assets: z\n .strictObject({\n icon: file.optional(),\n iconVariants: z.strictObject({ dark: file.optional(), tinted: file.optional() }).optional(),\n screenshots: z.array(asset).default([]),\n previews: z.array(asset).default([]),\n removeOwnedIds: z\n .array(z.strictObject({ type: z.enum([\"appScreenshots\", \"appPreviews\"]), id }))\n .default([]),\n })\n .optional(),\n catalog: z\n .strictObject({\n groups: z.array(group).default([]),\n items: z.array(z.discriminatedUnion(\"kind\", [subscription, purchase])).default([]),\n gracePeriod: z\n .strictObject({\n optIn: z.boolean(),\n sandboxOptIn: z.boolean(),\n duration: z.enum([\"THREE_DAYS\", \"SIXTEEN_DAYS\", \"TWENTY_EIGHT_DAYS\"]),\n renewalType: z.enum([\"ALL_RENEWALS\", \"PAID_TO_PAID_ONLY\"]),\n })\n .optional(),\n })\n .optional(),\n availability: z\n .strictObject({\n territories: z.array(territory).min(1),\n availableInNewTerritories: z.boolean(),\n })\n .optional(),\n appPricing: z\n .strictObject({ baseTerritory: territory, prices: z.array(appPrice).min(1) })\n .optional(),\n release: z\n .strictObject({\n version: z.string().regex(/^\\d+(?:\\.\\d+){0,2}$/),\n buildNumber: z.string().regex(/^\\d+(?:\\.\\d+){0,2}$/),\n buildId: id.optional(),\n mode: z.enum([\"MANUAL\", \"AFTER_APPROVAL\", \"SCHEDULED\"]).default(\"MANUAL\"),\n earliestReleaseDate: z.iso.datetime().optional(),\n reviewSubmissionId: id.optional(),\n reviewItems: z\n .strictObject({\n includeApp: z.boolean(),\n productIds: z.array(text),\n groupKeys: z.array(id),\n })\n .optional(),\n phasedRelease: z.boolean().optional(),\n phasedReleaseId: id.optional(),\n firstPurchaseTypes: z\n .array(\n z.enum([\"subscription\", \"CONSUMABLE\", \"NON_CONSUMABLE\", \"NON_RENEWING_SUBSCRIPTION\"]),\n )\n .default([]),\n })\n .optional(),\n review: z\n .strictObject({\n credentialsRef: file,\n notesFile: file.optional(),\n attachments: z.array(file).default([]),\n })\n .optional(),\n declarations: z\n .array(\n z.strictObject({\n code: id,\n file,\n confirmed: z.boolean(),\n evidence: z.enum([\"operator-attestation\", \"remote-readback\"]),\n consoleUrl: url,\n }),\n )\n .default([]),\n build: z\n .strictObject({\n kind: z.enum([\"flutter\", \"xcode\"]),\n projectRoot: file,\n projectPath: file,\n scheme: text,\n targetName: text,\n configuration: text.default(\"Release\"),\n flutterExecutable: file.optional(),\n bundleExecutable: file.optional(),\n additionalTargets: z.array(z.strictObject({ name: text, bundleId: text })).default([]),\n flutterVersion: text.optional(),\n xcodeVersion: text,\n publicDefinesFile: file.optional(),\n workspace: file.optional(),\n iconSetPath: file.optional(),\n infoPlistPath: file.optional(),\n entitlementsPath: file.optional(),\n outputPath: file.default(\"build/apple\"),\n })\n .optional(),\n signing: z\n .strictObject({\n storageUrl: url,\n profileType: z.enum([\"appstore\", \"development\", \"adhoc\"]),\n bundleIds: z.array(text).min(1),\n readonly: z.boolean().default(true),\n })\n .optional(),\n testflight: z\n .strictObject({\n groupIds: z.array(id).default([]),\n betaDescription: z.string().optional(),\n feedbackEmail: z.email().optional(),\n whatsNew: z.string().optional(),\n locale: locale.optional(),\n external: z.boolean().default(false),\n notifyTesters: z.boolean().default(false),\n invitationsRef: file.optional(),\n })\n .optional(),\n});\nexport type Manifest = z.infer<typeof manifestSchema>;\nexport type CatalogItem = NonNullable<Manifest[\"catalog\"]>[\"items\"][number];\nexport type LocaleFields = z.infer<typeof fields>;\nexport const accountSchema = z.strictObject({\n teamId: z.string().regex(/^[A-Z0-9]{10}$/),\n keyId: z.string().regex(/^[A-Z0-9]{10}$/),\n issuerId: z.uuid(),\n privateKeyPath: text,\n signingSecretsFile: file.optional(),\n});\nexport type Account = z.infer<typeof accountSchema>;\nexport interface LoadedManifest {\n manifest: Manifest;\n directory: string;\n inputDigest: string;\n files: Map<string, Buffer>;\n}\n\n/** JSON 错误只报告字段位置,不回显可能包含密钥的输入值。 */\nexport function parseSchema<T>(schema: z.ZodType<T>, input: unknown): T {\n const result = schema.safeParse(input);\n if (!result.success)\n throw new DeliveryError(\"invalid_configuration\", 2, result.error.issues[0]?.path.join(\".\"));\n return result.data;\n}\n\n/** 固定键序使配置摘要不随 JSON 的格式或对象键顺序改变。 */\nexport function canonical(value: unknown): string {\n if (value === undefined) return \"null\";\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`;\n return `{${Object.entries(value)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${JSON.stringify(k)}:${canonical(v)}`)\n .join(\",\")}}`;\n}\nexport function digest(value: unknown): string {\n return createHash(\"sha256\").update(canonical(value)).digest(\"hex\");\n}\nexport function fileDigest(bytes: Buffer): string {\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\nexport async function readJsonFile(filename: string): Promise<unknown> {\n let value: string;\n try {\n value = await readFile(filename, \"utf8\");\n } catch {\n throw new DeliveryError(\"file_unreadable\", 2, filename);\n }\n try {\n return JSON.parse(value);\n } catch {\n throw new DeliveryError(\"invalid_json\", 2, filename);\n }\n}\n\n/** 以实际路径约束资源目录,阻止符号链接将发布输入引向其它文件。 */\nexport async function resolveFile(root: string, relative: string): Promise<string> {\n const base = await realpath(root);\n let target: string;\n try {\n target = await realpath(path.resolve(base, relative));\n } catch {\n throw new DeliveryError(\"file_unreadable\", 2, relative);\n }\n if (!target.startsWith(base + path.sep) || !(await stat(target)).isFile())\n throw new DeliveryError(\"asset_path_outside_root\", 2, relative);\n return target;\n}\n\nexport async function loadManifest(filename: string): Promise<LoadedManifest> {\n const manifest = parseSchema(manifestSchema, await readJsonFile(filename));\n const directory = path.dirname(await realpath(filename));\n const files = new Map<string, Buffer>();\n const paths = [\n ...(manifest.metadata?.localizations.map((v) => v.file) ?? []),\n manifest.metadata?.ageRatingFile,\n manifest.metadata?.licenseAgreementFile,\n manifest.assets?.icon,\n manifest.assets?.iconVariants?.dark,\n manifest.assets?.iconVariants?.tinted,\n ...(manifest.assets?.screenshots.map((v) => v.file) ?? []),\n ...(manifest.assets?.previews.map((v) => v.file) ?? []),\n ...(manifest.catalog?.items.flatMap((v) => [v.promotionalImage, v.reviewScreenshot]) ?? []),\n manifest.review?.notesFile,\n ...(manifest.review?.attachments ?? []),\n ...manifest.declarations.map((v) => v.file),\n ];\n for (const name of paths)\n if (name) files.set(name, await readFile(await resolveFile(directory, name)));\n for (const entry of manifest.metadata?.localizations ?? [])\n parseSchema(fields, JSON.parse(files.get(entry.file)!.toString(\"utf8\")));\n unique(manifest.metadata?.localizations.map((v) => v.locale) ?? [], \"metadata.localizations\");\n unique(manifest.catalog?.groups.map((v) => v.key) ?? [], \"catalog.groups\");\n unique(manifest.catalog?.items.map((v) => v.productId) ?? [], \"catalog.items\");\n for (const item of manifest.catalog?.items ?? []) {\n unique(\n item.localizations.map((v) => v.locale),\n `catalog.${item.productId}.localizations`,\n );\n if (item.kind === \"subscription\") {\n unique(\n item.offers.map((v) => v.key),\n `catalog.${item.productId}.offers`,\n );\n for (const offer of item.offers) {\n unique(\n offer.prices.map((v) => v.territory),\n `catalog.${item.productId}.offers.${offer.key}.prices`,\n );\n if (offer.kind === \"introductory\" && offer.endDate && offer.endDate <= offer.startDate)\n throw new DeliveryError(\"offer_date_interval_invalid\", 2, offer.key);\n }\n }\n if (\n item.kind === \"subscription\" &&\n !manifest.catalog?.groups.some((g) => g.key === item.groupKey)\n )\n throw new DeliveryError(\"subscription_group_missing\", 2, item.productId);\n }\n for (const group of manifest.catalog?.groups ?? [])\n unique(\n group.localizations.map((v) => v.locale),\n `catalog.groups.${group.key}.localizations`,\n );\n for (const prices of [\n manifest.appPricing?.prices ?? [],\n ...(manifest.catalog?.items.filter((v) => v.kind !== \"subscription\").map((v) => v.prices) ??\n []),\n ])\n for (const region of new Set(prices.map((v) => v.territory))) {\n const intervals = prices\n .filter((v) => v.territory === region)\n .sort((a, b) => (a.startDate ?? \"\").localeCompare(b.startDate ?? \"\"));\n for (let i = 0; i < intervals.length; i++) {\n const current = intervals[i],\n previous = intervals[i - 1];\n if (\n (current.endDate && current.startDate && current.endDate <= current.startDate) ||\n (previous &&\n (!previous.endDate || !current.startDate || previous.endDate > current.startDate))\n )\n throw new DeliveryError(\"app_price_interval_invalid\", 2, region);\n }\n }\n if (manifest.release?.mode === \"SCHEDULED\" && !manifest.release.earliestReleaseDate)\n throw new DeliveryError(\"release_date_required\", 2);\n return {\n manifest,\n directory,\n files,\n inputDigest: digest({\n manifest,\n files: [...files].map(([name, data]) => [name, fileDigest(data)]),\n }),\n };\n}\n\nfunction unique(values: string[], field: string): void {\n if (new Set(values).size !== values.length)\n throw new DeliveryError(\"duplicate_configuration_key\", 2, field);\n}\nexport function localeFields(loaded: LoadedManifest, filename: string): LocaleFields {\n return parseSchema(fields, JSON.parse(loaded.files.get(filename)!.toString(\"utf8\")));\n}\n\nexport function validateStage(manifest: Manifest, scope: Scope): void {\n const required: Partial<Record<Scope, boolean>> = {\n metadata: !!manifest.metadata,\n assets:\n !!manifest.assets ||\n !!manifest.catalog?.items.some((v) => v.promotionalImage || v.reviewScreenshot) ||\n !!manifest.review?.attachments.length,\n catalog: !!manifest.catalog,\n pricing: !!manifest.catalog || !!manifest.appPricing || !!manifest.availability,\n native: !!manifest.build,\n build: !!manifest.build && !!manifest.release && !!manifest.signing,\n upload: !!manifest.build && !!manifest.release && !!manifest.signing,\n signing: !!manifest.signing,\n testflight: !!manifest.testflight,\n review: !!manifest.release,\n release: !!manifest.release,\n };\n if (required[scope] === false) throw new DeliveryError(\"stage_configuration_required\", 2, scope);\n}\n","import { createPrivateKey, sign } from \"node:crypto\";\nimport { readFile, stat, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { DeliveryError } from \"./contracts.js\";\nimport { accountSchema, parseSchema, readJsonFile, digest, type Account } from \"./manifest.js\";\n\nexport interface AppleCredentials {\n account: Account;\n fingerprint: string;\n token(): string;\n}\n\n/** 密钥只在单次调用内持有,签名结果不持久化。 */\nexport async function loadCredentials(filename: string, now = Date.now): Promise<AppleCredentials> {\n await requirePrivateFile(filename);\n const account = parseSchema(accountSchema, await readJsonFile(filename));\n const privateKeyPath = await realpath(\n path.resolve(path.dirname(filename), account.privateKeyPath),\n );\n await requirePrivateFile(privateKeyPath);\n let key;\n try {\n key = createPrivateKey(await readFile(privateKeyPath));\n } catch {\n throw new DeliveryError(\"invalid_private_key\", 2);\n }\n if (key.asymmetricKeyType !== \"ec\" || key.asymmetricKeyDetails?.namedCurve !== \"prime256v1\") {\n throw new DeliveryError(\"invalid_signing_curve\", 2);\n }\n return {\n account: {\n ...account,\n privateKeyPath,\n ...(account.signingSecretsFile\n ? { signingSecretsFile: path.resolve(path.dirname(filename), account.signingSecretsFile) }\n : {}),\n },\n fingerprint: digest({\n teamId: account.teamId,\n keyId: account.keyId,\n issuerId: account.issuerId,\n }),\n token() {\n const seconds = Math.floor(now() / 1000);\n const encode = (v: unknown) => Buffer.from(JSON.stringify(v)).toString(\"base64url\");\n const message = `${encode({ alg: \"ES256\", kid: account.keyId, typ: \"JWT\" })}.${encode({ iss: account.issuerId, iat: seconds, exp: seconds + 300, aud: \"appstoreconnect-v1\" })}`;\n return `${message}.${sign(\"sha256\", Buffer.from(message), { key, dsaEncoding: \"ieee-p1363\" }).toString(\"base64url\")}`;\n },\n };\n}\n\nexport async function requirePrivateFile(filename: string): Promise<void> {\n let info;\n try {\n info = await stat(filename);\n } catch {\n throw new DeliveryError(\"credential_file_unreadable\", 2);\n }\n if (\n !info.isFile() ||\n (info.mode & 0o077) !== 0 ||\n (process.getuid && info.uid !== process.getuid())\n ) {\n throw new DeliveryError(\"credential_file_permissions\", 2);\n }\n}\n","import { createApiClient, ApiHttpError, NormalizedApiError } from \"@stackonward/api-client\";\nimport { z } from \"zod\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport {\n DeliveryError,\n type AppleGateway,\n type AppleResource,\n type ResourceReference,\n type Clock,\n} from \"./contracts.js\";\nimport type { AppleCredentials } from \"./credentials.js\";\n\nexport const APPLE_ORIGIN = \"https://api.appstoreconnect.apple.com\";\nconst reference = z.object({ type: z.string().min(1), id: z.string().min(1) });\nconst resource = reference.extend({\n attributes: z.record(z.string(), z.unknown()).default({}),\n relationships: z\n .record(\n z.string(),\n z.object({ data: z.union([reference, z.array(reference), z.null()]).optional() }),\n )\n .optional(),\n});\nexport const systemClock: Clock = {\n now: Date.now,\n async sleep(ms, signal) {\n await delay(ms, undefined, { signal });\n },\n};\n\n/** API 凭据只能发往官方 origin;资源上传不使用这个客户端。 */\nexport function createAppleGateway(\n credentials: AppleCredentials,\n options: { fetch?: typeof fetch; clock?: Clock; signal?: AbortSignal } = {},\n): AppleGateway {\n const fetcher = options.fetch ?? globalThis.fetch;\n const clock = options.clock ?? systemClock;\n const transport = createApiClient({\n baseUrl: APPLE_ORIGIN,\n timeout: 20_000,\n maxRetries: 0,\n headers: () => ({\n Authorization: `Bearer ${credentials.token()}`,\n \"User-Agent\": \"stackonward-apple/1\",\n }),\n fetch: async (input, init) => {\n const url = new URL(\n typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url,\n );\n if (url.origin !== APPLE_ORIGIN || url.username || url.password)\n throw new DeliveryError(\"untrusted_api_origin\", 2);\n return fetcher(input, { ...init, redirect: \"error\" });\n },\n });\n function apiPath(value: string): string {\n const url = new URL(value, APPLE_ORIGIN);\n if (\n url.origin !== APPLE_ORIGIN ||\n !/^\\/v[12]\\//.test(url.pathname) ||\n url.username ||\n url.password ||\n url.hash\n )\n throw new DeliveryError(\"invalid_api_path\", 2);\n return url.pathname + url.search;\n }\n async function request(\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\",\n location: string,\n body?: unknown,\n ): Promise<unknown> {\n if (options.signal?.aborted) throw new DeliveryError(\"cancelled\", 130);\n for (let attempt = 0; ; attempt++) {\n try {\n return await transport.request<unknown>(method, apiPath(location), {\n body,\n signal: options.signal,\n });\n } catch (error) {\n if (options.signal?.aborted)\n throw new DeliveryError(\n method === \"GET\" ? \"cancelled\" : \"apple_write_outcome_unknown\",\n method === \"GET\" ? 130 : 7,\n );\n const status = error instanceof NormalizedApiError ? error.statusCode : undefined;\n const retryable =\n status === 408 ||\n status === 429 ||\n (status !== undefined && status >= 500) ||\n (error instanceof NormalizedApiError && [\"network\", \"timeout\"].includes(error.kind));\n if (method === \"GET\" && retryable && attempt < 3) {\n const raw = error instanceof NormalizedApiError ? error.cause : undefined;\n const retry =\n raw instanceof ApiHttpError ? raw.response.headers.get(\"retry-after\") : null;\n const wait = retry\n ? /^\\d+$/.test(retry)\n ? Number(retry) * 1000\n : Date.parse(retry) - clock.now()\n : 500 * 2 ** attempt;\n await clock.sleep(\n Math.min(60_000, Math.max(500, Number.isFinite(wait) ? wait : 500)) +\n Math.floor(Math.random() * 100),\n options.signal,\n );\n continue;\n }\n if (error instanceof DeliveryError) throw error;\n const writeRejected =\n method !== \"GET\" &&\n status !== undefined &&\n status >= 400 &&\n status < 500 &&\n status !== 408;\n if (status === 401 || status === 403)\n throw new DeliveryError(\n status === 401 ? \"apple_authentication_failed\" : \"apple_permission_denied\",\n 3,\n undefined,\n status,\n false,\n writeRejected,\n );\n if (status === 409 || status === 422)\n throw new DeliveryError(\n \"apple_resource_conflict\",\n 4,\n undefined,\n status,\n false,\n writeRejected,\n );\n if (method !== \"GET\" && retryable && !writeRejected)\n throw new DeliveryError(\"apple_write_outcome_unknown\", 7, undefined, status);\n throw new DeliveryError(\n \"apple_request_failed\",\n 5,\n undefined,\n status,\n method === \"GET\" && retryable,\n writeRejected,\n );\n }\n }\n }\n function decode(value: unknown): AppleResource {\n const parsed = z.object({ data: resource }).safeParse(value);\n if (!parsed.success) throw new DeliveryError(\"invalid_apple_response\", 5);\n return parsed.data.data;\n }\n return {\n async list(location, query = {}) {\n const url = new URL(apiPath(location), APPLE_ORIGIN);\n for (const [key, value] of Object.entries(query)) url.searchParams.set(key, value);\n let next: string | null = url.href;\n const visited = new Set<string>();\n const all: AppleResource[] = [];\n while (next) {\n const current = apiPath(next);\n if (visited.has(current) || visited.size >= 1000)\n throw new DeliveryError(\"invalid_apple_pagination\", 5);\n visited.add(current);\n const parsed = z\n .object({\n data: z.array(resource),\n links: z.object({ next: z.string().nullable().optional() }).optional(),\n })\n .safeParse(await request(\"GET\", current));\n if (!parsed.success) throw new DeliveryError(\"invalid_apple_response\", 5);\n all.push(...parsed.data.data);\n next = parsed.data.links?.next ?? null;\n }\n return all;\n },\n async read(location) {\n return decode(await request(\"GET\", location));\n },\n async create(location, type, attributes, relationships, included) {\n return decode(\n await request(\"POST\", location, {\n data: {\n type,\n ...(Object.keys(attributes).length ? { attributes } : {}),\n ...(relationships ? { relationships } : {}),\n },\n ...(included ? { included } : {}),\n }),\n );\n },\n async update(location, ref, attributes, relationships) {\n return decode(\n await request(\"PATCH\", location, {\n data: {\n type: ref.type,\n id: ref.id,\n ...(Object.keys(attributes).length ? { attributes } : {}),\n ...(relationships ? { relationships } : {}),\n },\n }),\n );\n },\n async remove(location) {\n await request(\"DELETE\", location);\n },\n async relationship(location, data, method = \"POST\") {\n await request(method, location, { data });\n },\n };\n}\n\nexport function relation(type: string, id: string): { data: ResourceReference } {\n return { data: { type, id } };\n}\nexport function selectOne(values: AppleResource[], code: string): AppleResource | undefined {\n if (values.length > 1) throw new DeliveryError(code, 4);\n return values[0];\n}\nexport function stringAttribute(resource: AppleResource, field: string): string {\n const value = resource.attributes[field];\n if (typeof value !== \"string\") throw new DeliveryError(\"invalid_apple_attribute\", 5, field);\n return value;\n}\n\n/** 父资源已确认存在时,可选关系的 404 表示尚未配置;权限与传输失败必须保留。 */\nexport async function readOptionalRelationship<T>(read: () => Promise<T>): Promise<T | undefined> {\n try {\n return await read();\n } catch (error) {\n if (error instanceof DeliveryError && error.httpStatus === 404) return undefined;\n throw error;\n }\n}\n","import { mkdir, open, rename, rm, lstat, realpath, readFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { z } from \"zod\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { DeliveryError, type ResourceReference } from \"./contracts.js\";\nimport { digest, parseSchema } from \"./manifest.js\";\n\n/** 写入私有执行目录时拒绝符号链接,避免覆盖调用者的其它文件。 */\nexport async function privateDirectory(directory: string): Promise<string> {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n const info = await lstat(directory);\n if (!info.isDirectory() || info.isSymbolicLink() || (info.mode & 0o077) !== 0)\n throw new DeliveryError(\"state_directory_permissions\", 2);\n return realpath(directory);\n}\nexport async function writePrivateJson(filename: string, value: unknown): Promise<void> {\n const directory = await privateDirectory(path.dirname(filename));\n const target = path.join(directory, path.basename(filename));\n const temporary = path.join(directory, `.${randomUUID()}.json`);\n const handle = await open(temporary, \"wx\", 0o600);\n try {\n await handle.writeFile(JSON.stringify(value, null, 2) + \"\\n\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n try {\n await rename(temporary, target);\n } finally {\n await rm(temporary, { force: true });\n }\n}\n\n/** 锁只保证同机单写者;CI 必须为相同账号和 App 配置串行组。 */\nexport async function acquireLock(\n _directory: string,\n fingerprint: string,\n bundleId: string,\n): Promise<() => Promise<void>> {\n const root = await privateDirectory(path.join(os.homedir(), \".stackonward\", \"apple-locks\"));\n const lock = path.join(root, `${digest({ fingerprint, bundleId })}.lock`);\n let handle;\n try {\n handle = await open(lock, \"wx\", 0o600);\n } catch {\n throw new DeliveryError(\"delivery_locked\", 4);\n }\n await handle.writeFile(JSON.stringify({ pid: process.pid, startedAt: new Date().toISOString() }));\n await handle.close();\n return async () => {\n await rm(lock);\n };\n}\n\nconst bindingsSchema = z.record(z.string(), z.strictObject({ type: z.string(), id: z.string() }));\nexport function bindingPath(directory: string, fingerprint: string, bundleId: string): string {\n return path.join(directory, `${digest({ fingerprint, bundleId })}.bindings.json`);\n}\nexport async function readBindings(filename: string): Promise<Record<string, ResourceReference>> {\n let bytes: string;\n try {\n bytes = await readFile(filename, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return {};\n throw new DeliveryError(\"bindings_unreadable\", 2);\n }\n try {\n return parseSchema(bindingsSchema, JSON.parse(bytes));\n } catch {\n throw new DeliveryError(\"invalid_bindings\", 2);\n }\n}\n","import {\n DeliveryError,\n type AppleResource,\n type DeliveryPlan,\n type Intent,\n type ManualRequirement,\n type Operation,\n type ResourceReference,\n} from \"./contracts.js\";\nimport { canonical, digest, type LoadedManifest } from \"./manifest.js\";\n\nexport interface Change {\n operation: Operation;\n resumeBoundResource?: boolean;\n apply(): Promise<ResourceReference>;\n}\nexport interface PreparedDelivery {\n plan: DeliveryPlan;\n changes: Change[];\n resources: ResourceReference[];\n satisfied: Record<string, string>;\n connectRecorder(record: (key: string, value: ResourceReference) => Promise<void>): void;\n}\n\n/** 闭包只由具名资源适配器构造;磁盘计划不能指定请求或可执行代码。 */\nexport class PlanBuilder {\n readonly changes: Change[] = [];\n readonly requirements: ManualRequirement[] = [];\n readonly resources = new Map<string, AppleResource>();\n private snapshots: Record<string, unknown> = {};\n private satisfiedDigests: Record<string, string> = {};\n private recorder?: (key: string, value: ResourceReference) => Promise<void>;\n constructor(\n readonly loaded: LoadedManifest,\n readonly intent: Intent,\n readonly fingerprint: string,\n readonly now: number,\n readonly bindings: Record<string, ResourceReference> = {},\n ) {}\n\n async record(key: string, value: ResourceReference): Promise<void> {\n await this.recorder?.(key, { type: value.type, id: value.id });\n }\n\n observe(key: string, current: AppleResource | undefined): void {\n this.snapshots[key] = current ?? null;\n if (current) this.resources.set(key, current);\n }\n satisfy(key: string, desired: unknown): void {\n this.satisfiedDigests[key] = digest(desired);\n }\n require(key: string): AppleResource {\n const value = this.resources.get(key);\n if (!value) throw new DeliveryError(\"resource_dependency_missing\", 4, key);\n return value;\n }\n manual(\n code: string,\n reason: string,\n blockedOperationIds: string[],\n consoleUrl = \"https://appstoreconnect.apple.com/apps\",\n ): void {\n this.requirements.push({\n code,\n stage: this.intent.scope,\n reason,\n blockedOperationIds,\n consoleUrl,\n evidence: \"remote-readback\",\n });\n }\n ensure(\n key: string,\n current: AppleResource | undefined,\n desired: Record<string, unknown>,\n create: () => Promise<AppleResource>,\n update: (value: AppleResource, changed: Record<string, unknown>) => Promise<AppleResource>,\n dependencies: string[] = [],\n ): void {\n this.observe(key, current);\n const changed = Object.fromEntries(\n Object.entries(desired).filter(\n ([field, value]) => canonical(current?.attributes[field]) !== canonical(value),\n ),\n );\n if (current && Object.keys(changed).length === 0) {\n this.satisfy(key, desired);\n return;\n }\n this.add(\n key,\n current ? \"update\" : \"create\",\n current?.attributes ?? null,\n desired,\n Object.keys(changed),\n async () => {\n const result = current ? await update(current, changed) : await create();\n this.resources.set(key, result);\n for (const [field, expected] of Object.entries(desired))\n if (canonical(result.attributes[field]) !== canonical(expected))\n throw new DeliveryError(\"resource_readback_mismatch\", 5, `${key}.${field}`);\n return result;\n },\n dependencies,\n );\n }\n add(\n key: string,\n action: Operation[\"action\"],\n before: unknown,\n desired: unknown,\n fields: string[],\n effect: () => Promise<ResourceReference>,\n dependencies: string[] = [],\n resumeBoundResource = false,\n ): void {\n const operation: Operation = {\n id: key,\n resourceKey: key,\n action,\n fields,\n dependencies,\n beforeDigest: digest(before),\n desiredDigest: digest(desired),\n };\n if (this.changes.some((c) => c.operation.id === key))\n throw new DeliveryError(\"duplicate_operation\", 2, key);\n this.changes.push({\n operation,\n resumeBoundResource,\n apply: async () => {\n const result = await effect();\n await this.record(key, result);\n if (!this.resources.has(key)) this.resources.set(key, { ...result, attributes: {} });\n return result;\n },\n });\n }\n finish(): PreparedDelivery {\n return {\n plan: {\n schemaVersion: 1,\n intent: this.intent,\n scope: this.intent.scope,\n accountFingerprint: this.fingerprint,\n bundleId: this.loaded.manifest.app.bundleId,\n appId: this.loaded.manifest.app.appId,\n inputDigest: this.loaded.inputDigest,\n snapshotDigest: digest(this.snapshots),\n createdAt: new Date(this.now).toISOString(),\n expiresAt: new Date(this.now + 900_000).toISOString(),\n operations: this.changes.map((c) => c.operation),\n manualRequirements: this.requirements,\n ...(this.intent.scope === \"pricing\"\n ? {\n commercialConfiguration: {\n appPricing: this.loaded.manifest.appPricing,\n availability: this.loaded.manifest.availability,\n gracePeriod: this.loaded.manifest.catalog?.gracePeriod,\n products: this.loaded.manifest.catalog?.items.map((item) => ({\n productId: item.productId,\n prices: item.prices,\n availability: item.availability,\n ...(item.kind === \"subscription\"\n ? { offers: item.offers }\n : { baseTerritory: item.baseTerritory }),\n })),\n },\n }\n : {}),\n },\n changes: this.changes,\n resources: [...this.resources.values()].map(({ type, id }) => ({ type, id })),\n satisfied: this.satisfiedDigests,\n connectRecorder: (record) => {\n this.recorder = record;\n },\n };\n }\n}\n\nexport function verifyPlan(saved: DeliveryPlan, fresh: DeliveryPlan, now: number): void {\n if (\n saved.schemaVersion !== 1 ||\n !Number.isFinite(Date.parse(saved.createdAt)) ||\n !Number.isFinite(Date.parse(saved.expiresAt)) ||\n Date.parse(saved.expiresAt) <= Date.parse(saved.createdAt) ||\n now >= Date.parse(saved.expiresAt) ||\n Date.parse(saved.createdAt) > now ||\n Date.parse(saved.expiresAt) - Date.parse(saved.createdAt) > 900_000\n )\n throw new DeliveryError(\"plan_expired\", 4);\n for (const field of [\n \"intent\",\n \"scope\",\n \"accountFingerprint\",\n \"bundleId\",\n \"appId\",\n \"inputDigest\",\n \"snapshotDigest\",\n \"operations\",\n \"manualRequirements\",\n \"commercialConfiguration\",\n ] as const) {\n if (canonical(saved[field]) !== canonical(fresh[field]))\n throw new DeliveryError(\"plan_stale\", 4, field);\n }\n}\n","import path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { DeliveryError, type DeliveryPlan, type ExecutionReceipt } from \"./contracts.js\";\nimport { verifyPlan, type PreparedDelivery } from \"./plan.js\";\nimport { acquireLock, writePrivateJson, bindingPath, readBindings } from \"./state.js\";\nimport { readJsonFile, digest, parseSchema } from \"./manifest.js\";\nimport { access } from \"node:fs/promises\";\nimport { z } from \"zod\";\n\n/** 执行前在锁内重建计划,只执行与已确认意图和输入相同的闭包。 */\nexport async function executePlan(\n saved: DeliveryPlan,\n prepare: () => Promise<PreparedDelivery>,\n stateDirectory: string,\n signal?: AbortSignal,\n): Promise<{ receipt: ExecutionReceipt; receiptPath: string }> {\n const unlock = await acquireLock(stateDirectory, saved.accountFingerprint, saved.bundleId);\n const receiptPath = path.join(stateDirectory, `${randomUUID()}.receipt.json`);\n try {\n const fresh = await prepare();\n verifyPlan(saved, fresh.plan, Date.now());\n for (const change of fresh.changes) {\n const action = change.operation.action;\n const special: Record<string, string[]> = {\n \"assets.remove-owned-assets\": [\"remove-owned-asset\"],\n \"review.submit\": [\"submit\"],\n \"review.withdraw\": [\"withdraw\"],\n \"review.prepare\": [\"create\", \"update\"],\n \"testflight.invite\": [\"invite\"],\n \"testflight.distribute\": [\"distribute\"],\n \"testflight.review\": [\"submit\"],\n \"release.publish\": [\"release\"],\n \"release.pause\": [\"pause\"],\n \"release.resume\": [\"resume\"],\n \"release.complete\": [\"complete\"],\n };\n const allowed = special[`${saved.scope}.${saved.intent.action}`] ?? [\n \"create\",\n \"update\",\n \"upload\",\n ];\n if (!allowed.includes(action))\n throw new DeliveryError(\"operation_outside_intent\", 4, change.operation.id);\n }\n const bindingsFile = bindingPath(stateDirectory, saved.accountFingerprint, saved.bundleId);\n const bindings = await readBindings(bindingsFile);\n const journalPath = path.join(\n stateDirectory,\n `${digest({ account: saved.accountFingerprint, bundle: saved.bundleId })}.journal.json`,\n );\n let journal: Record<\n string,\n { desiredDigest: string; status: \"in-flight\" | \"unknown\" | \"verified\" | \"rejected\" }\n > = {};\n let journalExists = true;\n try {\n await access(journalPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") journalExists = false;\n else throw error;\n }\n if (journalExists)\n journal = parseSchema(\n z.record(\n z.string(),\n z.strictObject({\n desiredDigest: z.string(),\n status: z.enum([\"in-flight\", \"unknown\", \"verified\", \"rejected\"]),\n }),\n ),\n await readJsonFile(journalPath),\n );\n for (const [key, desiredDigest] of Object.entries(fresh.satisfied)) {\n const entry = journal[`${saved.scope}.${key}`];\n if (entry?.desiredDigest === desiredDigest) entry.status = \"verified\";\n }\n await writePrivateJson(journalPath, journal);\n fresh.connectRecorder(async (key, value) => {\n bindings[key] = value;\n await writePrivateJson(bindingsFile, bindings);\n });\n const receipt: ExecutionReceipt = {\n executionId: randomUUID(),\n intent: saved.intent,\n scope: saved.scope,\n inputDigest: saved.inputDigest,\n outcome: \"unknown\",\n completed: [],\n pending: saved.operations.map((v) => v.id),\n manualRequirements: fresh.plan.manualRequirements,\n };\n const blocked = new Set(receipt.manualRequirements.flatMap((r) => r.blockedOperationIds));\n const completed = new Set<string>();\n let activeJournalKey: string | undefined;\n try {\n for (const change of fresh.changes) {\n if (signal?.aborted) throw new DeliveryError(\"cancelled\", 130);\n if (\n blocked.has(change.operation.id) ||\n change.operation.dependencies.some((dep) => blocked.has(dep))\n ) {\n blocked.add(change.operation.id);\n continue;\n }\n if (\n change.operation.dependencies.some(\n (dep) => fresh.changes.some((v) => v.operation.id === dep) && !completed.has(dep),\n )\n )\n throw new DeliveryError(\"operation_dependency_incomplete\", 4);\n const journalKey = `${saved.scope}.${change.operation.id}`;\n const unresolved = journal[journalKey];\n if (\n unresolved &&\n ![\"verified\", \"rejected\"].includes(unresolved.status) &&\n !(\n change.resumeBoundResource &&\n bindings[change.operation.resourceKey] &&\n unresolved.desiredDigest === change.operation.desiredDigest\n )\n )\n throw new DeliveryError(\"previous_write_requires_reconciliation\", 7, change.operation.id);\n activeJournalKey = journalKey;\n journal[journalKey] = {\n desiredDigest: change.operation.desiredDigest,\n status: \"in-flight\",\n };\n await writePrivateJson(journalPath, journal);\n await writePrivateJson(receiptPath, receipt);\n const resource = await change.apply();\n receipt.completed.push({ type: resource.type, id: resource.id });\n completed.add(change.operation.id);\n receipt.pending = receipt.pending.filter((id) => id !== change.operation.id);\n journal[journalKey].status = \"verified\";\n await writePrivateJson(journalPath, journal);\n activeJournalKey = undefined;\n await writePrivateJson(receiptPath, receipt);\n }\n receipt.outcome = receipt.manualRequirements.length ? \"blocked\" : \"verified\";\n } catch (error) {\n const failure =\n error instanceof DeliveryError ? error : new DeliveryError(\"delivery_operation_failed\", 5);\n if (activeJournalKey) {\n const local =\n saved.scope === \"native\" ||\n saved.scope === \"build\" ||\n (saved.scope === \"signing\" && saved.intent.action === \"sync\");\n journal[activeJournalKey].status = local || failure.writeRejected ? \"rejected\" : \"unknown\";\n await writePrivateJson(journalPath, journal);\n }\n receipt.outcome =\n failure.exitCode === 7 ||\n (activeJournalKey && journal[activeJournalKey].status === \"unknown\")\n ? \"unknown\"\n : failure.exitCode === 130\n ? \"cancelled\"\n : \"failed\";\n receipt.failure = {\n code: failure.code,\n httpStatus: failure.httpStatus,\n field: failure.field,\n retryable: failure.retryable,\n };\n }\n await writePrivateJson(receiptPath, receipt);\n return { receipt, receiptPath };\n } finally {\n await unlock();\n }\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { selectOne, relation } from \"../api.js\";\nimport type { PlanBuilder } from \"../plan.js\";\n\nexport async function findApp(\n builder: PlanBuilder,\n api: AppleGateway,\n): Promise<AppleResource | undefined> {\n const config = builder.loaded.manifest.app;\n const app = selectOne(\n await api.list(\"/v1/apps\", { \"filter[bundleId]\": config.bundleId, limit: \"200\" }),\n \"ambiguous_app\",\n );\n if (\n app &&\n (app.attributes.bundleId !== config.bundleId ||\n (config.appId && app.id !== config.appId) ||\n (config.sku && app.attributes.sku !== config.sku) ||\n (config.primaryLocale && app.attributes.primaryLocale !== config.primaryLocale))\n )\n throw new DeliveryError(\"app_identity_mismatch\", 4);\n builder.observe(\"app\", app);\n if (!app)\n builder.manual(\n \"app_record_required\",\n \"Create the App Store Connect record using the configured Bundle ID, SKU and primary locale.\",\n [\"app.bind\"],\n );\n return app;\n}\n\n/** 只管理显式启用的能力,未声明的已有能力保持原样。 */\nexport async function planIdentifiers(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const { app: config, capabilities } = builder.loaded.manifest;\n const bundle = selectOne(\n await api.list(\"/v1/bundleIds\", { \"filter[identifier]\": config.bundleId, limit: \"200\" }),\n \"ambiguous_bundle_id\",\n );\n if (bundle && bundle.attributes.identifier !== config.bundleId)\n throw new DeliveryError(\"bundle_identity_mismatch\", 4);\n const desired = { identifier: config.bundleId, name: config.name, platform: \"UNIVERSAL\" };\n builder.ensure(\n \"bundle\",\n bundle,\n desired,\n async () => {\n const value = await api.create(\"/v1/bundleIds\", \"bundleIds\", desired);\n return api.read(`/v1/bundleIds/${value.id}`);\n },\n async (value, fields) => {\n if (fields.identifier || fields.platform)\n throw new DeliveryError(\"bundle_immutable_field\", 4);\n await api.update(`/v1/bundleIds/${value.id}`, value, fields);\n return api.read(`/v1/bundleIds/${value.id}`);\n },\n );\n const current = bundle ? await api.list(`/v1/bundleIds/${bundle.id}/bundleIdCapabilities`) : [];\n for (const [field, type] of Object.entries({\n signInWithApple: \"APPLE_ID_AUTH\",\n pushNotifications: \"PUSH_NOTIFICATIONS\",\n inAppPurchase: \"IN_APP_PURCHASE\",\n })) {\n const enabled = capabilities[field as keyof typeof capabilities];\n if (enabled === undefined) continue;\n const existing = selectOne(\n current.filter((v) => v.attributes.capabilityType === type),\n \"ambiguous_capability\",\n );\n builder.observe(`capability.${type}`, existing);\n const settings =\n type === \"APPLE_ID_AUTH\"\n ? [\n {\n key: \"APPLE_ID_AUTH_APP_CONSENT\",\n options: [{ key: \"PRIMARY_APP_CONSENT\", enabled: true }],\n },\n ]\n : undefined;\n const agrees = existing && (!settings || primaryConsentEnabled(existing));\n if (agrees) {\n builder.satisfy(`capability.${type}`, { capabilityType: type, settings });\n continue;\n }\n builder.add(\n `capability.${type}`,\n existing ? \"update\" : \"create\",\n existing?.attributes ?? null,\n { capabilityType: type, settings },\n [\"capabilityType\", ...(settings ? [\"settings\"] : [])],\n async () => {\n const parent = builder.require(\"bundle\");\n if (existing)\n await api.update(`/v1/bundleIdCapabilities/${existing.id}`, existing, { settings });\n else\n await api.create(\n \"/v1/bundleIdCapabilities\",\n \"bundleIdCapabilities\",\n { capabilityType: type, ...(settings ? { settings } : {}) },\n { bundleId: relation(\"bundleIds\", parent.id) },\n );\n const found = selectOne(\n (await api.list(`/v1/bundleIds/${parent.id}/bundleIdCapabilities`)).filter(\n (v) => v.attributes.capabilityType === type,\n ),\n \"ambiguous_capability\",\n );\n if (!found) throw new DeliveryError(\"capability_readback_failed\", 5);\n if (settings && !primaryConsentEnabled(found))\n throw new DeliveryError(\"capability_settings_mismatch\", 5);\n return found;\n },\n [\"bundle\"],\n );\n }\n await findApp(builder, api);\n}\n\nfunction primaryConsentEnabled(value: AppleResource): boolean {\n return (\n Array.isArray(value.attributes.settings) &&\n value.attributes.settings.some((setting: unknown) => {\n if (\n !setting ||\n typeof setting !== \"object\" ||\n !(\"key\" in setting) ||\n setting.key !== \"APPLE_ID_AUTH_APP_CONSENT\" ||\n !(\"options\" in setting) ||\n !Array.isArray(setting.options)\n )\n return false;\n return setting.options.some(\n (option: unknown) =>\n !!option &&\n typeof option === \"object\" &&\n \"key\" in option &&\n option.key === \"PRIMARY_APP_CONSENT\" &&\n (!(\"enabled\" in option) || option.enabled === true),\n );\n })\n );\n}\n","import { z } from \"zod\";\nimport type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { localeFields, parseSchema, readJsonFile, canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { requirePrivateFile } from \"../credentials.js\";\nimport path from \"node:path\";\nimport { findApp } from \"./identifiers.js\";\n\nconst editable = new Set([\n \"PREPARE_FOR_SUBMISSION\",\n \"DEVELOPER_REJECTED\",\n \"REJECTED\",\n \"METADATA_REJECTED\",\n]);\nexport function assertEditable(value: AppleResource): void {\n const state = value.attributes.appStoreState ?? value.attributes.state;\n if (typeof state !== \"string\" || !editable.has(state))\n throw new DeliveryError(\"resource_not_editable\", 4, value.type);\n}\n\n/** 精确版本查找;没有版本配置时不选择远端最新构建。 */\nexport async function appVersion(\n builder: PlanBuilder,\n api: AppleGateway,\n create = false,\n): Promise<AppleResource | undefined> {\n const app = builder.resources.get(\"app\") ?? (await findApp(builder, api));\n if (!app) return;\n const release = builder.loaded.manifest.release;\n if (!release) throw new DeliveryError(\"release_configuration_required\", 2);\n const version = selectOne(\n (\n await api.list(`/v1/apps/${app.id}/appStoreVersions`, {\n \"filter[platform]\": \"IOS\",\n \"filter[versionString]\": release.version,\n })\n ).filter(\n (v) => v.attributes.versionString === release.version && v.attributes.platform === \"IOS\",\n ),\n \"ambiguous_app_version\",\n );\n builder.observe(\"app.version\", version);\n if (!version && create) {\n const desired = { versionString: release.version, platform: \"IOS\", releaseType: \"MANUAL\" };\n builder.ensure(\n \"app.version\",\n undefined,\n desired,\n async () => {\n const value = await api.create(\"/v1/appStoreVersions\", \"appStoreVersions\", desired, {\n app: relation(\"apps\", app.id),\n });\n return api.read(`/v1/appStoreVersions/${value.id}`);\n },\n async () => {\n throw new DeliveryError(\"unexpected_version_update\", 4);\n },\n );\n } else if (!version)\n builder.manual(\n \"app_version_required\",\n \"Prepare the configured App Store version before this operation.\",\n [\"app.version\"],\n );\n return version;\n}\n\nexport async function planMetadata(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const app = await findApp(builder, api);\n if (!app) return;\n const config = builder.loaded.manifest.metadata;\n if (!config) throw new DeliveryError(\"metadata_configuration_required\", 2);\n const version = await appVersion(builder, api, true);\n const versionState = version?.attributes.appStoreState ?? version?.attributes.state;\n const info = selectOne(\n (await api.list(`/v1/apps/${app.id}/appInfos`)).filter((v) =>\n versionState && !editable.has(String(versionState))\n ? (v.attributes.appStoreState ?? v.attributes.state) === versionState\n : editable.has(String(v.attributes.appStoreState ?? v.attributes.state)),\n ),\n \"ambiguous_editable_app_info\",\n );\n if (!info) throw new DeliveryError(\"editable_app_info_required\", 4);\n builder.observe(\"app.info\", info);\n const infoLocales = await api.list(`/v1/appInfos/${info.id}/appInfoLocalizations`);\n const versionLocales = version\n ? await api.list(`/v1/appStoreVersions/${version.id}/appStoreVersionLocalizations`)\n : [];\n for (const local of config.localizations) {\n const values = localeFields(builder.loaded, local.file);\n const common = Object.fromEntries(\n Object.entries(values).filter(([key]) =>\n [\"name\", \"subtitle\", \"privacyPolicyUrl\", \"privacyChoicesUrl\"].includes(key),\n ),\n );\n const versionFields = Object.fromEntries(\n Object.entries(values).filter(([key]) => !Object.hasOwn(common, key)),\n );\n for (const [kind, list, desiredFields, parentKey, parentType, relationshipKey] of [\n [\"appInfoLocalizations\", infoLocales, common, \"app.info\", \"appInfos\", \"appInfo\"],\n [\n \"appStoreVersionLocalizations\",\n versionLocales,\n versionFields,\n \"app.version\",\n \"appStoreVersions\",\n \"appStoreVersion\",\n ],\n ] as const) {\n if (!Object.keys(desiredFields).length) continue;\n const current = selectOne(\n list.filter((v) => v.attributes.locale === local.locale),\n \"ambiguous_localization\",\n );\n const modifiedFields = Object.keys(desiredFields).filter(\n (field) => canonical(current?.attributes[field]) !== canonical(desiredFields[field]),\n );\n const target = kind === \"appInfoLocalizations\" ? info : version;\n const liveFields =\n kind === \"appInfoLocalizations\"\n ? [\"privacyPolicyUrl\", \"privacyChoicesUrl\"]\n : [\"promotionalText\"];\n if (target && modifiedFields.some((field) => !liveFields.includes(field)))\n assertEditable(target);\n if (!current && kind === \"appInfoLocalizations\" && !common.name)\n throw new DeliveryError(\"localized_name_required\", 2, local.locale);\n const desired = { locale: local.locale, ...desiredFields };\n builder.ensure(\n `${kind}.${local.locale}`,\n current,\n desired,\n async () => {\n const created = await api.create(`/v1/${kind}`, kind, desired, {\n [relationshipKey]: relation(parentType, builder.require(parentKey).id),\n });\n return api.read(`/v1/${kind}/${created.id}`);\n },\n async (value, fields) => {\n const { locale: ignored, ...patch } = fields;\n if (ignored) throw new DeliveryError(\"locale_immutable\", 4);\n await api.update(`/v1/${kind}/${value.id}`, value, patch);\n return api.read(`/v1/${kind}/${value.id}`);\n },\n [parentKey],\n );\n }\n }\n if (config.copyright !== undefined && version?.attributes.copyright !== config.copyright) {\n if (version) assertEditable(version);\n const desired = { copyright: config.copyright };\n builder.add(\n \"app.copyright\",\n \"update\",\n version?.attributes.copyright,\n desired,\n [\"copyright\"],\n async () => {\n const target = builder.require(\"app.version\");\n await api.update(`/v1/appStoreVersions/${target.id}`, target, desired);\n const read = await api.read(`/v1/appStoreVersions/${target.id}`);\n if (read.attributes.copyright !== desired.copyright)\n throw new DeliveryError(\"metadata_readback_failed\", 5);\n return read;\n },\n [\"app.version\"],\n );\n }\n for (const field of [\"primaryCategory\", \"secondaryCategory\"] as const) {\n const desired = config[field];\n if (desired === undefined) continue;\n const category = await api.read(`/v1/appCategories/${encodeURIComponent(desired)}`);\n const currentInfo = await api.read(`/v1/appInfos/${info.id}?include=${field}`);\n const linked = currentInfo.relationships?.[field]?.data;\n if (linked && !Array.isArray(linked) && linked.id === category.id) continue;\n assertEditable(info);\n builder.add(`app.${field}`, \"update\", linked, category.id, [field], async () => {\n await api.update(\n `/v1/appInfos/${info.id}`,\n info,\n {},\n { [field]: relation(\"appCategories\", category.id) },\n );\n const result = await api.read(`/v1/appInfos/${info.id}?include=${field}`);\n if (\n canonical(result.relationships?.[field]?.data) !==\n canonical({ type: \"appCategories\", id: category.id })\n )\n throw new DeliveryError(\"category_readback_failed\", 5);\n return result;\n });\n }\n if (config.ageRatingFile) await planAgeRating(builder, api, info, config.ageRatingFile);\n if (config.licenseAgreementFile)\n await planLicense(builder, api, app, config.licenseAgreementFile);\n if (builder.loaded.manifest.review) await planReviewInformation(builder, api, version);\n}\n\nconst frequency = z.enum([\n \"NONE\",\n \"INFREQUENT_OR_MILD\",\n \"FREQUENT_OR_INTENSE\",\n \"INFREQUENT\",\n \"FREQUENT\",\n]);\nconst ageSchema = z.strictObject({\n advertising: z.boolean().optional(),\n alcoholTobaccoOrDrugUseOrReferences: frequency.optional(),\n contests: frequency.optional(),\n gambling: z.boolean().optional(),\n gamblingSimulated: frequency.optional(),\n gunsOrOtherWeapons: frequency.optional(),\n healthOrWellnessTopics: z.boolean().optional(),\n lootBox: z.boolean().optional(),\n medicalOrTreatmentInformation: frequency.optional(),\n messagingAndChat: z.boolean().optional(),\n parentalControls: z.boolean().optional(),\n profanityOrCrudeHumor: frequency.optional(),\n ageAssurance: z.boolean().optional(),\n sexualContentGraphicAndNudity: frequency.optional(),\n sexualContentOrNudity: frequency.optional(),\n horrorOrFearThemes: frequency.optional(),\n matureOrSuggestiveThemes: frequency.optional(),\n unrestrictedWebAccess: z.boolean().optional(),\n userGeneratedContent: z.boolean().optional(),\n violenceCartoonOrFantasy: frequency.optional(),\n violenceRealisticProlongedGraphicOrSadistic: frequency.optional(),\n violenceRealistic: frequency.optional(),\n ageRatingOverrideV2: z\n .enum([\"NONE\", \"NINE_PLUS\", \"THIRTEEN_PLUS\", \"SIXTEEN_PLUS\", \"EIGHTEEN_PLUS\", \"UNRATED\"])\n .optional(),\n koreaAgeRatingOverride: z.enum([\"NONE\", \"FIFTEEN_PLUS\", \"NINETEEN_PLUS\"]).optional(),\n developerAgeRatingInfoUrl: z.url().optional(),\n kidsAgeBand: z.enum([\"FIVE_AND_UNDER\", \"SIX_TO_EIGHT\", \"NINE_TO_ELEVEN\"]).optional(),\n});\nasync function planAgeRating(\n builder: PlanBuilder,\n api: AppleGateway,\n info: AppleResource,\n filename: string,\n): Promise<void> {\n const desired = parseSchema(\n ageSchema,\n JSON.parse(builder.loaded.files.get(filename)!.toString(\"utf8\")),\n );\n const current = await api.read(`/v1/appInfos/${info.id}/ageRatingDeclaration`);\n builder.ensure(\n \"app.ageRating\",\n current,\n desired,\n async () => {\n throw new DeliveryError(\"age_rating_resource_missing\", 4);\n },\n async (value, fields) => {\n await api.update(`/v1/ageRatingDeclarations/${value.id}`, value, fields);\n return api.read(`/v1/ageRatingDeclarations/${value.id}`);\n },\n );\n}\nasync function planLicense(\n builder: PlanBuilder,\n api: AppleGateway,\n app: AppleResource,\n filename: string,\n): Promise<void> {\n const desired = parseSchema(\n z.strictObject({\n agreementText: z.string().min(1),\n territories: z.array(z.string().regex(/^[A-Z]{3}$/)).min(1),\n }),\n JSON.parse(builder.loaded.files.get(filename)!.toString(\"utf8\")),\n );\n const fullApp = await api.read(`/v1/apps/${app.id}?include=endUserLicenseAgreement`);\n const ref = fullApp.relationships?.endUserLicenseAgreement?.data;\n const current =\n ref && !Array.isArray(ref)\n ? await api.read(`/v1/endUserLicenseAgreements/${ref.id}`)\n : undefined;\n const relationships = {\n app: relation(\"apps\", app.id),\n territories: { data: desired.territories.map((id) => ({ type: \"territories\", id })) },\n };\n const currentTerritories = current\n ? await api.list(`/v1/endUserLicenseAgreements/${current.id}/territories`)\n : [];\n const projection = {\n agreementText: current?.attributes.agreementText,\n territories: currentTerritories.map((v) => v.id).sort(),\n };\n if (\n canonical(projection) ===\n canonical({ ...desired, territories: [...desired.territories].sort() })\n )\n return;\n builder.add(\n \"app.license\",\n current ? \"update\" : \"create\",\n projection,\n desired,\n [\"agreementText\", \"territories\"],\n async () => {\n const result = current\n ? await api.update(\n `/v1/endUserLicenseAgreements/${current.id}`,\n current,\n { agreementText: desired.agreementText },\n { territories: relationships.territories },\n )\n : await api.create(\n \"/v1/endUserLicenseAgreements\",\n \"endUserLicenseAgreements\",\n { agreementText: desired.agreementText },\n relationships,\n );\n const value = await api.read(`/v1/endUserLicenseAgreements/${result.id}`);\n const regions = await api.list(`/v1/endUserLicenseAgreements/${result.id}/territories`);\n if (\n value.attributes.agreementText !== desired.agreementText ||\n canonical(regions.map((v) => v.id).sort()) !== canonical([...desired.territories].sort())\n )\n throw new DeliveryError(\"license_readback_failed\", 5);\n return value;\n },\n );\n}\n\nexport async function planReviewInformation(\n builder: PlanBuilder,\n api: AppleGateway,\n version?: AppleResource,\n): Promise<void> {\n const config = builder.loaded.manifest.review;\n if (!config) return;\n const location = path.resolve(builder.loaded.directory, config.credentialsRef);\n await requirePrivateFile(location);\n const desired = parseSchema(\n z.strictObject({\n contactFirstName: z.string().min(1),\n contactLastName: z.string().min(1),\n contactEmail: z.email(),\n contactPhone: z.string().regex(/^\\+[1-9]\\d{6,14}$/),\n demoAccountRequired: z.boolean(),\n demoAccountName: z.string().optional(),\n demoAccountPassword: z.string().optional(),\n }),\n await readJsonFile(location),\n );\n if (desired.demoAccountRequired && (!desired.demoAccountName || !desired.demoAccountPassword))\n throw new DeliveryError(\"review_demo_credentials_required\", 2);\n const attributes = {\n ...desired,\n ...(config.notesFile\n ? { notes: builder.loaded.files.get(config.notesFile)!.toString(\"utf8\") }\n : {}),\n };\n let current: AppleResource | undefined;\n if (version) {\n const full = await api.read(`/v1/appStoreVersions/${version.id}?include=appStoreReviewDetail`);\n const ref = full.relationships?.appStoreReviewDetail?.data;\n if (ref && !Array.isArray(ref)) current = await api.read(`/v1/appStoreReviewDetails/${ref.id}`);\n }\n builder.ensure(\n \"app.reviewInformation\",\n current,\n attributes,\n async () => {\n const created = await api.create(\n \"/v1/appStoreReviewDetails\",\n \"appStoreReviewDetails\",\n attributes,\n { appStoreVersion: relation(\"appStoreVersions\", builder.require(\"app.version\").id) },\n );\n return api.read(`/v1/appStoreReviewDetails/${created.id}`);\n },\n async (value, changed) => {\n await api.update(`/v1/appStoreReviewDetails/${value.id}`, value, changed);\n return api.read(`/v1/appStoreReviewDetails/${value.id}`);\n },\n [\"app.version\"],\n );\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { canonical, type CatalogItem } from \"../manifest.js\";\nimport { createHash } from \"node:crypto\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { findApp } from \"./identifiers.js\";\n\nexport function itemKey(item: CatalogItem): string {\n return `product.${item.productId}`;\n}\nexport function itemPath(item: CatalogItem, id: string): string {\n return item.kind === \"subscription\" ? `/v1/subscriptions/${id}` : `/v2/inAppPurchases/${id}`;\n}\n\n/** 商品 ID 与组关系稳定;可审核元数据始终使用独立版本。 */\nexport async function planCatalog(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const config = builder.loaded.manifest.catalog;\n if (!config) throw new DeliveryError(\"catalog_configuration_required\", 2);\n const app = await findApp(builder, api);\n if (!app) return;\n const groups = await api.list(`/v1/apps/${app.id}/subscriptionGroups`);\n for (const group of config.groups) {\n const key = `group.${group.key}`;\n const remoteId = group.remoteId ?? builder.bindings[key]?.id;\n const existing = remoteId\n ? selectOne(\n groups.filter((v) => v.id === remoteId),\n \"ambiguous_subscription_group\",\n )\n : undefined;\n if (remoteId && !existing)\n throw new DeliveryError(\"subscription_group_binding_mismatch\", 4, group.key);\n if (!remoteId && groups.some((v) => v.attributes.referenceName === group.name)) {\n builder.manual(\n \"subscription_group_binding_required\",\n \"Set the existing group's remoteId before managing it.\",\n [key],\n );\n continue;\n }\n const desired = { referenceName: group.name };\n builder.ensure(\n key,\n existing,\n desired,\n async () => {\n const value = await api.create(\"/v1/subscriptionGroups\", \"subscriptionGroups\", desired, {\n app: relation(\"apps\", app.id),\n });\n await builder.record(key, value);\n return api.read(`/v1/subscriptionGroups/${value.id}`);\n },\n async (value, fields) => {\n await api.update(`/v1/subscriptionGroups/${value.id}`, value, fields);\n return api.read(`/v1/subscriptionGroups/${value.id}`);\n },\n );\n await planProductVersion(\n builder,\n api,\n key,\n \"subscriptionGroup\",\n existing,\n group.localizations.map((v) => ({\n locale: v.locale,\n name: v.name,\n ...(v.customAppName ? { customAppName: v.customAppName } : {}),\n })),\n );\n }\n const purchases = await api.list(`/v1/apps/${app.id}/inAppPurchasesV2`);\n for (const item of config.items) {\n const key = itemKey(item);\n const groupKey = item.kind === \"subscription\" ? `group.${item.groupKey}` : undefined;\n const parent = groupKey ? builder.resources.get(groupKey) : app;\n if (groupKey && builder.requirements.some((v) => v.blockedOperationIds.includes(groupKey))) {\n builder.manual(\n \"subscription_group_binding_required\",\n \"Bind the subscription group before configuring its products.\",\n [key],\n );\n continue;\n }\n const collection =\n item.kind === \"subscription\"\n ? parent\n ? await api.list(`/v1/subscriptionGroups/${parent.id}/subscriptions`)\n : []\n : purchases;\n const current = selectOne(\n collection.filter((v) => v.attributes.productId === item.productId),\n \"ambiguous_product_id\",\n );\n const desired = {\n productId: item.productId,\n name: item.name,\n ...(item.familySharable === undefined ? {} : { familySharable: item.familySharable }),\n ...(item.reviewNote === undefined ? {} : { reviewNote: item.reviewNote }),\n ...(item.kind === \"subscription\"\n ? { subscriptionPeriod: item.duration, groupLevel: item.level }\n : { inAppPurchaseType: item.kind }),\n };\n if (\n current &&\n item.kind !== \"subscription\" &&\n current.attributes.inAppPurchaseType !== item.kind\n )\n throw new DeliveryError(\"product_type_immutable\", 4, item.productId);\n builder.ensure(\n key,\n current,\n desired,\n async () => {\n const location = item.kind === \"subscription\" ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\";\n const type = item.kind === \"subscription\" ? \"subscriptions\" : \"inAppPurchases\";\n const relationships =\n item.kind === \"subscription\"\n ? { group: relation(\"subscriptionGroups\", builder.require(groupKey!).id) }\n : { app: relation(\"apps\", app.id) };\n const value = await api.create(location, type, desired, relationships);\n return api.read(itemPath(item, value.id));\n },\n async (value, fields) => {\n if (fields.productId || fields.inAppPurchaseType)\n throw new DeliveryError(\"product_identity_immutable\", 4, item.productId);\n await api.update(itemPath(item, value.id), value, fields);\n return api.read(itemPath(item, value.id));\n },\n groupKey ? [groupKey] : [],\n );\n await planProductVersion(\n builder,\n api,\n key,\n item.kind === \"subscription\" ? \"subscription\" : \"inAppPurchase\",\n current,\n item.localizations,\n item.promotionalImage,\n );\n }\n}\n\ntype VersionKind = \"subscriptionGroup\" | \"subscription\" | \"inAppPurchase\";\nconst versionSpec = {\n subscriptionGroup: {\n parents: \"subscriptionGroups\",\n versions: \"subscriptionGroupVersions\",\n localizations: \"subscriptionGroupLocalizations\",\n relation: \"subscriptionGroup\",\n parentApi: \"v1\",\n },\n subscription: {\n parents: \"subscriptions\",\n versions: \"subscriptionVersions\",\n localizations: \"subscriptionLocalizations\",\n relation: \"subscription\",\n parentApi: \"v1\",\n },\n inAppPurchase: {\n parents: \"inAppPurchases\",\n versions: \"inAppPurchaseVersions\",\n localizations: \"inAppPurchaseLocalizations\",\n relation: \"inAppPurchase\",\n parentApi: \"v2\",\n },\n} as const;\n\nasync function planProductVersion(\n builder: PlanBuilder,\n api: AppleGateway,\n parentKey: string,\n kind: VersionKind,\n parent: AppleResource | undefined,\n localizations: { locale: string; name: string; description?: string; customAppName?: string }[],\n promotionalImage?: string,\n): Promise<void> {\n if (!localizations.length && !promotionalImage) return;\n const spec = versionSpec[kind];\n const key = `${parentKey}.version`;\n const versions = parent\n ? await api.list(`/${spec.parentApi}/${spec.parents}/${parent.id}/versions`)\n : [];\n const draft = selectOne(\n versions.filter((v) => v.attributes.state === \"PREPARE_FOR_SUBMISSION\"),\n \"ambiguous_product_draft\",\n );\n const approved = selectOne(\n versions.filter((v) => [\"APPROVED\", \"ACCEPTED\"].includes(String(v.attributes.state))),\n \"ambiguous_approved_product_version\",\n );\n let version = draft ?? approved;\n let existing = version ? await api.list(`/v1/${spec.versions}/${version.id}/localizations`) : [];\n let changed = localizations.some((local) => {\n const found = selectOne(\n existing.filter((v) => v.attributes.locale === local.locale),\n \"ambiguous_product_localization\",\n );\n return (\n !found ||\n Object.entries(local).some(\n ([field, value]) => canonical(found.attributes[field]) !== canonical(value),\n )\n );\n });\n if (promotionalImage && version) {\n const checksum = createHash(\"md5\")\n .update(builder.loaded.files.get(promotionalImage)!)\n .digest(\"hex\");\n const bound = builder.bindings[`${parentKey}.promotionImage.${checksum}`];\n changed ||= !(await api.list(`/v1/${spec.versions}/${version.id}/images`)).some(\n (v) =>\n v.id === bound?.id &&\n (v.attributes.assetDeliveryState as { state?: string } | undefined)?.state === \"COMPLETE\",\n );\n }\n if (changed && !draft) {\n if (\n versions.some((v) =>\n [\"READY_FOR_REVIEW\", \"WAITING_FOR_REVIEW\", \"IN_REVIEW\"].includes(\n String(v.attributes.state),\n ),\n )\n )\n throw new DeliveryError(\"product_version_in_review\", 4, parentKey);\n version = undefined;\n existing = [];\n }\n builder.ensure(\n key,\n version,\n {},\n async () => {\n const value = await api.create(\n `/v1/${spec.versions}`,\n spec.versions,\n {},\n { [spec.relation]: relation(spec.parents, builder.require(parentKey).id) },\n );\n return api.read(`/v1/${spec.versions}/${value.id}`);\n },\n async () => {\n throw new DeliveryError(\"product_version_readonly\", 4);\n },\n [parentKey],\n );\n for (const local of localizations) {\n const current = selectOne(\n existing.filter((v) => v.attributes.locale === local.locale),\n \"ambiguous_product_localization\",\n );\n const desired = { ...local };\n builder.ensure(\n `${key}.${local.locale}`,\n current,\n desired,\n async () => {\n const value = await api.create(`/v2/${spec.localizations}`, spec.localizations, desired, {\n version: relation(spec.versions, builder.require(key).id),\n });\n return api.read(`/v2/${spec.localizations}/${value.id}`);\n },\n async (value, fields) => {\n await api.update(`/v2/${spec.localizations}/${value.id}`, value, fields);\n return api.read(`/v2/${spec.localizations}/${value.id}`);\n },\n [key],\n );\n }\n}\n\n/** 用于只读后续阶段的精确商品绑定,不创建或更新商品。 */\nexport async function readCatalog(\n builder: PlanBuilder,\n api: AppleGateway,\n): Promise<Map<string, AppleResource>> {\n const app = builder.resources.get(\"app\") ?? (await findApp(builder, api));\n const found = new Map<string, AppleResource>();\n if (!app) return found;\n const config = builder.loaded.manifest.catalog;\n if (!config) return found;\n const groups = await api.list(`/v1/apps/${app.id}/subscriptionGroups`);\n const purchases = await api.list(`/v1/apps/${app.id}/inAppPurchasesV2`);\n for (const item of config.items) {\n let rows = purchases;\n if (item.kind === \"subscription\") {\n const group = config.groups.find((v) => v.key === item.groupKey)!;\n const remoteId = group.remoteId ?? builder.bindings[`group.${group.key}`]?.id;\n const parent = remoteId ? groups.find((v) => v.id === remoteId) : undefined;\n if (!parent) throw new DeliveryError(\"subscription_group_binding_required\", 4, group.key);\n rows = await api.list(`/v1/subscriptionGroups/${parent.id}/subscriptions`);\n }\n const value = selectOne(\n rows.filter((v) => v.attributes.productId === item.productId),\n \"ambiguous_product_id\",\n );\n if (!value) throw new DeliveryError(\"catalog_product_required\", 4, item.productId);\n builder.observe(itemKey(item), value);\n found.set(item.productId, value);\n }\n return found;\n}\n","import { z } from \"zod\";\nimport { createHash } from \"node:crypto\";\nimport { lookup } from \"node:dns/promises\";\nimport { isIP } from \"node:net\";\nimport { request as httpsRequest } from \"node:https\";\nimport path from \"node:path\";\nimport type { AppleGateway, AppleResource, Clock } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne, systemClock } from \"../api.js\";\nimport { canonical, parseSchema } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { appVersion, assertEditable } from \"./metadata.js\";\nimport { readCatalog, itemKey } from \"./catalog.js\";\n\nconst uploadSchema = z\n .array(\n z.object({\n method: z.literal(\"PUT\"),\n url: z.url(),\n offset: z.number().int().min(0),\n length: z.number().int().positive(),\n requestHeaders: z.array(z.object({ name: z.string(), value: z.string() })),\n }),\n )\n .min(1);\n\nfunction isPublicAddress(value: string): boolean {\n if (isIP(value) === 4) {\n const [a, b] = value.split(\".\").map(Number);\n return (\n a !== 0 &&\n a !== 10 &&\n a !== 127 &&\n a < 224 &&\n !(a === 169 && b === 254) &&\n !(a === 172 && b >= 16 && b <= 31) &&\n !(a === 192 && b === 168) &&\n !(a === 100 && b >= 64 && b <= 127)\n );\n }\n if (isIP(value) === 6) return /^2[0-9a-f]{3}:/i.test(value);\n return false;\n}\n\nexport interface AssetTransfer {\n upload(reservation: AppleResource, bytes: Buffer, signal?: AbortSignal): Promise<void>;\n}\n\n/** 仅接收已认证 API 返回的上传描述,绝不复用 Apple 管理 API 的 Bearer。 */\nexport function createAssetTransfer(\n options: { fetch?: typeof fetch; resolve?: typeof lookup; signal?: AbortSignal } = {},\n): AssetTransfer {\n return {\n async upload(reservation, bytes, signal) {\n signal ??= options.signal;\n const operations = parseSchema(uploadSchema, reservation.attributes.uploadOperations);\n const sorted = [...operations].sort((a, b) => a.offset - b.offset);\n let end = 0;\n for (const part of sorted) {\n if (part.offset !== end || part.offset + part.length > bytes.length)\n throw new DeliveryError(\"invalid_upload_ranges\", 5);\n end += part.length;\n }\n if (end !== bytes.length) throw new DeliveryError(\"incomplete_upload_ranges\", 5);\n for (const part of operations) {\n const url = new URL(part.url);\n if (\n url.protocol !== \"https:\" ||\n url.username ||\n url.password ||\n (url.port && url.port !== \"443\") ||\n isIP(url.hostname)\n )\n throw new DeliveryError(\"untrusted_upload_destination\", 5);\n const addresses = await (options.resolve ?? lookup)(url.hostname, { all: true });\n if (!addresses.length || addresses.some((v) => !isPublicAddress(v.address)))\n throw new DeliveryError(\"untrusted_upload_destination\", 5);\n const headers = new Headers();\n for (const header of part.requestHeaders) {\n if (\n /^(host|cookie|proxy-authorization)$/i.test(header.name) ||\n /^bearer /i.test(header.value)\n )\n throw new DeliveryError(\"unsafe_upload_header\", 5);\n headers.set(header.name, header.value);\n }\n const abort = signal\n ? AbortSignal.any([signal, AbortSignal.timeout(60_000)])\n : AbortSignal.timeout(60_000);\n const chunk = bytes.subarray(part.offset, part.offset + part.length);\n const status = options.fetch\n ? (\n await options.fetch(url, {\n method: \"PUT\",\n headers,\n body: new Uint8Array(chunk),\n signal: abort,\n redirect: \"error\",\n })\n ).status\n : await new Promise<number>((resolve, reject) => {\n // 固定已验证的地址,连接时不能再次 DNS 解析到内网。\n const req = httpsRequest(\n url,\n {\n method: \"PUT\",\n headers: Object.fromEntries(headers),\n signal: abort,\n family: addresses[0].family,\n lookup: (_host, _settings, done) =>\n done(null, addresses[0].address, addresses[0].family),\n },\n (response) => {\n response.resume();\n response.once(\"end\", () => resolve(response.statusCode ?? 0));\n },\n );\n req.once(\"error\", () => reject(new DeliveryError(\"asset_transfer_failed\", 5)));\n req.end(chunk);\n });\n if (status < 200 || status >= 300)\n throw new DeliveryError(\"asset_transfer_failed\", 5, undefined, status);\n }\n },\n };\n}\n\nexport async function uploadAsset(\n api: AppleGateway,\n transfer: AssetTransfer,\n endpoint: string,\n type: string,\n attributes: Record<string, unknown>,\n relationships: Record<string, unknown>,\n bytes: Buffer,\n clock: Clock = systemClock,\n resume?: AppleResource,\n record?: (resource: AppleResource) => Promise<void>,\n signal?: AbortSignal,\n): Promise<AppleResource> {\n const reservation = resume ?? (await api.create(endpoint, type, attributes, relationships));\n await record?.(reservation);\n const state = (reservation.attributes.assetDeliveryState as { state?: string } | undefined)\n ?.state;\n if (state === \"FAILED\") throw new DeliveryError(\"asset_processing_failed\", 5);\n if (state === \"COMPLETE\") return reservation;\n if (state !== \"UPLOAD_COMPLETE\" && state !== \"PROCESSING\") {\n await transfer.upload(reservation, bytes, signal);\n await api.update(`${endpoint}/${reservation.id}`, reservation, {\n uploaded: true,\n ...(!endpoint.startsWith(\"/v2/\")\n ? { sourceFileChecksum: createHash(\"md5\").update(bytes).digest(\"hex\") }\n : {}),\n });\n }\n for (let attempt = 0; attempt < 30; attempt++) {\n const current = await api.read(`${endpoint}/${reservation.id}`);\n const state = current.attributes.assetDeliveryState;\n if (state && typeof state === \"object\" && \"state\" in state) {\n if (state.state === \"COMPLETE\") return current;\n if (state.state === \"FAILED\") throw new DeliveryError(\"asset_processing_failed\", 5);\n }\n await clock.sleep(2000, signal);\n }\n throw new DeliveryError(\"asset_processing_timeout\", 5);\n}\n\n/** 校验 PNG 结构和透明通道;JPEG/视频由上传处理器提供最终格式校验。 */\nexport function validateImage(bytes: Buffer, square = false): void {\n if (bytes.length > 10 * 1024 * 1024) throw new DeliveryError(\"image_too_large\", 2);\n if (!bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]))) {\n if (\n !square &&\n bytes[0] === 255 &&\n bytes[1] === 216 &&\n bytes.at(-2) === 255 &&\n bytes.at(-1) === 217\n )\n return;\n throw new DeliveryError(\"png_image_required\", 2);\n }\n if (bytes.length < 33 || bytes.toString(\"ascii\", 12, 16) !== \"IHDR\")\n throw new DeliveryError(\"invalid_png\", 2);\n const width = bytes.readUInt32BE(16),\n height = bytes.readUInt32BE(20);\n if (\n !width ||\n !height ||\n width > 10000 ||\n height > 10000 ||\n (square && (width !== 1024 || height !== 1024))\n )\n throw new DeliveryError(\"image_dimensions_invalid\", 2);\n if ([4, 6].includes(bytes[25])) throw new DeliveryError(\"image_alpha_not_allowed\", 2);\n let offset = 8;\n let ended = false;\n while (offset + 12 <= bytes.length) {\n const size = bytes.readUInt32BE(offset);\n const type = bytes.toString(\"ascii\", offset + 4, offset + 8);\n if (size > bytes.length - offset - 12) throw new DeliveryError(\"invalid_png\", 2);\n if (type === \"tRNS\") throw new DeliveryError(\"image_alpha_not_allowed\", 2);\n offset += size + 12;\n if (type === \"IEND\") {\n ended = true;\n break;\n }\n }\n if (!ended) throw new DeliveryError(\"invalid_png\", 2);\n}\n\nexport async function planAssets(\n builder: PlanBuilder,\n api: AppleGateway,\n transfer: AssetTransfer,\n): Promise<void> {\n const config = builder.loaded.manifest.assets;\n if (!config) throw new DeliveryError(\"assets_configuration_required\", 2);\n if (config.icon) validateImage(builder.loaded.files.get(config.icon)!, true);\n const version = await appVersion(builder, api);\n if (!version) return;\n assertEditable(version);\n const locales = await api.list(`/v1/appStoreVersions/${version.id}/appStoreVersionLocalizations`);\n const ordering = new Map<\n string,\n {\n type: string;\n filesType: string;\n existing: AppleResource[];\n keys: { key: string; order: number }[];\n }\n >();\n const managed = new Map<string, AppleResource>();\n for (const [media, inputs] of [\n [\"screenshot\", config.screenshots],\n [\"preview\", config.previews],\n ] as const) {\n for (const input of inputs) {\n if (!input.locale || !input.displayType)\n throw new DeliveryError(\"asset_locale_and_display_required\", 2, input.file);\n const locale = selectOne(\n locales.filter((v) => v.attributes.locale === input.locale),\n \"ambiguous_localization\",\n );\n if (!locale) throw new DeliveryError(\"asset_localization_required\", 4, input.locale);\n const setsType = media === \"screenshot\" ? \"appScreenshotSets\" : \"appPreviewSets\";\n const filesType = media === \"screenshot\" ? \"appScreenshots\" : \"appPreviews\";\n const displayField = media === \"screenshot\" ? \"screenshotDisplayType\" : \"previewType\";\n const display =\n media === \"screenshot\" ? input.displayType : (input.previewType ?? input.displayType);\n const setKey = `assetSet.${media}.${input.locale}.${display}`;\n let set = builder.resources.get(setKey);\n if (!set && !builder.changes.some((v) => v.operation.id === setKey)) {\n set = selectOne(\n (await api.list(`/v1/appStoreVersionLocalizations/${locale.id}/${setsType}`)).filter(\n (v) => v.attributes[displayField] === display,\n ),\n \"ambiguous_asset_set\",\n );\n if (!set && builder.intent.action === \"remove-owned-assets\") continue;\n builder.ensure(\n setKey,\n set,\n { [displayField]: display },\n async () => {\n const created = await api.create(\n `/v1/${setsType}`,\n setsType,\n { [displayField]: display },\n { appStoreVersionLocalization: relation(\"appStoreVersionLocalizations\", locale.id) },\n );\n return api.read(`/v1/${setsType}/${created.id}`);\n },\n async () => {\n throw new DeliveryError(\"asset_set_immutable\", 4);\n },\n );\n }\n const bytes = builder.loaded.files.get(input.file)!;\n if (media === \"screenshot\") validateImage(bytes);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n const existing = set ? await api.list(`/v1/${setsType}/${set.id}/${filesType}`) : [];\n for (const resource of existing) managed.set(resource.id, resource);\n if (builder.intent.action === \"remove-owned-assets\") continue;\n const assetKey = `${setKey}.file.${input.file}.${checksum}`;\n const group = ordering.get(setKey) ?? { type: setsType, filesType, existing, keys: [] };\n group.keys.push({ key: assetKey, order: input.order ?? group.keys.length });\n ordering.set(setKey, group);\n const matched = selectOne(\n existing.filter((v) => v.attributes.sourceFileChecksum === checksum),\n \"ambiguous_asset_checksum\",\n );\n const state = matched?.attributes.assetDeliveryState as { state?: string } | undefined;\n if (matched && state?.state === \"COMPLETE\") {\n builder.observe(assetKey, matched);\n continue;\n }\n const bound = builder.bindings[assetKey];\n const resume = bound\n ? existing.find((v) => v.id === bound.id && v.type === bound.type)\n : undefined;\n if (bound && !resume) throw new DeliveryError(\"asset_binding_mismatch\", 4, assetKey);\n builder.add(\n assetKey,\n \"upload\",\n existing.map((v) => ({\n id: v.id,\n checksum: v.attributes.sourceFileChecksum,\n state: v.attributes.assetDeliveryState,\n })),\n { checksum, order: input.order },\n [\"file\", \"locale\", \"displayType\"],\n async () => {\n return uploadAsset(\n api,\n transfer,\n `/v1/${filesType}`,\n filesType,\n {\n fileName: path.basename(input.file),\n fileSize: bytes.length,\n ...(media === \"preview\"\n ? {\n mimeType: input.file.endsWith(\".mov\") ? \"video/quicktime\" : \"video/mp4\",\n previewFrameTimeCode: input.previewFrameTimeCode,\n }\n : {}),\n },\n {\n [media === \"screenshot\" ? \"appScreenshotSet\" : \"appPreviewSet\"]: relation(\n setsType,\n builder.require(setKey).id,\n ),\n },\n bytes,\n systemClock,\n resume,\n (value) => builder.record(assetKey, value),\n );\n },\n [setKey],\n !!resume,\n );\n }\n }\n if (builder.intent.action === \"remove-owned-assets\") {\n for (const target of config.removeOwnedIds) {\n const binding = Object.values(builder.bindings).find(\n (v) => v.id === target.id && v.type === target.type,\n );\n if (!binding) throw new DeliveryError(\"asset_ownership_evidence_required\", 4, target.id);\n if (!managed.has(target.id)) {\n try {\n await api.read(`/v1/${target.type}/${target.id}`);\n } catch (error) {\n if (error instanceof DeliveryError && error.httpStatus === 404) continue;\n throw error;\n }\n throw new DeliveryError(\"asset_ownership_evidence_required\", 4, target.id);\n }\n builder.add(\n `asset.remove.${target.id}`,\n \"remove-owned-asset\",\n managed.get(target.id),\n null,\n [\"id\"],\n async () => {\n await api.remove(`/v1/${target.type}/${target.id}`);\n try {\n await api.read(`/v1/${target.type}/${target.id}`);\n } catch (error) {\n if (error instanceof DeliveryError && error.httpStatus === 404) return target;\n throw error;\n }\n throw new DeliveryError(\"asset_removal_readback_failed\", 5);\n },\n );\n }\n return;\n }\n for (const [key, group] of ordering) {\n const keys = [...group.keys].sort((a, b) => a.order - b.order).map((v) => v.key);\n if (new Set(group.keys.map((v) => v.order)).size !== keys.length)\n throw new DeliveryError(\"duplicate_asset_order\", 2, key);\n const knownIds = keys.map((k) => builder.resources.get(k)?.id);\n const remaining = group.existing.filter((v) => !knownIds.includes(v.id)).map((v) => v.id);\n if (\n knownIds.every(Boolean) &&\n canonical([...knownIds, ...remaining]) === canonical(group.existing.map((v) => v.id))\n )\n continue;\n builder.add(\n `${key}.order`,\n \"update\",\n group.existing.map((v) => v.id),\n keys,\n [\"order\"],\n async () => {\n const ids = keys.map((k) => builder.require(k).id);\n const all = [...ids, ...group.existing.map((v) => v.id).filter((id) => !ids.includes(id))];\n const parent = builder.require(key);\n await api.relationship(\n `/v1/${group.type}/${parent.id}/relationships/${group.filesType}`,\n all.map((id) => ({ type: group.filesType, id })),\n \"PATCH\",\n );\n const read = await api.list(`/v1/${group.type}/${parent.id}/${group.filesType}`);\n if (canonical(read.map((v) => v.id)) !== canonical(all))\n throw new DeliveryError(\"asset_order_readback_failed\", 5);\n return parent;\n },\n [key, ...keys],\n );\n }\n}\n\nexport async function planCatalogAssets(\n builder: PlanBuilder,\n api: AppleGateway,\n transfer: AssetTransfer,\n): Promise<void> {\n const products = await readCatalog(builder, api);\n for (const item of builder.loaded.manifest.catalog?.items ?? []) {\n const parent = products.get(item.productId);\n if (!parent) continue;\n const subscription = item.kind === \"subscription\";\n for (const [usage, filename] of [\n [\"promotion\", item.promotionalImage],\n [\"review\", item.reviewScreenshot],\n ] as const) {\n if (!filename) continue;\n const bytes = builder.loaded.files.get(filename)!;\n validateImage(bytes, usage === \"promotion\");\n const type =\n usage === \"promotion\"\n ? subscription\n ? \"subscriptionImages\"\n : \"inAppPurchaseImages\"\n : subscription\n ? \"subscriptionAppStoreReviewScreenshots\"\n : \"inAppPurchaseAppStoreReviewScreenshots\";\n const versionType = subscription ? \"subscriptionVersions\" : \"inAppPurchaseVersions\";\n let target = parent;\n let current: AppleResource[];\n if (usage === \"promotion\") {\n const versions = await api.list(\n `${subscription ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\"}/${parent.id}/versions`,\n );\n const draft =\n selectOne(\n versions.filter((v) => v.attributes.state === \"PREPARE_FOR_SUBMISSION\"),\n \"ambiguous_product_draft\",\n ) ??\n selectOne(\n versions.filter((v) => [\"APPROVED\", \"ACCEPTED\"].includes(String(v.attributes.state))),\n \"ambiguous_product_version\",\n );\n if (!draft) throw new DeliveryError(\"product_draft_required_for_image\", 4, item.productId);\n target = draft;\n current = await api.list(`/v1/${versionType}/${draft.id}/images`);\n } else {\n const full = await api.read(\n `${subscription ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\"}/${parent.id}?include=appStoreReviewScreenshot`,\n );\n const ref = full.relationships?.appStoreReviewScreenshot?.data;\n current = ref && !Array.isArray(ref) ? [await api.read(`/v1/${type}/${ref.id}`)] : [];\n }\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n const key = `${itemKey(item)}.${usage}Image.${checksum}`;\n const resume = current.find((v) => v.id === builder.bindings[key]?.id);\n if (\n current.some(\n (v) =>\n (usage === \"promotion\"\n ? v.id === resume?.id\n : v.attributes.sourceFileChecksum === checksum) &&\n (v.attributes.assetDeliveryState as { state?: string } | undefined)?.state ===\n \"COMPLETE\",\n )\n )\n continue;\n if (usage === \"promotion\" && target.attributes.state !== \"PREPARE_FOR_SUBMISSION\")\n throw new DeliveryError(\"product_draft_required_for_image\", 4, item.productId);\n if (\n usage === \"review\" &&\n current.length &&\n !resume &&\n (!item.replaceReviewScreenshotId ||\n !current.some((v) => v.id === item.replaceReviewScreenshotId) ||\n !Object.values(builder.bindings).some(\n (v) => v.id === item.replaceReviewScreenshotId && v.type === type,\n ))\n )\n throw new DeliveryError(\"owned_review_screenshot_replacement_required\", 4, item.productId);\n builder.add(\n key,\n \"upload\",\n current.map((v) => ({ id: v.id, state: v.attributes.assetDeliveryState })),\n { checksum, replaceReviewScreenshotId: item.replaceReviewScreenshotId },\n [\"image\", ...(item.replaceReviewScreenshotId ? [\"replaceReviewScreenshotId\"] : [])],\n async () => {\n if (usage === \"review\" && current.length && !resume)\n await api.remove(`/v1/${type}/${item.replaceReviewScreenshotId}`);\n return uploadAsset(\n api,\n transfer,\n `/${usage === \"promotion\" ? \"v2\" : \"v1\"}/${type}`,\n type,\n { fileName: path.basename(filename), fileSize: bytes.length },\n {\n [usage === \"promotion\"\n ? \"version\"\n : subscription\n ? \"subscription\"\n : \"inAppPurchaseV2\"]: relation(\n usage === \"promotion\" ? versionType : parent.type,\n target.id,\n ),\n },\n bytes,\n systemClock,\n resume,\n (value) => builder.record(key, value),\n );\n },\n [],\n !!resume,\n );\n }\n }\n}\n\nexport async function planReviewAttachments(\n builder: PlanBuilder,\n api: AppleGateway,\n transfer: AssetTransfer,\n): Promise<void> {\n const files = builder.loaded.manifest.review?.attachments ?? [];\n if (!files.length) return;\n const version = await appVersion(builder, api);\n if (!version) return;\n assertEditable(version);\n const full = await api.read(`/v1/appStoreVersions/${version.id}?include=appStoreReviewDetail`);\n const ref = full.relationships?.appStoreReviewDetail?.data;\n if (!ref || Array.isArray(ref)) throw new DeliveryError(\"review_information_required\", 4);\n const current = await api.list(`/v1/appStoreReviewDetails/${ref.id}/appStoreReviewAttachments`);\n for (const filename of files) {\n const bytes = builder.loaded.files.get(filename)!;\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n const key = `reviewAttachment.${version.id}.${checksum}`;\n const matched = selectOne(\n current.filter((v) => v.attributes.sourceFileChecksum === checksum),\n \"ambiguous_review_attachment\",\n );\n if (\n (matched?.attributes.assetDeliveryState as { state?: string } | undefined)?.state ===\n \"COMPLETE\"\n ) {\n builder.observe(key, matched);\n continue;\n }\n const resume = current.find((v) => v.id === builder.bindings[key]?.id);\n builder.add(\n key,\n \"upload\",\n resume,\n { checksum, detailId: ref.id },\n [\"file\"],\n () =>\n uploadAsset(\n api,\n transfer,\n \"/v1/appStoreReviewAttachments\",\n \"appStoreReviewAttachments\",\n { fileName: path.basename(filename), fileSize: bytes.length },\n { appStoreReviewDetail: relation(\"appStoreReviewDetails\", ref.id) },\n bytes,\n systemClock,\n resume,\n (value) => builder.record(key, value),\n ),\n [],\n !!resume,\n );\n }\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { readOptionalRelationship, relation, selectOne } from \"../api.js\";\nimport { canonical, digest, type CatalogItem } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { itemKey, itemPath, readCatalog } from \"./catalog.js\";\n\nfunction amount(value: unknown): string {\n if (typeof value !== \"string\" || !/^\\d+(?:\\.\\d+)?$/.test(value))\n throw new DeliveryError(\"invalid_price_amount\", 5);\n const [whole, fraction = \"\"] = value.split(\".\");\n return `${whole.replace(/^0+(?=\\d)/, \"\")}.${fraction.replace(/0+$/, \"\")}`;\n}\nfunction linked(value: AppleResource, relationship: string): string | undefined {\n const ref = value.relationships?.[relationship]?.data;\n return ref && !Array.isArray(ref) ? ref.id : undefined;\n}\n\nexport async function planPricing(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n if (!builder.loaded.manifest.catalog)\n throw new DeliveryError(\"catalog_configuration_required\", 2);\n const resources = await readCatalog(builder, api);\n const territories = await api.list(\"/v1/territories\");\n for (const item of builder.loaded.manifest.catalog.items) {\n const product = resources.get(item.productId);\n if (!product) continue;\n if (item.availability) await planAvailability(builder, api, item, product);\n if (!item.prices.length) continue;\n const points: { config: CatalogItem[\"prices\"][number]; resource: AppleResource }[] = [];\n for (const price of item.prices) {\n const territory = territories.find((value) => value.id === price.territory);\n if (!territory) throw new DeliveryError(\"territory_unavailable\", 2, price.territory);\n if (territory.attributes.currency !== price.currency)\n throw new DeliveryError(\"territory_currency_mismatch\", 2, price.territory);\n const candidates = await api.list(`${itemPath(item, product.id)}/pricePoints`, {\n \"filter[territory]\": price.territory,\n limit: \"8000\",\n });\n const point = selectOne(\n candidates.filter(\n (v) =>\n amount(v.attributes.customerPrice) === amount(price.customerPrice) &&\n (!price.pricePointId || price.pricePointId === v.id),\n ),\n \"ambiguous_price_point\",\n );\n if (!point) throw new DeliveryError(\"price_point_unavailable\", 2, price.territory);\n points.push({ config: price, resource: point });\n }\n if (item.kind === \"subscription\") {\n const current = await api.list(`/v1/subscriptions/${product.id}/prices`, {\n include: \"subscriptionPricePoint,territory\",\n });\n builder.observe(`${itemKey(item)}.prices`, {\n type: \"subscriptionPrices\",\n id: product.id,\n attributes: { values: current },\n });\n for (const { config, resource: point } of points) {\n const existing = current.filter((v) => linked(v, \"territory\") === config.territory);\n if (!(\"preserveCurrentPrice\" in config) || config.preserveCurrentPrice === undefined)\n throw new DeliveryError(\"price_preservation_choice_required\", 2, config.territory);\n const key = `${itemKey(item)}.price.${config.territory}.${config.startDate ?? \"current\"}`;\n if (\n existing.some(\n (v) =>\n v.attributes.preserved !== true &&\n linked(v, \"subscriptionPricePoint\") === point.id &&\n (v.attributes.startDate ?? null) === (config.startDate ?? null),\n )\n ) {\n if (builder.bindings[`${key}.preservation`]?.id !== digest(config))\n throw new DeliveryError(\"price_preservation_evidence_required\", 4, config.territory);\n continue;\n }\n builder.add(\n key,\n \"create\",\n existing,\n config,\n [\"price\", \"startDate\", \"preserveCurrentPrice\"],\n async () => {\n const created = await api.create(\n \"/v1/subscriptionPrices\",\n \"subscriptionPrices\",\n {\n startDate: config.startDate ?? null,\n preserveCurrentPrice: config.preserveCurrentPrice,\n },\n {\n subscription: relation(\"subscriptions\", product.id),\n subscriptionPricePoint: relation(\"subscriptionPricePoints\", point.id),\n territory: relation(\"territories\", config.territory),\n },\n );\n const verified = (\n await api.list(`/v1/subscriptions/${product.id}/prices`, {\n include: \"subscriptionPricePoint,territory\",\n \"filter[territory]\": config.territory,\n })\n ).find((v) => v.id === created.id);\n if (\n !verified ||\n linked(verified, \"subscriptionPricePoint\") !== point.id ||\n linked(verified, \"territory\") !== config.territory ||\n (verified.attributes.startDate ?? null) !== (config.startDate ?? null)\n )\n throw new DeliveryError(\"price_readback_failed\", 5);\n await builder.record(`${key}.preservation`, {\n type: \"subscriptionPricePolicies\",\n id: digest(config),\n });\n return verified;\n },\n );\n }\n } else {\n if (!item.baseTerritory)\n throw new DeliveryError(\"base_territory_required\", 2, item.productId);\n const full = await api.read(`/v2/inAppPurchases/${product.id}?include=iapPriceSchedule`);\n const scheduleId = linked(full, \"iapPriceSchedule\");\n const base = scheduleId\n ? await api.read(`/v1/inAppPurchasePriceSchedules/${scheduleId}/baseTerritory`)\n : undefined;\n const existing = scheduleId\n ? await api.list(`/v1/inAppPurchasePriceSchedules/${scheduleId}/manualPrices`, {\n include: \"inAppPurchasePricePoint,territory\",\n })\n : [];\n const expected = points\n .map((p) => ({\n point: p.resource.id,\n date: p.config.startDate ?? null,\n endDate: \"endDate\" in p.config ? (p.config.endDate ?? null) : null,\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n const actual = existing\n .map((p) => ({\n point: linked(p, \"inAppPurchasePricePoint\"),\n date: p.attributes.startDate ?? null,\n endDate: p.attributes.endDate ?? null,\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n if (canonical(expected) === canonical(actual) && base?.id === item.baseTerritory) continue;\n builder.add(\n `${itemKey(item)}.priceSchedule`,\n \"create\",\n { prices: existing, base: base?.id },\n { baseTerritory: item.baseTerritory, prices: points.map((p) => p.config) },\n [\"priceSchedule\"],\n async () => {\n const included = points.map((p, index) => ({\n type: \"inAppPurchasePrices\",\n id: \"${price-\" + index + \"}\",\n attributes: {\n startDate: p.config.startDate ?? null,\n endDate: \"endDate\" in p.config ? (p.config.endDate ?? null) : null,\n },\n relationships: {\n inAppPurchaseV2: relation(\"inAppPurchases\", product.id),\n inAppPurchasePricePoint: relation(\"inAppPurchasePricePoints\", p.resource.id),\n },\n }));\n const result = await api.create(\n \"/v1/inAppPurchasePriceSchedules\",\n \"inAppPurchasePriceSchedules\",\n {},\n {\n inAppPurchase: relation(\"inAppPurchases\", product.id),\n baseTerritory: relation(\"territories\", item.baseTerritory!),\n manualPrices: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const prices = await api.list(\n `/v1/inAppPurchasePriceSchedules/${result.id}/manualPrices`,\n { include: \"inAppPurchasePricePoint\" },\n );\n const values = prices\n .map((p) => ({\n point: linked(p, \"inAppPurchasePricePoint\"),\n date: p.attributes.startDate ?? null,\n endDate: p.attributes.endDate ?? null,\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n const verifiedBase = await api.read(\n `/v1/inAppPurchasePriceSchedules/${result.id}/baseTerritory`,\n );\n if (canonical(expected) !== canonical(values) || verifiedBase.id !== item.baseTerritory)\n throw new DeliveryError(\"price_schedule_readback_failed\", 5);\n return result;\n },\n );\n }\n }\n}\n\nasync function planAvailability(\n builder: PlanBuilder,\n api: AppleGateway,\n item: CatalogItem,\n product: AppleResource,\n): Promise<void> {\n const config = item.availability!;\n const subscription = item.kind === \"subscription\";\n const type = subscription ? \"subscriptionAvailabilities\" : \"inAppPurchaseAvailabilities\";\n const relationship = subscription ? \"subscriptionAvailability\" : \"inAppPurchaseAvailability\";\n const current = await readOptionalRelationship(() =>\n api.read(`${itemPath(item, product.id)}/${relationship}`),\n );\n const territories = current\n ? await api.list(`/v1/${type}/${current.id}/availableTerritories`)\n : [];\n const projection = {\n availableInNewTerritories: current?.attributes.availableInNewTerritories,\n territories: territories.map((v) => v.id).sort(),\n };\n const desired = {\n availableInNewTerritories: config.availableInNewTerritories,\n territories: [...config.territories].sort(),\n };\n if (canonical(projection) === canonical(desired)) return;\n builder.add(\n `${itemKey(item)}.availability`,\n \"create\",\n projection,\n desired,\n [\"territories\", \"availableInNewTerritories\"],\n async () => {\n const created = await api.create(\n `/v1/${type}`,\n type,\n { availableInNewTerritories: config.availableInNewTerritories },\n {\n [subscription ? \"subscription\" : \"inAppPurchase\"]: relation(product.type, product.id),\n availableTerritories: {\n data: config.territories.map((id) => ({ type: \"territories\", id })),\n },\n },\n );\n const read = await api.read(`/v1/${type}/${created.id}`);\n const regions = await api.list(`/v1/${type}/${created.id}/availableTerritories`);\n if (\n read.attributes.availableInNewTerritories !== config.availableInNewTerritories ||\n canonical(regions.map((v) => v.id).sort()) !== canonical(desired.territories)\n )\n throw new DeliveryError(\"availability_readback_failed\", 5);\n return read;\n },\n );\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { readCatalog } from \"./catalog.js\";\n\n/** 优惠配置是商业输入;新优惠不会自动替换已售出或已领取的优惠。 */\nexport async function planOffers(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const catalog = builder.loaded.manifest.catalog;\n if (!catalog) return;\n const products = await readCatalog(builder, api);\n const territories = catalog.items.some(\n (item) => item.kind === \"subscription\" && item.offers.length,\n )\n ? await api.list(\"/v1/territories\")\n : [];\n for (const item of catalog.items) {\n if (item.kind !== \"subscription\") continue;\n const parent = products.get(item.productId);\n if (!parent) continue;\n for (const offer of item.offers) {\n const type =\n offer.kind === \"introductory\"\n ? \"subscriptionIntroductoryOffers\"\n : offer.kind === \"promotional\"\n ? \"subscriptionPromotionalOffers\"\n : \"subscriptionOfferCodes\";\n const collection =\n offer.kind === \"introductory\"\n ? \"introductoryOffers\"\n : offer.kind === \"promotional\"\n ? \"promotionalOffers\"\n : \"offerCodes\";\n const existing = await api.list(\n `/v1/subscriptions/${parent.id}/${collection}`,\n offer.kind === \"introductory\" ? { include: \"territory,subscriptionPricePoint\" } : {},\n );\n const key = `offer.${item.productId}.${offer.key}`;\n const common = {\n duration: offer.duration,\n numberOfPeriods: offer.numberOfPeriods,\n offerMode: offer.offerMode,\n };\n for (const price of offer.prices) {\n if (offer.offerMode !== \"FREE_TRIAL\" && !price.pricePointId)\n throw new DeliveryError(\"offer_price_point_required\", 2, offer.key);\n if (!territories.some((value) => value.id === price.territory))\n throw new DeliveryError(\"territory_unavailable\", 2, price.territory);\n if (\n price.pricePointId &&\n !(\n await api.list(`/v1/subscriptions/${parent.id}/pricePoints`, {\n \"filter[territory]\": price.territory,\n })\n ).some((v) => v.id === price.pricePointId)\n )\n throw new DeliveryError(\"offer_price_point_ownership_mismatch\", 4, offer.key);\n }\n if (offer.kind === \"introductory\") {\n for (const price of offer.prices) {\n const current = selectOne(\n existing.filter((v) => {\n const region = v.relationships?.territory?.data;\n return (\n region &&\n !Array.isArray(region) &&\n region.id === price.territory &&\n v.attributes.startDate === offer.startDate\n );\n }),\n \"ambiguous_introductory_offer\",\n );\n const attributes = {\n ...common,\n startDate: offer.startDate,\n endDate: offer.endDate ?? null,\n };\n const expectedPoint = current?.relationships?.subscriptionPricePoint?.data;\n if (current) {\n if (\n Object.entries(attributes).some(\n ([k, v]) => canonical(current.attributes[k]) !== canonical(v),\n ) ||\n (price.pricePointId &&\n (!expectedPoint ||\n Array.isArray(expectedPoint) ||\n expectedPoint.id !== price.pricePointId))\n )\n throw new DeliveryError(\"existing_offer_is_immutable\", 4, offer.key);\n continue;\n }\n builder.add(\n `${key}.${price.territory}`,\n \"create\",\n null,\n { attributes, price },\n [\"offer\"],\n async () => {\n const result = await api.create(`/v1/${type}`, type, attributes, {\n subscription: relation(\"subscriptions\", parent.id),\n territory: relation(\"territories\", price.territory),\n ...(price.pricePointId\n ? {\n subscriptionPricePoint: relation(\n \"subscriptionPricePoints\",\n price.pricePointId,\n ),\n }\n : {}),\n });\n const read = (\n await api.list(`/v1/subscriptions/${parent.id}/introductoryOffers`, {\n include: \"territory,subscriptionPricePoint\",\n })\n ).find((v) => v.id === result.id);\n if (!read) throw new DeliveryError(\"introductory_offer_readback_failed\", 5);\n verifyAttributes(read, attributes);\n verifyPrices([read], [price], offer.offerMode === \"FREE_TRIAL\");\n return read;\n },\n );\n }\n } else {\n const current = selectOne(\n existing.filter((v) =>\n offer.kind === \"promotional\"\n ? v.attributes.offerCode === offer.offerCode\n : v.attributes.name === offer.name,\n ),\n \"ambiguous_subscription_offer\",\n );\n const attributes = {\n ...common,\n name: offer.name,\n ...(offer.kind === \"promotional\"\n ? { offerCode: offer.offerCode }\n : {\n customerEligibilities: offer.customerEligibilities,\n offerEligibility: offer.offerEligibility,\n autoRenewEnabled: offer.autoRenewEnabled,\n }),\n };\n const priceType =\n offer.kind === \"promotional\"\n ? \"subscriptionPromotionalOfferPrices\"\n : \"subscriptionOfferCodePrices\";\n if (current) {\n verifyAttributes(current, attributes);\n const prices = await api.list(`/v1/${type}/${current.id}/prices`, {\n include: \"territory,subscriptionPricePoint\",\n });\n verifyPrices(prices, offer.prices, offer.offerMode === \"FREE_TRIAL\");\n continue;\n }\n builder.add(key, \"create\", null, offer, [\"offer\", \"prices\"], async () => {\n const included = offer.prices.map((price, i) => ({\n type: priceType,\n id: \"${price-\" + i + \"}\",\n relationships: {\n territory: relation(\"territories\", price.territory),\n ...(price.pricePointId\n ? {\n subscriptionPricePoint: relation(\"subscriptionPricePoints\", price.pricePointId),\n }\n : {}),\n },\n }));\n const result = await api.create(\n `/v1/${type}`,\n type,\n attributes,\n {\n subscription: relation(\"subscriptions\", parent.id),\n prices: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const read = await api.read(`/v1/${type}/${result.id}`);\n verifyAttributes(read, attributes);\n verifyPrices(\n await api.list(`/v1/${type}/${result.id}/prices`, {\n include: \"territory,subscriptionPricePoint\",\n }),\n offer.prices,\n offer.offerMode === \"FREE_TRIAL\",\n );\n return read;\n });\n }\n }\n }\n if (catalog.gracePeriod) {\n const current = await api.read(`/v1/apps/${builder.require(\"app\").id}/subscriptionGracePeriod`);\n builder.ensure(\n \"subscription.gracePeriod\",\n current,\n catalog.gracePeriod,\n async () => {\n throw new DeliveryError(\"subscription_grace_period_missing\", 4);\n },\n async (value, fields) => {\n await api.update(`/v1/subscriptionGracePeriods/${value.id}`, value, fields);\n return api.read(`/v1/subscriptionGracePeriods/${value.id}`);\n },\n );\n }\n}\nfunction verifyAttributes(resource: AppleResource, desired: Record<string, unknown>): void {\n if (\n Object.entries(desired).some(\n ([key, value]) => canonical(resource.attributes[key]) !== canonical(value),\n )\n )\n throw new DeliveryError(\"offer_attributes_mismatch\", 4);\n}\n\nfunction verifyPrices(\n resources: AppleResource[],\n desired: { territory: string; pricePointId?: string }[],\n free: boolean,\n): void {\n const project = resources.map((value) => {\n const territory = value.relationships?.territory?.data,\n point = value.relationships?.subscriptionPricePoint?.data;\n if (!territory || Array.isArray(territory) || (point && Array.isArray(point)))\n throw new DeliveryError(\"offer_price_relationship_missing\", 5);\n return { territory: territory.id, ...(!free ? { pricePointId: point?.id } : {}) };\n });\n const expected = desired.map((value) => ({\n territory: value.territory,\n ...(!free ? { pricePointId: value.pricePointId } : {}),\n }));\n const sort = (values: typeof expected) =>\n values.sort((a, b) => a.territory.localeCompare(b.territory));\n if (canonical(sort(project)) !== canonical(sort(expected)))\n throw new DeliveryError(\"offer_prices_mismatch\", 4);\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { readOptionalRelationship, relation, selectOne } from \"../api.js\";\nimport { canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\n\nfunction linked(value: AppleResource, key: string): string | undefined {\n const ref = value.relationships?.[key]?.data;\n return ref && !Array.isArray(ref) ? ref.id : undefined;\n}\nexport async function planAppCommerce(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const app = builder.require(\"app\"),\n { availability, appPricing } = builder.loaded.manifest;\n if (availability) {\n const current = await readOptionalRelationship(() =>\n api.read(`/v1/apps/${app.id}/appAvailabilityV2`),\n );\n const territories = current\n ? await api.list(`/v2/appAvailabilities/${current.id}/territoryAvailabilities`, {\n include: \"territory\",\n })\n : [];\n const before = {\n availableInNewTerritories: current?.attributes.availableInNewTerritories,\n territories: territories\n .filter((v) => v.attributes.available === true)\n .map((v) => linked(v, \"territory\"))\n .sort(),\n };\n const desired = { ...availability, territories: [...availability.territories].sort() };\n if (canonical(before) !== canonical(desired))\n builder.add(\n \"app.availability\",\n \"create\",\n before,\n desired,\n [\"territories\", \"availableInNewTerritories\"],\n async () => {\n const included = availability.territories.map((id, i) => ({\n type: \"territoryAvailabilities\",\n id: \"${territory-\" + i + \"}\",\n attributes: { available: true },\n relationships: { territory: relation(\"territories\", id) },\n }));\n const created = await api.create(\n \"/v2/appAvailabilities\",\n \"appAvailabilities\",\n { availableInNewTerritories: availability.availableInNewTerritories },\n {\n app: relation(\"apps\", app.id),\n territoryAvailabilities: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const value = await api.read(`/v2/appAvailabilities/${created.id}`);\n const regions = await api.list(\n `/v2/appAvailabilities/${created.id}/territoryAvailabilities`,\n { include: \"territory\" },\n );\n if (\n value.attributes.availableInNewTerritories !== desired.availableInNewTerritories ||\n canonical(\n regions\n .filter((v) => v.attributes.available === true)\n .map((v) => linked(v, \"territory\"))\n .sort(),\n ) !== canonical(desired.territories)\n )\n throw new DeliveryError(\"app_availability_readback_failed\", 5);\n return value;\n },\n );\n }\n if (appPricing) {\n const desired: {\n id: string;\n startDate: string | null;\n endDate: string | null;\n territory: string;\n }[] = [];\n const territories = await api.list(\"/v1/territories\");\n for (const price of appPricing.prices) {\n const territory = territories.find((value) => value.id === price.territory);\n if (!territory) throw new DeliveryError(\"territory_unavailable\", 2, price.territory);\n if (territory.attributes.currency !== price.currency)\n throw new DeliveryError(\"territory_currency_mismatch\", 2);\n const points = await api.list(`/v1/apps/${app.id}/appPricePoints`, {\n \"filter[territory]\": price.territory,\n limit: \"200\",\n });\n const normalize = (v: unknown) =>\n typeof v === \"string\" ? v.replace(/\\.0+$/, \"\").replace(/(\\.\\d*?)0+$/, \"$1\") : undefined;\n const point = selectOne(\n points.filter(\n (v) =>\n normalize(v.attributes.customerPrice) === normalize(price.customerPrice) &&\n (!price.pricePointId || v.id === price.pricePointId),\n ),\n \"ambiguous_app_price_point\",\n );\n if (!point) throw new DeliveryError(\"app_price_point_unavailable\", 2, price.territory);\n desired.push({\n id: point.id,\n startDate: price.startDate ?? null,\n endDate: price.endDate ?? null,\n territory: price.territory,\n });\n }\n const schedule = await readOptionalRelationship(() =>\n api.read(`/v1/apps/${app.id}/appPriceSchedule`),\n );\n const currentId = schedule?.id;\n const base = currentId\n ? await api.read(`/v1/appPriceSchedules/${currentId}/baseTerritory`)\n : undefined;\n const current = currentId\n ? ((await readOptionalRelationship(() =>\n api.list(`/v1/appPriceSchedules/${currentId}/manualPrices`, {\n include: \"appPricePoint,territory\",\n }),\n )) ?? [])\n : [];\n const before = {\n baseTerritory: base?.id,\n prices: current\n .map((v) => ({\n id: linked(v, \"appPricePoint\"),\n startDate: v.attributes.startDate ?? null,\n endDate: v.attributes.endDate ?? null,\n territory: linked(v, \"territory\"),\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b))),\n };\n const target = {\n baseTerritory: appPricing.baseTerritory,\n prices: desired.sort((a, b) => canonical(a).localeCompare(canonical(b))),\n };\n if (canonical(before) === canonical(target)) return;\n builder.add(\n \"app.priceSchedule\",\n \"create\",\n before,\n target,\n [\"baseTerritory\", \"prices\"],\n async () => {\n const included = desired.map((v, i) => ({\n type: \"appPrices\",\n id: \"${price-\" + i + \"}\",\n attributes: { startDate: v.startDate, endDate: v.endDate },\n relationships: { appPricePoint: relation(\"appPricePoints\", v.id) },\n }));\n const result = await api.create(\n \"/v1/appPriceSchedules\",\n \"appPriceSchedules\",\n {},\n {\n app: relation(\"apps\", app.id),\n baseTerritory: relation(\"territories\", appPricing.baseTerritory),\n manualPrices: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const base = await api.read(`/v1/appPriceSchedules/${result.id}/baseTerritory`);\n const read = await api.list(`/v1/appPriceSchedules/${result.id}/manualPrices`, {\n include: \"appPricePoint,territory\",\n });\n const values = read\n .map((v) => ({\n id: linked(v, \"appPricePoint\"),\n startDate: v.attributes.startDate ?? null,\n endDate: v.attributes.endDate ?? null,\n territory: linked(v, \"territory\"),\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n if (base.id !== appPricing.baseTerritory || canonical(values) !== canonical(target.prices))\n throw new DeliveryError(\"app_price_readback_failed\", 5);\n return result;\n },\n );\n }\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { appVersion } from \"./metadata.js\";\nimport { readCatalog } from \"./catalog.js\";\n\nexport async function selectedBuild(\n builder: PlanBuilder,\n api: AppleGateway,\n allowProcessing = false,\n): Promise<AppleResource | undefined> {\n const app = builder.require(\"app\"),\n release = builder.loaded.manifest.release;\n if (!release) throw new DeliveryError(\"release_configuration_required\", 2);\n const candidates = await api.list(\"/v1/builds\", {\n \"filter[app]\": app.id,\n \"filter[version]\": release.buildNumber,\n include: \"preReleaseVersion\",\n });\n const exact: AppleResource[] = [];\n for (const candidate of candidates) {\n if (release.buildId && release.buildId !== candidate.id) continue;\n const ref = candidate.relationships?.preReleaseVersion?.data;\n if (!ref || Array.isArray(ref)) throw new DeliveryError(\"build_prerelease_version_missing\", 5);\n const pre = await api.read(`/v1/preReleaseVersions/${ref.id}`);\n if (\n candidate.attributes.version === release.buildNumber &&\n pre.attributes.version === release.version &&\n pre.attributes.platform === \"IOS\"\n )\n exact.push(candidate);\n }\n const build = selectOne(exact, \"ambiguous_build\");\n if (!build) {\n if (!allowProcessing)\n builder.manual(\n \"processed_build_required\",\n \"Upload and process the configured version and build number.\",\n [\"review.prepare\", \"review.submit\", \"testflight.distribute\"],\n );\n return;\n }\n if (\n allowProcessing &&\n build.attributes.processingState === \"PROCESSING\" &&\n build.attributes.expired !== true\n )\n return build;\n if (build.attributes.processingState !== \"VALID\" || build.attributes.expired === true)\n throw new DeliveryError(\"build_not_available\", 4);\n builder.observe(\"build\", build);\n return build;\n}\n\nexport async function planReview(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const app = builder.require(\"app\"),\n release = builder.loaded.manifest.release;\n if (!release) throw new DeliveryError(\"release_configuration_required\", 2);\n if (builder.intent.action === \"withdraw\") {\n if (!release.reviewSubmissionId) throw new DeliveryError(\"review_submission_id_required\", 2);\n const submission = await ownedSubmission(api, app.id, release.reviewSubmissionId);\n builder.observe(\"review\", submission);\n if (submission.attributes.state === \"CANCELING\" || submission.attributes.state === \"COMPLETE\")\n return;\n if (\n ![\"WAITING_FOR_REVIEW\", \"IN_REVIEW\", \"UNRESOLVED_ISSUES\"].includes(\n String(submission.attributes.state),\n )\n )\n throw new DeliveryError(\"review_cannot_withdraw\", 4);\n builder.add(\n \"review.withdraw\",\n \"withdraw\",\n submission.attributes,\n { canceled: true },\n [\"canceled\"],\n async () => {\n await api.update(`/v1/reviewSubmissions/${submission.id}`, submission, { canceled: true });\n const read = await api.read(`/v1/reviewSubmissions/${submission.id}`);\n if (![\"CANCELING\", \"COMPLETE\"].includes(String(read.attributes.state)))\n throw new DeliveryError(\"withdrawal_pending\", 5);\n return read;\n },\n );\n return;\n }\n const selection = release.reviewItems;\n if (\n !selection ||\n (!selection.includeApp && !selection.productIds.length && !selection.groupKeys.length)\n )\n throw new DeliveryError(\"review_item_selection_required\", 2);\n const version = selection.includeApp ? await appVersion(builder, api) : undefined;\n if (selection.includeApp && !version) return;\n const build = selection.includeApp ? await selectedBuild(builder, api) : undefined;\n if (selection.includeApp && !build) return;\n if (!builder.loaded.manifest.review)\n builder.manual(\n \"review_information_required\",\n \"Configure and verify the reviewer contact and demo account.\",\n [\"review.submit\"],\n );\n for (const code of [\"privacy\", \"encryption\", \"contentRights\", \"regionalCompliance\"]) {\n if (selection.includeApp && !builder.loaded.manifest.declarations.some((v) => v.code === code))\n builder.manual(\"release_declarations_required\", `Confirm the ${code} declaration.`, [\n \"review.submit\",\n ]);\n }\n for (const declaration of builder.loaded.manifest.declarations) {\n if (!declaration.confirmed || declaration.evidence === \"remote-readback\")\n builder.manual(\n \"declaration_verification_required\",\n `Verify declaration ${declaration.code} in its owning console.`,\n [\"review.submit\"],\n declaration.consoleUrl,\n );\n }\n if (version && build) {\n const full = await api.read(`/v1/appStoreVersions/${version.id}?include=build`);\n const selected = full.relationships?.build?.data;\n if (!selected || Array.isArray(selected) || selected.id !== build.id) {\n if (builder.intent.action === \"submit\")\n throw new DeliveryError(\"review_build_not_prepared\", 4);\n builder.add(\"review.build\", \"update\", selected, build.id, [\"build\"], async () => {\n await api.update(\n `/v1/appStoreVersions/${version.id}`,\n version,\n {},\n { build: relation(\"builds\", build.id) },\n );\n const read = await api.read(`/v1/appStoreVersions/${version.id}?include=build`);\n if (\n canonical(read.relationships?.build?.data) !== canonical({ type: \"builds\", id: build.id })\n )\n throw new DeliveryError(\"review_build_readback_failed\", 5);\n return read;\n });\n }\n }\n const submissions = await api.list(`/v1/apps/${app.id}/reviewSubmissions`);\n const submission = release.reviewSubmissionId\n ? selectOne(\n submissions.filter((v) => v.id === release.reviewSubmissionId),\n \"ambiguous_review_submission\",\n )\n : selectOne(\n submissions.filter(\n (v) => v.attributes.state === \"READY_FOR_REVIEW\" && v.attributes.platform === \"IOS\",\n ),\n \"ambiguous_review_draft\",\n );\n if (release.reviewSubmissionId && !submission)\n throw new DeliveryError(\"review_submission_ownership_mismatch\", 4);\n if (submission && submission.attributes.platform !== \"IOS\")\n throw new DeliveryError(\"review_platform_mismatch\", 4);\n const alreadySubmitted =\n submission &&\n [\"WAITING_FOR_REVIEW\", \"IN_REVIEW\"].includes(String(submission.attributes.state)) &&\n builder.intent.action === \"submit\";\n if (submission && submission.attributes.state !== \"READY_FOR_REVIEW\" && !alreadySubmitted)\n throw new DeliveryError(\"review_submission_not_editable\", 4);\n if (!submission && builder.intent.action === \"submit\")\n throw new DeliveryError(\"review_draft_required\", 4);\n builder.ensure(\n \"review\",\n submission,\n { platform: \"IOS\" },\n async () => {\n const created = await api.create(\n \"/v1/reviewSubmissions\",\n \"reviewSubmissions\",\n { platform: \"IOS\" },\n { app: relation(\"apps\", app.id) },\n );\n return api.read(`/v1/reviewSubmissions/${created.id}`);\n },\n async () => {\n throw new DeliveryError(\"review_platform_immutable\", 4);\n },\n );\n const existingItems = submission\n ? await api.list(`/v1/reviewSubmissions/${submission.id}/items`, {\n include:\n \"appStoreVersion,subscriptionVersion,inAppPurchaseVersion,subscriptionGroupVersion\",\n })\n : [];\n const submittedVersion = (value: AppleResource, relationship: string): boolean =>\n existingItems.some((item) => {\n const ref = item.relationships?.[relationship]?.data;\n return ref && !Array.isArray(ref) && ref.id === value.id;\n });\n const desiredItems: { relationship: string; type: string; id: string }[] = version\n ? [{ relationship: \"appStoreVersion\", type: \"appStoreVersions\", id: version.id }]\n : [];\n const products = selection.productIds.length\n ? await readCatalog(builder, api)\n : new Map<string, AppleResource>();\n const approvedTypes = new Set<string>();\n const allPurchases = selection.productIds.length\n ? await api.list(`/v1/apps/${app.id}/inAppPurchasesV2`)\n : [];\n for (const purchase of allPurchases)\n if (purchase.attributes.state === \"APPROVED\")\n approvedTypes.add(String(purchase.attributes.inAppPurchaseType));\n for (const group of selection.productIds.length\n ? await api.list(`/v1/apps/${app.id}/subscriptionGroups`)\n : []) {\n if (\n (await api.list(`/v1/subscriptionGroups/${group.id}/subscriptions`)).some(\n (v) => v.attributes.state === \"APPROVED\",\n )\n )\n approvedTypes.add(\"subscription\");\n }\n for (const item of builder.loaded.manifest.catalog?.items ?? []) {\n if (!selection.productIds.includes(item.productId)) continue;\n const product = products.get(item.productId);\n if (!product) continue;\n if (\n !alreadySubmitted &&\n (!approvedTypes.has(item.kind) || release.firstPurchaseTypes.includes(item.kind))\n ) {\n builder.manual(\n \"first_purchase_requires_console\",\n \"Submit the first purchase of this type with the app version in App Store Connect.\",\n [\"review.submit\"],\n );\n }\n const type = item.kind === \"subscription\" ? \"subscriptionVersions\" : \"inAppPurchaseVersions\";\n const versions = await api.list(\n `${item.kind === \"subscription\" ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\"}/${product.id}/versions`,\n );\n const draft = selectOne(\n versions.filter((v) =>\n alreadySubmitted\n ? submittedVersion(\n v,\n item.kind === \"subscription\" ? \"subscriptionVersion\" : \"inAppPurchaseVersion\",\n )\n : [\"PREPARE_FOR_SUBMISSION\", \"READY_FOR_REVIEW\"].includes(String(v.attributes.state)),\n ),\n \"ambiguous_product_draft\",\n );\n if (!draft) throw new DeliveryError(\"review_product_version_required\", 4, item.productId);\n desiredItems.push({\n relationship: item.kind === \"subscription\" ? \"subscriptionVersion\" : \"inAppPurchaseVersion\",\n type,\n id: draft.id,\n });\n }\n for (const productId of selection.productIds)\n if (!builder.loaded.manifest.catalog?.items.some((v) => v.productId === productId))\n throw new DeliveryError(\"review_product_not_configured\", 2, productId);\n const allGroups = selection.groupKeys.length\n ? await api.list(`/v1/apps/${app.id}/subscriptionGroups`)\n : [];\n for (const key of selection.groupKeys) {\n const group = builder.loaded.manifest.catalog?.groups.find((v) => v.key === key);\n const remoteId = group?.remoteId ?? builder.bindings[`group.${key}`]?.id;\n if (!group || !allGroups.some((v) => v.id === remoteId))\n throw new DeliveryError(\"review_group_binding_required\", 4, key);\n const versions = await api.list(`/v1/subscriptionGroups/${remoteId}/versions`);\n const draft = selectOne(\n versions.filter((v) =>\n alreadySubmitted\n ? submittedVersion(v, \"subscriptionGroupVersion\")\n : [\"PREPARE_FOR_SUBMISSION\", \"READY_FOR_REVIEW\"].includes(String(v.attributes.state)),\n ),\n \"ambiguous_group_draft\",\n );\n if (!draft) throw new DeliveryError(\"review_group_draft_required\", 4, key);\n desiredItems.push({\n relationship: \"subscriptionGroupVersion\",\n type: \"subscriptionGroupVersions\",\n id: draft.id,\n });\n }\n if (!desiredItems.length) throw new DeliveryError(\"review_item_selection_empty\", 4);\n for (const desired of desiredItems) {\n const found = existingItems.some((v) => {\n const ref = v.relationships?.[desired.relationship]?.data;\n return ref && !Array.isArray(ref) && ref.id === desired.id;\n });\n if (found) continue;\n if (builder.intent.action === \"submit\") throw new DeliveryError(\"review_items_not_prepared\", 4);\n builder.add(\n `review.item.${desired.type}.${desired.id}`,\n \"create\",\n null,\n desired,\n [desired.relationship],\n async () => {\n const created = await api.create(\n \"/v1/reviewSubmissionItems\",\n \"reviewSubmissionItems\",\n {},\n {\n reviewSubmission: relation(\"reviewSubmissions\", builder.require(\"review\").id),\n [desired.relationship]: relation(desired.type, desired.id),\n },\n );\n return api.read(`/v1/reviewSubmissionItems/${created.id}`);\n },\n [\"review\"],\n );\n }\n if (builder.intent.action === \"submit\") {\n if (!release.reviewSubmissionId) throw new DeliveryError(\"review_submission_id_required\", 2);\n if (existingItems.length !== desiredItems.length)\n throw new DeliveryError(\"review_contains_unmanaged_items\", 4);\n if (alreadySubmitted) {\n builder.observe(\"review\", submission);\n return;\n }\n builder.add(\n \"review.submit\",\n \"submit\",\n submission?.attributes,\n desiredItems,\n [\"submitted\"],\n async () => {\n const target = builder.require(\"review\");\n await api.update(`/v1/reviewSubmissions/${target.id}`, target, { submitted: true });\n const read = await api.read(`/v1/reviewSubmissions/${target.id}`);\n if (\n ![\"WAITING_FOR_REVIEW\", \"IN_REVIEW\", \"COMPLETE\"].includes(String(read.attributes.state))\n )\n throw new DeliveryError(\"review_submission_pending\", 5);\n return read;\n },\n );\n }\n}\n\nasync function ownedSubmission(\n api: AppleGateway,\n appId: string,\n id: string,\n): Promise<AppleResource> {\n const found = (await api.list(`/v1/apps/${appId}/reviewSubmissions`)).find((v) => v.id === id);\n if (!found) throw new DeliveryError(\"review_submission_ownership_mismatch\", 4);\n return found;\n}\n","import type { AppleGateway } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, systemClock } from \"../api.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { appVersion, assertEditable } from \"./metadata.js\";\n\n/** 配置发布方式和实际发布使用不同意图,避免资料同步触发上线。 */\nexport async function planRelease(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const version = await appVersion(builder, api);\n if (!version) return;\n const config = builder.loaded.manifest.release!;\n const action = builder.intent.action;\n if (action === \"configure\") {\n const desired = {\n releaseType: config.mode,\n ...(config.mode === \"SCHEDULED\" ? { earliestReleaseDate: config.earliestReleaseDate } : {}),\n };\n builder.ensure(\n \"release.policy\",\n version,\n desired,\n async () => {\n throw new DeliveryError(\"app_version_required\", 4);\n },\n async (value, fields) => {\n assertEditable(value);\n await api.update(`/v1/appStoreVersions/${value.id}`, value, fields);\n return api.read(`/v1/appStoreVersions/${value.id}`);\n },\n );\n if (config.phasedRelease !== undefined) {\n const full = await api.read(\n `/v1/appStoreVersions/${version.id}?include=appStoreVersionPhasedRelease`,\n );\n const ref = full.relationships?.appStoreVersionPhasedRelease?.data;\n const current =\n ref && !Array.isArray(ref)\n ? await api.read(`/v1/appStoreVersionPhasedReleases/${ref.id}`)\n : undefined;\n if (!config.phasedRelease && current)\n throw new DeliveryError(\"phased_release_removal_requires_console\", 4);\n if (config.phasedRelease && !current)\n builder.add(\n \"release.phased\",\n \"create\",\n null,\n { phasedReleaseState: \"INACTIVE\" },\n [\"phasedReleaseState\"],\n async () => {\n assertEditable(version);\n const created = await api.create(\n \"/v1/appStoreVersionPhasedReleases\",\n \"appStoreVersionPhasedReleases\",\n { phasedReleaseState: \"INACTIVE\" },\n { appStoreVersion: relation(\"appStoreVersions\", version.id) },\n );\n const read = await api.read(`/v1/appStoreVersionPhasedReleases/${created.id}`);\n if (read.attributes.phasedReleaseState !== \"INACTIVE\")\n throw new DeliveryError(\"phased_release_readback_failed\", 5);\n return read;\n },\n );\n }\n return;\n }\n if (action === \"publish\") {\n if (version.attributes.appStoreState === \"READY_FOR_SALE\") return;\n if (version.attributes.appStoreState !== \"PENDING_DEVELOPER_RELEASE\")\n throw new DeliveryError(\"version_not_ready_for_release\", 4);\n builder.add(\n \"release.publish\",\n \"release\",\n version.attributes,\n { versionId: version.id },\n [\"release\"],\n async () => {\n await api.create(\n \"/v1/appStoreVersionReleaseRequests\",\n \"appStoreVersionReleaseRequests\",\n {},\n { appStoreVersion: relation(\"appStoreVersions\", version.id) },\n );\n for (let attempt = 0; attempt < 30; attempt++) {\n const read = await api.read(`/v1/appStoreVersions/${version.id}`);\n if (read.attributes.appStoreState === \"READY_FOR_SALE\") return read;\n await systemClock.sleep(2000);\n }\n throw new DeliveryError(\"release_processing_pending\", 5);\n },\n );\n return;\n }\n const phased = await api.read(`/v1/appStoreVersions/${version.id}/appStoreVersionPhasedRelease`);\n if (config.phasedReleaseId && phased.id !== config.phasedReleaseId)\n throw new DeliveryError(\"phased_release_identity_mismatch\", 4);\n const state = action === \"pause\" ? \"PAUSED\" : action === \"resume\" ? \"ACTIVE\" : \"COMPLETE\";\n if (phased.attributes.phasedReleaseState === state) return;\n const allowed =\n action === \"pause\" ? [\"ACTIVE\"] : action === \"resume\" ? [\"PAUSED\"] : [\"ACTIVE\", \"PAUSED\"];\n if (!allowed.includes(String(phased.attributes.phasedReleaseState)))\n throw new DeliveryError(\"phased_release_transition_invalid\", 4);\n builder.add(\n `release.${action}`,\n action === \"pause\" ? \"pause\" : action === \"resume\" ? \"resume\" : \"complete\",\n phased.attributes,\n { phasedReleaseState: state },\n [\"phasedReleaseState\"],\n async () => {\n await api.update(`/v1/appStoreVersionPhasedReleases/${phased.id}`, phased, {\n phasedReleaseState: state,\n });\n const read = await api.read(`/v1/appStoreVersionPhasedReleases/${phased.id}`);\n if (read.attributes.phasedReleaseState !== state)\n throw new DeliveryError(\"phased_release_readback_failed\", 5);\n return read;\n },\n );\n}\n","import path from \"node:path\";\nimport { z } from \"zod\";\nimport type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { digest, parseSchema, readJsonFile } from \"../manifest.js\";\nimport { requirePrivateFile } from \"../credentials.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { selectedBuild } from \"./review.js\";\n\nexport async function planTestFlight(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const config = builder.loaded.manifest.testflight;\n if (!config) throw new DeliveryError(\"testflight_configuration_required\", 2);\n const app = builder.require(\"app\");\n const groups = await api.list(`/v1/apps/${app.id}/betaGroups`);\n const targets = config.groupIds.map((id) => {\n const value = groups.find((v) => v.id === id);\n if (!value || value.attributes.isInternalGroup === config.external)\n throw new DeliveryError(\"beta_group_ownership_or_type_mismatch\", 4, id);\n return value;\n });\n if (builder.intent.action === \"invite\") {\n if (!config.invitationsRef || !targets.length)\n throw new DeliveryError(\"explicit_testers_and_groups_required\", 2);\n const filename = path.resolve(builder.loaded.directory, config.invitationsRef);\n await requirePrivateFile(filename);\n const testers = parseSchema(\n z\n .array(\n z.strictObject({\n email: z.email(),\n firstName: z.string().min(1),\n lastName: z.string().min(1),\n }),\n )\n .min(1),\n await readJsonFile(filename),\n );\n for (const tester of testers) {\n const current = selectOne(\n await api.list(\"/v1/betaTesters\", { \"filter[email]\": tester.email }),\n \"ambiguous_beta_tester\",\n );\n const currentGroups = current\n ? await api.list(`/v1/betaTesters/${current.id}/betaGroups`)\n : [];\n const missing = targets.filter((v) => !currentGroups.some((g) => g.id === v.id));\n if (!missing.length) continue;\n const key = `testflight.tester.${digest(tester.email.toLowerCase()).slice(0, 24)}`;\n builder.add(\n key,\n \"invite\",\n { id: current?.id, groups: currentGroups.map((v) => v.id) },\n { tester, groups: missing.map((v) => v.id) },\n [\"tester\", \"groups\"],\n async () => {\n const value =\n current ??\n (await api.create(\"/v1/betaTesters\", \"betaTesters\", tester, {\n betaGroups: { data: missing.map((v) => ({ type: \"betaGroups\", id: v.id })) },\n }));\n await builder.record(key, value);\n if (current)\n await api.relationship(\n `/v1/betaTesters/${current.id}/relationships/betaGroups`,\n missing.map((v) => ({ type: \"betaGroups\", id: v.id })),\n );\n const read = await api.list(`/v1/betaTesters/${value.id}/betaGroups`);\n if (!targets.every((v) => read.some((g) => g.id === v.id)))\n throw new DeliveryError(\"beta_invitation_readback_failed\", 5);\n return value;\n },\n );\n }\n return;\n }\n const build = await selectedBuild(builder, api);\n if (!build) return;\n const details = await api.read(`/v1/builds/${build.id}/buildBetaDetail`);\n builder.observe(\"testflight.buildDetail\", details);\n if (builder.intent.action === \"prepare\") {\n builder.ensure(\n \"testflight.notifications\",\n details,\n { autoNotifyEnabled: config.notifyTesters },\n async () => {\n throw new DeliveryError(\"beta_detail_missing\", 4);\n },\n async (value, fields) => {\n await api.update(`/v1/buildBetaDetails/${value.id}`, value, fields);\n return api.read(`/v1/buildBetaDetails/${value.id}`);\n },\n );\n if (!config.locale) throw new DeliveryError(\"testflight_locale_required\", 2);\n const appLocales = await api.list(`/v1/apps/${app.id}/betaAppLocalizations`);\n const buildLocales = await api.list(`/v1/builds/${build.id}/betaBuildLocalizations`);\n for (const [type, rows, attributes, parent, relationship] of [\n [\n \"betaAppLocalizations\",\n appLocales,\n {\n locale: config.locale,\n ...(config.betaDescription !== undefined ? { description: config.betaDescription } : {}),\n ...(config.feedbackEmail ? { feedbackEmail: config.feedbackEmail } : {}),\n },\n app,\n \"app\",\n ],\n [\n \"betaBuildLocalizations\",\n buildLocales,\n {\n locale: config.locale,\n ...(config.whatsNew !== undefined ? { whatsNew: config.whatsNew } : {}),\n },\n build,\n \"build\",\n ],\n ] as const) {\n if (Object.keys(attributes).length === 1) continue;\n const current = selectOne(\n rows.filter((v) => v.attributes.locale === config.locale),\n \"ambiguous_beta_localization\",\n );\n builder.ensure(\n `testflight.${type}.${config.locale}`,\n current,\n attributes,\n async () => {\n const created = await api.create(`/v1/${type}`, type, attributes, {\n [relationship]: relation(parent.type, parent.id),\n });\n return api.read(`/v1/${type}/${created.id}`);\n },\n async (value, fields) => {\n await api.update(`/v1/${type}/${value.id}`, value, fields);\n return api.read(`/v1/${type}/${value.id}`);\n },\n );\n }\n return;\n }\n if (details.attributes.autoNotifyEnabled !== config.notifyTesters)\n throw new DeliveryError(\"beta_notification_policy_not_prepared\", 4);\n if (builder.intent.action === \"review\") {\n if (!config.external) throw new DeliveryError(\"external_testing_required\", 2);\n if (\n [\"WAITING_FOR_BETA_REVIEW\", \"IN_BETA_REVIEW\", \"BETA_APPROVED\", \"IN_BETA_TESTING\"].includes(\n String(details.attributes.externalBuildState),\n )\n )\n return;\n if (details.attributes.externalBuildState !== \"READY_FOR_BETA_SUBMISSION\")\n throw new DeliveryError(\"build_not_ready_for_beta_review\", 4);\n builder.add(\n \"testflight.review\",\n \"submit\",\n details.attributes,\n { buildId: build.id },\n [\"betaReview\"],\n async () => {\n const created = await api.create(\n \"/v1/betaAppReviewSubmissions\",\n \"betaAppReviewSubmissions\",\n {},\n { build: relation(\"builds\", build.id) },\n );\n const read = await api.read(`/v1/betaAppReviewSubmissions/${created.id}`);\n if (\n ![\"WAITING_FOR_REVIEW\", \"IN_REVIEW\", \"APPROVED\"].includes(\n String(read.attributes.betaReviewState),\n )\n )\n throw new DeliveryError(\"beta_review_pending\", 5);\n return read;\n },\n );\n return;\n }\n if (!targets.length) throw new DeliveryError(\"beta_groups_required\", 2);\n if (\n config.external &&\n ![\"BETA_APPROVED\", \"IN_BETA_TESTING\", \"READY_FOR_BETA_TESTING\"].includes(\n String(details.attributes.externalBuildState),\n )\n )\n throw new DeliveryError(\"external_beta_approval_required\", 4);\n for (const group of targets) {\n const current = await api.list(`/v1/betaGroups/${group.id}/builds`);\n if (current.some((v) => v.id === build.id)) continue;\n if (\n group.attributes.publicLinkEnabled === true ||\n group.attributes.hasAccessToAllBuilds === true\n )\n throw new DeliveryError(\"beta_group_automatic_distribution_requires_console\", 4, group.id);\n builder.add(\n `testflight.group.${group.id}`,\n \"distribute\",\n current.map((v) => v.id),\n build.id,\n [\"build\"],\n async () => {\n await api.relationship(`/v1/betaGroups/${group.id}/relationships/builds`, [\n { type: \"builds\", id: build.id },\n ]);\n const read = await api.list(`/v1/betaGroups/${group.id}/builds`);\n if (!read.some((v) => v.id === build.id))\n throw new DeliveryError(\"beta_distribution_readback_failed\", 5);\n return group;\n },\n );\n }\n}\n","import { execa } from \"execa\";\nimport type { ProcessRunner } from \"./contracts.js\";\nimport { DeliveryError } from \"./contracts.js\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\n/** 子进程不能继承任意业务凭据或把工具日志输出到终端。 */\nexport function createProcessRunner(signal?: AbortSignal): ProcessRunner {\n return {\n async run(executable, args, options) {\n try {\n const result = await execa(executable, args, {\n cwd: options.cwd,\n env: options.env,\n extendEnv: false,\n timeout: options.timeoutMs,\n cancelSignal: options.signal ?? signal,\n stdin: \"ignore\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n maxBuffer: 4 * 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n } catch {\n const cancelled = (options.signal ?? signal)?.aborted;\n throw new DeliveryError(\n cancelled ? \"cancelled\" : \"delivery_process_failed\",\n cancelled ? 130 : 5,\n );\n }\n },\n };\n}\nexport function toolEnvironment(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const name of [\n \"PATH\",\n \"HOME\",\n \"TMPDIR\",\n \"LANG\",\n \"LC_ALL\",\n \"DEVELOPER_DIR\",\n \"SSL_CERT_FILE\",\n \"SSL_CERT_DIR\",\n ]) {\n const value = process.env[name];\n if (value !== undefined) env[name] = value;\n }\n return {\n ...env,\n CI: \"1\",\n FASTLANE_SKIP_UPDATE_CHECK: \"1\",\n FASTLANE_HIDE_CHANGELOG: \"1\",\n FASTLANE_OPT_OUT_USAGE: \"1\",\n FASTLANE_DISABLE_COLORS: \"1\",\n GIT_TERMINAL_PROMPT: \"0\",\n BUNDLE_FROZEN: \"true\",\n BUNDLE_PATH: path.join(os.homedir(), \".cache\", \"stackonward\", \"apple-gems\"),\n };\n}\n","import { mkdtemp, mkdir, readFile, rm, copyFile, realpath } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { z } from \"zod\";\nimport type { ProcessRunner } from \"./contracts.js\";\nimport { DeliveryError } from \"./contracts.js\";\nimport type { AppleCredentials } from \"./credentials.js\";\nimport { requirePrivateFile } from \"./credentials.js\";\nimport { parseSchema, readJsonFile, fileDigest, type LoadedManifest } from \"./manifest.js\";\nimport { writePrivateJson } from \"./state.js\";\nimport { toolEnvironment } from \"./process.js\";\n\nexport interface AppleBuildTools {\n preflight(): Promise<void>;\n run(\n action: \"native\" | \"signing\" | \"archive\" | \"upload\",\n parameters: Record<string, unknown>,\n ): Promise<Record<string, unknown>>;\n}\nconst resultSchema = z.record(z.string(), z.unknown());\nconst signingSecrets = z.strictObject({\n password: z.string().min(1),\n gitBasicAuthorization: z.string().min(1).optional(),\n});\n\n/** Ruby 只运行随发行包锁定的 lane;资料不包含可执行 Ruby 或 shell。 */\nexport function createAppleBuildTools(\n loaded: LoadedManifest,\n credentials: AppleCredentials,\n runner: ProcessRunner,\n resourceDirectory: string,\n signal?: AbortSignal,\n): AppleBuildTools {\n const env = toolEnvironment();\n const bundle = loaded.manifest.build?.bundleExecutable ?? \"bundle\";\n const gemfile = path.join(loaded.directory, \"Gemfile\");\n return {\n async preflight() {\n if (process.platform !== \"darwin\") throw new DeliveryError(\"macos_required\", 4);\n for (const filename of [\"Gemfile\", \"Gemfile.lock\"]) {\n if (\n fileDigest(await readFile(path.join(resourceDirectory, filename))) !==\n fileDigest(await readFile(path.join(loaded.directory, filename)))\n )\n throw new DeliveryError(\"apple_toolchain_lock_mismatch\", 4, filename);\n }\n await runner.run(bundle, [\"check\"], {\n cwd: loaded.directory,\n env: { ...env, BUNDLE_GEMFILE: gemfile },\n timeoutMs: 30_000,\n signal,\n });\n const xcode = await runner.run(\"xcodebuild\", [\"-version\"], {\n cwd: loaded.directory,\n env,\n timeoutMs: 30_000,\n signal,\n });\n if (\n loaded.manifest.build &&\n xcode.stdout.split(\"\\n\")[0] !== `Xcode ${loaded.manifest.build.xcodeVersion}`\n )\n throw new DeliveryError(\"xcode_version_mismatch\", 4);\n },\n async run(action, parameters) {\n const root = await mkdtemp(path.join(os.tmpdir(), \"stackonward-apple-\"));\n try {\n const apiKeyPath = path.join(root, \"api-key.json\"),\n invocationPath = path.join(root, \"invocation.json\"),\n resultPath = path.join(root, \"result.json\");\n await writePrivateJson(apiKeyPath, {\n key_id: credentials.account.keyId,\n issuer_id: credentials.account.issuerId,\n key: await readFile(credentials.account.privateKeyPath, \"utf8\"),\n in_house: false,\n });\n let secrets: z.infer<typeof signingSecrets> | undefined;\n if (action === \"archive\" || action === \"signing\") {\n if (!credentials.account.signingSecretsFile)\n throw new DeliveryError(\"signing_secrets_required\", 4);\n await requirePrivateFile(credentials.account.signingSecretsFile);\n secrets = parseSchema(\n signingSecrets,\n await readJsonFile(credentials.account.signingSecretsFile),\n );\n }\n await mkdir(path.join(root, \"fastlane\"));\n await copyFile(\n path.join(resourceDirectory, \"fastlane\", \"Fastfile\"),\n path.join(root, \"fastlane\", \"Fastfile\"),\n );\n await writePrivateJson(invocationPath, {\n action,\n ...parameters,\n apiKeyPath,\n resultPath,\n teamId: credentials.account.teamId,\n bundleId: loaded.manifest.app.bundleId,\n signing: loaded.manifest.signing,\n keychainName: `stackonward-${path.basename(root)}`,\n keychainPassword: randomBytes(32).toString(\"hex\"),\n });\n try {\n await runner.run(bundle, [\"exec\", \"fastlane\", \"ios\", \"delivery\"], {\n cwd: await realpath(root),\n env: {\n ...env,\n BUNDLE_GEMFILE: gemfile,\n STACKONWARD_APPLE_INVOCATION: invocationPath,\n ...(secrets\n ? {\n MATCH_PASSWORD: secrets.password,\n ...(secrets.gitBasicAuthorization\n ? { MATCH_GIT_BASIC_AUTHORIZATION: secrets.gitBasicAuthorization }\n : {}),\n }\n : {}),\n },\n timeoutMs: action === \"archive\" ? 3_600_000 : 1_800_000,\n signal,\n });\n } catch (error) {\n if (action === \"upload\" || (action === \"signing\" && parameters.readOnly === false))\n throw new DeliveryError(\"apple_write_outcome_unknown\", 7);\n throw error;\n }\n return parseSchema(resultSchema, await readJsonFile(resultPath));\n } finally {\n await rm(root, { recursive: true, force: true });\n }\n },\n };\n}\n","import path from \"node:path\";\nimport { readFile, realpath, lstat, mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { z } from \"zod\";\nimport { X509Certificate } from \"node:crypto\";\nimport type { AppleGateway, ProcessRunner } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport type { AppleCredentials } from \"../credentials.js\";\nimport { requirePrivateFile } from \"../credentials.js\";\nimport type { AppleBuildTools } from \"../fastlane.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { digest, fileDigest, readJsonFile, parseSchema } from \"../manifest.js\";\nimport { toolEnvironment } from \"../process.js\";\nimport { writePrivateJson, privateDirectory } from \"../state.js\";\nimport { selectedBuild } from \"./review.js\";\nimport { systemClock } from \"../api.js\";\n\nconst artifactSchema = z.strictObject({\n schemaVersion: z.literal(1),\n bundleId: z.string(),\n teamId: z.string(),\n version: z.string(),\n buildNumber: z.string(),\n ipaPath: z.string(),\n sha256: z.string(),\n dsymPath: z.string(),\n dsymSha256: z.string(),\n sourceDigest: z.string(),\n inputDigest: z.string(),\n capabilities: z.record(z.string(), z.boolean()),\n});\n\nasync function projectPaths(\n builder: PlanBuilder,\n): Promise<{ root: string; project: string; output: string; workspace?: string }> {\n const build = builder.loaded.manifest.build;\n if (!build) throw new DeliveryError(\"build_configuration_required\", 2);\n const root = await realpath(path.resolve(builder.loaded.directory, build.projectRoot));\n const project = await realpath(path.resolve(root, build.projectPath));\n const workspace = build.workspace\n ? await realpath(path.resolve(root, build.workspace))\n : undefined;\n if (![project, ...(workspace ? [workspace] : [])].every((v) => v.startsWith(root + path.sep)))\n throw new DeliveryError(\"project_path_outside_root\", 2);\n const output = path.resolve(root, build.outputPath);\n if (!output.startsWith(root + path.sep)) throw new DeliveryError(\"build_output_outside_root\", 2);\n let ancestor = output;\n while (ancestor !== root) {\n try {\n await lstat(ancestor);\n const actual = await realpath(ancestor);\n if (!actual.startsWith(root + path.sep))\n throw new DeliveryError(\"build_output_outside_root\", 2);\n break;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n ancestor = path.dirname(ancestor);\n }\n return { root, project, output, workspace };\n}\n\nexport async function planSigning(\n builder: PlanBuilder,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n): Promise<void> {\n const config = builder.loaded.manifest.signing;\n if (!config || !config.bundleIds.includes(builder.loaded.manifest.app.bundleId))\n throw new DeliveryError(\"signing_configuration_required\", 2);\n if (!credentials.account.signingSecretsFile)\n throw new DeliveryError(\"signing_secrets_required\", 4);\n await requirePrivateFile(credentials.account.signingSecretsFile);\n if (builder.intent.action === \"initialize\" && config.readonly)\n throw new DeliveryError(\"signing_initialization_requires_writable_config\", 2);\n await tools.preflight();\n builder.add(\n \"signing.profiles\",\n \"update\",\n null,\n {\n team: credentials.account.teamId,\n ...config,\n readOnly: builder.intent.action !== \"initialize\",\n },\n [\"profiles\", \"certificates\"],\n async () => {\n const result = await tools.run(\"signing\", {\n readOnly: builder.intent.action !== \"initialize\",\n });\n const profiles = parseSchema(z.record(z.string(), z.string()), result.profiles);\n if (!config.bundleIds.every((id) => profiles[id]))\n throw new DeliveryError(\"signing_profiles_missing\", 5);\n return { type: \"signingProfiles\", id: digest(profiles) };\n },\n );\n}\n\nexport async function planBuild(\n builder: PlanBuilder,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n runner: ProcessRunner,\n): Promise<void> {\n const release = builder.loaded.manifest.release,\n config = builder.loaded.manifest.build;\n if (!release || !config) throw new DeliveryError(\"build_and_release_configuration_required\", 2);\n if (builder.loaded.manifest.signing?.profileType !== \"appstore\")\n throw new DeliveryError(\"appstore_signing_required\", 2);\n if (!credentials.account.signingSecretsFile)\n throw new DeliveryError(\"signing_secrets_required\", 4);\n await requirePrivateFile(credentials.account.signingSecretsFile);\n await tools.preflight();\n const paths = await projectPaths(builder),\n env = toolEnvironment();\n const sourceFingerprint = async () => {\n const tracked = await runner.run(\n \"git\",\n [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\", \".\"],\n { cwd: paths.root, env, timeoutMs: 30_000 },\n );\n const inputs: [string, string][] = [];\n for (const name of [\n ...new Set([\n ...tracked.stdout.split(\"\\0\").filter(Boolean),\n ...(config.publicDefinesFile ? [config.publicDefinesFile] : []),\n ]),\n ].sort()) {\n const filename = await realpath(path.resolve(paths.root, name));\n if (!filename.startsWith(paths.root + path.sep))\n throw new DeliveryError(\"build_source_symlink_outside_root\", 2);\n if (filename.startsWith(paths.output + path.sep)) continue;\n inputs.push([name, fileDigest(await readFile(filename))]);\n }\n return digest(inputs);\n };\n const sourceDigest = await sourceFingerprint();\n builder.observe(\"build.inputs\", { type: \"localBuildInputs\", id: sourceDigest, attributes: {} });\n let previous: unknown;\n try {\n previous = JSON.parse(await readFile(path.join(paths.output, \"artifact.json\"), \"utf8\"));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\")\n throw new DeliveryError(\"archive_attestation_unreadable\", 2);\n }\n if (previous) {\n const artifact = parseSchema(artifactSchema, previous);\n if (\n artifact.sourceDigest === sourceDigest &&\n artifact.inputDigest === builder.loaded.inputDigest &&\n artifact.teamId === credentials.account.teamId\n ) {\n if (\n (await realpath(artifact.ipaPath)) !== path.join(await realpath(paths.output), \"app.ipa\") ||\n fileDigest(await readFile(artifact.ipaPath)) !== artifact.sha256 ||\n !(await realpath(artifact.dsymPath)).startsWith(\n (await realpath(paths.output)) + path.sep,\n ) ||\n fileDigest(await readFile(artifact.dsymPath)) !== artifact.dsymSha256\n )\n throw new DeliveryError(\"archive_checksum_mismatch\", 5);\n await verifyArchive(artifact.ipaPath, builder, credentials, runner);\n builder.satisfy(\"build.archive\", {\n sourceDigest,\n inputDigest: builder.loaded.inputDigest,\n version: release.version,\n buildNumber: release.buildNumber,\n });\n return;\n }\n }\n builder.add(\n \"build.archive\",\n \"create\",\n null,\n {\n sourceDigest,\n inputDigest: builder.loaded.inputDigest,\n version: release.version,\n buildNumber: release.buildNumber,\n },\n [\"ipa\", \"dSYM\", \"attestation\"],\n async () => {\n const outputRoot = await privateDirectory(paths.output);\n if (!outputRoot.startsWith(paths.root + path.sep))\n throw new DeliveryError(\"build_output_outside_root\", 2);\n if ((await sourceFingerprint()) !== sourceDigest)\n throw new DeliveryError(\"build_inputs_changed\", 4);\n if (config.kind === \"flutter\") {\n if (!config.flutterVersion) throw new DeliveryError(\"flutter_version_required\", 2);\n const executable = config.flutterExecutable ?? \"flutter\";\n const version = await runner.run(executable, [\"--version\", \"--machine\"], {\n cwd: paths.root,\n env,\n timeoutMs: 30_000,\n });\n const info = parseSchema(\n z.object({ frameworkVersion: z.string() }),\n JSON.parse(version.stdout),\n );\n if (info.frameworkVersion !== config.flutterVersion)\n throw new DeliveryError(\"flutter_version_mismatch\", 4);\n const args = [\n \"build\",\n \"ios\",\n \"--config-only\",\n \"--release\",\n \"--no-pub\",\n \"--build-name\",\n release.version,\n \"--build-number\",\n release.buildNumber,\n ];\n if (config.publicDefinesFile) {\n const filename = await realpath(path.resolve(paths.root, config.publicDefinesFile));\n if (!filename.startsWith(paths.root + path.sep))\n throw new DeliveryError(\"build_defines_outside_root\", 2);\n const values = parseSchema(\n z.record(z.string(), z.union([z.string(), z.boolean(), z.number()])),\n await readJsonFile(filename),\n );\n if (\n Object.keys(values).some((key) =>\n /secret|password|private.?key|access.?token|refresh.?token/i.test(key),\n )\n )\n throw new DeliveryError(\"secret_in_public_build_defines\", 2);\n args.push(\"--dart-define-from-file\", filename);\n }\n await runner.run(executable, args, { cwd: paths.root, env, timeoutMs: 900_000 });\n }\n const result = await tools.run(\"archive\", {\n readOnly: true,\n outputDirectory: paths.output,\n version: release.version,\n buildNumber: release.buildNumber,\n project: {\n projectPath: paths.project,\n workspace: paths.workspace,\n scheme: config.scheme,\n configuration: config.configuration,\n },\n });\n const output = parseSchema(\n z.object({\n ipaPath: z.string(),\n sha256: z.string(),\n dsymPath: z.string(),\n dsymSha256: z.string(),\n }),\n result,\n );\n const ipaPath = await realpath(output.ipaPath);\n if (ipaPath !== path.join(await realpath(paths.output), \"app.ipa\"))\n throw new DeliveryError(\"unexpected_archive_path\", 5);\n const sha256 = fileDigest(await readFile(ipaPath));\n if (sha256 !== output.sha256) throw new DeliveryError(\"archive_checksum_mismatch\", 5);\n const dsymPath = await realpath(output.dsymPath);\n if (\n !dsymPath.startsWith((await realpath(paths.output)) + path.sep) ||\n fileDigest(await readFile(dsymPath)) !== output.dsymSha256\n )\n throw new DeliveryError(\"dsym_checksum_mismatch\", 5);\n await verifyArchive(ipaPath, builder, credentials, runner);\n if ((await sourceFingerprint()) !== sourceDigest)\n throw new DeliveryError(\"build_inputs_changed\", 4);\n await writePrivateJson(path.join(paths.output, \"artifact.json\"), {\n schemaVersion: 1,\n bundleId: builder.loaded.manifest.app.bundleId,\n teamId: credentials.account.teamId,\n version: release.version,\n buildNumber: release.buildNumber,\n ipaPath,\n sha256,\n dsymPath,\n dsymSha256: output.dsymSha256,\n sourceDigest,\n inputDigest: builder.loaded.inputDigest,\n capabilities: builder.loaded.manifest.capabilities,\n });\n return { type: \"ipaArchives\", id: sha256 };\n },\n );\n}\n\nexport async function verifyArchive(\n ipaPath: string,\n builder: PlanBuilder,\n credentials: AppleCredentials,\n runner: ProcessRunner,\n): Promise<void> {\n const root = await mkdtemp(path.join(os.tmpdir(), \"apple-archive-\")),\n env = toolEnvironment();\n try {\n const entries = await runner.run(\"unzip\", [\"-Z1\", ipaPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const names = entries.stdout.split(\"\\n\").filter(Boolean);\n if (names.some((v) => v.startsWith(\"/\") || v.split(\"/\").includes(\"..\") || v.includes(\"\\\\\")))\n throw new DeliveryError(\"unsafe_archive_path\", 2);\n const plists = names.filter((v) => /^Payload\\/[^/]+\\.app\\/Info.plist$/.test(v));\n if (plists.length !== 1) throw new DeliveryError(\"archive_main_app_ambiguous\", 5);\n const archiveListing = await runner.run(\"unzip\", [\"-Z\", \"-l\", ipaPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n if (archiveListing.stdout.split(\"\\n\").some((line) => /^l[rwx-]{9}/.test(line)))\n throw new DeliveryError(\"archive_symlink_not_allowed\", 2);\n await runner.run(\"unzip\", [\"-q\", ipaPath, \"-d\", root], { cwd: root, env, timeoutMs: 120_000 });\n const appPath = path.join(root, path.dirname(plists[0]));\n await runner.run(\"codesign\", [\"--verify\", \"--deep\", \"--strict\", appPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const info = await runner.run(\n \"plutil\",\n [\"-convert\", \"json\", \"-o\", \"-\", path.join(root, plists[0])],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n const plist = parseSchema(\n z.object({\n CFBundleIdentifier: z.string(),\n CFBundleShortVersionString: z.string(),\n CFBundleVersion: z.string(),\n }),\n JSON.parse(info.stdout),\n );\n if (\n plist.CFBundleIdentifier !== builder.loaded.manifest.app.bundleId ||\n plist.CFBundleShortVersionString !== builder.loaded.manifest.release!.version ||\n plist.CFBundleVersion !== builder.loaded.manifest.release!.buildNumber\n )\n throw new DeliveryError(\"archive_identity_mismatch\", 5);\n const signed = await runner.run(\"codesign\", [\"-d\", \"--entitlements\", \":-\", appPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const entitlementFile = path.join(root, \"entitlements.plist\");\n await writeFile(entitlementFile, signed.stdout, { mode: 0o600 });\n const converted = await runner.run(\"plutil\", [\"-convert\", \"json\", \"-o\", \"-\", entitlementFile], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const entitlements = parseSchema(\n z.record(z.string(), z.unknown()),\n JSON.parse(converted.stdout),\n );\n if (\n entitlements[\"com.apple.developer.team-identifier\"] !== credentials.account.teamId ||\n entitlements[\"application-identifier\"] !==\n `${credentials.account.teamId}.${plist.CFBundleIdentifier}`\n )\n throw new DeliveryError(\"archive_team_mismatch\", 5);\n if (\n builder.loaded.manifest.capabilities.pushNotifications &&\n entitlements[\"aps-environment\"] !== \"production\"\n )\n throw new DeliveryError(\"archive_push_entitlement_missing\", 5);\n if (\n builder.loaded.manifest.capabilities.signInWithApple &&\n (!Array.isArray(entitlements[\"com.apple.developer.applesignin\"]) ||\n !entitlements[\"com.apple.developer.applesignin\"].includes(\"Default\"))\n )\n throw new DeliveryError(\"archive_apple_login_entitlement_missing\", 5);\n for (const infoPath of names.filter((v) => /\\.(?:app|appex)\\/Info\\.plist$/.test(v))) {\n const targetPath = path.join(root, path.dirname(infoPath));\n await runner.run(\"codesign\", [\"--verify\", \"--strict\", targetPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const info = await runner.run(\n \"plutil\",\n [\"-convert\", \"json\", \"-o\", \"-\", path.join(root, infoPath)],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n const identifier = parseSchema(\n z.object({ CFBundleIdentifier: z.string() }),\n JSON.parse(info.stdout),\n ).CFBundleIdentifier;\n if (!builder.loaded.manifest.signing?.bundleIds.includes(identifier))\n throw new DeliveryError(\"archive_target_not_declared\", 5);\n const profileFile = path.join(targetPath, \"embedded.mobileprovision\");\n const profileXml = await runner.run(\"security\", [\"cms\", \"-D\", \"-i\", profileFile], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const decodedFile = path.join(root, \"profile.plist\");\n await writeFile(decodedFile, profileXml.stdout, { mode: 0o600 });\n const profileJson = await runner.run(\n builder.loaded.manifest.build?.bundleExecutable ?? \"bundle\",\n [\n \"exec\",\n \"ruby\",\n \"-rplist\",\n \"-rjson\",\n \"-rbase64\",\n \"-e\",\n 'p = Plist.parse_xml(ARGV.fetch(0)); p[\"ExpirationDate\"] = p.fetch(\"ExpirationDate\").iso8601; p[\"DeveloperCertificates\"] = p.fetch(\"DeveloperCertificates\").map { |v| Base64.strict_encode64(v.string) }; puts JSON.generate(p)',\n decodedFile,\n ],\n {\n cwd: root,\n env: { ...env, BUNDLE_GEMFILE: path.join(builder.loaded.directory, \"Gemfile\") },\n timeoutMs: 30_000,\n },\n );\n const profile = parseSchema(\n z.object({\n ExpirationDate: z.string(),\n TeamIdentifier: z.array(z.string()),\n DeveloperCertificates: z.array(z.string()),\n Entitlements: z.record(z.string(), z.unknown()),\n ProvisionedDevices: z.array(z.string()).optional(),\n ProvisionsAllDevices: z.boolean().optional(),\n }),\n JSON.parse(profileJson.stdout),\n );\n if (\n !Number.isFinite(Date.parse(profile.ExpirationDate)) ||\n Date.parse(profile.ExpirationDate) <= Date.now() ||\n !profile.TeamIdentifier.includes(credentials.account.teamId) ||\n profile.ProvisionedDevices ||\n profile.ProvisionsAllDevices ||\n profile.Entitlements[\"get-task-allow\"] === true ||\n profile.Entitlements[\"application-identifier\"] !==\n `${credentials.account.teamId}.${identifier}`\n )\n throw new DeliveryError(\"archive_profile_invalid\", 5);\n const targetSigned = await runner.run(\n \"codesign\",\n [\"-d\", \"--entitlements\", \":-\", targetPath],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n await writeFile(entitlementFile, targetSigned.stdout, { mode: 0o600 });\n const targetJson = await runner.run(\n \"plutil\",\n [\"-convert\", \"json\", \"-o\", \"-\", entitlementFile],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n const targetEntitlements = parseSchema(\n z.record(z.string(), z.unknown()),\n JSON.parse(targetJson.stdout),\n );\n if (\n targetEntitlements[\"application-identifier\"] !==\n `${credentials.account.teamId}.${identifier}` ||\n targetEntitlements[\"com.apple.developer.team-identifier\"] !== credentials.account.teamId ||\n targetEntitlements[\"get-task-allow\"] === true\n )\n throw new DeliveryError(\"archive_target_entitlements_invalid\", 5);\n assertEntitlementsAuthorized(targetEntitlements, profile.Entitlements);\n const certPrefix = path.join(root, \"signing-certificate-\");\n await runner.run(\"codesign\", [\"-d\", \"--extract-certificates\", certPrefix, targetPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const certificateBytes = await readFile(certPrefix + \"0\");\n const certificate = new X509Certificate(certificateBytes);\n if (\n Date.parse(certificate.validTo) <= Date.now() ||\n !profile.DeveloperCertificates.some((value) =>\n Buffer.from(value, \"base64\").equals(certificateBytes),\n )\n )\n throw new DeliveryError(\"archive_signing_certificate_mismatch\", 5);\n }\n } finally {\n await rm(root, { recursive: true, force: true });\n }\n}\n\n/** 签名使用的值必须在描述文件授权范围内;数组是集合子集,通配符只由授权方提供。 */\nexport function assertEntitlementsAuthorized(\n actual: Record<string, unknown>,\n allowed: Record<string, unknown>,\n): void {\n const matches = (value: unknown, policy: unknown): boolean => {\n if (typeof value === \"string\" && typeof policy === \"string\")\n return new RegExp(\n \"^\" +\n policy\n .split(\"*\")\n .map((v) => v.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"))\n .join(\".*\") +\n \"$\",\n ).test(value);\n if (Array.isArray(value))\n return Array.isArray(policy) && value.every((v) => policy.some((p) => matches(v, p)));\n if (\n value !== null &&\n typeof value === \"object\" &&\n policy !== null &&\n typeof policy === \"object\" &&\n !Array.isArray(policy)\n )\n return Object.entries(value).every(\n ([key, child]) =>\n Object.hasOwn(policy, key) && matches(child, (policy as Record<string, unknown>)[key]),\n );\n return value === policy;\n };\n if (!matches(actual, allowed)) throw new DeliveryError(\"archive_entitlements_not_authorized\", 5);\n}\n\nexport async function planUpload(\n builder: PlanBuilder,\n api: AppleGateway,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n runner: ProcessRunner,\n signal?: AbortSignal,\n): Promise<void> {\n const paths = await projectPaths(builder);\n const artifact = parseSchema(\n artifactSchema,\n await readJsonFile(path.join(paths.output, \"artifact.json\")),\n );\n if (\n artifact.bundleId !== builder.loaded.manifest.app.bundleId ||\n artifact.teamId !== credentials.account.teamId ||\n artifact.version !== builder.loaded.manifest.release?.version ||\n artifact.buildNumber !== builder.loaded.manifest.release?.buildNumber\n )\n throw new DeliveryError(\"archive_attestation_mismatch\", 4);\n if (\n (await realpath(artifact.ipaPath)) !== path.join(await realpath(paths.output), \"app.ipa\") ||\n fileDigest(await readFile(artifact.ipaPath)) !== artifact.sha256\n )\n throw new DeliveryError(\"archive_checksum_mismatch\", 4);\n await verifyArchive(artifact.ipaPath, builder, credentials, runner);\n await tools.preflight();\n const key = `upload.${artifact.sha256}`;\n const binding = builder.bindings[key];\n const accepted = binding?.type === \"acceptedUploads\" && binding.id === artifact.sha256;\n const existing = await selectedBuild(builder, api, true);\n if (existing && !accepted && (binding?.type !== \"builds\" || binding.id !== existing.id))\n throw new DeliveryError(\"existing_build_requires_upload_evidence\", 4);\n if (existing?.attributes.processingState === \"VALID\") {\n builder.satisfy(key, artifact);\n return;\n }\n builder.add(\n key,\n \"upload\",\n existing,\n artifact,\n [\"ipa\"],\n async () => {\n if (!accepted && !existing) {\n const result = await tools.run(\"upload\", {\n ipaPath: artifact.ipaPath,\n appId: builder.require(\"app\").id,\n });\n if (result.transportAccepted !== true)\n throw new DeliveryError(\"upload_transport_not_accepted\", 7);\n await builder.record(key, { type: \"acceptedUploads\", id: artifact.sha256 });\n }\n for (let attempt = 0; attempt < 30; attempt++) {\n const build = await selectedBuild(builder, api, true);\n if (build?.attributes.processingState === \"VALID\") return build;\n try {\n await systemClock.sleep(10_000, signal);\n } catch {\n throw new DeliveryError(\"build_processing_pending\", 7);\n }\n }\n throw new DeliveryError(\"build_processing_pending\", 7);\n },\n [],\n accepted || !!existing,\n );\n}\n","import path from \"node:path\";\nimport { realpath, lstat } from \"node:fs/promises\";\nimport { DeliveryError } from \"../contracts.js\";\nimport type { AppleCredentials } from \"../credentials.js\";\nimport type { AppleBuildTools } from \"../fastlane.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { canonical, fileDigest, resolveFile } from \"../manifest.js\";\nimport { validateImage } from \"./assets.js\";\n\nexport async function planNative(\n builder: PlanBuilder,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n): Promise<void> {\n const { build, app, assets, capabilities } = builder.loaded.manifest;\n if (!build?.infoPlistPath || !build.entitlementsPath || !build.iconSetPath)\n throw new DeliveryError(\"native_project_paths_required\", 2);\n await tools.preflight();\n const root = await realpath(path.resolve(builder.loaded.directory, build.projectRoot));\n const securePath = async (relative: string) => {\n const target = path.resolve(root, relative);\n if (!target.startsWith(root + path.sep)) throw new DeliveryError(\"native_path_outside_root\", 2);\n let parent = target;\n while (parent !== root) {\n try {\n await lstat(parent);\n const actual = await realpath(parent);\n if (!actual.startsWith(root + path.sep))\n throw new DeliveryError(\"native_path_outside_root\", 2);\n break;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n parent = path.dirname(parent);\n }\n return target;\n };\n const projectPath = await securePath(build.projectPath);\n const infoPlistPath = await securePath(build.infoPlistPath),\n entitlementsPath = await securePath(build.entitlementsPath),\n iconSetPath = await securePath(build.iconSetPath);\n const icons: { filename: string; source: string; luminosity?: string; sha256: string }[] = [];\n for (const [luminosity, name] of [\n [undefined, assets?.icon],\n [\"dark\", assets?.iconVariants?.dark],\n [\"tinted\", assets?.iconVariants?.tinted],\n ] as const) {\n if (!name) continue;\n validateImage(builder.loaded.files.get(name)!, true);\n icons.push({\n filename: luminosity ? `AppIcon-${luminosity}.png` : \"AppIcon.png\",\n luminosity,\n source: await resolveFile(builder.loaded.directory, name),\n sha256: fileDigest(builder.loaded.files.get(name)!),\n });\n }\n const parameters = {\n projectPath,\n targetName: build.targetName,\n infoPlistPath,\n entitlementsPath,\n iconSetPath,\n name: app.name,\n capabilities,\n icons,\n teamId: credentials.account.teamId,\n bundleId: app.bundleId,\n additionalTargets: build.additionalTargets,\n };\n const current = await tools.run(\"native\", { ...parameters, dryRun: true });\n if (current.matches === true) return;\n builder.add(\n \"native.project\",\n \"update\",\n current,\n parameters,\n [\"bundleId\", \"teamId\", \"displayName\", \"entitlements\", \"icons\"],\n async () => {\n const observed = await tools.run(\"native\", { ...parameters, dryRun: true });\n if (canonical(current) !== canonical(observed))\n throw new DeliveryError(\"native_project_changed\", 4);\n await tools.run(\"native\", { ...parameters, dryRun: false });\n const read = await tools.run(\"native\", { ...parameters, dryRun: true });\n if (read.matches !== true) throw new DeliveryError(\"native_project_readback_failed\", 5);\n return { type: \"nativeProjects\", id: app.bundleId };\n },\n );\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { findApp } from \"./identifiers.js\";\nimport { readCatalog } from \"./catalog.js\";\n\nconst publicFields = [\n \"name\",\n \"bundleId\",\n \"sku\",\n \"primaryLocale\",\n \"platform\",\n \"versionString\",\n \"version\",\n \"appStoreState\",\n \"state\",\n \"processingState\",\n \"expired\",\n \"releaseType\",\n \"earliestReleaseDate\",\n \"locale\",\n \"subtitle\",\n \"privacyPolicyUrl\",\n \"privacyChoicesUrl\",\n \"description\",\n \"keywords\",\n \"promotionalText\",\n \"whatsNew\",\n \"supportUrl\",\n \"marketingUrl\",\n \"copyright\",\n \"productId\",\n \"referenceName\",\n \"subscriptionPeriod\",\n \"groupLevel\",\n \"inAppPurchaseType\",\n \"familySharable\",\n \"fileName\",\n \"fileSize\",\n \"sourceFileChecksum\",\n \"assetDeliveryState\",\n];\n\n/** 公开资料使用允许字段投影,供应商新增字段不能自动进入导出。 */\nexport function publicResource(value: AppleResource): AppleResource {\n const attributes = Object.fromEntries(\n publicFields\n .filter((key) => Object.hasOwn(value.attributes, key) && key !== \"assetDeliveryState\")\n .map((key) => [key, value.attributes[key]]),\n );\n const delivery = value.attributes.assetDeliveryState;\n if (delivery && typeof delivery === \"object\" && \"state\" in delivery)\n attributes.assetDeliveryState = { state: delivery.state };\n return { type: value.type, id: value.id, attributes };\n}\n\nexport async function inspectDelivery(\n builder: PlanBuilder,\n api: AppleGateway,\n materials = false,\n): Promise<AppleResource[]> {\n const rows: AppleResource[] = [];\n const bundles = await api.list(\"/v1/bundleIds\", {\n \"filter[identifier]\": builder.loaded.manifest.app.bundleId,\n });\n for (const bundle of bundles) {\n rows.push({\n type: bundle.type,\n id: bundle.id,\n attributes: {\n identifier: bundle.attributes.identifier,\n platform: bundle.attributes.platform,\n },\n });\n for (const capability of await api.list(`/v1/bundleIds/${bundle.id}/bundleIdCapabilities`))\n rows.push({\n type: capability.type,\n id: capability.id,\n attributes: { capabilityType: capability.attributes.capabilityType },\n });\n }\n const app = await findApp(builder, api);\n if (!app) return rows;\n rows.push(publicResource(app));\n const versions = await api.list(`/v1/apps/${app.id}/appStoreVersions`, {\n \"filter[platform]\": \"IOS\",\n });\n for (const version of versions.filter(\n (v) =>\n !builder.loaded.manifest.release ||\n v.attributes.versionString === builder.loaded.manifest.release.version,\n )) {\n rows.push(publicResource(version));\n if (materials) {\n const locales = await api.list(\n `/v1/appStoreVersions/${version.id}/appStoreVersionLocalizations`,\n );\n for (const locale of locales) {\n rows.push({\n ...publicResource(locale),\n relationships: { appStoreVersion: { data: { type: version.type, id: version.id } } },\n });\n for (const [sets, assets] of [\n [\"appScreenshotSets\", \"appScreenshots\"],\n [\"appPreviewSets\", \"appPreviews\"],\n ]) {\n for (const set of await api.list(\n `/v1/appStoreVersionLocalizations/${locale.id}/${sets}`,\n )) {\n rows.push({\n type: set.type,\n id: set.id,\n attributes: {\n screenshotDisplayType: set.attributes.screenshotDisplayType,\n previewType: set.attributes.previewType,\n },\n relationships: { localization: { data: { type: locale.type, id: locale.id } } },\n });\n for (const asset of await api.list(`/v1/${sets}/${set.id}/${assets}`))\n rows.push({\n ...publicResource(asset),\n relationships: { set: { data: { type: set.type, id: set.id } } },\n });\n }\n }\n }\n }\n }\n if (materials)\n for (const info of await api.list(`/v1/apps/${app.id}/appInfos`)) {\n rows.push(publicResource(info));\n for (const locale of await api.list(`/v1/appInfos/${info.id}/appInfoLocalizations`))\n rows.push({\n ...publicResource(locale),\n relationships: { appInfo: { data: { type: info.type, id: info.id } } },\n });\n }\n for (const row of await api.list(\"/v1/builds\", {\n \"filter[app]\": app.id,\n ...(builder.loaded.manifest.release\n ? { \"filter[version]\": builder.loaded.manifest.release.buildNumber }\n : {}),\n }))\n rows.push(publicResource(row));\n for (const submission of await api.list(`/v1/apps/${app.id}/reviewSubmissions`))\n rows.push(publicResource(submission));\n for (const product of (await readCatalog(builder, api)).values())\n rows.push(publicResource(product));\n return rows;\n}\n\nexport async function runtimeHandoff(\n builder: PlanBuilder,\n api: AppleGateway,\n): Promise<Record<string, unknown>> {\n const resources = await inspectDelivery(builder, api);\n const { app, capabilities, catalog } = builder.loaded.manifest;\n return {\n schemaVersion: 1,\n bundleId: app.bundleId,\n appId: builder.resources.get(\"app\")?.id,\n resources,\n productIds: catalog?.items.map((v) => v.productId) ?? [],\n requiredRuntimeConfiguration: {\n ...(capabilities.signInWithApple\n ? {\n identity: {\n audience: app.bundleId,\n required: [\"teamId\", \"appleLoginKeyId\", \"appleLoginPrivateKeyRef\"],\n verified: false,\n },\n }\n : {}),\n ...(capabilities.pushNotifications\n ? {\n notifications: {\n topic: app.bundleId,\n required: [\"apnsKeyId\", \"apnsPrivateKeyRef\", \"teamId\", \"environment\"],\n verified: false,\n },\n }\n : {}),\n ...(capabilities.inAppPurchase\n ? {\n commerce: {\n bundleId: app.bundleId,\n required: [\n \"appId\",\n \"issuerId\",\n \"inAppPurchaseKeyId\",\n \"inAppPurchasePrivateKeyRef\",\n \"environment\",\n \"serverNotificationUrl\",\n ],\n verified: false,\n },\n }\n : {}),\n },\n manualRequirements: builder.requirements,\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { Command } from \"commander\";\n\nimport { generator as gtmGenerator } from \"../analytics/google-tag-manager.js\";\nimport { ArtifactError, GeneratorRegistry } from \"../analytics/registry.js\";\nimport { readJson } from \"../utils/fs.js\";\n\ninterface ProviderOptions {\n readonly provider: string;\n}\n\ninterface GenerateOptions extends ProviderOptions {\n readonly config: string;\n readonly out: string;\n readonly overwrite?: boolean;\n}\n\nconst registry = new GeneratorRegistry([gtmGenerator]);\n\nexport function registerAnalytics(program: Command): void {\n const analytics = program\n .command(\"analytics\")\n .description(\"Generate reviewed analytics provider configuration artifacts\");\n\n analytics\n .command(\"schema\")\n .description(\"Print the selected analytics provider configuration schema\")\n .requiredOption(\"--provider <provider>\", \"Analytics provider\")\n .action((options: ProviderOptions) =>\n runAnalyticsCommand(() => {\n process.stdout.write(\n `${JSON.stringify(registry.get(options.provider).schema(), null, 2)}\\n`,\n );\n }),\n );\n\n analytics\n .command(\"generate\")\n .description(\"Generate a provider configuration artifact without publishing it\")\n .requiredOption(\"--provider <provider>\", \"Analytics provider\")\n .requiredOption(\"--config <file>\", \"Product analytics configuration JSON\")\n .requiredOption(\"--out <file>\", \"Destination artifact\")\n .option(\"--overwrite\", \"Replace an existing destination\")\n .action((options: GenerateOptions) => runAnalyticsCommand(() => generateArtifact(options)));\n}\n\nasync function generateArtifact(options: GenerateOptions): Promise<void> {\n const generator = registry.get(options.provider);\n const input = await readJson<unknown>(path.resolve(options.config));\n if (input === null) {\n throw new ArtifactError(\n \"configuration_unreadable\",\n \"Analytics configuration must be a readable JSON file\",\n );\n }\n const artifact = generator.generate(input);\n const destination = path.resolve(options.out);\n await writeArtifact(destination, artifact.contents, options.overwrite === true);\n process.stdout.write(\n `${JSON.stringify({\n schemaVersion: 1,\n outcome: \"generated\",\n provider: options.provider,\n artifact: destination,\n resources: artifact.resourceCounts,\n published: false,\n })}\\n`,\n );\n}\n\nasync function writeArtifact(destination: string, contents: string, overwrite: boolean) {\n await mkdir(path.dirname(destination), { recursive: true });\n if (!overwrite) {\n try {\n await writeFile(destination, contents, { flag: \"wx\" });\n return;\n } catch (error) {\n if (isFileExistsError(error)) {\n throw new ArtifactError(\n \"artifact_exists\",\n \"Analytics artifact already exists; pass --overwrite to replace it\",\n );\n }\n throw error;\n }\n }\n const temporary = `${destination}.${process.pid}.${randomUUID()}.tmp`;\n let created = false;\n try {\n await writeFile(temporary, contents, { flag: \"wx\" });\n created = true;\n await rename(temporary, destination);\n created = false;\n } finally {\n if (created) {\n await rm(temporary, { force: true });\n }\n }\n}\n\nasync function runAnalyticsCommand(operation: () => void | Promise<void>): Promise<void> {\n try {\n await operation();\n } catch (error) {\n const failure =\n error instanceof ArtifactError\n ? error\n : new ArtifactError(\"analytics_command_failed\", \"Analytics command failed\");\n process.stderr.write(\n `${JSON.stringify({ schemaVersion: 1, outcome: \"failed\", code: failure.code })}\\n`,\n );\n process.exitCode = 2;\n }\n}\n\nfunction isFileExistsError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === \"EEXIST\";\n}\n","import {\n createGTMContainer,\n getGTMContainerConfigJsonSchema,\n} from \"@stackonward/google-tag-manager/container\";\n\nimport { ArtifactError, type Generator } from \"./registry.js\";\n\nexport const generator: Generator = {\n id: \"google-tag-manager\",\n schema: getGTMContainerConfigJsonSchema,\n generate(input) {\n try {\n const container = createGTMContainer(input);\n return {\n contents: `${JSON.stringify(container, null, 2)}\\n`,\n resourceCounts: Object.freeze({\n tags: container.containerVersion.tag.length,\n triggers: container.containerVersion.trigger.length,\n variables: container.containerVersion.variable.length,\n }),\n };\n } catch (error) {\n if (error instanceof Error && error.name === \"ZodError\") {\n throw new ArtifactError(\n \"invalid_configuration\",\n \"Analytics provider configuration is invalid\",\n );\n }\n throw error;\n }\n },\n};\n","export interface Artifact {\n readonly contents: string;\n readonly resourceCounts: Readonly<Record<string, number>>;\n}\n\nexport interface Generator {\n readonly id: string;\n schema(): object;\n generate(input: unknown): Artifact;\n}\n\nexport class ArtifactError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = \"ArtifactError\";\n this.code = code;\n }\n}\n\nexport class GeneratorRegistry {\n readonly #generators = new Map<string, Generator>();\n\n constructor(generators: readonly Generator[]) {\n for (const generator of generators) {\n if (this.#generators.has(generator.id)) {\n throw new ArtifactError(\n \"duplicate_provider\",\n `Analytics provider is registered more than once: ${generator.id}`,\n );\n }\n this.#generators.set(generator.id, generator);\n }\n }\n\n get(provider: string): Generator {\n const generator = this.#generators.get(provider);\n if (!generator) {\n throw new ArtifactError(\"unknown_provider\", `Unknown analytics provider: ${provider}`);\n }\n return generator;\n }\n}\n"],"mappings":"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","names":["path","fs","execa","file","fs","path","fs","path","fs","path","registry","path","registry","file","path","path","fs","execa","file","registry","path","fs","prompts","ora","registry","ora","file","path","fs","prompts","registry","z","path","os","mkdir","writeFile","readFile","realpath","path","path","offer","group","readFile","stat","realpath","path","realpath","path","readFile","stat","z","z","init","url","id","realpath","readFile","z","path","realpath","path","z","readFile","fields","id","path","randomUUID","z","path","randomUUID","resource","id","fields","z","path","list","fields","linked","z","id","path","createHash","id","group","fields","createHash","z","createHash","path","z","url","resolve","createHash","state","locale","resource","group","path","id","subscription","price","territory","subscription","id","offer","price","fields","resource","territory","linked","id","price","territory","base","submission","purchase","group","id","fields","path","z","id","path","z","fields","group","execa","path","os","execa","mkdir","readFile","rm","realpath","os","path","z","z","path","readFile","os","mkdir","realpath","rm","path","readFile","realpath","lstat","mkdtemp","rm","os","z","z","realpath","path","lstat","id","readFile","mkdtemp","os","info","rm","path","realpath","lstat","realpath","path","lstat","locale","asset","program","path","realpath","readFile","writeFile","os","mkdir","z","randomUUID","mkdir","rename","rm","writeFile","path","generator","program","generator","path","mkdir","writeFile","randomUUID","rename","rm"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/utils/constants.ts","../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/project.ts","../src/utils/registry.ts","../src/utils/registry-install.ts","../src/deploy/compatibility.ts","../src/deploy/config.ts","../src/commands/add.ts","../src/utils/nuxt-config.ts","../src/commands/list.ts","../src/commands/apple.ts","../src/apple/contracts.ts","../src/apple/manifest.ts","../src/apple/credentials.ts","../src/apple/api.ts","../src/apple/state.ts","../src/apple/plan.ts","../src/apple/execute.ts","../src/apple/resources/identifiers.ts","../src/apple/resources/metadata.ts","../src/apple/resources/catalog.ts","../src/apple/resources/assets.ts","../src/apple/resources/pricing.ts","../src/apple/resources/offers.ts","../src/apple/resources/app-commerce.ts","../src/apple/resources/review.ts","../src/apple/resources/release.ts","../src/apple/resources/testflight.ts","../src/apple/process.ts","../src/apple/fastlane.ts","../src/apple/resources/build.ts","../src/apple/resources/native.ts","../src/apple/resources/inspection.ts","../src/commands/analytics.ts","../src/analytics/google-tag-manager.ts","../src/analytics/registry.ts","../src/commands/deploy/guard.ts","../src/deploy/process.ts","../src/deploy/release.ts","../src/deploy/lifecycle.ts","../src/deploy/receipt.ts","../src/deploy/plan.ts","../src/deploy/profile.ts","../src/deploy/safety.ts","../src/deploy/target.ts","../src/deploy/transport/registry.ts","../src/provision/contracts.ts","../src/commands/deploy/contracts.ts","../src/deploy/env-file.ts","../src/deploy/materialize.ts","../src/commands/deploy/io.ts","../src/commands/deploy/runtime.ts","../src/deploy/health.ts","../src/deploy/rollout.ts","../src/deploy/health/ssh.ts","../src/deploy/transport/ssh.ts","../src/deploy/profiles/compose-stack.ts","../src/deploy/profiles/go-service.ts","../src/deploy/profiles/nuxt-node.ts","../src/deploy/profiles/static-files.ts","../src/deploy/profiles/static-nginx.ts","../src/deploy/rollouts/atomic-link.ts","../src/deploy/rollouts/blue-green.ts","../src/deploy/rollouts/recreate.ts","../src/deploy/rollouts/stack.ts","../src/deploy/targets/compose-host.ts","../src/deploy/targets/ssh-directory.ts","../src/deploy/registry.ts","../src/commands/deploy/operations.ts","../src/commands/deploy/provision.ts","../src/provision/command.ts","../src/provision/config.ts","../src/provision/secrets.ts","../src/provision/coordinator.ts","../src/provision/canonical.ts","../src/provision/plan.ts","../src/provision/receipt.ts","../src/provision/state.ts","../src/provision/probes/onedev.ts","../src/provision/registry.ts","../src/provision/sinks/ssh-docker-config.ts","../src/commands/deploy.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { init } from \"./commands/init.js\";\nimport { add } from \"./commands/add.js\";\nimport { list } from \"./commands/list.js\";\nimport { registerApple } from \"./commands/apple.js\";\nimport { registerAnalytics } from \"./commands/analytics.js\";\nimport { registerDeploy } from \"./commands/deploy.js\";\n\ndeclare const __STACKONWARD_CLI_VERSION__: string;\n\nconst program = new Command();\n\nprogram\n .name(\"stackonward\")\n .description(\"Create projects and install reusable components and snippets\")\n .version(__STACKONWARD_CLI_VERSION__);\n\nprogram\n .command(\"init [name]\")\n .description(\"Create a new project from template\")\n .option(\"-t, --template <template>\", \"Template to use\")\n .option(\"-d, --dir <directory>\", \"Target directory\")\n .option(\"--skip-install\", \"Skip dependency installation\")\n .option(\"--skip-git\", \"Skip git initialization\")\n .option(\"--module <module>\", \"Go module path (required for go-backend)\")\n .option(\"--author <author>\", \"Author name\")\n .option(\"-y, --yes\", \"Use defaults without interactive prompts\")\n .action(init);\n\nprogram\n .command(\"add [items...]\")\n .description(\"Add components or snippets to your project\")\n .option(\"-c, --component\", \"Add component(s)\")\n .option(\"-s, --snippet\", \"Add snippet(s)\")\n .option(\"-a, --all\", \"Add all items in category\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-o, --overwrite\", \"Overwrite existing files\")\n .option(\"-p, --path <path>\", \"Custom install path\")\n .action(add);\n\nprogram\n .command(\"list [type]\")\n .description(\"List available templates, components, or snippets\")\n .option(\"-t, --templates\", \"List templates\")\n .option(\"-c, --components\", \"List components\")\n .option(\"-s, --snippets\", \"List snippets\")\n .action(list);\n\nregisterApple(program);\nregisterAnalytics(program);\nregisterDeploy(program);\nawait program.parseAsync();\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { execa } from \"execa\";\nimport { TEMPLATES, PATHS, type TemplateName } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { copyFiles, copyTemplate, isDirEmpty } from \"../utils/fs.js\";\nimport { createInitialCommit, initializeGitRepository, runInstall } from \"../utils/project.js\";\nimport { loadRegistry } from \"../utils/registry.js\";\nimport { buildComponentInstallPlan } from \"../utils/registry-install.js\";\nimport { assertConfig } from \"../deploy/compatibility.js\";\nimport { configSchema, parseConfig } from \"../deploy/config.js\";\n\ninterface InitOptions {\n template?: string;\n dir?: string;\n skipInstall?: boolean;\n skipGit?: boolean;\n module?: string;\n author?: string;\n yes?: boolean;\n}\n\nconst PROMPT_OPTIONS = {\n onCancel: () => {\n throw new Error(\"Initialization cancelled\");\n },\n};\n\ninterface DeploymentDefault {\n readonly profile: \"nuxt-node\" | \"go-service\";\n readonly files: readonly {\n readonly source: string;\n readonly destination: string;\n }[];\n}\n\nconst deploymentDefaults: Partial<Record<TemplateName, DeploymentDefault>> = {\n nuxt: {\n profile: \"nuxt-node\",\n files: [{ source: \"profiles/nuxt-node/Dockerfile\", destination: \"Dockerfile\" }],\n },\n \"go-backend\": {\n profile: \"go-service\",\n files: [],\n },\n};\n\nexport async function init(name: string | undefined, options: InitOptions): Promise<void> {\n logger.br();\n logger.title(\"StackOnward - Project Initializer\");\n logger.br();\n\n if (options.template && !Object.hasOwn(TEMPLATES, options.template)) {\n throw new Error(`Unknown template: ${options.template}`);\n }\n if (options.yes && (!name || !options.template)) {\n throw new Error(\"Project name and --template are required with --yes\");\n }\n\n let projectName = name;\n if (!projectName) {\n const response = await prompts(\n {\n type: \"text\",\n name: \"name\",\n message: \"Project name:\",\n initial: \"my-project\",\n validate: (value: string) =>\n /^[a-z0-9-_]+$/i.test(value) || \"Project name can only contain letters, numbers, - and _\",\n },\n PROMPT_OPTIONS,\n );\n projectName = response.name;\n }\n\n if (!projectName) {\n logger.error(\"Project name is required\");\n process.exit(1);\n }\n\n if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(projectName)) {\n throw new Error(\"Invalid project name\");\n }\n\n const targetDir = options.dir\n ? path.resolve(options.dir)\n : path.resolve(process.cwd(), projectName);\n\n if (!(await isDirEmpty(targetDir))) {\n throw new Error(\n \"Target directory must be empty; initialization does not overwrite existing projects\",\n );\n }\n\n let template = options.template as TemplateName | undefined;\n if (!template || !TEMPLATES[template]) {\n const templateChoices = Object.entries(TEMPLATES).map(([key, value]) => ({\n title: value.name,\n description: value.description,\n value: key,\n }));\n\n const response = await prompts(\n {\n type: \"select\",\n name: \"template\",\n message: \"Select a template:\",\n choices: templateChoices,\n },\n PROMPT_OPTIONS,\n );\n\n template = response.template;\n }\n\n if (!template) {\n logger.error(\"Template selection is required\");\n process.exit(1);\n }\n\n const templateInfo = TEMPLATES[template];\n const deploymentDefault = deploymentDefaults[template];\n if (deploymentDefault) {\n assertDeploymentProjectName(projectName);\n }\n if (templateInfo.runtime === \"go\") {\n validateGoModule(options.module);\n }\n const templatePath = path.join(PATHS.templates, templateInfo.path);\n\n if (!(await fs.pathExists(templatePath))) {\n logger.error(`Template \"${template}\" not found at ${templatePath}`);\n logger.info(\"Available templates:\");\n Object.entries(TEMPLATES).forEach(([key, val]) => {\n logger.info(` - ${key}: ${val.description}`);\n });\n process.exit(1);\n }\n\n if (deploymentDefault) {\n await assertDeploymentSources(deploymentDefault, templatePath);\n }\n\n const { author } =\n options.author || options.yes\n ? { author: options.author || process.env.USER || \"\" }\n : await prompts(\n {\n type: \"text\",\n name: \"author\",\n message: \"Author name (for LICENSE and package.json):\",\n initial: process.env.USER || \"your-name\",\n },\n PROMPT_OPTIONS,\n );\n\n const { shouldInstall } = options.skipInstall\n ? { shouldInstall: false }\n : options.yes\n ? { shouldInstall: true }\n : await prompts(\n {\n type: \"confirm\",\n name: \"shouldInstall\",\n message: \"Install dependencies?\",\n initial: true,\n },\n PROMPT_OPTIONS,\n );\n const { shouldGit } = options.skipGit\n ? { shouldGit: false }\n : options.yes\n ? { shouldGit: true }\n : await prompts(\n {\n type: \"confirm\",\n name: \"shouldGit\",\n message: \"Initialize git repository?\",\n initial: true,\n },\n PROMPT_OPTIONS,\n );\n\n const spinner = ora(\"Creating project...\").start();\n\n try {\n await copyTemplate(templatePath, targetDir, {\n projectName,\n PROJECT_NAME: projectName,\n author: author || \"your-name\",\n year: new Date().getFullYear().toString(),\n module: options.module || \"\",\n });\n if (deploymentDefault) {\n await materializeDeploymentDefault(deploymentDefault, targetDir, projectName);\n }\n if (templateInfo.runtime === \"go\") {\n // module 替换可能改变导入排序,生成后使用 Go 官方格式化器。\n await execa(\"gofmt\", [\"-w\", \"cmd\", \"internal\", \"pkg\", \"api\"], { cwd: targetDir });\n }\n // 通用规范集中维护,技术栈规范由所选模板提供。\n if (templateInfo.standards === \"base\") {\n const standardsPath = path.join(PATHS.templates, \"base\");\n await copyTemplate(path.join(standardsPath, \".claude\"), path.join(targetDir, \".claude\"));\n await copyFiles(\n [\"AGENTS.md\", \"CLAUDE.md\"].map((file) => ({\n src: path.join(standardsPath, file),\n dest: path.join(targetDir, file),\n })),\n );\n }\n await installTemplateRegistryItems(templateInfo, targetDir);\n\n spinner.succeed(\"Project created\");\n } catch (error) {\n spinner.fail(\"Failed to create project\");\n throw error;\n }\n\n if (shouldGit) {\n const gitSpinner = ora(\"Initializing git repository...\").start();\n try {\n await initializeGitRepository(targetDir);\n gitSpinner.succeed(\"Git repository initialized\");\n } catch (error) {\n gitSpinner.fail(\"Failed to initialize git repository\");\n throw error;\n }\n }\n\n if (shouldInstall) {\n const installSpinner = ora(\"Installing dependencies...\").start();\n try {\n if (templateInfo.runtime === \"go\") {\n await execa(\"go\", [\"mod\", \"download\"], { cwd: targetDir, stdio: \"inherit\" });\n } else {\n await runInstall(targetDir);\n }\n installSpinner.succeed(\"Dependencies installed\");\n } catch (error) {\n installSpinner.fail(\"Failed to install dependencies\");\n throw error;\n }\n }\n\n if (shouldGit) {\n const commitSpinner = ora(\"Creating initial commit...\").start();\n try {\n await createInitialCommit(targetDir);\n commitSpinner.succeed(\"Initial commit created\");\n } catch (error) {\n commitSpinner.fail(\"Failed to create initial commit\");\n throw error;\n }\n }\n\n logger.br();\n logger.success(\"Project ready!\");\n logger.br();\n logger.info(\"Next steps:\");\n logger.info(` cd ${path.relative(process.cwd(), targetDir)}`);\n if (!shouldInstall) {\n logger.info(templateInfo.runtime === \"go\" ? \" go mod download\" : \" pnpm install\");\n }\n if (templateInfo.runtime === \"go\") logger.info(\" make openapi-install\");\n logger.info(templateInfo.runtime === \"go\" ? \" make check\" : \" pnpm dev\");\n logger.br();\n}\n\nfunction assertDeploymentProjectName(projectName: string): void {\n if (configSchema.shape.name.safeParse(projectName).success) return;\n throw new Error(\n \"Deployment project names must be DNS labels using lowercase letters, numbers and hyphens\",\n );\n}\n\nasync function assertDeploymentSources(\n deploymentDefault: DeploymentDefault,\n templatePath: string,\n): Promise<void> {\n for (const file of deploymentDefault.files) {\n const source = path.join(PATHS.deploy, ...file.source.split(\"/\"));\n const destination = path.join(templatePath, ...file.destination.split(\"/\"));\n if (!(await fs.pathExists(source)) || !(await fs.stat(source)).isFile()) {\n throw new Error(`Deployment resource is unavailable: ${file.source}`);\n }\n if (await fs.pathExists(destination)) {\n throw new Error(`Deployment resource conflicts with template file: ${file.destination}`);\n }\n }\n}\n\nasync function materializeDeploymentDefault(\n deploymentDefault: DeploymentDefault,\n targetDir: string,\n projectName: string,\n): Promise<void> {\n const result = await copyFiles(\n deploymentDefault.files.map((file) => ({\n src: path.join(PATHS.deploy, ...file.source.split(\"/\")),\n dest: path.join(targetDir, ...file.destination.split(\"/\")),\n })),\n );\n if (result.skipped.length > 0) {\n throw new Error(\n `Deployment files conflict with generated project: ${result.skipped\n .map((filename) => path.relative(targetDir, filename))\n .join(\", \")}`,\n );\n }\n\n const config = parseConfig(await fs.readJson(path.join(targetDir, \"deploy.config.json\")));\n assertConfig(config);\n if (\n config.name !== projectName ||\n config.profile !== deploymentDefault.profile ||\n config.environments.production?.target !== \"registry-only\"\n ) {\n throw new Error(\"Generated deployment default does not match its project template\");\n }\n if (!config.image || !(await fs.pathExists(path.resolve(targetDir, config.image.dockerfile)))) {\n throw new Error(\"Generated deployment default references an unavailable Dockerfile\");\n }\n}\n\nfunction validateGoModule(module: string | undefined): void {\n if (\n !module ||\n !/^[a-z0-9]+(?:[.-][a-z0-9]+)+\\/[a-zA-Z0-9_-]+(?:\\/[a-zA-Z0-9_-]+)*$/.test(module)\n ) {\n throw new Error(\"A valid --module path such as example.com/team/service is required\");\n }\n}\n\nasync function installTemplateRegistryItems(\n templateInfo: (typeof TEMPLATES)[TemplateName],\n targetDir: string,\n): Promise<void> {\n const registryItems = \"registryItems\" in templateInfo ? templateInfo.registryItems : undefined;\n if (!registryItems?.length) {\n return;\n }\n\n const registry = await loadRegistry();\n const installPlan = buildComponentInstallPlan({\n componentKeys: [...registryItems],\n framework: \"nuxt\",\n projectRoot: targetDir,\n registry,\n installContext: \"template\",\n });\n\n await copyFiles(installPlan.filesToCopy, false);\n}\n","import { fileURLToPath } from \"url\";\nimport { dirname, resolve } from \"path\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// 构建制品携带完整资源,安装后不读取调用者或源码仓库目录。\nconst RESOURCE_ROOT = resolve(__dirname, \"resources\");\n\n// Paths to different resource directories\nexport const PATHS = {\n apple: resolve(RESOURCE_ROOT, \"apple\"),\n deploy: resolve(RESOURCE_ROOT, \"deploy\"),\n templates: resolve(RESOURCE_ROOT, \"templates\"),\n components: resolve(RESOURCE_ROOT, \"components\"),\n snippets: resolve(RESOURCE_ROOT, \"snippets\"),\n packagesRegistry: resolve(RESOURCE_ROOT, \"registry.json\"),\n} as const;\n\n// Available templates\nexport const TEMPLATES = {\n \"mcp-server\": {\n runtime: \"node\",\n standards: \"base\",\n name: \"MCP Server\",\n description: \"Model Context Protocol server template\",\n path: \"mcp-server\",\n },\n nuxt: {\n runtime: \"node\",\n standards: \"base\",\n name: \"Nuxt\",\n description: \"Nuxt 4 product-site starter with editable registry-installed source\",\n path: \"nuxt\",\n registryItems: [\"nuxt-site-source\"],\n },\n \"go-backend\": {\n name: \"Go Backend\",\n description:\n \"Source-derived Go backend foundation with Wire and complete engineering standards\",\n path: \"go-backend\",\n runtime: \"go\",\n standards: \"self\",\n },\n} as const;\n\nexport type TemplateName = keyof typeof TEMPLATES;\n\n// Framework detection patterns\nexport const FRAMEWORK_PATTERNS = {\n nuxt: [\"nuxt\"],\n vue: [\"vue\", \"nuxt\"],\n react: [\"react\", \"next\"],\n node: [\"node\", \"express\", \"fastify\", \"mcp\"],\n} as const;\n\n// Default file paths for components\nexport const DEFAULT_PATHS = {\n nuxt: {\n components: \"app/components\",\n composables: \"app/composables\",\n utils: \"app/utils\",\n },\n vue: {\n components: \"src/components\",\n composables: \"src/composables\",\n utils: \"src/utils\",\n },\n react: {\n components: \"src/components\",\n hooks: \"src/hooks\",\n utils: \"src/utils\",\n },\n node: {\n utils: \"src/utils\",\n services: \"src/services\",\n },\n} as const;\n","import { blue, green, red, yellow, cyan, bold, dim } from \"kolorist\";\n\nexport const logger = {\n info: (msg: string) => console.log(blue(\"info\"), msg),\n success: (msg: string) => console.log(green(\"success\"), msg),\n warn: (msg: string) => console.log(yellow(\"warn\"), msg),\n error: (msg: string) => console.log(red(\"error\"), msg),\n\n // Styled outputs\n title: (msg: string) => console.log(bold(cyan(msg))),\n subtitle: (msg: string) => console.log(dim(msg)),\n step: (step: number, total: number, msg: string) => console.log(dim(`[${step}/${total}]`), msg),\n\n // Blank line\n br: () => console.log(),\n\n // Box output for important messages\n box: (title: string, content: string[]) => {\n const maxLen = Math.max(title.length, ...content.map((c) => c.length));\n const border = \"─\".repeat(maxLen + 2);\n\n console.log(`┌${border}┐`);\n console.log(`│ ${bold(title.padEnd(maxLen))} │`);\n console.log(`├${border}┤`);\n content.forEach((line) => {\n console.log(`│ ${line.padEnd(maxLen)} │`);\n });\n console.log(`└${border}┘`);\n },\n};\n","import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { access, open, rename, rm, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport fs from \"fs-extra\";\nimport { glob } from \"glob\";\n\n/**\n * Copy directory with template variable replacement\n */\nexport async function copyTemplate(\n src: string,\n dest: string,\n variables: Record<string, string> = {},\n): Promise<void> {\n await fs.ensureDir(dest);\n\n const files = await glob(\"**/*\", {\n cwd: src,\n dot: true,\n nodir: true,\n ignore: [\"**/node_modules/**\", \"**/.git/**\", \"**/tmp/**\", \"**/bin/**\"],\n });\n\n for (const file of files) {\n const srcPath = path.join(src, file);\n let destPath = path.join(dest, file);\n if (path.basename(file) === \"_gitignore\") {\n destPath = path.join(path.dirname(destPath), \".gitignore\");\n }\n\n // Replace template variables in filename\n for (const [key, value] of Object.entries(variables)) {\n destPath = destPath.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"), () => value);\n }\n\n await fs.ensureDir(path.dirname(destPath));\n\n // Check if file is text and should be processed\n if (isTextFile(file)) {\n let content = await fs.readFile(srcPath, \"utf-8\");\n\n // Replace template variables in content\n for (const [key, value] of Object.entries(variables)) {\n content = content.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"), () => value);\n }\n\n await fs.writeFile(destPath, content);\n await fs.chmod(destPath, (await fs.stat(srcPath)).mode);\n } else {\n await fs.copy(srcPath, destPath);\n }\n }\n}\n\n/**\n * Copy specific files to destination\n */\nexport async function copyFiles(\n files: { src: string; dest: string }[],\n overwrite = false,\n): Promise<{ copied: string[]; skipped: string[] }> {\n const copied: string[] = [];\n const skipped: string[] = [];\n\n for (const { src, dest } of files) {\n if (!overwrite && (await fs.pathExists(dest))) {\n skipped.push(dest);\n continue;\n }\n\n await fs.ensureDir(path.dirname(dest));\n await fs.copy(src, dest);\n copied.push(dest);\n }\n\n return { copied, skipped };\n}\n\n/**\n * Check if file is a text file that should be processed for template variables\n */\nfunction isTextFile(filename: string): boolean {\n const textExtensions = [\n \".ts\",\n \".go\",\n \".mod\",\n \".sum\",\n \".sh\",\n \".mjs\",\n \".sql\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".vue\",\n \".json\",\n \".md\",\n \".yml\",\n \".yaml\",\n \".html\",\n \".css\",\n \".scss\",\n \".less\",\n \".txt\",\n \".env\",\n \".env.example\",\n \".gitignore\",\n \".prettierrc\",\n \".eslintrc\",\n \".editorconfig\",\n ];\n\n const ext = path.extname(filename).toLowerCase();\n const basename = path.basename(filename);\n\n return (\n textExtensions.includes(ext) || basename.startsWith(\".\") || !ext // Files without extension are often config files\n );\n}\n\n/**\n * Read and parse JSON file\n */\nexport async function readJson<T>(filePath: string): Promise<T | null> {\n try {\n return await fs.readJson(filePath);\n } catch {\n return null;\n }\n}\n\n/** 使用同目录原子替换发布格式化 JSON,调用方负责路径与数据校验。 */\nexport async function writeJson(filePath: string, data: unknown): Promise<void> {\n const serialized = JSON.stringify(data, null, 2);\n if (serialized === undefined) {\n throw new TypeError(\"JSON value is not serializable\");\n }\n\n let mode: number | undefined;\n try {\n const info = await stat(filePath);\n await access(filePath, constants.W_OK);\n mode = info.mode & 0o777;\n } catch (error) {\n if (!(error instanceof Error && \"code\" in error && error.code === \"ENOENT\")) {\n throw error;\n }\n }\n\n const temporary = path.join(\n path.dirname(filePath),\n `.${path.basename(filePath)}.${randomUUID()}.tmp`,\n );\n let handle;\n let created = false;\n\n try {\n handle = await open(temporary, \"wx\", mode);\n created = true;\n await handle.writeFile(`${serialized}\\n`, \"utf8\");\n if (mode !== undefined) await handle.chmod(mode);\n await handle.sync();\n await handle.close();\n handle = undefined;\n await rename(temporary, filePath);\n created = false;\n } catch (error) {\n const cleanupErrors: unknown[] = [];\n if (handle) {\n try {\n await handle.close();\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError);\n }\n }\n if (created) {\n try {\n await rm(temporary, { force: true });\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError);\n }\n }\n if (cleanupErrors.length > 0) {\n throw new AggregateError(\n [error, ...cleanupErrors],\n \"JSON file write failed and temporary cleanup was incomplete\",\n );\n }\n throw error;\n }\n}\n\n/**\n * Check if directory is empty\n */\nexport async function isDirEmpty(dir: string): Promise<boolean> {\n if (!(await fs.pathExists(dir))) return true;\n const files = await fs.readdir(dir);\n return files.length === 0;\n}\n\n/**\n * Get relative path from cwd\n */\nexport function relativePath(absolutePath: string): string {\n return path.relative(process.cwd(), absolutePath);\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { execa } from \"execa\";\nimport { type FRAMEWORK_PATTERNS } from \"./constants.js\";\n\nexport interface ProjectInfo {\n name: string;\n root: string;\n packageJson: Record<string, unknown> | null;\n framework: keyof typeof FRAMEWORK_PATTERNS | null;\n hasTypeScript: boolean;\n packageManager: \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n}\n\n/** 从当前目录识别项目。 */\nexport async function detectProject(cwd = process.cwd()): Promise<ProjectInfo> {\n const packageJsonPath = path.join(cwd, \"package.json\");\n const packageJson = (await fs.pathExists(packageJsonPath))\n ? await fs.readJson(packageJsonPath)\n : null;\n\n return {\n name: packageJson?.name || path.basename(cwd),\n root: cwd,\n packageJson,\n framework: detectFramework(packageJson),\n hasTypeScript: await hasTypeScript(cwd),\n packageManager: await detectPackageManager(cwd, packageJson),\n };\n}\n\n/** 从清单依赖识别框架。 */\nfunction detectFramework(\n packageJson: Record<string, unknown> | null,\n): keyof typeof FRAMEWORK_PATTERNS | null {\n if (!packageJson) return null;\n\n const deps = {\n ...(packageJson.dependencies as Record<string, string> | undefined),\n ...(packageJson.devDependencies as Record<string, string> | undefined),\n };\n\n if (deps.nuxt) return \"nuxt\";\n if (deps.vue) return \"vue\";\n if (deps.next || deps.react) return \"react\";\n if (deps.express || deps.fastify || deps[\"@modelcontextprotocol/sdk\"]) return \"node\";\n\n return null;\n}\n\n/** 判断项目是否使用 TypeScript。 */\nasync function hasTypeScript(cwd: string): Promise<boolean> {\n return (\n (await fs.pathExists(path.join(cwd, \"tsconfig.json\"))) ||\n (await fs.pathExists(path.join(cwd, \"tsconfig.base.json\")))\n );\n}\n\n/** 优先使用清单声明,再根据锁文件识别包管理器。 */\nasync function detectPackageManager(\n cwd: string,\n packageJson?: Record<string, unknown> | null,\n): Promise<\"npm\" | \"pnpm\" | \"yarn\" | \"bun\"> {\n const manifest =\n packageJson === undefined\n ? (await fs.pathExists(path.join(cwd, \"package.json\")))\n ? ((await fs.readJson(path.join(cwd, \"package.json\"))) as Record<string, unknown>)\n : null\n : packageJson;\n if (manifest?.packageManager !== undefined) {\n if (typeof manifest.packageManager !== \"string\") {\n throw new Error(\"packageManager must be a string in <name>@<version> format\");\n }\n const match = /^(npm|pnpm|yarn|bun)@[^\\s]+$/.exec(manifest.packageManager);\n if (!match) {\n throw new Error(`Unsupported packageManager: ${manifest.packageManager}`);\n }\n return match[1] as \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n }\n if (await fs.pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (await fs.pathExists(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n if (\n (await fs.pathExists(path.join(cwd, \"bun.lock\"))) ||\n (await fs.pathExists(path.join(cwd, \"bun.lockb\")))\n )\n return \"bun\";\n return \"npm\";\n}\n\n/** 使用项目声明的包管理器安装依赖。 */\nexport async function installDependencies(\n cwd: string,\n deps: string[],\n isDev = false,\n): Promise<void> {\n const pm = await detectPackageManager(cwd);\n\n const args: string[] = [];\n\n switch (pm) {\n case \"pnpm\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-D\");\n break;\n case \"yarn\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-D\");\n break;\n case \"bun\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-d\");\n break;\n default:\n args.push(\"install\", ...deps);\n if (isDev) args.push(\"--save-dev\");\n }\n\n await execa(pm, args, { cwd, stdio: \"inherit\" });\n}\n\n/** 安装项目清单中的完整依赖。 */\nexport async function runInstall(cwd: string): Promise<void> {\n const pm = await detectPackageManager(cwd);\n await execa(pm, [\"install\"], { cwd, stdio: \"inherit\" });\n}\n\n/** 初始化空 Git 仓库。 */\nexport async function initializeGitRepository(cwd: string): Promise<void> {\n await execa(\"git\", [\"init\"], { cwd });\n}\n\n/** 提交完成物化的项目状态。 */\nexport async function createInitialCommit(cwd: string): Promise<void> {\n await execa(\"git\", [\"add\", \"-A\"], { cwd });\n await execa(\"git\", [\"commit\", \"-m\", \"chore: initial commit\"], { cwd });\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { PATHS } from \"./constants.js\";\n\nexport interface ComponentMeta {\n name: string;\n description: string;\n files: RegistryFile[];\n dependencies: string[];\n devDependencies: string[];\n registryDependencies: string[];\n framework: \"nuxt\" | \"vue\" | \"react\" | \"universal\";\n category: string;\n installContext: ComponentInstallContext;\n}\n\nexport type ComponentInstallContext = \"standalone\" | \"template\";\n\nexport interface SnippetMeta {\n name: string;\n description: string;\n files: RegistryFile[];\n dependencies: string[];\n devDependencies: string[];\n framework: \"nuxt\" | \"vue\" | \"react\" | \"node\" | \"universal\";\n category: string;\n}\n\nexport type RegistryFile =\n | string\n | {\n path: string;\n target?: string;\n };\n\n/** 可安装的包:npm 普通依赖,或 Nuxt layer(装包 + patch extends) */\nexport interface PackageMeta {\n name: string;\n description: string;\n type: \"npm\" | \"layer\";\n version?: string;\n}\n\nexport interface Registry {\n components: Record<string, ComponentMeta>;\n snippets: Record<string, SnippetMeta>;\n packages: Record<string, PackageMeta>;\n}\n\nlet registryCache: Registry | null = null;\n\n/**\n * Load the component/snippet registry\n */\nexport async function loadRegistry(): Promise<Registry> {\n if (registryCache) return registryCache;\n\n const componentsRegistry = await loadComponentsRegistry();\n const snippetsRegistry = await loadSnippetsRegistry();\n const packagesRegistry = await loadPackagesRegistry();\n\n registryCache = {\n components: componentsRegistry,\n snippets: snippetsRegistry,\n packages: packagesRegistry,\n };\n\n return registryCache;\n}\n\nasync function loadPackagesRegistry(): Promise<Record<string, PackageMeta>> {\n if (await fs.pathExists(PATHS.packagesRegistry)) {\n return await fs.readJson(PATHS.packagesRegistry);\n }\n return {};\n}\n\nasync function loadComponentsRegistry(): Promise<Record<string, ComponentMeta>> {\n const registryPath = path.join(PATHS.components, \"registry.json\");\n if (await fs.pathExists(registryPath)) {\n return await fs.readJson(registryPath);\n }\n return {};\n}\n\nasync function loadSnippetsRegistry(): Promise<Record<string, SnippetMeta>> {\n const registryPath = path.join(PATHS.snippets, \"registry.json\");\n if (await fs.pathExists(registryPath)) {\n return await fs.readJson(registryPath);\n }\n return {};\n}\n\n/**\n * Resolve all dependencies for a component (including nested registry dependencies)\n */\nexport function resolveComponentDependencies(\n componentName: string,\n registry: Registry,\n installContext: ComponentInstallContext,\n resolved: Set<string> = new Set(),\n): ComponentMeta[] {\n if (resolved.has(componentName)) return [];\n\n const component = registry.components[componentName];\n if (!component) {\n throw new Error(`Component \"${componentName}\" not found in registry`);\n }\n if (component.installContext !== installContext) {\n throw new Error(\n `Component \"${componentName}\" is only available in the ${component.installContext} install context`,\n );\n }\n\n resolved.add(componentName);\n\n const deps: ComponentMeta[] = [];\n\n // Resolve registry dependencies first\n for (const depName of component.registryDependencies) {\n deps.push(...resolveComponentDependencies(depName, registry, installContext, resolved));\n }\n\n deps.push(component);\n return deps;\n}\n\n/**\n * Get all available components for a framework\n */\nexport function getComponentsByFramework(\n registry: Registry,\n framework: \"nuxt\" | \"vue\" | \"react\",\n installContext: ComponentInstallContext,\n): ComponentMeta[] {\n return Object.values(registry.components).filter(\n (c) =>\n c.installContext === installContext &&\n (c.framework === framework ||\n c.framework === \"universal\" ||\n (framework === \"nuxt\" && c.framework === \"vue\")),\n );\n}\n\n/**\n * Get all available snippets for a framework\n */\nexport function getSnippetsByFramework(\n registry: Registry,\n framework: \"nuxt\" | \"vue\" | \"react\" | \"node\",\n): SnippetMeta[] {\n return Object.values(registry.snippets).filter(\n (s) =>\n s.framework === framework ||\n s.framework === \"universal\" ||\n (framework === \"nuxt\" && s.framework === \"vue\"),\n );\n}\n\n/**\n * Group items by category\n */\nexport function groupByCategory<T extends { category: string }>(items: T[]): Record<string, T[]> {\n return items.reduce(\n (acc, item) => {\n if (!acc[item.category]) {\n acc[item.category] = [];\n }\n acc[item.category].push(item);\n return acc;\n },\n {} as Record<string, T[]>,\n );\n}\n","import path from \"path\";\nimport { DEFAULT_PATHS, PATHS } from \"./constants.js\";\nimport {\n resolveComponentDependencies,\n type ComponentInstallContext,\n type ComponentMeta,\n type Registry,\n type RegistryFile,\n} from \"./registry.js\";\n\nexport type ComponentFramework = \"nuxt\" | \"vue\" | \"react\";\n\nexport interface ComponentInstallPlan {\n components: ComponentMeta[];\n dependencies: string[];\n devDependencies: string[];\n filesToCopy: { src: string; dest: string }[];\n}\n\nexport function resolveComponentFramework(framework: string | null): ComponentFramework | null {\n if (framework === \"nuxt\" || framework === \"vue\" || framework === \"react\") {\n return framework;\n }\n return null;\n}\n\nexport function findComponentKey(registry: Registry, component: ComponentMeta): string {\n const match = Object.entries(registry.components).find(\n ([, candidate]) => candidate === component,\n );\n return match?.[0] ?? component.name.toLowerCase();\n}\n\nexport function buildComponentInstallPlan(input: {\n componentKeys: string[];\n framework: ComponentFramework;\n projectRoot: string;\n registry: Registry;\n installContext: ComponentInstallContext;\n targetBase?: string;\n}): ComponentInstallPlan {\n const selectedComponents = input.componentKeys.flatMap((key) =>\n resolveComponentDependencies(key, input.registry, input.installContext),\n );\n const components = [\n ...new Map(\n selectedComponents.map((component) => [\n findComponentKey(input.registry, component),\n component,\n ]),\n ).values(),\n ];\n\n const filesToCopy = components.flatMap((component) =>\n component.files.map((file) =>\n resolveComponentFile({\n component,\n file,\n framework: input.framework,\n projectRoot: input.projectRoot,\n targetBase: input.targetBase,\n }),\n ),\n );\n\n return {\n components,\n dependencies: [...new Set(components.flatMap((component) => component.dependencies))],\n devDependencies: [...new Set(components.flatMap((component) => component.devDependencies))],\n filesToCopy,\n };\n}\n\nfunction resolveComponentFile(input: {\n component: ComponentMeta;\n file: RegistryFile;\n framework: ComponentFramework;\n projectRoot: string;\n targetBase?: string;\n}): { src: string; dest: string } {\n const normalized = typeof input.file === \"string\" ? { path: input.file } : input.file;\n const sourceFramework =\n input.component.framework === \"universal\" ? input.framework : input.component.framework;\n const sourcePath = path.join(PATHS.components, sourceFramework, normalized.path);\n\n if (normalized.target) {\n return {\n src: sourcePath,\n dest: path.resolve(input.projectRoot, normalized.target),\n };\n }\n\n const targetBase =\n input.targetBase || DEFAULT_PATHS[input.framework]?.components || \"src/components\";\n\n return {\n src: sourcePath,\n dest: path.resolve(input.projectRoot, targetBase, path.basename(normalized.path)),\n };\n}\n","import type { Config, Environment, Profile, Target } from \"./config.js\";\n\nexport type ArtifactKind = \"directory\" | \"oci\" | \"oci-set\";\nexport type Operation = \"build\" | \"publish\" | \"release\" | \"verify\" | \"rollback\" | \"reconcile\";\n\ntype RolloutKind = \"none\" | \"atomic-link\" | \"recreate\" | \"blue-green\" | \"stack\";\ntype Requirement = \"required\" | \"optional\" | \"forbidden\";\n\ninterface Combination {\n readonly target: Target;\n readonly rollouts: readonly RolloutKind[];\n}\n\ninterface Policy {\n readonly artifact: ArtifactKind;\n readonly image: Requirement;\n readonly output: Requirement;\n readonly combinations: readonly Combination[];\n}\n\nexport type CompatibilityErrorCode =\n | \"unknown_environment\"\n | \"unsupported_target\"\n | \"unsupported_rollout\"\n | \"unsupported_operation\"\n | \"image_required\"\n | \"image_forbidden\"\n | \"output_required\";\n\nconst policies = {\n \"static-files\": {\n artifact: \"directory\",\n image: \"forbidden\",\n output: \"required\",\n combinations: [{ target: \"ssh-directory\", rollouts: [\"atomic-link\"] }],\n },\n \"static-nginx\": {\n artifact: \"oci\",\n image: \"required\",\n output: \"required\",\n combinations: [\n { target: \"registry-only\", rollouts: [\"none\"] },\n { target: \"compose-host\", rollouts: [\"recreate\", \"blue-green\"] },\n ],\n },\n \"nuxt-node\": {\n artifact: \"oci\",\n image: \"required\",\n output: \"required\",\n combinations: [\n { target: \"registry-only\", rollouts: [\"none\"] },\n { target: \"compose-host\", rollouts: [\"recreate\", \"blue-green\"] },\n ],\n },\n \"go-service\": {\n artifact: \"oci\",\n image: \"required\",\n output: \"optional\",\n combinations: [\n { target: \"registry-only\", rollouts: [\"none\"] },\n { target: \"compose-host\", rollouts: [\"recreate\", \"blue-green\"] },\n ],\n },\n \"compose-stack\": {\n artifact: \"oci-set\",\n image: \"optional\",\n output: \"optional\",\n combinations: [{ target: \"compose-host\", rollouts: [\"stack\"] }],\n },\n} as const satisfies Record<Profile, Policy>;\n\nconst runtimeOperations = [\"release\", \"verify\", \"rollback\", \"reconcile\"] as const;\nconst allOperations = [\"build\", \"publish\", ...runtimeOperations] as const;\nconst operationsByTarget: Readonly<Record<Target, readonly Operation[]>> = {\n \"registry-only\": [\"build\", \"publish\"],\n \"ssh-directory\": allOperations,\n \"compose-host\": allOperations,\n};\n\n/** 兼容性错误仅携带稳定分类和安全的公开选择值。 */\nexport class CompatibilityError extends Error {\n constructor(\n readonly code: CompatibilityErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"CompatibilityError\";\n }\n}\n\nfunction rolloutKind(environment: Environment): RolloutKind {\n if (!(\"rollout\" in environment)) return \"none\";\n if (\"strategy\" in environment.rollout) return environment.rollout.strategy;\n return \"stack\";\n}\n\nfunction assertProfileInputs(config: Config, policy: Policy): void {\n if (policy.image === \"required\" && !config.image) {\n throw new CompatibilityError(\n \"image_required\",\n `Profile ${config.profile} requires image configuration`,\n );\n }\n if (policy.image === \"forbidden\" && config.image) {\n throw new CompatibilityError(\n \"image_forbidden\",\n `Profile ${config.profile} does not accept image configuration`,\n );\n }\n if (policy.output === \"required\" && !config.source.output) {\n throw new CompatibilityError(\n \"output_required\",\n `Profile ${config.profile} requires a source output path`,\n );\n }\n}\n\nfunction assertEnvironment(profile: Profile, environment: Environment, policy: Policy): void {\n const combination = policy.combinations.find(\n (candidate) => candidate.target === environment.target,\n );\n if (!combination) {\n throw new CompatibilityError(\n \"unsupported_target\",\n `Profile ${profile} does not support target ${environment.target}`,\n );\n }\n\n const rollout = rolloutKind(environment);\n if (!combination.rollouts.includes(rollout)) {\n throw new CompatibilityError(\n \"unsupported_rollout\",\n `Profile ${profile} does not support rollout ${rollout} on target ${environment.target}`,\n );\n }\n}\n\n/** 返回配置档案产生的不可变制品类别。 */\nexport function artifactKind(profile: Profile): ArtifactKind {\n return policies[profile].artifact;\n}\n\n/** 在执行前验证配置内每个环境都属于声明的兼容组合。 */\nexport function assertConfig(config: Config): void {\n const policy = policies[config.profile];\n assertProfileInputs(config, policy);\n for (const environment of Object.values(config.environments)) {\n assertEnvironment(config.profile, environment, policy);\n }\n}\n\n/** 选择环境时同时验证配置组合和该目标允许的操作边界。 */\nexport function assertCompatible(\n config: Config,\n environmentName: string,\n operation?: Operation,\n): Environment {\n const environment = config.environments[environmentName];\n if (!environment) {\n throw new CompatibilityError(\n \"unknown_environment\",\n `Unknown deployment environment: ${environmentName}`,\n );\n }\n\n const policy = policies[config.profile];\n assertProfileInputs(config, policy);\n assertEnvironment(config.profile, environment, policy);\n\n if (operation && !operationsByTarget[environment.target].includes(operation)) {\n throw new CompatibilityError(\n \"unsupported_operation\",\n `Target ${environment.target} does not support operation ${operation}`,\n );\n }\n\n return environment;\n}\n","import path from \"node:path\";\n\nimport { z } from \"zod\";\n\nconst MAX_HEALTH_ATTEMPTS = 100;\nconst MAX_HEALTH_INTERVAL_MS = 300_000;\nconst MAX_HEALTH_TIMEOUT_MS = 600_000;\nconst MAX_PATH_LENGTH = 4_096;\nconst ENV_NAME = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;\nconst PORT_TEXT = /^[1-9][0-9]{0,4}$/;\nconst TRANSPORT_ENV_NAMES = new Set([\n \"DEPLOY_REGISTRY_HOST\",\n \"DEPLOY_REGISTRY_NAMESPACE\",\n \"DEPLOY_REGISTRY_PASSWORD\",\n \"DEPLOY_REGISTRY_USERNAME\",\n \"DEPLOY_SSH_HOST\",\n \"DEPLOY_SSH_KEY\",\n \"DEPLOY_SSH_KNOWN_HOSTS\",\n \"DEPLOY_SSH_PORT\",\n \"DEPLOY_SSH_USER\",\n]);\n\nexport const DEFAULT_RELEASE_RETENTION = 5;\n\nconst dnsLabelSchema = z\n .string()\n .min(1)\n .max(63)\n .regex(/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/);\n\nconst repositoryPathSchema = z\n .string()\n .min(1)\n .max(MAX_PATH_LENGTH)\n .refine((value) => !value.includes(\"\\0\") && !value.includes(\"\\n\") && !value.includes(\"\\r\"), {\n message: \"Repository path must not contain control characters\",\n })\n .refine(\n (value) =>\n !path.posix.isAbsolute(value) && !path.win32.isAbsolute(value) && !/^[A-Za-z]:/.test(value),\n { message: \"Repository path must be relative to the project root\" },\n )\n .refine(\n (value) =>\n !value\n .replaceAll(\"\\\\\", \"/\")\n .split(\"/\")\n .some((segment) => segment === \"..\"),\n { message: \"Repository path must remain inside the project root\" },\n );\n\nconst remoteRootSchema = z\n .string()\n .min(1)\n .max(MAX_PATH_LENGTH)\n .refine((value) => !value.includes(\"\\0\") && !value.includes(\"\\n\") && !value.includes(\"\\r\"), {\n message: \"Target root must not contain control characters\",\n })\n .refine((value) => path.posix.isAbsolute(value), {\n message: \"Target root must be an absolute POSIX path\",\n })\n .refine((value) => path.posix.normalize(value) !== \"/\", {\n message: \"Target root must not be the filesystem root\",\n })\n .refine((value) => !value.split(\"/\").some((segment) => segment === \"..\"), {\n message: \"Target root must not contain parent traversal\",\n });\n\nconst executableSchema = z\n .string()\n .min(1)\n .max(MAX_PATH_LENGTH)\n .refine((value) => value.trim().length > 0, { message: \"Executable must not be blank\" })\n .refine((value) => !value.includes(\"\\0\") && !value.includes(\"\\n\") && !value.includes(\"\\r\"), {\n message: \"Executable must not contain control characters\",\n })\n .refine(\n (value) => {\n if (!value.includes(\"/\") && !value.includes(\"\\\\\")) return true;\n if (path.posix.isAbsolute(value) || path.win32.isAbsolute(value)) return true;\n return !value\n .replaceAll(\"\\\\\", \"/\")\n .split(\"/\")\n .some((segment) => segment === \"..\");\n },\n { message: \"Relative executable path must remain inside the project root\" },\n );\n\nconst healthUrlSchema = z.url({ protocol: /^https?$/ }).superRefine((value, context) => {\n const url = new URL(value);\n if (url.username || url.password) {\n context.addIssue({\n code: \"custom\",\n message: \"Health URL must not contain credentials\",\n });\n }\n if (url.hash) {\n context.addIssue({\n code: \"custom\",\n message: \"Health URL must not contain a fragment\",\n });\n }\n});\n\nexport const envRefSchema = z.strictObject({\n env: z.string().min(1).max(128).regex(ENV_NAME, \"Environment name must use UPPER_SNAKE_CASE\"),\n});\n\nconst portSchema = z.number().int().min(1).max(65_535);\n\nexport const portBindingSchema = z.strictObject({\n service: dnsLabelSchema,\n host: z.enum([\"127.0.0.1\", \"::1\"]),\n targetPort: portSchema,\n publishedPort: portSchema,\n protocol: z.literal(\"tcp\"),\n});\n\nexport const portBindingsSchema = z\n .array(portBindingSchema)\n .min(1)\n .superRefine(validatePortBindings)\n .readonly();\n\nconst portBindingInputSchema = portBindingSchema.extend({\n publishedPort: z.union([portSchema, envRefSchema]),\n});\n\nconst portBindingsInputSchema = z\n .array(portBindingInputSchema)\n .min(1)\n .superRefine(validatePortBindings)\n .readonly();\n\nexport const profileSchema = z.enum([\n \"static-files\",\n \"static-nginx\",\n \"nuxt-node\",\n \"go-service\",\n \"compose-stack\",\n]);\n\nexport const ciSchema = z.enum([\"github\", \"onedev\"]);\nexport const targetSchema = z.enum([\"registry-only\", \"ssh-directory\", \"compose-host\"]);\nexport const strategySchema = z.enum([\"atomic-link\", \"recreate\", \"blue-green\"]);\n\nexport const commandSchema = z\n .strictObject({\n executable: executableSchema,\n args: z.array(z.string().max(MAX_PATH_LENGTH)).readonly(),\n env: z.array(z.string().min(1).max(128).regex(ENV_NAME)).max(128).readonly().optional(),\n })\n .superRefine((value, context) => {\n if (!value.env) return;\n if (new Set(value.env).size !== value.env.length) {\n context.addIssue({\n code: \"custom\",\n path: [\"env\"],\n message: \"Command environment names must be unique\",\n });\n }\n for (const [index, name] of value.env.entries()) {\n if (!TRANSPORT_ENV_NAMES.has(name)) continue;\n context.addIssue({\n code: \"custom\",\n path: [\"env\", index],\n message: \"Transport environment names cannot be inherited by commands\",\n });\n }\n });\n\nexport const sourceSchema = z.strictObject({\n verify: commandSchema,\n build: commandSchema,\n output: repositoryPathSchema.optional(),\n});\n\nexport const imageSchema = z.strictObject({\n dockerfile: repositoryPathSchema,\n context: repositoryPathSchema,\n repository: z\n .string()\n .min(1)\n .max(255)\n .regex(/^[a-z0-9]+(?:[._/-][a-z0-9]+)*$/),\n platform: z\n .string()\n .min(1)\n .max(128)\n .regex(/^[a-z0-9]+\\/[a-z0-9][a-z0-9._-]*(?:\\/[a-z0-9][a-z0-9._-]*)?$/),\n});\n\nexport const healthSchema = z.strictObject({\n url: healthUrlSchema,\n method: z.enum([\"GET\", \"HEAD\"]),\n expectedStatus: z.number().int().min(100).max(599),\n attempts: z.number().int().positive().max(MAX_HEALTH_ATTEMPTS),\n intervalMs: z.number().int().positive().max(MAX_HEALTH_INTERVAL_MS),\n timeoutMs: z.number().int().positive().max(MAX_HEALTH_TIMEOUT_MS),\n});\n\nconst healthInputSchema = healthSchema.extend({\n url: z.union([healthUrlSchema, envRefSchema]),\n});\n\nexport const retentionSchema = z.strictObject({\n releases: z.number().int().positive().max(1_000).default(DEFAULT_RELEASE_RETENTION),\n buildCacheMax: z\n .string()\n .min(1)\n .max(64)\n .refine((value) => value.trim().length > 0, {\n message: \"Build cache bound must not be blank\",\n })\n .refine((value) => !value.includes(\"\\0\") && !value.includes(\"\\n\") && !value.includes(\"\\r\"), {\n message: \"Build cache bound must not contain control characters\",\n }),\n});\n\nexport const lifecycleSchema = z\n .strictObject({\n inspect: commandSchema,\n preflight: commandSchema.optional(),\n migrate: commandSchema.optional(),\n beforeActivate: commandSchema.optional(),\n afterActivate: commandSchema.optional(),\n assessRollback: commandSchema.optional(),\n recover: commandSchema.optional(),\n })\n .superRefine((value, context) => {\n if (!value.migrate) return;\n\n for (const dependency of [\"preflight\", \"assessRollback\", \"recover\"] as const) {\n if (value[dependency]) continue;\n context.addIssue({\n code: \"custom\",\n path: [dependency],\n message: `${dependency} is required when migrate is configured`,\n });\n }\n });\n\nexport const atomicLinkRolloutSchema = z.strictObject({\n strategy: z.literal(\"atomic-link\"),\n});\n\nexport const recreateRolloutSchema = z.strictObject({\n strategy: z.literal(\"recreate\"),\n});\n\nconst previewHealthSchema = z.union([\n healthSchema,\n z.strictObject({ blue: healthSchema, green: healthSchema }),\n]);\n\nconst previewHealthInputSchema = z.union([\n healthInputSchema,\n z.strictObject({ blue: healthInputSchema, green: healthInputSchema }),\n]);\n\nexport const blueGreenRolloutSchema = z.strictObject({\n strategy: z.literal(\"blue-green\"),\n ports: z\n .strictObject({\n blue: portBindingsSchema,\n green: portBindingsSchema,\n })\n .superRefine(validateSlotBindings)\n .optional(),\n previewHealth: previewHealthSchema,\n traffic: z.strictObject({\n inspect: commandSchema,\n activate: commandSchema,\n recover: commandSchema,\n }),\n});\n\nconst blueGreenRolloutInputSchema = blueGreenRolloutSchema.extend({\n previewHealth: previewHealthInputSchema,\n});\n\nexport const containerRolloutSchema = z.discriminatedUnion(\"strategy\", [\n recreateRolloutSchema,\n blueGreenRolloutSchema,\n]);\n\nexport const rolloutSchema = z.discriminatedUnion(\"strategy\", [\n atomicLinkRolloutSchema,\n recreateRolloutSchema,\n blueGreenRolloutSchema,\n]);\n\nexport const stackRolloutSchema = z.strictObject({\n default: recreateRolloutSchema,\n workloads: z\n .record(dnsLabelSchema, containerRolloutSchema)\n .refine((value) => Object.keys(value).length > 0, {\n message: \"Stack rollout must declare at least one workload\",\n }),\n});\n\nexport const registryEnvironmentSchema = z.strictObject({\n target: z.literal(\"registry-only\"),\n});\n\nexport const directoryEnvironmentSchema = z.strictObject({\n target: z.literal(\"ssh-directory\"),\n root: remoteRootSchema,\n rollout: atomicLinkRolloutSchema,\n health: healthSchema,\n retention: retentionSchema.optional(),\n});\n\nexport const composeEnvironmentSchema = z.strictObject({\n target: z.literal(\"compose-host\"),\n root: remoteRootSchema,\n compose: z.tuple([repositoryPathSchema], repositoryPathSchema).readonly(),\n bindings: portBindingsSchema.optional(),\n rollout: z.union([containerRolloutSchema, stackRolloutSchema]),\n health: healthSchema,\n lifecycle: lifecycleSchema.optional(),\n retention: retentionSchema.optional(),\n});\n\nexport const environmentSchema = z.discriminatedUnion(\"target\", [\n registryEnvironmentSchema,\n directoryEnvironmentSchema,\n composeEnvironmentSchema,\n]);\n\nconst containerRolloutInputSchema = z.discriminatedUnion(\"strategy\", [\n recreateRolloutSchema,\n blueGreenRolloutInputSchema.extend({\n ports: z\n .strictObject({\n blue: portBindingsInputSchema,\n green: portBindingsInputSchema,\n })\n .superRefine(validateSlotBindings)\n .optional(),\n }),\n]);\n\nconst stackRolloutInputSchema = z.strictObject({\n default: recreateRolloutSchema,\n workloads: z\n .record(dnsLabelSchema, containerRolloutInputSchema)\n .refine((value) => Object.keys(value).length > 0, {\n message: \"Stack rollout must declare at least one workload\",\n }),\n});\n\nconst directoryEnvironmentInputSchema = directoryEnvironmentSchema.extend({\n root: z.union([remoteRootSchema, envRefSchema]),\n health: healthInputSchema,\n});\n\nconst composeEnvironmentInputSchema = composeEnvironmentSchema.extend({\n root: z.union([remoteRootSchema, envRefSchema]),\n bindings: portBindingsInputSchema.optional(),\n rollout: z.union([containerRolloutInputSchema, stackRolloutInputSchema]),\n health: healthInputSchema,\n});\n\nconst environmentInputSchema = z.discriminatedUnion(\"target\", [\n registryEnvironmentSchema,\n directoryEnvironmentInputSchema,\n composeEnvironmentInputSchema,\n]);\n\ntype EnvironmentInput = z.infer<typeof environmentInputSchema>;\n\nfunction validateProductionHealth(\n value: { environments: Record<string, EnvironmentInput> },\n context: z.RefinementCtx,\n): void {\n const production = value.environments.production;\n if (!production || production.target === \"registry-only\") return;\n\n const publicHealth = production.health.url;\n if (typeof publicHealth === \"string\" && new URL(publicHealth).protocol !== \"https:\") {\n context.addIssue({\n code: \"custom\",\n path: [\"environments\", \"production\", \"health\", \"url\"],\n message: \"Production public health URL must use HTTPS\",\n });\n }\n\n const previewHealth = [\n ...(production.target === \"compose-host\" &&\n \"strategy\" in production.rollout &&\n production.rollout.strategy === \"blue-green\"\n ? previewHealthPaths([\"rollout\", \"previewHealth\"], production.rollout.previewHealth)\n : []),\n ...(production.target === \"compose-host\" && !(\"strategy\" in production.rollout)\n ? Object.entries(production.rollout.workloads).flatMap(([workload, rollout]) =>\n rollout.strategy === \"blue-green\"\n ? previewHealthPaths(\n [\"rollout\", \"workloads\", workload, \"previewHealth\"],\n rollout.previewHealth,\n )\n : [],\n )\n : []),\n ];\n\n for (const health of previewHealth) {\n if (typeof health.value !== \"string\") continue;\n const url = new URL(health.value);\n if (\n url.protocol === \"https:\" ||\n (url.protocol === \"http:\" && [\"127.0.0.1\", \"[::1]\", \"::1\"].includes(url.hostname))\n ) {\n continue;\n }\n context.addIssue({\n code: \"custom\",\n path: [\"environments\", \"production\", ...health.path],\n message: \"Production preview health URL must use HTTPS or loopback HTTP\",\n });\n }\n}\n\nfunction previewHealthPaths(\n path: readonly string[],\n health: z.infer<typeof previewHealthSchema> | z.infer<typeof previewHealthInputSchema>,\n): readonly { readonly path: readonly string[]; readonly value: unknown }[] {\n if (\"url\" in health) return [{ path: [...path, \"url\"], value: health.url }];\n return [\n { path: [...path, \"blue\", \"url\"], value: health.blue.url },\n { path: [...path, \"green\", \"url\"], value: health.green.url },\n ];\n}\n\nexport const configSchema = z\n .strictObject({\n schemaVersion: z.literal(1),\n name: dnsLabelSchema,\n profile: profileSchema,\n source: sourceSchema,\n image: imageSchema.optional(),\n environments: z\n .record(dnsLabelSchema, environmentSchema)\n .refine((value) => Object.keys(value).length > 0, {\n message: \"At least one deployment environment is required\",\n }),\n })\n .superRefine(validateProductionHealth)\n .superRefine(validateBindingServices);\n\nconst inputSchema = z\n .strictObject({\n schemaVersion: z.literal(1),\n name: dnsLabelSchema,\n profile: profileSchema,\n source: sourceSchema,\n image: imageSchema.optional(),\n environments: z\n .record(dnsLabelSchema, environmentInputSchema)\n .refine((value) => Object.keys(value).length > 0, {\n message: \"At least one deployment environment is required\",\n }),\n })\n .superRefine(validateProductionHealth)\n .superRefine(validateBindingServices);\n\nconst initBase = {\n profile: profileSchema,\n};\n\nconst noCaller = {\n ci: z.never().optional(),\n stackonwardRef: z.never().optional(),\n};\n\nconst caller = {\n ci: ciSchema,\n stackonwardRef: z\n .string()\n .regex(/^[0-9a-f]{40}$/i, \"StackOnward ref must be a full 40-hex commit\")\n .transform((value) => value.toLowerCase()),\n};\n\nconst registryInit = {\n ...initBase,\n target: z.literal(\"registry-only\"),\n rollout: z.never().optional(),\n};\n\nconst directoryInit = {\n ...initBase,\n target: z.literal(\"ssh-directory\"),\n rollout: z.literal(\"atomic-link\"),\n};\n\nconst composeInit = {\n ...initBase,\n target: z.literal(\"compose-host\"),\n rollout: z.enum([\"recreate\", \"blue-green\"]),\n};\n\nexport const initInputSchema = z.union([\n z.strictObject({ ...registryInit, ...noCaller }),\n z.strictObject({ ...registryInit, ...caller }),\n z.strictObject({ ...directoryInit, ...noCaller }),\n z.strictObject({ ...directoryInit, ...caller }),\n z.strictObject({ ...composeInit, ...noCaller }),\n z.strictObject({ ...composeInit, ...caller }),\n]);\n\nexport type Profile = z.infer<typeof profileSchema>;\nexport type CI = z.infer<typeof ciSchema>;\nexport type Target = z.infer<typeof targetSchema>;\nexport type Strategy = z.infer<typeof strategySchema>;\nexport type Command = z.infer<typeof commandSchema>;\nexport type Source = z.infer<typeof sourceSchema>;\nexport type Image = z.infer<typeof imageSchema>;\nexport type PortBinding = z.infer<typeof portBindingSchema>;\nexport type Health = z.infer<typeof healthSchema>;\nexport type Retention = z.infer<typeof retentionSchema>;\nexport type Lifecycle = z.infer<typeof lifecycleSchema>;\nexport type AtomicLinkRollout = z.infer<typeof atomicLinkRolloutSchema>;\nexport type RecreateRollout = z.infer<typeof recreateRolloutSchema>;\nexport type BlueGreenRollout = z.infer<typeof blueGreenRolloutSchema>;\nexport type ContainerRollout = z.infer<typeof containerRolloutSchema>;\nexport type Rollout = z.infer<typeof rolloutSchema>;\nexport type StackRollout = z.infer<typeof stackRolloutSchema>;\nexport type RegistryEnvironment = z.infer<typeof registryEnvironmentSchema>;\nexport type DirectoryEnvironment = z.infer<typeof directoryEnvironmentSchema>;\nexport type ComposeEnvironment = z.infer<typeof composeEnvironmentSchema>;\nexport type Environment = z.infer<typeof environmentSchema>;\nexport type Config = z.infer<typeof configSchema>;\nexport type EnvRef = z.infer<typeof envRefSchema>;\nexport type InitInput = z.infer<typeof initInputSchema>;\nexport type ConfigInput = unknown;\n\nexport type ConfigErrorCode = \"unknown_environment\" | \"env_missing\" | \"env_empty\" | \"env_invalid\";\n\nexport interface LoadOptions {\n readonly environmentName: string;\n readonly env: Readonly<Record<string, string | undefined>>;\n}\n\n/** 配置错误只公开环境变量名,不携带环境值。 */\nexport class ConfigError extends Error {\n constructor(\n readonly code: ConfigErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n\n/** 将外部 JSON 收敛为部署模块唯一可信的配置合同。 */\nexport function parseConfig(input: ConfigInput): Config {\n return configSchema.parse(input);\n}\n\n/** 完整校验配置源,只解析当前执行环境并返回下游唯一的已解析配置。 */\nexport function loadConfig(input: ConfigInput, options: LoadOptions): Config {\n const source = inputSchema.parse(input);\n const selected = source.environments[options.environmentName];\n if (!selected) {\n throw new ConfigError(\n \"unknown_environment\",\n `Unknown deployment environment: ${options.environmentName}`,\n );\n }\n const environment = resolveEnvironment(selected, options.env);\n return configSchema.parse({\n ...source,\n environments: { [options.environmentName]: environment },\n });\n}\n\n/** 在任何模板写入前验证完整且目标一致的初始化选择。 */\nexport function parseInitInput(input: unknown): InitInput {\n return initInputSchema.parse(input);\n}\n\nfunction resolveEnvironment(input: EnvironmentInput, env: LoadOptions[\"env\"]): Environment {\n if (input.target === \"registry-only\") return input;\n if (input.target === \"ssh-directory\") {\n return directoryEnvironmentSchema.parse({\n ...input,\n root: resolveValue(input.root, env),\n health: resolveHealth(input.health, env),\n });\n }\n return composeEnvironmentSchema.parse({\n ...input,\n root: resolveValue(input.root, env),\n ...(input.bindings ? { bindings: resolveBindings(input.bindings, env) } : {}),\n rollout: resolveRollout(input.rollout, env),\n health: resolveHealth(input.health, env),\n });\n}\n\nfunction resolveHealth(input: z.infer<typeof healthInputSchema>, env: LoadOptions[\"env\"]): Health {\n return healthSchema.parse({ ...input, url: resolveValue(input.url, env) });\n}\n\nfunction resolveRollout(\n input: z.infer<typeof composeEnvironmentInputSchema>[\"rollout\"],\n env: LoadOptions[\"env\"],\n): ContainerRollout | StackRollout {\n if (\"strategy\" in input) return resolveContainerRollout(input, env);\n return stackRolloutSchema.parse({\n default: input.default,\n workloads: Object.fromEntries(\n Object.entries(input.workloads).map(([workload, rollout]) => [\n workload,\n resolveContainerRollout(rollout, env),\n ]),\n ),\n });\n}\n\nfunction resolveContainerRollout(\n input: z.infer<typeof containerRolloutInputSchema>,\n env: LoadOptions[\"env\"],\n): ContainerRollout {\n if (input.strategy === \"recreate\") return input;\n return blueGreenRolloutSchema.parse({\n ...input,\n ...(input.ports\n ? {\n ports: {\n blue: resolveBindings(input.ports.blue, env),\n green: resolveBindings(input.ports.green, env),\n },\n }\n : {}),\n previewHealth: resolvePreviewHealth(input.previewHealth, env),\n });\n}\n\nfunction resolvePreviewHealth(\n input: z.infer<typeof previewHealthInputSchema>,\n env: LoadOptions[\"env\"],\n): z.infer<typeof previewHealthSchema> {\n if (\"url\" in input) return resolveHealth(input, env);\n return {\n blue: resolveHealth(input.blue, env),\n green: resolveHealth(input.green, env),\n };\n}\n\nfunction resolveBindings(\n bindings: z.infer<typeof portBindingsInputSchema>,\n env: LoadOptions[\"env\"],\n): readonly PortBinding[] {\n return portBindingsSchema.parse(\n bindings.map((binding) => ({\n ...binding,\n publishedPort: resolvePort(binding.publishedPort, env),\n })),\n );\n}\n\nfunction resolvePort(input: number | EnvRef, env: LoadOptions[\"env\"]): number {\n if (typeof input === \"number\") return input;\n const value = resolveValue(input, env);\n if (!PORT_TEXT.test(value)) {\n throw new ConfigError(\"env_invalid\", `Environment value is not a valid port: ${input.env}`);\n }\n const parsed = portSchema.safeParse(Number(value));\n if (!parsed.success) {\n throw new ConfigError(\"env_invalid\", `Environment value is not a valid port: ${input.env}`);\n }\n return parsed.data;\n}\n\nfunction resolveValue(input: string | EnvRef, env: LoadOptions[\"env\"]): string {\n if (typeof input === \"string\") return input;\n const value = env[input.env];\n if (!Object.hasOwn(env, input.env) || value === undefined) {\n throw new ConfigError(\"env_missing\", `Environment value is missing: ${input.env}`);\n }\n if (value.trim().length === 0) {\n throw new ConfigError(\"env_empty\", `Environment value is empty: ${input.env}`);\n }\n return value;\n}\n\nfunction validatePortBindings(\n bindings: readonly z.infer<typeof portBindingInputSchema>[],\n context: z.RefinementCtx,\n): void {\n const mappings = new Set<string>();\n const endpoints = new Set<string>();\n for (let index = 0; index < bindings.length; index += 1) {\n const binding = bindings[index];\n if (!binding) continue;\n const published =\n typeof binding.publishedPort === \"number\"\n ? String(binding.publishedPort)\n : `env:${binding.publishedPort.env}`;\n const mapping = [\n binding.service,\n binding.host,\n binding.targetPort,\n published,\n binding.protocol,\n ].join(\"/\");\n if (mappings.has(mapping)) {\n context.addIssue({\n code: \"custom\",\n path: [index],\n message: \"Compose port bindings must be unique\",\n });\n }\n mappings.add(mapping);\n\n const endpoint = [binding.host, published, binding.protocol].join(\"/\");\n if (endpoints.has(endpoint)) {\n context.addIssue({\n code: \"custom\",\n path: [index, \"publishedPort\"],\n message: \"Compose host endpoints must be unique\",\n });\n }\n endpoints.add(endpoint);\n }\n}\n\nfunction validateSlotBindings(\n value: { readonly blue: readonly unknown[]; readonly green: readonly unknown[] },\n context: z.RefinementCtx,\n): void {\n if (value.blue.length !== value.green.length) {\n context.addIssue({\n code: \"custom\",\n path: [\"green\"],\n message: \"Blue-green slot bindings must declare the same number of mappings\",\n });\n }\n const blue = value.blue as readonly z.infer<typeof portBindingSchema>[];\n const green = value.green as readonly z.infer<typeof portBindingSchema>[];\n for (let index = 0; index < Math.min(blue.length, green.length); index += 1) {\n const left = blue[index];\n const right = green[index];\n if (!left || !right) continue;\n if (\n left.service !== right.service ||\n left.host !== right.host ||\n left.targetPort !== right.targetPort ||\n left.protocol !== right.protocol\n ) {\n context.addIssue({\n code: \"custom\",\n path: [\"green\", index],\n message: \"Blue-green slot bindings must preserve service endpoints\",\n });\n }\n }\n}\n\nfunction validateBindingServices(\n value: {\n profile: z.infer<typeof profileSchema>;\n environments: Record<string, EnvironmentInput>;\n },\n context: z.RefinementCtx,\n): void {\n for (const [environmentName, environment] of Object.entries(value.environments)) {\n if (environment.target !== \"compose-host\" || !environment.bindings) continue;\n const services =\n value.profile === \"compose-stack\" && !(\"strategy\" in environment.rollout)\n ? new Set(Object.keys(environment.rollout.workloads))\n : new Set([\"app\"]);\n for (let index = 0; index < environment.bindings.length; index += 1) {\n const binding = environment.bindings[index];\n if (!binding || services.has(binding.service)) continue;\n context.addIssue({\n code: \"custom\",\n path: [\"environments\", environmentName, \"bindings\", index, \"service\"],\n message:\n value.profile === \"compose-stack\"\n ? \"Compose stack bindings must reference a declared workload\"\n : \"Single-image bindings must reference the app service\",\n });\n }\n }\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { PATHS, DEFAULT_PATHS } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { copyFiles } from \"../utils/fs.js\";\nimport { detectProject, installDependencies } from \"../utils/project.js\";\nimport { patchNuxtConfigExtends } from \"../utils/nuxt-config.js\";\nimport {\n buildComponentInstallPlan,\n findComponentKey,\n resolveComponentFramework,\n} from \"../utils/registry-install.js\";\nimport {\n loadRegistry,\n resolveComponentDependencies,\n getComponentsByFramework,\n getSnippetsByFramework,\n groupByCategory,\n type ComponentMeta,\n type PackageMeta,\n type SnippetMeta,\n} from \"../utils/registry.js\";\n\ninterface AddOptions {\n component?: boolean;\n snippet?: boolean;\n all?: boolean;\n yes?: boolean;\n overwrite?: boolean;\n path?: string;\n}\n\nexport async function add(items: string[], options: AddOptions): Promise<void> {\n logger.br();\n\n // Detect project info\n const project = await detectProject();\n\n if (!project.packageJson) {\n logger.error(\"No package.json found. Please run this command in a project directory.\");\n process.exit(1);\n }\n\n // Load registry\n const registry = await loadRegistry();\n\n // Package dispatch (npm / layer) takes precedence for matching names\n const packageItems = items.filter((i) => registry.packages[i]).map((i) => registry.packages[i]!);\n if (packageItems.length > 0) {\n await addPackages(packageItems, project);\n }\n const nonPackageItems = items.filter((i) => !registry.packages[i]);\n if (items.length > 0 && nonPackageItems.length === 0) return;\n\n // Determine what type of items to add\n const isComponent = options.component || (!options.snippet && !options.component);\n const isSnippet = options.snippet;\n\n if (isComponent) {\n await addComponents(nonPackageItems, options, project, registry);\n } else if (isSnippet) {\n await addSnippets(nonPackageItems, options, project, registry);\n }\n}\n\n/** 安装 npm/layer 类型的包;layer 额外 patch 项目 nuxt.config 的 extends */\nasync function addPackages(\n packages: PackageMeta[],\n project: Awaited<ReturnType<typeof detectProject>>,\n): Promise<void> {\n for (const pkg of packages) {\n const spec = pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name;\n const spinner = ora(`Installing ${pkg.name}...`).start();\n try {\n await installDependencies(project.root, [spec]);\n spinner.succeed(`Installed ${pkg.name}`);\n } catch (error) {\n spinner.fail(`Failed to install ${pkg.name}`);\n throw error;\n }\n if (pkg.type === \"layer\") {\n await patchProjectNuxtConfig(project.root, pkg.name);\n }\n }\n}\n\nasync function patchProjectNuxtConfig(root: string, layer: string): Promise<void> {\n const candidates = [\"nuxt.config.ts\", \"nuxt.config.js\", \"nuxt.config.mjs\"];\n for (const file of candidates) {\n const configPath = path.join(root, file);\n if (!(await fs.pathExists(configPath))) continue;\n const source = await fs.readFile(configPath, \"utf8\");\n try {\n const patched = patchNuxtConfigExtends(source, layer);\n if (patched === source) {\n logger.info(`${layer} already in ${file} extends`);\n } else {\n await fs.writeFile(configPath, patched);\n logger.success(`Added ${layer} to ${file} extends`);\n }\n } catch {\n logger.warn(`Could not auto-patch ${file}; add \"${layer}\" to extends manually`);\n }\n return;\n }\n logger.warn(`No nuxt.config found; add \"${layer}\" to your nuxt.config extends manually`);\n}\n\nasync function addComponents(\n items: string[],\n options: AddOptions,\n project: Awaited<ReturnType<typeof detectProject>>,\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n): Promise<void> {\n const framework = resolveComponentFramework(project.framework);\n\n if (!framework) {\n logger.error(\"Could not detect framework. Supported: Nuxt, Vue, React\");\n process.exit(1);\n }\n\n const availableComponents = getComponentsByFramework(registry, framework, \"standalone\");\n\n if (availableComponents.length === 0) {\n logger.warn(`No components available for ${framework}`);\n return;\n }\n\n let selectedComponents: ComponentMeta[] = [];\n\n if (options.all) {\n // Add all components\n selectedComponents = availableComponents;\n } else if (items.length > 0) {\n // Add specified components\n for (const item of items) {\n try {\n const deps = resolveComponentDependencies(item, registry, \"standalone\");\n selectedComponents.push(...deps);\n } catch (error) {\n logger.error((error as Error).message);\n process.exit(1);\n }\n }\n } else {\n // Interactive selection\n const grouped = groupByCategory(availableComponents);\n const choices = Object.entries(grouped).flatMap(([category, components]) => [\n { title: category, disabled: true, value: \"\" },\n ...components.map((c) => ({\n title: ` ${c.name}`,\n description: c.description,\n value: findComponentKey(registry, c),\n })),\n ]);\n\n const response = await prompts({\n type: \"multiselect\",\n name: \"components\",\n message: \"Select components to add:\",\n choices,\n hint: \"- Space to select. Return to submit\",\n });\n\n if (!response.components || response.components.length === 0) {\n logger.info(\"No components selected\");\n return;\n }\n\n for (const name of response.components) {\n const deps = resolveComponentDependencies(name, registry, \"standalone\");\n selectedComponents.push(...deps);\n }\n }\n\n const componentKeys = [\n ...new Set(selectedComponents.map((component) => findComponentKey(registry, component))),\n ];\n\n if (selectedComponents.length === 0) {\n logger.info(\"No components to add\");\n return;\n }\n\n // Confirm\n if (!options.yes) {\n logger.info(\"Components to add:\");\n selectedComponents.forEach((c) => logger.info(` - ${c.name}`));\n logger.br();\n\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Proceed?\",\n initial: true,\n });\n\n if (!confirm) {\n logger.info(\"Cancelled\");\n return;\n }\n }\n\n const installPlan = buildComponentInstallPlan({\n componentKeys,\n framework,\n projectRoot: project.root,\n registry,\n installContext: \"standalone\",\n targetBase: options.path,\n });\n\n // Copy files\n const spinner = ora(\"Adding components...\").start();\n\n try {\n const { copied, skipped } = await copyFiles(installPlan.filesToCopy, options.overwrite);\n\n spinner.succeed(`Added ${copied.length} file(s)`);\n\n if (skipped.length > 0) {\n logger.warn(`Skipped ${skipped.length} existing file(s). Use --overwrite to replace.`);\n }\n } catch (error) {\n spinner.fail(\"Failed to add components\");\n throw error;\n }\n\n // Install dependencies\n const uniqueDeps = installPlan.dependencies;\n const uniqueDevDeps = installPlan.devDependencies;\n\n if (uniqueDeps.length > 0 || uniqueDevDeps.length > 0) {\n const { shouldInstall } = options.yes\n ? { shouldInstall: true }\n : await prompts({\n type: \"confirm\",\n name: \"shouldInstall\",\n message: \"Install required dependencies?\",\n initial: true,\n });\n\n if (shouldInstall) {\n const installSpinner = ora(\"Installing dependencies...\").start();\n try {\n if (uniqueDeps.length > 0) {\n await installDependencies(project.root, uniqueDeps, false);\n }\n if (uniqueDevDeps.length > 0) {\n await installDependencies(project.root, uniqueDevDeps, true);\n }\n installSpinner.succeed(\"Dependencies installed\");\n } catch (error) {\n installSpinner.fail(\"Failed to install some dependencies\");\n }\n }\n }\n\n logger.br();\n logger.success(\"Done!\");\n}\n\nasync function addSnippets(\n items: string[],\n options: AddOptions,\n project: Awaited<ReturnType<typeof detectProject>>,\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n): Promise<void> {\n const framework =\n project.framework === \"nuxt\"\n ? \"nuxt\"\n : project.framework === \"vue\"\n ? \"vue\"\n : project.framework === \"react\"\n ? \"react\"\n : \"node\";\n\n const availableSnippets = getSnippetsByFramework(registry, framework);\n\n if (availableSnippets.length === 0) {\n logger.warn(`No snippets available for ${framework}`);\n return;\n }\n\n let selectedSnippets: SnippetMeta[] = [];\n\n if (options.all) {\n selectedSnippets = availableSnippets;\n } else if (items.length > 0) {\n for (const item of items) {\n const snippet = registry.snippets[item];\n if (!snippet) {\n logger.error(`Snippet \"${item}\" not found`);\n process.exit(1);\n }\n selectedSnippets.push(snippet);\n }\n } else {\n const grouped = groupByCategory(availableSnippets);\n const choices = Object.entries(grouped).flatMap(([category, snippets]) => [\n { title: category, disabled: true, value: \"\" },\n ...snippets.map((s) => ({\n title: ` ${s.name}`,\n description: s.description,\n value: s.name.toLowerCase(),\n })),\n ]);\n\n const response = await prompts({\n type: \"multiselect\",\n name: \"snippets\",\n message: \"Select snippets to add:\",\n choices,\n hint: \"- Space to select. Return to submit\",\n });\n\n if (!response.snippets || response.snippets.length === 0) {\n logger.info(\"No snippets selected\");\n return;\n }\n\n selectedSnippets = response.snippets.map((name: string) => registry.snippets[name]);\n }\n\n if (selectedSnippets.length === 0) {\n logger.info(\"No snippets to add\");\n return;\n }\n\n // Confirm\n if (!options.yes) {\n logger.info(\"Snippets to add:\");\n selectedSnippets.forEach((s) => logger.info(` - ${s.name}`));\n logger.br();\n\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Proceed?\",\n initial: true,\n });\n\n if (!confirm) {\n logger.info(\"Cancelled\");\n return;\n }\n }\n\n // Determine target path\n const targetBase = options.path || DEFAULT_PATHS[framework]?.utils || \"src/utils\";\n const targetDir = path.resolve(project.root, targetBase);\n\n // Copy files\n const spinner = ora(\"Adding snippets...\").start();\n\n const filesToCopy: { src: string; dest: string }[] = [];\n\n for (const snippet of selectedSnippets) {\n // Use snippet's own framework for source path (node, vue, react, or universal -> node)\n const snippetFramework = snippet.framework === \"universal\" ? \"node\" : snippet.framework;\n const snippetDir = path.join(PATHS.snippets, snippetFramework);\n\n for (const file of snippet.files) {\n const normalized = typeof file === \"string\" ? { path: file } : file;\n filesToCopy.push({\n src: path.join(snippetDir, normalized.path),\n dest: normalized.target\n ? path.resolve(project.root, normalized.target)\n : path.join(targetDir, path.basename(normalized.path)),\n });\n }\n }\n\n try {\n const { copied, skipped } = await copyFiles(filesToCopy, options.overwrite);\n spinner.succeed(`Added ${copied.length} file(s)`);\n\n if (skipped.length > 0) {\n logger.warn(`Skipped ${skipped.length} existing file(s)`);\n }\n } catch (error) {\n spinner.fail(\"Failed to add snippets\");\n throw error;\n }\n\n logger.br();\n logger.success(\"Done!\");\n}\n","function escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * 幂等地把一个 layer 加入 nuxt.config 的 `extends` 数组。\n * - 已含该 layer → 原样返回\n * - 已有 extends 数组 → 在数组头插入\n * - 仅有 defineNuxtConfig({ ... }) → 注入 extends\n * - 都识别不了 → 抛错,由调用方提示手动添加\n */\nexport function patchNuxtConfigExtends(source: string, layer: string): string {\n const already = new RegExp(`extends\\\\s*:\\\\s*\\\\[[^\\\\]]*['\"]${escapeRegExp(layer)}['\"]`);\n if (already.test(source)) return source;\n\n const extendsArray = /extends\\s*:\\s*\\[/;\n if (extendsArray.test(source)) {\n return source.replace(extendsArray, (match) => `${match}\"${layer}\", `);\n }\n\n const define = /defineNuxtConfig\\(\\{/;\n if (define.test(source)) {\n return source.replace(define, (match) => `${match}\\n extends: [\"${layer}\"],`);\n }\n\n throw new Error(\n \"Could not locate defineNuxtConfig in nuxt.config; add the layer to `extends` manually\",\n );\n}\n","import { TEMPLATES } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n loadRegistry,\n groupByCategory,\n type ComponentMeta,\n type SnippetMeta,\n} from \"../utils/registry.js\";\n\ninterface ListOptions {\n templates?: boolean;\n components?: boolean;\n snippets?: boolean;\n}\n\nexport async function list(type: string | undefined, options: ListOptions): Promise<void> {\n logger.br();\n\n const showAll = !options.templates && !options.components && !options.snippets && !type;\n const showTemplates = options.templates || type === \"templates\" || showAll;\n const showComponents = options.components || type === \"components\" || showAll;\n const showSnippets = options.snippets || type === \"snippets\" || showAll;\n\n if (showTemplates) {\n listTemplates();\n }\n\n if (showComponents) {\n await listComponents();\n }\n\n if (showSnippets) {\n await listSnippets();\n }\n}\n\nfunction listTemplates(): void {\n logger.title(\"Templates\");\n logger.br();\n\n const entries = Object.entries(TEMPLATES);\n\n if (entries.length === 0) {\n logger.info(\" No templates available\");\n } else {\n for (const [key, template] of entries) {\n logger.info(` ${key}`);\n logger.subtitle(` ${template.description}`);\n }\n }\n\n logger.br();\n logger.subtitle(\" Usage: stackonward init --template <name>\");\n logger.br();\n}\n\nasync function listComponents(): Promise<void> {\n logger.title(\"Components\");\n logger.br();\n\n const registry = await loadRegistry();\n const components = Object.values(registry.components);\n\n if (components.length === 0) {\n logger.info(\" No components available\");\n logger.br();\n return;\n }\n\n // Group by framework first\n const byFramework: Record<string, ComponentMeta[]> = {};\n for (const component of components) {\n const fw = component.framework;\n if (!byFramework[fw]) byFramework[fw] = [];\n byFramework[fw].push(component);\n }\n\n for (const [framework, fwComponents] of Object.entries(byFramework)) {\n logger.info(` [${framework}]`);\n\n const grouped = groupByCategory(fwComponents);\n\n for (const [category, catComponents] of Object.entries(grouped)) {\n logger.subtitle(` ${category}/`);\n for (const component of catComponents) {\n logger.info(` - ${component.name.toLowerCase()}: ${component.description}`);\n }\n }\n\n logger.br();\n }\n\n logger.subtitle(\" Usage: stackonward add <component-name>\");\n logger.br();\n}\n\nasync function listSnippets(): Promise<void> {\n logger.title(\"Snippets\");\n logger.br();\n\n const registry = await loadRegistry();\n const snippets = Object.values(registry.snippets);\n\n if (snippets.length === 0) {\n logger.info(\" No snippets available\");\n logger.br();\n return;\n }\n\n // Group by framework first\n const byFramework: Record<string, SnippetMeta[]> = {};\n for (const snippet of snippets) {\n const fw = snippet.framework;\n if (!byFramework[fw]) byFramework[fw] = [];\n byFramework[fw].push(snippet);\n }\n\n for (const [framework, fwSnippets] of Object.entries(byFramework)) {\n logger.info(` [${framework}]`);\n\n const grouped = groupByCategory(fwSnippets);\n\n for (const [category, catSnippets] of Object.entries(grouped)) {\n logger.subtitle(` ${category}/`);\n for (const snippet of catSnippets) {\n logger.info(` - ${snippet.name.toLowerCase()}: ${snippet.description}`);\n }\n }\n\n logger.br();\n }\n\n logger.subtitle(\" Usage: stackonward add -s <snippet-name>\");\n logger.br();\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { mkdir, writeFile, readFile, realpath } from \"node:fs/promises\";\nimport { copyTemplate, copyFiles, isDirEmpty } from \"../utils/fs.js\";\nimport { PATHS } from \"../utils/constants.js\";\nimport {\n DeliveryError,\n intents,\n parseIntent,\n type CommandResult,\n type DeliveryPlan,\n} from \"../apple/contracts.js\";\nimport {\n loadManifest,\n manifestSchema,\n parseSchema,\n readJsonFile,\n validateStage,\n fileDigest,\n} from \"../apple/manifest.js\";\nimport { loadCredentials } from \"../apple/credentials.js\";\nimport { createAppleGateway } from \"../apple/api.js\";\nimport { bindingPath, readBindings, writePrivateJson } from \"../apple/state.js\";\nimport { PlanBuilder } from \"../apple/plan.js\";\nimport { executePlan } from \"../apple/execute.js\";\nimport { planIdentifiers, findApp } from \"../apple/resources/identifiers.js\";\nimport { planMetadata } from \"../apple/resources/metadata.js\";\nimport { planCatalog } from \"../apple/resources/catalog.js\";\nimport {\n planAssets,\n planCatalogAssets,\n planReviewAttachments,\n createAssetTransfer,\n} from \"../apple/resources/assets.js\";\nimport { planPricing } from \"../apple/resources/pricing.js\";\nimport { planOffers } from \"../apple/resources/offers.js\";\nimport { planAppCommerce } from \"../apple/resources/app-commerce.js\";\nimport { planReview } from \"../apple/resources/review.js\";\nimport { planRelease } from \"../apple/resources/release.js\";\nimport { planTestFlight } from \"../apple/resources/testflight.js\";\nimport { createProcessRunner } from \"../apple/process.js\";\nimport { createAppleBuildTools } from \"../apple/fastlane.js\";\nimport { planSigning, planBuild, planUpload } from \"../apple/resources/build.js\";\nimport { planNative } from \"../apple/resources/native.js\";\nimport { inspectDelivery, runtimeHandoff } from \"../apple/resources/inspection.js\";\nimport { validateImage } from \"../apple/resources/assets.js\";\n\ninterface Options {\n manifest: string;\n account?: string;\n scope: string;\n intent?: string;\n state?: string;\n plan?: string;\n out?: string;\n yes?: boolean;\n json?: boolean;\n offline?: boolean;\n}\n\n/** 输出只使用本工具定义的安全字段,不序列化异常或供应商正文。 */\nasync function guarded(run: () => Promise<unknown>, json = false): Promise<void> {\n try {\n const result = await run();\n process.stdout.write(JSON.stringify(result, null, json ? undefined : 2) + \"\\n\");\n } catch (error) {\n const failure =\n error instanceof DeliveryError ? error : new DeliveryError(\"apple_command_failed\", 5);\n process.stdout.write(\n JSON.stringify({\n schemaVersion: 1,\n outcome: failure.exitCode === 7 ? \"unknown\" : \"failed\",\n code: failure.code,\n field: failure.field,\n httpStatus: failure.httpStatus,\n }) + \"\\n\",\n );\n process.exitCode = failure.exitCode;\n }\n}\n\nexport function registerApple(program: Command): void {\n const apple = program\n .command(\"apple\")\n .description(\"Plan, reconcile and verify Apple app delivery\");\n apple\n .command(\"import-assets <directory> <files...>\")\n .description(\"Copy explicit local artwork into an empty product asset directory\")\n .action((directory: string, files: string[]) =>\n guarded(async () => {\n const target = path.resolve(directory);\n if (!(await isDirEmpty(target)))\n throw new DeliveryError(\"initialization_directory_not_empty\", 2);\n const inputs = await Promise.all(\n files.map(async (filename) => {\n const source = await realpath(filename),\n name = path.basename(source),\n bytes = await readFile(source);\n if (!/\\.(png|jpe?g|mp4|mov)$/i.test(name))\n throw new DeliveryError(\"unsupported_asset_format\", 2);\n if (/\\.(png|jpe?g)$/i.test(name)) validateImage(bytes);\n return { source, name, sha256: fileDigest(bytes) };\n }),\n );\n if (new Set(inputs.map((v) => v.name.toLowerCase())).size !== inputs.length)\n throw new DeliveryError(\"duplicate_asset_filename\", 2);\n const copied = await copyFiles(\n inputs.map((v) => ({ src: v.source, dest: path.join(target, v.name) })),\n );\n if (copied.skipped.length) throw new DeliveryError(\"asset_destination_changed\", 4);\n for (const input of inputs) {\n if (fileDigest(await readFile(path.join(target, input.name))) !== input.sha256)\n throw new DeliveryError(\"asset_source_changed\", 4);\n }\n await writeFile(\n path.join(target, \"provenance.json\"),\n JSON.stringify(\n { schemaVersion: 1, files: inputs.map(({ name, sha256 }) => ({ file: name, sha256 })) },\n null,\n 2,\n ) + \"\\n\",\n { flag: \"wx\" },\n );\n return {\n outcome: \"verified\",\n files: inputs.map(({ name, sha256 }) => ({ file: name, sha256 })),\n };\n }),\n );\n for (const mode of [\"status\", \"export\", \"handoff\"] as const)\n apple\n .command(mode)\n .description(\"Read Apple resources without publishing or changing configuration\")\n .requiredOption(\"--manifest <file>\", \"Product manifest\")\n .requiredOption(\"--account <file>\", \"Private account JSON\")\n .option(\"--state <directory>\", \"Private binding directory\")\n .option(\"--out <file>\", \"New private JSON export file\")\n .option(\"--json\", \"Machine-readable JSON\")\n .action((options: Options) =>\n guarded(async () => {\n const loaded = await loadManifest(path.resolve(options.manifest));\n const credentials = await loadCredentials(path.resolve(options.account!));\n const state = path.resolve(\n options.state ??\n path.join(\n os.homedir(),\n \".stackonward\",\n \"apple\",\n credentials.fingerprint,\n loaded.manifest.app.bundleId,\n ),\n );\n const bindings = await readBindings(\n bindingPath(state, credentials.fingerprint, loaded.manifest.app.bundleId),\n );\n const builder = new PlanBuilder(\n loaded,\n parseIntent(\"setup\", \"reconcile\"),\n credentials.fingerprint,\n Date.now(),\n bindings,\n );\n const api = createAppleGateway(credentials);\n if (mode === \"export\" && !options.out)\n throw new DeliveryError(\"export_destination_required\", 2);\n const result =\n mode === \"handoff\"\n ? await runtimeHandoff(builder, api)\n : {\n schemaVersion: 1,\n bundleId: loaded.manifest.app.bundleId,\n resources: await inspectDelivery(builder, api, mode === \"export\"),\n manualRequirements: builder.requirements,\n };\n if (options.out) {\n const destination = path.resolve(options.out);\n await mkdir(path.dirname(destination), { recursive: true, mode: 0o700 });\n await writeFile(destination, JSON.stringify(result, null, 2) + \"\\n\", {\n flag: \"wx\",\n mode: 0o600,\n });\n }\n return result;\n }, options.json),\n );\n apple\n .command(\"schema\")\n .description(\"Print the versioned manifest JSON Schema\")\n .action(() => guarded(async () => z.toJSONSchema(manifestSchema)));\n apple\n .command(\"init <directory>\")\n .description(\"Create an empty Apple delivery workspace\")\n .requiredOption(\"--bundle-id <id>\", \"Explicit iOS bundle identifier\")\n .requiredOption(\"--name <name>\", \"App display name\")\n .action((directory: string, options: { bundleId: string; name: string }) =>\n guarded(async () => {\n const manifest = parseSchema(manifestSchema, {\n schemaVersion: 1,\n app: { bundleId: options.bundleId, name: options.name, platform: \"IOS\" },\n });\n const target = path.resolve(directory);\n if (!(await isDirEmpty(target)))\n throw new DeliveryError(\"initialization_directory_not_empty\", 2);\n await mkdir(target, { recursive: true });\n await copyTemplate(PATHS.apple, target);\n await writeFile(path.join(target, \"app.json\"), JSON.stringify(manifest, null, 2) + \"\\n\", {\n flag: \"wx\",\n });\n await writeFile(\n path.join(target, \"manifest.schema.json\"),\n JSON.stringify(z.toJSONSchema(manifestSchema), null, 2) + \"\\n\",\n { flag: \"wx\" },\n );\n return {\n schemaVersion: 1,\n outcome: \"verified\",\n directory: target,\n verifiedChecks: [\"manifest\", \"bundled-resources\"],\n };\n }),\n );\n for (const mode of [\"preflight\", \"plan\", \"apply\", \"verify\"] as const) {\n apple\n .command(mode)\n .description(`${mode} one explicitly selected delivery scope`)\n .requiredOption(\"--manifest <file>\", \"Product manifest\")\n .requiredOption(\"--scope <scope>\", `Scope: ${Object.keys(intents).join(\", \")}`)\n .option(\"--intent <action>\", \"Explicit action within the scope\")\n .option(\"--account <file>\", \"Private account JSON (mode 0600)\")\n .option(\"--state <directory>\", \"Private durable state directory\")\n .option(\"--plan <file>\", \"Saved plan to revalidate and apply\")\n .option(\"--out <file>\", \"Save private plan JSON\")\n .option(\"--offline\", \"Validate local configuration only\")\n .option(\"--yes\", \"Execute the exact saved intent\")\n .option(\"--json\", \"Machine-readable JSON\")\n .action((options: Options) => guarded(() => runApple(mode, options), options.json));\n }\n}\n\nasync function runApple(\n mode: \"preflight\" | \"plan\" | \"apply\" | \"verify\",\n options: Options,\n): Promise<unknown> {\n const intent = parseIntent(options.scope, options.intent ?? \"reconcile\");\n const loaded = await loadManifest(path.resolve(options.manifest));\n validateStage(loaded.manifest, intent.scope);\n if (options.offline) {\n if (mode !== \"preflight\") throw new DeliveryError(\"offline_requires_preflight\", 2);\n return {\n schemaVersion: 1,\n scope: intent.scope,\n outcome: \"verified\",\n verifiedChecks: [\"local-manifest\", \"referenced-files\"],\n remoteVerified: false,\n inputDigest: loaded.inputDigest,\n };\n }\n if (!options.account) throw new DeliveryError(\"account_configuration_required\", 2);\n const credentials = await loadCredentials(path.resolve(options.account));\n const state = path.resolve(\n options.state ??\n path.join(\n os.homedir(),\n \".stackonward\",\n \"apple\",\n credentials.fingerprint,\n loaded.manifest.app.bundleId,\n ),\n );\n const controller = new AbortController();\n const cancel = () => controller.abort();\n process.once(\"SIGINT\", cancel);\n process.once(\"SIGTERM\", cancel);\n try {\n const api = createAppleGateway(credentials, { signal: controller.signal });\n const prepare = async () => {\n const current = await loadManifest(path.resolve(options.manifest));\n const bindings = await readBindings(\n bindingPath(state, credentials.fingerprint, current.manifest.app.bundleId),\n );\n const builder = new PlanBuilder(\n current,\n intent,\n credentials.fingerprint,\n Date.now(),\n bindings,\n );\n const transfer = createAssetTransfer({ signal: controller.signal });\n const runner = createProcessRunner(controller.signal);\n const buildTools = createAppleBuildTools(\n current,\n credentials,\n runner,\n PATHS.apple,\n controller.signal,\n );\n switch (intent.scope) {\n case \"setup\":\n await planIdentifiers(builder, api);\n break;\n case \"native\":\n await planNative(builder, credentials, buildTools);\n break;\n case \"metadata\":\n await planMetadata(builder, api);\n break;\n case \"catalog\":\n await planCatalog(builder, api);\n break;\n case \"assets\":\n if (current.manifest.assets) await planAssets(builder, api, transfer);\n if (intent.action === \"reconcile\") {\n await planCatalogAssets(builder, api, transfer);\n await planReviewAttachments(builder, api, transfer);\n }\n break;\n case \"pricing\":\n if (await findApp(builder, api)) {\n if (current.manifest.catalog) {\n await planPricing(builder, api);\n await planOffers(builder, api);\n }\n await planAppCommerce(builder, api);\n }\n break;\n case \"review\":\n if (await findApp(builder, api)) await planReview(builder, api);\n break;\n case \"release\":\n await planRelease(builder, api);\n break;\n case \"testflight\":\n if (await findApp(builder, api)) await planTestFlight(builder, api);\n break;\n case \"signing\":\n await planSigning(builder, credentials, buildTools);\n break;\n case \"build\":\n await planBuild(builder, credentials, buildTools, runner);\n break;\n case \"upload\":\n if (await findApp(builder, api))\n await planUpload(builder, api, credentials, buildTools, runner, controller.signal);\n break;\n }\n return builder.finish();\n };\n if (mode === \"apply\") {\n if (!options.yes || !options.plan)\n throw new DeliveryError(\"saved_plan_and_explicit_execution_required\", 2);\n const saved = (await readJsonFile(path.resolve(options.plan))) as DeliveryPlan;\n if (\n !saved ||\n typeof saved !== \"object\" ||\n saved.scope !== intent.scope ||\n saved.intent?.action !== intent.action ||\n saved.accountFingerprint !== credentials.fingerprint ||\n saved.bundleId !== loaded.manifest.app.bundleId\n )\n throw new DeliveryError(\"plan_identity_mismatch\", 4);\n const result = await executePlan(saved, prepare, state, controller.signal);\n process.exitCode =\n result.receipt.outcome === \"verified\"\n ? 0\n : result.receipt.outcome === \"blocked\"\n ? 6\n : result.receipt.outcome === \"unknown\"\n ? 7\n : result.receipt.outcome === \"cancelled\"\n ? 130\n : 5;\n return result;\n }\n const prepared = await prepare();\n if (mode === \"plan\") {\n if (options.out) await writePrivateJson(path.resolve(options.out), prepared.plan);\n return prepared.plan;\n }\n const outcome =\n prepared.plan.manualRequirements.length ||\n (mode === \"verify\" && prepared.plan.operations.length)\n ? \"blocked\"\n : \"verified\";\n if (outcome === \"blocked\") process.exitCode = prepared.plan.manualRequirements.length ? 6 : 4;\n return {\n schemaVersion: 1,\n scope: intent.scope,\n intent,\n outcome,\n verifiedChecks: [\n \"local-manifest\",\n ...([\"native\", \"build\", \"signing\"].includes(intent.scope)\n ? [\"local-toolchain\"]\n : [\"authenticated-api-read\"]),\n ...(mode === \"verify\" && outcome === \"verified\" ? [\"desired-state\"] : []),\n ],\n pendingOperations: prepared.plan.operations,\n resources: prepared.resources,\n manualRequirements: prepared.plan.manualRequirements,\n } satisfies CommandResult & { pendingOperations: unknown[] };\n } finally {\n process.off(\"SIGINT\", cancel);\n process.off(\"SIGTERM\", cancel);\n }\n}\n","export const intents = {\n setup: [\"reconcile\"],\n native: [\"configure\"],\n metadata: [\"reconcile\"],\n assets: [\"reconcile\", \"remove-owned-assets\"],\n catalog: [\"reconcile\"],\n pricing: [\"reconcile\"],\n signing: [\"initialize\", \"sync\"],\n build: [\"archive\"],\n upload: [\"upload\"],\n testflight: [\"prepare\", \"review\", \"distribute\", \"invite\"],\n review: [\"prepare\", \"submit\", \"withdraw\"],\n release: [\"configure\", \"publish\", \"pause\", \"resume\", \"complete\"],\n} as const;\nexport type Scope = keyof typeof intents;\nexport type Intent = { [S in Scope]: { scope: S; action: (typeof intents)[S][number] } }[Scope];\nexport type Outcome = \"verified\" | \"blocked\" | \"failed\" | \"unknown\" | \"cancelled\";\nexport interface ResourceReference {\n type: string;\n id: string;\n}\nexport interface AppleResource extends ResourceReference {\n attributes: Record<string, unknown>;\n relationships?: Record<string, { data?: ResourceReference | ResourceReference[] | null }>;\n}\nexport interface ManualRequirement {\n code: string;\n stage: Scope;\n reason: string;\n consoleUrl: string;\n evidence: \"remote-readback\" | \"operator-attestation\";\n blockedOperationIds: string[];\n}\nexport interface Operation {\n id: string;\n resourceKey: string;\n action:\n | \"create\"\n | \"update\"\n | \"upload\"\n | \"submit\"\n | \"release\"\n | \"withdraw\"\n | \"distribute\"\n | \"invite\"\n | \"pause\"\n | \"resume\"\n | \"complete\"\n | \"remove-owned-asset\";\n fields: string[];\n dependencies: string[];\n beforeDigest: string;\n desiredDigest: string;\n}\nexport interface DeliveryPlan {\n schemaVersion: 1;\n scope: Scope;\n intent: Intent;\n accountFingerprint: string;\n bundleId: string;\n appId?: string;\n inputDigest: string;\n snapshotDigest: string;\n createdAt: string;\n expiresAt: string;\n operations: Operation[];\n commercialConfiguration?: Record<string, unknown>;\n manualRequirements: ManualRequirement[];\n}\nexport interface ExecutionReceipt {\n executionId: string;\n scope: Scope;\n intent: Intent;\n inputDigest: string;\n outcome: Outcome;\n completed: ResourceReference[];\n pending: string[];\n manualRequirements: ManualRequirement[];\n failure?: { code: string; httpStatus?: number; field?: string; retryable: boolean };\n}\nexport interface CommandResult {\n schemaVersion: 1;\n scope: Scope;\n intent?: Intent;\n outcome: Outcome;\n code?: string;\n verifiedChecks: string[];\n resources: ResourceReference[];\n manualRequirements: ManualRequirement[];\n receiptPath?: string;\n}\nexport interface Clock {\n now(): number;\n sleep(ms: number, signal?: AbortSignal): Promise<void>;\n}\nexport interface ProcessRunner {\n run(\n executable: string,\n args: string[],\n options: {\n cwd: string;\n env: Record<string, string>;\n timeoutMs: number;\n signal?: AbortSignal;\n },\n ): Promise<{ stdout: string; stderr: string }>;\n}\nexport interface AppleGateway {\n list(path: string, query?: Record<string, string>): Promise<AppleResource[]>;\n read(path: string): Promise<AppleResource>;\n create(\n path: string,\n type: string,\n attributes: Record<string, unknown>,\n relationships?: Record<string, unknown>,\n included?: Record<string, unknown>[],\n ): Promise<AppleResource>;\n update(\n path: string,\n resource: ResourceReference,\n attributes: Record<string, unknown>,\n relationships?: Record<string, unknown>,\n ): Promise<AppleResource>;\n remove(path: string): Promise<void>;\n relationship(\n path: string,\n data: ResourceReference[],\n method?: \"POST\" | \"PATCH\" | \"DELETE\",\n ): Promise<void>;\n}\n\n/** 只允许固定错误码进入命令输出,供应商正文和密钥不进入消息。 */\nexport class DeliveryError extends Error {\n constructor(\n readonly code: string,\n readonly exitCode: number,\n readonly field?: string,\n readonly httpStatus?: number,\n readonly retryable = false,\n readonly writeRejected = false,\n ) {\n super(code);\n this.name = \"DeliveryError\";\n }\n}\n\n/** 阶段与动作共同限定执行授权,不接受任意字符串透传到供应商。 */\nexport function parseIntent(scope: string, action: string): Intent {\n if (!Object.hasOwn(intents, scope)) throw new DeliveryError(\"invalid_scope\", 2, \"scope\");\n const selected = scope as Scope;\n if (!(intents[selected] as readonly string[]).includes(action)) {\n throw new DeliveryError(\"invalid_intent\", 2, \"intent\");\n }\n return { scope: selected, action } as Intent;\n}\n","import { z } from \"zod\";\nimport { readFile, realpath, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { DeliveryError, type Scope } from \"./contracts.js\";\n\nconst text = z.string().min(1);\nconst id = z.string().regex(/^[A-Za-z0-9_-]+$/);\nconst locale = z.string().regex(/^[a-z]{2,3}(?:-[A-Za-z]{2,4})?$/);\nconst territory = z.string().regex(/^[A-Z]{3}$/);\nconst file = text;\nconst decimal = z.string().regex(/^(0|[1-9]\\d*)(\\.\\d{1,3})?$/);\nconst url = z.url({ protocol: /^https$/ });\nconst period = z.enum([\n \"ONE_WEEK\",\n \"ONE_MONTH\",\n \"TWO_MONTHS\",\n \"THREE_MONTHS\",\n \"SIX_MONTHS\",\n \"ONE_YEAR\",\n]);\nconst localizedProduct = z.strictObject({\n locale,\n name: text.max(30),\n description: z.string().max(55).optional(),\n});\nconst price = z.strictObject({\n territory,\n customerPrice: decimal,\n currency: z.string().regex(/^[A-Z]{3}$/),\n pricePointId: text.optional(),\n startDate: z.iso.date().optional(),\n preserveCurrentPrice: z.boolean().optional(),\n});\nconst appPrice = price\n .omit({ preserveCurrentPrice: true })\n .extend({ endDate: z.iso.date().optional() });\nconst asset = z.strictObject({\n file,\n locale: locale.optional(),\n displayType: id.optional(),\n order: z.number().int().min(0).optional(),\n previewType: id.optional(),\n previewFrameTimeCode: text.optional(),\n});\nconst fields = z.strictObject({\n name: z.string().max(30).optional(),\n subtitle: z.string().max(30).optional(),\n privacyPolicyUrl: url.optional(),\n privacyChoicesUrl: url.optional(),\n description: z.string().max(4000).optional(),\n keywords: z.string().max(100).optional(),\n promotionalText: z.string().max(170).optional(),\n whatsNew: z.string().max(4000).optional(),\n supportUrl: url.optional(),\n marketingUrl: url.optional(),\n});\nconst group = z.strictObject({\n key: id,\n remoteId: id.optional(),\n name: text,\n localizations: z\n .array(z.strictObject({ locale, name: text.max(75), customAppName: text.max(30).optional() }))\n .default([]),\n});\nconst offerDuration = z.enum([\n \"THREE_DAYS\",\n \"ONE_WEEK\",\n \"TWO_WEEKS\",\n \"ONE_MONTH\",\n \"TWO_MONTHS\",\n \"THREE_MONTHS\",\n \"SIX_MONTHS\",\n \"ONE_YEAR\",\n]);\nconst offerBase = {\n key: id,\n duration: offerDuration,\n numberOfPeriods: z.number().int().positive(),\n offerMode: z.enum([\"FREE_TRIAL\", \"PAY_AS_YOU_GO\", \"PAY_UP_FRONT\"]),\n prices: z.array(z.strictObject({ territory, pricePointId: text.optional() })).min(1),\n};\nconst offer = z.discriminatedUnion(\"kind\", [\n z.strictObject({\n ...offerBase,\n kind: z.literal(\"introductory\"),\n startDate: z.iso.date(),\n endDate: z.iso.date().optional(),\n }),\n z.strictObject({ ...offerBase, kind: z.literal(\"promotional\"), name: text, offerCode: text }),\n z.strictObject({\n ...offerBase,\n kind: z.literal(\"code\"),\n name: text,\n customerEligibilities: z.array(z.enum([\"NEW\", \"EXISTING\", \"EXPIRED\"])).min(1),\n offerEligibility: z.enum([\"STACK_WITH_INTRO_OFFERS\", \"REPLACE_INTRO_OFFERS\"]),\n autoRenewEnabled: z.boolean(),\n }),\n]);\nconst itemBase = {\n productId: z\n .string()\n .regex(/^[A-Za-z0-9_.-]+$/)\n .max(100),\n name: text.max(64),\n familySharable: z.boolean().optional(),\n reviewNote: z.string().optional(),\n localizations: z.array(localizedProduct).default([]),\n promotionalImage: file.optional(),\n reviewScreenshot: file.optional(),\n replaceReviewScreenshotId: id.optional(),\n prices: z.array(price).default([]),\n availability: z\n .strictObject({\n territories: z.array(territory).min(1),\n availableInNewTerritories: z.boolean(),\n })\n .optional(),\n};\nconst subscription = z.strictObject({\n ...itemBase,\n kind: z.literal(\"subscription\"),\n groupKey: id,\n duration: period,\n level: z.number().int().min(1).max(100),\n offers: z.array(offer).default([]),\n});\nconst purchase = z.strictObject({\n ...itemBase,\n kind: z.enum([\"CONSUMABLE\", \"NON_CONSUMABLE\", \"NON_RENEWING_SUBSCRIPTION\"]),\n baseTerritory: territory.optional(),\n prices: z.array(appPrice).default([]),\n});\nexport const manifestSchema = z.strictObject({\n schemaVersion: z.literal(1),\n app: z.strictObject({\n bundleId: z.string().regex(/^[A-Za-z0-9-]+(?:\\.[A-Za-z0-9-]+){2,}$/),\n name: text.max(50),\n platform: z.literal(\"IOS\"),\n sku: text.optional(),\n primaryLocale: locale.optional(),\n appId: z.string().regex(/^\\d+$/).optional(),\n }),\n capabilities: z\n .strictObject({\n signInWithApple: z.literal(true).optional(),\n pushNotifications: z.literal(true).optional(),\n inAppPurchase: z.literal(true).optional(),\n })\n .default({}),\n metadata: z\n .strictObject({\n localizations: z.array(z.strictObject({ locale, file })).default([]),\n primaryCategory: id.optional(),\n secondaryCategory: id.optional(),\n copyright: text.optional(),\n ageRatingFile: file.optional(),\n licenseAgreementFile: file.optional(),\n })\n .optional(),\n assets: z\n .strictObject({\n icon: file.optional(),\n iconVariants: z.strictObject({ dark: file.optional(), tinted: file.optional() }).optional(),\n screenshots: z.array(asset).default([]),\n previews: z.array(asset).default([]),\n removeOwnedIds: z\n .array(z.strictObject({ type: z.enum([\"appScreenshots\", \"appPreviews\"]), id }))\n .default([]),\n })\n .optional(),\n catalog: z\n .strictObject({\n groups: z.array(group).default([]),\n items: z.array(z.discriminatedUnion(\"kind\", [subscription, purchase])).default([]),\n gracePeriod: z\n .strictObject({\n optIn: z.boolean(),\n sandboxOptIn: z.boolean(),\n duration: z.enum([\"THREE_DAYS\", \"SIXTEEN_DAYS\", \"TWENTY_EIGHT_DAYS\"]),\n renewalType: z.enum([\"ALL_RENEWALS\", \"PAID_TO_PAID_ONLY\"]),\n })\n .optional(),\n })\n .optional(),\n availability: z\n .strictObject({\n territories: z.array(territory).min(1),\n availableInNewTerritories: z.boolean(),\n })\n .optional(),\n appPricing: z\n .strictObject({ baseTerritory: territory, prices: z.array(appPrice).min(1) })\n .optional(),\n release: z\n .strictObject({\n version: z.string().regex(/^\\d+(?:\\.\\d+){0,2}$/),\n buildNumber: z.string().regex(/^\\d+(?:\\.\\d+){0,2}$/),\n buildId: id.optional(),\n mode: z.enum([\"MANUAL\", \"AFTER_APPROVAL\", \"SCHEDULED\"]).default(\"MANUAL\"),\n earliestReleaseDate: z.iso.datetime().optional(),\n reviewSubmissionId: id.optional(),\n reviewItems: z\n .strictObject({\n includeApp: z.boolean(),\n productIds: z.array(text),\n groupKeys: z.array(id),\n })\n .optional(),\n phasedRelease: z.boolean().optional(),\n phasedReleaseId: id.optional(),\n firstPurchaseTypes: z\n .array(\n z.enum([\"subscription\", \"CONSUMABLE\", \"NON_CONSUMABLE\", \"NON_RENEWING_SUBSCRIPTION\"]),\n )\n .default([]),\n })\n .optional(),\n review: z\n .strictObject({\n credentialsRef: file,\n notesFile: file.optional(),\n attachments: z.array(file).default([]),\n })\n .optional(),\n declarations: z\n .array(\n z.strictObject({\n code: id,\n file,\n confirmed: z.boolean(),\n evidence: z.enum([\"operator-attestation\", \"remote-readback\"]),\n consoleUrl: url,\n }),\n )\n .default([]),\n build: z\n .strictObject({\n kind: z.enum([\"flutter\", \"xcode\"]),\n projectRoot: file,\n projectPath: file,\n scheme: text,\n targetName: text,\n configuration: text.default(\"Release\"),\n flutterExecutable: file.optional(),\n bundleExecutable: file.optional(),\n additionalTargets: z.array(z.strictObject({ name: text, bundleId: text })).default([]),\n flutterVersion: text.optional(),\n xcodeVersion: text,\n publicDefinesFile: file.optional(),\n workspace: file.optional(),\n iconSetPath: file.optional(),\n infoPlistPath: file.optional(),\n entitlementsPath: file.optional(),\n outputPath: file.default(\"build/apple\"),\n })\n .optional(),\n signing: z\n .strictObject({\n storageUrl: url,\n profileType: z.enum([\"appstore\", \"development\", \"adhoc\"]),\n bundleIds: z.array(text).min(1),\n readonly: z.boolean().default(true),\n })\n .optional(),\n testflight: z\n .strictObject({\n groupIds: z.array(id).default([]),\n betaDescription: z.string().optional(),\n feedbackEmail: z.email().optional(),\n whatsNew: z.string().optional(),\n locale: locale.optional(),\n external: z.boolean().default(false),\n notifyTesters: z.boolean().default(false),\n invitationsRef: file.optional(),\n })\n .optional(),\n});\nexport type Manifest = z.infer<typeof manifestSchema>;\nexport type CatalogItem = NonNullable<Manifest[\"catalog\"]>[\"items\"][number];\nexport type LocaleFields = z.infer<typeof fields>;\nexport const accountSchema = z.strictObject({\n teamId: z.string().regex(/^[A-Z0-9]{10}$/),\n keyId: z.string().regex(/^[A-Z0-9]{10}$/),\n issuerId: z.uuid(),\n privateKeyPath: text,\n signingSecretsFile: file.optional(),\n});\nexport type Account = z.infer<typeof accountSchema>;\nexport interface LoadedManifest {\n manifest: Manifest;\n directory: string;\n inputDigest: string;\n files: Map<string, Buffer>;\n}\n\n/** JSON 错误只报告字段位置,不回显可能包含密钥的输入值。 */\nexport function parseSchema<T>(schema: z.ZodType<T>, input: unknown): T {\n const result = schema.safeParse(input);\n if (!result.success)\n throw new DeliveryError(\"invalid_configuration\", 2, result.error.issues[0]?.path.join(\".\"));\n return result.data;\n}\n\n/** 固定键序使配置摘要不随 JSON 的格式或对象键顺序改变。 */\nexport function canonical(value: unknown): string {\n if (value === undefined) return \"null\";\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`;\n return `{${Object.entries(value)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${JSON.stringify(k)}:${canonical(v)}`)\n .join(\",\")}}`;\n}\nexport function digest(value: unknown): string {\n return createHash(\"sha256\").update(canonical(value)).digest(\"hex\");\n}\nexport function fileDigest(bytes: Buffer): string {\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\nexport async function readJsonFile(filename: string): Promise<unknown> {\n let value: string;\n try {\n value = await readFile(filename, \"utf8\");\n } catch {\n throw new DeliveryError(\"file_unreadable\", 2, filename);\n }\n try {\n return JSON.parse(value);\n } catch {\n throw new DeliveryError(\"invalid_json\", 2, filename);\n }\n}\n\n/** 以实际路径约束资源目录,阻止符号链接将发布输入引向其它文件。 */\nexport async function resolveFile(root: string, relative: string): Promise<string> {\n const base = await realpath(root);\n let target: string;\n try {\n target = await realpath(path.resolve(base, relative));\n } catch {\n throw new DeliveryError(\"file_unreadable\", 2, relative);\n }\n if (!target.startsWith(base + path.sep) || !(await stat(target)).isFile())\n throw new DeliveryError(\"asset_path_outside_root\", 2, relative);\n return target;\n}\n\nexport async function loadManifest(filename: string): Promise<LoadedManifest> {\n const manifest = parseSchema(manifestSchema, await readJsonFile(filename));\n const directory = path.dirname(await realpath(filename));\n const files = new Map<string, Buffer>();\n const paths = [\n ...(manifest.metadata?.localizations.map((v) => v.file) ?? []),\n manifest.metadata?.ageRatingFile,\n manifest.metadata?.licenseAgreementFile,\n manifest.assets?.icon,\n manifest.assets?.iconVariants?.dark,\n manifest.assets?.iconVariants?.tinted,\n ...(manifest.assets?.screenshots.map((v) => v.file) ?? []),\n ...(manifest.assets?.previews.map((v) => v.file) ?? []),\n ...(manifest.catalog?.items.flatMap((v) => [v.promotionalImage, v.reviewScreenshot]) ?? []),\n manifest.review?.notesFile,\n ...(manifest.review?.attachments ?? []),\n ...manifest.declarations.map((v) => v.file),\n ];\n for (const name of paths)\n if (name) files.set(name, await readFile(await resolveFile(directory, name)));\n for (const entry of manifest.metadata?.localizations ?? [])\n parseSchema(fields, JSON.parse(files.get(entry.file)!.toString(\"utf8\")));\n unique(manifest.metadata?.localizations.map((v) => v.locale) ?? [], \"metadata.localizations\");\n unique(manifest.catalog?.groups.map((v) => v.key) ?? [], \"catalog.groups\");\n unique(manifest.catalog?.items.map((v) => v.productId) ?? [], \"catalog.items\");\n for (const item of manifest.catalog?.items ?? []) {\n unique(\n item.localizations.map((v) => v.locale),\n `catalog.${item.productId}.localizations`,\n );\n if (item.kind === \"subscription\") {\n unique(\n item.offers.map((v) => v.key),\n `catalog.${item.productId}.offers`,\n );\n for (const offer of item.offers) {\n unique(\n offer.prices.map((v) => v.territory),\n `catalog.${item.productId}.offers.${offer.key}.prices`,\n );\n if (offer.kind === \"introductory\" && offer.endDate && offer.endDate <= offer.startDate)\n throw new DeliveryError(\"offer_date_interval_invalid\", 2, offer.key);\n }\n }\n if (\n item.kind === \"subscription\" &&\n !manifest.catalog?.groups.some((g) => g.key === item.groupKey)\n )\n throw new DeliveryError(\"subscription_group_missing\", 2, item.productId);\n }\n for (const group of manifest.catalog?.groups ?? [])\n unique(\n group.localizations.map((v) => v.locale),\n `catalog.groups.${group.key}.localizations`,\n );\n for (const prices of [\n manifest.appPricing?.prices ?? [],\n ...(manifest.catalog?.items.filter((v) => v.kind !== \"subscription\").map((v) => v.prices) ??\n []),\n ])\n for (const region of new Set(prices.map((v) => v.territory))) {\n const intervals = prices\n .filter((v) => v.territory === region)\n .sort((a, b) => (a.startDate ?? \"\").localeCompare(b.startDate ?? \"\"));\n for (let i = 0; i < intervals.length; i++) {\n const current = intervals[i],\n previous = intervals[i - 1];\n if (\n (current.endDate && current.startDate && current.endDate <= current.startDate) ||\n (previous &&\n (!previous.endDate || !current.startDate || previous.endDate > current.startDate))\n )\n throw new DeliveryError(\"app_price_interval_invalid\", 2, region);\n }\n }\n if (manifest.release?.mode === \"SCHEDULED\" && !manifest.release.earliestReleaseDate)\n throw new DeliveryError(\"release_date_required\", 2);\n return {\n manifest,\n directory,\n files,\n inputDigest: digest({\n manifest,\n files: [...files].map(([name, data]) => [name, fileDigest(data)]),\n }),\n };\n}\n\nfunction unique(values: string[], field: string): void {\n if (new Set(values).size !== values.length)\n throw new DeliveryError(\"duplicate_configuration_key\", 2, field);\n}\nexport function localeFields(loaded: LoadedManifest, filename: string): LocaleFields {\n return parseSchema(fields, JSON.parse(loaded.files.get(filename)!.toString(\"utf8\")));\n}\n\nexport function validateStage(manifest: Manifest, scope: Scope): void {\n const required: Partial<Record<Scope, boolean>> = {\n metadata: !!manifest.metadata,\n assets:\n !!manifest.assets ||\n !!manifest.catalog?.items.some((v) => v.promotionalImage || v.reviewScreenshot) ||\n !!manifest.review?.attachments.length,\n catalog: !!manifest.catalog,\n pricing: !!manifest.catalog || !!manifest.appPricing || !!manifest.availability,\n native: !!manifest.build,\n build: !!manifest.build && !!manifest.release && !!manifest.signing,\n upload: !!manifest.build && !!manifest.release && !!manifest.signing,\n signing: !!manifest.signing,\n testflight: !!manifest.testflight,\n review: !!manifest.release,\n release: !!manifest.release,\n };\n if (required[scope] === false) throw new DeliveryError(\"stage_configuration_required\", 2, scope);\n}\n","import { createPrivateKey, sign } from \"node:crypto\";\nimport { readFile, stat, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { DeliveryError } from \"./contracts.js\";\nimport { accountSchema, parseSchema, readJsonFile, digest, type Account } from \"./manifest.js\";\n\nexport interface AppleCredentials {\n account: Account;\n fingerprint: string;\n token(): string;\n}\n\n/** 密钥只在单次调用内持有,签名结果不持久化。 */\nexport async function loadCredentials(filename: string, now = Date.now): Promise<AppleCredentials> {\n await requirePrivateFile(filename);\n const account = parseSchema(accountSchema, await readJsonFile(filename));\n const privateKeyPath = await realpath(\n path.resolve(path.dirname(filename), account.privateKeyPath),\n );\n await requirePrivateFile(privateKeyPath);\n let key;\n try {\n key = createPrivateKey(await readFile(privateKeyPath));\n } catch {\n throw new DeliveryError(\"invalid_private_key\", 2);\n }\n if (key.asymmetricKeyType !== \"ec\" || key.asymmetricKeyDetails?.namedCurve !== \"prime256v1\") {\n throw new DeliveryError(\"invalid_signing_curve\", 2);\n }\n return {\n account: {\n ...account,\n privateKeyPath,\n ...(account.signingSecretsFile\n ? { signingSecretsFile: path.resolve(path.dirname(filename), account.signingSecretsFile) }\n : {}),\n },\n fingerprint: digest({\n teamId: account.teamId,\n keyId: account.keyId,\n issuerId: account.issuerId,\n }),\n token() {\n const seconds = Math.floor(now() / 1000);\n const encode = (v: unknown) => Buffer.from(JSON.stringify(v)).toString(\"base64url\");\n const message = `${encode({ alg: \"ES256\", kid: account.keyId, typ: \"JWT\" })}.${encode({ iss: account.issuerId, iat: seconds, exp: seconds + 300, aud: \"appstoreconnect-v1\" })}`;\n return `${message}.${sign(\"sha256\", Buffer.from(message), { key, dsaEncoding: \"ieee-p1363\" }).toString(\"base64url\")}`;\n },\n };\n}\n\nexport async function requirePrivateFile(filename: string): Promise<void> {\n let info;\n try {\n info = await stat(filename);\n } catch {\n throw new DeliveryError(\"credential_file_unreadable\", 2);\n }\n if (\n !info.isFile() ||\n (info.mode & 0o077) !== 0 ||\n (process.getuid && info.uid !== process.getuid())\n ) {\n throw new DeliveryError(\"credential_file_permissions\", 2);\n }\n}\n","import { createApiClient, ApiHttpError, NormalizedApiError } from \"@stackonward/api-client\";\nimport { z } from \"zod\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport {\n DeliveryError,\n type AppleGateway,\n type AppleResource,\n type ResourceReference,\n type Clock,\n} from \"./contracts.js\";\nimport type { AppleCredentials } from \"./credentials.js\";\n\nexport const APPLE_ORIGIN = \"https://api.appstoreconnect.apple.com\";\nconst reference = z.object({ type: z.string().min(1), id: z.string().min(1) });\nconst resource = reference.extend({\n attributes: z.record(z.string(), z.unknown()).default({}),\n relationships: z\n .record(\n z.string(),\n z.object({ data: z.union([reference, z.array(reference), z.null()]).optional() }),\n )\n .optional(),\n});\nexport const systemClock: Clock = {\n now: Date.now,\n async sleep(ms, signal) {\n await delay(ms, undefined, { signal });\n },\n};\n\n/** API 凭据只能发往官方 origin;资源上传不使用这个客户端。 */\nexport function createAppleGateway(\n credentials: AppleCredentials,\n options: { fetch?: typeof fetch; clock?: Clock; signal?: AbortSignal } = {},\n): AppleGateway {\n const fetcher = options.fetch ?? globalThis.fetch;\n const clock = options.clock ?? systemClock;\n const transport = createApiClient({\n baseUrl: APPLE_ORIGIN,\n timeout: 20_000,\n maxRetries: 0,\n headers: () => ({\n Authorization: `Bearer ${credentials.token()}`,\n \"User-Agent\": \"stackonward-apple/1\",\n }),\n fetch: async (input, init) => {\n const url = new URL(\n typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url,\n );\n if (url.origin !== APPLE_ORIGIN || url.username || url.password)\n throw new DeliveryError(\"untrusted_api_origin\", 2);\n return fetcher(input, { ...init, redirect: \"error\" });\n },\n });\n function apiPath(value: string): string {\n const url = new URL(value, APPLE_ORIGIN);\n if (\n url.origin !== APPLE_ORIGIN ||\n !/^\\/v[12]\\//.test(url.pathname) ||\n url.username ||\n url.password ||\n url.hash\n )\n throw new DeliveryError(\"invalid_api_path\", 2);\n return url.pathname + url.search;\n }\n async function request(\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\",\n location: string,\n body?: unknown,\n ): Promise<unknown> {\n if (options.signal?.aborted) throw new DeliveryError(\"cancelled\", 130);\n for (let attempt = 0; ; attempt++) {\n try {\n return await transport.request<unknown>(method, apiPath(location), {\n body,\n signal: options.signal,\n });\n } catch (error) {\n if (options.signal?.aborted)\n throw new DeliveryError(\n method === \"GET\" ? \"cancelled\" : \"apple_write_outcome_unknown\",\n method === \"GET\" ? 130 : 7,\n );\n const status = error instanceof NormalizedApiError ? error.statusCode : undefined;\n const retryable =\n status === 408 ||\n status === 429 ||\n (status !== undefined && status >= 500) ||\n (error instanceof NormalizedApiError && [\"network\", \"timeout\"].includes(error.kind));\n if (method === \"GET\" && retryable && attempt < 3) {\n const raw = error instanceof NormalizedApiError ? error.cause : undefined;\n const retry =\n raw instanceof ApiHttpError ? raw.response.headers.get(\"retry-after\") : null;\n const wait = retry\n ? /^\\d+$/.test(retry)\n ? Number(retry) * 1000\n : Date.parse(retry) - clock.now()\n : 500 * 2 ** attempt;\n await clock.sleep(\n Math.min(60_000, Math.max(500, Number.isFinite(wait) ? wait : 500)) +\n Math.floor(Math.random() * 100),\n options.signal,\n );\n continue;\n }\n if (error instanceof DeliveryError) throw error;\n const writeRejected =\n method !== \"GET\" &&\n status !== undefined &&\n status >= 400 &&\n status < 500 &&\n status !== 408;\n if (status === 401 || status === 403)\n throw new DeliveryError(\n status === 401 ? \"apple_authentication_failed\" : \"apple_permission_denied\",\n 3,\n undefined,\n status,\n false,\n writeRejected,\n );\n if (status === 409 || status === 422)\n throw new DeliveryError(\n \"apple_resource_conflict\",\n 4,\n undefined,\n status,\n false,\n writeRejected,\n );\n if (method !== \"GET\" && retryable && !writeRejected)\n throw new DeliveryError(\"apple_write_outcome_unknown\", 7, undefined, status);\n throw new DeliveryError(\n \"apple_request_failed\",\n 5,\n undefined,\n status,\n method === \"GET\" && retryable,\n writeRejected,\n );\n }\n }\n }\n function decode(value: unknown): AppleResource {\n const parsed = z.object({ data: resource }).safeParse(value);\n if (!parsed.success) throw new DeliveryError(\"invalid_apple_response\", 5);\n return parsed.data.data;\n }\n return {\n async list(location, query = {}) {\n const url = new URL(apiPath(location), APPLE_ORIGIN);\n for (const [key, value] of Object.entries(query)) url.searchParams.set(key, value);\n let next: string | null = url.href;\n const visited = new Set<string>();\n const all: AppleResource[] = [];\n while (next) {\n const current = apiPath(next);\n if (visited.has(current) || visited.size >= 1000)\n throw new DeliveryError(\"invalid_apple_pagination\", 5);\n visited.add(current);\n const parsed = z\n .object({\n data: z.array(resource),\n links: z.object({ next: z.string().nullable().optional() }).optional(),\n })\n .safeParse(await request(\"GET\", current));\n if (!parsed.success) throw new DeliveryError(\"invalid_apple_response\", 5);\n all.push(...parsed.data.data);\n next = parsed.data.links?.next ?? null;\n }\n return all;\n },\n async read(location) {\n return decode(await request(\"GET\", location));\n },\n async create(location, type, attributes, relationships, included) {\n return decode(\n await request(\"POST\", location, {\n data: {\n type,\n ...(Object.keys(attributes).length ? { attributes } : {}),\n ...(relationships ? { relationships } : {}),\n },\n ...(included ? { included } : {}),\n }),\n );\n },\n async update(location, ref, attributes, relationships) {\n return decode(\n await request(\"PATCH\", location, {\n data: {\n type: ref.type,\n id: ref.id,\n ...(Object.keys(attributes).length ? { attributes } : {}),\n ...(relationships ? { relationships } : {}),\n },\n }),\n );\n },\n async remove(location) {\n await request(\"DELETE\", location);\n },\n async relationship(location, data, method = \"POST\") {\n await request(method, location, { data });\n },\n };\n}\n\nexport function relation(type: string, id: string): { data: ResourceReference } {\n return { data: { type, id } };\n}\nexport function selectOne(values: AppleResource[], code: string): AppleResource | undefined {\n if (values.length > 1) throw new DeliveryError(code, 4);\n return values[0];\n}\nexport function stringAttribute(resource: AppleResource, field: string): string {\n const value = resource.attributes[field];\n if (typeof value !== \"string\") throw new DeliveryError(\"invalid_apple_attribute\", 5, field);\n return value;\n}\n\n/** 父资源已确认存在时,可选关系的 404 表示尚未配置;权限与传输失败必须保留。 */\nexport async function readOptionalRelationship<T>(read: () => Promise<T>): Promise<T | undefined> {\n try {\n return await read();\n } catch (error) {\n if (error instanceof DeliveryError && error.httpStatus === 404) return undefined;\n throw error;\n }\n}\n","import { mkdir, open, rename, rm, lstat, realpath, readFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { z } from \"zod\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { DeliveryError, type ResourceReference } from \"./contracts.js\";\nimport { digest, parseSchema } from \"./manifest.js\";\n\n/** 写入私有执行目录时拒绝符号链接,避免覆盖调用者的其它文件。 */\nexport async function privateDirectory(directory: string): Promise<string> {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n const info = await lstat(directory);\n if (!info.isDirectory() || info.isSymbolicLink() || (info.mode & 0o077) !== 0)\n throw new DeliveryError(\"state_directory_permissions\", 2);\n return realpath(directory);\n}\nexport async function writePrivateJson(filename: string, value: unknown): Promise<void> {\n const directory = await privateDirectory(path.dirname(filename));\n const target = path.join(directory, path.basename(filename));\n const temporary = path.join(directory, `.${randomUUID()}.json`);\n const handle = await open(temporary, \"wx\", 0o600);\n try {\n await handle.writeFile(JSON.stringify(value, null, 2) + \"\\n\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n try {\n await rename(temporary, target);\n } finally {\n await rm(temporary, { force: true });\n }\n}\n\n/** 锁只保证同机单写者;CI 必须为相同账号和 App 配置串行组。 */\nexport async function acquireLock(\n _directory: string,\n fingerprint: string,\n bundleId: string,\n): Promise<() => Promise<void>> {\n const root = await privateDirectory(path.join(os.homedir(), \".stackonward\", \"apple-locks\"));\n const lock = path.join(root, `${digest({ fingerprint, bundleId })}.lock`);\n let handle;\n try {\n handle = await open(lock, \"wx\", 0o600);\n } catch {\n throw new DeliveryError(\"delivery_locked\", 4);\n }\n await handle.writeFile(JSON.stringify({ pid: process.pid, startedAt: new Date().toISOString() }));\n await handle.close();\n return async () => {\n await rm(lock);\n };\n}\n\nconst bindingsSchema = z.record(z.string(), z.strictObject({ type: z.string(), id: z.string() }));\nexport function bindingPath(directory: string, fingerprint: string, bundleId: string): string {\n return path.join(directory, `${digest({ fingerprint, bundleId })}.bindings.json`);\n}\nexport async function readBindings(filename: string): Promise<Record<string, ResourceReference>> {\n let bytes: string;\n try {\n bytes = await readFile(filename, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return {};\n throw new DeliveryError(\"bindings_unreadable\", 2);\n }\n try {\n return parseSchema(bindingsSchema, JSON.parse(bytes));\n } catch {\n throw new DeliveryError(\"invalid_bindings\", 2);\n }\n}\n","import {\n DeliveryError,\n type AppleResource,\n type DeliveryPlan,\n type Intent,\n type ManualRequirement,\n type Operation,\n type ResourceReference,\n} from \"./contracts.js\";\nimport { canonical, digest, type LoadedManifest } from \"./manifest.js\";\n\nexport interface Change {\n operation: Operation;\n resumeBoundResource?: boolean;\n apply(): Promise<ResourceReference>;\n}\nexport interface PreparedDelivery {\n plan: DeliveryPlan;\n changes: Change[];\n resources: ResourceReference[];\n satisfied: Record<string, string>;\n connectRecorder(record: (key: string, value: ResourceReference) => Promise<void>): void;\n}\n\n/** 闭包只由具名资源适配器构造;磁盘计划不能指定请求或可执行代码。 */\nexport class PlanBuilder {\n readonly changes: Change[] = [];\n readonly requirements: ManualRequirement[] = [];\n readonly resources = new Map<string, AppleResource>();\n private snapshots: Record<string, unknown> = {};\n private satisfiedDigests: Record<string, string> = {};\n private recorder?: (key: string, value: ResourceReference) => Promise<void>;\n constructor(\n readonly loaded: LoadedManifest,\n readonly intent: Intent,\n readonly fingerprint: string,\n readonly now: number,\n readonly bindings: Record<string, ResourceReference> = {},\n ) {}\n\n async record(key: string, value: ResourceReference): Promise<void> {\n await this.recorder?.(key, { type: value.type, id: value.id });\n }\n\n observe(key: string, current: AppleResource | undefined): void {\n this.snapshots[key] = current ?? null;\n if (current) this.resources.set(key, current);\n }\n satisfy(key: string, desired: unknown): void {\n this.satisfiedDigests[key] = digest(desired);\n }\n require(key: string): AppleResource {\n const value = this.resources.get(key);\n if (!value) throw new DeliveryError(\"resource_dependency_missing\", 4, key);\n return value;\n }\n manual(\n code: string,\n reason: string,\n blockedOperationIds: string[],\n consoleUrl = \"https://appstoreconnect.apple.com/apps\",\n ): void {\n this.requirements.push({\n code,\n stage: this.intent.scope,\n reason,\n blockedOperationIds,\n consoleUrl,\n evidence: \"remote-readback\",\n });\n }\n ensure(\n key: string,\n current: AppleResource | undefined,\n desired: Record<string, unknown>,\n create: () => Promise<AppleResource>,\n update: (value: AppleResource, changed: Record<string, unknown>) => Promise<AppleResource>,\n dependencies: string[] = [],\n ): void {\n this.observe(key, current);\n const changed = Object.fromEntries(\n Object.entries(desired).filter(\n ([field, value]) => canonical(current?.attributes[field]) !== canonical(value),\n ),\n );\n if (current && Object.keys(changed).length === 0) {\n this.satisfy(key, desired);\n return;\n }\n this.add(\n key,\n current ? \"update\" : \"create\",\n current?.attributes ?? null,\n desired,\n Object.keys(changed),\n async () => {\n const result = current ? await update(current, changed) : await create();\n this.resources.set(key, result);\n for (const [field, expected] of Object.entries(desired))\n if (canonical(result.attributes[field]) !== canonical(expected))\n throw new DeliveryError(\"resource_readback_mismatch\", 5, `${key}.${field}`);\n return result;\n },\n dependencies,\n );\n }\n add(\n key: string,\n action: Operation[\"action\"],\n before: unknown,\n desired: unknown,\n fields: string[],\n effect: () => Promise<ResourceReference>,\n dependencies: string[] = [],\n resumeBoundResource = false,\n ): void {\n const operation: Operation = {\n id: key,\n resourceKey: key,\n action,\n fields,\n dependencies,\n beforeDigest: digest(before),\n desiredDigest: digest(desired),\n };\n if (this.changes.some((c) => c.operation.id === key))\n throw new DeliveryError(\"duplicate_operation\", 2, key);\n this.changes.push({\n operation,\n resumeBoundResource,\n apply: async () => {\n const result = await effect();\n await this.record(key, result);\n if (!this.resources.has(key)) this.resources.set(key, { ...result, attributes: {} });\n return result;\n },\n });\n }\n finish(): PreparedDelivery {\n return {\n plan: {\n schemaVersion: 1,\n intent: this.intent,\n scope: this.intent.scope,\n accountFingerprint: this.fingerprint,\n bundleId: this.loaded.manifest.app.bundleId,\n appId: this.loaded.manifest.app.appId,\n inputDigest: this.loaded.inputDigest,\n snapshotDigest: digest(this.snapshots),\n createdAt: new Date(this.now).toISOString(),\n expiresAt: new Date(this.now + 900_000).toISOString(),\n operations: this.changes.map((c) => c.operation),\n manualRequirements: this.requirements,\n ...(this.intent.scope === \"pricing\"\n ? {\n commercialConfiguration: {\n appPricing: this.loaded.manifest.appPricing,\n availability: this.loaded.manifest.availability,\n gracePeriod: this.loaded.manifest.catalog?.gracePeriod,\n products: this.loaded.manifest.catalog?.items.map((item) => ({\n productId: item.productId,\n prices: item.prices,\n availability: item.availability,\n ...(item.kind === \"subscription\"\n ? { offers: item.offers }\n : { baseTerritory: item.baseTerritory }),\n })),\n },\n }\n : {}),\n },\n changes: this.changes,\n resources: [...this.resources.values()].map(({ type, id }) => ({ type, id })),\n satisfied: this.satisfiedDigests,\n connectRecorder: (record) => {\n this.recorder = record;\n },\n };\n }\n}\n\nexport function verifyPlan(saved: DeliveryPlan, fresh: DeliveryPlan, now: number): void {\n if (\n saved.schemaVersion !== 1 ||\n !Number.isFinite(Date.parse(saved.createdAt)) ||\n !Number.isFinite(Date.parse(saved.expiresAt)) ||\n Date.parse(saved.expiresAt) <= Date.parse(saved.createdAt) ||\n now >= Date.parse(saved.expiresAt) ||\n Date.parse(saved.createdAt) > now ||\n Date.parse(saved.expiresAt) - Date.parse(saved.createdAt) > 900_000\n )\n throw new DeliveryError(\"plan_expired\", 4);\n for (const field of [\n \"intent\",\n \"scope\",\n \"accountFingerprint\",\n \"bundleId\",\n \"appId\",\n \"inputDigest\",\n \"snapshotDigest\",\n \"operations\",\n \"manualRequirements\",\n \"commercialConfiguration\",\n ] as const) {\n if (canonical(saved[field]) !== canonical(fresh[field]))\n throw new DeliveryError(\"plan_stale\", 4, field);\n }\n}\n","import path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { DeliveryError, type DeliveryPlan, type ExecutionReceipt } from \"./contracts.js\";\nimport { verifyPlan, type PreparedDelivery } from \"./plan.js\";\nimport { acquireLock, writePrivateJson, bindingPath, readBindings } from \"./state.js\";\nimport { readJsonFile, digest, parseSchema } from \"./manifest.js\";\nimport { access } from \"node:fs/promises\";\nimport { z } from \"zod\";\n\n/** 执行前在锁内重建计划,只执行与已确认意图和输入相同的闭包。 */\nexport async function executePlan(\n saved: DeliveryPlan,\n prepare: () => Promise<PreparedDelivery>,\n stateDirectory: string,\n signal?: AbortSignal,\n): Promise<{ receipt: ExecutionReceipt; receiptPath: string }> {\n const unlock = await acquireLock(stateDirectory, saved.accountFingerprint, saved.bundleId);\n const receiptPath = path.join(stateDirectory, `${randomUUID()}.receipt.json`);\n try {\n const fresh = await prepare();\n verifyPlan(saved, fresh.plan, Date.now());\n for (const change of fresh.changes) {\n const action = change.operation.action;\n const special: Record<string, string[]> = {\n \"assets.remove-owned-assets\": [\"remove-owned-asset\"],\n \"review.submit\": [\"submit\"],\n \"review.withdraw\": [\"withdraw\"],\n \"review.prepare\": [\"create\", \"update\"],\n \"testflight.invite\": [\"invite\"],\n \"testflight.distribute\": [\"distribute\"],\n \"testflight.review\": [\"submit\"],\n \"release.publish\": [\"release\"],\n \"release.pause\": [\"pause\"],\n \"release.resume\": [\"resume\"],\n \"release.complete\": [\"complete\"],\n };\n const allowed = special[`${saved.scope}.${saved.intent.action}`] ?? [\n \"create\",\n \"update\",\n \"upload\",\n ];\n if (!allowed.includes(action))\n throw new DeliveryError(\"operation_outside_intent\", 4, change.operation.id);\n }\n const bindingsFile = bindingPath(stateDirectory, saved.accountFingerprint, saved.bundleId);\n const bindings = await readBindings(bindingsFile);\n const journalPath = path.join(\n stateDirectory,\n `${digest({ account: saved.accountFingerprint, bundle: saved.bundleId })}.journal.json`,\n );\n let journal: Record<\n string,\n { desiredDigest: string; status: \"in-flight\" | \"unknown\" | \"verified\" | \"rejected\" }\n > = {};\n let journalExists = true;\n try {\n await access(journalPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") journalExists = false;\n else throw error;\n }\n if (journalExists)\n journal = parseSchema(\n z.record(\n z.string(),\n z.strictObject({\n desiredDigest: z.string(),\n status: z.enum([\"in-flight\", \"unknown\", \"verified\", \"rejected\"]),\n }),\n ),\n await readJsonFile(journalPath),\n );\n for (const [key, desiredDigest] of Object.entries(fresh.satisfied)) {\n const entry = journal[`${saved.scope}.${key}`];\n if (entry?.desiredDigest === desiredDigest) entry.status = \"verified\";\n }\n await writePrivateJson(journalPath, journal);\n fresh.connectRecorder(async (key, value) => {\n bindings[key] = value;\n await writePrivateJson(bindingsFile, bindings);\n });\n const receipt: ExecutionReceipt = {\n executionId: randomUUID(),\n intent: saved.intent,\n scope: saved.scope,\n inputDigest: saved.inputDigest,\n outcome: \"unknown\",\n completed: [],\n pending: saved.operations.map((v) => v.id),\n manualRequirements: fresh.plan.manualRequirements,\n };\n const blocked = new Set(receipt.manualRequirements.flatMap((r) => r.blockedOperationIds));\n const completed = new Set<string>();\n let activeJournalKey: string | undefined;\n try {\n for (const change of fresh.changes) {\n if (signal?.aborted) throw new DeliveryError(\"cancelled\", 130);\n if (\n blocked.has(change.operation.id) ||\n change.operation.dependencies.some((dep) => blocked.has(dep))\n ) {\n blocked.add(change.operation.id);\n continue;\n }\n if (\n change.operation.dependencies.some(\n (dep) => fresh.changes.some((v) => v.operation.id === dep) && !completed.has(dep),\n )\n )\n throw new DeliveryError(\"operation_dependency_incomplete\", 4);\n const journalKey = `${saved.scope}.${change.operation.id}`;\n const unresolved = journal[journalKey];\n if (\n unresolved &&\n ![\"verified\", \"rejected\"].includes(unresolved.status) &&\n !(\n change.resumeBoundResource &&\n bindings[change.operation.resourceKey] &&\n unresolved.desiredDigest === change.operation.desiredDigest\n )\n )\n throw new DeliveryError(\"previous_write_requires_reconciliation\", 7, change.operation.id);\n activeJournalKey = journalKey;\n journal[journalKey] = {\n desiredDigest: change.operation.desiredDigest,\n status: \"in-flight\",\n };\n await writePrivateJson(journalPath, journal);\n await writePrivateJson(receiptPath, receipt);\n const resource = await change.apply();\n receipt.completed.push({ type: resource.type, id: resource.id });\n completed.add(change.operation.id);\n receipt.pending = receipt.pending.filter((id) => id !== change.operation.id);\n journal[journalKey].status = \"verified\";\n await writePrivateJson(journalPath, journal);\n activeJournalKey = undefined;\n await writePrivateJson(receiptPath, receipt);\n }\n receipt.outcome = receipt.manualRequirements.length ? \"blocked\" : \"verified\";\n } catch (error) {\n const failure =\n error instanceof DeliveryError ? error : new DeliveryError(\"delivery_operation_failed\", 5);\n if (activeJournalKey) {\n const local =\n saved.scope === \"native\" ||\n saved.scope === \"build\" ||\n (saved.scope === \"signing\" && saved.intent.action === \"sync\");\n journal[activeJournalKey].status = local || failure.writeRejected ? \"rejected\" : \"unknown\";\n await writePrivateJson(journalPath, journal);\n }\n receipt.outcome =\n failure.exitCode === 7 ||\n (activeJournalKey && journal[activeJournalKey].status === \"unknown\")\n ? \"unknown\"\n : failure.exitCode === 130\n ? \"cancelled\"\n : \"failed\";\n receipt.failure = {\n code: failure.code,\n httpStatus: failure.httpStatus,\n field: failure.field,\n retryable: failure.retryable,\n };\n }\n await writePrivateJson(receiptPath, receipt);\n return { receipt, receiptPath };\n } finally {\n await unlock();\n }\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { selectOne, relation } from \"../api.js\";\nimport type { PlanBuilder } from \"../plan.js\";\n\nexport async function findApp(\n builder: PlanBuilder,\n api: AppleGateway,\n): Promise<AppleResource | undefined> {\n const config = builder.loaded.manifest.app;\n const app = selectOne(\n await api.list(\"/v1/apps\", { \"filter[bundleId]\": config.bundleId, limit: \"200\" }),\n \"ambiguous_app\",\n );\n if (\n app &&\n (app.attributes.bundleId !== config.bundleId ||\n (config.appId && app.id !== config.appId) ||\n (config.sku && app.attributes.sku !== config.sku) ||\n (config.primaryLocale && app.attributes.primaryLocale !== config.primaryLocale))\n )\n throw new DeliveryError(\"app_identity_mismatch\", 4);\n builder.observe(\"app\", app);\n if (!app)\n builder.manual(\n \"app_record_required\",\n \"Create the App Store Connect record using the configured Bundle ID, SKU and primary locale.\",\n [\"app.bind\"],\n );\n return app;\n}\n\n/** 只管理显式启用的能力,未声明的已有能力保持原样。 */\nexport async function planIdentifiers(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const { app: config, capabilities } = builder.loaded.manifest;\n const bundle = selectOne(\n await api.list(\"/v1/bundleIds\", { \"filter[identifier]\": config.bundleId, limit: \"200\" }),\n \"ambiguous_bundle_id\",\n );\n if (bundle && bundle.attributes.identifier !== config.bundleId)\n throw new DeliveryError(\"bundle_identity_mismatch\", 4);\n const desired = { identifier: config.bundleId, name: config.name, platform: \"UNIVERSAL\" };\n builder.ensure(\n \"bundle\",\n bundle,\n desired,\n async () => {\n const value = await api.create(\"/v1/bundleIds\", \"bundleIds\", desired);\n return api.read(`/v1/bundleIds/${value.id}`);\n },\n async (value, fields) => {\n if (fields.identifier || fields.platform)\n throw new DeliveryError(\"bundle_immutable_field\", 4);\n await api.update(`/v1/bundleIds/${value.id}`, value, fields);\n return api.read(`/v1/bundleIds/${value.id}`);\n },\n );\n const current = bundle ? await api.list(`/v1/bundleIds/${bundle.id}/bundleIdCapabilities`) : [];\n for (const [field, type] of Object.entries({\n signInWithApple: \"APPLE_ID_AUTH\",\n pushNotifications: \"PUSH_NOTIFICATIONS\",\n inAppPurchase: \"IN_APP_PURCHASE\",\n })) {\n const enabled = capabilities[field as keyof typeof capabilities];\n if (enabled === undefined) continue;\n const existing = selectOne(\n current.filter((v) => v.attributes.capabilityType === type),\n \"ambiguous_capability\",\n );\n builder.observe(`capability.${type}`, existing);\n const settings =\n type === \"APPLE_ID_AUTH\"\n ? [\n {\n key: \"APPLE_ID_AUTH_APP_CONSENT\",\n options: [{ key: \"PRIMARY_APP_CONSENT\", enabled: true }],\n },\n ]\n : undefined;\n const agrees = existing && (!settings || primaryConsentEnabled(existing));\n if (agrees) {\n builder.satisfy(`capability.${type}`, { capabilityType: type, settings });\n continue;\n }\n builder.add(\n `capability.${type}`,\n existing ? \"update\" : \"create\",\n existing?.attributes ?? null,\n { capabilityType: type, settings },\n [\"capabilityType\", ...(settings ? [\"settings\"] : [])],\n async () => {\n const parent = builder.require(\"bundle\");\n if (existing)\n await api.update(`/v1/bundleIdCapabilities/${existing.id}`, existing, { settings });\n else\n await api.create(\n \"/v1/bundleIdCapabilities\",\n \"bundleIdCapabilities\",\n { capabilityType: type, ...(settings ? { settings } : {}) },\n { bundleId: relation(\"bundleIds\", parent.id) },\n );\n const found = selectOne(\n (await api.list(`/v1/bundleIds/${parent.id}/bundleIdCapabilities`)).filter(\n (v) => v.attributes.capabilityType === type,\n ),\n \"ambiguous_capability\",\n );\n if (!found) throw new DeliveryError(\"capability_readback_failed\", 5);\n if (settings && !primaryConsentEnabled(found))\n throw new DeliveryError(\"capability_settings_mismatch\", 5);\n return found;\n },\n [\"bundle\"],\n );\n }\n await findApp(builder, api);\n}\n\nfunction primaryConsentEnabled(value: AppleResource): boolean {\n return (\n Array.isArray(value.attributes.settings) &&\n value.attributes.settings.some((setting: unknown) => {\n if (\n !setting ||\n typeof setting !== \"object\" ||\n !(\"key\" in setting) ||\n setting.key !== \"APPLE_ID_AUTH_APP_CONSENT\" ||\n !(\"options\" in setting) ||\n !Array.isArray(setting.options)\n )\n return false;\n return setting.options.some(\n (option: unknown) =>\n !!option &&\n typeof option === \"object\" &&\n \"key\" in option &&\n option.key === \"PRIMARY_APP_CONSENT\" &&\n (!(\"enabled\" in option) || option.enabled === true),\n );\n })\n );\n}\n","import { z } from \"zod\";\nimport type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { localeFields, parseSchema, readJsonFile, canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { requirePrivateFile } from \"../credentials.js\";\nimport path from \"node:path\";\nimport { findApp } from \"./identifiers.js\";\n\nconst editable = new Set([\n \"PREPARE_FOR_SUBMISSION\",\n \"DEVELOPER_REJECTED\",\n \"REJECTED\",\n \"METADATA_REJECTED\",\n]);\nexport function assertEditable(value: AppleResource): void {\n const state = value.attributes.appStoreState ?? value.attributes.state;\n if (typeof state !== \"string\" || !editable.has(state))\n throw new DeliveryError(\"resource_not_editable\", 4, value.type);\n}\n\n/** 精确版本查找;没有版本配置时不选择远端最新构建。 */\nexport async function appVersion(\n builder: PlanBuilder,\n api: AppleGateway,\n create = false,\n): Promise<AppleResource | undefined> {\n const app = builder.resources.get(\"app\") ?? (await findApp(builder, api));\n if (!app) return;\n const release = builder.loaded.manifest.release;\n if (!release) throw new DeliveryError(\"release_configuration_required\", 2);\n const version = selectOne(\n (\n await api.list(`/v1/apps/${app.id}/appStoreVersions`, {\n \"filter[platform]\": \"IOS\",\n \"filter[versionString]\": release.version,\n })\n ).filter(\n (v) => v.attributes.versionString === release.version && v.attributes.platform === \"IOS\",\n ),\n \"ambiguous_app_version\",\n );\n builder.observe(\"app.version\", version);\n if (!version && create) {\n const desired = { versionString: release.version, platform: \"IOS\", releaseType: \"MANUAL\" };\n builder.ensure(\n \"app.version\",\n undefined,\n desired,\n async () => {\n const value = await api.create(\"/v1/appStoreVersions\", \"appStoreVersions\", desired, {\n app: relation(\"apps\", app.id),\n });\n return api.read(`/v1/appStoreVersions/${value.id}`);\n },\n async () => {\n throw new DeliveryError(\"unexpected_version_update\", 4);\n },\n );\n } else if (!version)\n builder.manual(\n \"app_version_required\",\n \"Prepare the configured App Store version before this operation.\",\n [\"app.version\"],\n );\n return version;\n}\n\nexport async function planMetadata(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const app = await findApp(builder, api);\n if (!app) return;\n const config = builder.loaded.manifest.metadata;\n if (!config) throw new DeliveryError(\"metadata_configuration_required\", 2);\n const version = await appVersion(builder, api, true);\n const versionState = version?.attributes.appStoreState ?? version?.attributes.state;\n const info = selectOne(\n (await api.list(`/v1/apps/${app.id}/appInfos`)).filter((v) =>\n versionState && !editable.has(String(versionState))\n ? (v.attributes.appStoreState ?? v.attributes.state) === versionState\n : editable.has(String(v.attributes.appStoreState ?? v.attributes.state)),\n ),\n \"ambiguous_editable_app_info\",\n );\n if (!info) throw new DeliveryError(\"editable_app_info_required\", 4);\n builder.observe(\"app.info\", info);\n const infoLocales = await api.list(`/v1/appInfos/${info.id}/appInfoLocalizations`);\n const versionLocales = version\n ? await api.list(`/v1/appStoreVersions/${version.id}/appStoreVersionLocalizations`)\n : [];\n for (const local of config.localizations) {\n const values = localeFields(builder.loaded, local.file);\n const common = Object.fromEntries(\n Object.entries(values).filter(([key]) =>\n [\"name\", \"subtitle\", \"privacyPolicyUrl\", \"privacyChoicesUrl\"].includes(key),\n ),\n );\n const versionFields = Object.fromEntries(\n Object.entries(values).filter(([key]) => !Object.hasOwn(common, key)),\n );\n for (const [kind, list, desiredFields, parentKey, parentType, relationshipKey] of [\n [\"appInfoLocalizations\", infoLocales, common, \"app.info\", \"appInfos\", \"appInfo\"],\n [\n \"appStoreVersionLocalizations\",\n versionLocales,\n versionFields,\n \"app.version\",\n \"appStoreVersions\",\n \"appStoreVersion\",\n ],\n ] as const) {\n if (!Object.keys(desiredFields).length) continue;\n const current = selectOne(\n list.filter((v) => v.attributes.locale === local.locale),\n \"ambiguous_localization\",\n );\n const modifiedFields = Object.keys(desiredFields).filter(\n (field) => canonical(current?.attributes[field]) !== canonical(desiredFields[field]),\n );\n const target = kind === \"appInfoLocalizations\" ? info : version;\n const liveFields =\n kind === \"appInfoLocalizations\"\n ? [\"privacyPolicyUrl\", \"privacyChoicesUrl\"]\n : [\"promotionalText\"];\n if (target && modifiedFields.some((field) => !liveFields.includes(field)))\n assertEditable(target);\n if (!current && kind === \"appInfoLocalizations\" && !common.name)\n throw new DeliveryError(\"localized_name_required\", 2, local.locale);\n const desired = { locale: local.locale, ...desiredFields };\n builder.ensure(\n `${kind}.${local.locale}`,\n current,\n desired,\n async () => {\n const created = await api.create(`/v1/${kind}`, kind, desired, {\n [relationshipKey]: relation(parentType, builder.require(parentKey).id),\n });\n return api.read(`/v1/${kind}/${created.id}`);\n },\n async (value, fields) => {\n const { locale: ignored, ...patch } = fields;\n if (ignored) throw new DeliveryError(\"locale_immutable\", 4);\n await api.update(`/v1/${kind}/${value.id}`, value, patch);\n return api.read(`/v1/${kind}/${value.id}`);\n },\n [parentKey],\n );\n }\n }\n if (config.copyright !== undefined && version?.attributes.copyright !== config.copyright) {\n if (version) assertEditable(version);\n const desired = { copyright: config.copyright };\n builder.add(\n \"app.copyright\",\n \"update\",\n version?.attributes.copyright,\n desired,\n [\"copyright\"],\n async () => {\n const target = builder.require(\"app.version\");\n await api.update(`/v1/appStoreVersions/${target.id}`, target, desired);\n const read = await api.read(`/v1/appStoreVersions/${target.id}`);\n if (read.attributes.copyright !== desired.copyright)\n throw new DeliveryError(\"metadata_readback_failed\", 5);\n return read;\n },\n [\"app.version\"],\n );\n }\n for (const field of [\"primaryCategory\", \"secondaryCategory\"] as const) {\n const desired = config[field];\n if (desired === undefined) continue;\n const category = await api.read(`/v1/appCategories/${encodeURIComponent(desired)}`);\n const currentInfo = await api.read(`/v1/appInfos/${info.id}?include=${field}`);\n const linked = currentInfo.relationships?.[field]?.data;\n if (linked && !Array.isArray(linked) && linked.id === category.id) continue;\n assertEditable(info);\n builder.add(`app.${field}`, \"update\", linked, category.id, [field], async () => {\n await api.update(\n `/v1/appInfos/${info.id}`,\n info,\n {},\n { [field]: relation(\"appCategories\", category.id) },\n );\n const result = await api.read(`/v1/appInfos/${info.id}?include=${field}`);\n if (\n canonical(result.relationships?.[field]?.data) !==\n canonical({ type: \"appCategories\", id: category.id })\n )\n throw new DeliveryError(\"category_readback_failed\", 5);\n return result;\n });\n }\n if (config.ageRatingFile) await planAgeRating(builder, api, info, config.ageRatingFile);\n if (config.licenseAgreementFile)\n await planLicense(builder, api, app, config.licenseAgreementFile);\n if (builder.loaded.manifest.review) await planReviewInformation(builder, api, version);\n}\n\nconst frequency = z.enum([\n \"NONE\",\n \"INFREQUENT_OR_MILD\",\n \"FREQUENT_OR_INTENSE\",\n \"INFREQUENT\",\n \"FREQUENT\",\n]);\nconst ageSchema = z.strictObject({\n advertising: z.boolean().optional(),\n alcoholTobaccoOrDrugUseOrReferences: frequency.optional(),\n contests: frequency.optional(),\n gambling: z.boolean().optional(),\n gamblingSimulated: frequency.optional(),\n gunsOrOtherWeapons: frequency.optional(),\n healthOrWellnessTopics: z.boolean().optional(),\n lootBox: z.boolean().optional(),\n medicalOrTreatmentInformation: frequency.optional(),\n messagingAndChat: z.boolean().optional(),\n parentalControls: z.boolean().optional(),\n profanityOrCrudeHumor: frequency.optional(),\n ageAssurance: z.boolean().optional(),\n sexualContentGraphicAndNudity: frequency.optional(),\n sexualContentOrNudity: frequency.optional(),\n horrorOrFearThemes: frequency.optional(),\n matureOrSuggestiveThemes: frequency.optional(),\n unrestrictedWebAccess: z.boolean().optional(),\n userGeneratedContent: z.boolean().optional(),\n violenceCartoonOrFantasy: frequency.optional(),\n violenceRealisticProlongedGraphicOrSadistic: frequency.optional(),\n violenceRealistic: frequency.optional(),\n ageRatingOverrideV2: z\n .enum([\"NONE\", \"NINE_PLUS\", \"THIRTEEN_PLUS\", \"SIXTEEN_PLUS\", \"EIGHTEEN_PLUS\", \"UNRATED\"])\n .optional(),\n koreaAgeRatingOverride: z.enum([\"NONE\", \"FIFTEEN_PLUS\", \"NINETEEN_PLUS\"]).optional(),\n developerAgeRatingInfoUrl: z.url().optional(),\n kidsAgeBand: z.enum([\"FIVE_AND_UNDER\", \"SIX_TO_EIGHT\", \"NINE_TO_ELEVEN\"]).optional(),\n});\nasync function planAgeRating(\n builder: PlanBuilder,\n api: AppleGateway,\n info: AppleResource,\n filename: string,\n): Promise<void> {\n const desired = parseSchema(\n ageSchema,\n JSON.parse(builder.loaded.files.get(filename)!.toString(\"utf8\")),\n );\n const current = await api.read(`/v1/appInfos/${info.id}/ageRatingDeclaration`);\n builder.ensure(\n \"app.ageRating\",\n current,\n desired,\n async () => {\n throw new DeliveryError(\"age_rating_resource_missing\", 4);\n },\n async (value, fields) => {\n await api.update(`/v1/ageRatingDeclarations/${value.id}`, value, fields);\n return api.read(`/v1/ageRatingDeclarations/${value.id}`);\n },\n );\n}\nasync function planLicense(\n builder: PlanBuilder,\n api: AppleGateway,\n app: AppleResource,\n filename: string,\n): Promise<void> {\n const desired = parseSchema(\n z.strictObject({\n agreementText: z.string().min(1),\n territories: z.array(z.string().regex(/^[A-Z]{3}$/)).min(1),\n }),\n JSON.parse(builder.loaded.files.get(filename)!.toString(\"utf8\")),\n );\n const fullApp = await api.read(`/v1/apps/${app.id}?include=endUserLicenseAgreement`);\n const ref = fullApp.relationships?.endUserLicenseAgreement?.data;\n const current =\n ref && !Array.isArray(ref)\n ? await api.read(`/v1/endUserLicenseAgreements/${ref.id}`)\n : undefined;\n const relationships = {\n app: relation(\"apps\", app.id),\n territories: { data: desired.territories.map((id) => ({ type: \"territories\", id })) },\n };\n const currentTerritories = current\n ? await api.list(`/v1/endUserLicenseAgreements/${current.id}/territories`)\n : [];\n const projection = {\n agreementText: current?.attributes.agreementText,\n territories: currentTerritories.map((v) => v.id).sort(),\n };\n if (\n canonical(projection) ===\n canonical({ ...desired, territories: [...desired.territories].sort() })\n )\n return;\n builder.add(\n \"app.license\",\n current ? \"update\" : \"create\",\n projection,\n desired,\n [\"agreementText\", \"territories\"],\n async () => {\n const result = current\n ? await api.update(\n `/v1/endUserLicenseAgreements/${current.id}`,\n current,\n { agreementText: desired.agreementText },\n { territories: relationships.territories },\n )\n : await api.create(\n \"/v1/endUserLicenseAgreements\",\n \"endUserLicenseAgreements\",\n { agreementText: desired.agreementText },\n relationships,\n );\n const value = await api.read(`/v1/endUserLicenseAgreements/${result.id}`);\n const regions = await api.list(`/v1/endUserLicenseAgreements/${result.id}/territories`);\n if (\n value.attributes.agreementText !== desired.agreementText ||\n canonical(regions.map((v) => v.id).sort()) !== canonical([...desired.territories].sort())\n )\n throw new DeliveryError(\"license_readback_failed\", 5);\n return value;\n },\n );\n}\n\nexport async function planReviewInformation(\n builder: PlanBuilder,\n api: AppleGateway,\n version?: AppleResource,\n): Promise<void> {\n const config = builder.loaded.manifest.review;\n if (!config) return;\n const location = path.resolve(builder.loaded.directory, config.credentialsRef);\n await requirePrivateFile(location);\n const desired = parseSchema(\n z.strictObject({\n contactFirstName: z.string().min(1),\n contactLastName: z.string().min(1),\n contactEmail: z.email(),\n contactPhone: z.string().regex(/^\\+[1-9]\\d{6,14}$/),\n demoAccountRequired: z.boolean(),\n demoAccountName: z.string().optional(),\n demoAccountPassword: z.string().optional(),\n }),\n await readJsonFile(location),\n );\n if (desired.demoAccountRequired && (!desired.demoAccountName || !desired.demoAccountPassword))\n throw new DeliveryError(\"review_demo_credentials_required\", 2);\n const attributes = {\n ...desired,\n ...(config.notesFile\n ? { notes: builder.loaded.files.get(config.notesFile)!.toString(\"utf8\") }\n : {}),\n };\n let current: AppleResource | undefined;\n if (version) {\n const full = await api.read(`/v1/appStoreVersions/${version.id}?include=appStoreReviewDetail`);\n const ref = full.relationships?.appStoreReviewDetail?.data;\n if (ref && !Array.isArray(ref)) current = await api.read(`/v1/appStoreReviewDetails/${ref.id}`);\n }\n builder.ensure(\n \"app.reviewInformation\",\n current,\n attributes,\n async () => {\n const created = await api.create(\n \"/v1/appStoreReviewDetails\",\n \"appStoreReviewDetails\",\n attributes,\n { appStoreVersion: relation(\"appStoreVersions\", builder.require(\"app.version\").id) },\n );\n return api.read(`/v1/appStoreReviewDetails/${created.id}`);\n },\n async (value, changed) => {\n await api.update(`/v1/appStoreReviewDetails/${value.id}`, value, changed);\n return api.read(`/v1/appStoreReviewDetails/${value.id}`);\n },\n [\"app.version\"],\n );\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { canonical, type CatalogItem } from \"../manifest.js\";\nimport { createHash } from \"node:crypto\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { findApp } from \"./identifiers.js\";\n\nexport function itemKey(item: CatalogItem): string {\n return `product.${item.productId}`;\n}\nexport function itemPath(item: CatalogItem, id: string): string {\n return item.kind === \"subscription\" ? `/v1/subscriptions/${id}` : `/v2/inAppPurchases/${id}`;\n}\n\n/** 商品 ID 与组关系稳定;可审核元数据始终使用独立版本。 */\nexport async function planCatalog(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const config = builder.loaded.manifest.catalog;\n if (!config) throw new DeliveryError(\"catalog_configuration_required\", 2);\n const app = await findApp(builder, api);\n if (!app) return;\n const groups = await api.list(`/v1/apps/${app.id}/subscriptionGroups`);\n for (const group of config.groups) {\n const key = `group.${group.key}`;\n const remoteId = group.remoteId ?? builder.bindings[key]?.id;\n const existing = remoteId\n ? selectOne(\n groups.filter((v) => v.id === remoteId),\n \"ambiguous_subscription_group\",\n )\n : undefined;\n if (remoteId && !existing)\n throw new DeliveryError(\"subscription_group_binding_mismatch\", 4, group.key);\n if (!remoteId && groups.some((v) => v.attributes.referenceName === group.name)) {\n builder.manual(\n \"subscription_group_binding_required\",\n \"Set the existing group's remoteId before managing it.\",\n [key],\n );\n continue;\n }\n const desired = { referenceName: group.name };\n builder.ensure(\n key,\n existing,\n desired,\n async () => {\n const value = await api.create(\"/v1/subscriptionGroups\", \"subscriptionGroups\", desired, {\n app: relation(\"apps\", app.id),\n });\n await builder.record(key, value);\n return api.read(`/v1/subscriptionGroups/${value.id}`);\n },\n async (value, fields) => {\n await api.update(`/v1/subscriptionGroups/${value.id}`, value, fields);\n return api.read(`/v1/subscriptionGroups/${value.id}`);\n },\n );\n await planProductVersion(\n builder,\n api,\n key,\n \"subscriptionGroup\",\n existing,\n group.localizations.map((v) => ({\n locale: v.locale,\n name: v.name,\n ...(v.customAppName ? { customAppName: v.customAppName } : {}),\n })),\n );\n }\n const purchases = await api.list(`/v1/apps/${app.id}/inAppPurchasesV2`);\n for (const item of config.items) {\n const key = itemKey(item);\n const groupKey = item.kind === \"subscription\" ? `group.${item.groupKey}` : undefined;\n const parent = groupKey ? builder.resources.get(groupKey) : app;\n if (groupKey && builder.requirements.some((v) => v.blockedOperationIds.includes(groupKey))) {\n builder.manual(\n \"subscription_group_binding_required\",\n \"Bind the subscription group before configuring its products.\",\n [key],\n );\n continue;\n }\n const collection =\n item.kind === \"subscription\"\n ? parent\n ? await api.list(`/v1/subscriptionGroups/${parent.id}/subscriptions`)\n : []\n : purchases;\n const current = selectOne(\n collection.filter((v) => v.attributes.productId === item.productId),\n \"ambiguous_product_id\",\n );\n const desired = {\n productId: item.productId,\n name: item.name,\n ...(item.familySharable === undefined ? {} : { familySharable: item.familySharable }),\n ...(item.reviewNote === undefined ? {} : { reviewNote: item.reviewNote }),\n ...(item.kind === \"subscription\"\n ? { subscriptionPeriod: item.duration, groupLevel: item.level }\n : { inAppPurchaseType: item.kind }),\n };\n if (\n current &&\n item.kind !== \"subscription\" &&\n current.attributes.inAppPurchaseType !== item.kind\n )\n throw new DeliveryError(\"product_type_immutable\", 4, item.productId);\n builder.ensure(\n key,\n current,\n desired,\n async () => {\n const location = item.kind === \"subscription\" ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\";\n const type = item.kind === \"subscription\" ? \"subscriptions\" : \"inAppPurchases\";\n const relationships =\n item.kind === \"subscription\"\n ? { group: relation(\"subscriptionGroups\", builder.require(groupKey!).id) }\n : { app: relation(\"apps\", app.id) };\n const value = await api.create(location, type, desired, relationships);\n return api.read(itemPath(item, value.id));\n },\n async (value, fields) => {\n if (fields.productId || fields.inAppPurchaseType)\n throw new DeliveryError(\"product_identity_immutable\", 4, item.productId);\n await api.update(itemPath(item, value.id), value, fields);\n return api.read(itemPath(item, value.id));\n },\n groupKey ? [groupKey] : [],\n );\n await planProductVersion(\n builder,\n api,\n key,\n item.kind === \"subscription\" ? \"subscription\" : \"inAppPurchase\",\n current,\n item.localizations,\n item.promotionalImage,\n );\n }\n}\n\ntype VersionKind = \"subscriptionGroup\" | \"subscription\" | \"inAppPurchase\";\nconst versionSpec = {\n subscriptionGroup: {\n parents: \"subscriptionGroups\",\n versions: \"subscriptionGroupVersions\",\n localizations: \"subscriptionGroupLocalizations\",\n relation: \"subscriptionGroup\",\n parentApi: \"v1\",\n },\n subscription: {\n parents: \"subscriptions\",\n versions: \"subscriptionVersions\",\n localizations: \"subscriptionLocalizations\",\n relation: \"subscription\",\n parentApi: \"v1\",\n },\n inAppPurchase: {\n parents: \"inAppPurchases\",\n versions: \"inAppPurchaseVersions\",\n localizations: \"inAppPurchaseLocalizations\",\n relation: \"inAppPurchase\",\n parentApi: \"v2\",\n },\n} as const;\n\nasync function planProductVersion(\n builder: PlanBuilder,\n api: AppleGateway,\n parentKey: string,\n kind: VersionKind,\n parent: AppleResource | undefined,\n localizations: { locale: string; name: string; description?: string; customAppName?: string }[],\n promotionalImage?: string,\n): Promise<void> {\n if (!localizations.length && !promotionalImage) return;\n const spec = versionSpec[kind];\n const key = `${parentKey}.version`;\n const versions = parent\n ? await api.list(`/${spec.parentApi}/${spec.parents}/${parent.id}/versions`)\n : [];\n const draft = selectOne(\n versions.filter((v) => v.attributes.state === \"PREPARE_FOR_SUBMISSION\"),\n \"ambiguous_product_draft\",\n );\n const approved = selectOne(\n versions.filter((v) => [\"APPROVED\", \"ACCEPTED\"].includes(String(v.attributes.state))),\n \"ambiguous_approved_product_version\",\n );\n let version = draft ?? approved;\n let existing = version ? await api.list(`/v1/${spec.versions}/${version.id}/localizations`) : [];\n let changed = localizations.some((local) => {\n const found = selectOne(\n existing.filter((v) => v.attributes.locale === local.locale),\n \"ambiguous_product_localization\",\n );\n return (\n !found ||\n Object.entries(local).some(\n ([field, value]) => canonical(found.attributes[field]) !== canonical(value),\n )\n );\n });\n if (promotionalImage && version) {\n const checksum = createHash(\"md5\")\n .update(builder.loaded.files.get(promotionalImage)!)\n .digest(\"hex\");\n const bound = builder.bindings[`${parentKey}.promotionImage.${checksum}`];\n changed ||= !(await api.list(`/v1/${spec.versions}/${version.id}/images`)).some(\n (v) =>\n v.id === bound?.id &&\n (v.attributes.assetDeliveryState as { state?: string } | undefined)?.state === \"COMPLETE\",\n );\n }\n if (changed && !draft) {\n if (\n versions.some((v) =>\n [\"READY_FOR_REVIEW\", \"WAITING_FOR_REVIEW\", \"IN_REVIEW\"].includes(\n String(v.attributes.state),\n ),\n )\n )\n throw new DeliveryError(\"product_version_in_review\", 4, parentKey);\n version = undefined;\n existing = [];\n }\n builder.ensure(\n key,\n version,\n {},\n async () => {\n const value = await api.create(\n `/v1/${spec.versions}`,\n spec.versions,\n {},\n { [spec.relation]: relation(spec.parents, builder.require(parentKey).id) },\n );\n return api.read(`/v1/${spec.versions}/${value.id}`);\n },\n async () => {\n throw new DeliveryError(\"product_version_readonly\", 4);\n },\n [parentKey],\n );\n for (const local of localizations) {\n const current = selectOne(\n existing.filter((v) => v.attributes.locale === local.locale),\n \"ambiguous_product_localization\",\n );\n const desired = { ...local };\n builder.ensure(\n `${key}.${local.locale}`,\n current,\n desired,\n async () => {\n const value = await api.create(`/v2/${spec.localizations}`, spec.localizations, desired, {\n version: relation(spec.versions, builder.require(key).id),\n });\n return api.read(`/v2/${spec.localizations}/${value.id}`);\n },\n async (value, fields) => {\n await api.update(`/v2/${spec.localizations}/${value.id}`, value, fields);\n return api.read(`/v2/${spec.localizations}/${value.id}`);\n },\n [key],\n );\n }\n}\n\n/** 用于只读后续阶段的精确商品绑定,不创建或更新商品。 */\nexport async function readCatalog(\n builder: PlanBuilder,\n api: AppleGateway,\n): Promise<Map<string, AppleResource>> {\n const app = builder.resources.get(\"app\") ?? (await findApp(builder, api));\n const found = new Map<string, AppleResource>();\n if (!app) return found;\n const config = builder.loaded.manifest.catalog;\n if (!config) return found;\n const groups = await api.list(`/v1/apps/${app.id}/subscriptionGroups`);\n const purchases = await api.list(`/v1/apps/${app.id}/inAppPurchasesV2`);\n for (const item of config.items) {\n let rows = purchases;\n if (item.kind === \"subscription\") {\n const group = config.groups.find((v) => v.key === item.groupKey)!;\n const remoteId = group.remoteId ?? builder.bindings[`group.${group.key}`]?.id;\n const parent = remoteId ? groups.find((v) => v.id === remoteId) : undefined;\n if (!parent) throw new DeliveryError(\"subscription_group_binding_required\", 4, group.key);\n rows = await api.list(`/v1/subscriptionGroups/${parent.id}/subscriptions`);\n }\n const value = selectOne(\n rows.filter((v) => v.attributes.productId === item.productId),\n \"ambiguous_product_id\",\n );\n if (!value) throw new DeliveryError(\"catalog_product_required\", 4, item.productId);\n builder.observe(itemKey(item), value);\n found.set(item.productId, value);\n }\n return found;\n}\n","import { z } from \"zod\";\nimport { createHash } from \"node:crypto\";\nimport { lookup } from \"node:dns/promises\";\nimport { isIP } from \"node:net\";\nimport { request as httpsRequest } from \"node:https\";\nimport path from \"node:path\";\nimport type { AppleGateway, AppleResource, Clock } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne, systemClock } from \"../api.js\";\nimport { canonical, parseSchema } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { appVersion, assertEditable } from \"./metadata.js\";\nimport { readCatalog, itemKey } from \"./catalog.js\";\n\nconst uploadSchema = z\n .array(\n z.object({\n method: z.literal(\"PUT\"),\n url: z.url(),\n offset: z.number().int().min(0),\n length: z.number().int().positive(),\n requestHeaders: z.array(z.object({ name: z.string(), value: z.string() })),\n }),\n )\n .min(1);\n\nfunction isPublicAddress(value: string): boolean {\n if (isIP(value) === 4) {\n const [a, b] = value.split(\".\").map(Number);\n return (\n a !== 0 &&\n a !== 10 &&\n a !== 127 &&\n a < 224 &&\n !(a === 169 && b === 254) &&\n !(a === 172 && b >= 16 && b <= 31) &&\n !(a === 192 && b === 168) &&\n !(a === 100 && b >= 64 && b <= 127)\n );\n }\n if (isIP(value) === 6) return /^2[0-9a-f]{3}:/i.test(value);\n return false;\n}\n\nexport interface AssetTransfer {\n upload(reservation: AppleResource, bytes: Buffer, signal?: AbortSignal): Promise<void>;\n}\n\n/** 仅接收已认证 API 返回的上传描述,绝不复用 Apple 管理 API 的 Bearer。 */\nexport function createAssetTransfer(\n options: { fetch?: typeof fetch; resolve?: typeof lookup; signal?: AbortSignal } = {},\n): AssetTransfer {\n return {\n async upload(reservation, bytes, signal) {\n signal ??= options.signal;\n const operations = parseSchema(uploadSchema, reservation.attributes.uploadOperations);\n const sorted = [...operations].sort((a, b) => a.offset - b.offset);\n let end = 0;\n for (const part of sorted) {\n if (part.offset !== end || part.offset + part.length > bytes.length)\n throw new DeliveryError(\"invalid_upload_ranges\", 5);\n end += part.length;\n }\n if (end !== bytes.length) throw new DeliveryError(\"incomplete_upload_ranges\", 5);\n for (const part of operations) {\n const url = new URL(part.url);\n if (\n url.protocol !== \"https:\" ||\n url.username ||\n url.password ||\n (url.port && url.port !== \"443\") ||\n isIP(url.hostname)\n )\n throw new DeliveryError(\"untrusted_upload_destination\", 5);\n const addresses = await (options.resolve ?? lookup)(url.hostname, { all: true });\n if (!addresses.length || addresses.some((v) => !isPublicAddress(v.address)))\n throw new DeliveryError(\"untrusted_upload_destination\", 5);\n const headers = new Headers();\n for (const header of part.requestHeaders) {\n if (\n /^(host|cookie|proxy-authorization)$/i.test(header.name) ||\n /^bearer /i.test(header.value)\n )\n throw new DeliveryError(\"unsafe_upload_header\", 5);\n headers.set(header.name, header.value);\n }\n const abort = signal\n ? AbortSignal.any([signal, AbortSignal.timeout(60_000)])\n : AbortSignal.timeout(60_000);\n const chunk = bytes.subarray(part.offset, part.offset + part.length);\n const status = options.fetch\n ? (\n await options.fetch(url, {\n method: \"PUT\",\n headers,\n body: new Uint8Array(chunk),\n signal: abort,\n redirect: \"error\",\n })\n ).status\n : await new Promise<number>((resolve, reject) => {\n // 固定已验证的地址,连接时不能再次 DNS 解析到内网。\n const req = httpsRequest(\n url,\n {\n method: \"PUT\",\n headers: Object.fromEntries(headers),\n signal: abort,\n family: addresses[0].family,\n lookup: (_host, _settings, done) =>\n done(null, addresses[0].address, addresses[0].family),\n },\n (response) => {\n response.resume();\n response.once(\"end\", () => resolve(response.statusCode ?? 0));\n },\n );\n req.once(\"error\", () => reject(new DeliveryError(\"asset_transfer_failed\", 5)));\n req.end(chunk);\n });\n if (status < 200 || status >= 300)\n throw new DeliveryError(\"asset_transfer_failed\", 5, undefined, status);\n }\n },\n };\n}\n\nexport async function uploadAsset(\n api: AppleGateway,\n transfer: AssetTransfer,\n endpoint: string,\n type: string,\n attributes: Record<string, unknown>,\n relationships: Record<string, unknown>,\n bytes: Buffer,\n clock: Clock = systemClock,\n resume?: AppleResource,\n record?: (resource: AppleResource) => Promise<void>,\n signal?: AbortSignal,\n): Promise<AppleResource> {\n const reservation = resume ?? (await api.create(endpoint, type, attributes, relationships));\n await record?.(reservation);\n const state = (reservation.attributes.assetDeliveryState as { state?: string } | undefined)\n ?.state;\n if (state === \"FAILED\") throw new DeliveryError(\"asset_processing_failed\", 5);\n if (state === \"COMPLETE\") return reservation;\n if (state !== \"UPLOAD_COMPLETE\" && state !== \"PROCESSING\") {\n await transfer.upload(reservation, bytes, signal);\n await api.update(`${endpoint}/${reservation.id}`, reservation, {\n uploaded: true,\n ...(!endpoint.startsWith(\"/v2/\")\n ? { sourceFileChecksum: createHash(\"md5\").update(bytes).digest(\"hex\") }\n : {}),\n });\n }\n for (let attempt = 0; attempt < 30; attempt++) {\n const current = await api.read(`${endpoint}/${reservation.id}`);\n const state = current.attributes.assetDeliveryState;\n if (state && typeof state === \"object\" && \"state\" in state) {\n if (state.state === \"COMPLETE\") return current;\n if (state.state === \"FAILED\") throw new DeliveryError(\"asset_processing_failed\", 5);\n }\n await clock.sleep(2000, signal);\n }\n throw new DeliveryError(\"asset_processing_timeout\", 5);\n}\n\n/** 校验 PNG 结构和透明通道;JPEG/视频由上传处理器提供最终格式校验。 */\nexport function validateImage(bytes: Buffer, square = false): void {\n if (bytes.length > 10 * 1024 * 1024) throw new DeliveryError(\"image_too_large\", 2);\n if (!bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]))) {\n if (\n !square &&\n bytes[0] === 255 &&\n bytes[1] === 216 &&\n bytes.at(-2) === 255 &&\n bytes.at(-1) === 217\n )\n return;\n throw new DeliveryError(\"png_image_required\", 2);\n }\n if (bytes.length < 33 || bytes.toString(\"ascii\", 12, 16) !== \"IHDR\")\n throw new DeliveryError(\"invalid_png\", 2);\n const width = bytes.readUInt32BE(16),\n height = bytes.readUInt32BE(20);\n if (\n !width ||\n !height ||\n width > 10000 ||\n height > 10000 ||\n (square && (width !== 1024 || height !== 1024))\n )\n throw new DeliveryError(\"image_dimensions_invalid\", 2);\n if ([4, 6].includes(bytes[25])) throw new DeliveryError(\"image_alpha_not_allowed\", 2);\n let offset = 8;\n let ended = false;\n while (offset + 12 <= bytes.length) {\n const size = bytes.readUInt32BE(offset);\n const type = bytes.toString(\"ascii\", offset + 4, offset + 8);\n if (size > bytes.length - offset - 12) throw new DeliveryError(\"invalid_png\", 2);\n if (type === \"tRNS\") throw new DeliveryError(\"image_alpha_not_allowed\", 2);\n offset += size + 12;\n if (type === \"IEND\") {\n ended = true;\n break;\n }\n }\n if (!ended) throw new DeliveryError(\"invalid_png\", 2);\n}\n\nexport async function planAssets(\n builder: PlanBuilder,\n api: AppleGateway,\n transfer: AssetTransfer,\n): Promise<void> {\n const config = builder.loaded.manifest.assets;\n if (!config) throw new DeliveryError(\"assets_configuration_required\", 2);\n if (config.icon) validateImage(builder.loaded.files.get(config.icon)!, true);\n const version = await appVersion(builder, api);\n if (!version) return;\n assertEditable(version);\n const locales = await api.list(`/v1/appStoreVersions/${version.id}/appStoreVersionLocalizations`);\n const ordering = new Map<\n string,\n {\n type: string;\n filesType: string;\n existing: AppleResource[];\n keys: { key: string; order: number }[];\n }\n >();\n const managed = new Map<string, AppleResource>();\n for (const [media, inputs] of [\n [\"screenshot\", config.screenshots],\n [\"preview\", config.previews],\n ] as const) {\n for (const input of inputs) {\n if (!input.locale || !input.displayType)\n throw new DeliveryError(\"asset_locale_and_display_required\", 2, input.file);\n const locale = selectOne(\n locales.filter((v) => v.attributes.locale === input.locale),\n \"ambiguous_localization\",\n );\n if (!locale) throw new DeliveryError(\"asset_localization_required\", 4, input.locale);\n const setsType = media === \"screenshot\" ? \"appScreenshotSets\" : \"appPreviewSets\";\n const filesType = media === \"screenshot\" ? \"appScreenshots\" : \"appPreviews\";\n const displayField = media === \"screenshot\" ? \"screenshotDisplayType\" : \"previewType\";\n const display =\n media === \"screenshot\" ? input.displayType : (input.previewType ?? input.displayType);\n const setKey = `assetSet.${media}.${input.locale}.${display}`;\n let set = builder.resources.get(setKey);\n if (!set && !builder.changes.some((v) => v.operation.id === setKey)) {\n set = selectOne(\n (await api.list(`/v1/appStoreVersionLocalizations/${locale.id}/${setsType}`)).filter(\n (v) => v.attributes[displayField] === display,\n ),\n \"ambiguous_asset_set\",\n );\n if (!set && builder.intent.action === \"remove-owned-assets\") continue;\n builder.ensure(\n setKey,\n set,\n { [displayField]: display },\n async () => {\n const created = await api.create(\n `/v1/${setsType}`,\n setsType,\n { [displayField]: display },\n { appStoreVersionLocalization: relation(\"appStoreVersionLocalizations\", locale.id) },\n );\n return api.read(`/v1/${setsType}/${created.id}`);\n },\n async () => {\n throw new DeliveryError(\"asset_set_immutable\", 4);\n },\n );\n }\n const bytes = builder.loaded.files.get(input.file)!;\n if (media === \"screenshot\") validateImage(bytes);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n const existing = set ? await api.list(`/v1/${setsType}/${set.id}/${filesType}`) : [];\n for (const resource of existing) managed.set(resource.id, resource);\n if (builder.intent.action === \"remove-owned-assets\") continue;\n const assetKey = `${setKey}.file.${input.file}.${checksum}`;\n const group = ordering.get(setKey) ?? { type: setsType, filesType, existing, keys: [] };\n group.keys.push({ key: assetKey, order: input.order ?? group.keys.length });\n ordering.set(setKey, group);\n const matched = selectOne(\n existing.filter((v) => v.attributes.sourceFileChecksum === checksum),\n \"ambiguous_asset_checksum\",\n );\n const state = matched?.attributes.assetDeliveryState as { state?: string } | undefined;\n if (matched && state?.state === \"COMPLETE\") {\n builder.observe(assetKey, matched);\n continue;\n }\n const bound = builder.bindings[assetKey];\n const resume = bound\n ? existing.find((v) => v.id === bound.id && v.type === bound.type)\n : undefined;\n if (bound && !resume) throw new DeliveryError(\"asset_binding_mismatch\", 4, assetKey);\n builder.add(\n assetKey,\n \"upload\",\n existing.map((v) => ({\n id: v.id,\n checksum: v.attributes.sourceFileChecksum,\n state: v.attributes.assetDeliveryState,\n })),\n { checksum, order: input.order },\n [\"file\", \"locale\", \"displayType\"],\n async () => {\n return uploadAsset(\n api,\n transfer,\n `/v1/${filesType}`,\n filesType,\n {\n fileName: path.basename(input.file),\n fileSize: bytes.length,\n ...(media === \"preview\"\n ? {\n mimeType: input.file.endsWith(\".mov\") ? \"video/quicktime\" : \"video/mp4\",\n previewFrameTimeCode: input.previewFrameTimeCode,\n }\n : {}),\n },\n {\n [media === \"screenshot\" ? \"appScreenshotSet\" : \"appPreviewSet\"]: relation(\n setsType,\n builder.require(setKey).id,\n ),\n },\n bytes,\n systemClock,\n resume,\n (value) => builder.record(assetKey, value),\n );\n },\n [setKey],\n !!resume,\n );\n }\n }\n if (builder.intent.action === \"remove-owned-assets\") {\n for (const target of config.removeOwnedIds) {\n const binding = Object.values(builder.bindings).find(\n (v) => v.id === target.id && v.type === target.type,\n );\n if (!binding) throw new DeliveryError(\"asset_ownership_evidence_required\", 4, target.id);\n if (!managed.has(target.id)) {\n try {\n await api.read(`/v1/${target.type}/${target.id}`);\n } catch (error) {\n if (error instanceof DeliveryError && error.httpStatus === 404) continue;\n throw error;\n }\n throw new DeliveryError(\"asset_ownership_evidence_required\", 4, target.id);\n }\n builder.add(\n `asset.remove.${target.id}`,\n \"remove-owned-asset\",\n managed.get(target.id),\n null,\n [\"id\"],\n async () => {\n await api.remove(`/v1/${target.type}/${target.id}`);\n try {\n await api.read(`/v1/${target.type}/${target.id}`);\n } catch (error) {\n if (error instanceof DeliveryError && error.httpStatus === 404) return target;\n throw error;\n }\n throw new DeliveryError(\"asset_removal_readback_failed\", 5);\n },\n );\n }\n return;\n }\n for (const [key, group] of ordering) {\n const keys = [...group.keys].sort((a, b) => a.order - b.order).map((v) => v.key);\n if (new Set(group.keys.map((v) => v.order)).size !== keys.length)\n throw new DeliveryError(\"duplicate_asset_order\", 2, key);\n const knownIds = keys.map((k) => builder.resources.get(k)?.id);\n const remaining = group.existing.filter((v) => !knownIds.includes(v.id)).map((v) => v.id);\n if (\n knownIds.every(Boolean) &&\n canonical([...knownIds, ...remaining]) === canonical(group.existing.map((v) => v.id))\n )\n continue;\n builder.add(\n `${key}.order`,\n \"update\",\n group.existing.map((v) => v.id),\n keys,\n [\"order\"],\n async () => {\n const ids = keys.map((k) => builder.require(k).id);\n const all = [...ids, ...group.existing.map((v) => v.id).filter((id) => !ids.includes(id))];\n const parent = builder.require(key);\n await api.relationship(\n `/v1/${group.type}/${parent.id}/relationships/${group.filesType}`,\n all.map((id) => ({ type: group.filesType, id })),\n \"PATCH\",\n );\n const read = await api.list(`/v1/${group.type}/${parent.id}/${group.filesType}`);\n if (canonical(read.map((v) => v.id)) !== canonical(all))\n throw new DeliveryError(\"asset_order_readback_failed\", 5);\n return parent;\n },\n [key, ...keys],\n );\n }\n}\n\nexport async function planCatalogAssets(\n builder: PlanBuilder,\n api: AppleGateway,\n transfer: AssetTransfer,\n): Promise<void> {\n const products = await readCatalog(builder, api);\n for (const item of builder.loaded.manifest.catalog?.items ?? []) {\n const parent = products.get(item.productId);\n if (!parent) continue;\n const subscription = item.kind === \"subscription\";\n for (const [usage, filename] of [\n [\"promotion\", item.promotionalImage],\n [\"review\", item.reviewScreenshot],\n ] as const) {\n if (!filename) continue;\n const bytes = builder.loaded.files.get(filename)!;\n validateImage(bytes, usage === \"promotion\");\n const type =\n usage === \"promotion\"\n ? subscription\n ? \"subscriptionImages\"\n : \"inAppPurchaseImages\"\n : subscription\n ? \"subscriptionAppStoreReviewScreenshots\"\n : \"inAppPurchaseAppStoreReviewScreenshots\";\n const versionType = subscription ? \"subscriptionVersions\" : \"inAppPurchaseVersions\";\n let target = parent;\n let current: AppleResource[];\n if (usage === \"promotion\") {\n const versions = await api.list(\n `${subscription ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\"}/${parent.id}/versions`,\n );\n const draft =\n selectOne(\n versions.filter((v) => v.attributes.state === \"PREPARE_FOR_SUBMISSION\"),\n \"ambiguous_product_draft\",\n ) ??\n selectOne(\n versions.filter((v) => [\"APPROVED\", \"ACCEPTED\"].includes(String(v.attributes.state))),\n \"ambiguous_product_version\",\n );\n if (!draft) throw new DeliveryError(\"product_draft_required_for_image\", 4, item.productId);\n target = draft;\n current = await api.list(`/v1/${versionType}/${draft.id}/images`);\n } else {\n const full = await api.read(\n `${subscription ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\"}/${parent.id}?include=appStoreReviewScreenshot`,\n );\n const ref = full.relationships?.appStoreReviewScreenshot?.data;\n current = ref && !Array.isArray(ref) ? [await api.read(`/v1/${type}/${ref.id}`)] : [];\n }\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n const key = `${itemKey(item)}.${usage}Image.${checksum}`;\n const resume = current.find((v) => v.id === builder.bindings[key]?.id);\n if (\n current.some(\n (v) =>\n (usage === \"promotion\"\n ? v.id === resume?.id\n : v.attributes.sourceFileChecksum === checksum) &&\n (v.attributes.assetDeliveryState as { state?: string } | undefined)?.state ===\n \"COMPLETE\",\n )\n )\n continue;\n if (usage === \"promotion\" && target.attributes.state !== \"PREPARE_FOR_SUBMISSION\")\n throw new DeliveryError(\"product_draft_required_for_image\", 4, item.productId);\n if (\n usage === \"review\" &&\n current.length &&\n !resume &&\n (!item.replaceReviewScreenshotId ||\n !current.some((v) => v.id === item.replaceReviewScreenshotId) ||\n !Object.values(builder.bindings).some(\n (v) => v.id === item.replaceReviewScreenshotId && v.type === type,\n ))\n )\n throw new DeliveryError(\"owned_review_screenshot_replacement_required\", 4, item.productId);\n builder.add(\n key,\n \"upload\",\n current.map((v) => ({ id: v.id, state: v.attributes.assetDeliveryState })),\n { checksum, replaceReviewScreenshotId: item.replaceReviewScreenshotId },\n [\"image\", ...(item.replaceReviewScreenshotId ? [\"replaceReviewScreenshotId\"] : [])],\n async () => {\n if (usage === \"review\" && current.length && !resume)\n await api.remove(`/v1/${type}/${item.replaceReviewScreenshotId}`);\n return uploadAsset(\n api,\n transfer,\n `/${usage === \"promotion\" ? \"v2\" : \"v1\"}/${type}`,\n type,\n { fileName: path.basename(filename), fileSize: bytes.length },\n {\n [usage === \"promotion\"\n ? \"version\"\n : subscription\n ? \"subscription\"\n : \"inAppPurchaseV2\"]: relation(\n usage === \"promotion\" ? versionType : parent.type,\n target.id,\n ),\n },\n bytes,\n systemClock,\n resume,\n (value) => builder.record(key, value),\n );\n },\n [],\n !!resume,\n );\n }\n }\n}\n\nexport async function planReviewAttachments(\n builder: PlanBuilder,\n api: AppleGateway,\n transfer: AssetTransfer,\n): Promise<void> {\n const files = builder.loaded.manifest.review?.attachments ?? [];\n if (!files.length) return;\n const version = await appVersion(builder, api);\n if (!version) return;\n assertEditable(version);\n const full = await api.read(`/v1/appStoreVersions/${version.id}?include=appStoreReviewDetail`);\n const ref = full.relationships?.appStoreReviewDetail?.data;\n if (!ref || Array.isArray(ref)) throw new DeliveryError(\"review_information_required\", 4);\n const current = await api.list(`/v1/appStoreReviewDetails/${ref.id}/appStoreReviewAttachments`);\n for (const filename of files) {\n const bytes = builder.loaded.files.get(filename)!;\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n const key = `reviewAttachment.${version.id}.${checksum}`;\n const matched = selectOne(\n current.filter((v) => v.attributes.sourceFileChecksum === checksum),\n \"ambiguous_review_attachment\",\n );\n if (\n (matched?.attributes.assetDeliveryState as { state?: string } | undefined)?.state ===\n \"COMPLETE\"\n ) {\n builder.observe(key, matched);\n continue;\n }\n const resume = current.find((v) => v.id === builder.bindings[key]?.id);\n builder.add(\n key,\n \"upload\",\n resume,\n { checksum, detailId: ref.id },\n [\"file\"],\n () =>\n uploadAsset(\n api,\n transfer,\n \"/v1/appStoreReviewAttachments\",\n \"appStoreReviewAttachments\",\n { fileName: path.basename(filename), fileSize: bytes.length },\n { appStoreReviewDetail: relation(\"appStoreReviewDetails\", ref.id) },\n bytes,\n systemClock,\n resume,\n (value) => builder.record(key, value),\n ),\n [],\n !!resume,\n );\n }\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { readOptionalRelationship, relation, selectOne } from \"../api.js\";\nimport { canonical, digest, type CatalogItem } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { itemKey, itemPath, readCatalog } from \"./catalog.js\";\n\nfunction amount(value: unknown): string {\n if (typeof value !== \"string\" || !/^\\d+(?:\\.\\d+)?$/.test(value))\n throw new DeliveryError(\"invalid_price_amount\", 5);\n const [whole, fraction = \"\"] = value.split(\".\");\n return `${whole.replace(/^0+(?=\\d)/, \"\")}.${fraction.replace(/0+$/, \"\")}`;\n}\nfunction linked(value: AppleResource, relationship: string): string | undefined {\n const ref = value.relationships?.[relationship]?.data;\n return ref && !Array.isArray(ref) ? ref.id : undefined;\n}\n\nexport async function planPricing(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n if (!builder.loaded.manifest.catalog)\n throw new DeliveryError(\"catalog_configuration_required\", 2);\n const resources = await readCatalog(builder, api);\n const territories = await api.list(\"/v1/territories\");\n for (const item of builder.loaded.manifest.catalog.items) {\n const product = resources.get(item.productId);\n if (!product) continue;\n if (item.availability) await planAvailability(builder, api, item, product);\n if (!item.prices.length) continue;\n const points: { config: CatalogItem[\"prices\"][number]; resource: AppleResource }[] = [];\n for (const price of item.prices) {\n const territory = territories.find((value) => value.id === price.territory);\n if (!territory) throw new DeliveryError(\"territory_unavailable\", 2, price.territory);\n if (territory.attributes.currency !== price.currency)\n throw new DeliveryError(\"territory_currency_mismatch\", 2, price.territory);\n const candidates = await api.list(`${itemPath(item, product.id)}/pricePoints`, {\n \"filter[territory]\": price.territory,\n limit: \"8000\",\n });\n const point = selectOne(\n candidates.filter(\n (v) =>\n amount(v.attributes.customerPrice) === amount(price.customerPrice) &&\n (!price.pricePointId || price.pricePointId === v.id),\n ),\n \"ambiguous_price_point\",\n );\n if (!point) throw new DeliveryError(\"price_point_unavailable\", 2, price.territory);\n points.push({ config: price, resource: point });\n }\n if (item.kind === \"subscription\") {\n const current = await api.list(`/v1/subscriptions/${product.id}/prices`, {\n include: \"subscriptionPricePoint,territory\",\n });\n builder.observe(`${itemKey(item)}.prices`, {\n type: \"subscriptionPrices\",\n id: product.id,\n attributes: { values: current },\n });\n for (const { config, resource: point } of points) {\n const existing = current.filter((v) => linked(v, \"territory\") === config.territory);\n if (!(\"preserveCurrentPrice\" in config) || config.preserveCurrentPrice === undefined)\n throw new DeliveryError(\"price_preservation_choice_required\", 2, config.territory);\n const key = `${itemKey(item)}.price.${config.territory}.${config.startDate ?? \"current\"}`;\n if (\n existing.some(\n (v) =>\n v.attributes.preserved !== true &&\n linked(v, \"subscriptionPricePoint\") === point.id &&\n (v.attributes.startDate ?? null) === (config.startDate ?? null),\n )\n ) {\n if (builder.bindings[`${key}.preservation`]?.id !== digest(config))\n throw new DeliveryError(\"price_preservation_evidence_required\", 4, config.territory);\n continue;\n }\n builder.add(\n key,\n \"create\",\n existing,\n config,\n [\"price\", \"startDate\", \"preserveCurrentPrice\"],\n async () => {\n const created = await api.create(\n \"/v1/subscriptionPrices\",\n \"subscriptionPrices\",\n {\n startDate: config.startDate ?? null,\n preserveCurrentPrice: config.preserveCurrentPrice,\n },\n {\n subscription: relation(\"subscriptions\", product.id),\n subscriptionPricePoint: relation(\"subscriptionPricePoints\", point.id),\n territory: relation(\"territories\", config.territory),\n },\n );\n const verified = (\n await api.list(`/v1/subscriptions/${product.id}/prices`, {\n include: \"subscriptionPricePoint,territory\",\n \"filter[territory]\": config.territory,\n })\n ).find((v) => v.id === created.id);\n if (\n !verified ||\n linked(verified, \"subscriptionPricePoint\") !== point.id ||\n linked(verified, \"territory\") !== config.territory ||\n (verified.attributes.startDate ?? null) !== (config.startDate ?? null)\n )\n throw new DeliveryError(\"price_readback_failed\", 5);\n await builder.record(`${key}.preservation`, {\n type: \"subscriptionPricePolicies\",\n id: digest(config),\n });\n return verified;\n },\n );\n }\n } else {\n if (!item.baseTerritory)\n throw new DeliveryError(\"base_territory_required\", 2, item.productId);\n const full = await api.read(`/v2/inAppPurchases/${product.id}?include=iapPriceSchedule`);\n const scheduleId = linked(full, \"iapPriceSchedule\");\n const base = scheduleId\n ? await api.read(`/v1/inAppPurchasePriceSchedules/${scheduleId}/baseTerritory`)\n : undefined;\n const existing = scheduleId\n ? await api.list(`/v1/inAppPurchasePriceSchedules/${scheduleId}/manualPrices`, {\n include: \"inAppPurchasePricePoint,territory\",\n })\n : [];\n const expected = points\n .map((p) => ({\n point: p.resource.id,\n date: p.config.startDate ?? null,\n endDate: \"endDate\" in p.config ? (p.config.endDate ?? null) : null,\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n const actual = existing\n .map((p) => ({\n point: linked(p, \"inAppPurchasePricePoint\"),\n date: p.attributes.startDate ?? null,\n endDate: p.attributes.endDate ?? null,\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n if (canonical(expected) === canonical(actual) && base?.id === item.baseTerritory) continue;\n builder.add(\n `${itemKey(item)}.priceSchedule`,\n \"create\",\n { prices: existing, base: base?.id },\n { baseTerritory: item.baseTerritory, prices: points.map((p) => p.config) },\n [\"priceSchedule\"],\n async () => {\n const included = points.map((p, index) => ({\n type: \"inAppPurchasePrices\",\n id: \"${price-\" + index + \"}\",\n attributes: {\n startDate: p.config.startDate ?? null,\n endDate: \"endDate\" in p.config ? (p.config.endDate ?? null) : null,\n },\n relationships: {\n inAppPurchaseV2: relation(\"inAppPurchases\", product.id),\n inAppPurchasePricePoint: relation(\"inAppPurchasePricePoints\", p.resource.id),\n },\n }));\n const result = await api.create(\n \"/v1/inAppPurchasePriceSchedules\",\n \"inAppPurchasePriceSchedules\",\n {},\n {\n inAppPurchase: relation(\"inAppPurchases\", product.id),\n baseTerritory: relation(\"territories\", item.baseTerritory!),\n manualPrices: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const prices = await api.list(\n `/v1/inAppPurchasePriceSchedules/${result.id}/manualPrices`,\n { include: \"inAppPurchasePricePoint\" },\n );\n const values = prices\n .map((p) => ({\n point: linked(p, \"inAppPurchasePricePoint\"),\n date: p.attributes.startDate ?? null,\n endDate: p.attributes.endDate ?? null,\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n const verifiedBase = await api.read(\n `/v1/inAppPurchasePriceSchedules/${result.id}/baseTerritory`,\n );\n if (canonical(expected) !== canonical(values) || verifiedBase.id !== item.baseTerritory)\n throw new DeliveryError(\"price_schedule_readback_failed\", 5);\n return result;\n },\n );\n }\n }\n}\n\nasync function planAvailability(\n builder: PlanBuilder,\n api: AppleGateway,\n item: CatalogItem,\n product: AppleResource,\n): Promise<void> {\n const config = item.availability!;\n const subscription = item.kind === \"subscription\";\n const type = subscription ? \"subscriptionAvailabilities\" : \"inAppPurchaseAvailabilities\";\n const relationship = subscription ? \"subscriptionAvailability\" : \"inAppPurchaseAvailability\";\n const current = await readOptionalRelationship(() =>\n api.read(`${itemPath(item, product.id)}/${relationship}`),\n );\n const territories = current\n ? await api.list(`/v1/${type}/${current.id}/availableTerritories`)\n : [];\n const projection = {\n availableInNewTerritories: current?.attributes.availableInNewTerritories,\n territories: territories.map((v) => v.id).sort(),\n };\n const desired = {\n availableInNewTerritories: config.availableInNewTerritories,\n territories: [...config.territories].sort(),\n };\n if (canonical(projection) === canonical(desired)) return;\n builder.add(\n `${itemKey(item)}.availability`,\n \"create\",\n projection,\n desired,\n [\"territories\", \"availableInNewTerritories\"],\n async () => {\n const created = await api.create(\n `/v1/${type}`,\n type,\n { availableInNewTerritories: config.availableInNewTerritories },\n {\n [subscription ? \"subscription\" : \"inAppPurchase\"]: relation(product.type, product.id),\n availableTerritories: {\n data: config.territories.map((id) => ({ type: \"territories\", id })),\n },\n },\n );\n const read = await api.read(`/v1/${type}/${created.id}`);\n const regions = await api.list(`/v1/${type}/${created.id}/availableTerritories`);\n if (\n read.attributes.availableInNewTerritories !== config.availableInNewTerritories ||\n canonical(regions.map((v) => v.id).sort()) !== canonical(desired.territories)\n )\n throw new DeliveryError(\"availability_readback_failed\", 5);\n return read;\n },\n );\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { readCatalog } from \"./catalog.js\";\n\n/** 优惠配置是商业输入;新优惠不会自动替换已售出或已领取的优惠。 */\nexport async function planOffers(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const catalog = builder.loaded.manifest.catalog;\n if (!catalog) return;\n const products = await readCatalog(builder, api);\n const territories = catalog.items.some(\n (item) => item.kind === \"subscription\" && item.offers.length,\n )\n ? await api.list(\"/v1/territories\")\n : [];\n for (const item of catalog.items) {\n if (item.kind !== \"subscription\") continue;\n const parent = products.get(item.productId);\n if (!parent) continue;\n for (const offer of item.offers) {\n const type =\n offer.kind === \"introductory\"\n ? \"subscriptionIntroductoryOffers\"\n : offer.kind === \"promotional\"\n ? \"subscriptionPromotionalOffers\"\n : \"subscriptionOfferCodes\";\n const collection =\n offer.kind === \"introductory\"\n ? \"introductoryOffers\"\n : offer.kind === \"promotional\"\n ? \"promotionalOffers\"\n : \"offerCodes\";\n const existing = await api.list(\n `/v1/subscriptions/${parent.id}/${collection}`,\n offer.kind === \"introductory\" ? { include: \"territory,subscriptionPricePoint\" } : {},\n );\n const key = `offer.${item.productId}.${offer.key}`;\n const common = {\n duration: offer.duration,\n numberOfPeriods: offer.numberOfPeriods,\n offerMode: offer.offerMode,\n };\n for (const price of offer.prices) {\n if (offer.offerMode !== \"FREE_TRIAL\" && !price.pricePointId)\n throw new DeliveryError(\"offer_price_point_required\", 2, offer.key);\n if (!territories.some((value) => value.id === price.territory))\n throw new DeliveryError(\"territory_unavailable\", 2, price.territory);\n if (\n price.pricePointId &&\n !(\n await api.list(`/v1/subscriptions/${parent.id}/pricePoints`, {\n \"filter[territory]\": price.territory,\n })\n ).some((v) => v.id === price.pricePointId)\n )\n throw new DeliveryError(\"offer_price_point_ownership_mismatch\", 4, offer.key);\n }\n if (offer.kind === \"introductory\") {\n for (const price of offer.prices) {\n const current = selectOne(\n existing.filter((v) => {\n const region = v.relationships?.territory?.data;\n return (\n region &&\n !Array.isArray(region) &&\n region.id === price.territory &&\n v.attributes.startDate === offer.startDate\n );\n }),\n \"ambiguous_introductory_offer\",\n );\n const attributes = {\n ...common,\n startDate: offer.startDate,\n endDate: offer.endDate ?? null,\n };\n const expectedPoint = current?.relationships?.subscriptionPricePoint?.data;\n if (current) {\n if (\n Object.entries(attributes).some(\n ([k, v]) => canonical(current.attributes[k]) !== canonical(v),\n ) ||\n (price.pricePointId &&\n (!expectedPoint ||\n Array.isArray(expectedPoint) ||\n expectedPoint.id !== price.pricePointId))\n )\n throw new DeliveryError(\"existing_offer_is_immutable\", 4, offer.key);\n continue;\n }\n builder.add(\n `${key}.${price.territory}`,\n \"create\",\n null,\n { attributes, price },\n [\"offer\"],\n async () => {\n const result = await api.create(`/v1/${type}`, type, attributes, {\n subscription: relation(\"subscriptions\", parent.id),\n territory: relation(\"territories\", price.territory),\n ...(price.pricePointId\n ? {\n subscriptionPricePoint: relation(\n \"subscriptionPricePoints\",\n price.pricePointId,\n ),\n }\n : {}),\n });\n const read = (\n await api.list(`/v1/subscriptions/${parent.id}/introductoryOffers`, {\n include: \"territory,subscriptionPricePoint\",\n })\n ).find((v) => v.id === result.id);\n if (!read) throw new DeliveryError(\"introductory_offer_readback_failed\", 5);\n verifyAttributes(read, attributes);\n verifyPrices([read], [price], offer.offerMode === \"FREE_TRIAL\");\n return read;\n },\n );\n }\n } else {\n const current = selectOne(\n existing.filter((v) =>\n offer.kind === \"promotional\"\n ? v.attributes.offerCode === offer.offerCode\n : v.attributes.name === offer.name,\n ),\n \"ambiguous_subscription_offer\",\n );\n const attributes = {\n ...common,\n name: offer.name,\n ...(offer.kind === \"promotional\"\n ? { offerCode: offer.offerCode }\n : {\n customerEligibilities: offer.customerEligibilities,\n offerEligibility: offer.offerEligibility,\n autoRenewEnabled: offer.autoRenewEnabled,\n }),\n };\n const priceType =\n offer.kind === \"promotional\"\n ? \"subscriptionPromotionalOfferPrices\"\n : \"subscriptionOfferCodePrices\";\n if (current) {\n verifyAttributes(current, attributes);\n const prices = await api.list(`/v1/${type}/${current.id}/prices`, {\n include: \"territory,subscriptionPricePoint\",\n });\n verifyPrices(prices, offer.prices, offer.offerMode === \"FREE_TRIAL\");\n continue;\n }\n builder.add(key, \"create\", null, offer, [\"offer\", \"prices\"], async () => {\n const included = offer.prices.map((price, i) => ({\n type: priceType,\n id: \"${price-\" + i + \"}\",\n relationships: {\n territory: relation(\"territories\", price.territory),\n ...(price.pricePointId\n ? {\n subscriptionPricePoint: relation(\"subscriptionPricePoints\", price.pricePointId),\n }\n : {}),\n },\n }));\n const result = await api.create(\n `/v1/${type}`,\n type,\n attributes,\n {\n subscription: relation(\"subscriptions\", parent.id),\n prices: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const read = await api.read(`/v1/${type}/${result.id}`);\n verifyAttributes(read, attributes);\n verifyPrices(\n await api.list(`/v1/${type}/${result.id}/prices`, {\n include: \"territory,subscriptionPricePoint\",\n }),\n offer.prices,\n offer.offerMode === \"FREE_TRIAL\",\n );\n return read;\n });\n }\n }\n }\n if (catalog.gracePeriod) {\n const current = await api.read(`/v1/apps/${builder.require(\"app\").id}/subscriptionGracePeriod`);\n builder.ensure(\n \"subscription.gracePeriod\",\n current,\n catalog.gracePeriod,\n async () => {\n throw new DeliveryError(\"subscription_grace_period_missing\", 4);\n },\n async (value, fields) => {\n await api.update(`/v1/subscriptionGracePeriods/${value.id}`, value, fields);\n return api.read(`/v1/subscriptionGracePeriods/${value.id}`);\n },\n );\n }\n}\nfunction verifyAttributes(resource: AppleResource, desired: Record<string, unknown>): void {\n if (\n Object.entries(desired).some(\n ([key, value]) => canonical(resource.attributes[key]) !== canonical(value),\n )\n )\n throw new DeliveryError(\"offer_attributes_mismatch\", 4);\n}\n\nfunction verifyPrices(\n resources: AppleResource[],\n desired: { territory: string; pricePointId?: string }[],\n free: boolean,\n): void {\n const project = resources.map((value) => {\n const territory = value.relationships?.territory?.data,\n point = value.relationships?.subscriptionPricePoint?.data;\n if (!territory || Array.isArray(territory) || (point && Array.isArray(point)))\n throw new DeliveryError(\"offer_price_relationship_missing\", 5);\n return { territory: territory.id, ...(!free ? { pricePointId: point?.id } : {}) };\n });\n const expected = desired.map((value) => ({\n territory: value.territory,\n ...(!free ? { pricePointId: value.pricePointId } : {}),\n }));\n const sort = (values: typeof expected) =>\n values.sort((a, b) => a.territory.localeCompare(b.territory));\n if (canonical(sort(project)) !== canonical(sort(expected)))\n throw new DeliveryError(\"offer_prices_mismatch\", 4);\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { readOptionalRelationship, relation, selectOne } from \"../api.js\";\nimport { canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\n\nfunction linked(value: AppleResource, key: string): string | undefined {\n const ref = value.relationships?.[key]?.data;\n return ref && !Array.isArray(ref) ? ref.id : undefined;\n}\nexport async function planAppCommerce(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const app = builder.require(\"app\"),\n { availability, appPricing } = builder.loaded.manifest;\n if (availability) {\n const current = await readOptionalRelationship(() =>\n api.read(`/v1/apps/${app.id}/appAvailabilityV2`),\n );\n const territories = current\n ? await api.list(`/v2/appAvailabilities/${current.id}/territoryAvailabilities`, {\n include: \"territory\",\n })\n : [];\n const before = {\n availableInNewTerritories: current?.attributes.availableInNewTerritories,\n territories: territories\n .filter((v) => v.attributes.available === true)\n .map((v) => linked(v, \"territory\"))\n .sort(),\n };\n const desired = { ...availability, territories: [...availability.territories].sort() };\n if (canonical(before) !== canonical(desired))\n builder.add(\n \"app.availability\",\n \"create\",\n before,\n desired,\n [\"territories\", \"availableInNewTerritories\"],\n async () => {\n const included = availability.territories.map((id, i) => ({\n type: \"territoryAvailabilities\",\n id: \"${territory-\" + i + \"}\",\n attributes: { available: true },\n relationships: { territory: relation(\"territories\", id) },\n }));\n const created = await api.create(\n \"/v2/appAvailabilities\",\n \"appAvailabilities\",\n { availableInNewTerritories: availability.availableInNewTerritories },\n {\n app: relation(\"apps\", app.id),\n territoryAvailabilities: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const value = await api.read(`/v2/appAvailabilities/${created.id}`);\n const regions = await api.list(\n `/v2/appAvailabilities/${created.id}/territoryAvailabilities`,\n { include: \"territory\" },\n );\n if (\n value.attributes.availableInNewTerritories !== desired.availableInNewTerritories ||\n canonical(\n regions\n .filter((v) => v.attributes.available === true)\n .map((v) => linked(v, \"territory\"))\n .sort(),\n ) !== canonical(desired.territories)\n )\n throw new DeliveryError(\"app_availability_readback_failed\", 5);\n return value;\n },\n );\n }\n if (appPricing) {\n const desired: {\n id: string;\n startDate: string | null;\n endDate: string | null;\n territory: string;\n }[] = [];\n const territories = await api.list(\"/v1/territories\");\n for (const price of appPricing.prices) {\n const territory = territories.find((value) => value.id === price.territory);\n if (!territory) throw new DeliveryError(\"territory_unavailable\", 2, price.territory);\n if (territory.attributes.currency !== price.currency)\n throw new DeliveryError(\"territory_currency_mismatch\", 2);\n const points = await api.list(`/v1/apps/${app.id}/appPricePoints`, {\n \"filter[territory]\": price.territory,\n limit: \"200\",\n });\n const normalize = (v: unknown) =>\n typeof v === \"string\" ? v.replace(/\\.0+$/, \"\").replace(/(\\.\\d*?)0+$/, \"$1\") : undefined;\n const point = selectOne(\n points.filter(\n (v) =>\n normalize(v.attributes.customerPrice) === normalize(price.customerPrice) &&\n (!price.pricePointId || v.id === price.pricePointId),\n ),\n \"ambiguous_app_price_point\",\n );\n if (!point) throw new DeliveryError(\"app_price_point_unavailable\", 2, price.territory);\n desired.push({\n id: point.id,\n startDate: price.startDate ?? null,\n endDate: price.endDate ?? null,\n territory: price.territory,\n });\n }\n const schedule = await readOptionalRelationship(() =>\n api.read(`/v1/apps/${app.id}/appPriceSchedule`),\n );\n const currentId = schedule?.id;\n const base = currentId\n ? await api.read(`/v1/appPriceSchedules/${currentId}/baseTerritory`)\n : undefined;\n const current = currentId\n ? ((await readOptionalRelationship(() =>\n api.list(`/v1/appPriceSchedules/${currentId}/manualPrices`, {\n include: \"appPricePoint,territory\",\n }),\n )) ?? [])\n : [];\n const before = {\n baseTerritory: base?.id,\n prices: current\n .map((v) => ({\n id: linked(v, \"appPricePoint\"),\n startDate: v.attributes.startDate ?? null,\n endDate: v.attributes.endDate ?? null,\n territory: linked(v, \"territory\"),\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b))),\n };\n const target = {\n baseTerritory: appPricing.baseTerritory,\n prices: desired.sort((a, b) => canonical(a).localeCompare(canonical(b))),\n };\n if (canonical(before) === canonical(target)) return;\n builder.add(\n \"app.priceSchedule\",\n \"create\",\n before,\n target,\n [\"baseTerritory\", \"prices\"],\n async () => {\n const included = desired.map((v, i) => ({\n type: \"appPrices\",\n id: \"${price-\" + i + \"}\",\n attributes: { startDate: v.startDate, endDate: v.endDate },\n relationships: { appPricePoint: relation(\"appPricePoints\", v.id) },\n }));\n const result = await api.create(\n \"/v1/appPriceSchedules\",\n \"appPriceSchedules\",\n {},\n {\n app: relation(\"apps\", app.id),\n baseTerritory: relation(\"territories\", appPricing.baseTerritory),\n manualPrices: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const base = await api.read(`/v1/appPriceSchedules/${result.id}/baseTerritory`);\n const read = await api.list(`/v1/appPriceSchedules/${result.id}/manualPrices`, {\n include: \"appPricePoint,territory\",\n });\n const values = read\n .map((v) => ({\n id: linked(v, \"appPricePoint\"),\n startDate: v.attributes.startDate ?? null,\n endDate: v.attributes.endDate ?? null,\n territory: linked(v, \"territory\"),\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n if (base.id !== appPricing.baseTerritory || canonical(values) !== canonical(target.prices))\n throw new DeliveryError(\"app_price_readback_failed\", 5);\n return result;\n },\n );\n }\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { appVersion } from \"./metadata.js\";\nimport { readCatalog } from \"./catalog.js\";\n\nexport async function selectedBuild(\n builder: PlanBuilder,\n api: AppleGateway,\n allowProcessing = false,\n): Promise<AppleResource | undefined> {\n const app = builder.require(\"app\"),\n release = builder.loaded.manifest.release;\n if (!release) throw new DeliveryError(\"release_configuration_required\", 2);\n const candidates = await api.list(\"/v1/builds\", {\n \"filter[app]\": app.id,\n \"filter[version]\": release.buildNumber,\n include: \"preReleaseVersion\",\n });\n const exact: AppleResource[] = [];\n for (const candidate of candidates) {\n if (release.buildId && release.buildId !== candidate.id) continue;\n const ref = candidate.relationships?.preReleaseVersion?.data;\n if (!ref || Array.isArray(ref)) throw new DeliveryError(\"build_prerelease_version_missing\", 5);\n const pre = await api.read(`/v1/preReleaseVersions/${ref.id}`);\n if (\n candidate.attributes.version === release.buildNumber &&\n pre.attributes.version === release.version &&\n pre.attributes.platform === \"IOS\"\n )\n exact.push(candidate);\n }\n const build = selectOne(exact, \"ambiguous_build\");\n if (!build) {\n if (!allowProcessing)\n builder.manual(\n \"processed_build_required\",\n \"Upload and process the configured version and build number.\",\n [\"review.prepare\", \"review.submit\", \"testflight.distribute\"],\n );\n return;\n }\n if (\n allowProcessing &&\n build.attributes.processingState === \"PROCESSING\" &&\n build.attributes.expired !== true\n )\n return build;\n if (build.attributes.processingState !== \"VALID\" || build.attributes.expired === true)\n throw new DeliveryError(\"build_not_available\", 4);\n builder.observe(\"build\", build);\n return build;\n}\n\nexport async function planReview(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const app = builder.require(\"app\"),\n release = builder.loaded.manifest.release;\n if (!release) throw new DeliveryError(\"release_configuration_required\", 2);\n if (builder.intent.action === \"withdraw\") {\n if (!release.reviewSubmissionId) throw new DeliveryError(\"review_submission_id_required\", 2);\n const submission = await ownedSubmission(api, app.id, release.reviewSubmissionId);\n builder.observe(\"review\", submission);\n if (submission.attributes.state === \"CANCELING\" || submission.attributes.state === \"COMPLETE\")\n return;\n if (\n ![\"WAITING_FOR_REVIEW\", \"IN_REVIEW\", \"UNRESOLVED_ISSUES\"].includes(\n String(submission.attributes.state),\n )\n )\n throw new DeliveryError(\"review_cannot_withdraw\", 4);\n builder.add(\n \"review.withdraw\",\n \"withdraw\",\n submission.attributes,\n { canceled: true },\n [\"canceled\"],\n async () => {\n await api.update(`/v1/reviewSubmissions/${submission.id}`, submission, { canceled: true });\n const read = await api.read(`/v1/reviewSubmissions/${submission.id}`);\n if (![\"CANCELING\", \"COMPLETE\"].includes(String(read.attributes.state)))\n throw new DeliveryError(\"withdrawal_pending\", 5);\n return read;\n },\n );\n return;\n }\n const selection = release.reviewItems;\n if (\n !selection ||\n (!selection.includeApp && !selection.productIds.length && !selection.groupKeys.length)\n )\n throw new DeliveryError(\"review_item_selection_required\", 2);\n const version = selection.includeApp ? await appVersion(builder, api) : undefined;\n if (selection.includeApp && !version) return;\n const build = selection.includeApp ? await selectedBuild(builder, api) : undefined;\n if (selection.includeApp && !build) return;\n if (!builder.loaded.manifest.review)\n builder.manual(\n \"review_information_required\",\n \"Configure and verify the reviewer contact and demo account.\",\n [\"review.submit\"],\n );\n for (const code of [\"privacy\", \"encryption\", \"contentRights\", \"regionalCompliance\"]) {\n if (selection.includeApp && !builder.loaded.manifest.declarations.some((v) => v.code === code))\n builder.manual(\"release_declarations_required\", `Confirm the ${code} declaration.`, [\n \"review.submit\",\n ]);\n }\n for (const declaration of builder.loaded.manifest.declarations) {\n if (!declaration.confirmed || declaration.evidence === \"remote-readback\")\n builder.manual(\n \"declaration_verification_required\",\n `Verify declaration ${declaration.code} in its owning console.`,\n [\"review.submit\"],\n declaration.consoleUrl,\n );\n }\n if (version && build) {\n const full = await api.read(`/v1/appStoreVersions/${version.id}?include=build`);\n const selected = full.relationships?.build?.data;\n if (!selected || Array.isArray(selected) || selected.id !== build.id) {\n if (builder.intent.action === \"submit\")\n throw new DeliveryError(\"review_build_not_prepared\", 4);\n builder.add(\"review.build\", \"update\", selected, build.id, [\"build\"], async () => {\n await api.update(\n `/v1/appStoreVersions/${version.id}`,\n version,\n {},\n { build: relation(\"builds\", build.id) },\n );\n const read = await api.read(`/v1/appStoreVersions/${version.id}?include=build`);\n if (\n canonical(read.relationships?.build?.data) !== canonical({ type: \"builds\", id: build.id })\n )\n throw new DeliveryError(\"review_build_readback_failed\", 5);\n return read;\n });\n }\n }\n const submissions = await api.list(`/v1/apps/${app.id}/reviewSubmissions`);\n const submission = release.reviewSubmissionId\n ? selectOne(\n submissions.filter((v) => v.id === release.reviewSubmissionId),\n \"ambiguous_review_submission\",\n )\n : selectOne(\n submissions.filter(\n (v) => v.attributes.state === \"READY_FOR_REVIEW\" && v.attributes.platform === \"IOS\",\n ),\n \"ambiguous_review_draft\",\n );\n if (release.reviewSubmissionId && !submission)\n throw new DeliveryError(\"review_submission_ownership_mismatch\", 4);\n if (submission && submission.attributes.platform !== \"IOS\")\n throw new DeliveryError(\"review_platform_mismatch\", 4);\n const alreadySubmitted =\n submission &&\n [\"WAITING_FOR_REVIEW\", \"IN_REVIEW\"].includes(String(submission.attributes.state)) &&\n builder.intent.action === \"submit\";\n if (submission && submission.attributes.state !== \"READY_FOR_REVIEW\" && !alreadySubmitted)\n throw new DeliveryError(\"review_submission_not_editable\", 4);\n if (!submission && builder.intent.action === \"submit\")\n throw new DeliveryError(\"review_draft_required\", 4);\n builder.ensure(\n \"review\",\n submission,\n { platform: \"IOS\" },\n async () => {\n const created = await api.create(\n \"/v1/reviewSubmissions\",\n \"reviewSubmissions\",\n { platform: \"IOS\" },\n { app: relation(\"apps\", app.id) },\n );\n return api.read(`/v1/reviewSubmissions/${created.id}`);\n },\n async () => {\n throw new DeliveryError(\"review_platform_immutable\", 4);\n },\n );\n const existingItems = submission\n ? await api.list(`/v1/reviewSubmissions/${submission.id}/items`, {\n include:\n \"appStoreVersion,subscriptionVersion,inAppPurchaseVersion,subscriptionGroupVersion\",\n })\n : [];\n const submittedVersion = (value: AppleResource, relationship: string): boolean =>\n existingItems.some((item) => {\n const ref = item.relationships?.[relationship]?.data;\n return ref && !Array.isArray(ref) && ref.id === value.id;\n });\n const desiredItems: { relationship: string; type: string; id: string }[] = version\n ? [{ relationship: \"appStoreVersion\", type: \"appStoreVersions\", id: version.id }]\n : [];\n const products = selection.productIds.length\n ? await readCatalog(builder, api)\n : new Map<string, AppleResource>();\n const approvedTypes = new Set<string>();\n const allPurchases = selection.productIds.length\n ? await api.list(`/v1/apps/${app.id}/inAppPurchasesV2`)\n : [];\n for (const purchase of allPurchases)\n if (purchase.attributes.state === \"APPROVED\")\n approvedTypes.add(String(purchase.attributes.inAppPurchaseType));\n for (const group of selection.productIds.length\n ? await api.list(`/v1/apps/${app.id}/subscriptionGroups`)\n : []) {\n if (\n (await api.list(`/v1/subscriptionGroups/${group.id}/subscriptions`)).some(\n (v) => v.attributes.state === \"APPROVED\",\n )\n )\n approvedTypes.add(\"subscription\");\n }\n for (const item of builder.loaded.manifest.catalog?.items ?? []) {\n if (!selection.productIds.includes(item.productId)) continue;\n const product = products.get(item.productId);\n if (!product) continue;\n if (\n !alreadySubmitted &&\n (!approvedTypes.has(item.kind) || release.firstPurchaseTypes.includes(item.kind))\n ) {\n builder.manual(\n \"first_purchase_requires_console\",\n \"Submit the first purchase of this type with the app version in App Store Connect.\",\n [\"review.submit\"],\n );\n }\n const type = item.kind === \"subscription\" ? \"subscriptionVersions\" : \"inAppPurchaseVersions\";\n const versions = await api.list(\n `${item.kind === \"subscription\" ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\"}/${product.id}/versions`,\n );\n const draft = selectOne(\n versions.filter((v) =>\n alreadySubmitted\n ? submittedVersion(\n v,\n item.kind === \"subscription\" ? \"subscriptionVersion\" : \"inAppPurchaseVersion\",\n )\n : [\"PREPARE_FOR_SUBMISSION\", \"READY_FOR_REVIEW\"].includes(String(v.attributes.state)),\n ),\n \"ambiguous_product_draft\",\n );\n if (!draft) throw new DeliveryError(\"review_product_version_required\", 4, item.productId);\n desiredItems.push({\n relationship: item.kind === \"subscription\" ? \"subscriptionVersion\" : \"inAppPurchaseVersion\",\n type,\n id: draft.id,\n });\n }\n for (const productId of selection.productIds)\n if (!builder.loaded.manifest.catalog?.items.some((v) => v.productId === productId))\n throw new DeliveryError(\"review_product_not_configured\", 2, productId);\n const allGroups = selection.groupKeys.length\n ? await api.list(`/v1/apps/${app.id}/subscriptionGroups`)\n : [];\n for (const key of selection.groupKeys) {\n const group = builder.loaded.manifest.catalog?.groups.find((v) => v.key === key);\n const remoteId = group?.remoteId ?? builder.bindings[`group.${key}`]?.id;\n if (!group || !allGroups.some((v) => v.id === remoteId))\n throw new DeliveryError(\"review_group_binding_required\", 4, key);\n const versions = await api.list(`/v1/subscriptionGroups/${remoteId}/versions`);\n const draft = selectOne(\n versions.filter((v) =>\n alreadySubmitted\n ? submittedVersion(v, \"subscriptionGroupVersion\")\n : [\"PREPARE_FOR_SUBMISSION\", \"READY_FOR_REVIEW\"].includes(String(v.attributes.state)),\n ),\n \"ambiguous_group_draft\",\n );\n if (!draft) throw new DeliveryError(\"review_group_draft_required\", 4, key);\n desiredItems.push({\n relationship: \"subscriptionGroupVersion\",\n type: \"subscriptionGroupVersions\",\n id: draft.id,\n });\n }\n if (!desiredItems.length) throw new DeliveryError(\"review_item_selection_empty\", 4);\n for (const desired of desiredItems) {\n const found = existingItems.some((v) => {\n const ref = v.relationships?.[desired.relationship]?.data;\n return ref && !Array.isArray(ref) && ref.id === desired.id;\n });\n if (found) continue;\n if (builder.intent.action === \"submit\") throw new DeliveryError(\"review_items_not_prepared\", 4);\n builder.add(\n `review.item.${desired.type}.${desired.id}`,\n \"create\",\n null,\n desired,\n [desired.relationship],\n async () => {\n const created = await api.create(\n \"/v1/reviewSubmissionItems\",\n \"reviewSubmissionItems\",\n {},\n {\n reviewSubmission: relation(\"reviewSubmissions\", builder.require(\"review\").id),\n [desired.relationship]: relation(desired.type, desired.id),\n },\n );\n return api.read(`/v1/reviewSubmissionItems/${created.id}`);\n },\n [\"review\"],\n );\n }\n if (builder.intent.action === \"submit\") {\n if (!release.reviewSubmissionId) throw new DeliveryError(\"review_submission_id_required\", 2);\n if (existingItems.length !== desiredItems.length)\n throw new DeliveryError(\"review_contains_unmanaged_items\", 4);\n if (alreadySubmitted) {\n builder.observe(\"review\", submission);\n return;\n }\n builder.add(\n \"review.submit\",\n \"submit\",\n submission?.attributes,\n desiredItems,\n [\"submitted\"],\n async () => {\n const target = builder.require(\"review\");\n await api.update(`/v1/reviewSubmissions/${target.id}`, target, { submitted: true });\n const read = await api.read(`/v1/reviewSubmissions/${target.id}`);\n if (\n ![\"WAITING_FOR_REVIEW\", \"IN_REVIEW\", \"COMPLETE\"].includes(String(read.attributes.state))\n )\n throw new DeliveryError(\"review_submission_pending\", 5);\n return read;\n },\n );\n }\n}\n\nasync function ownedSubmission(\n api: AppleGateway,\n appId: string,\n id: string,\n): Promise<AppleResource> {\n const found = (await api.list(`/v1/apps/${appId}/reviewSubmissions`)).find((v) => v.id === id);\n if (!found) throw new DeliveryError(\"review_submission_ownership_mismatch\", 4);\n return found;\n}\n","import type { AppleGateway } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, systemClock } from \"../api.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { appVersion, assertEditable } from \"./metadata.js\";\n\n/** 配置发布方式和实际发布使用不同意图,避免资料同步触发上线。 */\nexport async function planRelease(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const version = await appVersion(builder, api);\n if (!version) return;\n const config = builder.loaded.manifest.release!;\n const action = builder.intent.action;\n if (action === \"configure\") {\n const desired = {\n releaseType: config.mode,\n ...(config.mode === \"SCHEDULED\" ? { earliestReleaseDate: config.earliestReleaseDate } : {}),\n };\n builder.ensure(\n \"release.policy\",\n version,\n desired,\n async () => {\n throw new DeliveryError(\"app_version_required\", 4);\n },\n async (value, fields) => {\n assertEditable(value);\n await api.update(`/v1/appStoreVersions/${value.id}`, value, fields);\n return api.read(`/v1/appStoreVersions/${value.id}`);\n },\n );\n if (config.phasedRelease !== undefined) {\n const full = await api.read(\n `/v1/appStoreVersions/${version.id}?include=appStoreVersionPhasedRelease`,\n );\n const ref = full.relationships?.appStoreVersionPhasedRelease?.data;\n const current =\n ref && !Array.isArray(ref)\n ? await api.read(`/v1/appStoreVersionPhasedReleases/${ref.id}`)\n : undefined;\n if (!config.phasedRelease && current)\n throw new DeliveryError(\"phased_release_removal_requires_console\", 4);\n if (config.phasedRelease && !current)\n builder.add(\n \"release.phased\",\n \"create\",\n null,\n { phasedReleaseState: \"INACTIVE\" },\n [\"phasedReleaseState\"],\n async () => {\n assertEditable(version);\n const created = await api.create(\n \"/v1/appStoreVersionPhasedReleases\",\n \"appStoreVersionPhasedReleases\",\n { phasedReleaseState: \"INACTIVE\" },\n { appStoreVersion: relation(\"appStoreVersions\", version.id) },\n );\n const read = await api.read(`/v1/appStoreVersionPhasedReleases/${created.id}`);\n if (read.attributes.phasedReleaseState !== \"INACTIVE\")\n throw new DeliveryError(\"phased_release_readback_failed\", 5);\n return read;\n },\n );\n }\n return;\n }\n if (action === \"publish\") {\n if (version.attributes.appStoreState === \"READY_FOR_SALE\") return;\n if (version.attributes.appStoreState !== \"PENDING_DEVELOPER_RELEASE\")\n throw new DeliveryError(\"version_not_ready_for_release\", 4);\n builder.add(\n \"release.publish\",\n \"release\",\n version.attributes,\n { versionId: version.id },\n [\"release\"],\n async () => {\n await api.create(\n \"/v1/appStoreVersionReleaseRequests\",\n \"appStoreVersionReleaseRequests\",\n {},\n { appStoreVersion: relation(\"appStoreVersions\", version.id) },\n );\n for (let attempt = 0; attempt < 30; attempt++) {\n const read = await api.read(`/v1/appStoreVersions/${version.id}`);\n if (read.attributes.appStoreState === \"READY_FOR_SALE\") return read;\n await systemClock.sleep(2000);\n }\n throw new DeliveryError(\"release_processing_pending\", 5);\n },\n );\n return;\n }\n const phased = await api.read(`/v1/appStoreVersions/${version.id}/appStoreVersionPhasedRelease`);\n if (config.phasedReleaseId && phased.id !== config.phasedReleaseId)\n throw new DeliveryError(\"phased_release_identity_mismatch\", 4);\n const state = action === \"pause\" ? \"PAUSED\" : action === \"resume\" ? \"ACTIVE\" : \"COMPLETE\";\n if (phased.attributes.phasedReleaseState === state) return;\n const allowed =\n action === \"pause\" ? [\"ACTIVE\"] : action === \"resume\" ? [\"PAUSED\"] : [\"ACTIVE\", \"PAUSED\"];\n if (!allowed.includes(String(phased.attributes.phasedReleaseState)))\n throw new DeliveryError(\"phased_release_transition_invalid\", 4);\n builder.add(\n `release.${action}`,\n action === \"pause\" ? \"pause\" : action === \"resume\" ? \"resume\" : \"complete\",\n phased.attributes,\n { phasedReleaseState: state },\n [\"phasedReleaseState\"],\n async () => {\n await api.update(`/v1/appStoreVersionPhasedReleases/${phased.id}`, phased, {\n phasedReleaseState: state,\n });\n const read = await api.read(`/v1/appStoreVersionPhasedReleases/${phased.id}`);\n if (read.attributes.phasedReleaseState !== state)\n throw new DeliveryError(\"phased_release_readback_failed\", 5);\n return read;\n },\n );\n}\n","import path from \"node:path\";\nimport { z } from \"zod\";\nimport type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { digest, parseSchema, readJsonFile } from \"../manifest.js\";\nimport { requirePrivateFile } from \"../credentials.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { selectedBuild } from \"./review.js\";\n\nexport async function planTestFlight(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const config = builder.loaded.manifest.testflight;\n if (!config) throw new DeliveryError(\"testflight_configuration_required\", 2);\n const app = builder.require(\"app\");\n const groups = await api.list(`/v1/apps/${app.id}/betaGroups`);\n const targets = config.groupIds.map((id) => {\n const value = groups.find((v) => v.id === id);\n if (!value || value.attributes.isInternalGroup === config.external)\n throw new DeliveryError(\"beta_group_ownership_or_type_mismatch\", 4, id);\n return value;\n });\n if (builder.intent.action === \"invite\") {\n if (!config.invitationsRef || !targets.length)\n throw new DeliveryError(\"explicit_testers_and_groups_required\", 2);\n const filename = path.resolve(builder.loaded.directory, config.invitationsRef);\n await requirePrivateFile(filename);\n const testers = parseSchema(\n z\n .array(\n z.strictObject({\n email: z.email(),\n firstName: z.string().min(1),\n lastName: z.string().min(1),\n }),\n )\n .min(1),\n await readJsonFile(filename),\n );\n for (const tester of testers) {\n const current = selectOne(\n await api.list(\"/v1/betaTesters\", { \"filter[email]\": tester.email }),\n \"ambiguous_beta_tester\",\n );\n const currentGroups = current\n ? await api.list(`/v1/betaTesters/${current.id}/betaGroups`)\n : [];\n const missing = targets.filter((v) => !currentGroups.some((g) => g.id === v.id));\n if (!missing.length) continue;\n const key = `testflight.tester.${digest(tester.email.toLowerCase()).slice(0, 24)}`;\n builder.add(\n key,\n \"invite\",\n { id: current?.id, groups: currentGroups.map((v) => v.id) },\n { tester, groups: missing.map((v) => v.id) },\n [\"tester\", \"groups\"],\n async () => {\n const value =\n current ??\n (await api.create(\"/v1/betaTesters\", \"betaTesters\", tester, {\n betaGroups: { data: missing.map((v) => ({ type: \"betaGroups\", id: v.id })) },\n }));\n await builder.record(key, value);\n if (current)\n await api.relationship(\n `/v1/betaTesters/${current.id}/relationships/betaGroups`,\n missing.map((v) => ({ type: \"betaGroups\", id: v.id })),\n );\n const read = await api.list(`/v1/betaTesters/${value.id}/betaGroups`);\n if (!targets.every((v) => read.some((g) => g.id === v.id)))\n throw new DeliveryError(\"beta_invitation_readback_failed\", 5);\n return value;\n },\n );\n }\n return;\n }\n const build = await selectedBuild(builder, api);\n if (!build) return;\n const details = await api.read(`/v1/builds/${build.id}/buildBetaDetail`);\n builder.observe(\"testflight.buildDetail\", details);\n if (builder.intent.action === \"prepare\") {\n builder.ensure(\n \"testflight.notifications\",\n details,\n { autoNotifyEnabled: config.notifyTesters },\n async () => {\n throw new DeliveryError(\"beta_detail_missing\", 4);\n },\n async (value, fields) => {\n await api.update(`/v1/buildBetaDetails/${value.id}`, value, fields);\n return api.read(`/v1/buildBetaDetails/${value.id}`);\n },\n );\n if (!config.locale) throw new DeliveryError(\"testflight_locale_required\", 2);\n const appLocales = await api.list(`/v1/apps/${app.id}/betaAppLocalizations`);\n const buildLocales = await api.list(`/v1/builds/${build.id}/betaBuildLocalizations`);\n for (const [type, rows, attributes, parent, relationship] of [\n [\n \"betaAppLocalizations\",\n appLocales,\n {\n locale: config.locale,\n ...(config.betaDescription !== undefined ? { description: config.betaDescription } : {}),\n ...(config.feedbackEmail ? { feedbackEmail: config.feedbackEmail } : {}),\n },\n app,\n \"app\",\n ],\n [\n \"betaBuildLocalizations\",\n buildLocales,\n {\n locale: config.locale,\n ...(config.whatsNew !== undefined ? { whatsNew: config.whatsNew } : {}),\n },\n build,\n \"build\",\n ],\n ] as const) {\n if (Object.keys(attributes).length === 1) continue;\n const current = selectOne(\n rows.filter((v) => v.attributes.locale === config.locale),\n \"ambiguous_beta_localization\",\n );\n builder.ensure(\n `testflight.${type}.${config.locale}`,\n current,\n attributes,\n async () => {\n const created = await api.create(`/v1/${type}`, type, attributes, {\n [relationship]: relation(parent.type, parent.id),\n });\n return api.read(`/v1/${type}/${created.id}`);\n },\n async (value, fields) => {\n await api.update(`/v1/${type}/${value.id}`, value, fields);\n return api.read(`/v1/${type}/${value.id}`);\n },\n );\n }\n return;\n }\n if (details.attributes.autoNotifyEnabled !== config.notifyTesters)\n throw new DeliveryError(\"beta_notification_policy_not_prepared\", 4);\n if (builder.intent.action === \"review\") {\n if (!config.external) throw new DeliveryError(\"external_testing_required\", 2);\n if (\n [\"WAITING_FOR_BETA_REVIEW\", \"IN_BETA_REVIEW\", \"BETA_APPROVED\", \"IN_BETA_TESTING\"].includes(\n String(details.attributes.externalBuildState),\n )\n )\n return;\n if (details.attributes.externalBuildState !== \"READY_FOR_BETA_SUBMISSION\")\n throw new DeliveryError(\"build_not_ready_for_beta_review\", 4);\n builder.add(\n \"testflight.review\",\n \"submit\",\n details.attributes,\n { buildId: build.id },\n [\"betaReview\"],\n async () => {\n const created = await api.create(\n \"/v1/betaAppReviewSubmissions\",\n \"betaAppReviewSubmissions\",\n {},\n { build: relation(\"builds\", build.id) },\n );\n const read = await api.read(`/v1/betaAppReviewSubmissions/${created.id}`);\n if (\n ![\"WAITING_FOR_REVIEW\", \"IN_REVIEW\", \"APPROVED\"].includes(\n String(read.attributes.betaReviewState),\n )\n )\n throw new DeliveryError(\"beta_review_pending\", 5);\n return read;\n },\n );\n return;\n }\n if (!targets.length) throw new DeliveryError(\"beta_groups_required\", 2);\n if (\n config.external &&\n ![\"BETA_APPROVED\", \"IN_BETA_TESTING\", \"READY_FOR_BETA_TESTING\"].includes(\n String(details.attributes.externalBuildState),\n )\n )\n throw new DeliveryError(\"external_beta_approval_required\", 4);\n for (const group of targets) {\n const current = await api.list(`/v1/betaGroups/${group.id}/builds`);\n if (current.some((v) => v.id === build.id)) continue;\n if (\n group.attributes.publicLinkEnabled === true ||\n group.attributes.hasAccessToAllBuilds === true\n )\n throw new DeliveryError(\"beta_group_automatic_distribution_requires_console\", 4, group.id);\n builder.add(\n `testflight.group.${group.id}`,\n \"distribute\",\n current.map((v) => v.id),\n build.id,\n [\"build\"],\n async () => {\n await api.relationship(`/v1/betaGroups/${group.id}/relationships/builds`, [\n { type: \"builds\", id: build.id },\n ]);\n const read = await api.list(`/v1/betaGroups/${group.id}/builds`);\n if (!read.some((v) => v.id === build.id))\n throw new DeliveryError(\"beta_distribution_readback_failed\", 5);\n return group;\n },\n );\n }\n}\n","import { execa } from \"execa\";\nimport type { ProcessRunner } from \"./contracts.js\";\nimport { DeliveryError } from \"./contracts.js\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\n/** 子进程不能继承任意业务凭据或把工具日志输出到终端。 */\nexport function createProcessRunner(signal?: AbortSignal): ProcessRunner {\n return {\n async run(executable, args, options) {\n try {\n const result = await execa(executable, args, {\n cwd: options.cwd,\n env: options.env,\n extendEnv: false,\n timeout: options.timeoutMs,\n cancelSignal: options.signal ?? signal,\n stdin: \"ignore\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n maxBuffer: 4 * 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n } catch {\n const cancelled = (options.signal ?? signal)?.aborted;\n throw new DeliveryError(\n cancelled ? \"cancelled\" : \"delivery_process_failed\",\n cancelled ? 130 : 5,\n );\n }\n },\n };\n}\nexport function toolEnvironment(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const name of [\n \"PATH\",\n \"HOME\",\n \"TMPDIR\",\n \"LANG\",\n \"LC_ALL\",\n \"DEVELOPER_DIR\",\n \"SSL_CERT_FILE\",\n \"SSL_CERT_DIR\",\n ]) {\n const value = process.env[name];\n if (value !== undefined) env[name] = value;\n }\n return {\n ...env,\n CI: \"1\",\n FASTLANE_SKIP_UPDATE_CHECK: \"1\",\n FASTLANE_HIDE_CHANGELOG: \"1\",\n FASTLANE_OPT_OUT_USAGE: \"1\",\n FASTLANE_DISABLE_COLORS: \"1\",\n GIT_TERMINAL_PROMPT: \"0\",\n BUNDLE_FROZEN: \"true\",\n BUNDLE_PATH: path.join(os.homedir(), \".cache\", \"stackonward\", \"apple-gems\"),\n };\n}\n","import { mkdtemp, mkdir, readFile, rm, copyFile, realpath } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { z } from \"zod\";\nimport type { ProcessRunner } from \"./contracts.js\";\nimport { DeliveryError } from \"./contracts.js\";\nimport type { AppleCredentials } from \"./credentials.js\";\nimport { requirePrivateFile } from \"./credentials.js\";\nimport { parseSchema, readJsonFile, fileDigest, type LoadedManifest } from \"./manifest.js\";\nimport { writePrivateJson } from \"./state.js\";\nimport { toolEnvironment } from \"./process.js\";\n\nexport interface AppleBuildTools {\n preflight(): Promise<void>;\n run(\n action: \"native\" | \"signing\" | \"archive\" | \"upload\",\n parameters: Record<string, unknown>,\n ): Promise<Record<string, unknown>>;\n}\nconst resultSchema = z.record(z.string(), z.unknown());\nconst signingSecrets = z.strictObject({\n password: z.string().min(1),\n gitBasicAuthorization: z.string().min(1).optional(),\n});\n\n/** Ruby 只运行随发行包锁定的 lane;资料不包含可执行 Ruby 或 shell。 */\nexport function createAppleBuildTools(\n loaded: LoadedManifest,\n credentials: AppleCredentials,\n runner: ProcessRunner,\n resourceDirectory: string,\n signal?: AbortSignal,\n): AppleBuildTools {\n const env = toolEnvironment();\n const bundle = loaded.manifest.build?.bundleExecutable ?? \"bundle\";\n const gemfile = path.join(loaded.directory, \"Gemfile\");\n return {\n async preflight() {\n if (process.platform !== \"darwin\") throw new DeliveryError(\"macos_required\", 4);\n for (const filename of [\"Gemfile\", \"Gemfile.lock\"]) {\n if (\n fileDigest(await readFile(path.join(resourceDirectory, filename))) !==\n fileDigest(await readFile(path.join(loaded.directory, filename)))\n )\n throw new DeliveryError(\"apple_toolchain_lock_mismatch\", 4, filename);\n }\n await runner.run(bundle, [\"check\"], {\n cwd: loaded.directory,\n env: { ...env, BUNDLE_GEMFILE: gemfile },\n timeoutMs: 30_000,\n signal,\n });\n const xcode = await runner.run(\"xcodebuild\", [\"-version\"], {\n cwd: loaded.directory,\n env,\n timeoutMs: 30_000,\n signal,\n });\n if (\n loaded.manifest.build &&\n xcode.stdout.split(\"\\n\")[0] !== `Xcode ${loaded.manifest.build.xcodeVersion}`\n )\n throw new DeliveryError(\"xcode_version_mismatch\", 4);\n },\n async run(action, parameters) {\n const root = await mkdtemp(path.join(os.tmpdir(), \"stackonward-apple-\"));\n try {\n const apiKeyPath = path.join(root, \"api-key.json\"),\n invocationPath = path.join(root, \"invocation.json\"),\n resultPath = path.join(root, \"result.json\");\n await writePrivateJson(apiKeyPath, {\n key_id: credentials.account.keyId,\n issuer_id: credentials.account.issuerId,\n key: await readFile(credentials.account.privateKeyPath, \"utf8\"),\n in_house: false,\n });\n let secrets: z.infer<typeof signingSecrets> | undefined;\n if (action === \"archive\" || action === \"signing\") {\n if (!credentials.account.signingSecretsFile)\n throw new DeliveryError(\"signing_secrets_required\", 4);\n await requirePrivateFile(credentials.account.signingSecretsFile);\n secrets = parseSchema(\n signingSecrets,\n await readJsonFile(credentials.account.signingSecretsFile),\n );\n }\n await mkdir(path.join(root, \"fastlane\"));\n await copyFile(\n path.join(resourceDirectory, \"fastlane\", \"Fastfile\"),\n path.join(root, \"fastlane\", \"Fastfile\"),\n );\n await writePrivateJson(invocationPath, {\n action,\n ...parameters,\n apiKeyPath,\n resultPath,\n teamId: credentials.account.teamId,\n bundleId: loaded.manifest.app.bundleId,\n signing: loaded.manifest.signing,\n keychainName: `stackonward-${path.basename(root)}`,\n keychainPassword: randomBytes(32).toString(\"hex\"),\n });\n try {\n await runner.run(bundle, [\"exec\", \"fastlane\", \"ios\", \"delivery\"], {\n cwd: await realpath(root),\n env: {\n ...env,\n BUNDLE_GEMFILE: gemfile,\n STACKONWARD_APPLE_INVOCATION: invocationPath,\n ...(secrets\n ? {\n MATCH_PASSWORD: secrets.password,\n ...(secrets.gitBasicAuthorization\n ? { MATCH_GIT_BASIC_AUTHORIZATION: secrets.gitBasicAuthorization }\n : {}),\n }\n : {}),\n },\n timeoutMs: action === \"archive\" ? 3_600_000 : 1_800_000,\n signal,\n });\n } catch (error) {\n if (action === \"upload\" || (action === \"signing\" && parameters.readOnly === false))\n throw new DeliveryError(\"apple_write_outcome_unknown\", 7);\n throw error;\n }\n return parseSchema(resultSchema, await readJsonFile(resultPath));\n } finally {\n await rm(root, { recursive: true, force: true });\n }\n },\n };\n}\n","import path from \"node:path\";\nimport { readFile, realpath, lstat, mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { z } from \"zod\";\nimport { X509Certificate } from \"node:crypto\";\nimport type { AppleGateway, ProcessRunner } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport type { AppleCredentials } from \"../credentials.js\";\nimport { requirePrivateFile } from \"../credentials.js\";\nimport type { AppleBuildTools } from \"../fastlane.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { digest, fileDigest, readJsonFile, parseSchema } from \"../manifest.js\";\nimport { toolEnvironment } from \"../process.js\";\nimport { writePrivateJson, privateDirectory } from \"../state.js\";\nimport { selectedBuild } from \"./review.js\";\nimport { systemClock } from \"../api.js\";\n\nconst artifactSchema = z.strictObject({\n schemaVersion: z.literal(1),\n bundleId: z.string(),\n teamId: z.string(),\n version: z.string(),\n buildNumber: z.string(),\n ipaPath: z.string(),\n sha256: z.string(),\n dsymPath: z.string(),\n dsymSha256: z.string(),\n sourceDigest: z.string(),\n inputDigest: z.string(),\n capabilities: z.record(z.string(), z.boolean()),\n});\n\nasync function projectPaths(\n builder: PlanBuilder,\n): Promise<{ root: string; project: string; output: string; workspace?: string }> {\n const build = builder.loaded.manifest.build;\n if (!build) throw new DeliveryError(\"build_configuration_required\", 2);\n const root = await realpath(path.resolve(builder.loaded.directory, build.projectRoot));\n const project = await realpath(path.resolve(root, build.projectPath));\n const workspace = build.workspace\n ? await realpath(path.resolve(root, build.workspace))\n : undefined;\n if (![project, ...(workspace ? [workspace] : [])].every((v) => v.startsWith(root + path.sep)))\n throw new DeliveryError(\"project_path_outside_root\", 2);\n const output = path.resolve(root, build.outputPath);\n if (!output.startsWith(root + path.sep)) throw new DeliveryError(\"build_output_outside_root\", 2);\n let ancestor = output;\n while (ancestor !== root) {\n try {\n await lstat(ancestor);\n const actual = await realpath(ancestor);\n if (!actual.startsWith(root + path.sep))\n throw new DeliveryError(\"build_output_outside_root\", 2);\n break;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n ancestor = path.dirname(ancestor);\n }\n return { root, project, output, workspace };\n}\n\nexport async function planSigning(\n builder: PlanBuilder,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n): Promise<void> {\n const config = builder.loaded.manifest.signing;\n if (!config || !config.bundleIds.includes(builder.loaded.manifest.app.bundleId))\n throw new DeliveryError(\"signing_configuration_required\", 2);\n if (!credentials.account.signingSecretsFile)\n throw new DeliveryError(\"signing_secrets_required\", 4);\n await requirePrivateFile(credentials.account.signingSecretsFile);\n if (builder.intent.action === \"initialize\" && config.readonly)\n throw new DeliveryError(\"signing_initialization_requires_writable_config\", 2);\n await tools.preflight();\n builder.add(\n \"signing.profiles\",\n \"update\",\n null,\n {\n team: credentials.account.teamId,\n ...config,\n readOnly: builder.intent.action !== \"initialize\",\n },\n [\"profiles\", \"certificates\"],\n async () => {\n const result = await tools.run(\"signing\", {\n readOnly: builder.intent.action !== \"initialize\",\n });\n const profiles = parseSchema(z.record(z.string(), z.string()), result.profiles);\n if (!config.bundleIds.every((id) => profiles[id]))\n throw new DeliveryError(\"signing_profiles_missing\", 5);\n return { type: \"signingProfiles\", id: digest(profiles) };\n },\n );\n}\n\nexport async function planBuild(\n builder: PlanBuilder,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n runner: ProcessRunner,\n): Promise<void> {\n const release = builder.loaded.manifest.release,\n config = builder.loaded.manifest.build;\n if (!release || !config) throw new DeliveryError(\"build_and_release_configuration_required\", 2);\n if (builder.loaded.manifest.signing?.profileType !== \"appstore\")\n throw new DeliveryError(\"appstore_signing_required\", 2);\n if (!credentials.account.signingSecretsFile)\n throw new DeliveryError(\"signing_secrets_required\", 4);\n await requirePrivateFile(credentials.account.signingSecretsFile);\n await tools.preflight();\n const paths = await projectPaths(builder),\n env = toolEnvironment();\n const sourceFingerprint = async () => {\n const tracked = await runner.run(\n \"git\",\n [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\", \".\"],\n { cwd: paths.root, env, timeoutMs: 30_000 },\n );\n const inputs: [string, string][] = [];\n for (const name of [\n ...new Set([\n ...tracked.stdout.split(\"\\0\").filter(Boolean),\n ...(config.publicDefinesFile ? [config.publicDefinesFile] : []),\n ]),\n ].sort()) {\n const filename = await realpath(path.resolve(paths.root, name));\n if (!filename.startsWith(paths.root + path.sep))\n throw new DeliveryError(\"build_source_symlink_outside_root\", 2);\n if (filename.startsWith(paths.output + path.sep)) continue;\n inputs.push([name, fileDigest(await readFile(filename))]);\n }\n return digest(inputs);\n };\n const sourceDigest = await sourceFingerprint();\n builder.observe(\"build.inputs\", { type: \"localBuildInputs\", id: sourceDigest, attributes: {} });\n let previous: unknown;\n try {\n previous = JSON.parse(await readFile(path.join(paths.output, \"artifact.json\"), \"utf8\"));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\")\n throw new DeliveryError(\"archive_attestation_unreadable\", 2);\n }\n if (previous) {\n const artifact = parseSchema(artifactSchema, previous);\n if (\n artifact.sourceDigest === sourceDigest &&\n artifact.inputDigest === builder.loaded.inputDigest &&\n artifact.teamId === credentials.account.teamId\n ) {\n if (\n (await realpath(artifact.ipaPath)) !== path.join(await realpath(paths.output), \"app.ipa\") ||\n fileDigest(await readFile(artifact.ipaPath)) !== artifact.sha256 ||\n !(await realpath(artifact.dsymPath)).startsWith(\n (await realpath(paths.output)) + path.sep,\n ) ||\n fileDigest(await readFile(artifact.dsymPath)) !== artifact.dsymSha256\n )\n throw new DeliveryError(\"archive_checksum_mismatch\", 5);\n await verifyArchive(artifact.ipaPath, builder, credentials, runner);\n builder.satisfy(\"build.archive\", {\n sourceDigest,\n inputDigest: builder.loaded.inputDigest,\n version: release.version,\n buildNumber: release.buildNumber,\n });\n return;\n }\n }\n builder.add(\n \"build.archive\",\n \"create\",\n null,\n {\n sourceDigest,\n inputDigest: builder.loaded.inputDigest,\n version: release.version,\n buildNumber: release.buildNumber,\n },\n [\"ipa\", \"dSYM\", \"attestation\"],\n async () => {\n const outputRoot = await privateDirectory(paths.output);\n if (!outputRoot.startsWith(paths.root + path.sep))\n throw new DeliveryError(\"build_output_outside_root\", 2);\n if ((await sourceFingerprint()) !== sourceDigest)\n throw new DeliveryError(\"build_inputs_changed\", 4);\n if (config.kind === \"flutter\") {\n if (!config.flutterVersion) throw new DeliveryError(\"flutter_version_required\", 2);\n const executable = config.flutterExecutable ?? \"flutter\";\n const version = await runner.run(executable, [\"--version\", \"--machine\"], {\n cwd: paths.root,\n env,\n timeoutMs: 30_000,\n });\n const info = parseSchema(\n z.object({ frameworkVersion: z.string() }),\n JSON.parse(version.stdout),\n );\n if (info.frameworkVersion !== config.flutterVersion)\n throw new DeliveryError(\"flutter_version_mismatch\", 4);\n const args = [\n \"build\",\n \"ios\",\n \"--config-only\",\n \"--release\",\n \"--no-pub\",\n \"--build-name\",\n release.version,\n \"--build-number\",\n release.buildNumber,\n ];\n if (config.publicDefinesFile) {\n const filename = await realpath(path.resolve(paths.root, config.publicDefinesFile));\n if (!filename.startsWith(paths.root + path.sep))\n throw new DeliveryError(\"build_defines_outside_root\", 2);\n const values = parseSchema(\n z.record(z.string(), z.union([z.string(), z.boolean(), z.number()])),\n await readJsonFile(filename),\n );\n if (\n Object.keys(values).some((key) =>\n /secret|password|private.?key|access.?token|refresh.?token/i.test(key),\n )\n )\n throw new DeliveryError(\"secret_in_public_build_defines\", 2);\n args.push(\"--dart-define-from-file\", filename);\n }\n await runner.run(executable, args, { cwd: paths.root, env, timeoutMs: 900_000 });\n }\n const result = await tools.run(\"archive\", {\n readOnly: true,\n outputDirectory: paths.output,\n version: release.version,\n buildNumber: release.buildNumber,\n project: {\n projectPath: paths.project,\n workspace: paths.workspace,\n scheme: config.scheme,\n configuration: config.configuration,\n },\n });\n const output = parseSchema(\n z.object({\n ipaPath: z.string(),\n sha256: z.string(),\n dsymPath: z.string(),\n dsymSha256: z.string(),\n }),\n result,\n );\n const ipaPath = await realpath(output.ipaPath);\n if (ipaPath !== path.join(await realpath(paths.output), \"app.ipa\"))\n throw new DeliveryError(\"unexpected_archive_path\", 5);\n const sha256 = fileDigest(await readFile(ipaPath));\n if (sha256 !== output.sha256) throw new DeliveryError(\"archive_checksum_mismatch\", 5);\n const dsymPath = await realpath(output.dsymPath);\n if (\n !dsymPath.startsWith((await realpath(paths.output)) + path.sep) ||\n fileDigest(await readFile(dsymPath)) !== output.dsymSha256\n )\n throw new DeliveryError(\"dsym_checksum_mismatch\", 5);\n await verifyArchive(ipaPath, builder, credentials, runner);\n if ((await sourceFingerprint()) !== sourceDigest)\n throw new DeliveryError(\"build_inputs_changed\", 4);\n await writePrivateJson(path.join(paths.output, \"artifact.json\"), {\n schemaVersion: 1,\n bundleId: builder.loaded.manifest.app.bundleId,\n teamId: credentials.account.teamId,\n version: release.version,\n buildNumber: release.buildNumber,\n ipaPath,\n sha256,\n dsymPath,\n dsymSha256: output.dsymSha256,\n sourceDigest,\n inputDigest: builder.loaded.inputDigest,\n capabilities: builder.loaded.manifest.capabilities,\n });\n return { type: \"ipaArchives\", id: sha256 };\n },\n );\n}\n\nexport async function verifyArchive(\n ipaPath: string,\n builder: PlanBuilder,\n credentials: AppleCredentials,\n runner: ProcessRunner,\n): Promise<void> {\n const root = await mkdtemp(path.join(os.tmpdir(), \"apple-archive-\")),\n env = toolEnvironment();\n try {\n const entries = await runner.run(\"unzip\", [\"-Z1\", ipaPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const names = entries.stdout.split(\"\\n\").filter(Boolean);\n if (names.some((v) => v.startsWith(\"/\") || v.split(\"/\").includes(\"..\") || v.includes(\"\\\\\")))\n throw new DeliveryError(\"unsafe_archive_path\", 2);\n const plists = names.filter((v) => /^Payload\\/[^/]+\\.app\\/Info.plist$/.test(v));\n if (plists.length !== 1) throw new DeliveryError(\"archive_main_app_ambiguous\", 5);\n const archiveListing = await runner.run(\"unzip\", [\"-Z\", \"-l\", ipaPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n if (archiveListing.stdout.split(\"\\n\").some((line) => /^l[rwx-]{9}/.test(line)))\n throw new DeliveryError(\"archive_symlink_not_allowed\", 2);\n await runner.run(\"unzip\", [\"-q\", ipaPath, \"-d\", root], { cwd: root, env, timeoutMs: 120_000 });\n const appPath = path.join(root, path.dirname(plists[0]));\n await runner.run(\"codesign\", [\"--verify\", \"--deep\", \"--strict\", appPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const info = await runner.run(\n \"plutil\",\n [\"-convert\", \"json\", \"-o\", \"-\", path.join(root, plists[0])],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n const plist = parseSchema(\n z.object({\n CFBundleIdentifier: z.string(),\n CFBundleShortVersionString: z.string(),\n CFBundleVersion: z.string(),\n }),\n JSON.parse(info.stdout),\n );\n if (\n plist.CFBundleIdentifier !== builder.loaded.manifest.app.bundleId ||\n plist.CFBundleShortVersionString !== builder.loaded.manifest.release!.version ||\n plist.CFBundleVersion !== builder.loaded.manifest.release!.buildNumber\n )\n throw new DeliveryError(\"archive_identity_mismatch\", 5);\n const signed = await runner.run(\"codesign\", [\"-d\", \"--entitlements\", \":-\", appPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const entitlementFile = path.join(root, \"entitlements.plist\");\n await writeFile(entitlementFile, signed.stdout, { mode: 0o600 });\n const converted = await runner.run(\"plutil\", [\"-convert\", \"json\", \"-o\", \"-\", entitlementFile], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const entitlements = parseSchema(\n z.record(z.string(), z.unknown()),\n JSON.parse(converted.stdout),\n );\n if (\n entitlements[\"com.apple.developer.team-identifier\"] !== credentials.account.teamId ||\n entitlements[\"application-identifier\"] !==\n `${credentials.account.teamId}.${plist.CFBundleIdentifier}`\n )\n throw new DeliveryError(\"archive_team_mismatch\", 5);\n if (\n builder.loaded.manifest.capabilities.pushNotifications &&\n entitlements[\"aps-environment\"] !== \"production\"\n )\n throw new DeliveryError(\"archive_push_entitlement_missing\", 5);\n if (\n builder.loaded.manifest.capabilities.signInWithApple &&\n (!Array.isArray(entitlements[\"com.apple.developer.applesignin\"]) ||\n !entitlements[\"com.apple.developer.applesignin\"].includes(\"Default\"))\n )\n throw new DeliveryError(\"archive_apple_login_entitlement_missing\", 5);\n for (const infoPath of names.filter((v) => /\\.(?:app|appex)\\/Info\\.plist$/.test(v))) {\n const targetPath = path.join(root, path.dirname(infoPath));\n await runner.run(\"codesign\", [\"--verify\", \"--strict\", targetPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const info = await runner.run(\n \"plutil\",\n [\"-convert\", \"json\", \"-o\", \"-\", path.join(root, infoPath)],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n const identifier = parseSchema(\n z.object({ CFBundleIdentifier: z.string() }),\n JSON.parse(info.stdout),\n ).CFBundleIdentifier;\n if (!builder.loaded.manifest.signing?.bundleIds.includes(identifier))\n throw new DeliveryError(\"archive_target_not_declared\", 5);\n const profileFile = path.join(targetPath, \"embedded.mobileprovision\");\n const profileXml = await runner.run(\"security\", [\"cms\", \"-D\", \"-i\", profileFile], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const decodedFile = path.join(root, \"profile.plist\");\n await writeFile(decodedFile, profileXml.stdout, { mode: 0o600 });\n const profileJson = await runner.run(\n builder.loaded.manifest.build?.bundleExecutable ?? \"bundle\",\n [\n \"exec\",\n \"ruby\",\n \"-rplist\",\n \"-rjson\",\n \"-rbase64\",\n \"-e\",\n 'p = Plist.parse_xml(ARGV.fetch(0)); p[\"ExpirationDate\"] = p.fetch(\"ExpirationDate\").iso8601; p[\"DeveloperCertificates\"] = p.fetch(\"DeveloperCertificates\").map { |v| Base64.strict_encode64(v.string) }; puts JSON.generate(p)',\n decodedFile,\n ],\n {\n cwd: root,\n env: { ...env, BUNDLE_GEMFILE: path.join(builder.loaded.directory, \"Gemfile\") },\n timeoutMs: 30_000,\n },\n );\n const profile = parseSchema(\n z.object({\n ExpirationDate: z.string(),\n TeamIdentifier: z.array(z.string()),\n DeveloperCertificates: z.array(z.string()),\n Entitlements: z.record(z.string(), z.unknown()),\n ProvisionedDevices: z.array(z.string()).optional(),\n ProvisionsAllDevices: z.boolean().optional(),\n }),\n JSON.parse(profileJson.stdout),\n );\n if (\n !Number.isFinite(Date.parse(profile.ExpirationDate)) ||\n Date.parse(profile.ExpirationDate) <= Date.now() ||\n !profile.TeamIdentifier.includes(credentials.account.teamId) ||\n profile.ProvisionedDevices ||\n profile.ProvisionsAllDevices ||\n profile.Entitlements[\"get-task-allow\"] === true ||\n profile.Entitlements[\"application-identifier\"] !==\n `${credentials.account.teamId}.${identifier}`\n )\n throw new DeliveryError(\"archive_profile_invalid\", 5);\n const targetSigned = await runner.run(\n \"codesign\",\n [\"-d\", \"--entitlements\", \":-\", targetPath],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n await writeFile(entitlementFile, targetSigned.stdout, { mode: 0o600 });\n const targetJson = await runner.run(\n \"plutil\",\n [\"-convert\", \"json\", \"-o\", \"-\", entitlementFile],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n const targetEntitlements = parseSchema(\n z.record(z.string(), z.unknown()),\n JSON.parse(targetJson.stdout),\n );\n if (\n targetEntitlements[\"application-identifier\"] !==\n `${credentials.account.teamId}.${identifier}` ||\n targetEntitlements[\"com.apple.developer.team-identifier\"] !== credentials.account.teamId ||\n targetEntitlements[\"get-task-allow\"] === true\n )\n throw new DeliveryError(\"archive_target_entitlements_invalid\", 5);\n assertEntitlementsAuthorized(targetEntitlements, profile.Entitlements);\n const certPrefix = path.join(root, \"signing-certificate-\");\n await runner.run(\"codesign\", [\"-d\", \"--extract-certificates\", certPrefix, targetPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const certificateBytes = await readFile(certPrefix + \"0\");\n const certificate = new X509Certificate(certificateBytes);\n if (\n Date.parse(certificate.validTo) <= Date.now() ||\n !profile.DeveloperCertificates.some((value) =>\n Buffer.from(value, \"base64\").equals(certificateBytes),\n )\n )\n throw new DeliveryError(\"archive_signing_certificate_mismatch\", 5);\n }\n } finally {\n await rm(root, { recursive: true, force: true });\n }\n}\n\n/** 签名使用的值必须在描述文件授权范围内;数组是集合子集,通配符只由授权方提供。 */\nexport function assertEntitlementsAuthorized(\n actual: Record<string, unknown>,\n allowed: Record<string, unknown>,\n): void {\n const matches = (value: unknown, policy: unknown): boolean => {\n if (typeof value === \"string\" && typeof policy === \"string\")\n return new RegExp(\n \"^\" +\n policy\n .split(\"*\")\n .map((v) => v.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"))\n .join(\".*\") +\n \"$\",\n ).test(value);\n if (Array.isArray(value))\n return Array.isArray(policy) && value.every((v) => policy.some((p) => matches(v, p)));\n if (\n value !== null &&\n typeof value === \"object\" &&\n policy !== null &&\n typeof policy === \"object\" &&\n !Array.isArray(policy)\n )\n return Object.entries(value).every(\n ([key, child]) =>\n Object.hasOwn(policy, key) && matches(child, (policy as Record<string, unknown>)[key]),\n );\n return value === policy;\n };\n if (!matches(actual, allowed)) throw new DeliveryError(\"archive_entitlements_not_authorized\", 5);\n}\n\nexport async function planUpload(\n builder: PlanBuilder,\n api: AppleGateway,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n runner: ProcessRunner,\n signal?: AbortSignal,\n): Promise<void> {\n const paths = await projectPaths(builder);\n const artifact = parseSchema(\n artifactSchema,\n await readJsonFile(path.join(paths.output, \"artifact.json\")),\n );\n if (\n artifact.bundleId !== builder.loaded.manifest.app.bundleId ||\n artifact.teamId !== credentials.account.teamId ||\n artifact.version !== builder.loaded.manifest.release?.version ||\n artifact.buildNumber !== builder.loaded.manifest.release?.buildNumber\n )\n throw new DeliveryError(\"archive_attestation_mismatch\", 4);\n if (\n (await realpath(artifact.ipaPath)) !== path.join(await realpath(paths.output), \"app.ipa\") ||\n fileDigest(await readFile(artifact.ipaPath)) !== artifact.sha256\n )\n throw new DeliveryError(\"archive_checksum_mismatch\", 4);\n await verifyArchive(artifact.ipaPath, builder, credentials, runner);\n await tools.preflight();\n const key = `upload.${artifact.sha256}`;\n const binding = builder.bindings[key];\n const accepted = binding?.type === \"acceptedUploads\" && binding.id === artifact.sha256;\n const existing = await selectedBuild(builder, api, true);\n if (existing && !accepted && (binding?.type !== \"builds\" || binding.id !== existing.id))\n throw new DeliveryError(\"existing_build_requires_upload_evidence\", 4);\n if (existing?.attributes.processingState === \"VALID\") {\n builder.satisfy(key, artifact);\n return;\n }\n builder.add(\n key,\n \"upload\",\n existing,\n artifact,\n [\"ipa\"],\n async () => {\n if (!accepted && !existing) {\n const result = await tools.run(\"upload\", {\n ipaPath: artifact.ipaPath,\n appId: builder.require(\"app\").id,\n });\n if (result.transportAccepted !== true)\n throw new DeliveryError(\"upload_transport_not_accepted\", 7);\n await builder.record(key, { type: \"acceptedUploads\", id: artifact.sha256 });\n }\n for (let attempt = 0; attempt < 30; attempt++) {\n const build = await selectedBuild(builder, api, true);\n if (build?.attributes.processingState === \"VALID\") return build;\n try {\n await systemClock.sleep(10_000, signal);\n } catch {\n throw new DeliveryError(\"build_processing_pending\", 7);\n }\n }\n throw new DeliveryError(\"build_processing_pending\", 7);\n },\n [],\n accepted || !!existing,\n );\n}\n","import path from \"node:path\";\nimport { realpath, lstat } from \"node:fs/promises\";\nimport { DeliveryError } from \"../contracts.js\";\nimport type { AppleCredentials } from \"../credentials.js\";\nimport type { AppleBuildTools } from \"../fastlane.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { canonical, fileDigest, resolveFile } from \"../manifest.js\";\nimport { validateImage } from \"./assets.js\";\n\nexport async function planNative(\n builder: PlanBuilder,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n): Promise<void> {\n const { build, app, assets, capabilities } = builder.loaded.manifest;\n if (!build?.infoPlistPath || !build.entitlementsPath || !build.iconSetPath)\n throw new DeliveryError(\"native_project_paths_required\", 2);\n await tools.preflight();\n const root = await realpath(path.resolve(builder.loaded.directory, build.projectRoot));\n const securePath = async (relative: string) => {\n const target = path.resolve(root, relative);\n if (!target.startsWith(root + path.sep)) throw new DeliveryError(\"native_path_outside_root\", 2);\n let parent = target;\n while (parent !== root) {\n try {\n await lstat(parent);\n const actual = await realpath(parent);\n if (!actual.startsWith(root + path.sep))\n throw new DeliveryError(\"native_path_outside_root\", 2);\n break;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n parent = path.dirname(parent);\n }\n return target;\n };\n const projectPath = await securePath(build.projectPath);\n const infoPlistPath = await securePath(build.infoPlistPath),\n entitlementsPath = await securePath(build.entitlementsPath),\n iconSetPath = await securePath(build.iconSetPath);\n const icons: { filename: string; source: string; luminosity?: string; sha256: string }[] = [];\n for (const [luminosity, name] of [\n [undefined, assets?.icon],\n [\"dark\", assets?.iconVariants?.dark],\n [\"tinted\", assets?.iconVariants?.tinted],\n ] as const) {\n if (!name) continue;\n validateImage(builder.loaded.files.get(name)!, true);\n icons.push({\n filename: luminosity ? `AppIcon-${luminosity}.png` : \"AppIcon.png\",\n luminosity,\n source: await resolveFile(builder.loaded.directory, name),\n sha256: fileDigest(builder.loaded.files.get(name)!),\n });\n }\n const parameters = {\n projectPath,\n targetName: build.targetName,\n infoPlistPath,\n entitlementsPath,\n iconSetPath,\n name: app.name,\n capabilities,\n icons,\n teamId: credentials.account.teamId,\n bundleId: app.bundleId,\n additionalTargets: build.additionalTargets,\n };\n const current = await tools.run(\"native\", { ...parameters, dryRun: true });\n if (current.matches === true) return;\n builder.add(\n \"native.project\",\n \"update\",\n current,\n parameters,\n [\"bundleId\", \"teamId\", \"displayName\", \"entitlements\", \"icons\"],\n async () => {\n const observed = await tools.run(\"native\", { ...parameters, dryRun: true });\n if (canonical(current) !== canonical(observed))\n throw new DeliveryError(\"native_project_changed\", 4);\n await tools.run(\"native\", { ...parameters, dryRun: false });\n const read = await tools.run(\"native\", { ...parameters, dryRun: true });\n if (read.matches !== true) throw new DeliveryError(\"native_project_readback_failed\", 5);\n return { type: \"nativeProjects\", id: app.bundleId };\n },\n );\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { findApp } from \"./identifiers.js\";\nimport { readCatalog } from \"./catalog.js\";\n\nconst publicFields = [\n \"name\",\n \"bundleId\",\n \"sku\",\n \"primaryLocale\",\n \"platform\",\n \"versionString\",\n \"version\",\n \"appStoreState\",\n \"state\",\n \"processingState\",\n \"expired\",\n \"releaseType\",\n \"earliestReleaseDate\",\n \"locale\",\n \"subtitle\",\n \"privacyPolicyUrl\",\n \"privacyChoicesUrl\",\n \"description\",\n \"keywords\",\n \"promotionalText\",\n \"whatsNew\",\n \"supportUrl\",\n \"marketingUrl\",\n \"copyright\",\n \"productId\",\n \"referenceName\",\n \"subscriptionPeriod\",\n \"groupLevel\",\n \"inAppPurchaseType\",\n \"familySharable\",\n \"fileName\",\n \"fileSize\",\n \"sourceFileChecksum\",\n \"assetDeliveryState\",\n];\n\n/** 公开资料使用允许字段投影,供应商新增字段不能自动进入导出。 */\nexport function publicResource(value: AppleResource): AppleResource {\n const attributes = Object.fromEntries(\n publicFields\n .filter((key) => Object.hasOwn(value.attributes, key) && key !== \"assetDeliveryState\")\n .map((key) => [key, value.attributes[key]]),\n );\n const delivery = value.attributes.assetDeliveryState;\n if (delivery && typeof delivery === \"object\" && \"state\" in delivery)\n attributes.assetDeliveryState = { state: delivery.state };\n return { type: value.type, id: value.id, attributes };\n}\n\nexport async function inspectDelivery(\n builder: PlanBuilder,\n api: AppleGateway,\n materials = false,\n): Promise<AppleResource[]> {\n const rows: AppleResource[] = [];\n const bundles = await api.list(\"/v1/bundleIds\", {\n \"filter[identifier]\": builder.loaded.manifest.app.bundleId,\n });\n for (const bundle of bundles) {\n rows.push({\n type: bundle.type,\n id: bundle.id,\n attributes: {\n identifier: bundle.attributes.identifier,\n platform: bundle.attributes.platform,\n },\n });\n for (const capability of await api.list(`/v1/bundleIds/${bundle.id}/bundleIdCapabilities`))\n rows.push({\n type: capability.type,\n id: capability.id,\n attributes: { capabilityType: capability.attributes.capabilityType },\n });\n }\n const app = await findApp(builder, api);\n if (!app) return rows;\n rows.push(publicResource(app));\n const versions = await api.list(`/v1/apps/${app.id}/appStoreVersions`, {\n \"filter[platform]\": \"IOS\",\n });\n for (const version of versions.filter(\n (v) =>\n !builder.loaded.manifest.release ||\n v.attributes.versionString === builder.loaded.manifest.release.version,\n )) {\n rows.push(publicResource(version));\n if (materials) {\n const locales = await api.list(\n `/v1/appStoreVersions/${version.id}/appStoreVersionLocalizations`,\n );\n for (const locale of locales) {\n rows.push({\n ...publicResource(locale),\n relationships: { appStoreVersion: { data: { type: version.type, id: version.id } } },\n });\n for (const [sets, assets] of [\n [\"appScreenshotSets\", \"appScreenshots\"],\n [\"appPreviewSets\", \"appPreviews\"],\n ]) {\n for (const set of await api.list(\n `/v1/appStoreVersionLocalizations/${locale.id}/${sets}`,\n )) {\n rows.push({\n type: set.type,\n id: set.id,\n attributes: {\n screenshotDisplayType: set.attributes.screenshotDisplayType,\n previewType: set.attributes.previewType,\n },\n relationships: { localization: { data: { type: locale.type, id: locale.id } } },\n });\n for (const asset of await api.list(`/v1/${sets}/${set.id}/${assets}`))\n rows.push({\n ...publicResource(asset),\n relationships: { set: { data: { type: set.type, id: set.id } } },\n });\n }\n }\n }\n }\n }\n if (materials)\n for (const info of await api.list(`/v1/apps/${app.id}/appInfos`)) {\n rows.push(publicResource(info));\n for (const locale of await api.list(`/v1/appInfos/${info.id}/appInfoLocalizations`))\n rows.push({\n ...publicResource(locale),\n relationships: { appInfo: { data: { type: info.type, id: info.id } } },\n });\n }\n for (const row of await api.list(\"/v1/builds\", {\n \"filter[app]\": app.id,\n ...(builder.loaded.manifest.release\n ? { \"filter[version]\": builder.loaded.manifest.release.buildNumber }\n : {}),\n }))\n rows.push(publicResource(row));\n for (const submission of await api.list(`/v1/apps/${app.id}/reviewSubmissions`))\n rows.push(publicResource(submission));\n for (const product of (await readCatalog(builder, api)).values())\n rows.push(publicResource(product));\n return rows;\n}\n\nexport async function runtimeHandoff(\n builder: PlanBuilder,\n api: AppleGateway,\n): Promise<Record<string, unknown>> {\n const resources = await inspectDelivery(builder, api);\n const { app, capabilities, catalog } = builder.loaded.manifest;\n return {\n schemaVersion: 1,\n bundleId: app.bundleId,\n appId: builder.resources.get(\"app\")?.id,\n resources,\n productIds: catalog?.items.map((v) => v.productId) ?? [],\n requiredRuntimeConfiguration: {\n ...(capabilities.signInWithApple\n ? {\n identity: {\n audience: app.bundleId,\n required: [\"teamId\", \"appleLoginKeyId\", \"appleLoginPrivateKeyRef\"],\n verified: false,\n },\n }\n : {}),\n ...(capabilities.pushNotifications\n ? {\n notifications: {\n topic: app.bundleId,\n required: [\"apnsKeyId\", \"apnsPrivateKeyRef\", \"teamId\", \"environment\"],\n verified: false,\n },\n }\n : {}),\n ...(capabilities.inAppPurchase\n ? {\n commerce: {\n bundleId: app.bundleId,\n required: [\n \"appId\",\n \"issuerId\",\n \"inAppPurchaseKeyId\",\n \"inAppPurchasePrivateKeyRef\",\n \"environment\",\n \"serverNotificationUrl\",\n ],\n verified: false,\n },\n }\n : {}),\n },\n manualRequirements: builder.requirements,\n };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { Command } from \"commander\";\n\nimport { generator as gtmGenerator } from \"../analytics/google-tag-manager.js\";\nimport { ArtifactError, GeneratorRegistry } from \"../analytics/registry.js\";\nimport { readJson } from \"../utils/fs.js\";\n\ninterface ProviderOptions {\n readonly provider: string;\n}\n\ninterface GenerateOptions extends ProviderOptions {\n readonly config: string;\n readonly out: string;\n readonly overwrite?: boolean;\n}\n\nconst registry = new GeneratorRegistry([gtmGenerator]);\n\nexport function registerAnalytics(program: Command): void {\n const analytics = program\n .command(\"analytics\")\n .description(\"Generate reviewed analytics provider configuration artifacts\");\n\n analytics\n .command(\"schema\")\n .description(\"Print the selected analytics provider configuration schema\")\n .requiredOption(\"--provider <provider>\", \"Analytics provider\")\n .action((options: ProviderOptions) =>\n runAnalyticsCommand(() => {\n process.stdout.write(\n `${JSON.stringify(registry.get(options.provider).schema(), null, 2)}\\n`,\n );\n }),\n );\n\n analytics\n .command(\"generate\")\n .description(\"Generate a provider configuration artifact without publishing it\")\n .requiredOption(\"--provider <provider>\", \"Analytics provider\")\n .requiredOption(\"--config <file>\", \"Product analytics configuration JSON\")\n .requiredOption(\"--out <file>\", \"Destination artifact\")\n .option(\"--overwrite\", \"Replace an existing destination\")\n .action((options: GenerateOptions) => runAnalyticsCommand(() => generateArtifact(options)));\n}\n\nasync function generateArtifact(options: GenerateOptions): Promise<void> {\n const generator = registry.get(options.provider);\n const input = await readJson<unknown>(path.resolve(options.config));\n if (input === null) {\n throw new ArtifactError(\n \"configuration_unreadable\",\n \"Analytics configuration must be a readable JSON file\",\n );\n }\n const artifact = generator.generate(input);\n const destination = path.resolve(options.out);\n await writeArtifact(destination, artifact.contents, options.overwrite === true);\n process.stdout.write(\n `${JSON.stringify({\n schemaVersion: 1,\n outcome: \"generated\",\n provider: options.provider,\n artifact: destination,\n resources: artifact.resourceCounts,\n published: false,\n })}\\n`,\n );\n}\n\nasync function writeArtifact(destination: string, contents: string, overwrite: boolean) {\n await mkdir(path.dirname(destination), { recursive: true });\n if (!overwrite) {\n try {\n await writeFile(destination, contents, { flag: \"wx\" });\n return;\n } catch (error) {\n if (isFileExistsError(error)) {\n throw new ArtifactError(\n \"artifact_exists\",\n \"Analytics artifact already exists; pass --overwrite to replace it\",\n );\n }\n throw error;\n }\n }\n const temporary = `${destination}.${process.pid}.${randomUUID()}.tmp`;\n let created = false;\n try {\n await writeFile(temporary, contents, { flag: \"wx\" });\n created = true;\n await rename(temporary, destination);\n created = false;\n } finally {\n if (created) {\n await rm(temporary, { force: true });\n }\n }\n}\n\nasync function runAnalyticsCommand(operation: () => void | Promise<void>): Promise<void> {\n try {\n await operation();\n } catch (error) {\n const failure =\n error instanceof ArtifactError\n ? error\n : new ArtifactError(\"analytics_command_failed\", \"Analytics command failed\");\n process.stderr.write(\n `${JSON.stringify({ schemaVersion: 1, outcome: \"failed\", code: failure.code })}\\n`,\n );\n process.exitCode = 2;\n }\n}\n\nfunction isFileExistsError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === \"EEXIST\";\n}\n","import {\n createGTMContainer,\n getGTMContainerConfigJsonSchema,\n} from \"@stackonward/google-tag-manager/container\";\n\nimport { ArtifactError, type Generator } from \"./registry.js\";\n\nexport const generator: Generator = {\n id: \"google-tag-manager\",\n schema: getGTMContainerConfigJsonSchema,\n generate(input) {\n try {\n const container = createGTMContainer(input);\n return {\n contents: `${JSON.stringify(container, null, 2)}\\n`,\n resourceCounts: Object.freeze({\n tags: container.containerVersion.tag.length,\n triggers: container.containerVersion.trigger.length,\n variables: container.containerVersion.variable.length,\n }),\n };\n } catch (error) {\n if (error instanceof Error && error.name === \"ZodError\") {\n throw new ArtifactError(\n \"invalid_configuration\",\n \"Analytics provider configuration is invalid\",\n );\n }\n throw error;\n }\n },\n};\n","export interface Artifact {\n readonly contents: string;\n readonly resourceCounts: Readonly<Record<string, number>>;\n}\n\nexport interface Generator {\n readonly id: string;\n schema(): object;\n generate(input: unknown): Artifact;\n}\n\nexport class ArtifactError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = \"ArtifactError\";\n this.code = code;\n }\n}\n\nexport class GeneratorRegistry {\n readonly #generators = new Map<string, Generator>();\n\n constructor(generators: readonly Generator[]) {\n for (const generator of generators) {\n if (this.#generators.has(generator.id)) {\n throw new ArtifactError(\n \"duplicate_provider\",\n `Analytics provider is registered more than once: ${generator.id}`,\n );\n }\n this.#generators.set(generator.id, generator);\n }\n }\n\n get(provider: string): Generator {\n const generator = this.#generators.get(provider);\n if (!generator) {\n throw new ArtifactError(\"unknown_provider\", `Unknown analytics provider: ${provider}`);\n }\n return generator;\n }\n}\n","import { z } from \"zod\";\n\nimport { CompatibilityError } from \"../../deploy/compatibility.js\";\nimport { ConfigError } from \"../../deploy/config.js\";\nimport { createProcessRunner } from \"../../deploy/process.js\";\nimport { CoordinatorError } from \"../../deploy/release.js\";\nimport { ProvisionError } from \"../../provision/contracts.js\";\nimport { CommandError, type CommandResult, type Scope } from \"./contracts.js\";\n\nconst SAFE_CODE = /^[a-z][a-z0-9_-]{0,127}$/u;\n\ninterface FailureOutput {\n readonly schemaVersion: 1;\n readonly outcome: \"cancelled\" | \"failed\" | \"unknown\";\n readonly code: string;\n readonly field?: string;\n readonly constraint?: string;\n readonly category?: string;\n readonly phase?: string;\n readonly effect?: string;\n readonly retryable?: boolean;\n}\n\ninterface CommandFailure {\n readonly output: FailureOutput;\n readonly exitCode: number;\n}\n\nexport async function guarded(operation: (scope: Scope) => Promise<CommandResult>): Promise<void> {\n const controller = new AbortController();\n const cancel = (): void => controller.abort();\n process.once(\"SIGINT\", cancel);\n process.once(\"SIGTERM\", cancel);\n const runner = createProcessRunner(controller.signal);\n const scope: Scope = { env: readProcessEnv(), runner, signal: controller.signal };\n\n let output: CommandResult | undefined;\n let operationError: unknown;\n try {\n output = await operation(scope);\n } catch (error) {\n operationError = error;\n }\n\n const cleanup = await runner.dispose();\n process.off(\"SIGINT\", cancel);\n process.off(\"SIGTERM\", cancel);\n if (cleanup.status === \"failed\" && operationError === undefined)\n operationError = new CommandError(\"process_cleanup_failed\", 5);\n\n if (operationError !== undefined) {\n const failure = normalize(operationError, controller.signal);\n process.stderr.write(`${JSON.stringify(failure.output)}\\n`);\n process.exitCode = failure.exitCode;\n return;\n }\n if (!output) {\n const failure = normalize(new CommandError(\"deploy_command_failed\", 5), controller.signal);\n process.stderr.write(`${JSON.stringify(failure.output)}\\n`);\n process.exitCode = failure.exitCode;\n return;\n }\n process.stdout.write(`${JSON.stringify(output.output)}\\n`);\n if (output.exitCode !== 0) process.exitCode = output.exitCode;\n}\n\nfunction normalize(error: unknown, signal: AbortSignal): CommandFailure {\n if (error instanceof ProvisionError) {\n return {\n output: {\n schemaVersion: 1,\n outcome: error.exitCode === 130 ? \"cancelled\" : error.exitCode === 7 ? \"unknown\" : \"failed\",\n code: error.code,\n ...(error.field === undefined ? {} : { field: error.field }),\n },\n exitCode: error.exitCode,\n };\n }\n if (error instanceof CoordinatorError) {\n const failure = error.failure;\n return {\n output: {\n schemaVersion: 1,\n outcome: failure.effect === \"unknown\" ? \"unknown\" : \"failed\",\n code: failure.category,\n category: failure.category,\n phase: failure.phase,\n effect: failure.effect,\n retryable: failure.retryable,\n },\n exitCode: failure.effect === \"unknown\" ? 7 : 5,\n };\n }\n const details = errorDetails(error);\n if (details.effect === \"unknown\") {\n return {\n output: {\n schemaVersion: 1,\n outcome: \"unknown\",\n code: details.code,\n ...(details.category === undefined ? {} : { category: details.category }),\n ...(details.phase === undefined ? {} : { phase: details.phase }),\n effect: \"unknown\",\n ...(details.retryable === undefined ? {} : { retryable: details.retryable }),\n },\n exitCode: 7,\n };\n }\n if (signal.aborted)\n return { output: { schemaVersion: 1, outcome: \"cancelled\", code: \"cancelled\" }, exitCode: 130 };\n if (error instanceof CommandError) {\n return {\n output: {\n schemaVersion: 1,\n outcome: \"failed\",\n code: error.code,\n ...(error.field === undefined ? {} : { field: error.field }),\n ...(error.constraint === undefined ? {} : { constraint: error.constraint }),\n },\n exitCode: error.exitCode,\n };\n }\n if (error instanceof ConfigError) {\n return {\n output: {\n schemaVersion: 1,\n outcome: \"failed\",\n code: error.code,\n field: \"environment\",\n constraint: error.code,\n },\n exitCode: 2,\n };\n }\n if (error instanceof CompatibilityError) {\n return {\n output: {\n schemaVersion: 1,\n outcome: \"failed\",\n code: error.code,\n field: \"config\",\n constraint: error.code,\n },\n exitCode: 2,\n };\n }\n if (error instanceof z.ZodError) {\n const issue = error.issues[0];\n return {\n output: {\n schemaVersion: 1,\n outcome: \"failed\",\n code: \"validation_failed\",\n field: issue?.path.map(String).join(\".\") || \"input\",\n constraint: issue?.code ?? \"invalid\",\n },\n exitCode: 2,\n };\n }\n return {\n output: {\n schemaVersion: 1,\n outcome: \"failed\",\n code: details.code,\n ...(details.category === undefined ? {} : { category: details.category }),\n ...(details.phase === undefined ? {} : { phase: details.phase }),\n ...(details.effect === undefined ? {} : { effect: details.effect }),\n ...(details.retryable === undefined ? {} : { retryable: details.retryable }),\n },\n exitCode: 5,\n };\n}\n\nfunction errorDetails(error: unknown): {\n readonly code: string;\n readonly category?: string;\n readonly phase?: string;\n readonly effect?: string;\n readonly retryable?: boolean;\n} {\n if (!isRecord(error)) return { code: \"deploy_command_failed\" };\n return {\n code:\n typeof error.code === \"string\" && SAFE_CODE.test(error.code)\n ? error.code\n : \"deploy_command_failed\",\n ...(typeof error.category === \"string\" && SAFE_CODE.test(error.category)\n ? { category: error.category }\n : {}),\n ...(typeof error.phase === \"string\" && SAFE_CODE.test(error.phase)\n ? { phase: error.phase }\n : {}),\n ...(typeof error.effect === \"string\" && SAFE_CODE.test(error.effect)\n ? { effect: error.effect }\n : {}),\n ...(typeof error.retryable === \"boolean\" ? { retryable: error.retryable } : {}),\n };\n}\n\nfunction readProcessEnv(): Readonly<Record<string, string>> {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(process.env).filter(\n (entry): entry is [string, string] => entry[1] !== undefined,\n ),\n ),\n );\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { spawn, spawnSync } from \"node:child_process\";\n\nimport { execa } from \"execa\";\n\nimport type { Command } from \"./config.js\";\n\nconst DEFAULT_MAX_OUTPUT_BYTES = 4 * 1024 * 1024;\nconst MAX_TIMEOUT_MS = 2_147_483_647;\nconst TERMINATION_GRACE_MS = 5_000;\nconst TERMINATION_POLL_MS = 25;\nconst REDACTION_MARKER = \"[REDACTED]\";\nconst SENSITIVE_ENVIRONMENT_NAME =\n /(?:password|token|secret|private[_-]?key|(?:^|[_-])key(?:[_-]|$)|authorization|cookie|credential)/iu;\n\nexport type ProcessFailureReason =\n | \"cancelled\"\n | \"cleanup\"\n | \"disposed\"\n | \"exit\"\n | \"invalid-options\"\n | \"output-limit\"\n | \"signal\"\n | \"spawn\"\n | \"timeout\";\n\nexport type ProcessCleanupStatus = \"not-required\" | \"succeeded\" | \"failed\";\n\nexport interface ProcessOptions {\n cwd: string;\n env: Readonly<Record<string, string>>;\n timeoutMs: number;\n input?: string;\n maxOutputBytes?: number;\n redactions?: readonly string[];\n signal?: AbortSignal;\n}\n\nexport interface ProcessSuccess {\n status: \"succeeded\";\n dispatched: true;\n exitCode: 0;\n stdout: string;\n stderr: string;\n durationMs: number;\n cleanup: ProcessCleanupStatus;\n}\n\nexport interface ProcessFailure {\n status: \"failed\";\n reason: ProcessFailureReason;\n dispatched: boolean;\n exitCode?: number;\n signal?: NodeJS.Signals;\n stdout: string;\n stderr: string;\n durationMs: number;\n cleanup: ProcessCleanupStatus;\n}\n\nexport type ProcessOutcome = ProcessSuccess | ProcessFailure;\n\nexport interface ProcessCleanup {\n status: \"succeeded\" | \"failed\";\n processCount: number;\n}\n\nexport interface ProcessRunner {\n run(command: Command, options: ProcessOptions): Promise<ProcessOutcome>;\n dispose(): Promise<ProcessCleanup>;\n}\n\ntype StopReason = \"cancelled\" | \"disposed\" | \"timeout\";\n\ninterface ActiveProcess {\n pid: number;\n done: Promise<void>;\n requestStop(reason: StopReason): Promise<ProcessCleanupStatus>;\n}\n\ninterface Diagnostics {\n stdout: string;\n stderr: string;\n}\n\n/** 部署进程由一次 CLI 调用独占,销毁端口会等待其完整进程树退出。 */\nexport function createProcessRunner(defaultSignal?: AbortSignal): ProcessRunner {\n const activeProcesses = new Set<ActiveProcess>();\n let disposed = false;\n let exitCleanupRegistered = false;\n\n const cleanupAtExit = (): void => {\n for (const activeProcess of activeProcesses) {\n terminateProcessTreeImmediately(activeProcess.pid);\n }\n };\n\n const registerActiveProcess = (activeProcess: ActiveProcess): void => {\n activeProcesses.add(activeProcess);\n if (exitCleanupRegistered) return;\n process.once(\"exit\", cleanupAtExit);\n exitCleanupRegistered = true;\n };\n\n const unregisterActiveProcess = (activeProcess: ActiveProcess): void => {\n activeProcesses.delete(activeProcess);\n if (activeProcesses.size > 0 || !exitCleanupRegistered) return;\n process.removeListener(\"exit\", cleanupAtExit);\n exitCleanupRegistered = false;\n };\n\n return {\n async run(command, options) {\n const startedAt = Date.now();\n const maxOutputBytes = options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;\n if (!validOptions(options, maxOutputBytes)) {\n return failure(\"invalid-options\", false, startedAt, \"not-required\");\n }\n if (disposed) {\n return failure(\"disposed\", false, startedAt, \"not-required\");\n }\n\n const cancellationSignals = uniqueSignals(defaultSignal, options.signal);\n if (cancellationSignals.some((signal) => signal.aborted)) {\n return failure(\"cancelled\", false, startedAt, \"not-required\");\n }\n\n const redactions = collectRedactions(options);\n let child;\n try {\n child = execa(command.executable, [...command.args], {\n cwd: options.cwd,\n env: { ...options.env },\n extendEnv: false,\n shell: false,\n detached: process.platform !== \"win32\",\n cleanup: false,\n reject: false,\n stdout: \"pipe\",\n stderr: \"pipe\",\n maxBuffer: maxOutputBytes,\n windowsHide: true,\n ...(options.input === undefined ? { stdin: \"ignore\" } : { input: options.input }),\n });\n } catch {\n return failure(\"spawn\", false, startedAt, \"not-required\");\n }\n\n const pid = child.pid;\n if (pid === undefined) {\n await child.catch(() => undefined);\n return failure(\"spawn\", false, startedAt, \"not-required\");\n }\n\n let stopReason: StopReason | undefined;\n let termination: Promise<ProcessCleanupStatus> | undefined;\n let resolveDone!: () => void;\n const done = new Promise<void>((resolve) => {\n resolveDone = resolve;\n });\n const requestStop = (reason: StopReason): Promise<ProcessCleanupStatus> => {\n stopReason ??= reason;\n termination ??= terminateProcessTree(pid);\n return termination;\n };\n const activeProcess: ActiveProcess = { pid, done, requestStop };\n registerActiveProcess(activeProcess);\n\n const abort = (): void => {\n void requestStop(\"cancelled\");\n };\n for (const signal of cancellationSignals) {\n signal.addEventListener(\"abort\", abort, { once: true });\n }\n if (cancellationSignals.some((signal) => signal.aborted)) {\n void requestStop(\"cancelled\");\n }\n const timeout = setTimeout(() => {\n void requestStop(\"timeout\");\n }, options.timeoutMs);\n\n try {\n const result = await child;\n clearTimeout(timeout);\n for (const signal of cancellationSignals) {\n signal.removeEventListener(\"abort\", abort);\n }\n\n const requestedCleanup = termination === undefined ? undefined : await termination;\n const cleanup = requestedCleanup ?? (await cleanupResidualProcessTree(pid));\n const diagnostics = sanitizeDiagnostics(\n result.stdout,\n result.stderr,\n redactions,\n maxOutputBytes,\n );\n\n if (stopReason !== undefined) {\n return failure(\n stopReason,\n true,\n startedAt,\n cleanup,\n diagnostics,\n result.exitCode,\n result.signal,\n );\n }\n if (cleanup === \"failed\") {\n return failure(\n \"cleanup\",\n true,\n startedAt,\n cleanup,\n diagnostics,\n result.exitCode,\n result.signal,\n );\n }\n if (result.isMaxBuffer) {\n return failure(\n \"output-limit\",\n true,\n startedAt,\n cleanup,\n diagnostics,\n result.exitCode,\n result.signal,\n );\n }\n if (result.signal !== undefined || result.isTerminated) {\n return failure(\n \"signal\",\n true,\n startedAt,\n cleanup,\n diagnostics,\n result.exitCode,\n result.signal,\n );\n }\n if (result.exitCode !== undefined && result.exitCode !== 0) {\n return failure(\"exit\", true, startedAt, cleanup, diagnostics, result.exitCode);\n }\n if (result.failed) {\n return failure(\"spawn\", true, startedAt, cleanup, diagnostics);\n }\n\n return {\n status: \"succeeded\",\n dispatched: true,\n exitCode: 0,\n ...diagnostics,\n durationMs: Date.now() - startedAt,\n cleanup,\n };\n } catch {\n clearTimeout(timeout);\n const reason = stopReason ?? \"spawn\";\n const cleanup =\n stopReason === undefined\n ? await terminateProcessTree(pid)\n : await requestStop(stopReason);\n return failure(reason, true, startedAt, cleanup);\n } finally {\n clearTimeout(timeout);\n for (const signal of cancellationSignals) {\n signal.removeEventListener(\"abort\", abort);\n }\n unregisterActiveProcess(activeProcess);\n resolveDone();\n }\n },\n\n async dispose() {\n disposed = true;\n const processes = [...activeProcesses];\n const cleanups = await Promise.all(\n processes.map(async (activeProcess) => {\n const cleanup = await activeProcess.requestStop(\"disposed\");\n await activeProcess.done;\n return cleanup;\n }),\n );\n return {\n status: cleanups.some((cleanup) => cleanup === \"failed\") ? \"failed\" : \"succeeded\",\n processCount: processes.length,\n };\n },\n };\n}\n\nfunction validOptions(options: ProcessOptions, maxOutputBytes: number): boolean {\n if (\n !Number.isSafeInteger(options.timeoutMs) ||\n options.timeoutMs <= 0 ||\n options.timeoutMs > MAX_TIMEOUT_MS\n ) {\n return false;\n }\n if (\n !Number.isSafeInteger(maxOutputBytes) ||\n maxOutputBytes <= 0 ||\n maxOutputBytes > DEFAULT_MAX_OUTPUT_BYTES\n ) {\n return false;\n }\n if (options.cwd.length === 0 || options.cwd.includes(\"\\0\")) return false;\n return Object.entries(options.env).every(\n ([name, value]) =>\n name.length > 0 && !name.includes(\"=\") && !name.includes(\"\\0\") && !value.includes(\"\\0\"),\n );\n}\n\nfunction uniqueSignals(...signals: Array<AbortSignal | undefined>): AbortSignal[] {\n return [...new Set(signals.filter((signal): signal is AbortSignal => signal !== undefined))];\n}\n\nfunction collectRedactions(options: ProcessOptions): string[] {\n const candidates = [...(options.redactions ?? [])];\n if (options.input !== undefined) {\n candidates.push(options.input, options.input.replace(/\\r?\\n$/u, \"\"));\n }\n for (const [name, value] of Object.entries(options.env)) {\n if (SENSITIVE_ENVIRONMENT_NAME.test(name)) candidates.push(value);\n }\n return [...new Set(candidates.filter((value) => value.length > 0))].sort(\n (left, right) => right.length - left.length,\n );\n}\n\nfunction sanitizeDiagnostics(\n stdout: unknown,\n stderr: unknown,\n redactions: readonly string[],\n maxOutputBytes: number,\n): Diagnostics {\n return {\n stdout: boundUtf8(redact(typeof stdout === \"string\" ? stdout : \"\", redactions), maxOutputBytes),\n stderr: boundUtf8(redact(typeof stderr === \"string\" ? stderr : \"\", redactions), maxOutputBytes),\n };\n}\n\nfunction redact(value: string, redactions: readonly string[]): string {\n return redactions.reduce(\n (sanitized, secret) => sanitized.split(secret).join(REDACTION_MARKER),\n value,\n );\n}\n\nfunction boundUtf8(value: string, maxBytes: number): string {\n const encoded = Buffer.from(value);\n if (encoded.byteLength <= maxBytes) return value;\n return encoded\n .subarray(0, maxBytes)\n .toString(\"utf8\")\n .replace(/\\uFFFD$/u, \"\");\n}\n\nfunction failure(\n reason: ProcessFailureReason,\n dispatched: boolean,\n startedAt: number,\n cleanup: ProcessCleanupStatus,\n diagnostics: Diagnostics = { stdout: \"\", stderr: \"\" },\n exitCode?: number,\n signal?: NodeJS.Signals,\n): ProcessFailure {\n return {\n status: \"failed\",\n reason,\n dispatched,\n ...(exitCode === undefined ? {} : { exitCode }),\n ...(signal === undefined ? {} : { signal }),\n ...diagnostics,\n durationMs: Date.now() - startedAt,\n cleanup,\n };\n}\n\nasync function cleanupResidualProcessTree(pid: number): Promise<ProcessCleanupStatus> {\n if (process.platform === \"win32\" || !processTreeExists(pid)) return \"not-required\";\n return terminateProcessTree(pid);\n}\n\nasync function terminateProcessTree(pid: number): Promise<ProcessCleanupStatus> {\n if (!processTreeExists(pid)) return \"succeeded\";\n if (process.platform === \"win32\") return terminateWindowsProcessTree(pid);\n\n sendPosixProcessGroupSignal(pid, \"SIGTERM\");\n if (await waitForProcessTreeExit(pid, TERMINATION_GRACE_MS)) return \"succeeded\";\n sendPosixProcessGroupSignal(pid, \"SIGKILL\");\n return (await waitForProcessTreeExit(pid, TERMINATION_GRACE_MS)) ? \"succeeded\" : \"failed\";\n}\n\nasync function terminateWindowsProcessTree(pid: number): Promise<ProcessCleanupStatus> {\n const graceful = await runTaskkill(pid, false);\n if (graceful && (await waitForProcessTreeExit(pid, TERMINATION_GRACE_MS))) return \"succeeded\";\n const forced = await runTaskkill(pid, true);\n if (!forced) return processTreeExists(pid) ? \"failed\" : \"succeeded\";\n return (await waitForProcessTreeExit(pid, TERMINATION_GRACE_MS)) ? \"succeeded\" : \"failed\";\n}\n\nfunction runTaskkill(pid: number, force: boolean): Promise<boolean> {\n const args = [\"/pid\", String(pid), \"/t\", ...(force ? [\"/f\"] : [])];\n return new Promise((resolve) => {\n const taskkill = spawn(\"taskkill\", args, {\n stdio: \"ignore\",\n windowsHide: true,\n });\n taskkill.once(\"error\", () => resolve(false));\n taskkill.once(\"exit\", (code) => resolve(code === 0));\n });\n}\n\nfunction processTreeExists(pid: number): boolean {\n try {\n process.kill(process.platform === \"win32\" ? pid : -pid, 0);\n return true;\n } catch (error) {\n return isNodeError(error) && error.code === \"EPERM\";\n }\n}\n\nfunction sendPosixProcessGroupSignal(pid: number, signal: NodeJS.Signals): boolean {\n try {\n process.kill(-pid, signal);\n return true;\n } catch (error) {\n return isNodeError(error) && error.code === \"ESRCH\";\n }\n}\n\nasync function waitForProcessTreeExit(pid: number, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (processTreeExists(pid)) {\n if (Date.now() >= deadline) return false;\n await new Promise<void>((resolve) => setTimeout(resolve, TERMINATION_POLL_MS));\n }\n return true;\n}\n\nfunction terminateProcessTreeImmediately(pid: number): void {\n if (process.platform === \"win32\") {\n spawnSync(\"taskkill\", [\"/pid\", String(pid), \"/t\", \"/f\"], {\n stdio: \"ignore\",\n windowsHide: true,\n });\n return;\n }\n sendPosixProcessGroupSignal(pid, \"SIGKILL\");\n}\n\nfunction isNodeError(value: unknown): value is NodeJS.ErrnoException {\n return value instanceof Error;\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport {\n createNoMigrationObservation,\n createNoMigrationResult,\n LifecycleError,\n type LifecycleObservation,\n type LifecyclePort,\n} from \"./lifecycle.js\";\nimport {\n assertArtifact,\n createPublishedArtifact,\n parsePublishedArtifact,\n type Plan,\n type ReleasePlan,\n} from \"./plan.js\";\nimport type { ProcessOptions } from \"./process.js\";\nimport {\n parseBuildResult,\n type BuildContext,\n type BuildResult,\n type ProfileAdapter,\n} from \"./profile.js\";\nimport {\n compatibilityResultSchema,\n createPublishedStackIdentity,\n failureSchema,\n migrationResultSchema,\n publishedReceiptSchema,\n reconciliationResultSchema,\n releaseReceiptSchema,\n transitionSchema,\n type AttemptState,\n type CompatibilityResult,\n type Failure,\n type MigrationResult,\n type PublishedArtifact,\n type PublishedReceipt,\n type PublishedWorkload,\n type ReconciliationResult,\n type ReleaseReceipt,\n type Transition,\n} from \"./receipt.js\";\nimport type { HealthResult, RecoveryOutcome, RolloutAdapter } from \"./rollout.js\";\nimport { effectIntentSchema, type Session as StateSession, type Store } from \"./safety.js\";\nimport {\n releaseIdentitySchema,\n type ObservedRelease,\n type ReleaseIdentity,\n type StagedRelease,\n type TargetAdapter,\n} from \"./target.js\";\nimport { RegistryError, type RegistryOptions, type RegistryPort } from \"./transport/registry.js\";\n\ntype Clock = () => Date;\ntype IdFactory = () => string;\n\nexport interface RegistryBinding {\n readonly port: RegistryPort;\n readonly options: RegistryOptions;\n}\n\nexport interface PublishContext {\n readonly build: BuildContext;\n readonly registry?: RegistryBinding;\n readonly attemptId?: string;\n readonly now?: Clock;\n}\n\nexport interface Publication {\n readonly artifact: PublishedArtifact;\n readonly receipt: PublishedReceipt;\n}\n\nexport interface Runtime {\n readonly target: TargetAdapter;\n readonly rollout: RolloutAdapter;\n readonly lifecycle: LifecyclePort;\n readonly store: Store;\n}\n\nexport interface RuntimeContext {\n readonly artifactRoot: string;\n readonly process: ProcessOptions;\n readonly protectedReleases?: readonly ReleaseIdentity[];\n readonly attemptId?: string;\n readonly signal?: AbortSignal;\n readonly now?: Clock;\n}\n\nexport interface VerifyContext {\n readonly attemptId?: string;\n readonly signal?: AbortSignal;\n readonly checkedAt?: string;\n readonly now?: Clock;\n}\n\nexport interface ReconcileContext extends VerifyContext {\n readonly process: ProcessOptions;\n}\n\nexport class CoordinatorError extends Error {\n constructor(\n readonly failure: Failure,\n options?: ErrorOptions,\n ) {\n super(failure.message, options);\n this.name = \"DeploymentCoordinatorError\";\n }\n}\n\ninterface Attempt {\n readonly id: string;\n readonly history: History;\n readonly signal?: AbortSignal;\n}\n\ninterface ReceiptFields {\n readonly previous?: ReleaseIdentity;\n readonly activated?: ReleaseIdentity;\n readonly migration?: MigrationResult;\n readonly rollbackCompatibility?: CompatibilityResult;\n readonly reconciliation?: ReconciliationResult;\n}\n\n/** 构建协调只绑定计划与适配器输出,制品生产细节保留在具体 profile。 */\nexport async function build(\n plan: ReleasePlan,\n adapter: ProfileAdapter,\n context: BuildContext,\n): Promise<BuildResult> {\n if (adapter.id !== plan.config.profile) {\n throw coordinatorError(\n \"config\",\n \"validated\",\n \"none\",\n \"Profile adapter does not match the execution plan\",\n );\n }\n assertActive(context.signal, \"source\", \"validated\");\n const result = await adapter.build(plan, context);\n return parseBuildResult(plan, context, result);\n}\n\n/** 发布协调重新验证本地结果,并只接受注册表实际观察到的不可变摘要。 */\nexport async function publish(\n plan: ReleasePlan,\n input: BuildResult,\n context: PublishContext,\n): Promise<Publication> {\n const attempt = createAttempt(context.attemptId, context.now);\n attempt.history.advance(\"validated\");\n assertActive(context.build.signal, \"artifact\", \"validated\");\n const result = await parseBuildResult(plan, context.build, input);\n const artifact = await publishArtifact(plan, result, context.registry);\n attempt.history.advance(\"published\");\n attempt.history.advance(\"publish-completed\");\n const receipt = publishedReceiptSchema.parse({\n schemaVersion: 1,\n attemptId: attempt.id,\n environment: plan.environmentName,\n revision: plan.revision,\n artifact,\n transitions: attempt.history.values(),\n state: \"publish-completed\",\n });\n return Object.freeze({ artifact, receipt });\n}\n\n/** 运行时发布在调用方持有的单一目标会话内串行执行所有生命周期效果。 */\nexport async function release(\n plan: ReleasePlan,\n input: unknown,\n runtime: Runtime,\n context: RuntimeContext,\n): Promise<ReleaseReceipt> {\n const artifact = runtimeArtifact(plan, input, runtime);\n const attempt = createAttempt(context.attemptId, context.now, context.signal);\n attempt.history.advance(\"validated\");\n return runtime.store.withLock((state) =>\n releaseLocked(plan, artifact, runtime, context, attempt, state),\n );\n}\n\n/** 精确验证只消费目标 owner 恢复的 release record,不重建激活时间。 */\nexport async function verify(\n plan: Plan,\n releaseIdInput: ReleaseIdentity,\n runtime: Runtime,\n context: VerifyContext = {},\n): Promise<HealthResult> {\n requireRuntime(plan, runtime);\n const releaseId = releaseIdentitySchema.parse(releaseIdInput);\n const attempt = createAttempt(context.attemptId, context.now, context.signal);\n return runtime.store.withLock(async (state) => {\n await state.load();\n assertActive(attempt.signal, \"health\", \"activated\");\n const release = await runtime.target.readRelease(plan, releaseId, {\n attemptId: attempt.id,\n ...(attempt.signal === undefined ? {} : { signal: attempt.signal }),\n });\n return runtime.rollout.verify(plan, release, {\n attemptId: attempt.id,\n checkedAt: context.checkedAt ?? attempt.history.instant(),\n ...(attempt.signal === undefined ? {} : { signal: attempt.signal }),\n });\n });\n}\n\n/** 回滚始终解析一个精确 retained identity,并在切换前验证当前迁移账本兼容性。 */\nexport async function rollback(\n plan: Plan,\n releaseIdInput: ReleaseIdentity | undefined,\n runtime: Runtime,\n context: RuntimeContext,\n): Promise<ReleaseReceipt> {\n requireRuntime(plan, runtime);\n const requested =\n releaseIdInput === undefined ? undefined : releaseIdentitySchema.parse(releaseIdInput);\n const attempt = createAttempt(context.attemptId, context.now, context.signal);\n attempt.history.advance(\"validated\");\n\n return runtime.store.withLock(async (state) => {\n await requireSafe(state);\n let observation;\n try {\n observation = await runtime.target.observe(plan, operationContext(attempt));\n } catch (error) {\n throw new CoordinatorError(normalize(error, \"rollback\", \"validated\"), { cause: error });\n }\n const current = observation.current;\n const selected = requested ?? observation.previous?.releaseId;\n if (!current || !selected || selected === current.releaseId) {\n throw coordinatorError(\n \"rollback\",\n \"validated\",\n \"none\",\n \"Rollback requires distinct current and retained release identities\",\n );\n }\n let candidate: ObservedRelease;\n try {\n candidate = await runtime.target.readRelease(plan, selected, operationContext(attempt));\n } catch (error) {\n const failure = normalize(error, \"rollback\", \"validated\");\n return failed(state, plan, current.artifact, attempt, failure, {}, \"failed\");\n }\n attempt.history.advance(\"rollback-pending\");\n const requestedFailure = failureOf(\n \"rollback\",\n \"rollback-pending\",\n \"none\",\n \"Rollback was requested\",\n );\n return recover(\n plan,\n runtime,\n context,\n attempt,\n state,\n current,\n candidate,\n candidate.artifact,\n requestedFailure,\n {},\n );\n });\n}\n\n/** 对账只用严格目标观察、rollout 公共验证和产品账本观察清除 blocked 状态。 */\nexport async function reconcile(\n plan: Plan,\n runtime: Runtime,\n context: ReconcileContext,\n): Promise<ReconciliationResult> {\n requireRuntime(plan, runtime);\n const attempt = createAttempt(context.attemptId, context.now, context.signal);\n return runtime.store.withLock(async (state) => {\n const safety = await state.load();\n assertActive(attempt.signal, \"reconciliation\", \"effect-unknown\");\n const lifecycle = await observeLifecycle(\n plan,\n runtime,\n processOptions(context.process, attempt.signal),\n );\n const target = await runtime.target.observe(plan, operationContext(attempt));\n const current = target.current;\n let healthy = true;\n\n if (current) {\n const health = await runtime.rollout.verify(plan, current, {\n attemptId: attempt.id,\n checkedAt: context.checkedAt ?? attempt.history.instant(),\n ...(attempt.signal === undefined ? {} : { signal: attempt.signal }),\n });\n healthy = health.status === \"healthy\" && health.releaseId === current.releaseId;\n }\n\n const pendingRequiresCurrent =\n safety.pending !== undefined &&\n new Set<AttemptState>([\n \"activation-prepared\",\n \"healthy\",\n \"retaining\",\n \"rollback-pending\",\n ]).has(safety.pending.phase);\n const pendingMatches =\n safety.pending === undefined ||\n !pendingRequiresCurrent ||\n current?.artifact.identity === safety.pending.artifact;\n const safe =\n lifecycle.status === \"clean\" &&\n healthy &&\n pendingMatches &&\n (!pendingRequiresCurrent || current);\n const result = reconciliationResultSchema.parse(\n safe\n ? {\n schemaVersion: 1,\n status: \"safe\",\n ...(current\n ? { observedRelease: current.releaseId, observedRoute: current.releaseId }\n : {}),\n ...(lifecycle.migrationLedger === undefined\n ? {}\n : { migrationLedger: lifecycle.migrationLedger }),\n }\n : {\n schemaVersion: 1,\n status: \"blocked\",\n ...(current\n ? { observedRelease: current.releaseId, observedRoute: current.releaseId }\n : {}),\n ...(lifecycle.migrationLedger === undefined\n ? {}\n : { migrationLedger: lifecycle.migrationLedger }),\n reason: reconciliationReason(\n lifecycle,\n healthy,\n pendingMatches,\n pendingRequiresCurrent,\n current,\n ),\n },\n );\n assertActive(attempt.signal, \"reconciliation\", \"effect-unknown\");\n await state.reconcile({\n attemptId: attempt.id,\n pending: safety.pending ?? null,\n result,\n lifecycle,\n });\n return result;\n });\n}\n\nasync function releaseLocked(\n plan: ReleasePlan,\n artifact: PublishedArtifact,\n runtime: Runtime,\n context: RuntimeContext,\n attempt: Attempt,\n state: StateSession,\n): Promise<ReleaseReceipt> {\n let previous: ObservedRelease | undefined;\n let migration: MigrationResult | undefined;\n let staged: StagedRelease;\n\n try {\n await requireSafe(state);\n staged = await effect(state, attempt, \"validated\", artifact.identity, \"artifact\", () =>\n runtime.target.stage(plan, artifact, {\n attemptId: attempt.id,\n artifactRoot: context.artifactRoot,\n stagedAt: attempt.history.instant(),\n ...(attempt.signal === undefined ? {} : { signal: attempt.signal }),\n }),\n );\n previous = staged.previous;\n attempt.history.advance(\"staged\");\n } catch (error) {\n const failure = normalize(error, \"artifact\", attempt.history.state());\n return failed(state, plan, artifact, attempt, failure, {}, \"failed\");\n }\n\n try {\n const lifecycle = lifecycleOf(plan);\n if (lifecycle?.preflight) {\n assertActive(attempt.signal, \"preflight\", \"staged\");\n await runtime.lifecycle.preflight(\n lifecycle.preflight,\n processOptions(context.process, attempt.signal),\n );\n }\n attempt.history.advance(\"preflighted\");\n } catch (error) {\n const failure = normalize(error, \"preflight\", \"staged\");\n return failed(state, plan, artifact, attempt, failure, fields(previous), \"preflight-failed\");\n }\n\n try {\n const command = lifecycleOf(plan)?.migrate;\n migration = command\n ? await effect(state, attempt, \"preflighted\", artifact.identity, \"migration\", () =>\n runtime.lifecycle.migrate(command, processOptions(context.process, attempt.signal)),\n )\n : createNoMigrationResult();\n attempt.history.advance(\"migrated\");\n } catch (error) {\n const result = migrationFrom(error);\n const failure = normalize(error, \"migration\", \"preflighted\");\n if (\n result &&\n (!result.previousCompatible ||\n result.schemaEffect === \"partial\" ||\n result.schemaEffect === \"unknown\")\n ) {\n await state.block(attempt.id);\n }\n return failed(\n state,\n plan,\n artifact,\n attempt,\n failure,\n { ...fields(previous), ...(result === undefined ? {} : { migration: result }) },\n result === undefined ? \"failed\" : \"migration-failed\",\n );\n }\n\n try {\n const command = lifecycleOf(plan)?.beforeActivate;\n if (command) {\n await effect(state, attempt, \"migrated\", artifact.identity, \"activation\", () =>\n runtime.lifecycle.beforeActivate(command, processOptions(context.process, attempt.signal)),\n );\n }\n attempt.history.advance(\"activation-prepared\");\n } catch (error) {\n const failure = normalize(error, \"activation\", \"migrated\");\n return failed(\n state,\n plan,\n artifact,\n attempt,\n failure,\n { ...fields(previous), migration },\n \"failed\",\n );\n }\n\n let activated: ReleaseIdentity;\n try {\n const release = await effect(\n state,\n attempt,\n \"activation-prepared\",\n artifact.identity,\n \"activation\",\n () =>\n runtime.rollout.activate(plan, staged, {\n attemptId: attempt.id,\n activatedAt: attempt.history.instant(),\n ...(attempt.signal === undefined ? {} : { signal: attempt.signal }),\n }),\n );\n activated = release.releaseId;\n attempt.history.advance(\"activated\");\n } catch (error) {\n const failure = normalize(error, \"activation\", \"activation-prepared\");\n if (failure.effect !== \"acknowledged\") {\n return failed(\n state,\n plan,\n artifact,\n attempt,\n failure,\n { ...fields(previous), migration },\n \"failed\",\n );\n }\n try {\n const observation = await runtime.target.observe(plan, operationContext(attempt));\n if (observation.current?.releaseId !== staged.releaseId) {\n return failed(\n state,\n plan,\n artifact,\n attempt,\n failure,\n { ...fields(previous), migration },\n \"failed\",\n );\n }\n activated = staged.releaseId;\n attempt.history.advance(\"activated\");\n if (!previous) {\n await state.block(attempt.id);\n return terminal(plan, artifact, attempt, \"failed\", failure, { activated, migration });\n }\n return recover(\n plan,\n runtime,\n context,\n attempt,\n state,\n observation.current,\n previous,\n artifact,\n failure,\n { previous: previous.releaseId, activated, migration },\n );\n } catch (observationError) {\n const unknown = failureOf(\n \"activation\",\n \"activation-prepared\",\n \"unknown\",\n \"Activated runtime state could not be reconciled\",\n );\n return failed(\n state,\n plan,\n artifact,\n attempt,\n unknown,\n { ...fields(previous), migration },\n \"failed\",\n observationError,\n );\n }\n }\n\n try {\n const command = lifecycleOf(plan)?.afterActivate;\n if (command) {\n await effect(state, attempt, \"activated\", artifact.identity, \"activation\", () =>\n runtime.lifecycle.afterActivate(command, processOptions(context.process, attempt.signal)),\n );\n }\n attempt.history.advance(\"activation-finalized\");\n } catch (error) {\n const failure = normalize(error, \"activation\", \"activated\");\n if (failure.effect === \"unknown\") {\n return failed(\n state,\n plan,\n artifact,\n attempt,\n failure,\n { ...fields(previous), activated, migration },\n \"failed\",\n );\n }\n if (!previous) {\n await state.block(attempt.id);\n return terminal(plan, artifact, attempt, \"failed\", failure, {\n activated,\n migration,\n });\n }\n let exactCurrent: ObservedRelease;\n try {\n const observation = await runtime.target.observe(plan, operationContext(attempt));\n if (observation.current?.releaseId !== activated) {\n throw coordinatorError(\n \"reconciliation\",\n \"activated\",\n \"unknown\",\n \"Activated release could not be observed after finalization failed\",\n );\n }\n exactCurrent = observation.current;\n } catch (observationError) {\n const unknown = failureOf(\n \"reconciliation\",\n \"activated\",\n \"unknown\",\n \"Activated release could not be observed after finalization failed\",\n );\n return failed(\n state,\n plan,\n artifact,\n attempt,\n unknown,\n { previous: previous.releaseId, activated, migration },\n \"failed\",\n observationError,\n );\n }\n return recover(\n plan,\n runtime,\n context,\n attempt,\n state,\n exactCurrent,\n previous,\n artifact,\n failure,\n {\n previous: previous.releaseId,\n activated,\n migration,\n },\n );\n }\n\n try {\n const observed = await runtime.target.readRelease(plan, activated, operationContext(attempt));\n const health = await runtime.rollout.verify(plan, observed, {\n attemptId: attempt.id,\n checkedAt: attempt.history.instant(),\n ...(attempt.signal === undefined ? {} : { signal: attempt.signal }),\n });\n if (health.status !== \"healthy\" || health.releaseId !== activated) {\n throw coordinatorError(\n \"health\",\n \"activation-finalized\",\n \"none\",\n \"Finalized release did not pass health verification\",\n );\n }\n attempt.history.advance(\"healthy\");\n } catch (error) {\n const failure = normalize(error, \"health\", \"activation-finalized\");\n attempt.history.advance(\"unhealthy\");\n if (!previous) {\n await state.block(attempt.id);\n return terminal(plan, artifact, attempt, \"failed\", failure, { activated, migration });\n }\n let exactCurrent: ObservedRelease;\n try {\n const observation = await runtime.target.observe(plan, operationContext(attempt));\n if (observation.current?.releaseId !== activated) {\n throw coordinatorError(\n \"reconciliation\",\n \"unhealthy\",\n \"unknown\",\n \"Finalized release could not be observed after health verification failed\",\n );\n }\n exactCurrent = observation.current;\n } catch (observationError) {\n const unknown = failureOf(\n \"reconciliation\",\n \"unhealthy\",\n \"unknown\",\n \"Finalized release could not be observed after health verification failed\",\n );\n return failed(\n state,\n plan,\n artifact,\n attempt,\n unknown,\n { previous: previous.releaseId, activated, migration },\n \"failed\",\n observationError,\n );\n }\n return recover(\n plan,\n runtime,\n context,\n attempt,\n state,\n exactCurrent,\n previous,\n artifact,\n failure,\n {\n previous: previous.releaseId,\n activated,\n migration,\n },\n );\n }\n\n attempt.history.advance(\"retaining\");\n try {\n const protectedReleases = protectedSet(\n context.protectedReleases,\n activated,\n previous?.releaseId,\n );\n const result = await effect(state, attempt, \"retaining\", artifact.identity, \"retention\", () =>\n runtime.target.retain(plan, {\n attemptId: attempt.id,\n protectedReleases,\n ...(attempt.signal === undefined ? {} : { signal: attempt.signal }),\n }),\n );\n if (result.status !== \"succeeded\") {\n throw coordinatorError(\n \"retention\",\n \"retaining\",\n \"acknowledged\",\n \"Target retention reported failure\",\n );\n }\n } catch (error) {\n const failure = normalize(error, \"retention\", \"retaining\");\n return failed(\n state,\n plan,\n artifact,\n attempt,\n failure,\n { ...fields(previous), activated, migration },\n \"retention-failed\",\n );\n }\n\n attempt.history.advance(\"completed\");\n return releaseReceiptSchema.parse({\n schemaVersion: 1,\n attemptId: attempt.id,\n environment: plan.environmentName,\n revision: plan.revision,\n artifact,\n transitions: attempt.history.values(),\n state: \"completed\",\n ...(previous === undefined ? {} : { previous: previous.releaseId }),\n activated,\n migration,\n });\n}\n\nasync function recover(\n plan: Plan,\n runtime: Runtime,\n context: RuntimeContext,\n attempt: Attempt,\n state: StateSession,\n current: ObservedRelease,\n candidate: ObservedRelease,\n artifact: PublishedArtifact,\n sourceFailure: Failure,\n receiptFields: ReceiptFields,\n): Promise<ReleaseReceipt> {\n if (attempt.history.state() !== \"rollback-pending\") {\n attempt.history.advance(\"rollback-pending\");\n }\n\n let compatibility: CompatibilityResult;\n try {\n compatibility = await assess(plan, runtime, context, attempt, candidate);\n } catch (error) {\n await state.block(attempt.id);\n const failure = normalize(error, \"rollback\", \"rollback-pending\");\n return terminal(plan, artifact, attempt, \"failed\", failure, receiptFields);\n }\n const projected = {\n ...receiptFields,\n previous: candidate.releaseId,\n activated: current.releaseId,\n rollbackCompatibility: compatibility,\n };\n if (compatibility.status !== \"compatible\") {\n await state.block(attempt.id);\n return terminal(\n plan,\n artifact,\n attempt,\n \"rollback-failed\",\n failureOf(\n \"rollback\",\n \"rollback-pending\",\n \"none\",\n \"Rollback candidate is incompatible with the current lifecycle ledger\",\n ),\n projected,\n );\n }\n\n let outcome: RecoveryOutcome;\n try {\n outcome = await effect(\n state,\n attempt,\n \"rollback-pending\",\n candidate.artifact.identity,\n \"rollback\",\n () =>\n runtime.rollout.recover(plan, candidate, {\n attemptId: attempt.id,\n recoveredAt: attempt.history.instant(),\n ...(attempt.signal === undefined ? {} : { signal: attempt.signal }),\n }),\n (value) => value.effect,\n );\n } catch (error) {\n const failure = normalize(error, \"rollback\", \"rollback-pending\");\n return failed(state, plan, artifact, attempt, failure, projected, \"rollback-failed\");\n }\n\n if (outcome.status !== \"recovered\") {\n if (outcome.effect !== \"none\") await state.block(attempt.id);\n return failed(state, plan, artifact, attempt, outcome.failure, projected, \"rollback-failed\");\n }\n\n try {\n const observed = await runtime.target.readRelease(\n plan,\n candidate.releaseId,\n operationContext(attempt),\n );\n const health = await runtime.rollout.verify(plan, observed, {\n attemptId: attempt.id,\n checkedAt: attempt.history.instant(),\n ...(attempt.signal === undefined ? {} : { signal: attempt.signal }),\n });\n if (health.status !== \"healthy\" || health.releaseId !== candidate.releaseId) {\n throw coordinatorError(\n \"rollback\",\n \"rollback-pending\",\n \"acknowledged\",\n \"Recovered release did not pass health verification\",\n );\n }\n\n const command = lifecycleOf(plan)?.recover;\n if (command) {\n const result = await effect(\n state,\n attempt,\n \"rollback-pending\",\n candidate.artifact.identity,\n \"reconciliation\",\n () => runtime.lifecycle.recover(command, processOptions(context.process, attempt.signal)),\n );\n if (result.status !== \"safe\") {\n throw coordinatorError(\n \"rollback\",\n \"rollback-pending\",\n \"acknowledged\",\n \"Product lifecycle recovery did not report a safe state\",\n );\n }\n }\n } catch (error) {\n await state.block(attempt.id);\n const failure = normalize(error, \"rollback\", \"rollback-pending\");\n return failed(state, plan, artifact, attempt, failure, projected, \"rollback-failed\");\n }\n\n attempt.history.advance(\"rolled-back\");\n return releaseReceiptSchema.parse({\n schemaVersion: 1,\n attemptId: attempt.id,\n environment: plan.environmentName,\n revision: artifact.revision,\n artifact,\n transitions: attempt.history.values(),\n state: \"rolled-back\",\n previous: candidate.releaseId,\n activated: current.releaseId,\n ...(receiptFields.migration === undefined ? {} : { migration: receiptFields.migration }),\n rollbackCompatibility: compatibility,\n failure: sourceFailure,\n });\n}\n\nasync function assess(\n plan: Plan,\n runtime: Runtime,\n context: RuntimeContext,\n attempt: Attempt,\n candidate: ObservedRelease,\n): Promise<CompatibilityResult> {\n const lifecycle = lifecycleOf(plan);\n const observation = await observeLifecycle(\n plan,\n runtime,\n processOptions(context.process, attempt.signal),\n );\n if (observation.status !== \"clean\" || !observation.migrationLedger) {\n throw coordinatorError(\n \"rollback\",\n \"rollback-pending\",\n \"none\",\n \"Rollback requires a clean observed lifecycle ledger\",\n );\n }\n if (!lifecycle?.assessRollback) {\n return compatibilityResultSchema.parse({\n schemaVersion: 1,\n status: \"compatible\",\n candidate: candidate.releaseId,\n currentLedger: observation.migrationLedger,\n reason: \"No migration lifecycle is configured\",\n });\n }\n const result = await runtime.lifecycle.assessRollback(\n lifecycle.assessRollback,\n processOptions(context.process, attempt.signal),\n );\n if (\n result.candidate !== candidate.releaseId ||\n result.currentLedger !== observation.migrationLedger\n ) {\n throw coordinatorError(\n \"rollback\",\n \"rollback-pending\",\n \"none\",\n \"Rollback assessment does not match the exact candidate and observed ledger\",\n );\n }\n return result;\n}\n\nasync function publishArtifact(\n plan: ReleasePlan,\n result: BuildResult,\n binding: RegistryBinding | undefined,\n): Promise<PublishedArtifact> {\n if (result.output.kind === \"directory\") {\n return createPublishedArtifact(plan, result.artifact, {\n kind: \"directory\",\n identity: result.output.identity,\n archive: result.output.archive,\n manifestFile: result.output.manifestFile,\n });\n }\n if (!binding) {\n throw coordinatorError(\n \"registry-auth\",\n \"built\",\n \"none\",\n \"OCI publication requires a registry transport\",\n );\n }\n if (result.output.kind === \"oci\") {\n const observed = await binding.port.push(\n { reference: result.output.reference, expectedDigest: result.output.identity },\n binding.options,\n );\n assertPublishedImage(observed, result.output.identity);\n return createPublishedArtifact(plan, result.artifact, {\n kind: \"oci\",\n identity: observed.digest,\n configDigest: observed.configDigest,\n repository: observed.repository,\n digest: observed.digest,\n reference: observed.reference,\n });\n }\n\n const workloads: PublishedWorkload[] = [];\n for (const workload of result.output.workloads) {\n const observed = await binding.port.push(\n { reference: workload.reference, expectedDigest: workload.identity },\n binding.options,\n );\n assertPublishedImage(observed, workload.identity);\n workloads.push({ workload: workload.workload, ...observed });\n }\n const identity = createPublishedStackIdentity({ revision: plan.revision, workloads });\n return createPublishedArtifact(plan, result.artifact, {\n kind: \"oci-set\",\n identity,\n workloads,\n });\n}\n\nfunction assertPublishedImage(\n observed: {\n readonly repository: string;\n readonly digest: string;\n readonly configDigest: string;\n readonly reference: string;\n },\n expectedDigest: string,\n): void {\n if (\n observed.digest !== expectedDigest ||\n observed.reference !== `${observed.repository}@${observed.digest}`\n ) {\n throw coordinatorError(\n \"artifact\",\n \"published\",\n \"acknowledged\",\n \"Registry observation does not match the expected immutable digest\",\n );\n }\n}\n\nasync function observeLifecycle(\n plan: Plan,\n runtime: Runtime,\n options: ProcessOptions,\n): Promise<LifecycleObservation> {\n const lifecycle = lifecycleOf(plan);\n return lifecycle\n ? runtime.lifecycle.inspect(lifecycle.inspect, options)\n : createNoMigrationObservation();\n}\n\nasync function effect<Result>(\n state: StateSession,\n attempt: Attempt,\n phase: AttemptState,\n artifact: string,\n category: Failure[\"category\"],\n operation: () => Promise<Result>,\n resultEffect: (result: Result) => Failure[\"effect\"] = () => \"acknowledged\",\n): Promise<Result> {\n assertActive(attempt.signal, category, phase);\n const recordedAt = attempt.history.instant();\n await state.recordIntent({\n schemaVersion: 1,\n attemptId: attempt.id,\n phase,\n artifact,\n recordedAt,\n });\n\n let result: Result;\n try {\n assertActive(attempt.signal, category, phase);\n result = await operation();\n } catch (error) {\n const failure = normalize(error, category, phase);\n await acknowledge(state, attempt, phase, failure.effect, error);\n throw new CoordinatorError(failure, { cause: error });\n }\n\n await acknowledge(state, attempt, phase, resultEffect(result));\n return result;\n}\n\nasync function acknowledge(\n state: StateSession,\n attempt: Attempt,\n phase: AttemptState,\n effectValue: Failure[\"effect\"],\n operationError?: unknown,\n): Promise<void> {\n try {\n await state.acknowledge({\n schemaVersion: 1,\n attemptId: attempt.id,\n phase,\n status: effectValue === \"unknown\" ? \"unknown\" : \"acknowledged\",\n observedAt: attempt.history.instant(),\n });\n } catch (error) {\n throw coordinatorError(\n \"reconciliation\",\n phase,\n \"unknown\",\n \"Effect acknowledgement could not be persisted\",\n operationError === undefined ? error : new AggregateError([operationError, error]),\n );\n }\n}\n\nasync function failed(\n state: StateSession,\n plan: Plan,\n artifact: PublishedArtifact,\n attempt: Attempt,\n failure: Failure,\n receiptFields: ReceiptFields,\n preferred: Extract<\n AttemptState,\n \"failed\" | \"preflight-failed\" | \"migration-failed\" | \"rollback-failed\" | \"retention-failed\"\n >,\n cause?: unknown,\n): Promise<ReleaseReceipt> {\n if (failure.effect === \"unknown\") await state.block(attempt.id);\n return terminal(\n plan,\n artifact,\n attempt,\n failure.effect === \"unknown\" ? \"effect-unknown\" : preferred,\n failure,\n receiptFields,\n cause,\n );\n}\n\nfunction terminal(\n plan: Plan,\n artifact: PublishedArtifact,\n attempt: Attempt,\n state: Extract<\n AttemptState,\n | \"effect-unknown\"\n | \"failed\"\n | \"preflight-failed\"\n | \"migration-failed\"\n | \"rollback-failed\"\n | \"retention-failed\"\n >,\n failure: Failure,\n receiptFields: ReceiptFields,\n cause?: unknown,\n): ReleaseReceipt {\n try {\n attempt.history.advance(state);\n return releaseReceiptSchema.parse({\n schemaVersion: 1,\n attemptId: attempt.id,\n environment: plan.environmentName,\n revision: artifact.revision,\n artifact,\n transitions: attempt.history.values(),\n state,\n ...optionalFields(receiptFields),\n failure,\n });\n } catch (error) {\n throw new CoordinatorError(failure, {\n cause: cause === undefined ? error : new AggregateError([cause, error]),\n });\n }\n}\n\nfunction runtimeArtifact(plan: ReleasePlan, input: unknown, runtime: Runtime): PublishedArtifact {\n requireRuntime(plan, runtime);\n const artifact = parsePublishedArtifact(input);\n assertArtifact(plan, artifact);\n return artifact;\n}\n\nfunction requireRuntime(plan: Plan, runtime: Runtime): void {\n if (plan.environment.target === \"registry-only\") {\n throw coordinatorError(\n \"config\",\n \"validated\",\n \"none\",\n \"Registry-only environments do not support runtime operations\",\n );\n }\n if (runtime.target.id !== plan.environment.target) {\n throw coordinatorError(\n \"config\",\n \"validated\",\n \"none\",\n \"Target adapter does not match the execution plan\",\n );\n }\n const expected =\n \"strategy\" in plan.environment.rollout ? plan.environment.rollout.strategy : \"stack\";\n if (runtime.rollout.id !== expected) {\n throw coordinatorError(\n \"config\",\n \"validated\",\n \"none\",\n \"Rollout adapter does not match the execution plan\",\n );\n }\n}\n\nasync function requireSafe(state: StateSession): Promise<void> {\n const current = await state.load();\n if (current.status === \"safe\" && !current.pending) return;\n throw coordinatorError(\n \"reconciliation\",\n \"validated\",\n \"none\",\n \"Deployment environment requires reconciliation before another runtime effect\",\n );\n}\n\nfunction createAttempt(\n attemptId: string | undefined,\n now: Clock | undefined,\n signal?: AbortSignal,\n createId: IdFactory = randomUUID,\n): Attempt {\n const id = effectIntentSchema.shape.attemptId.parse(attemptId ?? createId());\n return Object.freeze({\n id,\n history: new History(now ?? (() => new Date())),\n ...(signal === undefined ? {} : { signal }),\n });\n}\n\nclass History {\n readonly #transitions: Transition[] = [];\n readonly #now: Clock;\n #last = 0;\n\n constructor(now: Clock) {\n this.#now = now;\n const occurredAt = this.read();\n this.#last = Date.parse(occurredAt);\n this.#transitions.push(\n transitionSchema.parse({ state: \"configured\", occurredAt, durationMs: 0 }),\n );\n }\n\n advance(state: AttemptState): void {\n const occurredAt = this.read();\n const current = Date.parse(occurredAt);\n const durationMs = current - this.#last;\n if (durationMs < 0) {\n throw coordinatorError(\"config\", this.state(), \"none\", \"Deployment clock must be monotonic\");\n }\n this.#last = current;\n this.#transitions.push(transitionSchema.parse({ state, occurredAt, durationMs }));\n }\n\n instant(): string {\n const value = this.read();\n if (Date.parse(value) < this.#last) {\n throw coordinatorError(\"config\", this.state(), \"none\", \"Deployment clock must be monotonic\");\n }\n return value;\n }\n\n state(): AttemptState {\n return this.#transitions.at(-1)?.state ?? \"configured\";\n }\n\n values(): readonly Transition[] {\n return Object.freeze([...this.#transitions]);\n }\n\n private read(): string {\n const value = this.#now();\n if (!Number.isFinite(value.getTime())) {\n throw coordinatorError(\n \"config\",\n this.state(),\n \"none\",\n \"Deployment clock returned an invalid time\",\n );\n }\n return value.toISOString();\n }\n}\n\nfunction normalize(error: unknown, category: Failure[\"category\"], phase: AttemptState): Failure {\n if (error instanceof CoordinatorError) return error.failure;\n if (error instanceof LifecycleError) return error.failure;\n if (error instanceof RegistryError) {\n return failureOf(\n error.operation === \"authenticate\" ? \"registry-auth\" : category,\n phase,\n error.effect,\n error.retryable\n ? \"Registry operation failed and may be retried\"\n : \"Registry operation failed\",\n );\n }\n const embedded = embeddedFailure(error);\n if (embedded) return embedded;\n const effectValue = objectEffect(error) ?? \"none\";\n return failureSchema.parse({\n category,\n phase,\n retryable: objectRetryable(error),\n effect: effectValue,\n message: `${category} operation failed`,\n });\n}\n\nfunction migrationFrom(error: unknown): MigrationResult | undefined {\n let current: unknown = error;\n for (let depth = 0; depth < 4; depth += 1) {\n if (current instanceof LifecycleError) {\n const parsed = migrationResultSchema.safeParse(current.result);\n return parsed.success ? parsed.data : undefined;\n }\n current = errorCause(current);\n if (current === undefined) return undefined;\n }\n return undefined;\n}\n\nfunction embeddedFailure(error: unknown): Failure | undefined {\n if (!isRecord(error)) return undefined;\n const parsed = failureSchema.safeParse(error.failure);\n return parsed.success ? parsed.data : undefined;\n}\n\nfunction objectEffect(error: unknown): Failure[\"effect\"] | undefined {\n if (!isRecord(error)) return undefined;\n const parsed = failureSchema.shape.effect.safeParse(error.effect);\n return parsed.success ? parsed.data : undefined;\n}\n\nfunction objectRetryable(error: unknown): boolean {\n return isRecord(error) && typeof error.retryable === \"boolean\" ? error.retryable : false;\n}\n\nfunction errorCause(error: unknown): unknown {\n return isRecord(error) ? error.cause : undefined;\n}\n\nfunction operationContext(attempt: Attempt) {\n return {\n attemptId: attempt.id,\n ...(attempt.signal === undefined ? {} : { signal: attempt.signal }),\n };\n}\n\nfunction processOptions(options: ProcessOptions, signal: AbortSignal | undefined): ProcessOptions {\n return {\n ...options,\n ...(signal === undefined ? {} : { signal }),\n };\n}\n\nfunction protectedSet(\n input: readonly ReleaseIdentity[] | undefined,\n ...required: readonly (ReleaseIdentity | undefined)[]\n): readonly ReleaseIdentity[] {\n const values = new Set<string>([\n ...(input ?? []),\n ...required.filter((value) => value !== undefined),\n ]);\n return Object.freeze([...values].map((value) => releaseIdentitySchema.parse(value)).sort());\n}\n\nfunction fields(previous: ObservedRelease | undefined): ReceiptFields {\n return previous === undefined ? {} : { previous: previous.releaseId };\n}\n\nfunction optionalFields(value: ReceiptFields): Readonly<Record<string, unknown>> {\n return {\n ...(value.previous === undefined ? {} : { previous: value.previous }),\n ...(value.activated === undefined ? {} : { activated: value.activated }),\n ...(value.migration === undefined ? {} : { migration: value.migration }),\n ...(value.rollbackCompatibility === undefined\n ? {}\n : { rollbackCompatibility: value.rollbackCompatibility }),\n ...(value.reconciliation === undefined ? {} : { reconciliation: value.reconciliation }),\n };\n}\n\nfunction lifecycleOf(plan: Plan) {\n return plan.environment.target === \"compose-host\" ? plan.environment.lifecycle : undefined;\n}\n\nfunction reconciliationReason(\n lifecycle: LifecycleObservation,\n healthy: boolean,\n pendingMatches: boolean,\n pendingRequiresCurrent: boolean,\n current: ObservedRelease | undefined,\n): string {\n if (lifecycle.status !== \"clean\") return \"Lifecycle state is not clean\";\n if (!healthy) return \"Observed release is not healthy\";\n if (!pendingMatches) return \"Observed release does not match the pending effect\";\n if (pendingRequiresCurrent && !current) return \"Pending runtime effect has no observed release\";\n return \"Reconciliation evidence is incomplete\";\n}\n\nfunction assertActive(\n signal: AbortSignal | undefined,\n category: Failure[\"category\"],\n phase: AttemptState,\n): void {\n if (!signal?.aborted) return;\n throw coordinatorError(\n category,\n phase,\n \"none\",\n \"Deployment operation was cancelled\",\n signal.reason,\n );\n}\n\nfunction coordinatorError(\n category: Failure[\"category\"],\n phase: AttemptState,\n effectValue: Failure[\"effect\"],\n message: string,\n cause?: unknown,\n): CoordinatorError {\n return new CoordinatorError(\n failureOf(category, phase, effectValue, message),\n cause === undefined ? undefined : { cause },\n );\n}\n\nfunction failureOf(\n category: Failure[\"category\"],\n phase: AttemptState,\n effectValue: Failure[\"effect\"],\n message: string,\n): Failure {\n return failureSchema.parse({ category, phase, retryable: false, effect: effectValue, message });\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { z } from \"zod\";\n\nimport type { Command } from \"./config.js\";\nimport type {\n ProcessFailure,\n ProcessFailureReason,\n ProcessOptions,\n ProcessRunner,\n} from \"./process.js\";\nimport {\n compatibilityResultSchema,\n migrationResultSchema,\n type AttemptState,\n type CompatibilityResult,\n type Failure,\n type MigrationResult,\n} from \"./receipt.js\";\n\nconst MAX_RESULT_TEXT_LENGTH = 4_096;\nconst NO_MIGRATION_LEDGER = \"none\";\n\nconst resultTextSchema = z\n .string()\n .min(1)\n .max(MAX_RESULT_TEXT_LENGTH)\n .refine((value) => value.trim().length > 0, { message: \"Value must not be blank\" })\n .refine((value) => !value.includes(\"\\0\") && !value.includes(\"\\n\") && !value.includes(\"\\r\"), {\n message: \"Value must not contain control characters\",\n });\n\nexport const preflightResultSchema = z.strictObject({\n schemaVersion: z.literal(1),\n status: z.enum([\"succeeded\", \"failed\"]),\n checkpoint: resultTextSchema,\n});\n\nexport const hookResultSchema = z.strictObject({\n schemaVersion: z.literal(1),\n status: z.enum([\"succeeded\", \"failed\"]),\n phase: z.enum([\"beforeActivate\", \"afterActivate\"]),\n checkpoint: resultTextSchema,\n});\n\nexport const lifecycleObservationSchema = z.discriminatedUnion(\"status\", [\n z.strictObject({\n schemaVersion: z.literal(1),\n status: z.enum([\"clean\", \"dirty\"]),\n migrationLedger: resultTextSchema,\n }),\n z.strictObject({\n schemaVersion: z.literal(1),\n status: z.literal(\"unknown\"),\n migrationLedger: resultTextSchema.optional(),\n }),\n]);\n\nexport const recoveryResultSchema = z.strictObject({\n schemaVersion: z.literal(1),\n status: z.enum([\"safe\", \"blocked\"]),\n checkpoint: resultTextSchema,\n});\n\nexport const trafficResultSchema = z.strictObject({\n schemaVersion: z.literal(1),\n status: z.enum([\"succeeded\", \"failed\"]),\n phase: z.enum([\"inspect\", \"activate\", \"recover\"]),\n active: resultTextSchema,\n candidate: resultTextSchema.optional(),\n});\n\nexport type PreflightResult = z.infer<typeof preflightResultSchema>;\nexport type HookResult = z.infer<typeof hookResultSchema>;\nexport type LifecycleObservation = z.infer<typeof lifecycleObservationSchema>;\nexport type RecoveryResult = z.infer<typeof recoveryResultSchema>;\nexport type TrafficResult = z.infer<typeof trafficResultSchema>;\nexport type HookPhase = HookResult[\"phase\"];\nexport type TrafficPhase = TrafficResult[\"phase\"];\nexport type LifecycleResult =\n | PreflightResult\n | MigrationResult\n | HookResult\n | CompatibilityResult\n | LifecycleObservation\n | RecoveryResult\n | TrafficResult;\n\nexport function createNoMigrationResult(): MigrationResult {\n return Object.freeze(\n migrationResultSchema.parse({\n schemaVersion: 1,\n status: \"succeeded\",\n schemaEffect: \"none\",\n previousCompatible: true,\n ledgerBefore: NO_MIGRATION_LEDGER,\n ledgerAfter: NO_MIGRATION_LEDGER,\n }),\n );\n}\n\nexport function createNoMigrationObservation(): LifecycleObservation {\n return Object.freeze(\n lifecycleObservationSchema.parse({\n schemaVersion: 1,\n status: \"clean\",\n migrationLedger: NO_MIGRATION_LEDGER,\n }),\n );\n}\n\nexport class LifecycleError<T extends LifecycleResult = LifecycleResult> extends Error {\n constructor(\n readonly failure: Failure,\n readonly result?: T,\n ) {\n super(failure.message);\n this.name = \"LifecycleError\";\n }\n}\n\nexport interface LifecyclePort {\n preflight(command: Command, options: ProcessOptions): Promise<PreflightResult>;\n migrate(command: Command, options: ProcessOptions): Promise<MigrationResult>;\n beforeActivate(command: Command, options: ProcessOptions): Promise<HookResult>;\n afterActivate(command: Command, options: ProcessOptions): Promise<HookResult>;\n assessRollback(command: Command, options: ProcessOptions): Promise<CompatibilityResult>;\n inspect(command: Command, options: ProcessOptions): Promise<LifecycleObservation>;\n recover(command: Command, options: ProcessOptions): Promise<RecoveryResult>;\n traffic(command: Command, phase: TrafficPhase, options: ProcessOptions): Promise<TrafficResult>;\n}\n\nexport interface TrafficExecutor {\n execute(command: Command, options: ProcessOptions): Promise<Readonly<{ stdout: string }>>;\n}\n\ninterface OperationSpec<T extends LifecycleResult> {\n readonly name: string;\n readonly category: Failure[\"category\"];\n readonly phase: AttemptState;\n readonly effectful: boolean;\n readonly schema: z.ZodType<T>;\n readonly matches?: (result: T) => boolean;\n readonly succeeds?: (result: T) => boolean;\n}\n\nconst RETRYABLE_PROCESS_FAILURES = new Set<ProcessFailureReason>([\"spawn\", \"timeout\"]);\n\nconst preflightSpec: OperationSpec<PreflightResult> = {\n name: \"preflight\",\n category: \"preflight\",\n phase: \"staged\",\n effectful: false,\n schema: preflightResultSchema,\n succeeds: (result) => result.status === \"succeeded\",\n};\n\nconst migrationSpec: OperationSpec<MigrationResult> = {\n name: \"migration\",\n category: \"migration\",\n phase: \"preflighted\",\n effectful: true,\n schema: migrationResultSchema,\n succeeds: (result) => result.status === \"succeeded\",\n};\n\nfunction hookSpec(phase: HookPhase): OperationSpec<HookResult> {\n return {\n name: phase,\n category: \"activation\",\n phase: phase === \"beforeActivate\" ? \"migrated\" : \"activated\",\n effectful: true,\n schema: hookResultSchema,\n matches: (result) => result.phase === phase,\n succeeds: (result) => result.status === \"succeeded\",\n };\n}\n\nconst rollbackAssessmentSpec: OperationSpec<CompatibilityResult> = {\n name: \"assessRollback\",\n category: \"rollback\",\n phase: \"rollback-pending\",\n effectful: false,\n schema: compatibilityResultSchema,\n};\n\nconst inspectionSpec: OperationSpec<LifecycleObservation> = {\n name: \"inspect\",\n category: \"reconciliation\",\n phase: \"effect-unknown\",\n effectful: false,\n schema: lifecycleObservationSchema,\n};\n\nconst recoverySpec: OperationSpec<RecoveryResult> = {\n name: \"recover\",\n category: \"reconciliation\",\n phase: \"effect-unknown\",\n effectful: true,\n schema: recoveryResultSchema,\n};\n\nfunction trafficSpec(phase: TrafficPhase): OperationSpec<TrafficResult> {\n return {\n name: `traffic-${phase}`,\n category: phase === \"recover\" ? \"rollback\" : \"activation\",\n phase: phase === \"recover\" ? \"rollback-pending\" : \"activation-prepared\",\n effectful: phase !== \"inspect\",\n schema: trafficResultSchema,\n matches: (result) => result.phase === phase,\n succeeds: (result) => result.status === \"succeeded\",\n };\n}\n\n/** 生命周期端口只执行显式命令,并将所有外部输出收敛为版本化结果。 */\nexport function createLifecyclePort(runner: ProcessRunner): LifecyclePort {\n return {\n preflight: (command, options) => execute(runner, command, options, preflightSpec),\n migrate: (command, options) => execute(runner, command, options, migrationSpec),\n beforeActivate: (command, options) =>\n execute(runner, command, options, hookSpec(\"beforeActivate\")),\n afterActivate: (command, options) =>\n execute(runner, command, options, hookSpec(\"afterActivate\")),\n assessRollback: (command, options) => execute(runner, command, options, rollbackAssessmentSpec),\n inspect: (command, options) => execute(runner, command, options, inspectionSpec),\n recover: (command, options) => execute(runner, command, options, recoverySpec),\n traffic: (command, phase, options) => execute(runner, command, options, trafficSpec(phase)),\n };\n}\n\n/** 复用部署主机 SSH 会话执行流量命令,避免把传输凭证交给本地子进程。 */\nexport function createTrafficPort(executor: TrafficExecutor): Pick<LifecyclePort, \"traffic\"> {\n return {\n traffic: async (command, phase, options) => {\n const spec = trafficSpec(phase);\n const output = await executor.execute(command, options);\n const result = parseResult(output.stdout, spec);\n if (spec.matches && !spec.matches(result)) throw outputError(spec);\n if (spec.succeeds && !spec.succeeds(result)) throw reportedError(spec, result);\n return result;\n },\n };\n}\n\nasync function execute<T extends LifecycleResult>(\n runner: ProcessRunner,\n command: Command,\n options: ProcessOptions,\n spec: OperationSpec<T>,\n): Promise<T> {\n const outcome = await runner.run(command, options);\n if (outcome.status === \"failed\") throw processError(outcome, spec);\n\n const result = parseResult(outcome.stdout, spec);\n if (spec.matches && !spec.matches(result)) throw outputError(spec);\n if (spec.succeeds && !spec.succeeds(result)) throw reportedError(spec, result);\n return result;\n}\n\nfunction parseResult<T extends LifecycleResult>(stdout: string, spec: OperationSpec<T>): T {\n const document = stdout.trim();\n if (document.length === 0) throw outputError(spec);\n\n let value: unknown;\n try {\n value = JSON.parse(document) as unknown;\n } catch {\n throw outputError(spec);\n }\n\n const parsed = spec.schema.safeParse(value);\n if (!parsed.success) throw outputError(spec);\n return parsed.data;\n}\n\nfunction processError<T extends LifecycleResult>(\n outcome: ProcessFailure,\n spec: OperationSpec<T>,\n): LifecycleError<T> {\n const effect = outcome.dispatched && spec.effectful ? \"unknown\" : \"none\";\n const retryable = effect !== \"unknown\" && RETRYABLE_PROCESS_FAILURES.has(outcome.reason);\n return new LifecycleError({\n category: spec.category,\n phase: spec.phase,\n retryable,\n effect,\n message: `${spec.name} process failed: ${outcome.reason}`,\n });\n}\n\nfunction outputError<T extends LifecycleResult>(spec: OperationSpec<T>): LifecycleError<T> {\n return new LifecycleError({\n category: spec.category,\n phase: spec.phase,\n retryable: false,\n effect: spec.effectful ? \"unknown\" : \"none\",\n message: `${spec.name} output must be exactly one valid JSON document`,\n });\n}\n\nfunction reportedError<T extends LifecycleResult>(\n spec: OperationSpec<T>,\n result: T,\n): LifecycleError<T> {\n return new LifecycleError(\n {\n category: spec.category,\n phase: spec.phase,\n retryable: false,\n effect: spec.effectful ? \"acknowledged\" : \"none\",\n message: `${spec.name} reported failure`,\n },\n result,\n );\n}\n","import { createHash } from \"node:crypto\";\n\nimport { z } from \"zod\";\n\nimport { profileSchema } from \"./config.js\";\n\nconst MAX_IDENTIFIER_LENGTH = 255;\nconst MAX_TEXT_LENGTH = 4_096;\n\nconst safeTextSchema = z\n .string()\n .min(1)\n .max(MAX_TEXT_LENGTH)\n .refine((value) => value.trim().length > 0, { message: \"Value must not be blank\" })\n .refine((value) => !value.includes(\"\\0\") && !value.includes(\"\\n\") && !value.includes(\"\\r\"), {\n message: \"Value must not contain control characters\",\n });\n\nconst identifierSchema = z\n .string()\n .min(1)\n .max(MAX_IDENTIFIER_LENGTH)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/);\n\nconst environmentSchema = z\n .string()\n .min(1)\n .max(63)\n .regex(/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/);\n\nconst revisionSchema = z.string().regex(/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/);\nconst artifactIdentitySchema = z.string().regex(/^sha256:[0-9a-f]{64}$/);\nconst releaseIdentitySchema = identifierSchema;\n\nconst artifactPathSchema = safeTextSchema\n .refine(\n (value) =>\n !value.includes(\"\\\\\") &&\n !value.startsWith(\"/\") &&\n !/^[A-Za-z]:/u.test(value) &&\n !value.includes(\"?\") &&\n !value.includes(\"#\"),\n { message: \"Published artifact path must be a relative POSIX path\" },\n )\n .refine(\n (value) =>\n value !== \".\" &&\n value\n .split(\"/\")\n .every((segment) => segment.length > 0 && segment !== \".\" && segment !== \"..\"),\n { message: \"Published artifact path must be canonical and remain inside its artifact root\" },\n );\n\nconst repositoryPathSchema = z.string().regex(/^[a-z0-9]+(?:[._/-][a-z0-9]+)*$/u);\nconst repositorySchema = safeTextSchema.superRefine((value, context) => {\n if (/[\\s@?#]/u.test(value) || value.includes(\"://\")) {\n context.addIssue({\n code: \"custom\",\n message: \"Published repository must not contain credentials, tags or URL components\",\n });\n return;\n }\n\n const separator = value.indexOf(\"/\");\n if (separator <= 0 || !repositoryPathSchema.safeParse(value.slice(separator + 1)).success) {\n context.addIssue({\n code: \"custom\",\n message: \"Published repository must include a registry host and canonical repository path\",\n });\n return;\n }\n\n const host = value.slice(0, separator);\n try {\n const url = new URL(`https://${host}`);\n if (\n url.host !== host ||\n url.hostname.length === 0 ||\n url.username.length > 0 ||\n url.password.length > 0 ||\n url.pathname !== \"/\" ||\n url.search.length > 0 ||\n url.hash.length > 0\n ) {\n throw new Error();\n }\n } catch {\n context.addIssue({\n code: \"custom\",\n message: \"Published repository registry host is invalid\",\n });\n }\n});\n\nconst immutableReferenceSchema = safeTextSchema.refine((value) => !/[\\s?#]/u.test(value), {\n message: \"Published reference must be an immutable OCI reference\",\n});\n\nconst workloadSchema = z\n .string()\n .min(1)\n .max(63)\n .regex(/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/u);\n\nexport const attemptStateSchema = z.enum([\n \"configured\",\n \"validated\",\n \"verified-source\",\n \"built\",\n \"published\",\n \"publish-completed\",\n \"staged\",\n \"preflighted\",\n \"migrated\",\n \"activation-prepared\",\n \"activated\",\n \"healthy\",\n \"activation-finalized\",\n \"retaining\",\n \"completed\",\n \"failed\",\n \"preflight-failed\",\n \"migration-failed\",\n \"unhealthy\",\n \"rollback-pending\",\n \"rolled-back\",\n \"rollback-failed\",\n \"retention-failed\",\n \"effect-unknown\",\n]);\n\nexport const failureSchema = z.strictObject({\n category: z.enum([\n \"config\",\n \"source\",\n \"artifact\",\n \"registry-auth\",\n \"transport\",\n \"preflight\",\n \"migration\",\n \"activation\",\n \"health\",\n \"rollback\",\n \"retention\",\n \"reconciliation\",\n ]),\n phase: attemptStateSchema,\n retryable: z.boolean(),\n effect: z.enum([\"none\", \"acknowledged\", \"unknown\"]),\n message: safeTextSchema,\n});\n\nexport const transitionSchema = z.strictObject({\n state: attemptStateSchema,\n occurredAt: z.iso.datetime({ offset: true }),\n durationMs: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER),\n});\n\nconst artifactRefShape = {\n schemaVersion: z.literal(1),\n profile: profileSchema,\n revision: revisionSchema,\n kind: z.enum([\"directory\", \"oci\", \"oci-set\"]),\n identity: artifactIdentitySchema,\n location: safeTextSchema,\n};\n\nexport const artifactRefSchema = z.strictObject(artifactRefShape);\nexport const artifactSchema = z.strictObject({\n ...artifactRefShape,\n state: z.literal(\"built\"),\n});\n\nconst publishedBaseShape = {\n schemaVersion: z.literal(1),\n revision: revisionSchema,\n state: z.literal(\"published\"),\n};\n\nexport const publishedDirectoryArtifactSchema = z\n .strictObject({\n ...publishedBaseShape,\n profile: z.literal(\"static-files\"),\n kind: z.literal(\"directory\"),\n identity: artifactIdentitySchema,\n archive: artifactPathSchema,\n manifestFile: artifactPathSchema,\n })\n .superRefine((value, context) => {\n if (value.archive === value.manifestFile) {\n context.addIssue({\n code: \"custom\",\n path: [\"manifestFile\"],\n message: \"Published archive and manifest must be distinct files\",\n });\n }\n });\n\nexport const publishedImageArtifactSchema = z\n .strictObject({\n ...publishedBaseShape,\n profile: z.enum([\"static-nginx\", \"nuxt-node\", \"go-service\"]),\n kind: z.literal(\"oci\"),\n identity: artifactIdentitySchema,\n configDigest: artifactIdentitySchema,\n repository: repositorySchema,\n digest: artifactIdentitySchema,\n reference: immutableReferenceSchema,\n })\n .superRefine((value, context) => {\n if (value.identity !== value.digest) {\n context.addIssue({\n code: \"custom\",\n path: [\"digest\"],\n message: \"Published OCI digest must equal the artifact identity\",\n });\n }\n if (value.reference !== `${value.repository}@${value.digest}`) {\n context.addIssue({\n code: \"custom\",\n path: [\"reference\"],\n message: \"Published OCI reference must equal repository@digest\",\n });\n }\n });\n\nexport const publishedWorkloadSchema = z\n .strictObject({\n workload: workloadSchema,\n configDigest: artifactIdentitySchema,\n repository: repositorySchema,\n digest: artifactIdentitySchema,\n reference: immutableReferenceSchema,\n })\n .superRefine((value, context) => {\n if (value.reference !== `${value.repository}@${value.digest}`) {\n context.addIssue({\n code: \"custom\",\n path: [\"reference\"],\n message: \"Published workload reference must equal repository@digest\",\n });\n }\n });\n\n/** 已发布工作负载描述按固定字段顺序序列化,摘要可由生产者和消费者独立复算。 */\nexport function createPublishedStackIdentity(input: {\n readonly revision: string;\n readonly workloads: readonly PublishedWorkload[];\n}): string {\n const document = {\n schemaVersion: 1,\n revision: input.revision,\n workloads: input.workloads.map(({ workload, configDigest, repository, digest, reference }) => ({\n workload,\n configDigest,\n repository,\n digest,\n reference,\n })),\n };\n const contents = `${JSON.stringify(document)}\\n`;\n return `sha256:${createHash(\"sha256\").update(contents, \"utf8\").digest(\"hex\")}`;\n}\n\nexport const publishedStackArtifactSchema = z\n .strictObject({\n ...publishedBaseShape,\n profile: z.literal(\"compose-stack\"),\n kind: z.literal(\"oci-set\"),\n identity: artifactIdentitySchema,\n workloads: z.array(publishedWorkloadSchema).min(1).readonly(),\n })\n .superRefine((value, context) => {\n for (let index = 1; index < value.workloads.length; index += 1) {\n const previous = value.workloads[index - 1];\n const workload = value.workloads[index];\n if (!previous || !workload || previous.workload < workload.workload) continue;\n context.addIssue({\n code: \"custom\",\n path: [\"workloads\", index, \"workload\"],\n message: \"Published workloads must be unique and sorted by workload\",\n });\n }\n\n if (value.identity !== createPublishedStackIdentity(value)) {\n context.addIssue({\n code: \"custom\",\n path: [\"identity\"],\n message: \"Published OCI set identity must equal its canonical workload descriptor checksum\",\n });\n }\n });\n\nexport const publishedArtifactSchema = z.discriminatedUnion(\"kind\", [\n publishedDirectoryArtifactSchema,\n publishedImageArtifactSchema,\n publishedStackArtifactSchema,\n]);\n\nconst schemaEffectSchema = z.enum([\"none\", \"advanced\", \"partial\", \"unknown\"]);\n\nexport const migrationResultSchema = z\n .strictObject({\n schemaVersion: z.literal(1),\n status: z.enum([\"succeeded\", \"failed\"]),\n schemaEffect: schemaEffectSchema,\n previousCompatible: z.boolean(),\n ledgerBefore: safeTextSchema,\n ledgerAfter: safeTextSchema,\n })\n .superRefine((value, context) => {\n if (\n (value.schemaEffect === \"partial\" || value.schemaEffect === \"unknown\") &&\n value.previousCompatible\n ) {\n context.addIssue({\n code: \"custom\",\n path: [\"previousCompatible\"],\n message: \"Partial or unknown schema effects cannot remain rollback-compatible\",\n });\n }\n });\n\nexport const compatibilityResultSchema = z.strictObject({\n schemaVersion: z.literal(1),\n status: z.enum([\"compatible\", \"incompatible\"]),\n candidate: releaseIdentitySchema,\n currentLedger: safeTextSchema,\n reason: safeTextSchema,\n});\n\nconst reconciliationBaseShape = {\n schemaVersion: z.literal(1),\n observedRelease: releaseIdentitySchema.optional(),\n observedRoute: safeTextSchema.optional(),\n migrationLedger: safeTextSchema.optional(),\n};\n\nexport const reconciliationResultSchema = z.discriminatedUnion(\"status\", [\n z.strictObject({\n ...reconciliationBaseShape,\n status: z.literal(\"safe\"),\n }),\n z.strictObject({\n ...reconciliationBaseShape,\n status: z.literal(\"blocked\"),\n reason: safeTextSchema,\n }),\n]);\n\nexport type AttemptState = z.infer<typeof attemptStateSchema>;\nexport type Failure = z.infer<typeof failureSchema>;\nexport type Transition = z.infer<typeof transitionSchema>;\nexport type ArtifactRef = z.infer<typeof artifactRefSchema>;\nexport type Artifact = z.infer<typeof artifactSchema>;\nexport type PublishedDirectoryArtifact = z.infer<typeof publishedDirectoryArtifactSchema>;\nexport type PublishedImageArtifact = z.infer<typeof publishedImageArtifactSchema>;\nexport type PublishedWorkload = z.infer<typeof publishedWorkloadSchema>;\nexport type PublishedStackArtifact = z.infer<typeof publishedStackArtifactSchema>;\nexport type PublishedArtifact = z.infer<typeof publishedArtifactSchema>;\nexport type MigrationResult = z.infer<typeof migrationResultSchema>;\nexport type CompatibilityResult = z.infer<typeof compatibilityResultSchema>;\nexport type ReconciliationResult = z.infer<typeof reconciliationResultSchema>;\n\ntype ContractIssue = Readonly<{\n path: readonly (string | number)[];\n message: string;\n}>;\n\nconst PUBLISH_TRANSITIONS: Readonly<Partial<Record<AttemptState, readonly AttemptState[]>>> = {\n configured: [\"validated\"],\n validated: [\"verified-source\", \"published\"],\n \"verified-source\": [\"built\"],\n built: [\"published\"],\n published: [\"publish-completed\"],\n};\n\nconst RELEASE_TRANSITIONS: Readonly<Partial<Record<AttemptState, readonly AttemptState[]>>> = {\n configured: [\"validated\"],\n validated: [\"staged\", \"rollback-pending\"],\n staged: [\"preflighted\", \"preflight-failed\"],\n preflighted: [\"migrated\", \"migration-failed\"],\n migrated: [\"activation-prepared\"],\n \"activation-prepared\": [\"activated\"],\n activated: [\"activation-finalized\", \"rollback-pending\"],\n \"activation-finalized\": [\"healthy\", \"unhealthy\"],\n healthy: [\"retaining\"],\n retaining: [\"completed\", \"retention-failed\"],\n unhealthy: [\"rollback-pending\"],\n \"rollback-pending\": [\"rolled-back\", \"rollback-failed\"],\n};\n\nconst RELEASE_TERMINALS = new Set<AttemptState>([\n \"completed\",\n \"failed\",\n \"preflight-failed\",\n \"migration-failed\",\n \"rolled-back\",\n \"rollback-failed\",\n \"retention-failed\",\n \"effect-unknown\",\n]);\n\nfunction isLegalTransition(\n current: AttemptState,\n next: AttemptState,\n graph: Readonly<Partial<Record<AttemptState, readonly AttemptState[]>>>,\n): boolean {\n if (graph[current]?.includes(next)) return true;\n if (graph === RELEASE_TRANSITIONS && next === \"failed\") return !RELEASE_TERMINALS.has(current);\n if (graph === RELEASE_TRANSITIONS && next === \"effect-unknown\") {\n return current !== \"configured\" && !RELEASE_TERMINALS.has(current);\n }\n return false;\n}\n\nfunction validateHistory(\n transitions: readonly Transition[],\n terminal: AttemptState,\n graph: Readonly<Partial<Record<AttemptState, readonly AttemptState[]>>>,\n): ContractIssue[] {\n const issues: ContractIssue[] = [];\n\n if (transitions[0]?.state !== \"configured\") {\n issues.push({ path: [\"transitions\", 0, \"state\"], message: \"Receipt must start configured\" });\n }\n\n const finalIndex = transitions.length - 1;\n if (transitions[finalIndex]?.state !== terminal) {\n issues.push({\n path: [\"transitions\", finalIndex, \"state\"],\n message: \"Receipt terminal state must match its final transition\",\n });\n }\n\n for (let index = 1; index < transitions.length; index += 1) {\n const previous = transitions[index - 1];\n const current = transitions[index];\n if (!previous || !current) continue;\n\n if (!isLegalTransition(previous.state, current.state, graph)) {\n issues.push({\n path: [\"transitions\", index, \"state\"],\n message: `Illegal transition from ${previous.state} to ${current.state}`,\n });\n }\n\n if (Date.parse(current.occurredAt) < Date.parse(previous.occurredAt)) {\n issues.push({\n path: [\"transitions\", index, \"occurredAt\"],\n message: \"Transition timestamps must be nondecreasing\",\n });\n }\n }\n\n return issues;\n}\n\nconst receiptBaseShape = {\n schemaVersion: z.literal(1),\n attemptId: identifierSchema,\n environment: environmentSchema,\n revision: revisionSchema,\n artifact: publishedArtifactSchema,\n transitions: z.array(transitionSchema).min(2).readonly(),\n};\n\nfunction validateReceiptIdentity(value: {\n revision: string;\n artifact: PublishedArtifact;\n}): ContractIssue[] {\n if (value.revision === value.artifact.revision) return [];\n return [\n {\n path: [\"artifact\", \"revision\"],\n message: \"Receipt and artifact revisions must match\",\n },\n ];\n}\n\nexport const publishedReceiptSchema = z\n .strictObject({\n ...receiptBaseShape,\n state: z.literal(\"publish-completed\"),\n })\n .superRefine((value, context) => {\n const issues = [\n ...validateReceiptIdentity(value),\n ...validateHistory(value.transitions, value.state, PUBLISH_TRANSITIONS),\n ];\n for (const issue of issues) {\n context.addIssue({ code: \"custom\", path: [...issue.path], message: issue.message });\n }\n });\n\nconst releaseProjectionShape = {\n previous: releaseIdentitySchema.optional(),\n activated: releaseIdentitySchema.optional(),\n migration: migrationResultSchema.optional(),\n rollbackCompatibility: compatibilityResultSchema.optional(),\n reconciliation: reconciliationResultSchema.optional(),\n};\n\nconst completedReceiptSchema = z.strictObject({\n ...receiptBaseShape,\n state: z.literal(\"completed\"),\n previous: releaseIdentitySchema.optional(),\n activated: releaseIdentitySchema,\n migration: migrationResultSchema,\n rollbackCompatibility: compatibilityResultSchema.optional(),\n reconciliation: reconciliationResultSchema.optional(),\n});\n\nconst runtimeFailureReceiptShape = {\n ...receiptBaseShape,\n ...releaseProjectionShape,\n failure: failureSchema,\n};\n\nconst releaseTerminalSchema = z.discriminatedUnion(\"state\", [\n completedReceiptSchema,\n z.strictObject({ ...runtimeFailureReceiptShape, state: z.literal(\"failed\") }),\n z.strictObject({\n ...receiptBaseShape,\n state: z.literal(\"preflight-failed\"),\n previous: releaseIdentitySchema.optional(),\n failure: failureSchema,\n }),\n z.strictObject({\n ...receiptBaseShape,\n state: z.literal(\"migration-failed\"),\n previous: releaseIdentitySchema.optional(),\n migration: migrationResultSchema,\n failure: failureSchema,\n }),\n z.strictObject({\n ...receiptBaseShape,\n state: z.literal(\"rolled-back\"),\n previous: releaseIdentitySchema,\n activated: releaseIdentitySchema,\n migration: migrationResultSchema.optional(),\n rollbackCompatibility: compatibilityResultSchema,\n failure: failureSchema,\n }),\n z.strictObject({\n ...receiptBaseShape,\n state: z.literal(\"rollback-failed\"),\n previous: releaseIdentitySchema,\n activated: releaseIdentitySchema.optional(),\n migration: migrationResultSchema.optional(),\n rollbackCompatibility: compatibilityResultSchema,\n failure: failureSchema,\n }),\n z.strictObject({\n ...receiptBaseShape,\n state: z.literal(\"retention-failed\"),\n previous: releaseIdentitySchema.optional(),\n activated: releaseIdentitySchema,\n migration: migrationResultSchema,\n rollbackCompatibility: compatibilityResultSchema.optional(),\n failure: failureSchema,\n }),\n z.strictObject({ ...runtimeFailureReceiptShape, state: z.literal(\"effect-unknown\") }),\n]);\n\nexport const releaseReceiptSchema = releaseTerminalSchema.superRefine((value, context) => {\n const issues = [\n ...validateReceiptIdentity(value),\n ...validateHistory(value.transitions, value.state, RELEASE_TRANSITIONS),\n ];\n\n const migrated = value.transitions.some((transition) => transition.state === \"migrated\");\n if (migrated && !(\"migration\" in value && value.migration)) {\n issues.push({\n path: [\"migration\"],\n message: \"Receipts at or beyond migrated must include the migration result\",\n });\n }\n\n if (\"failure\" in value) {\n if (value.state === \"effect-unknown\" && value.failure.effect !== \"unknown\") {\n issues.push({\n path: [\"failure\", \"effect\"],\n message: \"An effect-unknown terminal requires an unknown effect\",\n });\n }\n if (value.state !== \"effect-unknown\" && value.failure.effect === \"unknown\") {\n issues.push({\n path: [\"failure\", \"effect\"],\n message: \"An unknown effect must terminate as effect-unknown\",\n });\n }\n }\n\n for (const issue of issues) {\n context.addIssue({ code: \"custom\", path: [...issue.path], message: issue.message });\n }\n});\n\nexport type PublishedReceipt = z.infer<typeof publishedReceiptSchema>;\nexport type ReleaseReceipt = z.infer<typeof releaseReceiptSchema>;\n","import { isDeepStrictEqual } from \"node:util\";\n\nimport { z } from \"zod\";\n\nimport { artifactKind, assertCompatible, assertConfig, type Operation } from \"./compatibility.js\";\nimport {\n configSchema,\n environmentSchema,\n loadConfig,\n type Config,\n type ConfigInput,\n type Environment,\n} from \"./config.js\";\nimport {\n artifactRefSchema,\n artifactSchema,\n publishedArtifactSchema,\n type Artifact,\n type ArtifactRef,\n type PublishedArtifact,\n type PublishedDirectoryArtifact,\n type PublishedImageArtifact,\n type PublishedStackArtifact,\n} from \"./receipt.js\";\n\ntype Frozen<T> = T extends readonly (infer Item)[]\n ? readonly Frozen<Item>[]\n : T extends object\n ? { readonly [Key in keyof T]: Frozen<T[Key]> }\n : T;\n\nexport interface Plan {\n readonly config: Frozen<Config>;\n readonly environmentName: string;\n readonly environment: Frozen<Environment>;\n}\n\nexport interface ReleasePlan extends Plan {\n readonly revision: string;\n}\n\nexport interface PlanInput {\n readonly config: ConfigInput;\n readonly environmentName: string;\n readonly operation: Operation;\n readonly env: Readonly<Record<string, string | undefined>>;\n}\n\nexport interface ReleasePlanInput extends PlanInput {\n readonly revision: string;\n}\n\nexport interface ArtifactInput {\n readonly identity: string;\n readonly location: string;\n}\n\nexport type PublishedInput =\n | Pick<PublishedDirectoryArtifact, \"kind\" | \"identity\" | \"archive\" | \"manifestFile\">\n | Pick<\n PublishedImageArtifact,\n \"kind\" | \"identity\" | \"configDigest\" | \"repository\" | \"digest\" | \"reference\"\n >\n | Pick<PublishedStackArtifact, \"kind\" | \"identity\" | \"workloads\">;\n\ntype ArtifactBinding = Pick<ArtifactRef, \"profile\" | \"revision\" | \"kind\">;\n\nexport type PlanErrorCode =\n | \"artifact_identity_mismatch\"\n | \"artifact_kind_mismatch\"\n | \"artifact_profile_mismatch\"\n | \"artifact_revision_mismatch\";\n\n/** 计划错误只描述不可变合同的冲突,不携带制品内容或凭据。 */\nexport class PlanError extends Error {\n constructor(\n readonly code: PlanErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"PlanError\";\n }\n}\n\nconst revisionSchema = artifactRefSchema.shape.revision;\n\nconst planShape = {\n config: configSchema,\n environmentName: z.string(),\n environment: environmentSchema,\n};\n\nexport const planSchema = z.strictObject(planShape).superRefine(validateEnvironmentBinding);\n\nexport const releasePlanSchema = z\n .strictObject({ ...planShape, revision: revisionSchema })\n .superRefine(validateEnvironmentBinding);\n\nconst parsedArtifactRefSchema = artifactRefSchema.superRefine(assertArtifactContract);\nconst parsedArtifactSchema = artifactSchema.superRefine(assertArtifactContract);\nconst parsedPublishedArtifactSchema = publishedArtifactSchema.superRefine(assertArtifactContract);\n\n/** 从已验证配置创建一次操作使用的不可变执行计划。 */\nexport function createPlan(input: PlanInput): Plan {\n const config = loadConfig(input.config, {\n environmentName: input.environmentName,\n env: input.env,\n });\n assertConfig(config);\n const environment = assertCompatible(config, input.environmentName, input.operation);\n return freeze({ config, environmentName: input.environmentName, environment });\n}\n\n/** 创建携带完整修订标识的不可变发布计划。 */\nexport function createReleasePlan(input: ReleasePlanInput): ReleasePlan {\n const plan = createPlan(input);\n const revision = revisionSchema.parse(input.revision);\n return freeze({ ...plan, revision });\n}\n\n/** 将外部计划文档重新绑定到配置内的唯一环境对象。 */\nexport function parsePlan(input: unknown, operation: Operation): Plan {\n const parsed = planSchema.parse(input);\n assertConfig(parsed.config);\n const environment = assertCompatible(parsed.config, parsed.environmentName, operation);\n return freeze({\n config: parsed.config,\n environmentName: parsed.environmentName,\n environment,\n });\n}\n\n/** 将外部发布计划重新绑定到配置内的唯一环境对象和完整修订。 */\nexport function parseReleasePlan(input: unknown, operation: Operation): ReleasePlan {\n const parsed = releasePlanSchema.parse(input);\n assertConfig(parsed.config);\n const environment = assertCompatible(parsed.config, parsed.environmentName, operation);\n return freeze({\n config: parsed.config,\n environmentName: parsed.environmentName,\n environment,\n revision: parsed.revision,\n });\n}\n\n/** 验证无状态的制品引用并冻结其标量元数据。 */\nexport function parseArtifactRef(input: unknown): Frozen<ArtifactRef> {\n return freeze(parsedArtifactRefSchema.parse(input));\n}\n\n/** 验证构建阶段写出的制品元数据。 */\nexport function parseArtifact(input: unknown): Frozen<Artifact> {\n return freeze(parsedArtifactSchema.parse(input));\n}\n\n/** 验证发布阶段写出的不可变制品元数据。 */\nexport function parsePublishedArtifact(input: unknown): Frozen<PublishedArtifact> {\n return freeze(parsedPublishedArtifactSchema.parse(input));\n}\n\n/** 制品适配器只提供已计算的身份和位置,其余字段由计划锁定。 */\nexport function createArtifact(plan: ReleasePlan, input: ArtifactInput): Frozen<Artifact> {\n const artifact = parseArtifact({\n schemaVersion: 1,\n profile: plan.config.profile,\n revision: plan.revision,\n kind: artifactKind(plan.config.profile),\n identity: input.identity,\n location: input.location,\n state: \"built\",\n });\n assertArtifact(plan, artifact);\n return artifact;\n}\n\n/** 发布投影复用严格判别合同,并保持计划与已验证构建结果的绑定。 */\nexport function createPublishedArtifact(\n plan: ReleasePlan,\n artifactInput: unknown,\n input: PublishedInput,\n): Frozen<PublishedArtifact> {\n const artifact = parseArtifact(artifactInput);\n assertArtifact(plan, artifact);\n\n if (input.kind !== artifact.kind) {\n throw new PlanError(\n \"artifact_kind_mismatch\",\n \"Published artifact kind must equal the verified built artifact kind\",\n );\n }\n\n if (input.kind !== \"oci-set\" && input.identity !== artifact.identity) {\n throw new PlanError(\n \"artifact_identity_mismatch\",\n \"Published artifact must remain bound to the verified built identity\",\n );\n }\n\n const published = parsePublishedArtifact({\n schemaVersion: 1,\n profile: artifact.profile,\n revision: artifact.revision,\n state: \"published\",\n ...input,\n });\n assertArtifact(plan, published);\n return published;\n}\n\n/** 每次跨阶段消费制品时重新核对计划绑定。 */\nexport function assertArtifact(plan: ReleasePlan, artifact: Readonly<ArtifactBinding>): void {\n if (artifact.profile !== plan.config.profile) {\n throw new PlanError(\n \"artifact_profile_mismatch\",\n \"Artifact profile must equal the execution plan profile\",\n );\n }\n if (artifact.revision !== plan.revision) {\n throw new PlanError(\n \"artifact_revision_mismatch\",\n \"Artifact revision must equal the execution plan revision\",\n );\n }\n if (artifact.kind !== artifactKind(plan.config.profile)) {\n throw new PlanError(\n \"artifact_kind_mismatch\",\n \"Artifact kind must equal the execution plan artifact kind\",\n );\n }\n}\n\nfunction assertArtifactContract(artifact: ArtifactBinding, context: z.RefinementCtx): void {\n if (artifact.kind === artifactKind(artifact.profile)) return;\n context.addIssue({\n code: \"custom\",\n path: [\"kind\"],\n message: \"Artifact kind must match its profile\",\n });\n}\n\nfunction validateEnvironmentBinding(\n value: Pick<Plan, \"config\" | \"environment\" | \"environmentName\">,\n context: z.RefinementCtx,\n): void {\n const selected = value.config.environments[value.environmentName];\n if (!selected) {\n context.addIssue({\n code: \"custom\",\n path: [\"environmentName\"],\n message: \"Plan environment must exist in its configuration\",\n });\n return;\n }\n\n if (!isDeepStrictEqual(value.environment, selected)) {\n context.addIssue({\n code: \"custom\",\n path: [\"environment\"],\n message: \"Plan environment must equal the selected configuration environment\",\n });\n }\n}\n\nfunction freeze<T>(value: T): Frozen<T> {\n if (value === null || typeof value !== \"object\") return value as Frozen<T>;\n for (const nested of Object.values(value)) freeze(nested);\n return Object.freeze(value) as Frozen<T>;\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { lstat, readFile, realpath, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\n\nimport { z } from \"zod\";\n\nimport type { Profile } from \"./config.js\";\nimport { assertArtifact, createArtifact, type ReleasePlan } from \"./plan.js\";\nimport type { ProcessOptions, ProcessRunner } from \"./process.js\";\nimport { artifactSchema } from \"./receipt.js\";\n\nconst MAX_PATH_LENGTH = 4_096;\nconst MAX_METADATA_BYTES = 4 * 1024 * 1024;\n\nexport const BUILD_RESULT_PATH_ENV = \"STACKONWARD_BUILD_RESULT_PATH\";\n\nconst identitySchema = artifactSchema.shape.identity;\nconst revisionSchema = artifactSchema.shape.revision;\n\nconst filePathSchema = z\n .string()\n .min(1)\n .max(MAX_PATH_LENGTH)\n .refine((value) => !value.includes(\"\\0\") && !value.includes(\"\\n\") && !value.includes(\"\\r\"), {\n message: \"Build output path must not contain control characters\",\n })\n .refine(\n (value) =>\n !value.includes(\"\\\\\") &&\n !path.posix.isAbsolute(value) &&\n !path.win32.isAbsolute(value) &&\n !/^[A-Za-z]:/u.test(value),\n { message: \"Build output path must be a relative POSIX path\" },\n )\n .refine(\n (value) =>\n path.posix.normalize(value) === value &&\n value !== \".\" &&\n !value.split(\"/\").some((segment) => segment === \"..\" || segment.length === 0),\n { message: \"Build output path must be canonical and remain inside its artifact root\" },\n );\n\nconst referenceSchema = z\n .string()\n .min(1)\n .max(MAX_PATH_LENGTH)\n .refine((value) => !value.includes(\"\\0\") && !/[\\r\\n\\s]/u.test(value), {\n message: \"Image reference must not contain whitespace or control characters\",\n });\n\nconst workloadSchema = z\n .string()\n .min(1)\n .max(63)\n .regex(/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/u);\n\nexport const directoryOutputSchema = z.strictObject({\n kind: z.literal(\"directory\"),\n archive: filePathSchema,\n manifestFile: filePathSchema,\n identity: identitySchema,\n});\n\nexport const imageOutputSchema = z.strictObject({\n kind: z.literal(\"oci\"),\n reference: referenceSchema,\n metadataFile: filePathSchema,\n identity: identitySchema,\n});\n\nexport const workloadOutputSchema = z.strictObject({\n workload: workloadSchema,\n reference: referenceSchema,\n metadataFile: filePathSchema,\n identity: identitySchema,\n});\n\nfunction validateWorkloadOrder(\n value: { readonly workloads: readonly z.infer<typeof workloadOutputSchema>[] },\n context: z.RefinementCtx,\n): void {\n for (let index = 0; index < value.workloads.length; index += 1) {\n const workload = value.workloads[index];\n const previous = value.workloads[index - 1];\n if (!workload || !previous || previous.workload < workload.workload) continue;\n context.addIssue({\n code: \"custom\",\n path: [\"workloads\", index, \"workload\"],\n message: \"Workload outputs must be unique and sorted by workload\",\n });\n }\n}\n\nexport const stackOutputSchema = z\n .strictObject({\n kind: z.literal(\"oci-set\"),\n manifestFile: filePathSchema,\n workloads: z.array(workloadOutputSchema).min(1).readonly(),\n identity: identitySchema,\n })\n .superRefine(validateWorkloadOrder);\n\nexport const buildOutputSchema = z.union([\n directoryOutputSchema,\n imageOutputSchema,\n stackOutputSchema,\n]);\n\nconst directoryCandidateSchema = z.strictObject({\n schemaVersion: z.literal(1),\n ...directoryOutputSchema.shape,\n});\n\nconst imageCandidateSchema = z.strictObject({\n schemaVersion: z.literal(1),\n ...imageOutputSchema.shape,\n});\n\nconst stackCandidateSchema = z\n .strictObject({\n schemaVersion: z.literal(1),\n ...stackOutputSchema.shape,\n })\n .superRefine(validateWorkloadOrder);\n\nexport const buildCandidateSchema = z.discriminatedUnion(\"kind\", [\n directoryCandidateSchema,\n imageCandidateSchema,\n stackCandidateSchema,\n]);\n\nconst directoryArtifactSchema = artifactSchema.extend({ kind: z.literal(\"directory\") });\nconst imageArtifactSchema = artifactSchema.extend({ kind: z.literal(\"oci\") });\nconst stackArtifactSchema = artifactSchema.extend({ kind: z.literal(\"oci-set\") });\n\nexport const buildResultSchema = z\n .union([\n z.strictObject({\n schemaVersion: z.literal(1),\n artifact: directoryArtifactSchema,\n output: directoryOutputSchema,\n }),\n z.strictObject({\n schemaVersion: z.literal(1),\n artifact: imageArtifactSchema,\n output: imageOutputSchema,\n }),\n z.strictObject({\n schemaVersion: z.literal(1),\n artifact: stackArtifactSchema,\n output: stackOutputSchema,\n }),\n ])\n .superRefine((value, context) => {\n if (value.artifact.identity !== value.output.identity) {\n context.addIssue({\n code: \"custom\",\n path: [\"output\", \"identity\"],\n message: \"Build output identity must equal its artifact identity\",\n });\n }\n\n const location =\n value.output.kind === \"directory\"\n ? value.output.archive\n : value.output.kind === \"oci\"\n ? value.output.reference\n : value.output.manifestFile;\n if (value.artifact.location !== location) {\n context.addIssue({\n code: \"custom\",\n path: [\"artifact\", \"location\"],\n message: \"Artifact location must equal the primary build output location\",\n });\n }\n });\n\nexport const directoryManifestSchema = z.strictObject({\n schemaVersion: z.literal(1),\n revision: revisionSchema,\n archive: filePathSchema,\n identity: identitySchema,\n});\n\nconst stackManifestWorkloadSchema = z.strictObject({\n workload: workloadSchema,\n reference: referenceSchema,\n identity: identitySchema,\n});\n\nexport const stackManifestSchema = z.strictObject({\n schemaVersion: z.literal(1),\n revision: revisionSchema,\n workloads: z.array(stackManifestWorkloadSchema).min(1).readonly(),\n});\n\nexport const buildxMetadataSchema = z\n .object({\n \"containerimage.config.digest\": identitySchema.optional(),\n \"containerimage.digest\": identitySchema,\n \"containerimage.descriptor\": z\n .object({\n digest: identitySchema,\n })\n .passthrough()\n .optional(),\n })\n .passthrough()\n .superRefine((value, context) => {\n const descriptorIdentity = value[\"containerimage.descriptor\"]?.digest;\n if (descriptorIdentity === undefined || descriptorIdentity === value[\"containerimage.digest\"]) {\n return;\n }\n context.addIssue({\n code: \"custom\",\n path: [\"containerimage.descriptor\", \"digest\"],\n message: \"Buildx descriptor digest must equal the image digest\",\n });\n });\n\n/** Buildx 官方可拉取身份是 containerimage.digest;config.digest 只是配置 blob。 */\nexport async function readBuildxImageDigest(metadataPath: string): Promise<string> {\n const { document } = await readDocument(\n metadataPath,\n buildxMetadataSchema,\n \"image_metadata_invalid\",\n \"Docker Buildx metadata is invalid\",\n );\n return document[\"containerimage.digest\"];\n}\n\nexport type DirectoryOutput = z.infer<typeof directoryOutputSchema>;\nexport type ImageOutput = z.infer<typeof imageOutputSchema>;\nexport type WorkloadOutput = z.infer<typeof workloadOutputSchema>;\nexport type StackOutput = z.infer<typeof stackOutputSchema>;\nexport type BuildOutput = z.infer<typeof buildOutputSchema>;\nexport type BuildCandidate = z.infer<typeof buildCandidateSchema>;\nexport type BuildResult = z.infer<typeof buildResultSchema>;\nexport type DirectoryManifest = z.infer<typeof directoryManifestSchema>;\nexport type StackManifest = z.infer<typeof stackManifestSchema>;\n\nexport interface BuildContext {\n readonly projectRoot: string;\n readonly artifactRoot: string;\n readonly resultPath: string;\n readonly process: ProcessRunner;\n readonly registry: Readonly<{ readonly host: string; readonly namespace: string }>;\n readonly processEnv: Readonly<Record<string, string>>;\n readonly timeoutMs: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface ProfileAdapter {\n readonly id: Profile;\n build(plan: ReleasePlan, context: BuildContext): Promise<BuildResult>;\n}\n\nexport type ProfileErrorCode =\n | \"artifact_root_invalid\"\n | \"artifact_root_outside_project\"\n | \"directory_checksum_mismatch\"\n | \"directory_manifest_invalid\"\n | \"directory_manifest_mismatch\"\n | \"image_digest_mismatch\"\n | \"image_metadata_invalid\"\n | \"output_file_invalid\"\n | \"output_path_outside_root\"\n | \"project_root_invalid\"\n | \"result_file_exists\"\n | \"result_file_invalid\"\n | \"result_path_invalid\"\n | \"result_path_outside_root\"\n | \"result_write_failed\"\n | \"stack_identity_mismatch\"\n | \"stack_manifest_invalid\"\n | \"stack_manifest_mismatch\";\n\n/** 构建结果错误只暴露稳定分类,不泄漏本机路径或工具输出。 */\nexport class ProfileError extends Error {\n constructor(\n readonly code: ProfileErrorCode,\n message: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"ProfileError\";\n }\n}\n\n/** 目录清单使用确定性 JSON,构建与发布阶段可以独立复算同一校验合同。 */\nexport function serializeDirectoryManifest(input: DirectoryManifest): string {\n return `${JSON.stringify(directoryManifestSchema.parse(input))}\\n`;\n}\n\n/** 工作负载清单使用确定性 JSON,其字节摘要就是 OCI 集合的制品身份。 */\nexport function serializeStackManifest(input: StackManifest): string {\n return `${JSON.stringify(stackManifestSchema.parse(input))}\\n`;\n}\n\n/** 构建命令只能通过协调器保留的结果路径交付机器可读元数据。 */\nexport async function createBuildProcessOptions(context: BuildContext): Promise<ProcessOptions> {\n const paths = await resolveBuildPaths(context);\n await assertResultAbsent(paths.resultPath);\n return Object.freeze({\n cwd: paths.projectRoot,\n env: Object.freeze({\n ...context.processEnv,\n [BUILD_RESULT_PATH_ENV]: paths.resultPath,\n }),\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n}\n\n/** 内置适配器使用同一原子写入协议,避免产生第二种候选结果格式。 */\nexport async function writeBuildCandidate(\n context: BuildContext,\n input: BuildCandidate,\n): Promise<void> {\n const paths = await resolveBuildPaths(context);\n await assertResultAbsent(paths.resultPath);\n const candidate = buildCandidateSchema.parse(input);\n const temporary = `${paths.resultPath}.${randomUUID()}`;\n\n try {\n await writeFile(temporary, `${JSON.stringify(candidate)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n await rename(temporary, paths.resultPath);\n } catch (error) {\n await rm(temporary, { force: true }).catch(() => undefined);\n throw new ProfileError(\"result_write_failed\", \"Build candidate cannot be written\", {\n cause: error,\n });\n }\n}\n\n/** 适配器只从协调器指定的文件恢复候选结果,再绑定不可变执行计划。 */\nexport async function readBuildCandidate(\n plan: ReleasePlan,\n context: BuildContext,\n): Promise<BuildResult> {\n const paths = await resolveBuildPaths(context);\n const resultFile = await resolveResultFile(paths.resultPath);\n const { document } = await readDocument(\n resultFile,\n buildCandidateSchema,\n \"result_file_invalid\",\n \"Build candidate is invalid\",\n );\n const output = candidateOutput(document);\n const location =\n output.kind === \"directory\"\n ? output.archive\n : output.kind === \"oci\"\n ? output.reference\n : output.manifestFile;\n const artifact = createArtifact(plan, { identity: output.identity, location });\n return parseBuildResult(plan, context, { schemaVersion: 1, artifact, output });\n}\n\n/** 从不可信落盘元数据恢复构建结果,并重新验证计划绑定、文件边界和内容身份。 */\nexport async function parseBuildResult(\n plan: ReleasePlan,\n context: BuildContext,\n input: unknown,\n): Promise<BuildResult> {\n const result = buildResultSchema.parse(input);\n assertArtifact(plan, result.artifact);\n const artifactRoot = await resolveArtifactRoot(context);\n\n if (result.output.kind === \"directory\") {\n await verifyDirectory(plan, artifactRoot, result.output);\n } else if (result.output.kind === \"oci\") {\n await verifyImage(artifactRoot, result.output);\n } else {\n await verifyStack(plan, artifactRoot, result.output);\n }\n\n return freezeResult(result);\n}\n\nasync function resolveArtifactRoot(context: BuildContext): Promise<string> {\n const projectRoot = await resolveDirectory(\n context.projectRoot,\n \"project_root_invalid\",\n \"Project root must be an accessible directory\",\n );\n const artifactRoot = await resolveDirectory(\n context.artifactRoot,\n \"artifact_root_invalid\",\n \"Artifact root must be an accessible directory\",\n );\n if (!isInside(projectRoot, artifactRoot)) {\n throw new ProfileError(\n \"artifact_root_outside_project\",\n \"Artifact root must remain inside the project root\",\n );\n }\n return artifactRoot;\n}\n\ninterface BuildPaths {\n readonly projectRoot: string;\n readonly artifactRoot: string;\n readonly resultPath: string;\n}\n\nasync function resolveBuildPaths(context: BuildContext): Promise<BuildPaths> {\n const projectRoot = await resolveDirectory(\n context.projectRoot,\n \"project_root_invalid\",\n \"Project root must be an accessible directory\",\n );\n const artifactRoot = await resolveDirectory(\n context.artifactRoot,\n \"artifact_root_invalid\",\n \"Artifact root must be an accessible directory\",\n );\n if (!isInside(projectRoot, artifactRoot)) {\n throw new ProfileError(\n \"artifact_root_outside_project\",\n \"Artifact root must remain inside the project root\",\n );\n }\n\n const resultPath = await resolveResultPath(context.resultPath, artifactRoot);\n return { projectRoot, artifactRoot, resultPath };\n}\n\nasync function resolveResultPath(value: string, artifactRoot: string): Promise<string> {\n if (\n value.length === 0 ||\n value.length > MAX_PATH_LENGTH ||\n value.includes(\"\\0\") ||\n value.includes(\"\\n\") ||\n value.includes(\"\\r\") ||\n !path.isAbsolute(value) ||\n path.normalize(value) !== value\n ) {\n throw new ProfileError(\n \"result_path_invalid\",\n \"Build result path must be a canonical absolute path\",\n );\n }\n\n let parent: string;\n try {\n parent = await realpath(path.dirname(value));\n if (!(await stat(parent)).isDirectory()) throw new Error(\"not a directory\");\n } catch (error) {\n throw new ProfileError(\n \"result_path_invalid\",\n \"Build result parent must be an accessible directory\",\n { cause: error },\n );\n }\n if (!isInside(artifactRoot, parent)) {\n throw new ProfileError(\n \"result_path_outside_root\",\n \"Build result parent must remain inside the artifact root\",\n );\n }\n const resultPath = path.join(parent, path.basename(value));\n if (resultPath === artifactRoot || !isInside(artifactRoot, resultPath)) {\n throw new ProfileError(\n \"result_path_outside_root\",\n \"Build result path must remain inside the artifact root\",\n );\n }\n return resultPath;\n}\n\nasync function assertResultAbsent(resultPath: string): Promise<void> {\n try {\n await lstat(resultPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw new ProfileError(\"result_file_invalid\", \"Build result path cannot be inspected\", {\n cause: error,\n });\n }\n throw new ProfileError(\"result_file_exists\", \"Build result path must not already exist\");\n}\n\nasync function resolveResultFile(resultPath: string): Promise<string> {\n try {\n if (!(await lstat(resultPath)).isFile()) throw new Error(\"not a regular file\");\n const resolved = await realpath(resultPath);\n if (resolved !== resultPath) throw new Error(\"not the declared result file\");\n return resolved;\n } catch (error) {\n throw new ProfileError(\"result_file_invalid\", \"Build result must be a regular file\", {\n cause: error,\n });\n }\n}\n\nasync function resolveDirectory(\n value: string,\n code: Extract<ProfileErrorCode, \"artifact_root_invalid\" | \"project_root_invalid\">,\n message: string,\n): Promise<string> {\n try {\n const resolved = await realpath(path.resolve(value));\n if (!(await stat(resolved)).isDirectory()) throw new Error(\"not a directory\");\n return resolved;\n } catch (error) {\n throw new ProfileError(code, message, { cause: error });\n }\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (relative !== \"..\" && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative))\n );\n}\n\nasync function resolveOutputFile(root: string, relative: string): Promise<string> {\n const expected = path.resolve(root, ...relative.split(\"/\"));\n let resolved: string;\n try {\n resolved = await realpath(expected);\n } catch (error) {\n throw new ProfileError(\"output_file_invalid\", \"Build output file is unavailable\", {\n cause: error,\n });\n }\n if (!isInside(root, resolved)) {\n throw new ProfileError(\n \"output_path_outside_root\",\n \"Build output file must remain inside the artifact root\",\n );\n }\n try {\n if (!(await stat(resolved)).isFile()) throw new Error(\"not a file\");\n } catch (error) {\n throw new ProfileError(\"output_file_invalid\", \"Build output must be a regular file\", {\n cause: error,\n });\n }\n return resolved;\n}\n\nasync function verifyDirectory(\n plan: ReleasePlan,\n artifactRoot: string,\n output: DirectoryOutput,\n): Promise<void> {\n const archive = await resolveOutputFile(artifactRoot, output.archive);\n const identity = await digestFile(archive);\n if (identity !== output.identity) {\n throw new ProfileError(\n \"directory_checksum_mismatch\",\n \"Directory archive checksum must equal its build output identity\",\n );\n }\n\n const manifestFile = await resolveOutputFile(artifactRoot, output.manifestFile);\n const { document, contents } = await readDocument(\n manifestFile,\n directoryManifestSchema,\n \"directory_manifest_invalid\",\n \"Directory checksum manifest is invalid\",\n );\n const expected: DirectoryManifest = {\n schemaVersion: 1,\n revision: plan.revision,\n archive: output.archive,\n identity: output.identity,\n };\n if (!isDeepStrictEqual(document, expected) || contents !== serializeDirectoryManifest(expected)) {\n throw new ProfileError(\n \"directory_manifest_mismatch\",\n \"Directory checksum manifest must match the exact plan and archive identity\",\n );\n }\n}\n\nasync function verifyImage(artifactRoot: string, output: ImageOutput): Promise<void> {\n const metadataFile = await resolveOutputFile(artifactRoot, output.metadataFile);\n await verifyImageMetadata(metadataFile, output.identity);\n}\n\nasync function verifyStack(\n plan: ReleasePlan,\n artifactRoot: string,\n output: StackOutput,\n): Promise<void> {\n for (const workload of output.workloads) {\n const metadataFile = await resolveOutputFile(artifactRoot, workload.metadataFile);\n await verifyImageMetadata(metadataFile, workload.identity);\n }\n\n const manifestFile = await resolveOutputFile(artifactRoot, output.manifestFile);\n const { document, contents } = await readDocument(\n manifestFile,\n stackManifestSchema,\n \"stack_manifest_invalid\",\n \"OCI set manifest is invalid\",\n );\n const expected: StackManifest = {\n schemaVersion: 1,\n revision: plan.revision,\n workloads: output.workloads.map(({ workload, reference, identity }) => ({\n workload,\n reference,\n identity,\n })),\n };\n if (!isDeepStrictEqual(document, expected) || contents !== serializeStackManifest(expected)) {\n throw new ProfileError(\n \"stack_manifest_mismatch\",\n \"OCI set manifest must match the exact plan and workload identities\",\n );\n }\n if (digestText(contents) !== output.identity) {\n throw new ProfileError(\n \"stack_identity_mismatch\",\n \"OCI set identity must equal its canonical manifest checksum\",\n );\n }\n}\n\nasync function verifyImageMetadata(filename: string, expectedIdentity: string): Promise<void> {\n const { document } = await readDocument(\n filename,\n buildxMetadataSchema,\n \"image_metadata_invalid\",\n \"Docker Buildx metadata is invalid\",\n );\n if (document[\"containerimage.digest\"] !== expectedIdentity) {\n throw new ProfileError(\n \"image_digest_mismatch\",\n \"Docker Buildx image digest must equal the build output identity\",\n );\n }\n}\n\nasync function readDocument<Result>(\n filename: string,\n schema: z.ZodType<Result>,\n code: Extract<\n ProfileErrorCode,\n | \"directory_manifest_invalid\"\n | \"image_metadata_invalid\"\n | \"result_file_invalid\"\n | \"stack_manifest_invalid\"\n >,\n message: string,\n): Promise<{ readonly document: Result; readonly contents: string }> {\n try {\n const file = await stat(filename);\n if (file.size > MAX_METADATA_BYTES) throw new Error(\"metadata exceeds limit\");\n const contents = await readFile(filename, \"utf8\");\n const document = schema.parse(JSON.parse(contents) as unknown);\n return { document, contents };\n } catch (error) {\n throw new ProfileError(code, message, { cause: error });\n }\n}\n\nfunction candidateOutput(candidate: BuildCandidate): BuildOutput {\n if (candidate.kind === \"directory\") {\n return directoryOutputSchema.parse({\n kind: candidate.kind,\n archive: candidate.archive,\n manifestFile: candidate.manifestFile,\n identity: candidate.identity,\n });\n }\n if (candidate.kind === \"oci\") {\n return imageOutputSchema.parse({\n kind: candidate.kind,\n reference: candidate.reference,\n metadataFile: candidate.metadataFile,\n identity: candidate.identity,\n });\n }\n return stackOutputSchema.parse({\n kind: candidate.kind,\n manifestFile: candidate.manifestFile,\n workloads: candidate.workloads,\n identity: candidate.identity,\n });\n}\n\nasync function digestFile(filename: string): Promise<string> {\n const hash = createHash(\"sha256\");\n try {\n for await (const chunk of createReadStream(filename)) hash.update(chunk);\n } catch (error) {\n throw new ProfileError(\"output_file_invalid\", \"Build output file cannot be read\", {\n cause: error,\n });\n }\n return `sha256:${hash.digest(\"hex\")}`;\n}\n\nfunction digestText(contents: string): string {\n return `sha256:${createHash(\"sha256\").update(contents, \"utf8\").digest(\"hex\")}`;\n}\n\nfunction freezeResult(result: BuildResult): BuildResult {\n Object.freeze(result.artifact);\n if (result.output.kind === \"oci-set\") {\n for (const workload of result.output.workloads) Object.freeze(workload);\n Object.freeze(result.output.workloads);\n }\n Object.freeze(result.output);\n return Object.freeze(result);\n}\n","import { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { lstat, mkdir, open, realpath, rename, rm } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isDeepStrictEqual, TextDecoder } from \"node:util\";\n\nimport { z } from \"zod\";\n\nimport { lifecycleObservationSchema } from \"./lifecycle.js\";\nimport { artifactRefSchema, attemptStateSchema, reconciliationResultSchema } from \"./receipt.js\";\n\nconst MAX_STATE_BYTES = 1024 * 1024;\n\nconst attemptIdSchema = z\n .string()\n .min(1)\n .max(255)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/);\n\nexport const effectIntentSchema = z.strictObject({\n schemaVersion: z.literal(1),\n attemptId: attemptIdSchema,\n phase: attemptStateSchema,\n artifact: artifactRefSchema.shape.identity,\n recordedAt: z.iso.datetime({ offset: true }),\n});\n\nexport const effectObservationSchema = z.strictObject({\n schemaVersion: z.literal(1),\n attemptId: attemptIdSchema,\n phase: attemptStateSchema,\n status: z.enum([\"acknowledged\", \"unknown\"]),\n observedAt: z.iso.datetime({ offset: true }),\n});\n\nexport const environmentStateSchema = z.strictObject({\n schemaVersion: z.literal(1),\n status: z.enum([\"safe\", \"blocked\"]),\n pending: effectIntentSchema.optional(),\n lastReceipt: attemptIdSchema.optional(),\n});\n\nexport const reconciliationInputSchema = z.strictObject({\n attemptId: attemptIdSchema,\n pending: effectIntentSchema.nullable(),\n result: reconciliationResultSchema,\n lifecycle: lifecycleObservationSchema,\n});\n\nconst lockSchema = z.strictObject({\n schemaVersion: z.literal(1),\n token: z.uuid(),\n pid: z.number().int().positive(),\n acquiredAt: z.iso.datetime({ offset: true }),\n});\n\nexport type EffectIntent = z.infer<typeof effectIntentSchema>;\nexport type EffectObservation = z.infer<typeof effectObservationSchema>;\nexport type EnvironmentState = z.infer<typeof environmentStateSchema>;\nexport type ReconciliationInput = z.infer<typeof reconciliationInputSchema>;\n\nexport type StateErrorCode =\n | \"backend_unlocked\"\n | \"environment_blocked\"\n | \"intent_pending\"\n | \"lock_lost\"\n | \"locked\"\n | \"observation_stale\"\n | \"reconciliation_mismatch\"\n | \"reconciliation_stale\"\n | \"session_closed\"\n | \"state_corrupt\"\n | \"state_directory_invalid\"\n | \"state_path_invalid\"\n | \"state_unreadable\"\n | \"state_write_failed\";\n\n/** 状态错误使用稳定分类,避免把目标路径或持久化内容带入诊断。 */\nexport class StateError extends Error {\n constructor(\n readonly code: StateErrorCode,\n message: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"StateError\";\n }\n}\n\nexport interface Options {\n readonly now?: () => Date;\n readonly token?: () => string;\n}\n\n/** 锁定视图是状态机唯一允许执行原子写入的后端能力。 */\nexport interface LockedStoreBackend {\n read(): Promise<string | null>;\n writeAtomic(document: string): Promise<void>;\n}\n\n/** 后端负责把读取和原子写入绑定到同一个排他锁生命周期。 */\nexport interface StoreBackend extends LockedStoreBackend {\n withLock<Result>(operation: (backend: LockedStoreBackend) => Promise<Result>): Promise<Result>;\n}\n\nexport interface StateCodec<State> {\n parse(document: string | null): Readonly<State>;\n serialize(state: Readonly<State>): string;\n}\n\nexport interface TypedSession<State> {\n load(): Promise<Readonly<State>>;\n save(state: Readonly<State>): Promise<void>;\n}\n\nexport interface TypedStore<State> {\n load(): Promise<Readonly<State>>;\n withLock<Result>(operation: (session: TypedSession<State>) => Promise<Result>): Promise<Result>;\n}\n\nexport interface Session {\n load(): Promise<Readonly<EnvironmentState>>;\n recordIntent(input: unknown): Promise<Readonly<EnvironmentState>>;\n acknowledge(input: unknown): Promise<Readonly<EnvironmentState>>;\n block(attemptId: string): Promise<Readonly<EnvironmentState>>;\n reconcile(input: unknown): Promise<Readonly<EnvironmentState>>;\n}\n\nexport interface Store {\n load(): Promise<Readonly<EnvironmentState>>;\n withLock<Result>(operation: (session: Session) => Promise<Result>): Promise<Result>;\n}\n\ninterface Files {\n readonly directory: string;\n readonly state: string;\n readonly lock: string;\n}\n\nconst INITIAL_STATE: EnvironmentState = Object.freeze({ schemaVersion: 1, status: \"safe\" });\n\n/** 类型化状态存储只负责把编解码绑定到既有排他锁,不改变后端锁语义。 */\nexport function createTypedStore<State>(\n backend: StoreBackend,\n codec: StateCodec<State>,\n): TypedStore<State> {\n return {\n load: async () => codec.parse(await backend.read()),\n withLock: (operation) =>\n backend.withLock(async (locked) => {\n let active = true;\n const assertActive = (): void => {\n if (!active) {\n throw new StateError(\n \"session_closed\",\n \"State session cannot be used after its lock is released\",\n );\n }\n };\n const session: TypedSession<State> = {\n load: async () => {\n assertActive();\n return codec.parse(await locked.read());\n },\n save: async (state) => {\n assertActive();\n await locked.writeAtomic(codec.serialize(state));\n },\n };\n try {\n return await operation(session);\n } finally {\n active = false;\n }\n }),\n };\n}\n\n/** 状态机只消费原子后端,目标位置和传输生命周期由组合层决定。 */\nexport function createStore(backend: StoreBackend): Store {\n return {\n load: () => readState(backend),\n withLock: (operation) =>\n backend.withLock(async (locked) => {\n let active = true;\n const session = createSession(locked, () => active);\n try {\n return await operation(session);\n } finally {\n active = false;\n }\n }),\n };\n}\n\n/** 文件后端仅用于调用方明确选择的本地状态位置,并拒绝锁外写入。 */\nexport function createFileBackend(filename: string, options: Options = {}): StoreBackend {\n const files = resolveFiles(filename);\n const now = options.now ?? (() => new Date());\n const token = options.token ?? randomUUID;\n\n return {\n async read() {\n const resolved = await prepare(files);\n return readDocument(resolved.state);\n },\n async writeAtomic() {\n throw new StateError(\n \"backend_unlocked\",\n \"Deployment state cannot be written outside its owned lock\",\n );\n },\n async withLock(operation) {\n const resolved = await prepare(files);\n const release = await acquire(resolved.lock, now, token);\n let active = true;\n const assertActive = (): void => {\n if (!active) {\n throw new StateError(\n \"backend_unlocked\",\n \"Deployment state backend cannot be used after its lock is released\",\n );\n }\n };\n const locked: LockedStoreBackend = {\n read: () => {\n assertActive();\n return readDocument(resolved.state);\n },\n writeAtomic: (document) => {\n assertActive();\n return writeDocument(resolved, document, token);\n },\n };\n let outcome:\n | { readonly ok: true; readonly value: Awaited<ReturnType<typeof operation>> }\n | { readonly ok: false; readonly error: unknown };\n\n try {\n outcome = { ok: true, value: await operation(locked) };\n } catch (error) {\n outcome = { ok: false, error };\n }\n active = false;\n\n try {\n await release();\n } catch (releaseError) {\n if (!outcome.ok) {\n throw new StateError(\"lock_lost\", \"Deployment state lock could not be released\", {\n cause: new AggregateError([outcome.error, releaseError]),\n });\n }\n throw releaseError;\n }\n\n if (!outcome.ok) throw outcome.error;\n return outcome.value;\n },\n };\n}\n\nfunction createSession(backend: LockedStoreBackend, isActive: () => boolean): Session {\n const assertActive = (): void => {\n if (!isActive()) {\n throw new StateError(\n \"session_closed\",\n \"Deployment state session cannot be used after its lock is released\",\n );\n }\n };\n\n return {\n load: () => {\n assertActive();\n return readState(backend);\n },\n recordIntent: async (input) => {\n assertActive();\n const intent = effectIntentSchema.parse(input);\n return update(backend, (state) => {\n if (state.status === \"blocked\") {\n throw new StateError(\n \"environment_blocked\",\n \"Blocked environment requires reconciliation before another effect\",\n );\n }\n if (state.pending) {\n throw new StateError(\n \"intent_pending\",\n \"An effect intent is already pending for this environment\",\n );\n }\n return { ...state, pending: intent };\n });\n },\n acknowledge: async (input) => {\n assertActive();\n const observation = effectObservationSchema.parse(input);\n return update(backend, (state) => acknowledge(state, observation));\n },\n block: async (attemptId) => {\n assertActive();\n const parsedAttemptId = attemptIdSchema.parse(attemptId);\n return update(backend, (state) => {\n if (state.pending && state.pending.attemptId !== parsedAttemptId) {\n throw new StateError(\n \"observation_stale\",\n \"A stale attempt cannot block the current environment operation\",\n );\n }\n return { ...state, status: \"blocked\", lastReceipt: parsedAttemptId };\n });\n },\n reconcile: async (input) => {\n assertActive();\n const reconciliation = reconciliationInputSchema.parse(input);\n const state = await readState(backend);\n const expectedPending = reconciliation.pending ?? undefined;\n if (!isDeepStrictEqual(state.pending, expectedPending)) {\n throw new StateError(\n \"reconciliation_stale\",\n \"Reconciliation cannot replace state observed for another effect\",\n );\n }\n\n const ledgerMatches =\n reconciliation.result.migrationLedger === reconciliation.lifecycle.migrationLedger;\n const safe =\n reconciliation.result.status === \"safe\" &&\n reconciliation.lifecycle.status === \"clean\" &&\n ledgerMatches;\n const next = environmentStateSchema.parse(\n safe\n ? {\n schemaVersion: state.schemaVersion,\n status: \"safe\",\n lastReceipt: reconciliation.attemptId,\n }\n : {\n ...state,\n status: \"blocked\",\n lastReceipt: reconciliation.attemptId,\n },\n );\n await writeState(backend, next);\n\n if (reconciliation.result.status === \"safe\" && !safe) {\n throw new StateError(\n \"reconciliation_mismatch\",\n \"Safe reconciliation does not match the observed lifecycle state\",\n );\n }\n return freezeState(next);\n },\n };\n}\n\nfunction acknowledge(state: EnvironmentState, observation: EffectObservation): EnvironmentState {\n const pending = state.pending;\n if (\n !pending ||\n pending.attemptId !== observation.attemptId ||\n pending.phase !== observation.phase ||\n Date.parse(observation.observedAt) < Date.parse(pending.recordedAt)\n ) {\n throw new StateError(\n \"observation_stale\",\n \"Effect observation does not match the current pending intent\",\n );\n }\n\n if (observation.status === \"unknown\") {\n return {\n ...state,\n status: \"blocked\",\n lastReceipt: observation.attemptId,\n };\n }\n\n return {\n schemaVersion: state.schemaVersion,\n status: state.status,\n ...(state.lastReceipt === undefined ? {} : { lastReceipt: state.lastReceipt }),\n };\n}\n\nasync function update(\n backend: LockedStoreBackend,\n project: (state: EnvironmentState) => EnvironmentState,\n): Promise<Readonly<EnvironmentState>> {\n const current = await readState(backend);\n const next = environmentStateSchema.parse(project(current));\n await writeState(backend, next);\n return freezeState(next);\n}\n\nfunction resolveFiles(filename: string): Files {\n if (\n filename.length === 0 ||\n filename.includes(\"\\0\") ||\n filename.includes(\"\\n\") ||\n filename.includes(\"\\r\") ||\n !path.isAbsolute(filename)\n ) {\n throw new StateError(\n \"state_path_invalid\",\n \"Deployment state file must be an absolute filesystem path\",\n );\n }\n\n const state = path.resolve(filename);\n const basename = path.basename(state);\n if (basename.length === 0 || basename === \".\" || basename === \"..\") {\n throw new StateError(\"state_path_invalid\", \"Deployment state file path is invalid\");\n }\n return {\n directory: path.dirname(state),\n state,\n lock: `${state}.lock`,\n };\n}\n\nasync function prepare(files: Files): Promise<Files> {\n try {\n await mkdir(files.directory, { recursive: true, mode: 0o700 });\n const info = await lstat(files.directory);\n if (!info.isDirectory() || info.isSymbolicLink()) {\n throw new StateError(\n \"state_directory_invalid\",\n \"Deployment state owner must be a real directory\",\n );\n }\n const directory = await realpath(files.directory);\n return {\n directory,\n state: path.join(directory, path.basename(files.state)),\n lock: path.join(directory, path.basename(files.lock)),\n };\n } catch (error) {\n if (error instanceof StateError) throw error;\n throw new StateError(\n \"state_directory_invalid\",\n \"Deployment state directory could not be prepared\",\n { cause: error },\n );\n }\n}\n\nasync function readState(backend: LockedStoreBackend): Promise<Readonly<EnvironmentState>> {\n const document = await backend.read();\n if (document === null) return INITIAL_STATE;\n if (Buffer.byteLength(document, \"utf8\") > MAX_STATE_BYTES) {\n throw new StateError(\"state_corrupt\", \"Deployment state exceeds its size limit\");\n }\n\n let input: unknown;\n try {\n input = JSON.parse(document) as unknown;\n } catch (error) {\n throw new StateError(\"state_corrupt\", \"Deployment state is not valid JSON\", {\n cause: error,\n });\n }\n\n const parsed = environmentStateSchema.safeParse(input);\n if (!parsed.success) {\n throw new StateError(\"state_corrupt\", \"Deployment state violates its schema\", {\n cause: parsed.error,\n });\n }\n return freezeState(parsed.data);\n}\n\nasync function writeState(backend: LockedStoreBackend, state: EnvironmentState): Promise<void> {\n const document = `${JSON.stringify(state, null, 2)}\\n`;\n if (Buffer.byteLength(document, \"utf8\") > MAX_STATE_BYTES) {\n throw new StateError(\"state_write_failed\", \"Deployment state exceeds its size limit\");\n }\n await backend.writeAtomic(document);\n}\n\nasync function readDocument(filename: string): Promise<string | null> {\n let info;\n try {\n info = await lstat(filename);\n } catch (error) {\n if (isErrorCode(error, \"ENOENT\")) return null;\n throw new StateError(\"state_unreadable\", \"Deployment state could not be read\", {\n cause: error,\n });\n }\n if (!info.isFile() || info.isSymbolicLink() || info.size > MAX_STATE_BYTES) {\n throw new StateError(\"state_unreadable\", \"Deployment state file is not a bounded regular file\");\n }\n\n let handle;\n try {\n handle = await open(filename, constants.O_RDONLY | constants.O_NOFOLLOW);\n const opened = await handle.stat();\n if (!opened.isFile() || opened.size > MAX_STATE_BYTES) {\n throw new StateError(\n \"state_unreadable\",\n \"Deployment state file is not a bounded regular file\",\n );\n }\n const buffer = Buffer.alloc(MAX_STATE_BYTES + 1);\n const { bytesRead } = await handle.read(buffer, 0, buffer.byteLength, 0);\n if (bytesRead > MAX_STATE_BYTES) {\n throw new StateError(\"state_unreadable\", \"Deployment state file exceeds its size limit\");\n }\n try {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(buffer.subarray(0, bytesRead));\n } catch (error) {\n throw new StateError(\"state_corrupt\", \"Deployment state is not valid UTF-8\", {\n cause: error,\n });\n }\n } catch (error) {\n if (error instanceof StateError) throw error;\n throw new StateError(\"state_unreadable\", \"Deployment state could not be read\", {\n cause: error,\n });\n } finally {\n await handle?.close();\n }\n}\n\nasync function writeDocument(\n files: Files,\n document: string,\n createToken: () => string,\n): Promise<void> {\n if (Buffer.byteLength(document, \"utf8\") > MAX_STATE_BYTES) {\n throw new StateError(\"state_write_failed\", \"Deployment state exceeds its size limit\");\n }\n const token = lockSchema.shape.token.parse(createToken());\n const temporary = path.join(\n files.directory,\n `.${path.basename(files.state)}.${process.pid}.${token}.tmp`,\n );\n let created = false;\n\n try {\n const handle = await open(temporary, \"wx\", 0o600);\n created = true;\n try {\n await handle.writeFile(document);\n await handle.sync();\n } finally {\n await handle.close();\n }\n await rename(temporary, files.state);\n created = false;\n\n const directory = await open(files.directory, \"r\");\n try {\n await directory.sync();\n } finally {\n await directory.close();\n }\n } catch (error) {\n if (created) {\n try {\n await rm(temporary, { force: true });\n } catch (cleanupError) {\n throw new StateError(\"state_write_failed\", \"Deployment state write cleanup failed\", {\n cause: new AggregateError([error, cleanupError]),\n });\n }\n }\n throw new StateError(\"state_write_failed\", \"Deployment state could not be persisted\", {\n cause: error,\n });\n }\n}\n\nasync function acquire(\n filename: string,\n now: () => Date,\n createToken: () => string,\n): Promise<() => Promise<void>> {\n const token = lockSchema.shape.token.parse(createToken());\n const acquiredAt = timestamp(now);\n let handle;\n\n try {\n handle = await open(filename, \"wx\", 0o600);\n } catch (error) {\n if (isErrorCode(error, \"EEXIST\")) {\n throw new StateError(\"locked\", \"Deployment environment is already locked\", {\n cause: error,\n });\n }\n throw new StateError(\"locked\", \"Deployment environment lock could not be acquired\", {\n cause: error,\n });\n }\n\n try {\n await handle.writeFile(\n `${JSON.stringify({ schemaVersion: 1, token, pid: process.pid, acquiredAt })}\\n`,\n );\n await handle.sync();\n } catch (error) {\n try {\n await handle.close();\n await rm(filename, { force: true });\n } catch (cleanupError) {\n throw new StateError(\"lock_lost\", \"Deployment environment lock cleanup failed\", {\n cause: new AggregateError([error, cleanupError]),\n });\n }\n throw new StateError(\"locked\", \"Deployment environment lock could not be recorded\", {\n cause: error,\n });\n }\n await handle.close();\n\n return async () => {\n let current: unknown;\n try {\n const document = await readDocument(filename);\n if (document === null) throw new Error(\"lock absent\");\n current = JSON.parse(document) as unknown;\n } catch (error) {\n throw new StateError(\"lock_lost\", \"Deployment environment lock is no longer readable\", {\n cause: error,\n });\n }\n const parsed = lockSchema.safeParse(current);\n if (!parsed.success || parsed.data.token !== token) {\n throw new StateError(\"lock_lost\", \"Deployment environment lock ownership changed\", {\n cause: parsed.success ? undefined : parsed.error,\n });\n }\n try {\n await rm(filename);\n } catch (error) {\n throw new StateError(\"lock_lost\", \"Deployment environment lock could not be released\", {\n cause: error,\n });\n }\n };\n}\n\nfunction timestamp(now: () => Date): string {\n const value = now();\n if (!Number.isFinite(value.getTime())) {\n throw new StateError(\"state_write_failed\", \"Deployment clock returned an invalid time\");\n }\n return value.toISOString();\n}\n\nfunction isErrorCode(error: unknown, code: string): boolean {\n return error instanceof Error && \"code\" in error && error.code === code;\n}\n\nfunction freezeState(value: EnvironmentState): Readonly<EnvironmentState> {\n if (value.pending) Object.freeze(value.pending);\n return Object.freeze(value);\n}\n","import path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { portBindingsSchema, type Target } from \"./config.js\";\nimport type { Plan, ReleasePlan } from \"./plan.js\";\nimport { artifactRefSchema, publishedArtifactSchema, type PublishedArtifact } from \"./receipt.js\";\nimport { effectIntentSchema } from \"./safety.js\";\n\nconst MAX_PATH_LENGTH = 4_096;\nconst MAX_TEXT_LENGTH = 4_096;\nconst ENVIRONMENT_NAME = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;\nconst RELEASE_ID = /^(?:[0-9a-f]{40}|[0-9a-f]{64})--sha256-[0-9a-f]{64}$/;\n\nconst environmentNameSchema = z.string().min(1).max(63).regex(ENVIRONMENT_NAME);\nconst revisionSchema = artifactRefSchema.shape.revision;\nconst attemptIdSchema = effectIntentSchema.shape.attemptId;\nconst releaseArtifactSchema = publishedArtifactSchema.readonly();\nconst artifactRootSchema = z\n .string()\n .min(1)\n .max(MAX_PATH_LENGTH)\n .refine((value) => !value.includes(\"\\0\") && !value.includes(\"\\n\") && !value.includes(\"\\r\"), {\n message: \"Artifact root must not contain control characters\",\n })\n .refine(\n (value) =>\n path.isAbsolute(value) && path.normalize(value) === value && value !== path.parse(value).root,\n { message: \"Artifact root must be a canonical absolute non-root path\" },\n );\nconst migrationLedgerSchema = z\n .string()\n .min(1)\n .max(MAX_TEXT_LENGTH)\n .refine((value) => value.trim().length > 0, { message: \"Migration ledger must not be blank\" })\n .refine((value) => !value.includes(\"\\0\") && !value.includes(\"\\n\") && !value.includes(\"\\r\"), {\n message: \"Migration ledger must not contain control characters\",\n });\nconst signalSchema = z.custom<AbortSignal>(\n (value) => typeof AbortSignal !== \"undefined\" && value instanceof AbortSignal,\n \"Signal must be an AbortSignal\",\n);\n\nexport const releaseIdentitySchema = z.string().regex(RELEASE_ID);\n\nexport const directoryProjectionSchema = z\n .strictObject({\n kind: z.literal(\"directory\"),\n archive: z.literal(\"payload/archive.tar\"),\n manifest: z.literal(\"payload/manifest.json\"),\n content: z.literal(\"payload/public\"),\n })\n .readonly();\n\nconst composeSourceFileSchema = z\n .string()\n .min(1)\n .max(MAX_PATH_LENGTH)\n .regex(/^compose\\/[0-9]{3,}\\.yaml$/);\nconst composePortsFileSchema = z.union([\n z.literal(\"compose/ports.yaml\"),\n z.literal(\"compose/ports-blue.yaml\"),\n z.literal(\"compose/ports-green.yaml\"),\n]);\nconst composeFileSchema = z.union([composeSourceFileSchema, composePortsFileSchema]);\n\nexport const composeProjectionSchema = z\n .strictObject({\n kind: z.literal(\"compose\"),\n files: z.tuple([composeFileSchema], composeFileSchema).readonly(),\n images: z.literal(\"compose/images.json\"),\n ports: z.literal(\"compose/ports.yaml\").optional(),\n bindings: portBindingsSchema.optional(),\n slotPorts: z\n .strictObject({\n blue: z.literal(\"compose/ports-blue.yaml\"),\n green: z.literal(\"compose/ports-green.yaml\"),\n })\n .optional(),\n slotBindings: z\n .strictObject({\n blue: portBindingsSchema,\n green: portBindingsSchema,\n })\n .optional(),\n })\n .superRefine((value, context) => {\n const hasPorts = value.ports !== undefined;\n const hasBindings = value.bindings !== undefined;\n const hasSlotPorts = value.slotPorts !== undefined;\n const hasSlotBindings = value.slotBindings !== undefined;\n if (hasPorts !== hasBindings || hasSlotPorts !== hasSlotBindings) {\n context.addIssue({\n code: \"custom\",\n path: [hasPorts ? \"bindings\" : hasSlotPorts ? \"slotBindings\" : \"ports\"],\n message: \"Compose port projections and bindings must be present together\",\n });\n }\n if (hasPorts && hasSlotPorts) {\n context.addIssue({\n code: \"custom\",\n path: [\"slotPorts\"],\n message: \"Compose projection cannot mix regular and slot port projections\",\n });\n }\n const portFileCount = hasSlotPorts ? 2 : hasPorts ? 1 : 0;\n const sourceCount = value.files.length - portFileCount;\n if (sourceCount < 1) {\n context.addIssue({\n code: \"custom\",\n path: [\"files\"],\n message: \"Compose projection must include at least one product source\",\n });\n }\n if (hasPorts && value.files.at(-1) !== value.ports) {\n context.addIssue({\n code: \"custom\",\n path: [\"files\", value.files.length - 1],\n message: \"Compose ports projection must follow every product source\",\n });\n }\n if (hasSlotPorts) {\n const slotPorts = value.slotPorts;\n if (!slotPorts) return;\n if (value.files.at(-2) !== slotPorts.blue) {\n context.addIssue({\n code: \"custom\",\n path: [\"files\", value.files.length - 2],\n message: \"Blue slot ports projection must follow every product source\",\n });\n }\n if (value.files.at(-1) !== slotPorts.green) {\n context.addIssue({\n code: \"custom\",\n path: [\"files\", value.files.length - 1],\n message: \"Green slot ports projection must follow the blue slot projection\",\n });\n }\n }\n for (let index = 0; index < sourceCount; index += 1) {\n const expected = `compose/${String(index).padStart(3, \"0\")}.yaml`;\n if (value.files[index] === expected) continue;\n context.addIssue({\n code: \"custom\",\n path: [\"files\", index],\n message: \"Compose projection files must be complete and ordered by source position\",\n });\n }\n })\n .readonly();\n\nexport const releaseProjectionSchema = z\n .discriminatedUnion(\"kind\", [directoryProjectionSchema, composeProjectionSchema])\n .readonly();\n\nconst releaseRecordShape = {\n schemaVersion: z.literal(1),\n releaseId: releaseIdentitySchema,\n environment: environmentNameSchema,\n revision: revisionSchema,\n artifact: releaseArtifactSchema,\n projection: releaseProjectionSchema,\n stagedAt: z.iso.datetime({ offset: true }),\n};\n\nfunction expectedReleaseIdentity(value: {\n readonly revision: string;\n readonly artifact: Pick<PublishedArtifact, \"identity\">;\n}): string {\n return `${value.revision}--${value.artifact.identity.replace(\":\", \"-\")}`;\n}\n\nfunction validateReleaseRecord(\n value: z.infer<z.ZodObject<typeof releaseRecordShape>>,\n context: z.RefinementCtx,\n): void {\n if (value.releaseId !== expectedReleaseIdentity(value)) {\n context.addIssue({\n code: \"custom\",\n path: [\"releaseId\"],\n message: \"Release identity must bind the complete revision and published artifact identity\",\n });\n }\n\n if (value.revision !== value.artifact.revision) {\n context.addIssue({\n code: \"custom\",\n path: [\"artifact\", \"revision\"],\n message: \"Release and published artifact revisions must match\",\n });\n }\n\n const expectedProjection = value.artifact.kind === \"directory\" ? \"directory\" : \"compose\";\n if (value.projection.kind !== expectedProjection) {\n context.addIssue({\n code: \"custom\",\n path: [\"projection\", \"kind\"],\n message: \"Release projection must match the published artifact kind\",\n });\n }\n}\n\nexport const releaseRecordSchema = z\n .strictObject(releaseRecordShape)\n .superRefine(validateReleaseRecord)\n .readonly();\n\nexport const observedReleaseSchema = z\n .strictObject({\n ...releaseRecordShape,\n health: z.enum([\"healthy\", \"unhealthy\", \"unknown\"]),\n migrationLedger: migrationLedgerSchema.optional(),\n })\n .superRefine(validateReleaseRecord)\n .readonly();\n\nexport const targetObservationSchema = z\n .strictObject({\n schemaVersion: z.literal(1),\n current: observedReleaseSchema.optional(),\n previous: observedReleaseSchema.optional(),\n })\n .superRefine((value, context) => {\n if (value.current && value.previous && value.current.releaseId === value.previous.releaseId) {\n context.addIssue({\n code: \"custom\",\n path: [\"previous\", \"releaseId\"],\n message: \"Current and previous releases must have distinct identities\",\n });\n }\n\n if (\n value.current &&\n value.previous &&\n value.current.environment !== value.previous.environment\n ) {\n context.addIssue({\n code: \"custom\",\n path: [\"previous\", \"environment\"],\n message: \"Current and previous releases must belong to the same environment\",\n });\n }\n })\n .readonly();\n\nexport const stagedReleaseSchema = z\n .strictObject({\n ...releaseRecordShape,\n previous: observedReleaseSchema.optional(),\n })\n .superRefine((value, context) => {\n validateReleaseRecord(value, context);\n if (value.previous?.releaseId === value.releaseId) {\n context.addIssue({\n code: \"custom\",\n path: [\"previous\", \"releaseId\"],\n message: \"Staged and previous releases must have distinct identities\",\n });\n }\n if (value.previous && value.previous.environment !== value.environment) {\n context.addIssue({\n code: \"custom\",\n path: [\"previous\", \"environment\"],\n message: \"Staged and previous releases must belong to the same environment\",\n });\n }\n })\n .readonly();\n\nfunction validateOrderedIdentities(\n values: readonly string[],\n context: z.RefinementCtx,\n pathPrefix: string,\n): void {\n for (let index = 1; index < values.length; index += 1) {\n const previous = values[index - 1];\n const current = values[index];\n if (!previous || !current || previous < current) continue;\n context.addIssue({\n code: \"custom\",\n path: [pathPrefix, index],\n message: \"Release identities must be unique and sorted\",\n });\n }\n}\n\nconst releaseSetSchema = z.array(releaseIdentitySchema).readonly();\n\nexport const retentionResultSchema = z\n .strictObject({\n schemaVersion: z.literal(1),\n status: z.enum([\"succeeded\", \"failed\"]),\n removed: releaseSetSchema,\n protected: releaseSetSchema,\n })\n .superRefine((value, context) => {\n validateOrderedIdentities(value.removed, context, \"removed\");\n validateOrderedIdentities(value.protected, context, \"protected\");\n const protectedReleases = new Set(value.protected);\n for (let index = 0; index < value.removed.length; index += 1) {\n const releaseId = value.removed[index];\n if (!releaseId || !protectedReleases.has(releaseId)) continue;\n context.addIssue({\n code: \"custom\",\n path: [\"removed\", index],\n message: \"A protected release cannot be reported as removed\",\n });\n }\n })\n .readonly();\n\nconst targetContextShape = {\n attemptId: attemptIdSchema,\n signal: signalSchema.optional(),\n};\n\nexport const targetContextSchema = z.strictObject(targetContextShape).readonly();\n\nexport const observeContextSchema = targetContextSchema;\n\nexport const stageContextSchema = z\n .strictObject({\n ...targetContextShape,\n artifactRoot: artifactRootSchema,\n stagedAt: z.iso.datetime({ offset: true }),\n })\n .readonly();\n\nexport const retainContextSchema = z\n .strictObject({\n ...targetContextShape,\n protectedReleases: releaseSetSchema,\n })\n .superRefine((value, context) => {\n validateOrderedIdentities(value.protectedReleases, context, \"protectedReleases\");\n })\n .readonly();\n\nexport type ReleaseIdentity = z.infer<typeof releaseIdentitySchema>;\nexport type DirectoryProjection = z.infer<typeof directoryProjectionSchema>;\nexport type ComposeProjection = z.infer<typeof composeProjectionSchema>;\nexport type ReleaseProjection = z.infer<typeof releaseProjectionSchema>;\nexport type ReleaseRecord = z.infer<typeof releaseRecordSchema>;\nexport type ObservedRelease = z.infer<typeof observedReleaseSchema>;\nexport type TargetObservation = z.infer<typeof targetObservationSchema>;\nexport type StagedRelease = z.infer<typeof stagedReleaseSchema>;\nexport type RetentionResult = z.infer<typeof retentionResultSchema>;\nexport type TargetContext = z.infer<typeof targetContextSchema>;\nexport type ObserveContext = z.infer<typeof observeContextSchema>;\nexport type StageContext = z.infer<typeof stageContextSchema>;\nexport type RetainContext = z.infer<typeof retainContextSchema>;\n\nexport interface TargetAdapter {\n readonly id: Target;\n observe(plan: Plan, context: ObserveContext): Promise<TargetObservation>;\n readRelease(\n plan: Plan,\n releaseId: ReleaseIdentity,\n context: ObserveContext,\n ): Promise<ObservedRelease>;\n stage(\n plan: ReleasePlan,\n artifact: PublishedArtifact,\n context: StageContext,\n ): Promise<StagedRelease>;\n retain(plan: Plan, context: RetainContext): Promise<RetentionResult>;\n}\n\nconst releaseIdentityInputSchema = z\n .strictObject({\n revision: revisionSchema,\n artifact: publishedArtifactSchema,\n })\n .refine((value) => value.revision === value.artifact.revision, {\n path: [\"artifact\", \"revision\"],\n message: \"Release and published artifact revisions must match\",\n });\n\n/** 发布制品和完整修订共同生成唯一、可逆且不会截断的发布身份。 */\nexport function createReleaseIdentity(input: {\n readonly revision: string;\n readonly artifact: PublishedArtifact;\n}): ReleaseIdentity {\n const value = releaseIdentityInputSchema.parse(input);\n return releaseIdentitySchema.parse(expectedReleaseIdentity(value));\n}\n","import { mkdtemp, rm, stat, symlink, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\n\nimport { z } from \"zod\";\n\nimport type { ProcessFailure, ProcessFailureReason, ProcessRunner } from \"../process.js\";\nimport type { Failure } from \"../receipt.js\";\n\nconst MAX_REFERENCE_LENGTH = 4_096;\nconst MAX_TIMEOUT_MS = 2_147_483_647;\nconst DIGEST_FORMAT = \"{{json .Manifest.Digest}}\";\nconst CONFIG_DIGEST_FORMAT = \"{{json .Id}}\";\nconst LOCAL_DIGESTS_FORMAT = \"{{json .RepoDigests}}\";\nconst AUTHENTICATION_BACKOFF_CAPS_MS = [250, 1_000] as const;\n\nconst digestSchema = z.string().regex(/^sha256:[0-9a-f]{64}$/);\nconst localDigestsSchema = z.array(z.string());\nconst manifestSchema = z\n .object({\n config: z.object({ digest: digestSchema }).passthrough(),\n })\n .passthrough();\nconst imageIndexSchema = z\n .object({\n manifests: z\n .array(\n z\n .object({\n digest: digestSchema,\n mediaType: z.string().optional(),\n platform: z\n .object({\n os: z.string().optional(),\n architecture: z.string().optional(),\n })\n .passthrough()\n .optional(),\n })\n .passthrough(),\n )\n .min(1),\n })\n .passthrough();\nconst repositoryPathSchema = z.string().regex(/^[a-z0-9]+(?:[._/-][a-z0-9]+)*$/);\nconst tagSchema = z.string().regex(/^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/);\n\nexport type RegistryOperation = \"authenticate\" | \"inspect\" | \"pull\" | \"push\";\nexport type RegistryEffect = Failure[\"effect\"];\nexport type RegistryCredentialCleanup = \"not-required\" | \"succeeded\" | \"failed\";\n\nexport type RegistryErrorCode =\n | \"authentication_failed\"\n | \"credential_cleanup_failed\"\n | \"credential_scope_failed\"\n | \"digest_mismatch\"\n | \"inspect_failed\"\n | \"inspect_output_invalid\"\n | \"invalid_credentials\"\n | \"invalid_options\"\n | \"invalid_reference\"\n | \"pull_failed\"\n | \"pull_output_invalid\"\n | \"push_effect_unknown\"\n | \"push_failed\"\n | \"transport_failed\";\n\nexport class RegistryError extends Error {\n constructor(\n readonly code: RegistryErrorCode,\n readonly operation: RegistryOperation,\n readonly effect: RegistryEffect,\n readonly retryable: boolean,\n readonly credentialCleanup: RegistryCredentialCleanup = \"not-required\",\n ) {\n super(code);\n this.name = \"RegistryError\";\n }\n}\n\nexport interface RegistryCredentials {\n readonly host: string;\n readonly username: string;\n readonly password: string;\n}\n\nexport interface RegistryOptions {\n readonly credentials: RegistryCredentials;\n readonly cwd: string;\n readonly env: Readonly<Record<string, string>>;\n readonly timeoutMs: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface PushInput {\n readonly reference: string;\n readonly expectedDigest: string;\n}\n\nexport interface PullInput {\n readonly repository: string;\n readonly digest: string;\n}\n\nexport interface RegistryImage {\n readonly repository: string;\n readonly digest: string;\n readonly configDigest: string;\n readonly reference: string;\n}\n\nexport interface RegistryPort {\n inspect(reference: string, options: RegistryOptions): Promise<RegistryImage>;\n pull(input: PullInput, options: RegistryOptions): Promise<RegistryImage>;\n push(input: PushInput, options: RegistryOptions): Promise<RegistryImage>;\n}\n\ninterface AuthenticatedOptions {\n readonly cwd: string;\n readonly env: Readonly<Record<string, string>>;\n readonly timeoutMs: number;\n readonly signal?: AbortSignal;\n readonly redactions: readonly string[];\n}\n\nconst RETRYABLE_PROCESS_FAILURES = new Set<ProcessFailureReason>([\"spawn\", \"timeout\"]);\nconst RETRYABLE_AUTHENTICATION_FAILURES = new Set<ProcessFailureReason>([\n \"exit\",\n \"spawn\",\n \"timeout\",\n]);\n\n/** 注册表适配器只返回已观察的 OCI 摘要,凭据和 Docker 输出不会越过端口。 */\nexport function createRegistryTransport(\n runner: ProcessRunner,\n executable = \"docker\",\n): RegistryPort {\n return {\n inspect(reference, options) {\n const host = validateOptions(options, executable);\n const repository = repositoryFromReference(reference, host);\n return authenticated(runner, executable, \"inspect\", host, options, (authenticatedOptions) =>\n inspect(runner, executable, reference, repository, authenticatedOptions),\n );\n },\n\n pull(input, options) {\n const host = validateOptions(options, executable);\n const repository = validateRepository(input.repository, host);\n const digest = parseDigest(input.digest, \"pull\");\n const reference = `${repository}@${digest}`;\n return authenticated(\n runner,\n executable,\n \"pull\",\n host,\n options,\n async (authenticatedOptions) => {\n const outcome = await runner.run(\n { executable, args: [\"pull\", reference] },\n authenticatedOptions,\n );\n if (outcome.status === \"failed\") throw processError(\"pull\", outcome, \"none\");\n\n const observed = await inspectLocal(\n runner,\n executable,\n reference,\n repository,\n digest,\n authenticatedOptions,\n );\n if (observed.digest !== digest) {\n throw new RegistryError(\"digest_mismatch\", \"pull\", \"none\", false);\n }\n return observed;\n },\n );\n },\n\n push(input, options) {\n const host = validateOptions(options, executable);\n const repository = taggedRepository(input.reference, host, \"push\");\n const expectedDigest = parseDigest(input.expectedDigest, \"push\");\n return authenticated(\n runner,\n executable,\n \"push\",\n host,\n options,\n async (authenticatedOptions) => {\n const outcome = await runner.run(\n { executable, args: [\"push\", input.reference] },\n authenticatedOptions,\n );\n\n if (outcome.status === \"failed\" && !outcome.dispatched) {\n throw processError(\"push\", outcome, \"none\");\n }\n\n let observed: RegistryImage;\n try {\n observed = await inspect(\n runner,\n executable,\n input.reference,\n repository,\n authenticatedOptions,\n );\n } catch (error) {\n if (error instanceof RegistryError) throw error;\n throw new RegistryError(\"push_effect_unknown\", \"push\", \"unknown\", false);\n }\n\n if (observed.digest !== expectedDigest) {\n throw new RegistryError(\"digest_mismatch\", \"push\", \"acknowledged\", false);\n }\n if (outcome.status === \"failed\") {\n throw processError(\"push\", outcome, \"acknowledged\");\n }\n return observed;\n },\n );\n },\n };\n}\n\nasync function authenticated(\n runner: ProcessRunner,\n executable: string,\n operation: Exclude<RegistryOperation, \"authenticate\">,\n host: string,\n options: RegistryOptions,\n action: (options: AuthenticatedOptions) => Promise<RegistryImage>,\n): Promise<RegistryImage> {\n let dockerConfig: string;\n try {\n dockerConfig = await mkdtemp(path.join(os.tmpdir(), \"stackonward-registry-\"));\n } catch {\n throw new RegistryError(\"credential_scope_failed\", \"authenticate\", \"none\", true);\n }\n\n let result: RegistryImage | undefined;\n let operationError: unknown;\n try {\n await prepareDockerConfig(dockerConfig, host, options.cwd, options.env);\n const authenticatedOptions: AuthenticatedOptions = {\n cwd: options.cwd,\n env: registryCommandEnv(options.env, dockerConfig),\n timeoutMs: options.timeoutMs,\n signal: options.signal,\n redactions: [options.credentials.username],\n };\n await authenticate(runner, executable, host, options.credentials, authenticatedOptions);\n result = await action(authenticatedOptions);\n } catch (error) {\n operationError = error;\n }\n\n let cleanup: RegistryCredentialCleanup = \"succeeded\";\n try {\n await rm(dockerConfig, { recursive: true, force: true });\n } catch {\n cleanup = \"failed\";\n }\n\n if (operationError !== undefined) {\n throw withCleanup(normalizeError(operationError, operation), cleanup);\n }\n if (cleanup === \"failed\") {\n throw new RegistryError(\n \"credential_cleanup_failed\",\n operation,\n operation === \"push\" ? \"acknowledged\" : \"none\",\n false,\n cleanup,\n );\n }\n if (result === undefined) {\n throw new RegistryError(\"transport_failed\", operation, \"none\", false, cleanup);\n }\n return result;\n}\n\nasync function authenticate(\n runner: ProcessRunner,\n executable: string,\n host: string,\n credentials: RegistryCredentials,\n options: AuthenticatedOptions,\n): Promise<void> {\n for (let attempt = 0; ; attempt += 1) {\n const outcome = await runner.run(\n {\n executable,\n args: [\"login\", host, \"--username\", credentials.username, \"--password-stdin\"],\n },\n { ...options, input: credentials.password },\n );\n if (outcome.status === \"succeeded\") return;\n\n const backoffCap = AUTHENTICATION_BACKOFF_CAPS_MS[attempt];\n if (backoffCap === undefined || !RETRYABLE_AUTHENTICATION_FAILURES.has(outcome.reason)) {\n throw processError(\"authenticate\", outcome, \"none\");\n }\n\n try {\n const waitMs = Math.floor(Math.random() * (backoffCap + 1));\n await sleep(\n waitMs,\n undefined,\n options.signal === undefined ? undefined : { signal: options.signal },\n );\n } catch {\n throw new RegistryError(\"authentication_failed\", \"authenticate\", \"none\", false);\n }\n }\n}\n\nasync function prepareDockerConfig(\n target: string,\n host: string,\n cwd: string,\n env: Readonly<Record<string, string>>,\n): Promise<void> {\n // Docker CLI 在 ContainsAuth 为假时会 DetectDefaultStore,空隔离目录仍会写入平台凭据助手。\n try {\n await writeFile(\n path.join(target, \"config.json\"),\n `${JSON.stringify({ auths: { [host]: {} } })}\\n`,\n { mode: 0o600 },\n );\n } catch {\n throw new RegistryError(\"credential_scope_failed\", \"authenticate\", \"none\", true);\n }\n\n const configured = env.DOCKER_CONFIG?.trim();\n const home = env.HOME?.trim();\n const source = configured\n ? path.resolve(cwd, configured)\n : home\n ? path.resolve(cwd, home, \".docker\")\n : undefined;\n if (source === undefined) return;\n\n const plugins = path.join(source, \"cli-plugins\");\n try {\n const metadata = await stat(plugins);\n if (!metadata.isDirectory()) {\n throw new RegistryError(\"credential_scope_failed\", \"authenticate\", \"none\", false);\n }\n await symlink(\n plugins,\n path.join(target, \"cli-plugins\"),\n process.platform === \"win32\" ? \"junction\" : \"dir\",\n );\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) return;\n if (error instanceof RegistryError) throw error;\n throw new RegistryError(\"credential_scope_failed\", \"authenticate\", \"none\", true);\n }\n}\n\nfunction registryCommandEnv(\n env: Readonly<Record<string, string>>,\n dockerConfig: string,\n): Record<string, string> {\n // docker-container builder 做 imagetools inspect 不会带上隔离登录凭据。\n const next: Record<string, string> = {\n ...env,\n DOCKER_CONFIG: dockerConfig,\n DOCKER_CLI_HINTS: \"false\",\n };\n delete next.BUILDX_BUILDER;\n return next;\n}\n\nasync function inspect(\n runner: ProcessRunner,\n executable: string,\n reference: string,\n repository: string,\n options: AuthenticatedOptions,\n): Promise<RegistryImage> {\n const outcome = await runner.run(\n {\n executable,\n args: [\"buildx\", \"imagetools\", \"inspect\", \"--format\", DIGEST_FORMAT, reference],\n },\n options,\n );\n if (outcome.status === \"failed\") throw processError(\"inspect\", outcome, \"none\");\n\n const digest = parseJsonDigest(outcome.stdout, \"inspect\");\n const immutableReference = `${repository}@${digest}`;\n const configDigest = await inspectConfigDigest(\n runner,\n executable,\n repository,\n immutableReference,\n options,\n );\n return image(repository, digest, configDigest);\n}\n\nasync function inspectConfigDigest(\n runner: ProcessRunner,\n executable: string,\n repository: string,\n reference: string,\n options: AuthenticatedOptions,\n): Promise<string> {\n const raw = await inspectRaw(runner, executable, reference, options);\n const imageManifest = manifestSchema.safeParse(raw);\n if (imageManifest.success) return imageManifest.data.config.digest;\n\n const index = imageIndexSchema.safeParse(raw);\n if (!index.success) {\n throw new RegistryError(\"inspect_output_invalid\", \"inspect\", \"none\", false);\n }\n const child = pickPlatformManifest(index.data.manifests);\n const childRaw = await inspectRaw(runner, executable, `${repository}@${child}`, options);\n const childManifest = manifestSchema.safeParse(childRaw);\n if (!childManifest.success) {\n throw new RegistryError(\"inspect_output_invalid\", \"inspect\", \"none\", false);\n }\n return childManifest.data.config.digest;\n}\n\nasync function inspectRaw(\n runner: ProcessRunner,\n executable: string,\n reference: string,\n options: AuthenticatedOptions,\n): Promise<unknown> {\n const outcome = await runner.run(\n { executable, args: [\"buildx\", \"imagetools\", \"inspect\", \"--raw\", reference] },\n options,\n );\n if (outcome.status === \"failed\") throw processError(\"inspect\", outcome, \"none\");\n try {\n return JSON.parse(outcome.stdout.trim()) as unknown;\n } catch {\n throw new RegistryError(\"inspect_output_invalid\", \"inspect\", \"none\", false);\n }\n}\n\nfunction pickPlatformManifest(\n manifests: ReadonlyArray<{\n digest: string;\n platform?: { os?: string; architecture?: string };\n }>,\n): string {\n const images = manifests.filter((manifest) => manifest.platform?.os !== \"unknown\");\n const amd64 = images.find(\n (manifest) => manifest.platform?.os === \"linux\" && manifest.platform?.architecture === \"amd64\",\n );\n const chosen = amd64 ?? images[0] ?? manifests[0];\n if (chosen === undefined) {\n throw new RegistryError(\"inspect_output_invalid\", \"inspect\", \"none\", false);\n }\n return chosen.digest;\n}\n\nasync function inspectLocal(\n runner: ProcessRunner,\n executable: string,\n reference: string,\n repository: string,\n expectedDigest: string,\n options: AuthenticatedOptions,\n): Promise<RegistryImage> {\n const outcome = await runner.run(\n {\n executable,\n args: [\"image\", \"inspect\", \"--format\", LOCAL_DIGESTS_FORMAT, reference],\n },\n options,\n );\n if (outcome.status === \"failed\") throw processError(\"pull\", outcome, \"none\");\n\n let document: unknown;\n try {\n document = JSON.parse(outcome.stdout.trim()) as unknown;\n } catch {\n throw new RegistryError(\"pull_output_invalid\", \"pull\", \"none\", false);\n }\n const parsed = localDigestsSchema.safeParse(document);\n if (!parsed.success) {\n throw new RegistryError(\"pull_output_invalid\", \"pull\", \"none\", false);\n }\n\n if (!parsed.data.includes(`${repository}@${expectedDigest}`)) {\n throw new RegistryError(\"pull_output_invalid\", \"pull\", \"none\", false);\n }\n const configOutcome = await runner.run(\n { executable, args: [\"image\", \"inspect\", \"--format\", CONFIG_DIGEST_FORMAT, reference] },\n options,\n );\n if (configOutcome.status === \"failed\") throw processError(\"pull\", configOutcome, \"none\");\n const configDigest = parseJsonDigest(configOutcome.stdout, \"pull\");\n return image(repository, expectedDigest, configDigest);\n}\n\nfunction validateOptions(options: RegistryOptions, executable: string): string {\n const { host, username, password } = options.credentials;\n if (\n executable.length === 0 ||\n executable.length > MAX_REFERENCE_LENGTH ||\n hasControlCharacters(executable) ||\n !Number.isSafeInteger(options.timeoutMs) ||\n options.timeoutMs <= 0 ||\n options.timeoutMs > MAX_TIMEOUT_MS ||\n options.cwd.length === 0 ||\n hasControlCharacters(options.cwd)\n ) {\n throw new RegistryError(\"invalid_options\", \"authenticate\", \"none\", false);\n }\n if (\n username.trim().length === 0 ||\n username.length > MAX_REFERENCE_LENGTH ||\n password.length === 0 ||\n password.length > MAX_REFERENCE_LENGTH ||\n hasControlCharacters(username) ||\n hasControlCharacters(password)\n ) {\n throw new RegistryError(\"invalid_credentials\", \"authenticate\", \"none\", false);\n }\n return validateHost(host);\n}\n\nfunction validateHost(value: string): string {\n if (value.length === 0 || value.length > 255 || hasControlCharacters(value)) {\n throw new RegistryError(\"invalid_credentials\", \"authenticate\", \"none\", false);\n }\n try {\n const url = new URL(`https://${value}`);\n if (\n url.host !== value ||\n url.hostname.length === 0 ||\n url.username.length > 0 ||\n url.password.length > 0 ||\n url.pathname !== \"/\" ||\n url.search.length > 0 ||\n url.hash.length > 0\n ) {\n throw new Error();\n }\n } catch {\n throw new RegistryError(\"invalid_credentials\", \"authenticate\", \"none\", false);\n }\n return value;\n}\n\nfunction repositoryFromReference(reference: string, host: string): string {\n validateReference(reference, host, \"inspect\");\n const digestSeparator = reference.lastIndexOf(\"@\");\n if (digestSeparator >= 0) {\n parseDigest(reference.slice(digestSeparator + 1), \"inspect\");\n return validateRepositoryPath(reference.slice(0, digestSeparator), host, \"inspect\");\n }\n return taggedRepository(reference, host, \"inspect\");\n}\n\nfunction taggedRepository(reference: string, host: string, operation: \"inspect\" | \"push\"): string {\n validateReference(reference, host, operation);\n if (reference.includes(\"@\")) {\n throw new RegistryError(\"invalid_reference\", operation, \"none\", false);\n }\n const lastSlash = reference.lastIndexOf(\"/\");\n const tagSeparator = reference.lastIndexOf(\":\");\n if (tagSeparator <= lastSlash || tagSeparator === reference.length - 1) {\n throw new RegistryError(\"invalid_reference\", operation, \"none\", false);\n }\n if (!tagSchema.safeParse(reference.slice(tagSeparator + 1)).success) {\n throw new RegistryError(\"invalid_reference\", operation, \"none\", false);\n }\n return validateRepositoryPath(reference.slice(0, tagSeparator), host, operation);\n}\n\nfunction validateRepository(repository: string, host: string): string {\n validateReference(repository, host, \"pull\");\n const lastSlash = repository.lastIndexOf(\"/\");\n if (repository.includes(\"@\") || repository.lastIndexOf(\":\") > lastSlash) {\n throw new RegistryError(\"invalid_reference\", \"pull\", \"none\", false);\n }\n return validateRepositoryPath(repository, host, \"pull\");\n}\n\nfunction validateReference(\n reference: string,\n host: string,\n operation: Exclude<RegistryOperation, \"authenticate\">,\n): void {\n if (\n reference.length === 0 ||\n reference.length > MAX_REFERENCE_LENGTH ||\n !reference.startsWith(`${host}/`) ||\n reference === `${host}/` ||\n hasControlCharacters(reference) ||\n /\\s/u.test(reference)\n ) {\n throw new RegistryError(\"invalid_reference\", operation, \"none\", false);\n }\n}\n\nfunction validateRepositoryPath(\n repository: string,\n host: string,\n operation: Exclude<RegistryOperation, \"authenticate\">,\n): string {\n const parsed = repositoryPathSchema.safeParse(repository.slice(host.length + 1));\n if (!parsed.success) {\n throw new RegistryError(\"invalid_reference\", operation, \"none\", false);\n }\n return repository;\n}\n\nfunction parseJsonDigest(stdout: string, operation: RegistryOperation): string {\n let document: unknown;\n try {\n document = JSON.parse(stdout.trim()) as unknown;\n } catch {\n throw new RegistryError(\"inspect_output_invalid\", operation, \"none\", false);\n }\n const parsed = digestSchema.safeParse(document);\n if (!parsed.success) {\n throw new RegistryError(\"inspect_output_invalid\", operation, \"none\", false);\n }\n return parsed.data;\n}\n\nfunction parseDigest(value: string, operation: RegistryOperation): string {\n const parsed = digestSchema.safeParse(value);\n if (!parsed.success) {\n throw new RegistryError(\"invalid_reference\", operation, \"none\", false);\n }\n return parsed.data;\n}\n\nfunction image(repository: string, digest: string, configDigest: string): RegistryImage {\n return Object.freeze({\n repository,\n digest,\n configDigest,\n reference: `${repository}@${digest}`,\n });\n}\n\nfunction processError(\n operation: RegistryOperation,\n failure: ProcessFailure,\n effect: RegistryEffect,\n): RegistryError {\n const code: RegistryErrorCode =\n operation === \"authenticate\" ? \"authentication_failed\" : `${operation}_failed`;\n return new RegistryError(\n code,\n operation,\n effect,\n effect !== \"unknown\" && RETRYABLE_PROCESS_FAILURES.has(failure.reason),\n );\n}\n\nfunction normalizeError(\n error: unknown,\n operation: Exclude<RegistryOperation, \"authenticate\">,\n): RegistryError {\n if (error instanceof RegistryError) return error;\n return new RegistryError(\n \"transport_failed\",\n operation,\n operation === \"push\" ? \"unknown\" : \"none\",\n false,\n );\n}\n\nfunction withCleanup(error: RegistryError, cleanup: RegistryCredentialCleanup): RegistryError {\n return new RegistryError(error.code, error.operation, error.effect, error.retryable, cleanup);\n}\n\nfunction hasControlCharacters(value: string): boolean {\n return value.includes(\"\\0\") || value.includes(\"\\n\") || value.includes(\"\\r\");\n}\n\nfunction isNodeError(error: unknown, code: string): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === code;\n}\n","import type {\n Action,\n Binding,\n Diagnostic,\n Effect,\n EffectObservation,\n EffectResult,\n Intent,\n Json,\n Operation,\n ProviderFactory,\n SecretLease,\n Verification,\n} from \"@stackonward/provisioning\";\n\nexport type CommandName = \"validate\" | \"plan\" | \"apply\" | \"verify\" | \"reconcile\";\n\nexport interface Config {\n readonly schemaVersion: 1;\n readonly provider: string;\n readonly target: string;\n readonly providerConfig: Json;\n readonly sinks: readonly Json[];\n}\n\nexport interface SinkOperation {\n readonly operationId: string;\n readonly sink: string;\n readonly credential: string;\n readonly action: \"create\" | \"update\" | \"retain\" | \"rotate\" | \"revoke\";\n readonly dependencies: readonly string[];\n readonly beforeDigest: string;\n readonly desiredDigest: string;\n readonly plan: Json;\n}\n\nexport interface PendingSinkIntent {\n readonly attemptId: string;\n readonly operation: SinkOperation;\n readonly recordedAt: string;\n}\n\nexport interface SinkObservation {\n readonly status: \"absent\" | \"present\" | \"conflict\" | \"unknown\";\n readonly observedDigest: string;\n readonly evidence: Json;\n}\n\nexport interface CredentialSink {\n readonly id: string;\n parseConfig(input: unknown): Json;\n observe(config: Json, lease: SecretLease): Promise<SinkObservation>;\n apply(operation: SinkOperation, lease: SecretLease): Promise<EffectResult>;\n verify(config: Json, lease: SecretLease): Promise<Verification>;\n reconcile(intent: PendingSinkIntent, lease: SecretLease): Promise<EffectObservation>;\n dispose(): Promise<void>;\n}\n\nexport interface SinkFactory {\n readonly id: string;\n parseConfig(input: unknown): Json;\n configure(config: Json, context: SinkContext): Promise<CredentialSink>;\n}\n\nexport interface SinkContext {\n readonly signal: AbortSignal;\n readonly now: () => Date;\n}\n\nexport interface SavedPlan {\n readonly schemaVersion: 1;\n readonly protocolVersion: 1;\n readonly provider: string;\n readonly target: string;\n readonly intent: Intent;\n readonly planId: string;\n readonly configDigest: string;\n readonly secretCommitment: string;\n readonly capabilityDigest: string;\n readonly snapshotCommitment: string;\n readonly createdAt: string;\n readonly expiresAt: string;\n readonly operations: readonly Operation[];\n readonly sinks: readonly SinkOperation[];\n readonly signature: string;\n}\n\nexport interface State {\n readonly schemaVersion: 1;\n readonly lineage: string;\n readonly serial: number;\n readonly provider: string;\n readonly scope: { readonly origin: string; readonly target: string };\n readonly status: \"safe\" | \"elevated\" | \"blocked\";\n readonly bindings: readonly Binding[];\n readonly managedFields: readonly { resourceKey: string; fields: readonly string[] }[];\n readonly secretRevisions: Readonly<Record<string, string>>;\n readonly elevation?: {\n readonly attemptId: string;\n readonly authorizationIds: readonly string[];\n readonly phase: \"granting\" | \"cleanup\";\n };\n readonly pending?: import(\"@stackonward/provisioning\").PendingIntent | PendingSinkIntent;\n readonly lastReceipt?: string;\n}\n\nexport interface Receipt {\n readonly schemaVersion: 1;\n readonly command: CommandName;\n readonly provider: string;\n readonly target: string;\n readonly executionId: string;\n readonly planId?: string;\n readonly principalId?: string;\n readonly outcome:\n | \"validated\"\n | \"planned\"\n | \"changed\"\n | \"unchanged\"\n | \"verified\"\n | \"failed\"\n | \"unknown\"\n | \"cancelled\";\n readonly changes: readonly {\n readonly resourceKey: string;\n readonly remoteId?: string;\n readonly action: Action;\n readonly effect: Effect;\n }[];\n readonly verification?: Verification;\n readonly diagnostics: readonly Diagnostic[];\n}\n\nexport interface Registry {\n provider(id: string): ProviderFactory;\n sink(id: string): SinkFactory;\n}\n\nexport class ProvisionError extends Error {\n constructor(\n readonly code: string,\n readonly exitCode: 2 | 3 | 4 | 5 | 7 | 130,\n readonly field?: string,\n ) {\n super(code);\n this.name = \"ProvisionError\";\n }\n}\n","import type { ConfigInput } from \"../../deploy/config.js\";\nimport type { ProcessRunner } from \"../../deploy/process.js\";\n\nexport interface InitOptions {\n readonly profile?: string;\n readonly target?: string;\n readonly rollout?: string;\n readonly ci?: string;\n readonly stackonwardRef?: string;\n}\nexport interface SelectedOptions {\n readonly config: string;\n readonly environment?: string;\n}\nexport interface BuildOptions extends SelectedOptions {\n readonly revision?: string;\n readonly output?: string;\n}\nexport interface PublishOptions extends SelectedOptions {\n readonly artifact?: string;\n readonly output?: string;\n}\nexport interface ArtifactOptions extends SelectedOptions {\n readonly artifact?: string;\n}\nexport interface VerifyOptions extends SelectedOptions {\n readonly release?: string;\n}\nexport interface RollbackOptions extends SelectedOptions {\n readonly release?: string;\n}\n\nexport interface Scope {\n readonly env: Readonly<Record<string, string>>;\n readonly runner: ProcessRunner;\n readonly signal: AbortSignal;\n}\n\nexport interface Project {\n readonly config: ConfigInput;\n readonly root: string;\n}\nexport interface CommandResult {\n readonly output: unknown;\n readonly exitCode: number;\n}\n\n/** 命令错误只携带稳定机器分类和可公开字段名。 */\nexport class CommandError extends Error {\n constructor(\n readonly code: string,\n readonly exitCode: number,\n readonly field?: string,\n readonly constraint?: string,\n ) {\n super(code);\n this.name = \"DeploymentCommandError\";\n }\n}\n\nexport function requireOption(value: string | undefined, field: string): string {\n if (value === undefined || value.length === 0)\n throw new CommandError(\"option_missing\", 2, field, \"required\");\n return value;\n}\n\nexport function requireEnv(env: Readonly<Record<string, string>>, name: string): string {\n const value = env[name];\n if (value === undefined || value.length === 0)\n throw new CommandError(\"environment_missing\", 2, name);\n return value;\n}\n\nexport function assertActive(signal: AbortSignal): void {\n if (signal.aborted) throw new CommandError(\"cancelled\", 130);\n}\n\nexport function succeeded(output: unknown): CommandResult {\n return { output, exitCode: 0 };\n}\nexport function withExitCode(output: unknown, exitCode: number): CommandResult {\n return { output, exitCode };\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst MAX_ENV_FILE_BYTES = 64 * 1024;\nconst ENV_NAME = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;\nconst ASSIGNMENT = /^(?:export\\s+)?([A-Z][A-Z0-9_]*)\\s*=\\s*(.*)$/;\n\nexport class EnvFileError extends Error {\n constructor(\n readonly code: \"environment_file_invalid\",\n message: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"EnvFileError\";\n }\n}\n\n/** 共享 `.env` 再叠 `.env.<environment>`。进程环境由调用方覆盖。 */\nexport async function readEnvironmentFiles(\n projectRoot: string,\n environmentName: string,\n): Promise<Readonly<Record<string, string>>> {\n return Object.freeze({\n ...(await readEnvFile(projectRoot, \".env\")),\n ...(await readEnvFile(projectRoot, `.env.${environmentName}`)),\n });\n}\n\nasync function readEnvFile(\n projectRoot: string,\n filename: string,\n): Promise<Readonly<Record<string, string>>> {\n const resolved = path.resolve(projectRoot, filename);\n if (!resolved.startsWith(`${path.resolve(projectRoot)}${path.sep}`)) {\n throw new EnvFileError(\"environment_file_invalid\", \"Environment file path is invalid\");\n }\n let details;\n try {\n details = await stat(resolved);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return {};\n throw new EnvFileError(\"environment_file_invalid\", \"Environment file cannot be read\", {\n cause: error,\n });\n }\n if (!details.isFile() || details.size > MAX_ENV_FILE_BYTES) {\n throw new EnvFileError(\"environment_file_invalid\", \"Environment file is not a readable file\");\n }\n let text;\n try {\n text = await readFile(resolved, \"utf8\");\n } catch (error) {\n throw new EnvFileError(\"environment_file_invalid\", \"Environment file cannot be read\", {\n cause: error,\n });\n }\n return parseEnvFile(text);\n}\n\nfunction parseEnvFile(text: string): Readonly<Record<string, string>> {\n const values: Record<string, string> = {};\n for (const raw of text.split(/\\r?\\n/u)) {\n const line = raw.trim();\n if (line.length === 0 || line.startsWith(\"#\")) continue;\n const matched = ASSIGNMENT.exec(line);\n if (!matched || !ENV_NAME.test(matched[1] ?? \"\")) {\n throw new EnvFileError(\n \"environment_file_invalid\",\n \"Environment file contains an invalid line\",\n );\n }\n const name = matched[1]!;\n values[name] = unquote(matched[2] ?? \"\");\n }\n return Object.freeze(values);\n}\n\nfunction unquote(value: string): string {\n const trimmed = value.trim();\n if (\n trimmed.length >= 2 &&\n ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")))\n ) {\n return trimmed.slice(1, -1);\n }\n const comment = trimmed.search(/\\s+#/u);\n return (comment === -1 ? trimmed : trimmed.slice(0, comment)).trim();\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\n\nimport fs from \"fs-extra\";\nimport { glob } from \"glob\";\n\nimport { copyFiles, copyTemplate } from \"../utils/fs.js\";\nimport { PATHS } from \"../utils/constants.js\";\nimport { artifactKind, CompatibilityError } from \"./compatibility.js\";\nimport { parseInitInput, type CI, type InitInput } from \"./config.js\";\n\nconst OUTPUT_ROOT = \"deployments/stackonward\";\nconst ROOT_TEMPLATE = `${OUTPUT_ROOT}/profiles/static-files/nginx/site.conf.template`;\nconst TEMPLATE_TOKEN = /(?<!\\$)\\{\\{([^{}\\r\\n]+)\\}\\}/g;\nconst NGINX_PROFILES = new Set<InitInput[\"profile\"]>([\"static-files\", \"static-nginx\"]);\n\nexport type MaterializeErrorCode =\n | \"invalid_project_root\"\n | \"resource_unavailable\"\n | \"resource_path_outside_root\"\n | \"destination_path_outside_root\"\n | \"destination_conflict\"\n | \"destination_changed\"\n | \"unresolved_template_token\";\n\nexport class MaterializeError extends Error {\n constructor(\n readonly code: MaterializeErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"MaterializeError\";\n }\n}\n\nexport interface MaterializeOptions {\n readonly projectRoot: string;\n readonly input: unknown;\n}\n\nexport interface MaterializedFiles {\n readonly paths: readonly string[];\n}\n\ninterface DirectorySelection {\n readonly source: string;\n readonly destination: string;\n}\n\ninterface CISpec {\n readonly source: string;\n readonly filename: string;\n readonly destination: string;\n}\n\nconst ciSpecs = {\n github: {\n source: \"ci/github\",\n filename: \"caller.yml\",\n destination: \".github/workflows/deploy.yml\",\n },\n onedev: {\n source: \"ci/onedev\",\n filename: \"import.yml\",\n destination: \".onedev-buildspec.yml\",\n },\n} as const satisfies Record<CI, CISpec>;\n\nfunction isInside(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (relative !== \"..\" && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative))\n );\n}\n\nfunction resolveRelative(root: string, relative: string): string {\n const portable = relative.replaceAll(\"\\\\\", \"/\");\n const unsafe =\n path.posix.isAbsolute(portable) ||\n path.win32.isAbsolute(relative) ||\n portable.split(\"/\").some((segment) => segment === \"..\");\n const destination = path.resolve(root, ...portable.split(\"/\"));\n if (unsafe || destination === root || !isInside(root, destination)) {\n throw new MaterializeError(\n \"destination_path_outside_root\",\n `Deployment path must remain inside the project root: ${relative}`,\n );\n }\n return destination;\n}\n\nasync function entryExists(filename: string): Promise<boolean> {\n try {\n await fs.lstat(filename);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nasync function resolveProjectRoot(value: string): Promise<string> {\n let root: string;\n try {\n root = await fs.realpath(path.resolve(value));\n } catch {\n throw new MaterializeError(\"invalid_project_root\", `Project root is not accessible: ${value}`);\n }\n if (!(await fs.stat(root)).isDirectory()) {\n throw new MaterializeError(\"invalid_project_root\", `Project root is not a directory: ${value}`);\n }\n return root;\n}\n\nasync function listFiles(root: string): Promise<string[]> {\n return (\n await glob(\"**/*\", {\n cwd: root,\n dot: true,\n nodir: true,\n follow: false,\n })\n )\n .map((filename) => filename.replaceAll(\"\\\\\", \"/\"))\n .sort();\n}\n\nasync function resolveResourceRoot(): Promise<string> {\n let root: string;\n try {\n root = await fs.realpath(PATHS.deploy);\n } catch {\n throw new MaterializeError(\n \"resource_unavailable\",\n \"Bundled deployment resources are unavailable\",\n );\n }\n if (!(await fs.stat(root)).isDirectory()) {\n throw new MaterializeError(\n \"resource_unavailable\",\n \"Bundled deployment resources are not a directory\",\n );\n }\n return root;\n}\n\nasync function resolveResourceDirectory(root: string, relative: string): Promise<string> {\n const expected = path.resolve(root, ...relative.split(\"/\"));\n let source: string;\n try {\n source = await fs.realpath(expected);\n } catch {\n throw new MaterializeError(\n \"resource_unavailable\",\n `Bundled deployment resource is unavailable: ${relative}`,\n );\n }\n if (!isInside(root, source) || !(await fs.stat(source)).isDirectory()) {\n throw new MaterializeError(\n \"resource_path_outside_root\",\n `Bundled deployment resource escapes its root: ${relative}`,\n );\n }\n\n const files = await listFiles(source);\n if (files.length === 0) {\n throw new MaterializeError(\n \"resource_unavailable\",\n `Bundled deployment resource is empty: ${relative}`,\n );\n }\n for (const filename of files) {\n const expectedFile = resolveRelative(source, filename);\n let actualFile: string;\n try {\n actualFile = await fs.realpath(expectedFile);\n } catch {\n throw new MaterializeError(\n \"resource_unavailable\",\n `Bundled deployment resource is unreadable: ${relative}/${filename}`,\n );\n }\n if (!isInside(source, actualFile) || !(await fs.stat(actualFile)).isFile()) {\n throw new MaterializeError(\n \"resource_path_outside_root\",\n `Bundled deployment resource escapes its owner: ${relative}/${filename}`,\n );\n }\n }\n return source;\n}\n\nfunction assertTargetCompatible(input: InitInput): void {\n const kind = artifactKind(input.profile);\n const directoryMismatch = (kind === \"directory\") !== (input.target === \"ssh-directory\");\n const registryMismatch = input.target === \"registry-only\" && kind !== \"oci\";\n if (directoryMismatch || registryMismatch) {\n throw new CompatibilityError(\n \"unsupported_target\",\n `Profile ${input.profile} does not support target ${input.target}`,\n );\n }\n}\n\nfunction selectDirectories(input: InitInput): DirectorySelection[] {\n const selections: DirectorySelection[] = [];\n if (input.profile !== \"compose-stack\") {\n selections.push({\n source: `profiles/${input.profile}`,\n destination: `${OUTPUT_ROOT}/profiles/${input.profile}`,\n });\n }\n if (NGINX_PROFILES.has(input.profile)) {\n selections.push({ source: \"nginx\", destination: `${OUTPUT_ROOT}/nginx` });\n }\n if (input.target === \"compose-host\") {\n selections.push({\n source: \"targets/compose-host\",\n destination: `${OUTPUT_ROOT}/targets/compose-host`,\n });\n }\n return selections;\n}\n\nasync function assertTokens(stage: string, files: readonly string[]): Promise<void> {\n for (const filename of files) {\n const content = await fs.readFile(resolveRelative(stage, filename), \"utf8\");\n for (const match of content.matchAll(TEMPLATE_TOKEN)) {\n const token = match[1]?.trim();\n if (filename === ROOT_TEMPLATE && token === \"root\") continue;\n throw new MaterializeError(\n \"unresolved_template_token\",\n `Unresolved deployment template token in ${filename}: ${token}`,\n );\n }\n }\n}\n\nasync function assertDestinations(projectRoot: string, files: readonly string[]): Promise<void> {\n const conflicts: string[] = [];\n for (const filename of files) {\n const destination = resolveRelative(projectRoot, filename);\n if (await entryExists(destination)) {\n conflicts.push(filename);\n continue;\n }\n\n let ancestor = path.dirname(destination);\n while (!(await entryExists(ancestor))) {\n ancestor = path.dirname(ancestor);\n }\n const actual = await fs.realpath(ancestor);\n if (!isInside(projectRoot, actual)) {\n throw new MaterializeError(\n \"destination_path_outside_root\",\n `Deployment path escapes the project root: ${filename}`,\n );\n }\n if (!(await fs.stat(actual)).isDirectory()) conflicts.push(filename);\n }\n if (conflicts.length > 0) {\n throw new MaterializeError(\n \"destination_conflict\",\n `Deployment files already exist or have invalid parents: ${conflicts.join(\", \")}`,\n );\n }\n}\n\n/** 将已校验的部署选择物化为产品拥有的资源和平台入口。 */\nexport async function materialize(options: MaterializeOptions): Promise<MaterializedFiles> {\n const input = parseInitInput(options.input);\n assertTargetCompatible(input);\n const projectRoot = await resolveProjectRoot(options.projectRoot);\n const resourceRoot = await resolveResourceRoot();\n const workspace = await fs.mkdtemp(path.join(os.tmpdir(), \"stackonward-deploy-\"));\n const stage = path.join(workspace, \"project\");\n\n try {\n await fs.ensureDir(stage);\n for (const selection of selectDirectories(input)) {\n const source = await resolveResourceDirectory(resourceRoot, selection.source);\n await copyTemplate(source, resolveRelative(stage, selection.destination));\n }\n\n if (input.ci) {\n const ci = ciSpecs[input.ci];\n const ciSource = await resolveResourceDirectory(resourceRoot, ci.source);\n const ciStage = path.join(workspace, \"ci\");\n await copyTemplate(ciSource, ciStage, { stackonwardRef: input.stackonwardRef });\n const selectedCI = path.join(ciStage, ci.filename);\n if (!(await fs.pathExists(selectedCI))) {\n throw new MaterializeError(\n \"resource_unavailable\",\n `Bundled CI entrypoint is unavailable: ${ci.source}/${ci.filename}`,\n );\n }\n const stagedCI = await copyFiles([\n { src: selectedCI, dest: resolveRelative(stage, ci.destination) },\n ]);\n if (stagedCI.skipped.length > 0) {\n throw new MaterializeError(\n \"destination_changed\",\n `Staged CI entrypoint changed during materialization: ${ci.destination}`,\n );\n }\n }\n\n const paths = await listFiles(stage);\n await assertTokens(stage, paths);\n await assertDestinations(projectRoot, paths);\n\n const result = await copyFiles(\n paths.map((filename) => ({\n src: resolveRelative(stage, filename),\n dest: resolveRelative(projectRoot, filename),\n })),\n );\n if (result.skipped.length > 0) {\n throw new MaterializeError(\n \"destination_changed\",\n `Deployment destination changed during materialization: ${result.skipped\n .map((filename) => path.relative(projectRoot, filename).replaceAll(\"\\\\\", \"/\"))\n .join(\", \")}`,\n );\n }\n return { paths };\n } finally {\n await fs.remove(workspace);\n }\n}\n","import { lstat, realpath, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\n\nimport { readJson } from \"../../utils/fs.js\";\nimport { CommandError, type Project } from \"./contracts.js\";\n\nconst pathSchema = z\n .string()\n .min(1)\n .max(4_096)\n .refine((value) => !/[\\0\\r\\n]/u.test(value), \"Path must not contain control characters\");\n\nexport async function loadProject(configInput: string): Promise<Project> {\n const requested = parsePath(configInput, \"config\");\n let filename: string;\n try {\n filename = await realpath(path.resolve(requested));\n if (!(await stat(filename)).isFile()) throw new Error(\"not a file\");\n } catch {\n throw new CommandError(\"configuration_unreadable\", 2, \"config\");\n }\n const config = await readJson<unknown>(filename);\n if (config === null) throw new CommandError(\"configuration_unreadable\", 2, \"config\");\n return Object.freeze({ config, root: path.dirname(filename) });\n}\n\nexport async function readDocument(filename: string, field: string): Promise<unknown> {\n const document = await readJson<unknown>(filename);\n if (document === null) throw new CommandError(\"artifact_unreadable\", 2, field);\n return document;\n}\n\nexport async function resolveInput(root: string, value: string, field: string): Promise<string> {\n const requested = path.resolve(root, parsePath(value, field));\n let filename: string;\n try {\n filename = await realpath(requested);\n if (!(await stat(filename)).isFile()) throw new Error(\"not a file\");\n } catch {\n throw new CommandError(\"artifact_unreadable\", 2, field);\n }\n if (!isInside(root, filename)) throw new CommandError(\"path_outside_project\", 2, field);\n return filename;\n}\n\nexport async function resolveOutput(root: string, value: string): Promise<string> {\n const requested = path.resolve(root, parsePath(value, \"output\"));\n if (!isInside(root, requested) || requested === root)\n throw new CommandError(\"path_outside_project\", 2, \"output\");\n let parent: string;\n try {\n parent = await realpath(path.dirname(requested));\n if (!(await stat(parent)).isDirectory()) throw new Error(\"not a directory\");\n } catch {\n throw new CommandError(\"output_parent_unreadable\", 2, \"output\");\n }\n if (!isInside(root, parent)) throw new CommandError(\"path_outside_project\", 2, \"output\");\n const output = path.join(parent, path.basename(requested));\n if (!isInside(root, output) || output === root)\n throw new CommandError(\"path_outside_project\", 2, \"output\");\n return output;\n}\n\nexport async function assertAbsent(filename: string, field: string): Promise<void> {\n try {\n await lstat(filename);\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") return;\n throw new CommandError(\"output_unreadable\", 2, field);\n }\n throw new CommandError(\"output_exists\", 2, field);\n}\n\nexport function toProjectPath(root: string, filename: string): string {\n return path.relative(root, filename).split(path.sep).join(path.posix.sep);\n}\n\nfunction parsePath(value: string, field: string): string {\n const parsed = pathSchema.safeParse(value);\n if (!parsed.success)\n throw new CommandError(\"path_invalid\", 2, field, parsed.error.issues[0]?.code);\n return parsed.data;\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const value = path.relative(root, candidate);\n return (\n value === \"\" ||\n (value !== \"..\" && !value.startsWith(`..${path.sep}`) && !path.isAbsolute(value))\n );\n}\n","import { z } from \"zod\";\n\nimport type { Command as DeployCommand } from \"../../deploy/config.js\";\nimport { createHTTPHealthPort } from \"../../deploy/health.js\";\nimport { createSSHHealthPort } from \"../../deploy/health/ssh.js\";\nimport { createLifecyclePort, createTrafficPort } from \"../../deploy/lifecycle.js\";\nimport type { Plan } from \"../../deploy/plan.js\";\nimport type { ProcessOptions } from \"../../deploy/process.js\";\nimport type { BuildContext } from \"../../deploy/profile.js\";\nimport { createRegistry, type Registry, type RuntimeOperation } from \"../../deploy/registry.js\";\nimport type { Runtime } from \"../../deploy/release.js\";\nimport {\n TRAFFIC_ACTIVE_RELEASE_ENV,\n TRAFFIC_ACTIVE_SLOT_ENV,\n TRAFFIC_CANDIDATE_RELEASE_ENV,\n TRAFFIC_CANDIDATE_SLOT_ENV,\n TRAFFIC_WORKLOAD_ENV,\n} from \"../../deploy/rollouts/blue-green.js\";\nimport { createStore } from \"../../deploy/safety.js\";\nimport { createScope as createComposeScope } from \"../../deploy/targets/compose-host.js\";\nimport type { RegistryOptions } from \"../../deploy/transport/registry.js\";\nimport {\n createStoreBackend,\n createTransport,\n type Options as SSHOptions,\n type Scope as SSHScope,\n type Session as SSHSession,\n} from \"../../deploy/transport/ssh.js\";\nimport { CommandError, requireEnv, type Scope } from \"./contracts.js\";\n\nconst COMMAND_TIMEOUT_MS = 30 * 60 * 1_000;\nconst PROCESS_ENVIRONMENT_NAMES = Object.freeze([\n \"CI\",\n \"HOME\",\n \"LANG\",\n \"LC_ALL\",\n \"PATH\",\n \"TEMP\",\n \"TMP\",\n \"TMPDIR\",\n \"TZ\",\n]);\nconst portSchema = z.coerce.number().int().min(1).max(65_535);\n\nexport async function withRuntime<Value>(\n plan: Plan,\n operation: RuntimeOperation,\n projectRoot: string,\n scope: Scope,\n execute: (runtime: Runtime, process: ProcessOptions) => Promise<Value>,\n): Promise<Value> {\n const process = processOptions(projectRoot, scope, runtimeCommands(plan));\n const lifecycle = createLifecyclePort(scope.runner);\n const transport = createTransport(scope.runner);\n return transport.withLock(sshScope(plan), sshOptions(projectRoot, scope), (session) => {\n const traffic = createTrafficPort({\n execute: (command, options) =>\n session.execute(command, { env: trafficEnvironment(command, options.env), redactions: [] }),\n });\n const adapters = createRegistry({\n health: createHTTPHealthPort(),\n previewHealth: createSSHHealthPort(session),\n blueGreen: { traffic, trafficOptions: process },\n });\n return execute(createRuntime(adapters, plan, operation, lifecycle, session), process);\n });\n}\n\nexport function createAdapterRegistry(scope: Scope, projectRoot: string): Registry {\n const lifecycle = createLifecyclePort(scope.runner);\n const health = createHTTPHealthPort();\n return createRegistry({\n health,\n previewHealth: health,\n blueGreen: { traffic: lifecycle, trafficOptions: processOptions(projectRoot, scope) },\n });\n}\n\nexport function buildContext(\n projectRoot: string,\n resultPath: string,\n scope: Scope,\n commands: readonly DeployCommand[] = [],\n): BuildContext {\n return Object.freeze({\n projectRoot,\n artifactRoot: projectRoot,\n resultPath,\n process: scope.runner,\n registry: Object.freeze({\n host: scope.env.DEPLOY_REGISTRY_HOST ?? \"\",\n namespace: scope.env.DEPLOY_REGISTRY_NAMESPACE ?? \"\",\n }),\n processEnv: commandEnvironment(scope.env, commands),\n timeoutMs: COMMAND_TIMEOUT_MS,\n signal: scope.signal,\n });\n}\n\nexport function processOptions(\n cwd: string,\n scope: Scope,\n commands: readonly DeployCommand[] = [],\n): ProcessOptions {\n return Object.freeze({\n cwd,\n env: commandEnvironment(scope.env, commands),\n timeoutMs: COMMAND_TIMEOUT_MS,\n signal: scope.signal,\n });\n}\n\nexport function commandEnvironment(\n environment: Readonly<Record<string, string>>,\n commands: readonly DeployCommand[] = [],\n): Readonly<Record<string, string>> {\n const names = new Set(PROCESS_ENVIRONMENT_NAMES);\n for (const command of commands) for (const name of command.env ?? []) names.add(name);\n return selectEnvironment(environment, names);\n}\n\nexport function registryOptions(cwd: string, scope: Scope): RegistryOptions {\n return Object.freeze({\n credentials: {\n host: requireEnv(scope.env, \"DEPLOY_REGISTRY_HOST\"),\n username: requireEnv(scope.env, \"DEPLOY_REGISTRY_USERNAME\"),\n password: requireEnv(scope.env, \"DEPLOY_REGISTRY_PASSWORD\"),\n },\n ...processOptions(cwd, scope),\n });\n}\n\nfunction trafficEnvironment(\n command: DeployCommand,\n environment: Readonly<Record<string, string>>,\n): Readonly<Record<string, string>> {\n return selectEnvironment(\n environment,\n new Set([\n ...(command.env ?? []),\n TRAFFIC_ACTIVE_RELEASE_ENV,\n TRAFFIC_ACTIVE_SLOT_ENV,\n TRAFFIC_CANDIDATE_RELEASE_ENV,\n TRAFFIC_CANDIDATE_SLOT_ENV,\n TRAFFIC_WORKLOAD_ENV,\n ]),\n );\n}\n\nfunction selectEnvironment(\n environment: Readonly<Record<string, string>>,\n names: ReadonlySet<string>,\n): Readonly<Record<string, string>> {\n return Object.freeze(\n Object.fromEntries(\n [...names]\n .sort()\n .flatMap((name) => (environment[name] === undefined ? [] : [[name, environment[name]]])),\n ),\n );\n}\n\nfunction sshScope(plan: Plan): SSHScope {\n if (plan.environment.target === \"compose-host\") return createComposeScope(plan);\n if (plan.environment.target === \"ssh-directory\")\n return Object.freeze({ root: plan.environment.root, environment: plan.environmentName });\n throw new CommandError(\"target_transport_unavailable\", 3, \"target\");\n}\n\nfunction createRuntime(\n adapters: Registry,\n plan: Plan,\n operation: RuntimeOperation,\n lifecycle: ReturnType<typeof createLifecyclePort>,\n session: SSHSession,\n): Runtime {\n return Object.freeze({\n target: adapters.target(plan, operation, session),\n rollout: adapters.rollout(plan, operation, session),\n lifecycle,\n store: createStore(createStoreBackend(session, `state/${plan.environmentName}.json`)),\n });\n}\n\nfunction runtimeCommands(plan: Plan): readonly DeployCommand[] {\n if (plan.environment.target === \"registry-only\") return Object.freeze([]);\n const lifecycle =\n \"lifecycle\" in plan.environment && plan.environment.lifecycle\n ? [\n plan.environment.lifecycle.inspect,\n plan.environment.lifecycle.preflight,\n plan.environment.lifecycle.migrate,\n plan.environment.lifecycle.beforeActivate,\n plan.environment.lifecycle.afterActivate,\n plan.environment.lifecycle.assessRollback,\n plan.environment.lifecycle.recover,\n ].filter((command): command is DeployCommand => command !== undefined)\n : [];\n const rollout = plan.environment.rollout;\n const traffic =\n \"strategy\" in rollout && rollout.strategy === \"blue-green\"\n ? [rollout.traffic.inspect, rollout.traffic.activate, rollout.traffic.recover]\n : [];\n return Object.freeze([...lifecycle, ...traffic]);\n}\n\nfunction sshOptions(cwd: string, scope: Scope): SSHOptions {\n const port = portSchema.safeParse(requireEnv(scope.env, \"DEPLOY_SSH_PORT\"));\n if (!port.success)\n throw new CommandError(\"environment_invalid\", 2, \"DEPLOY_SSH_PORT\", \"integer_1_65535\");\n return Object.freeze({\n credentials: {\n host: requireEnv(scope.env, \"DEPLOY_SSH_HOST\"),\n port: port.data,\n user: requireEnv(scope.env, \"DEPLOY_SSH_USER\"),\n privateKey: requireEnv(scope.env, \"DEPLOY_SSH_KEY\"),\n knownHosts: requireEnv(scope.env, \"DEPLOY_SSH_KNOWN_HOSTS\"),\n },\n ...processOptions(cwd, scope),\n });\n}\n","import { setTimeout as sleep } from \"node:timers/promises\";\n\nimport { healthSchema, type Health } from \"./config.js\";\nimport { healthResultSchema, type HealthResult } from \"./rollout.js\";\nimport type { ReleaseIdentity } from \"./target.js\";\n\nexport type ErrorCode = \"cancelled\" | \"clock_failed\" | \"input_invalid\";\n\nexport interface HealthInput {\n readonly policy: Health;\n readonly releaseId: ReleaseIdentity;\n readonly checkedAt: string;\n readonly signal?: AbortSignal;\n}\n\nexport interface HealthPort {\n check(input: HealthInput): Promise<HealthResult>;\n}\n\nexport interface Clock {\n sleep(milliseconds: number, signal?: AbortSignal): Promise<void>;\n}\n\nexport interface Options {\n readonly clock?: Clock;\n readonly fetch?: typeof fetch;\n}\n\nexport interface HealthObserver {\n observe(policy: Health, signal?: AbortSignal): Promise<number | undefined>;\n}\n\ntype Attempt =\n | { readonly kind: \"cancelled\" }\n | { readonly kind: \"clock-failed\" }\n | { readonly kind: \"network\" }\n | { readonly kind: \"response\"; readonly response: Response }\n | { readonly kind: \"timeout\" };\n\ninterface Cancellation {\n readonly promise: Promise<Attempt>;\n dispose(): void;\n}\n\nconst systemClock: Clock = Object.freeze({\n async sleep(milliseconds: number, signal?: AbortSignal) {\n await sleep(milliseconds, undefined, signal === undefined ? undefined : { signal });\n },\n});\n\n/** 健康错误只公开稳定分类,不携带端点、响应正文或底层网络诊断。 */\nexport class HealthError extends Error {\n constructor(\n readonly code: ErrorCode,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"DeploymentHealthError\";\n }\n}\n\n/** HTTP 适配器完整执行一次策略,所有 rollout 只消费统一健康证据。 */\nexport function createHTTPHealthPort(options: Options = {}): HealthPort {\n const clock = options.clock ?? systemClock;\n const request = options.fetch ?? globalThis.fetch;\n\n return createHealthPort(\n {\n async observe(policy, signal) {\n const observed = await observe(request, clock, policy, signal);\n if (observed.kind === \"clock-failed\") throw new HealthError(\"clock_failed\");\n if (observed.kind === \"cancelled\") throw new HealthError(\"cancelled\");\n return observed.kind === \"response\" ? observed.status : undefined;\n },\n },\n clock,\n );\n}\n\n/** 健康策略统一拥有重试和证据生成,传输适配器只负责一次观测。 */\nexport function createHealthPort(observer: HealthObserver, clock: Clock = systemClock): HealthPort {\n return Object.freeze({\n async check(rawInput: HealthInput): Promise<HealthResult> {\n const input = parseInput(rawInput);\n let lastStatus: number | undefined;\n\n for (let attempts = 1; attempts <= input.policy.attempts; attempts += 1) {\n assertActive(input.signal);\n const observed = await observer.observe(input.policy, input.signal);\n assertActive(input.signal);\n\n lastStatus = observed;\n\n if (lastStatus === input.policy.expectedStatus) {\n return result(input, \"healthy\", attempts, lastStatus);\n }\n if (attempts < input.policy.attempts) {\n await wait(clock, input.policy.intervalMs, input.signal);\n }\n }\n\n return lastStatus === undefined\n ? result(input, \"unknown\", input.policy.attempts)\n : result(input, \"unhealthy\", input.policy.attempts, lastStatus);\n },\n });\n}\n\nfunction parseInput(input: HealthInput): HealthInput {\n const policy = healthSchema.safeParse(input.policy);\n const identity = healthResultSchema.safeParse({\n schemaVersion: 1,\n releaseId: input.releaseId,\n status: \"unknown\",\n attempts: 1,\n checkedAt: input.checkedAt,\n });\n const validSignal =\n input.signal === undefined ||\n (typeof AbortSignal !== \"undefined\" && input.signal instanceof AbortSignal);\n if (!policy.success || !identity.success || !validSignal) {\n throw new HealthError(\"input_invalid\", {\n cause: !policy.success ? policy.error : !identity.success ? identity.error : undefined,\n });\n }\n return Object.freeze({\n policy: policy.data,\n releaseId: identity.data.releaseId,\n checkedAt: identity.data.checkedAt,\n ...(input.signal === undefined ? {} : { signal: input.signal }),\n });\n}\n\nasync function observe(\n request: typeof fetch,\n clock: Clock,\n policy: Health,\n signal: AbortSignal | undefined,\n): Promise<\n { readonly kind: \"response\"; readonly status: number } | Exclude<Attempt, { kind: \"response\" }>\n> {\n const requestController = new AbortController();\n const timeoutController = new AbortController();\n const cancellation = cancellationOf(signal);\n const requested = Promise.resolve()\n .then(() =>\n request(policy.url, {\n credentials: \"omit\",\n method: policy.method,\n redirect: \"manual\",\n signal: requestController.signal,\n }),\n )\n .then<Attempt, Attempt>(\n (response) => ({ kind: \"response\", response }),\n () => ({ kind: \"network\" }),\n );\n const timeout = Promise.resolve()\n .then(() => clock.sleep(policy.timeoutMs, timeoutController.signal))\n .then<Attempt, Attempt>(\n () => ({ kind: \"timeout\" }),\n () => ({ kind: timeoutController.signal.aborted ? \"cancelled\" : \"clock-failed\" }),\n );\n\n const observed = await Promise.race([requested, timeout, cancellation.promise]);\n timeoutController.abort();\n cancellation.dispose();\n if (observed.kind !== \"response\") {\n requestController.abort();\n return observed;\n }\n\n const status = healthSchema.shape.expectedStatus.safeParse(observed.response.status);\n await observed.response.body?.cancel().catch(() => undefined);\n return status.success ? { kind: \"response\", status: status.data } : { kind: \"network\" };\n}\n\nfunction cancellationOf(signal: AbortSignal | undefined): Cancellation {\n let dispose = (): void => undefined;\n const promise = new Promise<Attempt>((resolve) => {\n if (signal === undefined) return;\n const abort = (): void => resolve({ kind: \"cancelled\" });\n signal.addEventListener(\"abort\", abort, { once: true });\n dispose = (): void => signal.removeEventListener(\"abort\", abort);\n if (signal.aborted) abort();\n });\n return { promise, dispose: () => dispose() };\n}\n\nasync function wait(\n clock: Clock,\n milliseconds: number,\n signal: AbortSignal | undefined,\n): Promise<void> {\n try {\n await clock.sleep(milliseconds, signal);\n } catch (error) {\n if (signal?.aborted) throw new HealthError(\"cancelled\", { cause: error });\n throw new HealthError(\"clock_failed\", { cause: error });\n }\n assertActive(signal);\n}\n\nfunction assertActive(signal: AbortSignal | undefined): void {\n if (signal?.aborted) throw new HealthError(\"cancelled\");\n}\n\nfunction result(\n input: HealthInput,\n status: HealthResult[\"status\"],\n attempts: number,\n observedStatus?: number,\n): HealthResult {\n return healthResultSchema.parse({\n schemaVersion: 1,\n releaseId: input.releaseId,\n status,\n attempts,\n ...(observedStatus === undefined ? {} : { observedStatus }),\n checkedAt: input.checkedAt,\n });\n}\n","import { z } from \"zod\";\n\nimport {\n containerRolloutSchema,\n healthSchema,\n strategySchema,\n type ContainerRollout,\n} from \"./config.js\";\nimport type { Plan, ReleasePlan } from \"./plan.js\";\nimport { failureSchema, publishedWorkloadSchema } from \"./receipt.js\";\nimport { effectIntentSchema } from \"./safety.js\";\nimport {\n releaseIdentitySchema,\n stagedReleaseSchema,\n type ObservedRelease,\n type StagedRelease,\n} from \"./target.js\";\n\nconst timestampSchema = z.iso.datetime({ offset: true });\nconst signalSchema = z.custom<AbortSignal>(\n (value) => typeof AbortSignal !== \"undefined\" && value instanceof AbortSignal,\n \"Signal must be an AbortSignal\",\n);\n\nconst contextShape = {\n attemptId: effectIntentSchema.shape.attemptId,\n signal: signalSchema.optional(),\n};\n\nexport const rolloutIdSchema = z.union([strategySchema, z.literal(\"stack\")]);\nexport const containerStrategySchema = z.enum([\"recreate\", \"blue-green\"]);\n\nexport const rolloutContextSchema = z.strictObject(contextShape).readonly();\n\nexport const activateContextSchema = z\n .strictObject({\n ...contextShape,\n activatedAt: timestampSchema,\n })\n .readonly();\n\nexport const verifyContextSchema = z\n .strictObject({\n ...contextShape,\n checkedAt: timestampSchema,\n })\n .readonly();\n\nexport const recoverContextSchema = z\n .strictObject({\n ...contextShape,\n recoveredAt: timestampSchema,\n })\n .readonly();\n\nexport const activatedReleaseSchema = z\n .unknown()\n .transform((input, context) => {\n if (!isRecord(input)) {\n context.addIssue({ code: \"custom\", message: \"Activated release must be an object\" });\n return z.NEVER;\n }\n\n const { activatedAt: rawActivatedAt, ...rawRelease } = input;\n const release = stagedReleaseSchema.safeParse(rawRelease);\n const activatedAt = timestampSchema.safeParse(rawActivatedAt);\n if (!release.success) {\n for (const issue of release.error.issues) {\n context.addIssue({\n code: \"custom\",\n path: issue.path,\n message: issue.message,\n });\n }\n }\n if (!activatedAt.success) {\n context.addIssue({\n code: \"custom\",\n path: [\"activatedAt\"],\n message: \"Activation timestamp must be an ISO datetime with an offset\",\n });\n }\n if (!release.success || !activatedAt.success) return z.NEVER;\n\n return { ...release.data, activatedAt: activatedAt.data };\n })\n .readonly();\n\nconst healthResultShape = {\n schemaVersion: z.literal(1),\n releaseId: releaseIdentitySchema,\n status: z.enum([\"healthy\", \"unhealthy\", \"unknown\"]),\n attempts: healthSchema.shape.attempts,\n observedStatus: healthSchema.shape.expectedStatus.optional(),\n checkedAt: timestampSchema,\n};\n\nfunction validateHealth(\n value: z.infer<z.ZodObject<typeof healthResultShape>>,\n context: z.RefinementCtx,\n): void {\n if (value.status === \"healthy\" && value.observedStatus === undefined) {\n context.addIssue({\n code: \"custom\",\n path: [\"observedStatus\"],\n message: \"Healthy evidence must include the observed HTTP status\",\n });\n }\n if (value.status === \"unknown\" && value.observedStatus !== undefined) {\n context.addIssue({\n code: \"custom\",\n path: [\"observedStatus\"],\n message: \"Unknown health cannot claim an observed HTTP status\",\n });\n }\n}\n\nexport const healthResultSchema = z\n .strictObject(healthResultShape)\n .superRefine((value, context) => {\n validateHealth(value, context);\n })\n .readonly();\n\nexport const workloadSelectionSchema = z\n .strictObject({\n workload: publishedWorkloadSchema.shape.workload,\n policy: containerRolloutSchema,\n })\n .readonly();\n\nconst workloadEffectShape = {\n schemaVersion: z.literal(1),\n workload: publishedWorkloadSchema.shape.workload,\n releaseId: releaseIdentitySchema,\n};\n\nconst workloadActivationSucceededSchema = z.strictObject({\n ...workloadEffectShape,\n status: z.literal(\"succeeded\"),\n effect: z.literal(\"acknowledged\"),\n});\n\nconst workloadActivationFailedSchema = z.strictObject({\n ...workloadEffectShape,\n status: z.literal(\"failed\"),\n effect: z.enum([\"none\", \"acknowledged\"]),\n failure: failureSchema,\n});\n\nconst workloadActivationUnknownSchema = z.strictObject({\n ...workloadEffectShape,\n status: z.literal(\"unknown\"),\n effect: z.literal(\"unknown\"),\n failure: failureSchema,\n});\n\nexport const workloadActivationOutcomeSchema = z\n .discriminatedUnion(\"status\", [\n workloadActivationSucceededSchema,\n workloadActivationFailedSchema,\n workloadActivationUnknownSchema,\n ])\n .superRefine((value, context) => {\n if (value.status === \"succeeded\") return;\n if (\n value.failure.category !== \"activation\" ||\n value.failure.phase !== \"activation-prepared\" ||\n value.failure.effect !== value.effect\n ) {\n context.addIssue({\n code: \"custom\",\n path: [\"failure\"],\n message: \"Workload activation failure must match its activation effect\",\n });\n }\n })\n .readonly();\n\nexport const workloadHealthResultSchema = z\n .strictObject({\n ...healthResultShape,\n workload: publishedWorkloadSchema.shape.workload,\n })\n .superRefine((value, context) => {\n validateHealth(value, context);\n })\n .readonly();\n\nconst workloadRecoverySucceededSchema = z.strictObject({\n ...workloadEffectShape,\n status: z.literal(\"recovered\"),\n effect: z.literal(\"acknowledged\"),\n});\n\nconst workloadRecoveryFailedSchema = z.strictObject({\n ...workloadEffectShape,\n status: z.literal(\"failed\"),\n effect: z.enum([\"none\", \"acknowledged\"]),\n failure: failureSchema,\n});\n\nconst workloadRecoveryUnknownSchema = z.strictObject({\n ...workloadEffectShape,\n status: z.literal(\"unknown\"),\n effect: z.literal(\"unknown\"),\n failure: failureSchema,\n});\n\nexport const workloadRecoveryOutcomeSchema = z\n .discriminatedUnion(\"status\", [\n workloadRecoverySucceededSchema,\n workloadRecoveryFailedSchema,\n workloadRecoveryUnknownSchema,\n ])\n .superRefine((value, context) => {\n if (value.status === \"recovered\") return;\n if (\n value.failure.category !== \"rollback\" ||\n value.failure.phase !== \"rollback-pending\" ||\n value.failure.effect !== value.effect\n ) {\n context.addIssue({\n code: \"custom\",\n path: [\"failure\"],\n message: \"Workload recovery failure must match its rollback effect\",\n });\n }\n })\n .readonly();\n\nconst recoveredOutcomeSchema = z.strictObject({\n schemaVersion: z.literal(1),\n status: z.literal(\"recovered\"),\n effect: z.literal(\"acknowledged\"),\n release: activatedReleaseSchema,\n});\n\nconst failedOutcomeSchema = z.strictObject({\n schemaVersion: z.literal(1),\n status: z.literal(\"failed\"),\n effect: z.enum([\"none\", \"acknowledged\"]),\n observedRelease: releaseIdentitySchema.optional(),\n failure: failureSchema,\n});\n\nconst unknownOutcomeSchema = z.strictObject({\n schemaVersion: z.literal(1),\n status: z.literal(\"unknown\"),\n effect: z.literal(\"unknown\"),\n observedRelease: releaseIdentitySchema.optional(),\n failure: failureSchema,\n});\n\nexport const recoveryOutcomeSchema = z\n .discriminatedUnion(\"status\", [recoveredOutcomeSchema, failedOutcomeSchema, unknownOutcomeSchema])\n .superRefine((value, context) => {\n if (value.status === \"recovered\") return;\n\n if (value.failure.category !== \"rollback\" || value.failure.phase !== \"rollback-pending\") {\n context.addIssue({\n code: \"custom\",\n path: [\"failure\"],\n message: \"Recovery failure must describe the rollback-pending phase\",\n });\n }\n if (value.failure.effect !== value.effect) {\n context.addIssue({\n code: \"custom\",\n path: [\"failure\", \"effect\"],\n message: \"Recovery outcome and failure effects must match\",\n });\n }\n if (value.status === \"failed\" && value.effect === \"none\" && value.observedRelease) {\n context.addIssue({\n code: \"custom\",\n path: [\"observedRelease\"],\n message: \"A recovery with no effect cannot report a changed observed release\",\n });\n }\n if (value.status === \"failed\" && value.effect === \"acknowledged\" && !value.observedRelease) {\n context.addIssue({\n code: \"custom\",\n path: [\"observedRelease\"],\n message: \"An acknowledged recovery failure must identify the observed release\",\n });\n }\n })\n .readonly();\n\nexport type RolloutContext = z.infer<typeof rolloutContextSchema>;\nexport type ActivateContext = z.infer<typeof activateContextSchema>;\nexport type VerifyContext = z.infer<typeof verifyContextSchema>;\nexport type RecoverContext = z.infer<typeof recoverContextSchema>;\nexport type ActivatedRelease = z.infer<typeof activatedReleaseSchema>;\nexport type HealthResult = z.infer<typeof healthResultSchema>;\nexport type RecoveryOutcome = z.infer<typeof recoveryOutcomeSchema>;\nexport type RolloutId = z.infer<typeof rolloutIdSchema>;\nexport type ContainerStrategy = z.infer<typeof containerStrategySchema>;\nexport type WorkloadSelection = z.infer<typeof workloadSelectionSchema>;\nexport type WorkloadActivationOutcome = z.infer<typeof workloadActivationOutcomeSchema>;\nexport type WorkloadHealthResult = z.infer<typeof workloadHealthResultSchema>;\nexport type WorkloadRecoveryOutcome = z.infer<typeof workloadRecoveryOutcomeSchema>;\n\nexport interface RolloutAdapter {\n readonly id: RolloutId;\n activate(\n plan: ReleasePlan,\n release: StagedRelease,\n context: ActivateContext,\n ): Promise<ActivatedRelease>;\n verify(plan: Plan, release: ObservedRelease, context: VerifyContext): Promise<HealthResult>;\n recover(\n plan: Plan,\n candidate: ObservedRelease,\n context: RecoverContext,\n ): Promise<RecoveryOutcome>;\n}\n\nexport interface WorkloadRolloutAdapter {\n readonly id: ContainerStrategy;\n activate(\n plan: ReleasePlan,\n release: StagedRelease,\n selection: WorkloadSelection,\n context: ActivateContext,\n ): Promise<WorkloadActivationOutcome>;\n verify(\n plan: Plan,\n release: ObservedRelease,\n selection: WorkloadSelection,\n context: VerifyContext,\n ): Promise<WorkloadHealthResult>;\n recover(\n plan: Plan,\n candidate: ObservedRelease,\n selection: WorkloadSelection,\n context: RecoverContext,\n ): Promise<WorkloadRecoveryOutcome>;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n","import { z } from \"zod\";\n\nimport { createHealthPort, HealthError, type HealthPort } from \"../health.js\";\nimport { TransportError, type Session } from \"../transport/ssh.js\";\n\nconst statusSchema = z.coerce.number().int().min(100).max(599);\nconst script = [\n \"set -eu\",\n 'status=$(curl --silent --show-error --output /dev/null --write-out \"%{http_code}\" --max-time \"$HEALTH_TIMEOUT_SECONDS\" --request \"$HEALTH_METHOD\" --max-redirs 0 \"$HEALTH_URL\")',\n 'printf \"%s\\\\n\" \"$status\"',\n \"\",\n].join(\"\\n\");\n\n/** 候选槽在目标主机回环网络探活,不公开未切流的服务端口。 */\nexport function createSSHHealthPort(session: Pick<Session, \"execute\">): HealthPort {\n return createHealthPort({\n async observe(policy, signal) {\n if (signal?.aborted) throw new HealthError(\"cancelled\");\n try {\n const observation = await session.execute(\n { executable: \"sh\", args: [\"-s\"] },\n {\n input: script,\n env: {\n HEALTH_METHOD: policy.method,\n HEALTH_TIMEOUT_SECONDS: millisecondsToSeconds(policy.timeoutMs),\n HEALTH_URL: policy.url,\n },\n },\n );\n const status = statusSchema.safeParse(observation.stdout.trim());\n return status.success ? status.data : undefined;\n } catch (error) {\n if (signal?.aborted) throw new HealthError(\"cancelled\", { cause: error });\n if (\n error instanceof TransportError &&\n error.code === \"effect_failed\" &&\n error.operation === \"execute\" &&\n error.effect === \"acknowledged\"\n ) {\n return undefined;\n }\n throw error;\n }\n },\n });\n}\n\nfunction millisecondsToSeconds(milliseconds: number): string {\n return (milliseconds / 1_000).toFixed(3);\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { lstat, mkdtemp, realpath, rm, stat, writeFile } from \"node:fs/promises\";\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { isDeepStrictEqual, TextDecoder } from \"node:util\";\n\nimport { z } from \"zod\";\n\nimport type { Command } from \"../config.js\";\nimport type {\n ProcessFailure,\n ProcessFailureReason,\n ProcessOutcome,\n ProcessRunner,\n} from \"../process.js\";\nimport type { Failure } from \"../receipt.js\";\nimport type { LockedStoreBackend, StoreBackend } from \"../safety.js\";\n\nconst MAX_TEXT_LENGTH = 4_096;\nconst MAX_CREDENTIAL_BYTES = 1024 * 1024;\nconst MAX_DOCUMENT_BYTES = 2 * 1024 * 1024;\nconst MAX_DIRECTORY_ENTRIES = 10_000;\nconst MAX_LOCK_OBSERVATIONS = 3;\nconst MAX_TIMEOUT_MS = 2_147_483_647;\nconst REMOTE_TOKEN = /^[A-Za-z0-9_./:@%+=,-]+$/;\nconst REMOTE_ABSOLUTE_PATH = /^\\/(?:[A-Za-z0-9._-]+\\/)*[A-Za-z0-9._-]+$/;\nconst REMOTE_RELATIVE_PATH = /^(?:[A-Za-z0-9._-]+\\/)*[A-Za-z0-9._-]+$/;\nconst REMOTE_ENTRY_NAME = /^[A-Za-z0-9._-]+$/;\nconst USER = /^[a-z_][a-z0-9_-]{0,31}$/;\nconst DNS_LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;\n\nconst digestSchema = z.string().regex(/^sha256:[0-9a-f]{64}$/);\nconst remotePathSchema = z.string().min(1).max(MAX_TEXT_LENGTH).regex(REMOTE_RELATIVE_PATH);\nconst uploadInputSchema = z.strictObject({\n source: z.string().min(1).max(MAX_TEXT_LENGTH),\n destination: remotePathSchema,\n identity: digestSchema,\n});\nconst writeInputSchema = z\n .strictObject({\n destination: remotePathSchema,\n content: z.string(),\n identity: digestSchema,\n mode: z.union([z.literal(0o600), z.literal(0o644)]),\n })\n .superRefine((value, context) => {\n if (Buffer.byteLength(value.content, \"utf8\") > MAX_DOCUMENT_BYTES) {\n context.addIssue({\n code: \"custom\",\n path: [\"content\"],\n message: \"Remote document exceeds its size limit\",\n });\n }\n });\nconst renameInputSchema = z\n .strictObject({\n source: remotePathSchema,\n destination: remotePathSchema,\n replace: z.boolean(),\n })\n .refine((value) => value.source !== value.destination, {\n message: \"Remote rename paths must be distinct\",\n });\nconst linkInputSchema = z\n .strictObject({\n link: remotePathSchema,\n target: remotePathSchema,\n })\n .refine((value) => value.link !== value.target, {\n message: \"Remote link and target paths must be distinct\",\n });\nconst removeInputSchema = z.strictObject({\n path: remotePathSchema,\n kind: z.enum([\"directory\", \"file\", \"symlink\"]),\n});\n\nexport type Effect = Failure[\"effect\"];\nexport type Operation =\n | \"connect\"\n | \"execute\"\n | \"link\"\n | \"list\"\n | \"lock\"\n | \"observe\"\n | \"read\"\n | \"release\"\n | \"remove\"\n | \"rename\"\n | \"upload\"\n | \"write\";\n\nexport type ErrorCode =\n | \"connection_failed\"\n | \"credential_cleanup_failed\"\n | \"credential_setup_failed\"\n | \"destination_conflict\"\n | \"document_too_large\"\n | \"effect_failed\"\n | \"effect_unknown\"\n | \"identity_mismatch\"\n | \"invalid_command\"\n | \"invalid_credentials\"\n | \"invalid_local_file\"\n | \"invalid_options\"\n | \"invalid_plan\"\n | \"invalid_remote_path\"\n | \"lock_effect_unknown\"\n | \"lock_failed\"\n | \"lock_lost\"\n | \"locked\"\n | \"observation_failed\"\n | \"observation_invalid\"\n | \"release_failed\"\n | \"session_closed\"\n | \"session_incomplete\"\n | \"upload_failed\"\n | \"upload_effect_unknown\";\n\n/** SSH 错误只携带稳定分类和效应确定性,不暴露主机、凭据或远端输出。 */\nexport class TransportError extends Error {\n constructor(\n readonly code: ErrorCode,\n readonly operation: Operation,\n readonly effect: Effect,\n readonly retryable: boolean,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"SSHTransportError\";\n }\n}\n\nexport interface Credentials {\n readonly host: string;\n readonly port: number;\n readonly user: string;\n readonly privateKey: string;\n readonly knownHosts: string;\n}\n\nexport interface Options {\n readonly credentials: Credentials;\n readonly cwd: string;\n readonly env: Readonly<Record<string, string>>;\n readonly timeoutMs: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface Scope {\n readonly root: string;\n readonly environment: string;\n readonly dockerConfig?: string;\n}\n\nexport interface Observation {\n readonly status: \"acknowledged\";\n readonly stdout: string;\n readonly durationMs: number;\n}\n\nexport interface ExecuteOptions {\n readonly input?: string;\n readonly redactions?: readonly string[];\n readonly env?: Readonly<Record<string, string>>;\n}\n\nexport type AccessObservation =\n | Readonly<{ kind: \"absent\" }>\n | Readonly<{ kind: \"directory\" | \"file\"; owner: string; mode: string }>\n | Readonly<{ kind: \"other\" }>;\n\nexport type PathObservation =\n | Readonly<{ kind: \"absent\" }>\n | Readonly<{ kind: \"directory\" }>\n | Readonly<{ kind: \"file\"; identity: string; bytes: number }>\n | Readonly<{ kind: \"other\" }>\n | Readonly<{ kind: \"symlink\"; target: string }>;\n\nexport interface UploadInput {\n readonly source: string;\n readonly destination: string;\n readonly identity: string;\n}\n\nexport interface Uploaded {\n readonly identity: string;\n readonly bytes: number;\n}\n\nexport interface RemoteDocument extends Uploaded {\n readonly content: string;\n}\n\nexport interface RemoteEntry {\n readonly name: string;\n readonly kind: \"directory\" | \"file\" | \"symlink\" | \"other\";\n}\n\nexport interface WriteInput {\n readonly destination: string;\n readonly content: string;\n readonly identity: string;\n readonly mode: 0o600 | 0o644;\n}\n\nexport interface RenameInput {\n readonly source: string;\n readonly destination: string;\n readonly replace: boolean;\n}\n\nexport interface LinkInput {\n readonly link: string;\n readonly target: string;\n}\n\nexport interface RemoveInput {\n readonly path: string;\n readonly kind: \"directory\" | \"file\" | \"symlink\";\n}\n\nexport interface Session {\n read(remotePath: string, maxBytes: number): Promise<RemoteDocument | null>;\n writeAtomic(input: WriteInput): Promise<RemoteDocument>;\n rename(input: RenameInput): Promise<void>;\n inspect(remotePath: string): Promise<PathObservation>;\n observeLink(remotePath: string): Promise<string | null>;\n swapLink(input: LinkInput): Promise<string | null>;\n list(remotePath: string): Promise<readonly RemoteEntry[]>;\n remove(input: RemoveInput): Promise<void>;\n execute(command: Command, options?: ExecuteOptions): Promise<Observation>;\n upload(input: UploadInput): Promise<Uploaded>;\n}\n\nexport interface SecureSession extends Session {\n inspectAccess(remotePath: string): Promise<AccessObservation>;\n}\n\nexport interface Port {\n read(\n scope: Scope,\n remotePath: string,\n maxBytes: number,\n options: Options,\n ): Promise<RemoteDocument | null>;\n withLock<Result>(\n scope: Scope,\n options: Options,\n operation: (session: SecureSession) => Promise<Result>,\n ): Promise<Result>;\n}\n\nexport interface Executables {\n readonly ssh?: string;\n readonly scp?: string;\n}\n\ninterface Connection {\n readonly runner: ProcessRunner;\n readonly ssh: string;\n readonly scp: string;\n readonly destination: string;\n readonly root: string;\n readonly environment: string;\n readonly dockerConfig?: string;\n readonly cwd: string;\n readonly env: Readonly<Record<string, string>>;\n readonly timeoutMs: number;\n readonly signal?: AbortSignal;\n readonly sshOptions: readonly string[];\n readonly scpOptions: readonly string[];\n readonly redactions: readonly string[];\n}\n\ninterface Lock {\n readonly directory: string;\n readonly ownerFile: string;\n readonly token: string;\n}\n\ntype LockObservation =\n | Readonly<{ status: \"absent\" }>\n | Readonly<{ status: \"invalid\" }>\n | Readonly<{ status: \"owner\"; token: string }>;\n\nconst RETRYABLE_FAILURES = new Set<ProcessFailureReason>([\"spawn\", \"timeout\"]);\n\n/** OpenSSH 适配器把凭据、连接和远端锁限制在一次调用范围内。 */\nexport function createTransport(runner: ProcessRunner, executables: Executables = {}): Port {\n const ssh = validateExecutable(executables.ssh ?? \"ssh\");\n const scp = validateExecutable(executables.scp ?? \"scp\");\n\n return {\n read: (scope, remotePath, maxBytes, options) =>\n withConnection(runner, ssh, scp, scope, options, \"read\", \"none\", (connection) =>\n readDocument(connection, remotePath, maxBytes),\n ),\n withLock: (scope, options, operation) => {\n if (typeof operation !== \"function\") {\n throw new TransportError(\"invalid_options\", \"lock\", \"none\", false);\n }\n return withConnection(\n runner,\n ssh,\n scp,\n scope,\n options,\n \"lock\",\n \"acknowledged\",\n (connection) => locked(connection, operation),\n );\n },\n };\n}\n\n/** SSH 状态后端复用调用方已持有的远端锁,不建立第二个连接或锁生命周期。 */\nexport function createStoreBackend(session: Session, statePath: string): StoreBackend {\n const parsed = remotePathSchema.safeParse(statePath);\n if (!parsed.success) {\n throw new TransportError(\"invalid_remote_path\", \"read\", \"none\", false, {\n cause: parsed.error,\n });\n }\n\n const backend: LockedStoreBackend = {\n read: async () => (await session.read(parsed.data, MAX_DOCUMENT_BYTES))?.content ?? null,\n writeAtomic: async (document) => {\n await session.writeAtomic({\n destination: parsed.data,\n content: document,\n identity: hashContent(document),\n mode: 0o600,\n });\n },\n };\n\n return {\n ...backend,\n withLock: (operation) => {\n if (typeof operation !== \"function\") {\n throw new TransportError(\"invalid_options\", \"lock\", \"none\", false);\n }\n return operation(backend);\n },\n };\n}\n\nasync function locked<Result>(\n connection: Connection,\n operation: (session: SecureSession) => Promise<Result>,\n): Promise<Result> {\n const lock: Lock = {\n directory: `${connection.root}/state/${connection.environment}.lock`,\n ownerFile: `${connection.root}/state/${connection.environment}.lock/owner`,\n token: randomUUID(),\n };\n await acquire(connection, lock);\n\n const scope = createSession(connection, lock);\n let outcome:\n | { readonly ok: true; readonly value: Result }\n | { readonly ok: false; error: unknown };\n try {\n outcome = { ok: true, value: await operation(scope.session) };\n } catch (error) {\n outcome = { ok: false, error };\n }\n\n try {\n await scope.close();\n } catch (error) {\n outcome = outcome.ok\n ? { ok: false, error }\n : {\n ok: false,\n error: new TransportError(\"session_incomplete\", \"execute\", \"unknown\", false, {\n cause: new AggregateError([outcome.error, error]),\n }),\n };\n }\n\n try {\n await release(connection, lock);\n } catch (error) {\n if (!outcome.ok) {\n throw new TransportError(\"release_failed\", \"release\", effectOf(error), false, {\n cause: new AggregateError([outcome.error, error]),\n });\n }\n throw error;\n }\n\n if (!outcome.ok) throw outcome.error;\n return outcome.value;\n}\n\nfunction createSession(\n connection: Connection,\n lock: Lock,\n): { readonly session: SecureSession; close(): Promise<void> } {\n let accepting = true;\n const pending = new Set<Promise<unknown>>();\n\n const start = <Result>(operation: () => Promise<Result>): Promise<Result> => {\n if (!accepting) {\n return Promise.reject(new TransportError(\"session_closed\", \"execute\", \"none\", false));\n }\n const task = operation();\n pending.add(task);\n void task.then(\n () => pending.delete(task),\n () => pending.delete(task),\n );\n return task;\n };\n\n return {\n session: {\n read: (remotePath, maxBytes) =>\n start(async () => {\n await assertOwned(connection, lock);\n return readDocument(connection, remotePath, maxBytes);\n }),\n writeAtomic: (input) =>\n start(async () => {\n await assertOwned(connection, lock);\n return writeAtomic(connection, lock, input);\n }),\n rename: (input) =>\n start(async () => {\n await assertOwned(connection, lock);\n return renamePath(connection, input);\n }),\n inspect: (remotePath) =>\n start(async () => {\n await assertOwned(connection, lock);\n return inspectPath(connection, remotePath);\n }),\n inspectAccess: (remotePath) =>\n start(async () => {\n await assertOwned(connection, lock);\n return inspectAccess(connection, remotePath);\n }),\n observeLink: (remotePath) =>\n start(async () => {\n await assertOwned(connection, lock);\n return observeLink(connection, remotePath);\n }),\n swapLink: (input) =>\n start(async () => {\n await assertOwned(connection, lock);\n return swapLink(connection, lock, input);\n }),\n list: (remotePath) =>\n start(async () => {\n await assertOwned(connection, lock);\n return listDirectory(connection, remotePath);\n }),\n remove: (input) =>\n start(async () => {\n await assertOwned(connection, lock);\n return removePath(connection, input);\n }),\n execute: (command, options) =>\n start(async () => {\n await assertOwned(connection, lock);\n return executeCommand(connection, command, options);\n }),\n upload: (input) =>\n start(async () => {\n await assertOwned(connection, lock);\n return upload(connection, lock, input);\n }),\n },\n async close() {\n accepting = false;\n const active = [...pending];\n if (active.length === 0) return;\n const results = await Promise.allSettled(active);\n const causes = results.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n throw new TransportError(\"session_incomplete\", \"execute\", \"unknown\", false, {\n cause: causes.length === 0 ? undefined : new AggregateError(causes),\n });\n },\n };\n}\n\nasync function executeCommand(\n connection: Connection,\n command: Command,\n options: ExecuteOptions = {},\n): Promise<Observation> {\n const outcome = await runSSH(\n connection,\n commandLine(connection, command, \"execute\", options.env),\n options.input,\n undefined,\n options.redactions,\n );\n if (outcome.status === \"failed\") throw processError(\"execute\", outcome, true);\n return Object.freeze({\n status: \"acknowledged\",\n stdout: outcome.stdout,\n durationMs: outcome.durationMs,\n });\n}\n\nasync function readDocument(\n connection: Connection,\n remotePath: string,\n maxBytes: number,\n): Promise<RemoteDocument | null> {\n if (!Number.isSafeInteger(maxBytes) || maxBytes < 0 || maxBytes > MAX_DOCUMENT_BYTES) {\n throw new TransportError(\"invalid_options\", \"read\", \"none\", false);\n }\n const target = resolveRemotePath(connection.root, remotePath, \"read\");\n const script =\n `if [ ! -e ${target} ] && [ ! -L ${target} ]; then printf 'absent\\\\n'; exit 0; fi; ` +\n `if [ ! -f ${target} ] || [ -L ${target} ]; then exit 73; fi; ` +\n `bytes=$(wc -c < ${target} | tr -d '[:space:]') || exit 74; ` +\n `case \"$bytes\" in ''|*[!0-9]*) exit 75;; esac; ` +\n `if [ \"$bytes\" -gt ${maxBytes} ]; then exit 76; fi; ` +\n `digest=$(sha256sum -- ${target}) || exit 77; digest=${\"${digest%% *}\"}; ` +\n `printf 'file\\\\t%s\\\\t%s\\\\n' \"$digest\" \"$bytes\"; ` +\n `base64 < ${target} | tr -d '\\\\n'; printf '\\\\n'`;\n const outcome = await runSSH(connection, script, undefined, Math.ceil(maxBytes / 3) * 4 + 256);\n if (outcome.status === \"failed\") {\n if (outcome.reason === \"exit\" && outcome.exitCode === 76) {\n throw new TransportError(\"document_too_large\", \"read\", \"none\", false);\n }\n throw processError(\"read\", outcome, false);\n }\n return parseDocument(outcome.stdout, maxBytes);\n}\n\nfunction parseDocument(stdout: string, maxBytes: number): RemoteDocument | null {\n if (stdout.trim() === \"absent\") return null;\n\n const separator = stdout.indexOf(\"\\n\");\n if (separator < 0) {\n throw new TransportError(\"observation_invalid\", \"read\", \"none\", false);\n }\n const metadata = /^file\\t([0-9a-f]{64})\\t([0-9]+)$/u.exec(stdout.slice(0, separator));\n if (!metadata?.[1] || !metadata[2]) {\n throw new TransportError(\"observation_invalid\", \"read\", \"none\", false);\n }\n const bytes = Number(metadata[2]);\n if (!Number.isSafeInteger(bytes) || bytes < 0 || bytes > maxBytes) {\n throw new TransportError(\"observation_invalid\", \"read\", \"none\", false);\n }\n\n const encoded = stdout.slice(separator + 1).trim();\n if (!validBase64(encoded)) {\n throw new TransportError(\"observation_invalid\", \"read\", \"none\", false);\n }\n const contentBytes = Buffer.from(encoded, \"base64\");\n const identity = `sha256:${metadata[1]}`;\n if (contentBytes.byteLength !== bytes || hashBytes(contentBytes) !== identity) {\n throw new TransportError(\"observation_invalid\", \"read\", \"none\", false);\n }\n\n let content: string;\n try {\n content = new TextDecoder(\"utf-8\", { fatal: true }).decode(contentBytes);\n } catch (error) {\n throw new TransportError(\"observation_invalid\", \"read\", \"none\", false, { cause: error });\n }\n return Object.freeze({ content, identity, bytes });\n}\n\nasync function writeAtomic(\n connection: Connection,\n lock: Lock,\n rawInput: WriteInput,\n): Promise<RemoteDocument> {\n const parsed = writeInputSchema.safeParse(rawInput);\n if (!parsed.success) {\n const code = parsed.error.issues.some((issue) => issue.path[0] === \"destination\")\n ? \"invalid_remote_path\"\n : \"invalid_options\";\n throw new TransportError(code, \"write\", \"none\", false, { cause: parsed.error });\n }\n const input = parsed.data;\n const bytes = Buffer.byteLength(input.content, \"utf8\");\n if (hashContent(input.content) !== input.identity) {\n throw new TransportError(\"identity_mismatch\", \"write\", \"none\", false);\n }\n\n const destination = resolveRemotePath(connection.root, input.destination, \"write\");\n const staging = validateRemoteAbsolutePath(`${destination}.partial.${lock.token}`, \"write\");\n const current = await inspectAbsolutePath(connection, destination);\n if (current.kind === \"directory\" || current.kind === \"other\" || current.kind === \"symlink\") {\n throw new TransportError(\"destination_conflict\", \"write\", \"none\", false);\n }\n const stagedBefore = await inspectAbsolutePath(connection, staging);\n if (stagedBefore.kind !== \"absent\") {\n throw new TransportError(\"destination_conflict\", \"write\", \"none\", false);\n }\n\n const parent = path.posix.dirname(destination);\n const mode = input.mode === 0o600 ? \"600\" : \"644\";\n const script =\n `umask 077; mkdir -p ${parent} || exit 73; ` +\n `if [ -e ${staging} ] || [ -L ${staging} ]; then exit 74; fi; ` +\n `if ! cat > ${staging}; then rm -f -- ${staging}; exit 75; fi; ` +\n `chmod ${mode} ${staging} || { rm -f -- ${staging}; exit 76; }`;\n const outcome = await runSSH(connection, script, input.content);\n\n let staged: PathObservation;\n try {\n staged = await inspectAbsolutePath(connection, staging);\n } catch (error) {\n throw new TransportError(\"effect_unknown\", \"write\", \"unknown\", false, { cause: error });\n }\n const expected: PathObservation = { kind: \"file\", identity: input.identity, bytes };\n if (!isDeepStrictEqual(staged, expected)) {\n if (staged.kind === \"file\") await removeAbsolute(connection, staging, \"file\");\n if (outcome.status === \"failed\" && staged.kind === \"absent\") {\n throw processError(\"write\", outcome, true);\n }\n if (staged.kind === \"file\") {\n throw new TransportError(\"identity_mismatch\", \"write\", \"acknowledged\", false);\n }\n throw new TransportError(\"effect_unknown\", \"write\", \"unknown\", false);\n }\n\n await assertOwned(connection, lock);\n await renameAbsolute(connection, staging, destination, true, staged);\n const observed = await inspectAbsolutePath(connection, destination);\n if (!isDeepStrictEqual(observed, expected)) {\n throw new TransportError(\"effect_unknown\", \"write\", \"unknown\", false);\n }\n return Object.freeze({ content: input.content, identity: input.identity, bytes });\n}\n\nasync function renamePath(connection: Connection, rawInput: RenameInput): Promise<void> {\n const parsed = renameInputSchema.safeParse(rawInput);\n if (!parsed.success) {\n throw new TransportError(\"invalid_remote_path\", \"rename\", \"none\", false, {\n cause: parsed.error,\n });\n }\n const source = resolveRemotePath(connection.root, parsed.data.source, \"rename\");\n const destination = resolveRemotePath(connection.root, parsed.data.destination, \"rename\");\n await renameAbsolute(connection, source, destination, parsed.data.replace);\n}\n\nasync function renameAbsolute(\n connection: Connection,\n source: string,\n destination: string,\n replace: boolean,\n knownSource?: PathObservation,\n): Promise<void> {\n validateRemoteAbsolutePath(source, \"rename\");\n validateRemoteAbsolutePath(destination, \"rename\");\n if (source === destination) {\n throw new TransportError(\"invalid_remote_path\", \"rename\", \"none\", false);\n }\n const sourceBefore = knownSource ?? (await inspectAbsolutePath(connection, source));\n if (sourceBefore.kind === \"absent\" || sourceBefore.kind === \"other\") {\n throw new TransportError(\"observation_invalid\", \"rename\", \"none\", false);\n }\n const destinationBefore = await inspectAbsolutePath(connection, destination);\n if (\n (!replace && destinationBefore.kind !== \"absent\") ||\n (replace && destinationBefore.kind === \"directory\") ||\n destinationBefore.kind === \"other\"\n ) {\n throw new TransportError(\"destination_conflict\", \"rename\", \"none\", false);\n }\n\n const guard = replace\n ? `if [ -d ${destination} ] && [ ! -L ${destination} ]; then exit 73; fi; `\n : `if [ -e ${destination} ] || [ -L ${destination} ]; then exit 73; fi; `;\n // GNU mv 在目标是指向目录的符号链接时会跟进目录;-T 才替换链接本身。\n const outcome = await runSSH(connection, `${guard}mv -fT -- ${source} ${destination}`);\n\n let sourceAfter: PathObservation;\n let destinationAfter: PathObservation;\n try {\n [sourceAfter, destinationAfter] = await Promise.all([\n inspectAbsolutePath(connection, source),\n inspectAbsolutePath(connection, destination),\n ]);\n } catch (error) {\n throw new TransportError(\"effect_unknown\", \"rename\", \"unknown\", false, { cause: error });\n }\n if (sourceAfter.kind === \"absent\" && isDeepStrictEqual(destinationAfter, sourceBefore)) return;\n if (\n isDeepStrictEqual(sourceAfter, sourceBefore) &&\n isDeepStrictEqual(destinationAfter, destinationBefore)\n ) {\n if (outcome.status === \"failed\") throw processError(\"rename\", outcome, true);\n throw new TransportError(\"effect_failed\", \"rename\", \"acknowledged\", true);\n }\n throw new TransportError(\"effect_unknown\", \"rename\", \"unknown\", false);\n}\n\nasync function observeLink(connection: Connection, remotePath: string): Promise<string | null> {\n const link = resolveRemotePath(connection.root, remotePath, \"link\");\n return observeAbsoluteLink(connection, link);\n}\n\nasync function observeAbsoluteLink(connection: Connection, link: string): Promise<string | null> {\n const observed = await inspectAbsolutePath(connection, link);\n if (observed.kind === \"absent\") return null;\n if (observed.kind !== \"symlink\") {\n throw new TransportError(\"observation_invalid\", \"link\", \"none\", false);\n }\n validateLinkTarget(connection.root, link, observed.target);\n return observed.target;\n}\n\nasync function swapLink(\n connection: Connection,\n lock: Lock,\n rawInput: LinkInput,\n): Promise<string | null> {\n const parsed = linkInputSchema.safeParse(rawInput);\n if (!parsed.success) {\n throw new TransportError(\"invalid_remote_path\", \"link\", \"none\", false, {\n cause: parsed.error,\n });\n }\n const link = resolveRemotePath(connection.root, parsed.data.link, \"link\");\n const target = resolveRemotePath(connection.root, parsed.data.target, \"link\");\n const targetObservation = await inspectAbsolutePath(connection, target);\n if (targetObservation.kind !== \"directory\") {\n throw new TransportError(\"observation_invalid\", \"link\", \"none\", false);\n }\n const previous = await observeAbsoluteLink(connection, link);\n const staging = validateRemoteAbsolutePath(`${link}.partial.${lock.token}`, \"link\");\n if ((await inspectAbsolutePath(connection, staging)).kind !== \"absent\") {\n throw new TransportError(\"destination_conflict\", \"link\", \"none\", false);\n }\n\n const outcome = await runSSH(\n connection,\n `if [ -e ${staging} ] || [ -L ${staging} ]; then exit 73; fi; ` +\n `ln -s -- ${target} ${staging}`,\n );\n let staged: PathObservation;\n try {\n staged = await inspectAbsolutePath(connection, staging);\n } catch (error) {\n throw new TransportError(\"effect_unknown\", \"link\", \"unknown\", false, { cause: error });\n }\n if (staged.kind !== \"symlink\" || staged.target !== target) {\n if (staged.kind === \"symlink\") await removeAbsolute(connection, staging, \"symlink\");\n if (outcome.status === \"failed\" && staged.kind === \"absent\") {\n throw processError(\"link\", outcome, true);\n }\n throw new TransportError(\"effect_unknown\", \"link\", \"unknown\", false);\n }\n\n await assertOwned(connection, lock);\n await renameAbsolute(connection, staging, link, true, staged);\n const observed = await observeAbsoluteLink(connection, link);\n if (observed !== target) {\n throw new TransportError(\"effect_unknown\", \"link\", \"unknown\", false);\n }\n return previous;\n}\n\nasync function listDirectory(\n connection: Connection,\n remotePath: string,\n): Promise<readonly RemoteEntry[]> {\n const target = resolveRemotePath(connection.root, remotePath, \"list\");\n const script =\n `if [ ! -d ${target} ] || [ -L ${target} ]; then exit 73; fi; ` +\n `find ${target} -mindepth 1 -maxdepth 1 -exec sh -c '` +\n `for entry do ` +\n `if [ -L \"$entry\" ]; then kind=l; elif [ -d \"$entry\" ]; then kind=d; ` +\n `elif [ -f \"$entry\" ]; then kind=f; else kind=o; fi; ` +\n `name=${\"${entry##*/}\"}; printf \"%s\\\\000%s\\\\000\" \"$name\" \"$kind\"; done` +\n `' sh {} +`;\n const outcome = await runSSH(connection, script, undefined, MAX_DOCUMENT_BYTES);\n if (outcome.status === \"failed\") throw processError(\"list\", outcome, false);\n return parseEntries(outcome.stdout);\n}\n\nfunction parseEntries(stdout: string): readonly RemoteEntry[] {\n if (stdout.length === 0) return Object.freeze([]);\n const fields = stdout.split(\"\\0\");\n if (fields.pop() !== \"\" || fields.length % 2 !== 0) {\n throw new TransportError(\"observation_invalid\", \"list\", \"none\", false);\n }\n\n const entries: RemoteEntry[] = [];\n const names = new Set<string>();\n for (let index = 0; index < fields.length; index += 2) {\n const name = fields[index];\n const rawKind = fields[index + 1];\n if (\n !name ||\n name.length > 255 ||\n name === \".\" ||\n name === \"..\" ||\n !REMOTE_ENTRY_NAME.test(name) ||\n names.has(name) ||\n !rawKind\n ) {\n throw new TransportError(\"observation_invalid\", \"list\", \"none\", false);\n }\n names.add(name);\n const kind: RemoteEntry[\"kind\"] =\n rawKind === \"d\"\n ? \"directory\"\n : rawKind === \"f\"\n ? \"file\"\n : rawKind === \"l\"\n ? \"symlink\"\n : \"other\";\n entries.push(Object.freeze({ name, kind }));\n if (entries.length > MAX_DIRECTORY_ENTRIES) {\n throw new TransportError(\"observation_invalid\", \"list\", \"none\", false);\n }\n }\n entries.sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));\n return Object.freeze(entries);\n}\n\nasync function removePath(connection: Connection, rawInput: RemoveInput): Promise<void> {\n const parsed = removeInputSchema.safeParse(rawInput);\n if (!parsed.success) {\n const code = parsed.error.issues.some((issue) => issue.path[0] === \"path\")\n ? \"invalid_remote_path\"\n : \"invalid_options\";\n throw new TransportError(code, \"remove\", \"none\", false, { cause: parsed.error });\n }\n const target = resolveRemotePath(connection.root, parsed.data.path, \"remove\");\n await removeAbsolute(connection, target, parsed.data.kind);\n}\n\nasync function removeAbsolute(\n connection: Connection,\n target: string,\n kind: RemoveInput[\"kind\"],\n): Promise<void> {\n validateRemoteAbsolutePath(target, \"remove\");\n const before = await inspectAbsolutePath(connection, target);\n if (before.kind === \"absent\") return;\n if (before.kind !== kind) {\n throw new TransportError(\"observation_invalid\", \"remove\", \"none\", false);\n }\n const command = kind === \"directory\" ? `rm -rf -- ${target}` : `rm -f -- ${target}`;\n const outcome = await runSSH(connection, command);\n\n let after: PathObservation;\n try {\n after = await inspectAbsolutePath(connection, target);\n } catch (error) {\n throw new TransportError(\"effect_unknown\", \"remove\", \"unknown\", false, { cause: error });\n }\n if (after.kind === \"absent\") return;\n if (isDeepStrictEqual(after, before)) {\n if (outcome.status === \"failed\") throw processError(\"remove\", outcome, true);\n throw new TransportError(\"effect_failed\", \"remove\", \"acknowledged\", true);\n }\n throw new TransportError(\"effect_unknown\", \"remove\", \"unknown\", false);\n}\n\nasync function acquire(connection: Connection, lock: Lock): Promise<void> {\n const stateDirectory = `${connection.root}/state`;\n const script =\n `umask 077; mkdir -p ${stateDirectory} || exit 74; ` +\n `if mkdir ${lock.directory} 2>/dev/null; then ` +\n `if printf '%s\\\\n' ${lock.token} > ${lock.ownerFile}; then exit 0; fi; ` +\n `if rmdir ${lock.directory} 2>/dev/null; then exit 75; fi; exit 76; ` +\n `fi; exit 73`;\n const outcome = await runSSH(connection, script);\n\n if (outcome.status === \"failed\" && !outcome.dispatched) {\n throw processError(\"lock\", outcome, false);\n }\n if (outcome.status === \"failed\" && outcome.reason === \"exit\" && outcome.exitCode === 73) {\n throw new TransportError(\"locked\", \"lock\", \"none\", false);\n }\n\n const observed = await observeLockAfterDispatch(connection, lock, outcome);\n if (observed.status === \"owner\" && observed.token === lock.token) return;\n if (observed.status === \"owner\") {\n throw new TransportError(\"locked\", \"lock\", \"none\", false);\n }\n if (observed.status === \"absent\") {\n throw new TransportError(\"lock_failed\", \"lock\", \"none\", true);\n }\n throw new TransportError(\"lock_effect_unknown\", \"lock\", \"unknown\", false);\n}\n\nasync function observeLockAfterDispatch(\n connection: Connection,\n lock: Lock,\n outcome: ProcessOutcome,\n): Promise<LockObservation> {\n const retry = outcome.status === \"failed\" && outcome.dispatched;\n let lastError: unknown;\n for (let attempt = 0; attempt < MAX_LOCK_OBSERVATIONS; attempt += 1) {\n try {\n const observed = await observeLock(connection, lock);\n if (!retry || (observed.status !== \"absent\" && observed.status !== \"invalid\"))\n return observed;\n lastError = undefined;\n } catch (error) {\n lastError = error;\n if (!(error instanceof TransportError) || !error.retryable) {\n throw new TransportError(\"lock_effect_unknown\", \"lock\", \"unknown\", false, {\n cause: error,\n });\n }\n }\n }\n if (lastError !== undefined)\n throw new TransportError(\"lock_effect_unknown\", \"lock\", \"unknown\", false, {\n cause: lastError,\n });\n throw new TransportError(\"lock_effect_unknown\", \"lock\", \"unknown\", false);\n}\n\nasync function release(connection: Connection, lock: Lock): Promise<void> {\n const script =\n `if [ ! -d ${lock.directory} ]; then exit 73; fi; ` +\n `IFS= read -r owner < ${lock.ownerFile} || exit 74; ` +\n `if [ \"$owner\" != ${lock.token} ]; then exit 75; fi; ` +\n `rm -f ${lock.ownerFile} || exit 76; rmdir ${lock.directory} || exit 77`;\n const outcome = await runSSH(connection, script);\n if (outcome.status === \"failed\" && !outcome.dispatched) {\n throw processError(\"release\", outcome, false);\n }\n\n let observed: LockObservation;\n try {\n observed = await observeLock(connection, lock);\n } catch (error) {\n throw new TransportError(\"release_failed\", \"release\", \"unknown\", false, { cause: error });\n }\n if (observed.status === \"absent\") return;\n if (observed.status === \"owner\" && observed.token === lock.token) {\n throw new TransportError(\"release_failed\", \"release\", \"acknowledged\", true);\n }\n throw new TransportError(\"lock_lost\", \"release\", \"unknown\", false);\n}\n\nasync function assertOwned(connection: Connection, lock: Lock): Promise<void> {\n const observed = await observeLock(connection, lock);\n if (observed.status === \"owner\" && observed.token === lock.token) return;\n throw new TransportError(\"lock_lost\", \"lock\", \"none\", false);\n}\n\nasync function observeLock(connection: Connection, lock: Lock): Promise<LockObservation> {\n const script =\n `if [ ! -d ${lock.directory} ]; then printf 'absent\\\\n'; ` +\n `elif [ ! -f ${lock.ownerFile} ]; then printf 'invalid\\\\n'; ` +\n `else IFS= read -r owner < ${lock.ownerFile} || exit 73; ` +\n `printf 'owner\\\\t%s\\\\n' \"$owner\"; fi`;\n const outcome = await runSSH(connection, script);\n if (outcome.status === \"failed\") throw processError(\"observe\", outcome, false);\n\n const document = outcome.stdout.trim();\n if (document === \"absent\") return Object.freeze({ status: \"absent\" });\n if (document === \"invalid\") return Object.freeze({ status: \"invalid\" });\n const match =\n /^owner\\t([0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})$/i.exec(\n document,\n );\n if (!match?.[1]) {\n throw new TransportError(\"observation_invalid\", \"observe\", \"none\", false);\n }\n return Object.freeze({ status: \"owner\", token: match[1].toLowerCase() });\n}\n\nasync function inspectPath(connection: Connection, remotePath: string): Promise<PathObservation> {\n const target = resolveRemotePath(connection.root, remotePath, \"observe\");\n return inspectAbsolutePath(connection, target);\n}\n\nasync function inspectAccess(\n connection: Connection,\n remotePath: string,\n): Promise<AccessObservation> {\n const target = resolveRemotePath(connection.root, remotePath, \"observe\");\n const script =\n `if [ ! -e ${target} ] && [ ! -L ${target} ]; then printf 'absent\\\\n'; exit 0; ` +\n `elif [ -L ${target} ]; then printf 'other\\\\n'; exit 0; ` +\n `elif [ -f ${target} ]; then kind=file; ` +\n `elif [ -d ${target} ]; then kind=directory; else printf 'other\\\\n'; exit 0; fi; ` +\n `owner=$(stat -c %U -- ${target}) || exit 73; mode=$(stat -c %a -- ${target}) || exit 74; ` +\n `printf '%s\\\\t%s\\\\t%s\\\\n' \"$kind\" \"$owner\" \"$mode\"`;\n const outcome = await runSSH(connection, script);\n if (outcome.status === \"failed\") throw processError(\"observe\", outcome, false);\n const document = outcome.stdout.trim();\n if (document === \"absent\") return Object.freeze({ kind: \"absent\" });\n if (document === \"other\") return Object.freeze({ kind: \"other\" });\n const match = /^(directory|file)\\t([a-z_][a-z0-9_-]{0,31})\\t([0-7]{3,4})$/u.exec(document);\n if (!match?.[1] || !match[2] || !match[3]) {\n throw new TransportError(\"observation_invalid\", \"observe\", \"none\", false);\n }\n return Object.freeze({\n kind: match[1] as \"directory\" | \"file\",\n owner: match[2],\n mode: match[3],\n });\n}\n\nasync function inspectAbsolutePath(\n connection: Connection,\n target: string,\n): Promise<PathObservation> {\n const script =\n `if [ -L ${target} ]; then printf 'symlink\\\\t'; readlink -- ${target}; ` +\n `elif [ -f ${target} ]; then ` +\n `digest=$(sha256sum -- ${target}) || exit 73; digest=${\"${digest%% *}\"}; ` +\n `bytes=$(wc -c < ${target} | tr -d '[:space:]') || exit 74; ` +\n `printf 'file\\\\t%s\\\\t%s\\\\n' \"$digest\" \"$bytes\"; ` +\n `elif [ -d ${target} ]; then printf 'directory\\\\n'; ` +\n `elif [ -e ${target} ]; then printf 'other\\\\n'; else printf 'absent\\\\n'; fi`;\n const outcome = await runSSH(connection, script);\n if (outcome.status === \"failed\") throw processError(\"observe\", outcome, false);\n return parsePathObservation(outcome.stdout);\n}\n\nfunction parsePathObservation(stdout: string): PathObservation {\n const document = stdout.trim();\n if (document === \"absent\") return Object.freeze({ kind: \"absent\" });\n if (document === \"directory\") return Object.freeze({ kind: \"directory\" });\n if (document === \"other\") return Object.freeze({ kind: \"other\" });\n\n const file = /^file\\t([0-9a-f]{64})\\t([0-9]+)$/.exec(document);\n if (file?.[1] && file[2]) {\n const bytes = Number(file[2]);\n if (!Number.isSafeInteger(bytes) || bytes < 0) {\n throw new TransportError(\"observation_invalid\", \"observe\", \"none\", false);\n }\n return Object.freeze({ kind: \"file\", identity: `sha256:${file[1]}`, bytes });\n }\n\n const symlink = /^symlink\\t([^\\0\\r\\n]+)$/.exec(document);\n if (symlink?.[1] && symlink[1].length <= MAX_TEXT_LENGTH) {\n return Object.freeze({ kind: \"symlink\", target: symlink[1] });\n }\n throw new TransportError(\"observation_invalid\", \"observe\", \"none\", false);\n}\n\nasync function upload(\n connection: Connection,\n lock: Lock,\n rawInput: UploadInput,\n): Promise<Uploaded> {\n const parsed = uploadInputSchema.safeParse(rawInput);\n if (!parsed.success) {\n const code = parsed.error.issues.some((issue) => issue.path[0] === \"destination\")\n ? \"invalid_remote_path\"\n : \"invalid_local_file\";\n throw new TransportError(code, \"upload\", \"none\", false, {\n cause: parsed.error,\n });\n }\n const source = await resolveLocalFile(connection.cwd, parsed.data.source);\n const local = await hashFile(source);\n if (local.identity !== parsed.data.identity) {\n throw new TransportError(\"identity_mismatch\", \"upload\", \"none\", false);\n }\n\n const destination = resolveRemotePath(connection.root, parsed.data.destination, \"upload\");\n const staging = `${destination}.partial.${lock.token}`;\n validateRemoteAbsolutePath(staging, \"upload\");\n const parent = path.posix.dirname(destination);\n const prepare =\n `if [ -e ${destination} ] || [ -L ${destination} ]; then exit 73; fi; ` +\n `mkdir -p ${parent} || exit 74; ` +\n `if [ -e ${staging} ] || [ -L ${staging} ]; then exit 75; fi`;\n const prepared = await runSSH(connection, prepare);\n if (prepared.status === \"failed\") {\n if (prepared.reason === \"exit\" && prepared.exitCode === 73) {\n throw new TransportError(\"destination_conflict\", \"upload\", \"none\", false);\n }\n throw processError(\"upload\", prepared, true);\n }\n\n const copied = await runSCP(connection, source, staging);\n let staged: PathObservation;\n try {\n staged = await inspectAbsolutePath(connection, staging);\n } catch (error) {\n throw new TransportError(\"upload_effect_unknown\", \"upload\", \"unknown\", false, {\n cause: error,\n });\n }\n if (staged.kind !== \"file\") {\n throw new TransportError(\n copied.status === \"failed\" ? \"upload_failed\" : \"identity_mismatch\",\n \"upload\",\n \"acknowledged\",\n false,\n );\n }\n if (staged.identity !== local.identity || staged.bytes !== local.bytes) {\n throw new TransportError(\"identity_mismatch\", \"upload\", \"acknowledged\", false);\n }\n\n await assertOwned(connection, lock);\n const finalize =\n `if [ -e ${destination} ] || [ -L ${destination} ]; then exit 73; fi; ` +\n `mv -- ${staging} ${destination}`;\n const finalized = await runSSH(connection, finalize);\n if (finalized.status === \"failed\" && !finalized.dispatched) {\n throw processError(\"upload\", finalized, false);\n }\n\n let observed: PathObservation;\n try {\n observed = await inspectAbsolutePath(connection, destination);\n } catch (error) {\n throw new TransportError(\"upload_effect_unknown\", \"upload\", \"unknown\", false, {\n cause: error,\n });\n }\n if (\n observed.kind === \"file\" &&\n observed.identity === local.identity &&\n observed.bytes === local.bytes\n ) {\n return Object.freeze(local);\n }\n if (observed.kind === \"absent\") {\n let remaining: PathObservation;\n try {\n remaining = await inspectAbsolutePath(connection, staging);\n } catch (error) {\n throw new TransportError(\"upload_effect_unknown\", \"upload\", \"unknown\", false, {\n cause: error,\n });\n }\n if (\n remaining.kind === \"file\" &&\n remaining.identity === local.identity &&\n remaining.bytes === local.bytes\n ) {\n throw new TransportError(\"upload_failed\", \"upload\", \"acknowledged\", true);\n }\n throw new TransportError(\"upload_effect_unknown\", \"upload\", \"unknown\", false);\n }\n throw new TransportError(\"destination_conflict\", \"upload\", \"acknowledged\", false);\n}\n\nasync function withConnection<Result>(\n runner: ProcessRunner,\n ssh: string,\n scp: string,\n rawScope: Scope,\n rawOptions: Options,\n operation: Operation,\n successEffect: Effect,\n action: (connection: Connection) => Promise<Result>,\n): Promise<Result> {\n const options = validateOptions(rawOptions);\n const scope = validateScope(rawScope);\n const cwd = await resolveCwd(options.cwd);\n let credentialDirectory: string;\n try {\n credentialDirectory = await mkdtemp(path.join(os.tmpdir(), \"stackonward-ssh-\"));\n } catch (error) {\n throw new TransportError(\"credential_setup_failed\", \"connect\", \"none\", true, {\n cause: error,\n });\n }\n\n const keyFile = path.join(credentialDirectory, \"identity\");\n const knownHostsFile = path.join(credentialDirectory, \"known_hosts\");\n try {\n await writeFile(keyFile, trailingNewline(options.credentials.privateKey), {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n await writeFile(knownHostsFile, trailingNewline(options.credentials.knownHosts), {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n } catch (error) {\n try {\n await rm(credentialDirectory, { recursive: true, force: true });\n } catch (cleanupError) {\n throw new TransportError(\"credential_cleanup_failed\", \"connect\", \"none\", false, {\n cause: new AggregateError([error, cleanupError]),\n });\n }\n throw new TransportError(\"credential_setup_failed\", \"connect\", \"none\", true, {\n cause: error,\n });\n }\n\n const connection = createConnection(\n runner,\n ssh,\n scp,\n scope,\n options,\n cwd,\n keyFile,\n knownHostsFile,\n );\n let outcome:\n | { readonly ok: true; readonly value: Result }\n | { readonly ok: false; readonly error: unknown };\n try {\n outcome = { ok: true, value: await action(connection) };\n } catch (error) {\n outcome = { ok: false, error };\n }\n\n try {\n await rm(credentialDirectory, { recursive: true, force: true });\n } catch (cleanupError) {\n const cause = outcome.ok ? cleanupError : new AggregateError([outcome.error, cleanupError]);\n throw new TransportError(\n \"credential_cleanup_failed\",\n operation,\n outcome.ok ? successEffect : effectOf(outcome.error),\n false,\n { cause },\n );\n }\n\n if (!outcome.ok) throw outcome.error;\n return outcome.value;\n}\n\nfunction createConnection(\n runner: ProcessRunner,\n ssh: string,\n scp: string,\n scope: Scope,\n options: Options,\n cwd: string,\n keyFile: string,\n knownHostsFile: string,\n): Connection {\n const host = normalizeHost(options.credentials.host);\n const destination = `${options.credentials.user}@${host}`;\n const connectTimeout = String(Math.max(1, Math.ceil(options.timeoutMs / 1_000)));\n const shared = [\n \"-F\",\n \"/dev/null\",\n \"-o\",\n \"BatchMode=yes\",\n \"-o\",\n \"StrictHostKeyChecking=yes\",\n \"-o\",\n `UserKnownHostsFile=${knownHostsFile}`,\n \"-o\",\n \"GlobalKnownHostsFile=/dev/null\",\n \"-o\",\n \"VerifyHostKeyDNS=no\",\n \"-o\",\n \"PasswordAuthentication=no\",\n \"-o\",\n \"KbdInteractiveAuthentication=no\",\n \"-o\",\n \"IdentitiesOnly=yes\",\n \"-o\",\n \"IdentityAgent=none\",\n \"-o\",\n `IdentityFile=${keyFile}`,\n \"-o\",\n `ConnectTimeout=${connectTimeout}`,\n \"-o\",\n \"LogLevel=ERROR\",\n ];\n return {\n runner,\n ssh,\n scp,\n destination,\n root: scope.root,\n environment: scope.environment,\n ...(scope.dockerConfig === undefined ? {} : { dockerConfig: scope.dockerConfig }),\n cwd,\n env: { ...options.env },\n timeoutMs: options.timeoutMs,\n signal: options.signal,\n sshOptions: [...shared, \"-p\", String(options.credentials.port)],\n scpOptions: [...shared, \"-P\", String(options.credentials.port), \"-q\"],\n redactions: [options.credentials.privateKey],\n };\n}\n\nfunction runSSH(\n connection: Connection,\n remoteCommand: string,\n input?: string,\n maxOutputBytes?: number,\n redactions?: readonly string[],\n): Promise<ProcessOutcome> {\n return connection.runner.run(\n {\n executable: connection.ssh,\n args: [...connection.sshOptions, \"--\", connection.destination, remoteCommand],\n },\n processOptions(connection, input, maxOutputBytes, redactions),\n );\n}\n\nfunction runSCP(\n connection: Connection,\n source: string,\n remoteDestination: string,\n): Promise<ProcessOutcome> {\n validateRemoteAbsolutePath(remoteDestination, \"upload\");\n return connection.runner.run(\n {\n executable: connection.scp,\n args: [\n ...connection.scpOptions,\n \"--\",\n source,\n `${connection.destination}:${remoteDestination}`,\n ],\n },\n processOptions(connection),\n );\n}\n\nfunction processOptions(\n connection: Connection,\n input?: string,\n maxOutputBytes?: number,\n redactions: readonly string[] = [],\n) {\n return {\n cwd: connection.cwd,\n env: connection.env,\n timeoutMs: connection.timeoutMs,\n signal: connection.signal,\n redactions: [...connection.redactions, ...redactions],\n ...(input === undefined ? {} : { input }),\n ...(maxOutputBytes === undefined ? {} : { maxOutputBytes }),\n };\n}\n\nfunction commandLine(\n connection: Connection,\n command: Command,\n operation: \"execute\" | \"observe\",\n commandEnvironment: Readonly<Record<string, string>> = {},\n): string {\n if (\n !validRemoteToken(command.executable, false) ||\n command.args.some((arg) => !validRemoteToken(arg))\n ) {\n throw new TransportError(\"invalid_command\", operation, \"none\", false);\n }\n const entries = Object.entries(commandEnvironment)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([name, value]) => {\n if (\n !ENVIRONMENT_NAME.test(name) ||\n value.includes(\"\\0\") ||\n value.includes(\"\\n\") ||\n value.includes(\"\\r\")\n ) {\n throw new TransportError(\"invalid_options\", operation, \"none\", false);\n }\n return `${name}=${shellToken(value)}`;\n });\n const environment =\n connection.dockerConfig === undefined && entries.length === 0\n ? []\n : [\n \"env\",\n ...(connection.dockerConfig === undefined\n ? []\n : [`DOCKER_CONFIG=${connection.dockerConfig}`]),\n ...entries,\n ];\n return `cd ${connection.root} && exec ${[...environment, command.executable, ...command.args].join(\" \")}`;\n}\n\nconst ENVIRONMENT_NAME = /^[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*$/;\n\nfunction shellToken(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction validRemoteToken(value: string, allowLeadingDash = true): boolean {\n return (\n value.length > 0 &&\n value.length <= MAX_TEXT_LENGTH &&\n REMOTE_TOKEN.test(value) &&\n (allowLeadingDash || !value.startsWith(\"-\"))\n );\n}\n\nfunction resolveRemotePath(root: string, value: string, operation: Operation): string {\n if (!REMOTE_RELATIVE_PATH.test(value) || value.length > MAX_TEXT_LENGTH) {\n throw new TransportError(\"invalid_remote_path\", operation, \"none\", false);\n }\n const resolved = path.posix.join(root, value);\n if (resolved === root || !resolved.startsWith(`${root}/`)) {\n throw new TransportError(\"invalid_remote_path\", operation, \"none\", false);\n }\n return validateRemoteAbsolutePath(resolved, operation);\n}\n\nfunction validateRemoteAbsolutePath(value: string, operation: Operation = \"observe\"): string {\n if (\n value.length === 0 ||\n value.length > MAX_TEXT_LENGTH ||\n !REMOTE_ABSOLUTE_PATH.test(value) ||\n path.posix.normalize(value) !== value\n ) {\n throw new TransportError(\"invalid_remote_path\", operation, \"none\", false);\n }\n return value;\n}\n\nfunction validateLinkTarget(root: string, link: string, target: string): string {\n if (target.length === 0 || target.length > MAX_TEXT_LENGTH || /[\\0\\r\\n]/u.test(target)) {\n throw new TransportError(\"observation_invalid\", \"link\", \"none\", false);\n }\n const resolved = target.startsWith(\"/\")\n ? validateRemoteAbsolutePath(target, \"link\")\n : REMOTE_RELATIVE_PATH.test(target) && path.posix.normalize(target) === target\n ? path.posix.resolve(path.posix.dirname(link), target)\n : \"\";\n if (resolved === root || !resolved.startsWith(`${root}/`)) {\n throw new TransportError(\"observation_invalid\", \"link\", \"none\", false);\n }\n return validateRemoteAbsolutePath(resolved, \"link\");\n}\n\nfunction validateScope(input: Scope): Scope {\n if (!input || typeof input !== \"object\" || !DNS_LABEL.test(input.environment)) {\n throw new TransportError(\"invalid_plan\", \"connect\", \"none\", false);\n }\n const root = validateRemoteAbsolutePath(input.root, \"connect\");\n if (root === \"/\") {\n throw new TransportError(\"invalid_plan\", \"connect\", \"none\", false);\n }\n if (input.dockerConfig === undefined) {\n return Object.freeze({ root, environment: input.environment });\n }\n const dockerConfig = validateRemoteAbsolutePath(input.dockerConfig, \"connect\");\n if (dockerConfig === root || !dockerConfig.startsWith(`${root}/`)) {\n throw new TransportError(\"invalid_plan\", \"connect\", \"none\", false);\n }\n return Object.freeze({ root, environment: input.environment, dockerConfig });\n}\n\nfunction validateOptions(input: Options): Options {\n if (\n !input ||\n typeof input !== \"object\" ||\n !Number.isSafeInteger(input.timeoutMs) ||\n input.timeoutMs <= 0 ||\n input.timeoutMs > MAX_TIMEOUT_MS ||\n typeof input.cwd !== \"string\" ||\n input.cwd.length === 0 ||\n input.cwd.includes(\"\\0\") ||\n !input.env ||\n typeof input.env !== \"object\" ||\n !Object.entries(input.env).every(\n ([name, value]) =>\n name.length > 0 &&\n !name.includes(\"=\") &&\n !name.includes(\"\\0\") &&\n typeof value === \"string\" &&\n !value.includes(\"\\0\"),\n ) ||\n (input.signal !== undefined && !(input.signal instanceof AbortSignal))\n ) {\n throw new TransportError(\"invalid_options\", \"connect\", \"none\", false);\n }\n validateCredentials(input.credentials);\n return input;\n}\n\nfunction validateCredentials(credentials: Credentials): void {\n if (\n !credentials ||\n typeof credentials !== \"object\" ||\n typeof credentials.host !== \"string\" ||\n typeof credentials.user !== \"string\" ||\n typeof credentials.privateKey !== \"string\" ||\n typeof credentials.knownHosts !== \"string\" ||\n !Number.isSafeInteger(credentials.port) ||\n credentials.port < 1 ||\n credentials.port > 65_535 ||\n !USER.test(credentials.user) ||\n Buffer.byteLength(credentials.privateKey) === 0 ||\n Buffer.byteLength(credentials.privateKey) > MAX_CREDENTIAL_BYTES ||\n credentials.privateKey.includes(\"\\0\") ||\n Buffer.byteLength(credentials.knownHosts) === 0 ||\n Buffer.byteLength(credentials.knownHosts) > MAX_CREDENTIAL_BYTES ||\n credentials.knownHosts.includes(\"\\0\") ||\n !credentials.knownHosts\n .split(/\\r?\\n/u)\n .some((line) => line.trim().length > 0 && !line.trimStart().startsWith(\"#\"))\n ) {\n throw new TransportError(\"invalid_credentials\", \"connect\", \"none\", false);\n }\n normalizeHost(credentials.host);\n}\n\nfunction normalizeHost(value: string): string {\n if (value.length === 0 || value.length > 253 || /[\\0\\r\\n\\s@\\[\\]]/u.test(value)) {\n throw new TransportError(\"invalid_credentials\", \"connect\", \"none\", false);\n }\n const ip = net.isIP(value);\n if (ip === 4) return value;\n if (ip === 6) return `[${value}]`;\n\n const normalized = value.toLowerCase();\n if (normalized.endsWith(\".\") || normalized.split(\".\").some((label) => !DNS_LABEL.test(label))) {\n throw new TransportError(\"invalid_credentials\", \"connect\", \"none\", false);\n }\n return normalized;\n}\n\nfunction validateExecutable(value: string): string {\n if (\n value.length === 0 ||\n value.length > MAX_TEXT_LENGTH ||\n /[\\0\\r\\n]/u.test(value) ||\n value.trim() !== value\n ) {\n throw new TransportError(\"invalid_options\", \"connect\", \"none\", false);\n }\n return value;\n}\n\nasync function resolveCwd(value: string): Promise<string> {\n try {\n const resolved = await realpath(path.resolve(value));\n if (!(await stat(resolved)).isDirectory()) throw new Error();\n return resolved;\n } catch (error) {\n throw new TransportError(\"invalid_options\", \"connect\", \"none\", false, { cause: error });\n }\n}\n\nasync function resolveLocalFile(cwd: string, value: string): Promise<string> {\n if (value.length === 0 || value.length > MAX_TEXT_LENGTH || /[\\0\\r\\n]/u.test(value)) {\n throw new TransportError(\"invalid_local_file\", \"upload\", \"none\", false);\n }\n const requested = path.resolve(cwd, value);\n try {\n const requestedInfo = await lstat(requested);\n if (!requestedInfo.isFile() || requestedInfo.isSymbolicLink()) throw new Error();\n const resolved = await realpath(requested);\n const relative = path.relative(cwd, resolved);\n if (\n relative === \"\" ||\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n ) {\n throw new Error();\n }\n return resolved;\n } catch (error) {\n throw new TransportError(\"invalid_local_file\", \"upload\", \"none\", false, {\n cause: error,\n });\n }\n}\n\nasync function hashFile(filename: string): Promise<Uploaded> {\n const hash = createHash(\"sha256\");\n let bytes = 0;\n try {\n for await (const chunk of createReadStream(filename)) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n bytes += buffer.byteLength;\n hash.update(buffer);\n }\n } catch (error) {\n throw new TransportError(\"invalid_local_file\", \"upload\", \"none\", false, {\n cause: error,\n });\n }\n return Object.freeze({ identity: `sha256:${hash.digest(\"hex\")}`, bytes });\n}\n\nfunction processError(\n operation: Operation,\n failure: ProcessFailure,\n effectful: boolean,\n): TransportError {\n const effect: Effect =\n !effectful || !failure.dispatched\n ? \"none\"\n : failure.reason === \"exit\" && failure.exitCode !== 255\n ? \"acknowledged\"\n : \"unknown\";\n const code: ErrorCode =\n effect === \"unknown\"\n ? \"effect_unknown\"\n : operation === \"observe\" || operation === \"read\" || operation === \"list\"\n ? \"observation_failed\"\n : operation === \"connect\"\n ? \"connection_failed\"\n : operation === \"upload\"\n ? \"upload_failed\"\n : operation === \"release\"\n ? \"release_failed\"\n : operation === \"lock\"\n ? \"lock_failed\"\n : \"effect_failed\";\n return new TransportError(\n code,\n operation,\n effect,\n effect !== \"unknown\" && RETRYABLE_FAILURES.has(failure.reason),\n );\n}\n\nfunction effectOf(error: unknown): Effect {\n return error instanceof TransportError ? error.effect : \"unknown\";\n}\n\nfunction hashContent(content: string): string {\n return hashBytes(Buffer.from(content, \"utf8\"));\n}\n\nfunction hashBytes(content: Uint8Array): string {\n return `sha256:${createHash(\"sha256\").update(content).digest(\"hex\")}`;\n}\n\nfunction validBase64(value: string): boolean {\n if (!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u.test(value)) {\n return false;\n }\n return Buffer.from(value, \"base64\").toString(\"base64\") === value;\n}\n\nfunction trailingNewline(value: string): string {\n return value.endsWith(\"\\n\") ? value : `${value}\\n`;\n}\n","import type { ReleasePlan } from \"../plan.js\";\nimport {\n createBuildProcessOptions,\n readBuildCandidate,\n type BuildContext,\n type ProfileAdapter,\n} from \"../profile.js\";\nimport type { ProcessFailureReason } from \"../process.js\";\n\ntype BuildErrorCode = \"build_failed\" | \"invalid_plan\" | \"invalid_result\" | \"verify_failed\";\n\nclass BuildError extends Error {\n constructor(\n readonly code: BuildErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"BuildError\";\n }\n}\n\n/** Compose 栈只执行产品构建合同,工作负载选择和发布行为始终留在各自 owner。 */\nexport function createProfile(): ProfileAdapter {\n const profile: ProfileAdapter = {\n id: \"compose-stack\",\n async build(plan, context) {\n assertPlan(plan);\n await run(plan, context, \"verify\");\n await run(plan, context, \"build\");\n\n const result = await readBuildCandidate(plan, context);\n if (result.output.kind !== \"oci-set\") {\n throw new BuildError(\"invalid_result\", \"Compose stack build must produce an OCI set\");\n }\n return result;\n },\n };\n return Object.freeze(profile);\n}\n\nfunction assertPlan(plan: ReleasePlan): void {\n if (plan.config.profile === \"compose-stack\") return;\n throw new BuildError(\"invalid_plan\", \"Compose stack profile requires a compose-stack plan\");\n}\n\nasync function run(\n plan: ReleasePlan,\n context: BuildContext,\n phase: \"verify\" | \"build\",\n): Promise<void> {\n const options = await createBuildProcessOptions(context);\n const outcome = await context.process.run(plan.config.source[phase], options);\n if (outcome.status === \"succeeded\") return;\n throw processError(phase, outcome.reason);\n}\n\nfunction processError(phase: \"verify\" | \"build\", reason: ProcessFailureReason): BuildError {\n return new BuildError(`${phase}_failed`, `${phase} process failed: ${reason}`);\n}\n","import { lstat, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport type { Command, Image } from \"../config.js\";\nimport type { ReleasePlan } from \"../plan.js\";\nimport {\n BUILD_RESULT_PATH_ENV,\n createBuildProcessOptions,\n readBuildCandidate,\n readBuildxImageDigest,\n writeBuildCandidate,\n type BuildContext,\n type BuildResult,\n type ProfileAdapter,\n} from \"../profile.js\";\nimport type { ProcessFailureReason, ProcessOptions, ProcessRunner } from \"../process.js\";\n\nconst registryHostSchema = z\n .string()\n .min(1)\n .max(255)\n .refine((value) => value === value.toLowerCase() && !/[\\s\\0\\r\\n]/u.test(value))\n .refine((value) => {\n try {\n const url = new URL(`https://${value}`);\n return (\n url.host === value &&\n url.hostname.length > 0 &&\n url.username.length === 0 &&\n url.password.length === 0 &&\n url.pathname === \"/\" &&\n url.search.length === 0 &&\n url.hash.length === 0\n );\n } catch {\n return false;\n }\n });\n\nconst registryNamespaceSchema = z\n .string()\n .min(1)\n .max(255)\n .regex(/^[a-z0-9]+(?:[._/-][a-z0-9]+)*$/u);\n\nexport type BuildErrorCode =\n | \"candidate_kind_mismatch\"\n | \"image_build_failed\"\n | \"image_configuration_missing\"\n | \"image_metadata_conflict\"\n | \"image_metadata_invalid\"\n | \"image_source_invalid\"\n | \"invalid_profile\"\n | \"registry_configuration_invalid\"\n | \"source_build_failed\"\n | \"source_verification_failed\";\n\nexport type BuildPhase = \"image\" | \"source-build\" | \"source-verify\" | \"validation\";\n\n/** 构建错误保留稳定阶段和重试分类,不传播工具输出或环境内容。 */\nexport class BuildError extends Error {\n constructor(\n readonly code: BuildErrorCode,\n readonly phase: BuildPhase,\n readonly retryable: boolean,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"BuildError\";\n }\n}\n\ntype ImageBuildResult = Extract<BuildResult, { output: { kind: \"oci\" } }>;\n\nconst RETRYABLE_PROCESS_FAILURES = new Set<ProcessFailureReason>([\"spawn\", \"timeout\"]);\n\nexport const profile: ProfileAdapter = Object.freeze({\n id: \"go-service\",\n\n async build(plan: ReleasePlan, context: BuildContext): Promise<ImageBuildResult> {\n const image = validatePlan(plan);\n const verifyOptions = await createBuildProcessOptions(context);\n const reference = createReference(image, plan.revision, context.registry);\n const source = await validateImageSource(verifyOptions.cwd, image);\n const metadata = await metadataLocation(context, verifyOptions);\n\n await execute(\n context.process,\n plan.config.source.verify,\n verifyOptions,\n \"source_verification_failed\",\n \"source-verify\",\n );\n const buildOptions = await createBuildProcessOptions(context);\n await execute(\n context.process,\n plan.config.source.build,\n buildOptions,\n \"source_build_failed\",\n \"source-build\",\n );\n const imageOptions = await createBuildProcessOptions(context);\n await assertMetadataAbsent(metadata.path);\n await execute(\n context.process,\n {\n executable: \"docker\",\n args: [\n \"buildx\",\n \"build\",\n \"--file\",\n source.dockerfile,\n \"--metadata-file\",\n metadata.path,\n \"--platform\",\n image.platform,\n \"--tag\",\n reference,\n \"--label\",\n `org.opencontainers.image.title=${plan.config.name}`,\n \"--label\",\n `org.opencontainers.image.version=${plan.revision}`,\n \"--label\",\n `org.opencontainers.image.revision=${plan.revision}`,\n \"--load\",\n source.context,\n ],\n },\n imageOptions,\n \"image_build_failed\",\n \"image\",\n );\n\n const identity = await readImageIdentity(metadata.path);\n await writeBuildCandidate(context, {\n schemaVersion: 1,\n kind: \"oci\",\n reference,\n metadataFile: metadata.relative,\n identity,\n });\n\n const result = await readBuildCandidate(plan, context);\n if (!isImageBuildResult(result)) {\n throw new BuildError(\"candidate_kind_mismatch\", \"image\", false);\n }\n return result;\n },\n});\n\nfunction validatePlan(plan: ReleasePlan): Image {\n if (plan.config.profile !== \"go-service\") {\n throw new BuildError(\"invalid_profile\", \"validation\", false);\n }\n if (!plan.config.image) {\n throw new BuildError(\"image_configuration_missing\", \"validation\", false);\n }\n return plan.config.image;\n}\n\nfunction createReference(\n image: Image,\n revision: string,\n registry: BuildContext[\"registry\"],\n): string {\n const host = registryHostSchema.safeParse(registry.host);\n const namespace = registryNamespaceSchema.safeParse(registry.namespace);\n if (!host.success || !namespace.success) {\n throw new BuildError(\"registry_configuration_invalid\", \"validation\", false);\n }\n return `${host.data}/${namespace.data}/${image.repository}:${revision}`;\n}\n\nasync function metadataLocation(\n context: BuildContext,\n options: ProcessOptions,\n): Promise<{ readonly path: string; readonly relative: string }> {\n let artifactRoot: string;\n try {\n artifactRoot = await realpath(context.artifactRoot);\n } catch (error) {\n throw new BuildError(\"image_metadata_invalid\", \"validation\", false, { cause: error });\n }\n const metadataPath = `${options.env[BUILD_RESULT_PATH_ENV]}.buildx.json`;\n const relative = path.relative(artifactRoot, metadataPath);\n if (\n relative.length === 0 ||\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n ) {\n throw new BuildError(\"image_metadata_invalid\", \"validation\", false);\n }\n await assertMetadataAbsent(metadataPath);\n return { path: metadataPath, relative: relative.split(path.sep).join(path.posix.sep) };\n}\n\nasync function validateImageSource(\n projectRoot: string,\n image: Image,\n): Promise<{ readonly context: string; readonly dockerfile: string }> {\n return {\n context: await resolveProjectPath(projectRoot, image.context, \"directory\"),\n dockerfile: await resolveProjectPath(projectRoot, image.dockerfile, \"file\"),\n };\n}\n\nasync function resolveProjectPath(\n projectRoot: string,\n configured: string,\n expected: \"directory\" | \"file\",\n): Promise<string> {\n const candidate = path.resolve(projectRoot, ...configured.replaceAll(\"\\\\\", \"/\").split(\"/\"));\n try {\n const details = await lstat(candidate);\n if (expected === \"file\" ? !details.isFile() : !details.isDirectory()) throw new Error();\n const resolved = await realpath(candidate);\n const relative = path.relative(projectRoot, resolved);\n if (\n resolved !== candidate ||\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n ) {\n throw new Error();\n }\n return resolved;\n } catch (error) {\n throw new BuildError(\"image_source_invalid\", \"validation\", false, { cause: error });\n }\n}\n\nasync function assertMetadataAbsent(metadataPath: string): Promise<void> {\n try {\n await lstat(metadataPath);\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) return;\n throw new BuildError(\"image_metadata_invalid\", \"validation\", false, { cause: error });\n }\n throw new BuildError(\"image_metadata_conflict\", \"validation\", false);\n}\n\nasync function execute(\n runner: ProcessRunner,\n command: Command,\n options: ProcessOptions,\n code: Extract<\n BuildErrorCode,\n \"image_build_failed\" | \"source_build_failed\" | \"source_verification_failed\"\n >,\n phase: Exclude<BuildPhase, \"validation\">,\n): Promise<void> {\n const outcome = await runner.run(command, options);\n if (outcome.status === \"succeeded\") return;\n throw new BuildError(code, phase, RETRYABLE_PROCESS_FAILURES.has(outcome.reason));\n}\n\nasync function readImageIdentity(metadataPath: string): Promise<string> {\n try {\n return await readBuildxImageDigest(metadataPath);\n } catch (error) {\n throw new BuildError(\"image_metadata_invalid\", \"image\", false, { cause: error });\n }\n}\n\nfunction isNodeError(error: unknown, code: string): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === code;\n}\n\nfunction isImageBuildResult(result: BuildResult): result is ImageBuildResult {\n return result.artifact.kind === \"oci\" && result.output.kind === \"oci\";\n}\n","import { lstat, realpath, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport type { ReleasePlan } from \"../plan.js\";\nimport {\n BUILD_RESULT_PATH_ENV,\n createBuildProcessOptions,\n readBuildCandidate,\n readBuildxImageDigest,\n writeBuildCandidate,\n type BuildContext,\n type ProfileAdapter,\n} from \"../profile.js\";\nimport type { ProcessFailureReason, ProcessOptions } from \"../process.js\";\n\nconst namespaceSchema = z\n .string()\n .min(1)\n .max(255)\n .regex(/^[a-z0-9]+(?:[._/-][a-z0-9]+)*$/u);\nexport type ErrorCode =\n | \"build_result_exists\"\n | \"image_build_failed\"\n | \"image_metadata_exists\"\n | \"image_metadata_invalid\"\n | \"invalid_plan\"\n | \"nitro_output_invalid\"\n | \"project_path_invalid\"\n | \"registry_config_invalid\"\n | \"source_build_failed\"\n | \"source_verification_failed\";\n\nexport class BuildError extends Error {\n constructor(\n readonly code: ErrorCode,\n readonly processReason?: ProcessFailureReason,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"NuxtNodeBuildError\";\n }\n}\n\nexport const profile: ProfileAdapter = {\n id: \"nuxt-node\",\n\n async build(plan, context) {\n const { image, output } = requireConfig(plan);\n const processOptions = await createBuildProcessOptions(context);\n const reference = createReference(image.repository, plan.revision, context.registry);\n\n await runRequired(\n context,\n plan.config.source.verify,\n processOptions,\n \"source_verification_failed\",\n );\n await runRequired(context, plan.config.source.build, processOptions, \"source_build_failed\");\n\n await assertAbsent(processOptions.env[BUILD_RESULT_PATH_ENV], \"build_result_exists\");\n await validateSource(processOptions.cwd, output, image.dockerfile, image.context);\n\n const artifactRoot = await realpath(context.artifactRoot);\n const resultPath = processOptions.env[BUILD_RESULT_PATH_ENV];\n const metadataPath = `${resultPath}.buildx.json`;\n await assertAbsent(metadataPath, \"image_metadata_exists\");\n\n await runRequired(\n context,\n {\n executable: \"docker\",\n args: [\n \"buildx\",\n \"build\",\n \"--file\",\n image.dockerfile,\n \"--platform\",\n image.platform,\n \"--tag\",\n reference,\n \"--label\",\n `org.opencontainers.image.title=${plan.config.name}`,\n \"--label\",\n `org.opencontainers.image.version=${plan.revision}`,\n \"--label\",\n `org.opencontainers.image.revision=${plan.revision}`,\n \"--metadata-file\",\n metadataPath,\n \"--load\",\n image.context,\n ],\n },\n processOptions,\n \"image_build_failed\",\n );\n\n const identity = await readIdentity(metadataPath);\n const metadataFile = toPosixRelative(artifactRoot, metadataPath);\n await writeBuildCandidate(context, {\n schemaVersion: 1,\n kind: \"oci\",\n reference,\n metadataFile,\n identity,\n });\n return readBuildCandidate(plan, context);\n },\n};\n\nfunction requireConfig(plan: ReleasePlan): {\n readonly image: NonNullable<ReleasePlan[\"config\"][\"image\"]>;\n readonly output: string;\n} {\n if (plan.config.profile !== \"nuxt-node\" || !plan.config.image || !plan.config.source.output) {\n throw new BuildError(\"invalid_plan\");\n }\n return { image: plan.config.image, output: plan.config.source.output };\n}\n\nfunction createReference(\n repository: string,\n revision: string,\n registry: BuildContext[\"registry\"],\n): string {\n const { host, namespace } = registry;\n if (!host || !namespace || !validHost(host) || !namespaceSchema.safeParse(namespace).success) {\n throw new BuildError(\"registry_config_invalid\");\n }\n return `${host}/${namespace}/${repository}:${revision}`;\n}\n\nfunction validHost(value: string): boolean {\n if (value.length > 255 || /[\\0\\r\\n\\s]/u.test(value)) return false;\n try {\n const url = new URL(`https://${value}`);\n return (\n url.host === value &&\n url.hostname.length > 0 &&\n url.username.length === 0 &&\n url.password.length === 0 &&\n url.pathname === \"/\" &&\n url.search.length === 0 &&\n url.hash.length === 0\n );\n } catch {\n return false;\n }\n}\n\nasync function runRequired(\n context: BuildContext,\n command: ReleasePlan[\"config\"][\"source\"][\"build\"],\n options: ProcessOptions,\n code: Extract<\n ErrorCode,\n \"image_build_failed\" | \"source_build_failed\" | \"source_verification_failed\"\n >,\n): Promise<void> {\n const outcome = await context.process.run(command, options);\n if (outcome.status === \"failed\") throw new BuildError(code, outcome.reason);\n}\n\nasync function validateSource(\n projectRoot: string,\n output: string,\n dockerfile: string,\n context: string,\n): Promise<void> {\n const outputRoot = await resolveProjectPath(projectRoot, output, \"directory\");\n await resolveProjectPath(projectRoot, dockerfile, \"file\");\n await resolveProjectPath(projectRoot, context, \"directory\");\n\n const entry = await resolveProjectPath(outputRoot, \"server/index.mjs\", \"file\");\n if (!isInside(outputRoot, entry)) throw new BuildError(\"nitro_output_invalid\");\n}\n\nasync function resolveProjectPath(\n root: string,\n relative: string,\n expected: \"directory\" | \"file\",\n): Promise<string> {\n let resolved: string;\n try {\n resolved = await realpath(path.resolve(root, ...relative.split(\"/\")));\n const details = await stat(resolved);\n if (expected === \"file\" ? !details.isFile() : !details.isDirectory()) throw new Error();\n } catch (error) {\n throw new BuildError(\n expected === \"file\" && relative.endsWith(\"server/index.mjs\")\n ? \"nitro_output_invalid\"\n : \"project_path_invalid\",\n undefined,\n { cause: error },\n );\n }\n\n if (!isInside(root, resolved)) throw new BuildError(\"project_path_invalid\");\n return resolved;\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (relative !== \"..\" && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative))\n );\n}\n\nasync function assertAbsent(filename: string, code: ErrorCode): Promise<void> {\n try {\n await lstat(filename);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw new BuildError(code, undefined, { cause: error });\n }\n throw new BuildError(code);\n}\n\nasync function readIdentity(filename: string): Promise<string> {\n try {\n return await readBuildxImageDigest(filename);\n } catch (error) {\n throw new BuildError(\"image_metadata_invalid\", undefined, { cause: error });\n }\n}\n\nfunction toPosixRelative(root: string, filename: string): string {\n const relative = path.relative(root, filename);\n if (!isInside(root, filename) || relative.length === 0) {\n throw new BuildError(\"project_path_invalid\");\n }\n return relative.split(path.sep).join(path.posix.sep);\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport {\n chmod,\n copyFile,\n link,\n lstat,\n lutimes,\n mkdir,\n mkdtemp,\n readlink,\n readdir,\n realpath,\n rm,\n stat,\n symlink,\n utimes,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { Command } from \"../config.js\";\nimport type { ReleasePlan } from \"../plan.js\";\nimport {\n createBuildProcessOptions,\n readBuildCandidate,\n serializeDirectoryManifest,\n writeBuildCandidate,\n type BuildContext,\n type DirectoryManifest,\n type ProfileAdapter,\n} from \"../profile.js\";\nimport type { ProcessFailureReason, ProcessOptions } from \"../process.js\";\n\nconst MAX_ENTRY_COUNT = 100_000;\nconst MAX_CONTENT_BYTES = 5 * 1024 * 1024 * 1024;\nconst NORMALIZED_TIME = new Date(0);\nconst PROFILE_DIRECTORY = \"static-files\";\n\ntype ArchiveTool = \"bsd\" | \"gnu\";\ntype EntryKind = \"directory\" | \"file\" | \"symlink\";\n\ninterface Entry {\n readonly kind: EntryKind;\n readonly relative: string;\n readonly source: string;\n readonly linkTarget?: string;\n}\n\ninterface ArtifactPaths {\n readonly archive: string;\n readonly archiveRelative: string;\n readonly directory: string;\n readonly manifest: string;\n readonly manifestRelative: string;\n}\n\nexport type ErrorCode =\n | \"archive_failed\"\n | \"archive_invalid\"\n | \"archive_path_invalid\"\n | \"archive_tool_failed\"\n | \"archive_tool_unsupported\"\n | \"artifact_exists\"\n | \"artifact_path_conflict\"\n | \"artifact_write_failed\"\n | \"build_cancelled\"\n | \"content_limit_exceeded\"\n | \"entry_html_invalid\"\n | \"entry_limit_exceeded\"\n | \"invalid_plan\"\n | \"output_invalid\"\n | \"output_outside_project\"\n | \"output_overlaps_artifacts\"\n | \"source_build_failed\"\n | \"source_verification_failed\"\n | \"staging_failed\"\n | \"symlink_invalid\"\n | \"symlink_outside_output\"\n | \"unsupported_entry\";\n\nexport class BuildError extends Error {\n constructor(\n readonly code: ErrorCode,\n readonly processReason?: ProcessFailureReason,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"StaticFilesBuildError\";\n }\n}\n\n/** 静态目录档案只产生可复验的本地制品,发布和激活由后续端口负责。 */\nexport const profile: ProfileAdapter = Object.freeze({\n id: \"static-files\",\n\n async build(plan: ReleasePlan, context: BuildContext) {\n const output = requireOutput(plan);\n await runSource(plan.config.source.verify, context, \"source_verification_failed\");\n await runSource(plan.config.source.build, context, \"source_build_failed\");\n\n const roots = await resolveRoots(context, output);\n const entries = await scanOutput(roots.output, context.signal);\n await validateEntryHtml(roots.output);\n const artifacts = await prepareArtifactPaths(roots.artifact, plan.revision, context.resultPath);\n const stage = await stageOutput(artifacts.directory, entries, context.signal);\n\n let archiveTemporary: string | undefined;\n let manifestTemporary: string | undefined;\n try {\n archiveTemporary = path.join(artifacts.directory, `.site-${randomUUID()}.tar`);\n const tool = await resolveArchiveTool(context);\n await createArchive(tool, stage, archiveTemporary, entries, context);\n await validateArchive(archiveTemporary);\n const identity = await digestFile(archiveTemporary);\n await install(archiveTemporary, artifacts.archive);\n archiveTemporary = undefined;\n\n const manifest: DirectoryManifest = {\n schemaVersion: 1,\n revision: plan.revision,\n archive: artifacts.archiveRelative,\n identity,\n };\n manifestTemporary = path.join(artifacts.directory, `.manifest-${randomUUID()}.json`);\n await writeManifest(manifestTemporary, manifest);\n await install(manifestTemporary, artifacts.manifest);\n manifestTemporary = undefined;\n\n await writeBuildCandidate(context, {\n schemaVersion: 1,\n kind: \"directory\",\n archive: artifacts.archiveRelative,\n manifestFile: artifacts.manifestRelative,\n identity,\n });\n return readBuildCandidate(plan, context);\n } finally {\n await Promise.all([\n rm(stage, { force: true, recursive: true }),\n ...(archiveTemporary ? [rm(archiveTemporary, { force: true })] : []),\n ...(manifestTemporary ? [rm(manifestTemporary, { force: true })] : []),\n ]);\n }\n },\n});\n\nfunction requireOutput(plan: ReleasePlan): string {\n if (plan.config.profile !== \"static-files\" || !plan.config.source.output) {\n throw new BuildError(\"invalid_plan\");\n }\n return plan.config.source.output;\n}\n\nasync function runSource(\n command: Command,\n context: BuildContext,\n code: Extract<ErrorCode, \"source_build_failed\" | \"source_verification_failed\">,\n): Promise<void> {\n const options = await createBuildProcessOptions(context);\n const outcome = await context.process.run(command, options);\n if (outcome.status === \"failed\") throw new BuildError(code, outcome.reason);\n}\n\nasync function resolveRoots(\n context: BuildContext,\n output: string,\n): Promise<{ readonly artifact: string; readonly output: string }> {\n assertActive(context.signal);\n let project: string;\n let artifact: string;\n let built: string;\n try {\n project = await realpath(context.projectRoot);\n artifact = await realpath(context.artifactRoot);\n built = await realpath(path.resolve(project, ...output.split(\"/\")));\n if (!(await stat(project)).isDirectory()) throw new Error(\"project root is not a directory\");\n if (!(await stat(artifact)).isDirectory()) throw new Error(\"artifact root is not a directory\");\n if (!(await stat(built)).isDirectory()) throw new Error(\"output is not a directory\");\n } catch (error) {\n throw new BuildError(\"output_invalid\", undefined, { cause: error });\n }\n\n if (!isInside(project, artifact)) {\n throw new BuildError(\"output_invalid\");\n }\n if (!isInside(project, built)) {\n throw new BuildError(\"output_outside_project\");\n }\n if (isInside(built, artifact) || isInside(artifact, built)) {\n throw new BuildError(\"output_overlaps_artifacts\");\n }\n return { artifact, output: built };\n}\n\nasync function scanOutput(root: string, signal?: AbortSignal): Promise<readonly Entry[]> {\n const entries: Entry[] = [];\n let contentBytes = 0;\n\n const visit = async (segments: readonly string[]): Promise<void> => {\n assertActive(signal);\n const directory = path.join(root, ...segments);\n let children;\n try {\n children = await readdir(directory, { withFileTypes: true });\n } catch (error) {\n throw new BuildError(\"output_invalid\", undefined, { cause: error });\n }\n children.sort((left, right) => compare(left.name, right.name));\n\n for (const child of children) {\n assertActive(signal);\n const childSegments = [...segments, child.name];\n const source = path.join(root, ...childSegments);\n const relative = childSegments.join(path.posix.sep);\n assertArchivePath(relative);\n\n let details;\n try {\n details = await lstat(source);\n } catch (error) {\n throw new BuildError(\"output_invalid\", undefined, { cause: error });\n }\n\n if (details.isDirectory()) {\n addEntry(entries, { kind: \"directory\", relative, source });\n await visit(childSegments);\n continue;\n }\n if (details.isFile()) {\n contentBytes += details.size;\n if (contentBytes > MAX_CONTENT_BYTES) {\n throw new BuildError(\"content_limit_exceeded\");\n }\n addEntry(entries, { kind: \"file\", relative, source });\n continue;\n }\n if (details.isSymbolicLink()) {\n const linkTarget = await validateSymlink(root, source);\n addEntry(entries, { kind: \"symlink\", relative, source, linkTarget });\n continue;\n }\n throw new BuildError(\"unsupported_entry\");\n }\n };\n\n await visit([]);\n return Object.freeze(entries.sort((left, right) => compare(left.relative, right.relative)));\n}\n\nfunction addEntry(entries: Entry[], entry: Entry): void {\n if (entries.length >= MAX_ENTRY_COUNT) throw new BuildError(\"entry_limit_exceeded\");\n entries.push(Object.freeze(entry));\n}\n\nasync function validateSymlink(root: string, source: string): Promise<string> {\n let target: string;\n let resolved: string;\n try {\n target = await readlink(source);\n if (path.isAbsolute(target) || path.posix.isAbsolute(target) || path.win32.isAbsolute(target)) {\n throw new BuildError(\"symlink_invalid\");\n }\n resolved = await realpath(path.resolve(path.dirname(source), target));\n } catch (error) {\n if (error instanceof BuildError) throw error;\n throw new BuildError(\"symlink_invalid\", undefined, { cause: error });\n }\n if (!isInside(root, resolved)) throw new BuildError(\"symlink_outside_output\");\n if (Buffer.byteLength(target, \"utf8\") > 100) throw new BuildError(\"archive_path_invalid\");\n return target;\n}\n\nasync function validateEntryHtml(root: string): Promise<void> {\n try {\n const entry = await realpath(path.join(root, \"index.html\"));\n const details = await stat(entry);\n if (!isInside(root, entry) || !details.isFile() || details.size === 0) throw new Error();\n } catch (error) {\n throw new BuildError(\"entry_html_invalid\", undefined, { cause: error });\n }\n}\n\nfunction assertArchivePath(relative: string): void {\n if (Buffer.byteLength(relative, \"utf8\") <= 100) return;\n let separator = relative.lastIndexOf(\"/\");\n while (separator > 0) {\n const prefix = relative.slice(0, separator);\n const name = relative.slice(separator + 1);\n if (Buffer.byteLength(prefix, \"utf8\") <= 155 && Buffer.byteLength(name, \"utf8\") <= 100) {\n return;\n }\n separator = relative.lastIndexOf(\"/\", separator - 1);\n }\n throw new BuildError(\"archive_path_invalid\");\n}\n\nasync function prepareArtifactPaths(\n artifactRoot: string,\n revision: string,\n resultPath: string,\n): Promise<ArtifactPaths> {\n const directory = path.join(artifactRoot, PROFILE_DIRECTORY, revision);\n try {\n await mkdir(directory, { mode: 0o700, recursive: true });\n if ((await realpath(directory)) !== directory)\n throw new Error(\"artifact path contains symlink\");\n } catch (error) {\n throw new BuildError(\"artifact_write_failed\", undefined, { cause: error });\n }\n\n const archive = path.join(directory, \"site.tar\");\n const manifest = path.join(directory, \"manifest.json\");\n if ([archive, manifest].includes(path.resolve(resultPath))) {\n throw new BuildError(\"artifact_path_conflict\");\n }\n await assertAbsent(archive);\n await assertAbsent(manifest);\n return {\n archive,\n archiveRelative: toPosixRelative(artifactRoot, archive),\n directory,\n manifest,\n manifestRelative: toPosixRelative(artifactRoot, manifest),\n };\n}\n\nasync function stageOutput(\n artifactDirectory: string,\n entries: readonly Entry[],\n signal?: AbortSignal,\n): Promise<string> {\n let stage: string | undefined;\n try {\n stage = await mkdtemp(path.join(artifactDirectory, \".stage-\"));\n const directories = entries\n .filter((entry) => entry.kind === \"directory\")\n .sort((left, right) => depth(left.relative) - depth(right.relative));\n\n for (const entry of directories) {\n assertActive(signal);\n await mkdir(path.join(stage, ...entry.relative.split(\"/\")), { mode: 0o755 });\n }\n for (const entry of entries.filter((candidate) => candidate.kind === \"file\")) {\n assertActive(signal);\n const destination = path.join(stage, ...entry.relative.split(\"/\"));\n await copyFile(entry.source, destination);\n await chmod(destination, 0o644);\n await utimes(destination, NORMALIZED_TIME, NORMALIZED_TIME);\n }\n for (const entry of entries) {\n if (entry.kind !== \"symlink\" || entry.linkTarget === undefined) continue;\n assertActive(signal);\n const destination = path.join(stage, ...entry.relative.split(\"/\"));\n await symlink(entry.linkTarget, destination);\n }\n for (const entry of entries) {\n if (entry.kind !== \"symlink\") continue;\n const destination = path.join(stage, ...entry.relative.split(\"/\"));\n const resolved = await realpath(destination);\n if (!isInside(stage, resolved)) throw new BuildError(\"symlink_outside_output\");\n await lutimes(destination, NORMALIZED_TIME, NORMALIZED_TIME);\n }\n for (const entry of [...directories].reverse()) {\n const destination = path.join(stage, ...entry.relative.split(\"/\"));\n await chmod(destination, 0o755);\n await utimes(destination, NORMALIZED_TIME, NORMALIZED_TIME);\n }\n await chmod(stage, 0o755);\n await utimes(stage, NORMALIZED_TIME, NORMALIZED_TIME);\n return stage;\n } catch (error) {\n if (stage) await rm(stage, { force: true, recursive: true });\n if (error instanceof BuildError) throw error;\n throw new BuildError(\"staging_failed\", undefined, { cause: error });\n }\n}\n\nasync function resolveArchiveTool(context: BuildContext): Promise<ArchiveTool> {\n const options = await createBuildProcessOptions(context);\n const outcome = await context.process.run({ executable: \"tar\", args: [\"--version\"] }, options);\n if (outcome.status === \"failed\") {\n throw new BuildError(\"archive_tool_failed\", outcome.reason);\n }\n const version = `${outcome.stdout}\\n${outcome.stderr}`;\n if (/GNU tar/iu.test(version)) return \"gnu\";\n if (/bsdtar/iu.test(version)) return \"bsd\";\n throw new BuildError(\"archive_tool_unsupported\");\n}\n\nasync function createArchive(\n tool: ArchiveTool,\n stage: string,\n output: string,\n entries: readonly Entry[],\n context: BuildContext,\n): Promise<void> {\n const processOptions = await createBuildProcessOptions(context);\n const options: ProcessOptions = {\n ...processOptions,\n cwd: stage,\n env: Object.freeze({\n ...processOptions.env,\n COPYFILE_DISABLE: \"1\",\n LC_ALL: \"C\",\n TZ: \"UTC\",\n }),\n input: `${entries.map((entry) => entry.relative).join(\"\\0\")}\\0`,\n };\n const args =\n tool === \"gnu\"\n ? [\n \"--create\",\n \"--file\",\n output,\n \"--format=ustar\",\n \"--owner=0\",\n \"--group=0\",\n \"--numeric-owner\",\n \"--mtime=@0\",\n \"--no-recursion\",\n \"--null\",\n \"--files-from=-\",\n ]\n : [\n \"-c\",\n \"-f\",\n output,\n \"--format\",\n \"ustar\",\n \"--uid\",\n \"0\",\n \"--gid\",\n \"0\",\n \"--uname\",\n \"\",\n \"--gname\",\n \"\",\n \"--no-recursion\",\n \"--null\",\n \"-T\",\n \"-\",\n ];\n const outcome = await context.process.run({ executable: \"tar\", args }, options);\n if (outcome.status === \"failed\") throw new BuildError(\"archive_failed\", outcome.reason);\n}\n\nasync function validateArchive(filename: string): Promise<void> {\n try {\n const details = await lstat(filename);\n if (!details.isFile() || details.size === 0 || (await realpath(filename)) !== filename) {\n throw new Error();\n }\n await chmod(filename, 0o600);\n } catch (error) {\n throw new BuildError(\"archive_invalid\", undefined, { cause: error });\n }\n}\n\nasync function digestFile(filename: string): Promise<string> {\n const hash = createHash(\"sha256\");\n try {\n for await (const chunk of createReadStream(filename)) hash.update(chunk);\n return `sha256:${hash.digest(\"hex\")}`;\n } catch (error) {\n throw new BuildError(\"archive_invalid\", undefined, { cause: error });\n }\n}\n\nasync function writeManifest(filename: string, manifest: DirectoryManifest): Promise<void> {\n try {\n await writeFile(filename, serializeDirectoryManifest(manifest), {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n } catch (error) {\n throw new BuildError(\"artifact_write_failed\", undefined, { cause: error });\n }\n}\n\nasync function install(source: string, destination: string): Promise<void> {\n try {\n await link(source, destination);\n await rm(source);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n throw new BuildError(\"artifact_exists\", undefined, { cause: error });\n }\n throw new BuildError(\"artifact_write_failed\", undefined, { cause: error });\n }\n}\n\nasync function assertAbsent(filename: string): Promise<void> {\n try {\n await lstat(filename);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw new BuildError(\"artifact_write_failed\", undefined, { cause: error });\n }\n throw new BuildError(\"artifact_exists\");\n}\n\nfunction toPosixRelative(root: string, filename: string): string {\n const relative = path.relative(root, filename);\n if (relative.length === 0 || !isInside(root, filename)) {\n throw new BuildError(\"artifact_write_failed\");\n }\n return relative.split(path.sep).join(path.posix.sep);\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (relative !== \"..\" && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative))\n );\n}\n\nfunction assertActive(signal?: AbortSignal): void {\n if (signal?.aborted) throw new BuildError(\"build_cancelled\");\n}\n\nfunction compare(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction depth(relative: string): number {\n return relative.split(\"/\").length;\n}\n","import { lstat, realpath, rm, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { commandSchema } from \"../config.js\";\nimport type { ReleasePlan } from \"../plan.js\";\nimport {\n BUILD_RESULT_PATH_ENV,\n createBuildProcessOptions,\n readBuildCandidate,\n readBuildxImageDigest,\n writeBuildCandidate,\n type BuildContext,\n type BuildResult,\n type ProfileAdapter,\n} from \"../profile.js\";\nimport type { ProcessFailureReason, ProcessOptions } from \"../process.js\";\n\nconst METADATA_SUFFIX = \".buildx.json\";\n\nconst namespaceSchema = z\n .string()\n .min(1)\n .max(255)\n .regex(/^[a-z0-9]+(?:[._/-][a-z0-9]+)*$/u);\n\nconst RETRYABLE_PROCESS_FAILURES = new Set<ProcessFailureReason>([\"spawn\", \"timeout\"]);\n\nexport type ErrorCode =\n | \"docker_build_failed\"\n | \"docker_metadata_exists\"\n | \"docker_metadata_invalid\"\n | \"image_config_invalid\"\n | \"image_context_invalid\"\n | \"profile_mismatch\"\n | \"registry_config_invalid\"\n | \"source_build_failed\"\n | \"source_output_invalid\"\n | \"source_verify_failed\";\n\nexport type BuildPhase = \"image\" | \"source-build\" | \"source-verify\" | \"validation\";\n\n/** 静态镜像错误只保留稳定阶段和重试分类,不传播构建工具的输出。 */\nexport class BuildError extends Error {\n constructor(\n readonly code: ErrorCode,\n readonly phase: BuildPhase,\n readonly retryable: boolean,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"StaticNginxBuildError\";\n }\n}\n\n/** 静态 Nginx 档案只构造本地 OCI 候选,远端发布由注册表端口完成。 */\nexport function createProfile(executable = \"docker\"): ProfileAdapter {\n const docker = commandSchema.parse({ executable, args: [] }).executable;\n const adapter: ProfileAdapter = {\n id: \"static-nginx\",\n build(plan, context) {\n return build(plan, context, docker);\n },\n };\n return Object.freeze(adapter);\n}\n\nasync function build(\n plan: ReleasePlan,\n context: BuildContext,\n docker: string,\n): Promise<BuildResult> {\n if (plan.config.profile !== \"static-nginx\") {\n throw new BuildError(\"profile_mismatch\", \"validation\", false);\n }\n\n const image = plan.config.image;\n const sourceOutput = plan.config.source.output;\n if (!image || !sourceOutput) {\n throw new BuildError(\"image_config_invalid\", \"validation\", false);\n }\n\n const options = await createBuildProcessOptions(context);\n const projectRoot = await realpath(options.cwd);\n const imageContext = await resolveProjectDirectory(\n projectRoot,\n image.context,\n \"image_context_invalid\",\n );\n const dockerfile = await resolveProjectFile(\n projectRoot,\n image.dockerfile,\n \"image_config_invalid\",\n );\n const artifactRoot = await realpath(context.artifactRoot);\n const resultPath = options.env[BUILD_RESULT_PATH_ENV];\n const metadataPath = `${resultPath}${METADATA_SUFFIX}`;\n const metadataFile = toRelativeOutput(artifactRoot, metadataPath);\n await assertMetadataAbsent(metadataPath);\n const reference = createReference(image.repository, plan.revision, context.registry);\n\n await run(plan.config.source.verify, options, \"source_verify_failed\", context);\n await run(plan.config.source.build, options, \"source_build_failed\", context);\n\n const output = await resolveProjectDirectory(projectRoot, sourceOutput, \"source_output_invalid\");\n await resolveProjectFile(output, \"index.html\", \"source_output_invalid\");\n const staticOutput = toStaticOutput(imageContext, output);\n const dockerOptions = await createBuildProcessOptions(context);\n const outcome = await context.process.run(\n {\n executable: docker,\n args: [\n \"buildx\",\n \"build\",\n \"--file\",\n dockerfile,\n \"--platform\",\n image.platform,\n \"--tag\",\n reference,\n \"--metadata-file\",\n metadataPath,\n \"--build-arg\",\n `STATIC_OUTPUT=${staticOutput}`,\n \"--label\",\n `org.opencontainers.image.title=${plan.config.name}`,\n \"--label\",\n `org.opencontainers.image.version=${plan.revision}`,\n \"--label\",\n `org.opencontainers.image.revision=${plan.revision}`,\n \"--load\",\n imageContext,\n ],\n },\n dockerOptions,\n );\n if (outcome.status === \"failed\") {\n await rm(metadataPath, { force: true }).catch(() => undefined);\n throw new BuildError(\n \"docker_build_failed\",\n \"image\",\n RETRYABLE_PROCESS_FAILURES.has(outcome.reason),\n );\n }\n\n const identity = await readIdentity(metadataPath);\n await writeBuildCandidate(context, {\n schemaVersion: 1,\n kind: \"oci\",\n reference,\n metadataFile,\n identity,\n });\n return readBuildCandidate(plan, context);\n}\n\nasync function run(\n command: ReleasePlan[\"config\"][\"source\"][\"verify\"],\n options: ProcessOptions,\n code: Extract<ErrorCode, \"source_build_failed\" | \"source_verify_failed\">,\n context: BuildContext,\n): Promise<void> {\n const outcome = await context.process.run(command, options);\n if (outcome.status === \"failed\") {\n throw new BuildError(\n code,\n code === \"source_verify_failed\" ? \"source-verify\" : \"source-build\",\n RETRYABLE_PROCESS_FAILURES.has(outcome.reason),\n );\n }\n}\n\nasync function resolveProjectDirectory(\n projectRoot: string,\n configuredPath: string,\n code: Extract<ErrorCode, \"image_context_invalid\" | \"source_output_invalid\">,\n): Promise<string> {\n const expected = resolveConfiguredPath(projectRoot, configuredPath);\n try {\n if (!(await lstat(expected)).isDirectory()) throw new Error(\"not a directory\");\n const resolved = await realpath(expected);\n if (resolved !== expected || !isInside(projectRoot, resolved)) throw new Error(\"outside root\");\n return resolved;\n } catch (error) {\n throw new BuildError(code, \"validation\", false, { cause: error });\n }\n}\n\nasync function resolveProjectFile(\n projectRoot: string,\n configuredPath: string,\n code: Extract<ErrorCode, \"image_config_invalid\" | \"source_output_invalid\">,\n): Promise<string> {\n const expected = resolveConfiguredPath(projectRoot, configuredPath);\n try {\n if (!(await lstat(expected)).isFile()) throw new Error(\"not a regular file\");\n const resolved = await realpath(expected);\n if (resolved !== expected || !isInside(projectRoot, resolved)) throw new Error(\"outside root\");\n return resolved;\n } catch (error) {\n throw new BuildError(code, \"validation\", false, { cause: error });\n }\n}\n\nfunction resolveConfiguredPath(projectRoot: string, configuredPath: string): string {\n return path.resolve(projectRoot, ...configuredPath.replaceAll(\"\\\\\", \"/\").split(\"/\"));\n}\n\nfunction toStaticOutput(imageContext: string, output: string): string {\n const relative = path.relative(imageContext, output);\n if (\n relative === \"\" ||\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n ) {\n throw new BuildError(\"source_output_invalid\", \"validation\", false);\n }\n return relative.split(path.sep).join(path.posix.sep);\n}\n\nfunction createReference(\n repository: string,\n revision: string,\n registry: BuildContext[\"registry\"],\n): string {\n const { host, namespace } = registry;\n if (!host || !namespace || !validHost(host) || !namespaceSchema.safeParse(namespace).success) {\n throw new BuildError(\"registry_config_invalid\", \"validation\", false);\n }\n return `${host}/${namespace}/${repository}:${revision}`;\n}\n\nfunction validHost(value: string): boolean {\n if (value.length > 255 || /[\\0\\r\\n\\s]/u.test(value)) return false;\n try {\n const url = new URL(`https://${value}`);\n return (\n url.host === value &&\n url.hostname.length > 0 &&\n url.username.length === 0 &&\n url.password.length === 0 &&\n url.pathname === \"/\" &&\n url.search.length === 0 &&\n url.hash.length === 0\n );\n } catch {\n return false;\n }\n}\n\nfunction toRelativeOutput(artifactRoot: string, output: string): string {\n const relative = path.relative(artifactRoot, output);\n if (\n relative === \"\" ||\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n ) {\n throw new BuildError(\"docker_metadata_invalid\", \"validation\", false);\n }\n return relative.split(path.sep).join(path.posix.sep);\n}\n\nasync function assertMetadataAbsent(filename: string): Promise<void> {\n try {\n await lstat(filename);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw new BuildError(\"docker_metadata_invalid\", \"validation\", false, { cause: error });\n }\n throw new BuildError(\"docker_metadata_exists\", \"validation\", false);\n}\n\nasync function readIdentity(filename: string): Promise<string> {\n try {\n return await readBuildxImageDigest(filename);\n } catch (error) {\n throw new BuildError(\"docker_metadata_invalid\", \"image\", false, { cause: error });\n }\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (relative !== \"..\" && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative))\n );\n}\n","import path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { directoryEnvironmentSchema } from \"../config.js\";\nimport type { HealthPort } from \"../health.js\";\nimport { assertArtifact, type Plan, type ReleasePlan } from \"../plan.js\";\nimport { failureSchema, type Failure } from \"../receipt.js\";\nimport {\n activateContextSchema,\n activatedReleaseSchema,\n healthResultSchema,\n recoverContextSchema,\n recoveryOutcomeSchema,\n verifyContextSchema,\n type ActivateContext,\n type ActivatedRelease,\n type HealthResult,\n type RecoverContext,\n type RecoveryOutcome,\n type RolloutAdapter,\n type VerifyContext,\n} from \"../rollout.js\";\nimport {\n observedReleaseSchema,\n releaseIdentitySchema,\n stagedReleaseSchema,\n type ObservedRelease,\n type ReleaseIdentity,\n type StagedRelease,\n} from \"../target.js\";\nimport { TransportError, type Session } from \"../transport/ssh.js\";\n\ntype Operation = \"activate\" | \"recover\" | \"verify\";\n\nexport type ErrorCode =\n | \"activation_failed\"\n | \"activation_stale\"\n | \"context_invalid\"\n | \"health_invalid\"\n | \"health_probe_failed\"\n | \"invalid_plan\"\n | \"release_invalid\";\n\n/** 滚动错误只携带稳定分类和标准失败合同,不暴露目标地址或探针响应。 */\nexport class RolloutError extends Error {\n constructor(\n readonly code: ErrorCode,\n readonly failure: Failure,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"AtomicLinkRolloutError\";\n }\n}\n\ninterface Links {\n readonly current: ReleaseIdentity | null;\n readonly previous: ReleaseIdentity | null;\n}\n\n/** 原子链接策略消费调用方已持有的 SSH 会话,不建立第二个锁生命周期。 */\nexport function createRollout(session: Session, health: HealthPort): RolloutAdapter {\n const rollout: RolloutAdapter = {\n id: \"atomic-link\",\n activate: (plan, release, context) => activate(session, plan, release, context),\n verify: (plan, release, context) => verify(health, plan, release, context),\n recover: (plan, candidate, context) => recover(session, plan, candidate, context),\n };\n return Object.freeze(rollout);\n}\n\nasync function activate(\n session: Session,\n plan: ReleasePlan,\n rawRelease: unknown,\n rawContext: unknown,\n): Promise<ActivatedRelease> {\n const environment = requirePlan(plan, \"activate\");\n const release = parseRelease(plan, rawRelease, \"activate\");\n const context = parseContext(activateContextSchema, rawContext, \"activate\");\n assertActive(context.signal, \"activate\");\n await requireReleaseDirectory(session, release.releaseId, \"activate\");\n\n const before = await observeLinks(session, environment.root, \"activate\", \"none\");\n const expectedCurrent = release.previous?.releaseId ?? null;\n if (before.current !== expectedCurrent || !validLinks(before)) {\n throw createError(\n \"activation_stale\",\n \"activate\",\n \"none\",\n false,\n \"Staged release no longer matches the active release\",\n );\n }\n\n const desired: Links = {\n current: release.releaseId,\n previous: before.current,\n };\n try {\n if (before.current !== null) {\n await session.swapLink({ link: \"previous\", target: releasePath(before.current) });\n assertActive(context.signal, \"activate\", \"acknowledged\");\n }\n await session.swapLink({ link: \"current\", target: releasePath(release.releaseId) });\n const observed = await observeLinks(session, environment.root, \"activate\", \"unknown\");\n if (!sameLinks(observed, desired)) {\n throw createError(\n \"activation_failed\",\n \"activate\",\n \"unknown\",\n false,\n \"Activated release pointers could not be confirmed\",\n );\n }\n return toActivated(release, context.activatedAt);\n } catch (error) {\n const observed = await observeAfterEffect(session, environment.root);\n if (observed && sameLinks(observed, desired)) return toActivated(release, context.activatedAt);\n\n const effect = observed ? (sameLinks(observed, before) ? \"none\" : \"acknowledged\") : \"unknown\";\n throw createError(\n \"activation_failed\",\n \"activate\",\n effect,\n effect === \"none\" && retryable(error),\n \"Atomic release activation failed\",\n error,\n );\n }\n}\n\nasync function verify(\n health: HealthPort,\n plan: Plan,\n rawRelease: unknown,\n rawContext: unknown,\n): Promise<HealthResult> {\n const environment = requirePlan(plan, \"verify\");\n const release = parseObserved(plan, rawRelease, \"verify\");\n const context = parseContext(verifyContextSchema, rawContext, \"verify\");\n assertActive(context.signal, \"verify\");\n\n let rawResult: unknown;\n try {\n rawResult = await health.check({\n policy: environment.health,\n releaseId: release.releaseId,\n checkedAt: context.checkedAt,\n ...(context.signal === undefined ? {} : { signal: context.signal }),\n });\n } catch (error) {\n throw createError(\n \"health_probe_failed\",\n \"verify\",\n \"none\",\n !context.signal?.aborted,\n \"Health probe failed before producing verifiable evidence\",\n error,\n );\n }\n\n const parsed = healthResultSchema.safeParse(rawResult);\n if (\n !parsed.success ||\n parsed.data.releaseId !== release.releaseId ||\n parsed.data.checkedAt !== context.checkedAt ||\n parsed.data.attempts > environment.health.attempts ||\n (parsed.data.status === \"healthy\" &&\n parsed.data.observedStatus !== environment.health.expectedStatus)\n ) {\n throw createError(\n \"health_invalid\",\n \"verify\",\n \"none\",\n false,\n \"Health probe returned evidence outside the selected policy\",\n parsed.success ? undefined : parsed.error,\n );\n }\n return parsed.data;\n}\n\nasync function recover(\n session: Session,\n plan: Plan,\n rawCandidate: unknown,\n rawContext: unknown,\n): Promise<RecoveryOutcome> {\n const environment = requirePlan(plan, \"recover\");\n const candidate = parseCandidate(plan, rawCandidate);\n const context = parseContext(recoverContextSchema, rawContext, \"recover\");\n if (context.signal?.aborted) {\n return failedRecovery(\"none\", undefined, \"Recovery was cancelled before activation\");\n }\n\n try {\n await requireReleaseDirectory(session, candidate.releaseId, \"recover\");\n } catch {\n return failedRecovery(\"none\", undefined, \"Recovery candidate is not available\");\n }\n\n let before: Links;\n try {\n before = await observeLinks(session, environment.root, \"recover\", \"none\");\n } catch {\n return failedRecovery(\"none\", undefined, \"Active release could not be observed\");\n }\n if (before.current === candidate.releaseId && validLinks(before)) {\n return recovered(candidate, context);\n }\n if (before.current === null || !validLinks(before)) {\n return failedRecovery(\"none\", undefined, \"Active release pointers are invalid\");\n }\n\n const desired: Links = { current: candidate.releaseId, previous: before.current };\n\n try {\n await session.swapLink({ link: \"previous\", target: releasePath(before.current) });\n if (context.signal?.aborted) throw new Error(\"Recovery was cancelled during activation\");\n await session.swapLink({ link: \"current\", target: releasePath(candidate.releaseId) });\n const observed = await observeLinks(session, environment.root, \"recover\", \"unknown\");\n if (sameLinks(observed, desired)) return recovered(candidate, context);\n return classifyRecovery(observed, before);\n } catch {\n let observed: Links;\n try {\n observed = await observeLinks(session, environment.root, \"recover\", \"unknown\");\n } catch {\n return unknownRecovery(undefined);\n }\n if (sameLinks(observed, desired)) return recovered(candidate, context);\n return classifyRecovery(observed, before);\n }\n}\n\nfunction requirePlan(plan: Plan, operation: Operation) {\n const environment = directoryEnvironmentSchema.safeParse(plan.environment);\n if (!environment.success || plan.config.profile !== \"static-files\") {\n throw createError(\n \"invalid_plan\",\n operation,\n \"none\",\n false,\n \"Atomic link rollout requires a static-files SSH-directory plan\",\n environment.success ? undefined : environment.error,\n );\n }\n return environment.data;\n}\n\nfunction parseRelease(plan: ReleasePlan, input: unknown, operation: Operation): StagedRelease {\n const parsed = stagedReleaseSchema.safeParse(input);\n if (!parsed.success) {\n throw createError(\n \"release_invalid\",\n operation,\n \"none\",\n false,\n \"Staged release is invalid\",\n parsed.error,\n );\n }\n assertPlannedRelease(plan, parsed.data, operation);\n if (parsed.data.previous) assertEnvironmentRelease(plan, parsed.data.previous, operation);\n return parsed.data;\n}\n\nfunction parseCandidate(plan: Plan, input: unknown): ObservedRelease {\n return parseObserved(plan, input, \"recover\");\n}\n\nfunction parseObserved(plan: Plan, input: unknown, operation: Operation): ObservedRelease {\n const parsed = observedReleaseSchema.safeParse(input);\n if (!parsed.success) {\n throw createError(\n \"release_invalid\",\n operation,\n \"none\",\n false,\n \"Observed release is invalid\",\n parsed.error,\n );\n }\n assertEnvironmentRelease(plan, parsed.data, operation);\n return parsed.data;\n}\n\nfunction assertPlannedRelease(\n plan: ReleasePlan,\n release: StagedRelease,\n operation: Operation,\n): void {\n try {\n assertArtifact(plan, release.artifact);\n } catch (error) {\n throw createError(\n \"release_invalid\",\n operation,\n \"none\",\n false,\n \"Release artifact does not match the execution plan\",\n error,\n );\n }\n assertEnvironmentRelease(plan, release, operation);\n}\n\nfunction assertEnvironmentRelease(\n plan: Plan,\n release: StagedRelease | ActivatedRelease | ObservedRelease,\n operation: Operation,\n): void {\n if (\n release.environment !== plan.environmentName ||\n release.artifact.profile !== plan.config.profile ||\n release.artifact.kind !== \"directory\" ||\n release.projection.kind !== \"directory\"\n ) {\n throw createError(\n \"release_invalid\",\n operation,\n \"none\",\n false,\n \"Release does not belong to the selected directory environment\",\n );\n }\n}\n\nfunction parseContext<Result>(\n schema: z.ZodType<Result>,\n input: unknown,\n operation: Operation,\n): Result {\n const parsed = schema.safeParse(input);\n if (!parsed.success) {\n throw createError(\n \"context_invalid\",\n operation,\n \"none\",\n false,\n \"Rollout context is invalid\",\n parsed.error,\n );\n }\n return parsed.data;\n}\n\nasync function requireReleaseDirectory(\n session: Session,\n releaseId: ReleaseIdentity,\n operation: Operation,\n): Promise<void> {\n const observed = await session.inspect(releasePath(releaseId));\n if (observed.kind !== \"directory\") {\n throw createError(\n \"release_invalid\",\n operation,\n \"none\",\n false,\n \"Release directory is not available\",\n );\n }\n}\n\nasync function observeLinks(\n session: Session,\n root: string,\n operation: Operation,\n effect: Failure[\"effect\"],\n): Promise<Links> {\n try {\n const current = pointerIdentity(root, await session.observeLink(\"current\"));\n const previous = pointerIdentity(root, await session.observeLink(\"previous\"));\n return { current, previous };\n } catch (error) {\n throw createError(\n \"activation_failed\",\n operation,\n effect,\n false,\n \"Release pointers could not be observed\",\n error,\n );\n }\n}\n\nasync function observeAfterEffect(session: Session, root: string): Promise<Links | null> {\n try {\n return await observeLinks(session, root, \"activate\", \"unknown\");\n } catch {\n return null;\n }\n}\n\nfunction pointerIdentity(rootValue: string, target: string | null): ReleaseIdentity | null {\n if (target === null) return null;\n const root = path.posix.normalize(rootValue);\n const relative = path.posix.isAbsolute(target) ? path.posix.relative(root, target) : target;\n const segments = relative.split(\"/\");\n const releaseId = segments[1];\n const parsed = releaseIdentitySchema.safeParse(releaseId);\n if (\n segments.length !== 2 ||\n segments[0] !== \"releases\" ||\n !parsed.success ||\n path.posix.normalize(relative) !== relative\n ) {\n throw new Error(\"Release pointer is invalid\");\n }\n return parsed.data;\n}\n\nfunction recovered(candidate: ObservedRelease, context: RecoverContext): RecoveryOutcome {\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"recovered\",\n effect: \"acknowledged\",\n release: toActivated(candidate, context.recoveredAt),\n });\n}\n\nfunction failedRecovery(\n effect: \"none\" | \"acknowledged\",\n observedRelease: ReleaseIdentity | undefined,\n message: string,\n): RecoveryOutcome {\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"failed\",\n effect,\n ...(observedRelease ? { observedRelease } : {}),\n failure: failure(\"recover\", effect, false, message),\n });\n}\n\nfunction unknownRecovery(observedRelease: ReleaseIdentity | undefined): RecoveryOutcome {\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"unknown\",\n effect: \"unknown\",\n ...(observedRelease ? { observedRelease } : {}),\n failure: failure(\"recover\", \"unknown\", false, \"Recovery effect could not be observed\"),\n });\n}\n\nfunction classifyRecovery(observed: Links, before: Links): RecoveryOutcome {\n if (sameLinks(observed, before)) {\n return failedRecovery(\"none\", undefined, \"Recovery did not change the active release\");\n }\n return observed.current === null\n ? unknownRecovery(observed.current ?? undefined)\n : failedRecovery(\"acknowledged\", observed.current, \"Recovery activated an unexpected release\");\n}\n\nfunction toActivated(\n release: StagedRelease | ObservedRelease,\n activatedAt: string,\n): ActivatedRelease {\n if (\"health\" in release) {\n const { health: _health, migrationLedger: _migrationLedger, ...record } = release;\n return activatedReleaseSchema.parse({ ...record, activatedAt });\n }\n return activatedReleaseSchema.parse({ ...release, activatedAt });\n}\n\nfunction createError(\n code: ErrorCode,\n operation: Operation,\n effect: Failure[\"effect\"],\n retryableValue: boolean,\n message: string,\n cause?: unknown,\n): RolloutError {\n return new RolloutError(code, failure(operation, effect, retryableValue, message), {\n cause,\n });\n}\n\nfunction failure(\n operation: Operation,\n effect: Failure[\"effect\"],\n retryable: boolean,\n message: string,\n): Failure {\n return failureSchema.parse({\n category:\n operation === \"recover\" ? \"rollback\" : operation === \"verify\" ? \"health\" : \"activation\",\n phase:\n operation === \"recover\"\n ? \"rollback-pending\"\n : operation === \"verify\"\n ? \"activated\"\n : \"activation-prepared\",\n retryable,\n effect,\n message,\n });\n}\n\nfunction assertActive(\n signal: AbortSignal | undefined,\n operation: Operation,\n effect: Failure[\"effect\"] = \"none\",\n): void {\n if (!signal?.aborted) return;\n throw createError(\n operation === \"verify\" ? \"health_probe_failed\" : \"activation_failed\",\n operation,\n effect,\n false,\n \"Rollout operation was cancelled\",\n signal.reason,\n );\n}\n\nfunction retryable(error: unknown): boolean {\n return error instanceof TransportError && error.effect === \"none\" && error.retryable;\n}\n\nfunction releasePath(releaseId: ReleaseIdentity): string {\n return `releases/${releaseId}`;\n}\n\nfunction sameLinks(left: Links, right: Links): boolean {\n return left.current === right.current && left.previous === right.previous;\n}\n\nfunction validLinks(links: Links): boolean {\n return links.current === null ? links.previous === null : links.current !== links.previous;\n}\n","import { z } from \"zod\";\n\nimport type { BlueGreenRollout, Command, Health } from \"../config.js\";\nimport type { HealthPort } from \"../health.js\";\nimport { LifecycleError, type LifecyclePort, type TrafficResult } from \"../lifecycle.js\";\nimport type { Plan, ReleasePlan } from \"../plan.js\";\nimport type { ProcessOptions } from \"../process.js\";\nimport {\n failureSchema,\n type Failure,\n type PublishedImageArtifact,\n type PublishedStackArtifact,\n} from \"../receipt.js\";\nimport {\n activateContextSchema,\n activatedReleaseSchema,\n healthResultSchema,\n recoverContextSchema,\n recoveryOutcomeSchema,\n verifyContextSchema,\n workloadActivationOutcomeSchema,\n workloadHealthResultSchema,\n workloadRecoveryOutcomeSchema,\n workloadSelectionSchema,\n type ActivateContext,\n type ActivatedRelease,\n type HealthResult,\n type RecoverContext,\n type RecoveryOutcome,\n type RolloutAdapter,\n type VerifyContext,\n type WorkloadActivationOutcome,\n type WorkloadHealthResult,\n type WorkloadRecoveryOutcome,\n type WorkloadRolloutAdapter,\n type WorkloadSelection,\n} from \"../rollout.js\";\nimport {\n observedReleaseSchema,\n releaseIdentitySchema,\n stagedReleaseSchema,\n type ObservedRelease,\n type ReleaseIdentity,\n type StagedRelease,\n} from \"../target.js\";\nimport { TransportError, type Session } from \"../transport/ssh.js\";\n\nexport const TRAFFIC_ACTIVE_SLOT_ENV = \"STACKONWARD_ACTIVE_SLOT\";\nexport const TRAFFIC_ACTIVE_RELEASE_ENV = \"STACKONWARD_ACTIVE_RELEASE\";\nexport const TRAFFIC_CANDIDATE_SLOT_ENV = \"STACKONWARD_CANDIDATE_SLOT\";\nexport const TRAFFIC_CANDIDATE_RELEASE_ENV = \"STACKONWARD_CANDIDATE_RELEASE\";\nexport const TRAFFIC_WORKLOAD_ENV = \"STACKONWARD_WORKLOAD\";\n\nconst slotSchema = z.enum([\"blue\", \"green\"]);\nconst composeConfigSchema = z\n .object({\n services: z.record(z.string(), z.object({ image: z.string().min(1) }).passthrough()),\n })\n .passthrough();\n\ntype Slot = z.infer<typeof slotSchema>;\ntype Environment = Extract<Plan[\"environment\"], { readonly target: \"compose-host\" }>;\ntype ComposeRelease = Omit<StagedRelease, \"artifact\" | \"projection\"> & {\n readonly artifact: PublishedImageArtifact | PublishedStackArtifact;\n readonly projection: Extract<StagedRelease[\"projection\"], { readonly kind: \"compose\" }>;\n};\ntype ComposeObserved = Omit<ObservedRelease, \"artifact\" | \"projection\"> & {\n readonly artifact: PublishedImageArtifact | PublishedStackArtifact;\n readonly projection: Extract<ObservedRelease[\"projection\"], { readonly kind: \"compose\" }>;\n};\n\nexport interface Options {\n readonly session: Session;\n readonly traffic: Pick<LifecyclePort, \"traffic\">;\n readonly trafficOptions: ProcessOptions;\n readonly health: HealthPort;\n readonly previewHealth: HealthPort;\n readonly docker?: string;\n}\n\nexport class RolloutError extends Error {\n constructor(\n readonly failure: Failure,\n options?: ErrorOptions,\n ) {\n super(failure.message, options);\n this.name = \"BlueGreenRolloutError\";\n }\n}\n\n/** 蓝绿策略只管理两个隔离运行槽和流量边界,产品生命周期由协调器统一排序。 */\nexport function createRollout(options: Options): RolloutAdapter {\n const docker = options.docker ?? \"docker\";\n const rollout: RolloutAdapter = {\n id: \"blue-green\",\n activate: (plan, release, context) => activate(options, docker, plan, release, context),\n verify: (plan, release, context) => verify(options, plan, release, context),\n recover: (plan, candidate, context) => recover(options, docker, plan, candidate, context),\n };\n return Object.freeze(rollout);\n}\n\n/** 工作负载能力只管理一个服务槽和路由,release 级指针由外层适配器提交。 */\nexport function createWorkloadRollout(options: Options): WorkloadRolloutAdapter {\n const docker = options.docker ?? \"docker\";\n const adapter: WorkloadRolloutAdapter = {\n id: \"blue-green\",\n activate: (plan, release, selection, context) =>\n activateWorkload(options, docker, plan, release, selection, context),\n verify: (plan, release, selection, context) =>\n verifyWorkload(options, plan, release, selection, context),\n recover: (plan, candidate, selection, context) =>\n recoverWorkload(options, docker, plan, candidate, selection, context),\n };\n return Object.freeze(adapter);\n}\n\nasync function activate(\n options: Options,\n docker: string,\n plan: ReleasePlan,\n rawRelease: StagedRelease,\n rawContext: ActivateContext,\n): Promise<ActivatedRelease> {\n const context = activateContextSchema.parse(rawContext);\n const environment = environmentOf(plan);\n const policy = policyOf(environment);\n const release = stagedOf(plan, rawRelease);\n assertDirectArtifact(release);\n const priorRelease = release.previous?.releaseId;\n let slotChanged = false;\n let trafficChanged = false;\n\n try {\n const currentPointer = await observePointer(options.session, environment, \"current\");\n if (currentPointer !== priorRelease) {\n throw rolloutError(\n \"activation\",\n \"activation-prepared\",\n \"none\",\n \"Current release does not match the staged predecessor\",\n );\n }\n\n const observed = await inspectTraffic(options, policy, context.signal, \"app\");\n const active = trafficSlot(observed, \"inspect\");\n if (observed.candidate !== priorRelease) {\n throw rolloutError(\n \"activation\",\n \"activation-prepared\",\n \"none\",\n \"Traffic observation does not match the staged predecessor\",\n );\n }\n\n const candidate = inactive(active);\n await deploy(\n options.session,\n docker,\n plan,\n release,\n candidate,\n \"app\",\n previewHealthFor(policy.previewHealth, candidate),\n );\n slotChanged = true;\n const preview = await checkHealth(\n options.previewHealth,\n previewHealthFor(policy.previewHealth, candidate),\n release.releaseId,\n context.activatedAt,\n context.signal,\n );\n if (preview.status !== \"healthy\") {\n throw rolloutError(\n \"health\",\n \"activation-prepared\",\n \"acknowledged\",\n \"Inactive slot did not pass preview health verification\",\n );\n }\n\n const switched = await options.traffic.traffic(\n policy.traffic.activate,\n \"activate\",\n trafficOptions(options.trafficOptions, context.signal, \"app\", {\n activeSlot: active,\n activeRelease: priorRelease,\n candidateSlot: candidate,\n candidateRelease: release.releaseId,\n }),\n );\n assertTraffic(switched, \"activate\", candidate, release.releaseId, \"unknown\");\n trafficChanged = true;\n\n await updatePointers(options.session, environment, release.releaseId, priorRelease, \"activate\");\n return activatedReleaseSchema.parse({ ...release, activatedAt: context.activatedAt });\n } catch (error) {\n if (trafficChanged) {\n const inner = normalize(error, \"activation\", \"activation-prepared\");\n throw rolloutError(\n inner.failure.category,\n \"activation-prepared\",\n \"unknown\",\n inner.failure.message,\n error,\n );\n }\n const normalized = normalize(error, \"activation\", \"activation-prepared\");\n if (slotChanged && normalized.failure.effect === \"none\") {\n throw rolloutError(\n normalized.failure.category,\n normalized.failure.phase,\n \"acknowledged\",\n normalized.failure.message,\n normalized,\n );\n }\n throw normalized;\n }\n}\n\nasync function verify(\n options: Options,\n plan: Plan,\n rawRelease: ObservedRelease,\n rawContext: VerifyContext,\n): Promise<HealthResult> {\n const context = verifyContextSchema.parse(rawContext);\n const environment = environmentOf(plan);\n const policy = policyOf(environment);\n const release = observedOf(plan, rawRelease);\n assertDirectArtifact(release);\n\n const current = await observePointer(options.session, environment, \"current\");\n if (current !== release.releaseId) {\n return healthResultSchema.parse({\n schemaVersion: 1,\n releaseId: release.releaseId,\n status: \"unknown\",\n attempts: 1,\n checkedAt: context.checkedAt,\n });\n }\n\n const observed = await inspectTraffic(options, policy, context.signal, \"app\");\n trafficSlot(observed, \"inspect\");\n if (observed.candidate !== release.releaseId) {\n return healthResultSchema.parse({\n schemaVersion: 1,\n releaseId: release.releaseId,\n status: \"unknown\",\n attempts: 1,\n checkedAt: context.checkedAt,\n });\n }\n return checkHealth(\n options.health,\n environment.health,\n release.releaseId,\n context.checkedAt,\n context.signal,\n );\n}\n\nasync function recover(\n options: Options,\n docker: string,\n plan: Plan,\n rawCandidate: ObservedRelease,\n rawContext: RecoverContext,\n): Promise<RecoveryOutcome> {\n const context = recoverContextSchema.parse(rawContext);\n const environment = environmentOf(plan);\n const policy = policyOf(environment);\n const candidate = observedOf(plan, rawCandidate);\n assertDirectArtifact(candidate);\n let observedRelease: ReleaseIdentity | undefined;\n let slotChanged = false;\n\n try {\n const current = await observePointer(options.session, environment, \"current\");\n const previous = await observePointer(options.session, environment, \"previous\");\n observedRelease = current;\n if (!current || previous !== candidate.releaseId) {\n throw rolloutError(\n \"rollback\",\n \"rollback-pending\",\n \"none\",\n \"Recovery pointers do not identify the exact current and prior releases\",\n );\n }\n\n const observed = await inspectTraffic(options, policy, context.signal, \"app\");\n const active = trafficSlot(observed, \"inspect\");\n if (observed.candidate !== current) {\n throw rolloutError(\n \"rollback\",\n \"rollback-pending\",\n \"none\",\n \"Traffic observation does not match the current release\",\n );\n }\n\n const priorSlot = inactive(active);\n const stagedCandidate = observedAsStaged(candidate);\n await deploy(\n options.session,\n docker,\n plan,\n stagedCandidate,\n priorSlot,\n \"app\",\n previewHealthFor(policy.previewHealth, priorSlot),\n );\n slotChanged = true;\n const preview = await checkHealth(\n options.previewHealth,\n previewHealthFor(policy.previewHealth, priorSlot),\n candidate.releaseId,\n context.recoveredAt,\n context.signal,\n );\n if (preview.status !== \"healthy\") {\n throw rolloutError(\n \"rollback\",\n \"rollback-pending\",\n \"acknowledged\",\n \"Recovery candidate did not pass preview health verification\",\n );\n }\n\n const restored = await options.traffic.traffic(\n policy.traffic.recover,\n \"recover\",\n trafficOptions(options.trafficOptions, context.signal, \"app\", {\n activeSlot: active,\n activeRelease: current,\n candidateSlot: priorSlot,\n candidateRelease: candidate.releaseId,\n }),\n );\n assertTraffic(restored, \"recover\", priorSlot, candidate.releaseId, \"unknown\");\n observedRelease = candidate.releaseId;\n await updatePointers(options.session, environment, candidate.releaseId, current, \"recover\");\n\n const release = activatedReleaseSchema.parse({\n ...stagedCandidate,\n activatedAt: context.recoveredAt,\n });\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"recovered\",\n effect: \"acknowledged\",\n release,\n });\n } catch (error) {\n const normalized = normalize(error, \"rollback\", \"rollback-pending\");\n const effect =\n slotChanged && normalized.failure.effect === \"none\"\n ? \"acknowledged\"\n : normalized.failure.effect;\n if (effect !== \"none\") {\n observedRelease = await safeObservePointer(options.session, environment, \"current\");\n }\n if (effect === \"unknown\" || (effect === \"acknowledged\" && !observedRelease)) {\n const failure = failureOf(\n \"rollback\",\n \"rollback-pending\",\n \"unknown\",\n \"Recovery effect requires reconciliation\",\n );\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"unknown\",\n effect: \"unknown\",\n ...(observedRelease === undefined ? {} : { observedRelease }),\n failure,\n });\n }\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"failed\",\n effect,\n ...(observedRelease === undefined ? {} : { observedRelease }),\n failure:\n effect === normalized.failure.effect\n ? normalized.failure\n : failureOf(\"rollback\", \"rollback-pending\", effect, normalized.failure.message),\n });\n }\n}\n\nasync function activateWorkload(\n options: Options,\n docker: string,\n plan: ReleasePlan,\n rawRelease: StagedRelease,\n rawSelection: WorkloadSelection,\n rawContext: ActivateContext,\n): Promise<WorkloadActivationOutcome> {\n const context = activateContextSchema.parse(rawContext);\n const environment = environmentOf(plan);\n const release = stagedOf(plan, rawRelease);\n const selection = selectionOf(environment, release, rawSelection, \"activation-prepared\");\n const policy = selection.policy;\n const priorRelease = release.previous?.releaseId;\n let acknowledged = false;\n\n try {\n const observed = await inspectTraffic(options, policy, context.signal, selection.workload);\n const active = trafficSlot(observed, \"inspect\");\n if (observed.candidate !== priorRelease) {\n throw rolloutError(\n \"activation\",\n \"activation-prepared\",\n \"none\",\n \"Traffic observation does not match the staged predecessor\",\n );\n }\n\n const candidate = inactive(active);\n await deploy(\n options.session,\n docker,\n plan,\n release,\n candidate,\n selection.workload,\n previewHealthFor(policy.previewHealth, candidate),\n );\n acknowledged = true;\n const preview = await checkHealth(\n options.previewHealth,\n previewHealthFor(policy.previewHealth, candidate),\n release.releaseId,\n context.activatedAt,\n context.signal,\n );\n if (preview.status !== \"healthy\") {\n throw rolloutError(\n \"activation\",\n \"activation-prepared\",\n \"acknowledged\",\n \"Inactive workload slot did not pass preview health verification\",\n );\n }\n\n const switched = await options.traffic.traffic(\n policy.traffic.activate,\n \"activate\",\n trafficOptions(options.trafficOptions, context.signal, selection.workload, {\n activeSlot: active,\n activeRelease: priorRelease,\n candidateSlot: candidate,\n candidateRelease: release.releaseId,\n }),\n );\n assertTraffic(switched, \"activate\", candidate, release.releaseId, \"unknown\");\n return workloadActivationOutcomeSchema.parse({\n schemaVersion: 1,\n workload: selection.workload,\n releaseId: release.releaseId,\n status: \"succeeded\",\n effect: \"acknowledged\",\n });\n } catch (error) {\n const normalized = normalize(error, \"activation\", \"activation-prepared\");\n const effect =\n acknowledged && normalized.failure.effect === \"none\"\n ? \"acknowledged\"\n : normalized.failure.effect;\n const failure = failureOf(\n \"activation\",\n \"activation-prepared\",\n effect,\n normalized.failure.message,\n );\n return workloadActivationOutcomeSchema.parse({\n schemaVersion: 1,\n workload: selection.workload,\n releaseId: release.releaseId,\n status: effect === \"unknown\" ? \"unknown\" : \"failed\",\n effect,\n failure,\n });\n }\n}\n\nasync function verifyWorkload(\n options: Options,\n plan: Plan,\n rawRelease: ObservedRelease,\n rawSelection: WorkloadSelection,\n rawContext: VerifyContext,\n): Promise<WorkloadHealthResult> {\n const context = verifyContextSchema.parse(rawContext);\n const environment = environmentOf(plan);\n const release = observedOf(plan, rawRelease);\n const selection = selectionOf(environment, observedAsStaged(release), rawSelection, \"activated\");\n const observed = await inspectTraffic(\n options,\n selection.policy,\n context.signal,\n selection.workload,\n );\n trafficSlot(observed, \"inspect\");\n if (observed.candidate !== release.releaseId) {\n return workloadHealthResultSchema.parse({\n schemaVersion: 1,\n workload: selection.workload,\n releaseId: release.releaseId,\n status: \"unknown\",\n attempts: 1,\n checkedAt: context.checkedAt,\n });\n }\n const result = await checkHealth(\n options.health,\n environment.health,\n release.releaseId,\n context.checkedAt,\n context.signal,\n );\n return workloadHealthResultSchema.parse({ ...result, workload: selection.workload });\n}\n\nasync function recoverWorkload(\n options: Options,\n docker: string,\n plan: Plan,\n rawCandidate: ObservedRelease,\n rawSelection: WorkloadSelection,\n rawContext: RecoverContext,\n): Promise<WorkloadRecoveryOutcome> {\n const context = recoverContextSchema.parse(rawContext);\n const environment = environmentOf(plan);\n const candidate = observedOf(plan, rawCandidate);\n const stagedCandidate = observedAsStaged(candidate);\n const selection = selectionOf(environment, stagedCandidate, rawSelection, \"rollback-pending\");\n let acknowledged = false;\n\n try {\n const observed = await inspectTraffic(\n options,\n selection.policy,\n context.signal,\n selection.workload,\n );\n const active = trafficSlot(observed, \"inspect\");\n if (observed.candidate === candidate.releaseId) {\n return workloadRecoveryOutcomeSchema.parse({\n schemaVersion: 1,\n workload: selection.workload,\n releaseId: candidate.releaseId,\n status: \"recovered\",\n effect: \"acknowledged\",\n });\n }\n const activeRelease = releaseIdentitySchema.safeParse(observed.candidate);\n if (!activeRelease.success) {\n throw rolloutError(\n \"rollback\",\n \"rollback-pending\",\n \"none\",\n \"Traffic observation does not identify the active release\",\n activeRelease.error,\n );\n }\n\n const priorSlot = inactive(active);\n await deploy(\n options.session,\n docker,\n plan,\n stagedCandidate,\n priorSlot,\n selection.workload,\n previewHealthFor(selection.policy.previewHealth, priorSlot),\n );\n acknowledged = true;\n const preview = await checkHealth(\n options.previewHealth,\n previewHealthFor(selection.policy.previewHealth, priorSlot),\n candidate.releaseId,\n context.recoveredAt,\n context.signal,\n );\n if (preview.status !== \"healthy\") {\n throw rolloutError(\n \"rollback\",\n \"rollback-pending\",\n \"acknowledged\",\n \"Recovery workload did not pass preview health verification\",\n );\n }\n const restored = await options.traffic.traffic(\n selection.policy.traffic.recover,\n \"recover\",\n trafficOptions(options.trafficOptions, context.signal, selection.workload, {\n activeSlot: active,\n activeRelease: activeRelease.data,\n candidateSlot: priorSlot,\n candidateRelease: candidate.releaseId,\n }),\n );\n assertTraffic(restored, \"recover\", priorSlot, candidate.releaseId, \"unknown\");\n return workloadRecoveryOutcomeSchema.parse({\n schemaVersion: 1,\n workload: selection.workload,\n releaseId: candidate.releaseId,\n status: \"recovered\",\n effect: \"acknowledged\",\n });\n } catch (error) {\n const normalized = normalize(error, \"rollback\", \"rollback-pending\");\n const effect =\n acknowledged && normalized.failure.effect === \"none\"\n ? \"acknowledged\"\n : normalized.failure.effect;\n const failure = failureOf(\"rollback\", \"rollback-pending\", effect, normalized.failure.message);\n return workloadRecoveryOutcomeSchema.parse({\n schemaVersion: 1,\n workload: selection.workload,\n releaseId: candidate.releaseId,\n status: effect === \"unknown\" ? \"unknown\" : \"failed\",\n effect,\n failure,\n });\n }\n}\n\nasync function deploy(\n session: Session,\n docker: string,\n plan: Plan,\n release: ComposeRelease,\n slot: Slot,\n workload: string,\n health: Health,\n): Promise<void> {\n const prefix = composePrefix(docker, plan, release, slot);\n const configured = await session.execute({\n executable: prefix.executable,\n args: [...prefix.args, \"config\", \"--format\", \"json\"],\n });\n let document: unknown;\n try {\n document = JSON.parse(configured.stdout) as unknown;\n } catch (error) {\n throw rolloutError(\n \"activation\",\n \"activation-prepared\",\n \"none\",\n \"Compose projection is not valid JSON\",\n error,\n );\n }\n const parsed = composeConfigSchema.safeParse(document);\n const reference = referenceOf(release, workload);\n if (!parsed.success || parsed.data.services[workload]?.image !== reference) {\n throw rolloutError(\n \"activation\",\n \"activation-prepared\",\n \"none\",\n \"Compose projection does not bind the selected workload digest\",\n parsed.success ? undefined : parsed.error,\n );\n }\n await session.execute({\n executable: prefix.executable,\n args: [...prefix.args, \"pull\", \"--policy\", \"always\", workload],\n });\n await session.execute({\n executable: prefix.executable,\n args: [\n ...prefix.args,\n \"up\",\n \"--detach\",\n \"--no-build\",\n \"--no-deps\",\n \"--pull\",\n \"never\",\n \"--wait\",\n \"--wait-timeout\",\n String(waitSeconds(health)),\n workload,\n ],\n });\n}\n\nfunction composePrefix(docker: string, plan: Plan, release: ComposeRelease, slot: Slot): Command {\n const root = `releases/${release.releaseId}`;\n const sourceFiles = release.projection.files.filter(\n (file) => file !== \"compose/ports-blue.yaml\" && file !== \"compose/ports-green.yaml\",\n );\n const ports = release.projection.slotPorts\n ? release.projection.slotPorts[slot]\n : release.projection.ports;\n const files = [\n ...sourceFiles,\n ...(ports === undefined ? [] : [ports]),\n release.projection.images,\n ];\n return {\n executable: docker,\n args: [\n \"compose\",\n \"--project-name\",\n `${plan.config.name}-${plan.environmentName}-${slot}`,\n ...files.flatMap((file) => [\"--file\", `${root}/${file}`]),\n ],\n };\n}\n\nfunction waitSeconds(health: Health): number {\n const duration =\n health.timeoutMs * health.attempts + health.intervalMs * Math.max(0, health.attempts - 1);\n return Math.max(1, Math.ceil(duration / 1000));\n}\n\nasync function inspectTraffic(\n options: Options,\n policy: BlueGreenRollout,\n signal: AbortSignal | undefined,\n workload: string,\n): Promise<TrafficResult> {\n return options.traffic.traffic(\n policy.traffic.inspect,\n \"inspect\",\n trafficOptions(options.trafficOptions, signal, workload),\n );\n}\n\nfunction trafficOptions(\n options: ProcessOptions,\n signal: AbortSignal | undefined,\n workload: string,\n input?: {\n readonly activeSlot: Slot;\n readonly activeRelease?: ReleaseIdentity;\n readonly candidateSlot: Slot;\n readonly candidateRelease: ReleaseIdentity;\n },\n): ProcessOptions {\n const env = input\n ? {\n ...options.env,\n [TRAFFIC_ACTIVE_SLOT_ENV]: input.activeSlot,\n ...(input.activeRelease === undefined\n ? {}\n : { [TRAFFIC_ACTIVE_RELEASE_ENV]: input.activeRelease }),\n [TRAFFIC_CANDIDATE_SLOT_ENV]: input.candidateSlot,\n [TRAFFIC_CANDIDATE_RELEASE_ENV]: input.candidateRelease,\n }\n : options.env;\n return {\n ...options,\n env: { ...env, [TRAFFIC_WORKLOAD_ENV]: workload },\n ...(signal === undefined ? {} : { signal }),\n };\n}\n\nfunction referenceOf(release: ComposeRelease, workload: string): string {\n if (release.artifact.kind === \"oci\") {\n if (workload !== \"app\") {\n throw rolloutError(\n \"artifact\",\n \"staged\",\n \"none\",\n \"Single-image release only exposes the app workload\",\n );\n }\n return release.artifact.reference;\n }\n const published = release.artifact.workloads.find((item) => item.workload === workload);\n if (!published) {\n throw rolloutError(\n \"artifact\",\n \"staged\",\n \"none\",\n \"Release does not contain the selected workload\",\n );\n }\n return published.reference;\n}\n\nasync function checkHealth(\n port: HealthPort,\n policy: Health,\n releaseId: ReleaseIdentity,\n checkedAt: string,\n signal: AbortSignal | undefined,\n): Promise<HealthResult> {\n const observed = healthResultSchema.parse(\n await port.check({\n policy,\n releaseId,\n checkedAt,\n ...(signal === undefined ? {} : { signal }),\n }),\n );\n if (\n observed.releaseId !== releaseId ||\n observed.checkedAt !== checkedAt ||\n observed.attempts > policy.attempts ||\n (observed.status === \"healthy\" && observed.observedStatus !== policy.expectedStatus)\n ) {\n throw rolloutError(\n \"health\",\n \"activation-prepared\",\n \"none\",\n \"Health evidence does not match the selected release policy\",\n );\n }\n return observed;\n}\n\nfunction assertTraffic(\n result: TrafficResult,\n phase: \"activate\" | \"recover\",\n slot: Slot,\n releaseId: ReleaseIdentity,\n effect: Failure[\"effect\"],\n): void {\n if (\n result.phase === phase &&\n result.status === \"succeeded\" &&\n result.active === slot &&\n result.candidate === releaseId\n ) {\n return;\n }\n throw rolloutError(\n phase === \"activate\" ? \"activation\" : \"rollback\",\n phase === \"activate\" ? \"activation-prepared\" : \"rollback-pending\",\n effect,\n \"Traffic result does not identify the requested slot and release\",\n );\n}\n\nfunction trafficSlot(result: TrafficResult, phase: \"inspect\"): Slot {\n const parsed = slotSchema.safeParse(result.active);\n if (result.phase === phase && result.status === \"succeeded\" && parsed.success) {\n return parsed.data;\n }\n throw rolloutError(\n \"activation\",\n \"activation-prepared\",\n \"none\",\n \"Traffic inspection must identify one active slot\",\n );\n}\n\nasync function updatePointers(\n session: Session,\n environment: Environment,\n current: ReleaseIdentity,\n previous: ReleaseIdentity | undefined,\n phase: \"activate\" | \"recover\",\n): Promise<void> {\n const category = phase === \"activate\" ? \"activation\" : \"rollback\";\n const state = phase === \"activate\" ? \"activation-prepared\" : \"rollback-pending\";\n if (previous === undefined) {\n if ((await observePointer(session, environment, \"previous\")) !== undefined) {\n throw rolloutError(\n category,\n state,\n \"none\",\n \"First blue-green activation cannot inherit a previous release pointer\",\n );\n }\n } else {\n await session.swapLink({ link: \"previous\", target: `releases/${previous}` });\n }\n await session.swapLink({ link: \"current\", target: `releases/${current}` });\n\n const [observedCurrent, observedPrevious] = await Promise.all([\n observePointer(session, environment, \"current\"),\n observePointer(session, environment, \"previous\"),\n ]);\n if (observedCurrent !== current || observedPrevious !== previous) {\n throw rolloutError(\n category,\n state,\n \"unknown\",\n \"Release pointers do not match the observed traffic state\",\n );\n }\n}\n\nasync function observePointer(\n session: Session,\n environment: Environment,\n pointer: \"current\" | \"previous\",\n): Promise<ReleaseIdentity | undefined> {\n const target = await session.observeLink(pointer);\n if (target === null) return undefined;\n const relativePrefix = \"releases/\";\n const absolutePrefix = `${environment.root}/releases/`;\n const releaseId = target.startsWith(absolutePrefix)\n ? target.slice(absolutePrefix.length)\n : target.startsWith(relativePrefix)\n ? target.slice(relativePrefix.length)\n : undefined;\n const parsed = releaseIdentitySchema.safeParse(releaseId);\n if (!parsed.success) {\n throw rolloutError(\n \"activation\",\n \"activation-prepared\",\n \"none\",\n \"Release pointer is invalid\",\n parsed.error,\n );\n }\n return parsed.data;\n}\n\nasync function safeObservePointer(\n session: Session,\n environment: Environment,\n pointer: \"current\" | \"previous\",\n): Promise<ReleaseIdentity | undefined> {\n try {\n return await observePointer(session, environment, pointer);\n } catch {\n return undefined;\n }\n}\n\nfunction environmentOf(plan: Plan): Environment {\n if (plan.environment.target !== \"compose-host\") {\n throw rolloutError(\n \"config\",\n \"validated\",\n \"none\",\n \"Blue-green rollout requires a Compose host environment\",\n );\n }\n return plan.environment;\n}\n\nfunction policyOf(environment: Environment): BlueGreenRollout {\n const rollout = environment.rollout;\n if (!(\"strategy\" in rollout) || rollout.strategy !== \"blue-green\") {\n throw rolloutError(\n \"config\",\n \"validated\",\n \"none\",\n \"Blue-green rollout requires a direct blue-green policy\",\n );\n }\n return rollout;\n}\n\nfunction selectionOf(\n environment: Environment,\n release: ComposeRelease,\n input: WorkloadSelection,\n phase: Failure[\"phase\"],\n): WorkloadSelection & { readonly policy: BlueGreenRollout } {\n const parsed = workloadSelectionSchema.safeParse(input);\n const rollout = environment.rollout;\n const declared =\n parsed.success && !(\"strategy\" in rollout)\n ? rollout.workloads[parsed.data.workload]\n : undefined;\n if (\n !parsed.success ||\n !declared ||\n declared.strategy !== \"blue-green\" ||\n parsed.data.policy.strategy !== \"blue-green\" ||\n JSON.stringify(declared) !== JSON.stringify(parsed.data.policy)\n ) {\n throw rolloutError(\n phase === \"rollback-pending\" ? \"rollback\" : \"activation\",\n phase,\n \"none\",\n \"Selected workload policy does not match the execution plan\",\n parsed.success ? undefined : parsed.error,\n );\n }\n referenceOf(release, parsed.data.workload);\n return { workload: parsed.data.workload, policy: declared };\n}\n\nfunction assertDirectArtifact(release: Pick<ComposeRelease, \"artifact\">): void {\n if (release.artifact.kind !== \"oci\") {\n throw rolloutError(\n \"artifact\",\n \"staged\",\n \"none\",\n \"Direct blue-green rollout requires one OCI image\",\n );\n }\n}\n\nfunction stagedOf(plan: ReleasePlan, input: StagedRelease): ComposeRelease {\n const release = stagedReleaseSchema.parse(input);\n assertEnvironment(plan, release);\n if (release.revision !== plan.revision) {\n throw rolloutError(\n \"artifact\",\n \"staged\",\n \"none\",\n \"Staged release revision does not match the execution plan\",\n );\n }\n if (release.projection.kind !== \"compose\" || release.artifact.kind === \"directory\") {\n throw rolloutError(\n \"artifact\",\n \"staged\",\n \"none\",\n \"Blue-green rollout requires a staged Compose artifact\",\n );\n }\n return release as ComposeRelease;\n}\n\nfunction observedOf(plan: Plan, input: ObservedRelease): ComposeObserved {\n const release = observedReleaseSchema.parse(input);\n assertEnvironment(plan, release);\n if (release.projection.kind !== \"compose\" || release.artifact.kind === \"directory\") {\n throw rolloutError(\n \"artifact\",\n \"rollback-pending\",\n \"none\",\n \"Blue-green recovery requires an observed Compose artifact\",\n );\n }\n return release as ComposeObserved;\n}\n\nfunction observedAsStaged(release: ComposeObserved): ComposeRelease {\n const { health: _health, migrationLedger: _migrationLedger, ...record } = release;\n const staged = stagedReleaseSchema.parse(record);\n if (staged.projection.kind !== \"compose\" || staged.artifact.kind === \"directory\") {\n throw rolloutError(\n \"artifact\",\n \"rollback-pending\",\n \"none\",\n \"Blue-green recovery requires a staged Compose artifact\",\n );\n }\n return staged as ComposeRelease;\n}\n\nfunction assertEnvironment(\n plan: Plan,\n release: Pick<StagedRelease, \"environment\" | \"artifact\">,\n): void {\n if (\n release.environment === plan.environmentName &&\n release.artifact.profile === plan.config.profile\n ) {\n return;\n }\n throw rolloutError(\n \"artifact\",\n \"staged\",\n \"none\",\n \"Release does not belong to the selected execution plan\",\n );\n}\n\nfunction inactive(active: Slot): Slot {\n return active === \"blue\" ? \"green\" : \"blue\";\n}\n\nfunction previewHealthFor(health: BlueGreenRollout[\"previewHealth\"], slot: Slot): Health {\n return \"url\" in health ? health : health[slot];\n}\n\nfunction normalize(\n error: unknown,\n category: Failure[\"category\"],\n phase: Failure[\"phase\"],\n): RolloutError {\n if (error instanceof RolloutError) {\n if (error.failure.category === category && error.failure.phase === phase) return error;\n return rolloutError(category, phase, error.failure.effect, error.failure.message, error);\n }\n if (error instanceof LifecycleError) return new RolloutError(error.failure, { cause: error });\n if (error instanceof TransportError) {\n return rolloutError(category, phase, error.effect, `${category} transport failed`, error);\n }\n return rolloutError(category, phase, \"none\", `${category} operation failed`, error);\n}\n\nfunction rolloutError(\n category: Failure[\"category\"],\n phase: Failure[\"phase\"],\n effect: Failure[\"effect\"],\n message: string,\n cause?: unknown,\n): RolloutError {\n return new RolloutError(\n failureOf(category, phase, effect, message),\n cause === undefined ? undefined : { cause },\n );\n}\n\nfunction failureOf(\n category: Failure[\"category\"],\n phase: Failure[\"phase\"],\n effect: Failure[\"effect\"],\n message: string,\n): Failure {\n return failureSchema.parse({ category, phase, retryable: false, effect, message });\n}\n","import { z } from \"zod\";\n\nimport { commandSchema, composeEnvironmentSchema, type Command, type Health } from \"../config.js\";\nimport type { HealthPort } from \"../health.js\";\nimport type { Plan, ReleasePlan } from \"../plan.js\";\nimport {\n activatedReleaseSchema,\n activateContextSchema,\n healthResultSchema,\n recoverContextSchema,\n recoveryOutcomeSchema,\n verifyContextSchema,\n workloadActivationOutcomeSchema,\n workloadHealthResultSchema,\n workloadRecoveryOutcomeSchema,\n workloadSelectionSchema,\n type ActivateContext,\n type ActivatedRelease,\n type HealthResult,\n type RecoverContext,\n type RecoveryOutcome,\n type RolloutAdapter,\n type VerifyContext,\n type WorkloadActivationOutcome,\n type WorkloadHealthResult,\n type WorkloadRecoveryOutcome,\n type WorkloadRolloutAdapter,\n type WorkloadSelection,\n} from \"../rollout.js\";\nimport {\n failureSchema,\n type Failure,\n type PublishedImageArtifact,\n type PublishedStackArtifact,\n} from \"../receipt.js\";\nimport {\n observedReleaseSchema,\n releaseIdentitySchema,\n stagedReleaseSchema,\n type ObservedRelease,\n type ReleaseIdentity,\n type StagedRelease,\n} from \"../target.js\";\nimport { TransportError, type Session } from \"../transport/ssh.js\";\n\nconst composeConfigSchema = z\n .object({\n services: z.record(z.string(), z.object({ image: z.string().min(1) }).passthrough()),\n })\n .passthrough();\nconst containerConfigSchema = z\n .object({\n Image: z.string().min(1),\n Labels: z.record(z.string(), z.string()),\n })\n .passthrough();\n\ntype Environment = z.infer<typeof composeEnvironmentSchema>;\ntype Artifact = PublishedImageArtifact | PublishedStackArtifact;\ntype Operation = \"activate\" | \"recover\" | \"verify\";\n\ninterface Runtime {\n readonly executable: string;\n readonly environment: Environment;\n readonly project: string;\n readonly releasePath: string;\n readonly composeArgs: readonly string[];\n readonly images: Readonly<Record<string, string>>;\n readonly workloads: readonly string[];\n}\n\nexport type ErrorCode =\n | \"cancelled\"\n | \"compose_config_failed\"\n | \"compose_config_invalid\"\n | \"context_invalid\"\n | \"health_probe_failed\"\n | \"health_probe_invalid\"\n | \"plan_invalid\"\n | \"pointer_invalid\"\n | \"pull_failed\"\n | \"release_invalid\"\n | \"replacement_failed\"\n | \"runtime_observation_failed\"\n | \"runtime_observation_invalid\";\n\n/** 重建错误只公开稳定失败合同,远端命令和健康响应保留在受控原因中。 */\nexport class RolloutError extends Error {\n constructor(\n readonly code: ErrorCode,\n readonly operation: Operation,\n readonly failure: Failure,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"RecreateRolloutError\";\n }\n}\n\n/** Recreate 适配器复用调用方已持有的 SSH 会话,不获取第二把远端锁。 */\nexport function createRollout(\n session: Session,\n health: HealthPort,\n executable = \"docker\",\n): RolloutAdapter {\n const parsed = commandSchema.safeParse({ executable, args: [] });\n if (!parsed.success) {\n throw rolloutError(\"plan_invalid\", \"activate\", \"none\", false, parsed.error);\n }\n const docker = parsed.data.executable;\n const adapter: RolloutAdapter = {\n id: \"recreate\",\n activate: (plan, release, context) => activate(session, docker, plan, release, context),\n verify: (plan, release, context) => verify(session, health, docker, plan, release, context),\n recover: (plan, candidate, context) => recover(session, docker, plan, candidate, context),\n };\n return Object.freeze(adapter);\n}\n\n/** 工作负载能力只改变所选 Compose 服务,release 级指针由外层适配器统一提交。 */\nexport function createWorkloadRollout(\n session: Session,\n health: HealthPort,\n executable = \"docker\",\n): WorkloadRolloutAdapter {\n const parsed = commandSchema.safeParse({ executable, args: [] });\n if (!parsed.success) {\n throw rolloutError(\"plan_invalid\", \"activate\", \"none\", false, parsed.error);\n }\n const docker = parsed.data.executable;\n const adapter: WorkloadRolloutAdapter = {\n id: \"recreate\",\n activate: (plan, release, selection, context) =>\n activateWorkload(session, docker, plan, release, selection, context),\n verify: (plan, release, selection, context) =>\n verifyWorkload(session, health, docker, plan, release, selection, context),\n recover: (plan, candidate, selection, context) =>\n recoverWorkload(session, docker, plan, candidate, selection, context),\n };\n return Object.freeze(adapter);\n}\n\nasync function activate(\n session: Session,\n docker: string,\n plan: ReleasePlan,\n rawRelease: StagedRelease,\n rawContext: ActivateContext,\n): Promise<ActivatedRelease> {\n const context = parseContext(activateContextSchema, rawContext, \"activate\");\n const release = parseStaged(rawRelease, \"activate\");\n assertPlannedRelease(plan, release, \"activate\");\n const runtime = runtimeFor(plan, release, docker, \"activate\");\n assertActive(context.signal, \"activate\");\n\n return replace(session, plan, runtime, release, context.activatedAt, context, true, \"activate\");\n}\n\nasync function verify(\n session: Session,\n health: HealthPort,\n docker: string,\n plan: Plan,\n rawRelease: ObservedRelease,\n rawContext: VerifyContext,\n): Promise<HealthResult> {\n const context = parseContext(verifyContextSchema, rawContext, \"verify\");\n const parsed = observedReleaseSchema.safeParse(rawRelease);\n if (!parsed.success) {\n throw rolloutError(\"release_invalid\", \"verify\", \"none\", false, parsed.error);\n }\n const release = toStaged(parsed.data);\n const runtime = runtimeFor(plan, release, docker, \"verify\");\n assertActive(context.signal, \"verify\");\n await assertCurrent(session, plan, release.releaseId, \"verify\");\n await assertRuntime(session, runtime, \"verify\");\n\n const result = await verifyHealth(health, runtime.environment.health, release, context);\n await assertRuntime(session, runtime, \"verify\");\n await assertCurrent(session, plan, release.releaseId, \"verify\");\n return result;\n}\n\nasync function activateWorkload(\n session: Session,\n docker: string,\n plan: ReleasePlan,\n rawRelease: StagedRelease,\n rawSelection: WorkloadSelection,\n rawContext: ActivateContext,\n): Promise<WorkloadActivationOutcome> {\n const release = parseStaged(rawRelease, \"activate\");\n assertPlannedRelease(plan, release, \"activate\");\n const selection = parseSelection(rawSelection, \"activate\");\n const context = parseContext(activateContextSchema, rawContext, \"activate\");\n try {\n const runtime = runtimeForWorkload(plan, release, selection, docker, \"activate\");\n assertActive(context.signal, \"activate\");\n await validateCompose(session, runtime, \"activate\");\n assertActive(context.signal, \"activate\");\n await pull(session, runtime, \"activate\");\n assertActive(context.signal, \"activate\");\n await replaceServices(session, runtime, \"activate\");\n await assertRuntime(session, runtime, \"activate\");\n return workloadActivationOutcomeSchema.parse({\n schemaVersion: 1,\n workload: selection.workload,\n releaseId: release.releaseId,\n status: \"succeeded\",\n effect: \"acknowledged\",\n });\n } catch (error) {\n const failure = normalizeWorkloadFailure(error, \"activate\");\n return workloadActivationOutcomeSchema.parse({\n schemaVersion: 1,\n workload: selection.workload,\n releaseId: release.releaseId,\n status: failure.effect === \"unknown\" ? \"unknown\" : \"failed\",\n effect: failure.effect,\n failure,\n });\n }\n}\n\nasync function verifyWorkload(\n session: Session,\n health: HealthPort,\n docker: string,\n plan: Plan,\n rawRelease: ObservedRelease,\n rawSelection: WorkloadSelection,\n rawContext: VerifyContext,\n): Promise<WorkloadHealthResult> {\n const observed = observedReleaseSchema.safeParse(rawRelease);\n if (!observed.success) {\n throw rolloutError(\"release_invalid\", \"verify\", \"none\", false, observed.error);\n }\n const release = toStaged(observed.data);\n const selection = parseSelection(rawSelection, \"verify\");\n const context = parseContext(verifyContextSchema, rawContext, \"verify\");\n const runtime = runtimeForWorkload(plan, release, selection, docker, \"verify\");\n assertActive(context.signal, \"verify\");\n await assertRuntime(session, runtime, \"verify\");\n const result = await verifyHealth(\n health,\n composeEnvironmentSchema.parse(plan.environment).health,\n release,\n context,\n );\n await assertRuntime(session, runtime, \"verify\");\n return workloadHealthResultSchema.parse({ ...result, workload: selection.workload });\n}\n\nasync function recoverWorkload(\n session: Session,\n docker: string,\n plan: Plan,\n rawCandidate: ObservedRelease,\n rawSelection: WorkloadSelection,\n rawContext: RecoverContext,\n): Promise<WorkloadRecoveryOutcome> {\n const parsed = observedReleaseSchema.parse(rawCandidate);\n const candidate = toStaged(parsed);\n const selection = parseSelection(rawSelection, \"recover\");\n const context = parseContext(recoverContextSchema, rawContext, \"recover\");\n try {\n const runtime = runtimeForWorkload(plan, candidate, selection, docker, \"recover\");\n assertActive(context.signal, \"recover\");\n await validateCompose(session, runtime, \"recover\");\n assertActive(context.signal, \"recover\");\n await pull(session, runtime, \"recover\");\n assertActive(context.signal, \"recover\");\n await replaceServices(session, runtime, \"recover\");\n await assertRuntime(session, runtime, \"recover\");\n return workloadRecoveryOutcomeSchema.parse({\n schemaVersion: 1,\n workload: selection.workload,\n releaseId: candidate.releaseId,\n status: \"recovered\",\n effect: \"acknowledged\",\n });\n } catch (error) {\n const failure = normalizeWorkloadFailure(error, \"recover\");\n return workloadRecoveryOutcomeSchema.parse({\n schemaVersion: 1,\n workload: selection.workload,\n releaseId: candidate.releaseId,\n status: failure.effect === \"unknown\" ? \"unknown\" : \"failed\",\n effect: failure.effect,\n failure,\n });\n }\n}\n\nasync function recover(\n session: Session,\n docker: string,\n plan: Plan,\n rawCandidate: ObservedRelease,\n rawContext: RecoverContext,\n): Promise<RecoveryOutcome> {\n const context = parseContext(recoverContextSchema, rawContext, \"recover\");\n const parsed = observedReleaseSchema.safeParse(rawCandidate);\n if (!parsed.success) {\n throw rolloutError(\"release_invalid\", \"recover\", \"none\", false, parsed.error);\n }\n const candidate = toStaged(parsed.data);\n const runtime = runtimeFor(plan, candidate, docker, \"recover\");\n assertActive(context.signal, \"recover\");\n\n try {\n const release = await replace(\n session,\n plan,\n runtime,\n candidate,\n context.recoveredAt,\n context,\n false,\n \"recover\",\n );\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"recovered\",\n effect: \"acknowledged\",\n release,\n });\n } catch (error) {\n return recoveryFailure(session, plan, error);\n }\n}\n\nasync function replace(\n session: Session,\n plan: Plan,\n runtime: Runtime,\n release: StagedRelease,\n activatedAt: string,\n context: ActivateContext | RecoverContext,\n requireExpectedCurrent: boolean,\n operation: \"activate\" | \"recover\",\n): Promise<ActivatedRelease> {\n const before = await observePointer(session, plan, \"current\", operation);\n const previousBefore = await observePointer(session, plan, \"previous\", operation);\n if (before === release.releaseId) {\n if (requireExpectedCurrent && previousBefore !== release.previous?.releaseId) {\n throw rolloutError(\"pointer_invalid\", operation, \"none\", false);\n }\n await assertRuntime(session, runtime, operation);\n return activatedReleaseSchema.parse({ ...release, activatedAt });\n }\n if (requireExpectedCurrent && before !== release.previous?.releaseId) {\n throw rolloutError(\"pointer_invalid\", operation, \"none\", false);\n }\n if (!requireExpectedCurrent && !before) {\n throw rolloutError(\"pointer_invalid\", operation, \"none\", false);\n }\n\n await validateCompose(session, runtime, operation);\n assertActive(context.signal, operation);\n await pull(session, runtime, operation);\n assertActive(context.signal, operation);\n await replaceServices(session, runtime, operation);\n await assertRuntime(session, runtime, operation);\n\n try {\n if (before) {\n await session.swapLink({ link: \"previous\", target: `releases/${before}` });\n } else if (previousBefore) {\n throw rolloutError(\"pointer_invalid\", operation, \"acknowledged\", false);\n }\n await session.swapLink({ link: \"current\", target: runtime.releasePath });\n await assertPointers(session, plan, release.releaseId, before, operation);\n } catch (error) {\n try {\n await assertPointers(session, plan, release.releaseId, before, operation);\n } catch (observationError) {\n throw rolloutError(\n \"pointer_invalid\",\n operation,\n \"unknown\",\n false,\n new AggregateError([error, observationError]),\n );\n }\n }\n\n return activatedReleaseSchema.parse({ ...release, activatedAt });\n}\n\nasync function validateCompose(\n session: Session,\n runtime: Runtime,\n operation: \"activate\" | \"recover\",\n): Promise<void> {\n let observation;\n try {\n observation = await session.execute(command(runtime, [\"config\", \"--format\", \"json\"]));\n } catch (error) {\n throw rolloutError(\"compose_config_failed\", operation, \"none\", retryableOf(error), error);\n }\n\n let input: unknown;\n try {\n input = JSON.parse(observation.stdout) as unknown;\n } catch (error) {\n throw rolloutError(\"compose_config_invalid\", operation, \"none\", false, error);\n }\n const parsed = composeConfigSchema.safeParse(input);\n if (!parsed.success) {\n throw rolloutError(\"compose_config_invalid\", operation, \"none\", false, parsed.error);\n }\n for (const [workload, reference] of Object.entries(runtime.images)) {\n if (parsed.data.services[workload]?.image === reference) continue;\n throw rolloutError(\"compose_config_invalid\", operation, \"none\", false);\n }\n}\n\nasync function pull(\n session: Session,\n runtime: Runtime,\n operation: \"activate\" | \"recover\",\n): Promise<void> {\n try {\n await session.execute(command(runtime, [\"pull\", \"--policy\", \"always\", ...runtime.workloads]));\n } catch (error) {\n throw rolloutError(\"pull_failed\", operation, \"none\", retryableOf(error), error);\n }\n}\n\nasync function replaceServices(\n session: Session,\n runtime: Runtime,\n operation: \"activate\" | \"recover\",\n): Promise<void> {\n const waitSeconds = String(Math.max(1, Math.ceil(runtime.environment.health.timeoutMs / 1_000)));\n try {\n await session.execute(\n command(runtime, [\n \"up\",\n \"--detach\",\n \"--force-recreate\",\n \"--no-build\",\n \"--no-deps\",\n \"--pull\",\n \"never\",\n \"--wait\",\n \"--wait-timeout\",\n waitSeconds,\n ...runtime.workloads,\n ]),\n );\n } catch (error) {\n throw rolloutError(\"replacement_failed\", operation, effectOf(error), retryableOf(error), error);\n }\n}\n\nasync function assertRuntime(\n session: Session,\n runtime: Runtime,\n operation: Operation,\n): Promise<void> {\n const effect = operation === \"verify\" ? \"none\" : \"unknown\";\n let identifiers;\n try {\n identifiers = await session.execute(\n command(runtime, [\"ps\", \"--quiet\", \"--status\", \"running\", ...runtime.workloads]),\n );\n } catch (error) {\n throw rolloutError(\"runtime_observation_failed\", operation, effect, retryableOf(error), error);\n }\n\n const containerIds = identifiers.stdout\n .split(/\\r?\\n/u)\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n if (containerIds.length === 0 || new Set(containerIds).size !== containerIds.length) {\n throw rolloutError(\"runtime_observation_invalid\", operation, effect, false);\n }\n\n let inspection;\n try {\n inspection = await session.execute(\n commandSchema.parse({\n executable: runtime.executable,\n args: [\"inspect\", \"--format\", \"{{json .Config}}\", ...containerIds],\n }),\n );\n } catch (error) {\n throw rolloutError(\"runtime_observation_failed\", operation, effect, retryableOf(error), error);\n }\n\n const documents = inspection.stdout\n .split(/\\r?\\n/u)\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n if (documents.length !== containerIds.length) {\n throw rolloutError(\"runtime_observation_invalid\", operation, effect, false);\n }\n\n const observed = new Set<string>();\n for (const document of documents) {\n let input: unknown;\n try {\n input = JSON.parse(document) as unknown;\n } catch (error) {\n throw rolloutError(\"runtime_observation_invalid\", operation, effect, false, error);\n }\n const parsed = containerConfigSchema.safeParse(input);\n const service = parsed.success ? parsed.data.Labels[\"com.docker.compose.service\"] : undefined;\n const project = parsed.success ? parsed.data.Labels[\"com.docker.compose.project\"] : undefined;\n if (\n !parsed.success ||\n !service ||\n project !== runtime.project ||\n runtime.images[service] !== parsed.data.Image\n ) {\n throw rolloutError(\n \"runtime_observation_invalid\",\n operation,\n effect,\n false,\n parsed.success ? undefined : parsed.error,\n );\n }\n observed.add(service);\n }\n\n if (runtime.workloads.some((workload) => !observed.has(workload))) {\n throw rolloutError(\"runtime_observation_invalid\", operation, effect, false);\n }\n}\n\nasync function verifyHealth(\n port: HealthPort,\n health: Health,\n release: StagedRelease,\n context: VerifyContext,\n): Promise<HealthResult> {\n let rawResult: unknown;\n try {\n rawResult = await port.check({\n policy: health,\n releaseId: release.releaseId,\n checkedAt: context.checkedAt,\n ...(context.signal === undefined ? {} : { signal: context.signal }),\n });\n } catch (error) {\n if (context.signal?.aborted) throw rolloutError(\"cancelled\", \"verify\", \"none\", false, error);\n throw rolloutError(\"health_probe_failed\", \"verify\", \"none\", true, error);\n }\n\n const result = healthResultSchema.safeParse(rawResult);\n if (\n !result.success ||\n result.data.releaseId !== release.releaseId ||\n result.data.checkedAt !== context.checkedAt ||\n result.data.attempts > health.attempts ||\n (result.data.status === \"healthy\" && result.data.observedStatus !== health.expectedStatus)\n ) {\n throw rolloutError(\n \"health_probe_invalid\",\n \"verify\",\n \"none\",\n false,\n result.success ? undefined : result.error,\n );\n }\n return result.data;\n}\n\nfunction runtimeFor(\n plan: Plan,\n release: StagedRelease,\n docker: string,\n operation: Operation,\n): Runtime {\n const parsed = composeEnvironmentSchema.safeParse(plan.environment);\n if (!parsed.success || release.environment !== plan.environmentName) {\n throw rolloutError(\"plan_invalid\", operation, \"none\", false, parsed.error);\n }\n if (release.projection.kind !== \"compose\" || release.artifact.kind === \"directory\") {\n throw rolloutError(\"release_invalid\", operation, \"none\", false);\n }\n const artifact = release.artifact;\n const workloads = workloadsFor(parsed.data, artifact, operation);\n const images = imagesFor(artifact);\n const releasePath = `releases/${release.releaseId}`;\n const files = [\n ...release.projection.files.map((file) => `${releasePath}/${file}`),\n `${releasePath}/${release.projection.images}`,\n ];\n const composeArgs = [\n \"compose\",\n \"--ansi\",\n \"never\",\n \"--project-name\",\n `${plan.config.name}-${plan.environmentName}`,\n ...files.flatMap((file) => [\"--file\", file]),\n ];\n const project = `${plan.config.name}-${plan.environmentName}`;\n commandSchema.parse({ executable: docker, args: composeArgs });\n return Object.freeze({\n executable: docker,\n environment: parsed.data,\n project,\n releasePath,\n composeArgs: Object.freeze(composeArgs),\n images: Object.freeze(images),\n workloads: Object.freeze(workloads),\n });\n}\n\nfunction runtimeForWorkload(\n plan: Plan,\n release: StagedRelease,\n selection: WorkloadSelection,\n docker: string,\n operation: Operation,\n): Runtime {\n const parsed = composeEnvironmentSchema.safeParse(plan.environment);\n if (\n !parsed.success ||\n release.environment !== plan.environmentName ||\n release.projection.kind !== \"compose\" ||\n release.artifact.kind !== \"oci-set\"\n ) {\n throw rolloutError(\"release_invalid\", operation, \"none\", false, parsed.error);\n }\n const declared = parsed.data.rollout;\n const policy = \"strategy\" in declared ? undefined : declared.workloads[selection.workload];\n const published = release.artifact.workloads.find(\n (workload) => workload.workload === selection.workload,\n );\n if (\n !policy ||\n policy.strategy !== \"recreate\" ||\n selection.policy.strategy !== \"recreate\" ||\n !published\n ) {\n throw rolloutError(\"plan_invalid\", operation, \"none\", false);\n }\n const releasePath = `releases/${release.releaseId}`;\n const files = [\n ...release.projection.files.map((file) => `${releasePath}/${file}`),\n `${releasePath}/${release.projection.images}`,\n ];\n const composeArgs = [\n \"compose\",\n \"--ansi\",\n \"never\",\n \"--project-name\",\n `${plan.config.name}-${plan.environmentName}`,\n ...files.flatMap((file) => [\"--file\", file]),\n ];\n const project = `${plan.config.name}-${plan.environmentName}`;\n commandSchema.parse({ executable: docker, args: composeArgs });\n return Object.freeze({\n executable: docker,\n environment: parsed.data,\n project,\n releasePath,\n composeArgs: Object.freeze(composeArgs),\n images: Object.freeze({ [selection.workload]: published.reference }),\n workloads: Object.freeze([selection.workload]),\n });\n}\n\nfunction workloadsFor(\n environment: Environment,\n artifact: Artifact,\n operation: Operation,\n): readonly string[] {\n if (\n artifact.kind !== \"oci\" ||\n !(\"strategy\" in environment.rollout) ||\n environment.rollout.strategy !== \"recreate\"\n ) {\n throw rolloutError(\"plan_invalid\", operation, \"none\", false);\n }\n return [\"app\"];\n}\n\nfunction imagesFor(artifact: Artifact): Record<string, string> {\n return artifact.kind === \"oci\"\n ? { app: artifact.reference }\n : Object.fromEntries(\n artifact.workloads.map((workload) => [workload.workload, workload.reference]),\n );\n}\n\nfunction command(runtime: Runtime, args: readonly string[]): Command {\n return commandSchema.parse({\n executable: runtime.executable,\n args: [...runtime.composeArgs, ...args],\n });\n}\n\nasync function assertPointers(\n session: Session,\n plan: Plan,\n current: ReleaseIdentity,\n previous: ReleaseIdentity | undefined,\n operation: Operation,\n): Promise<void> {\n const [observedCurrent, observedPrevious] = await Promise.all([\n observePointer(session, plan, \"current\", operation),\n observePointer(session, plan, \"previous\", operation),\n ]);\n if (observedCurrent !== current || observedPrevious !== previous) {\n throw rolloutError(\"pointer_invalid\", operation, \"none\", false);\n }\n}\n\nasync function assertCurrent(\n session: Session,\n plan: Plan,\n expected: ReleaseIdentity,\n operation: Operation,\n): Promise<void> {\n if ((await observePointer(session, plan, \"current\", operation)) !== expected) {\n throw rolloutError(\"pointer_invalid\", operation, \"none\", false);\n }\n}\n\nasync function observePointer(\n session: Session,\n plan: Plan,\n pointer: \"current\" | \"previous\",\n operation: Operation,\n): Promise<ReleaseIdentity | undefined> {\n let target: string | null;\n try {\n target = await session.observeLink(pointer);\n } catch (error) {\n throw rolloutError(\"pointer_invalid\", operation, effectOf(error), retryableOf(error), error);\n }\n if (target === null) return undefined;\n\n const environment = composeEnvironmentSchema.parse(plan.environment);\n const prefix = target.startsWith(\"/\") ? `${environment.root}/releases/` : \"releases/\";\n if (!target.startsWith(prefix)) {\n throw rolloutError(\"pointer_invalid\", operation, \"none\", false);\n }\n const parsed = releaseIdentitySchema.safeParse(target.slice(prefix.length));\n if (!parsed.success || target !== `${prefix}${parsed.data}`) {\n throw rolloutError(\"pointer_invalid\", operation, \"none\", false, parsed.error);\n }\n return parsed.data;\n}\n\nasync function recoveryFailure(\n session: Session,\n plan: Plan,\n error: unknown,\n): Promise<RecoveryOutcome> {\n const source = error instanceof RolloutError ? error.failure : failure(\"unknown\", false, error);\n let observedRelease: ReleaseIdentity | undefined;\n try {\n observedRelease = await observePointer(session, plan, \"current\", \"recover\");\n } catch {\n return unknownRecovery(source.message, source.retryable);\n }\n\n if (source.effect === \"none\") {\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"failed\",\n effect: \"none\",\n failure: failure(\"none\", source.retryable, error),\n });\n }\n if (source.effect === \"acknowledged\" && observedRelease) {\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"failed\",\n effect: \"acknowledged\",\n observedRelease,\n failure: failure(\"acknowledged\", source.retryable, error),\n });\n }\n return unknownRecovery(source.message, false, observedRelease);\n}\n\nfunction unknownRecovery(\n message: string,\n retryable: boolean,\n observedRelease?: ReleaseIdentity,\n): RecoveryOutcome {\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"unknown\",\n effect: \"unknown\",\n ...(observedRelease ? { observedRelease } : {}),\n failure: failureSchema.parse({\n category: \"rollback\",\n phase: \"rollback-pending\",\n retryable,\n effect: \"unknown\",\n message,\n }),\n });\n}\n\nfunction failure(effect: Failure[\"effect\"], retryable: boolean, error: unknown): Failure {\n const message = error instanceof RolloutError ? error.code : \"recovery_failed\";\n return failureSchema.parse({\n category: \"rollback\",\n phase: \"rollback-pending\",\n retryable,\n effect,\n message,\n });\n}\n\nfunction rolloutError(\n code: ErrorCode,\n operation: Operation,\n effect: Failure[\"effect\"],\n retryable: boolean,\n cause?: unknown,\n): RolloutError {\n const category =\n operation === \"recover\" ? \"rollback\" : operation === \"verify\" ? \"health\" : \"activation\";\n const phase =\n operation === \"recover\"\n ? \"rollback-pending\"\n : operation === \"verify\"\n ? \"activated\"\n : \"activation-prepared\";\n return new RolloutError(\n code,\n operation,\n failureSchema.parse({ category, phase, retryable, effect, message: code }),\n cause === undefined ? undefined : { cause },\n );\n}\n\nfunction parseContext<Context>(\n schema: z.ZodType<Context>,\n input: unknown,\n operation: Operation,\n): Context {\n const parsed = schema.safeParse(input);\n if (!parsed.success) {\n throw rolloutError(\"context_invalid\", operation, \"none\", false, parsed.error);\n }\n return parsed.data;\n}\n\nfunction parseStaged(input: unknown, operation: Operation): StagedRelease {\n const parsed = stagedReleaseSchema.safeParse(input);\n if (!parsed.success) {\n throw rolloutError(\"release_invalid\", operation, \"none\", false, parsed.error);\n }\n return parsed.data;\n}\n\nfunction assertPlannedRelease(\n plan: ReleasePlan,\n release: StagedRelease,\n operation: Operation,\n): void {\n if (release.revision === plan.revision && release.artifact.revision === plan.revision) return;\n throw rolloutError(\"release_invalid\", operation, \"none\", false);\n}\n\nfunction parseSelection(input: unknown, operation: Operation): WorkloadSelection {\n const parsed = workloadSelectionSchema.safeParse(input);\n if (!parsed.success || parsed.data.policy.strategy !== \"recreate\") {\n throw rolloutError(\"plan_invalid\", operation, \"none\", false, parsed.error);\n }\n return parsed.data;\n}\n\nfunction normalizeWorkloadFailure(error: unknown, operation: \"activate\" | \"recover\"): Failure {\n if (error instanceof RolloutError) {\n return failureSchema.parse({\n ...error.failure,\n category: operation === \"recover\" ? \"rollback\" : \"activation\",\n phase: operation === \"recover\" ? \"rollback-pending\" : \"activation-prepared\",\n });\n }\n return failureSchema.parse({\n category: operation === \"recover\" ? \"rollback\" : \"activation\",\n phase: operation === \"recover\" ? \"rollback-pending\" : \"activation-prepared\",\n retryable: false,\n effect: effectOf(error),\n message: operation === \"recover\" ? \"workload_recovery_failed\" : \"workload_activation_failed\",\n });\n}\n\nfunction toStaged(release: ObservedRelease): StagedRelease {\n const { health: _health, migrationLedger: _migrationLedger, ...record } = release;\n return stagedReleaseSchema.parse(record);\n}\n\nfunction effectOf(error: unknown): Failure[\"effect\"] {\n if (error instanceof RolloutError) return error.failure.effect;\n if (error instanceof TransportError) return error.effect;\n return \"unknown\";\n}\n\nfunction retryableOf(error: unknown): boolean {\n if (error instanceof RolloutError) return error.failure.retryable;\n return error instanceof TransportError && error.retryable;\n}\n\nfunction assertActive(signal: AbortSignal | undefined, operation: Operation): void {\n if (signal?.aborted) throw rolloutError(\"cancelled\", operation, \"none\", false);\n}\n","import { z } from \"zod\";\n\nimport { composeEnvironmentSchema } from \"../config.js\";\nimport type { Plan, ReleasePlan } from \"../plan.js\";\nimport { failureSchema, type Failure } from \"../receipt.js\";\nimport {\n activatedReleaseSchema,\n activateContextSchema,\n containerStrategySchema,\n healthResultSchema,\n recoverContextSchema,\n recoveryOutcomeSchema,\n verifyContextSchema,\n workloadActivationOutcomeSchema,\n workloadHealthResultSchema,\n workloadRecoveryOutcomeSchema,\n workloadSelectionSchema,\n type ActivateContext,\n type ActivatedRelease,\n type ContainerStrategy,\n type HealthResult,\n type RecoverContext,\n type RecoveryOutcome,\n type RolloutAdapter,\n type VerifyContext,\n type WorkloadRolloutAdapter,\n type WorkloadSelection,\n} from \"../rollout.js\";\nimport {\n observedReleaseSchema,\n releaseIdentitySchema,\n stagedReleaseSchema,\n type ObservedRelease,\n type ReleaseIdentity,\n type StagedRelease,\n} from \"../target.js\";\nimport type { Session } from \"../transport/ssh.js\";\n\ntype Operation = \"activate\" | \"recover\" | \"verify\";\ntype Environment = z.infer<typeof composeEnvironmentSchema>;\ntype Step = Readonly<{\n selection: WorkloadSelection;\n adapter: WorkloadRolloutAdapter;\n}>;\ntype StackRelease = StagedRelease & {\n readonly artifact: Extract<StagedRelease[\"artifact\"], { readonly kind: \"oci-set\" }>;\n readonly projection: Extract<StagedRelease[\"projection\"], { readonly kind: \"compose\" }>;\n};\n\nexport type ErrorCode =\n | \"adapter_duplicate\"\n | \"adapter_missing\"\n | \"effect_failed\"\n | \"effect_partial\"\n | \"effect_unknown\"\n | \"health_invalid\"\n | \"plan_invalid\"\n | \"pointer_invalid\"\n | \"release_invalid\";\n\nexport interface Options {\n readonly session: Session;\n readonly adapters: readonly WorkloadRolloutAdapter[];\n}\n\n/** 组合错误只公开稳定失败合同,具体工作负载命令保留在叶子适配器内部。 */\nexport class RolloutError extends Error {\n constructor(\n readonly code: ErrorCode,\n readonly failure: Failure,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"StackRolloutError\";\n }\n}\n\n/** Stack 组合器按工作负载确定性编排叶子策略,并且只提交一次 release 级指针。 */\nexport function createRollout(options: Options): RolloutAdapter {\n const adapters = createAdapters(options.adapters);\n const rollout: RolloutAdapter = {\n id: \"stack\",\n activate: (plan, release, context) =>\n activate(options.session, adapters, plan, release, context),\n verify: (plan, release, context) => verify(options.session, adapters, plan, release, context),\n recover: (plan, candidate, context) =>\n recover(options.session, adapters, plan, candidate, context),\n };\n return Object.freeze(rollout);\n}\n\nasync function activate(\n session: Session,\n adapters: ReadonlyMap<ContainerStrategy, WorkloadRolloutAdapter>,\n plan: ReleasePlan,\n rawRelease: StagedRelease,\n rawContext: ActivateContext,\n): Promise<ActivatedRelease> {\n const context = activateContextSchema.parse(rawContext);\n const release = plannedRelease(plan, rawRelease);\n const selections = selectionsOf(plan, release, \"activate\");\n const steps = stepsOf(adapters, selections, \"activate\");\n const before = await observePointer(session, plan, \"current\", \"activate\");\n const previousBefore = await observePointer(session, plan, \"previous\", \"activate\");\n if (before !== release.previous?.releaseId) {\n throw error(\"pointer_invalid\", \"activate\", \"none\", \"Staged predecessor is not active\");\n }\n const completed: Step[] = [];\n\n for (const step of steps) {\n const { adapter, selection } = step;\n let result;\n try {\n result = workloadActivationOutcomeSchema.parse(\n await adapter.activate(plan, release, selection, context),\n );\n assertWorkloadResult(result, selection, release.releaseId, \"activate\");\n } catch (cause) {\n await compensate(plan, release.previous, completed, context);\n throw error(\n \"effect_unknown\",\n \"activate\",\n \"unknown\",\n \"Workload activation ended without a typed effect\",\n cause,\n );\n }\n if (result.status === \"succeeded\") {\n completed.push(step);\n continue;\n }\n const compensationEffect = await compensate(plan, release.previous, completed, context);\n const effect =\n result.effect === \"unknown\" || compensationEffect === \"unknown\"\n ? \"unknown\"\n : completed.length > 0\n ? \"acknowledged\"\n : result.effect;\n throw error(\n effect === \"unknown\"\n ? \"effect_unknown\"\n : effect === \"acknowledged\"\n ? \"effect_partial\"\n : \"effect_failed\",\n \"activate\",\n effect,\n \"Stack activation did not complete every workload\",\n );\n }\n\n await commitPointers(\n session,\n plan,\n release.releaseId,\n before,\n previousBefore,\n \"activate\",\n completed.length > 0 ? \"acknowledged\" : \"none\",\n );\n return activatedReleaseSchema.parse({ ...release, activatedAt: context.activatedAt });\n}\n\nasync function verify(\n session: Session,\n adapters: ReadonlyMap<ContainerStrategy, WorkloadRolloutAdapter>,\n plan: Plan,\n rawRelease: ObservedRelease,\n rawContext: VerifyContext,\n): Promise<HealthResult> {\n const context = verifyContextSchema.parse(rawContext);\n const observed = observedReleaseSchema.parse(rawRelease);\n const release = stagedOf(plan, toStaged(observed), \"verify\");\n const selections = selectionsOf(plan, release, \"verify\");\n const steps = stepsOf(adapters, selections, \"verify\");\n if ((await observePointer(session, plan, \"current\", \"verify\")) !== release.releaseId) {\n return unknownHealth(release.releaseId, context);\n }\n\n const results = [];\n for (const { adapter, selection } of steps) {\n let result;\n try {\n result = workloadHealthResultSchema.parse(\n await adapter.verify(plan, observed, selection, context),\n );\n } catch (cause) {\n throw error(\n \"health_invalid\",\n \"verify\",\n \"none\",\n \"Workload verification did not return valid evidence\",\n cause,\n );\n }\n assertWorkloadResult(result, selection, release.releaseId, \"verify\");\n if (result.checkedAt !== context.checkedAt) {\n throw error(\n \"health_invalid\",\n \"verify\",\n \"none\",\n \"Workload health evidence has a mismatched observation time\",\n );\n }\n results.push(result);\n }\n\n if ((await observePointer(session, plan, \"current\", \"verify\")) !== release.releaseId) {\n return unknownHealth(release.releaseId, context);\n }\n const attempts = Math.max(...results.map((result) => result.attempts));\n if (results.some((result) => result.status === \"unknown\")) {\n return healthResultSchema.parse({\n schemaVersion: 1,\n releaseId: release.releaseId,\n status: \"unknown\",\n attempts,\n checkedAt: context.checkedAt,\n });\n }\n if (results.some((result) => result.status === \"unhealthy\")) {\n return healthResultSchema.parse({\n schemaVersion: 1,\n releaseId: release.releaseId,\n status: \"unhealthy\",\n attempts,\n checkedAt: context.checkedAt,\n });\n }\n const environment = composeEnvironmentSchema.parse(plan.environment);\n return healthResultSchema.parse({\n schemaVersion: 1,\n releaseId: release.releaseId,\n status: \"healthy\",\n attempts,\n observedStatus: environment.health.expectedStatus,\n checkedAt: context.checkedAt,\n });\n}\n\nasync function compensate(\n plan: ReleasePlan,\n candidate: ObservedRelease | undefined,\n completed: readonly Step[],\n context: ActivateContext,\n): Promise<\"acknowledged\" | \"unknown\"> {\n if (completed.length === 0 || !candidate) return \"acknowledged\";\n const recoveryContext = recoverContextSchema.parse({\n attemptId: context.attemptId,\n recoveredAt: context.activatedAt,\n ...(context.signal === undefined ? {} : { signal: context.signal }),\n });\n\n for (const { adapter, selection } of [...completed].reverse()) {\n let result;\n try {\n result = workloadRecoveryOutcomeSchema.parse(\n await adapter.recover(plan, candidate, selection, recoveryContext),\n );\n assertWorkloadResult(result, selection, candidate.releaseId, \"recover\");\n } catch {\n return \"unknown\";\n }\n if (result.status === \"unknown\") return \"unknown\";\n if (result.status === \"failed\") return \"acknowledged\";\n }\n return \"acknowledged\";\n}\n\nasync function recover(\n session: Session,\n adapters: ReadonlyMap<ContainerStrategy, WorkloadRolloutAdapter>,\n plan: Plan,\n rawCandidate: ObservedRelease,\n rawContext: RecoverContext,\n): Promise<RecoveryOutcome> {\n const context = recoverContextSchema.parse(rawContext);\n const candidate = observedReleaseSchema.parse(rawCandidate);\n const release = stagedOf(plan, toStaged(candidate), \"recover\");\n const selections = selectionsOf(plan, release, \"recover\");\n const steps = stepsOf(adapters, selections, \"recover\");\n const before = await observePointer(session, plan, \"current\", \"recover\");\n const previousBefore = await observePointer(session, plan, \"previous\", \"recover\");\n if (!before || (before !== candidate.releaseId && previousBefore !== candidate.releaseId)) {\n return failedRecovery(\"none\", undefined, \"Recovery candidate is not active or previous\");\n }\n let acknowledged = false;\n\n for (const { adapter, selection } of [...steps].reverse()) {\n let result;\n try {\n result = workloadRecoveryOutcomeSchema.parse(\n await adapter.recover(plan, candidate, selection, context),\n );\n } catch {\n return unknownRecovery(before);\n }\n try {\n assertWorkloadResult(result, selection, candidate.releaseId, \"recover\");\n } catch {\n return unknownRecovery(before);\n }\n if (result.status === \"recovered\") {\n acknowledged = true;\n continue;\n }\n if (result.effect === \"unknown\") return unknownRecovery(before);\n const effect = acknowledged ? \"acknowledged\" : result.effect;\n return failedRecovery(\n effect,\n effect === \"acknowledged\" ? before : undefined,\n \"Stack recovery did not restore every workload\",\n );\n }\n\n if (before !== candidate.releaseId) {\n try {\n await commitPointers(\n session,\n plan,\n candidate.releaseId,\n before,\n previousBefore,\n \"recover\",\n acknowledged ? \"acknowledged\" : \"none\",\n );\n } catch (cause) {\n const failure = cause instanceof RolloutError ? cause.failure : undefined;\n if (failure?.effect === \"acknowledged\" && before) {\n return failedRecovery(\"acknowledged\", before, \"Recovery pointer commit failed\");\n }\n return unknownRecovery(before);\n }\n }\n\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"recovered\",\n effect: \"acknowledged\",\n release: activatedReleaseSchema.parse({ ...release, activatedAt: context.recoveredAt }),\n });\n}\n\nfunction createAdapters(\n values: readonly WorkloadRolloutAdapter[],\n): ReadonlyMap<ContainerStrategy, WorkloadRolloutAdapter> {\n const adapters = new Map<ContainerStrategy, WorkloadRolloutAdapter>();\n for (const adapter of values) {\n const id = containerStrategySchema.safeParse(adapter.id);\n if (!id.success || adapters.has(id.data)) {\n throw error(\n \"adapter_duplicate\",\n \"activate\",\n \"none\",\n \"Workload rollout adapter is registered more than once\",\n );\n }\n adapters.set(id.data, adapter);\n }\n return adapters;\n}\n\nfunction stepsOf(\n adapters: ReadonlyMap<ContainerStrategy, WorkloadRolloutAdapter>,\n selections: readonly WorkloadSelection[],\n operation: Operation,\n): readonly Step[] {\n return Object.freeze(\n selections.map((selection) => ({\n selection,\n adapter: adapterOf(adapters, selection, operation),\n })),\n );\n}\n\nfunction adapterOf(\n adapters: ReadonlyMap<ContainerStrategy, WorkloadRolloutAdapter>,\n selection: WorkloadSelection,\n operation: Operation,\n): WorkloadRolloutAdapter {\n const adapter = adapters.get(selection.policy.strategy);\n if (!adapter || adapter.id !== selection.policy.strategy) {\n throw error(\n \"adapter_missing\",\n operation,\n \"none\",\n \"Selected workload rollout adapter is not registered\",\n );\n }\n return adapter;\n}\n\nfunction stagedOf(plan: Plan, input: StagedRelease, operation: Operation): StackRelease {\n const release = stagedReleaseSchema.safeParse(input);\n const environment = composeEnvironmentSchema.safeParse(plan.environment);\n if (\n !release.success ||\n !environment.success ||\n plan.config.profile !== \"compose-stack\" ||\n release.data.environment !== plan.environmentName ||\n release.data.artifact.kind !== \"oci-set\" ||\n release.data.projection.kind !== \"compose\"\n ) {\n throw error(\n \"release_invalid\",\n operation,\n \"none\",\n \"Stack release does not match the selected execution plan\",\n release.success ? undefined : release.error,\n );\n }\n return release.data as StackRelease;\n}\n\nfunction plannedRelease(plan: ReleasePlan, input: StagedRelease): StackRelease {\n const release = stagedOf(plan, input, \"activate\");\n if (release.revision === plan.revision && release.artifact.revision === plan.revision) {\n return release;\n }\n throw error(\n \"release_invalid\",\n \"activate\",\n \"none\",\n \"Stack release revision does not match the selected release plan\",\n );\n}\n\nfunction selectionsOf(\n plan: Plan,\n release: StackRelease,\n operation: Operation,\n): readonly WorkloadSelection[] {\n const environment = composeEnvironmentSchema.parse(plan.environment);\n if (\"strategy\" in environment.rollout) {\n throw error(\"plan_invalid\", operation, \"none\", \"Stack rollout map is not configured\");\n }\n const rollout = environment.rollout;\n const published = release.artifact.workloads.map((item) => item.workload);\n const configured = Object.keys(rollout.workloads).sort();\n if (\n published.length !== configured.length ||\n published.some((workload, index) => workload !== configured[index])\n ) {\n throw error(\n \"release_invalid\",\n operation,\n \"none\",\n \"Published and configured workload sets must match exactly\",\n );\n }\n return Object.freeze(\n configured.map((workload) =>\n workloadSelectionSchema.parse({\n workload,\n policy: rollout.workloads[workload],\n }),\n ),\n );\n}\n\nfunction assertWorkloadResult(\n result: { readonly workload: string; readonly releaseId: string },\n selection: WorkloadSelection,\n releaseId: ReleaseIdentity,\n operation: Operation,\n): void {\n if (result.workload === selection.workload && result.releaseId === releaseId) return;\n throw error(\n operation === \"verify\" ? \"health_invalid\" : \"effect_unknown\",\n operation,\n operation === \"verify\" ? \"none\" : \"unknown\",\n \"Workload result does not match the requested workload and release\",\n );\n}\n\nasync function commitPointers(\n session: Session,\n plan: Plan,\n current: ReleaseIdentity,\n previous: ReleaseIdentity | undefined,\n previousBefore: ReleaseIdentity | undefined,\n operation: \"activate\" | \"recover\",\n priorEffect: Failure[\"effect\"],\n): Promise<void> {\n try {\n if (previous) {\n await session.swapLink({ link: \"previous\", target: `releases/${previous}` });\n } else if (previousBefore) {\n throw error(\n \"pointer_invalid\",\n operation,\n priorEffect,\n \"First activation cannot inherit a previous release pointer\",\n );\n }\n await session.swapLink({ link: \"current\", target: `releases/${current}` });\n const [observedCurrent, observedPrevious] = await Promise.all([\n observePointer(session, plan, \"current\", operation),\n observePointer(session, plan, \"previous\", operation),\n ]);\n if (observedCurrent !== current || observedPrevious !== previous) {\n throw error(\n \"pointer_invalid\",\n operation,\n \"unknown\",\n \"Release pointers do not match the acknowledged workload set\",\n );\n }\n } catch (cause) {\n const observed = await safeObservePointers(session, plan, operation);\n if (observed.known && observed.current === current && observed.previous === previous) return;\n const effect = !observed.known\n ? \"unknown\"\n : priorEffect === \"none\" && observed.current !== current\n ? \"none\"\n : \"acknowledged\";\n throw error(\"pointer_invalid\", operation, effect, \"Release pointer commit failed\", cause);\n }\n}\n\nasync function observePointer(\n session: Session,\n plan: Plan,\n pointer: \"current\" | \"previous\",\n operation: Operation,\n): Promise<ReleaseIdentity | undefined> {\n let target: string | null;\n try {\n target = await session.observeLink(pointer);\n } catch (cause) {\n throw error(\"pointer_invalid\", operation, \"none\", \"Release pointer observation failed\", cause);\n }\n if (target === null) return undefined;\n const environment = composeEnvironmentSchema.parse(plan.environment);\n const prefix = target.startsWith(\"/\") ? `${environment.root}/releases/` : \"releases/\";\n const parsed = target.startsWith(prefix)\n ? releaseIdentitySchema.safeParse(target.slice(prefix.length))\n : undefined;\n if (!parsed?.success || target !== `${prefix}${parsed.data}`) {\n throw error(\"pointer_invalid\", operation, \"none\", \"Release pointer is invalid\");\n }\n return parsed.data;\n}\n\nasync function safeObservePointers(\n session: Session,\n plan: Plan,\n operation: Operation,\n): Promise<\n | Readonly<{\n known: true;\n current: ReleaseIdentity | undefined;\n previous: ReleaseIdentity | undefined;\n }>\n | Readonly<{ known: false }>\n> {\n try {\n const [current, previous] = await Promise.all([\n observePointer(session, plan, \"current\", operation),\n observePointer(session, plan, \"previous\", operation),\n ]);\n return Object.freeze({ known: true, current, previous });\n } catch {\n return Object.freeze({ known: false });\n }\n}\n\nfunction toStaged(release: ObservedRelease): StagedRelease {\n const { health: _health, migrationLedger: _migrationLedger, ...record } = release;\n return stagedReleaseSchema.parse(record);\n}\n\nfunction unknownHealth(releaseId: ReleaseIdentity, context: VerifyContext): HealthResult {\n return healthResultSchema.parse({\n schemaVersion: 1,\n releaseId,\n status: \"unknown\",\n attempts: 1,\n checkedAt: context.checkedAt,\n });\n}\n\nfunction failedRecovery(\n effect: \"none\" | \"acknowledged\",\n observedRelease: ReleaseIdentity | undefined,\n message: string,\n): RecoveryOutcome {\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"failed\",\n effect,\n ...(observedRelease === undefined ? {} : { observedRelease }),\n failure: failure(\"recover\", effect, message),\n });\n}\n\nfunction unknownRecovery(observedRelease?: ReleaseIdentity): RecoveryOutcome {\n return recoveryOutcomeSchema.parse({\n schemaVersion: 1,\n status: \"unknown\",\n effect: \"unknown\",\n ...(observedRelease === undefined ? {} : { observedRelease }),\n failure: failure(\"recover\", \"unknown\", \"Stack recovery effect requires reconciliation\"),\n });\n}\n\nfunction error(\n code: ErrorCode,\n operation: Operation,\n effect: Failure[\"effect\"],\n message: string,\n cause?: unknown,\n): RolloutError {\n return new RolloutError(\n code,\n failure(operation, effect, message),\n cause === undefined ? undefined : { cause },\n );\n}\n\nfunction failure(operation: Operation, effect: Failure[\"effect\"], message: string): Failure {\n return failureSchema.parse({\n category:\n operation === \"recover\" ? \"rollback\" : operation === \"verify\" ? \"health\" : \"activation\",\n phase:\n operation === \"recover\"\n ? \"rollback-pending\"\n : operation === \"verify\"\n ? \"activated\"\n : \"activation-prepared\",\n retryable: false,\n effect,\n message,\n });\n}\n","import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { lstat, realpath, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { DEFAULT_RELEASE_RETENTION, portBindingsSchema, type PortBinding } from \"../config.js\";\nimport { assertArtifact, type Plan, type ReleasePlan } from \"../plan.js\";\nimport {\n publishedArtifactSchema,\n type Failure,\n type PublishedArtifact,\n type PublishedImageArtifact,\n type PublishedStackArtifact,\n} from \"../receipt.js\";\nimport {\n composeProjectionSchema,\n createReleaseIdentity,\n observedReleaseSchema,\n releaseIdentitySchema,\n releaseRecordSchema,\n retainContextSchema,\n retentionResultSchema,\n stageContextSchema,\n stagedReleaseSchema,\n targetObservationSchema,\n targetContextSchema,\n type ComposeProjection,\n type ObserveContext,\n type ObservedRelease,\n type ReleaseIdentity,\n type ReleaseRecord,\n type RetainContext,\n type RetentionResult,\n type StageContext,\n type StagedRelease,\n type TargetAdapter,\n type TargetObservation,\n} from \"../target.js\";\nimport { TransportError, type Scope, type Session } from \"../transport/ssh.js\";\n\nconst MAX_DOCUMENT_BYTES = 2 * 1024 * 1024;\nconst PARTIAL_SUFFIX = \".partial\";\nconst PORTS_PROJECTION = \"compose/ports.yaml\";\nconst DOCKER_CONFIG_DIRECTORY = \"state/docker\";\n\ntype ComposeArtifact = PublishedImageArtifact | PublishedStackArtifact;\ntype Environment = Extract<Plan[\"environment\"], { readonly target: \"compose-host\" }>;\n\ninterface SourceFile {\n readonly source: string;\n readonly destination: string;\n readonly identity: string;\n}\n\nexport type ErrorCode =\n | \"artifact_invalid\"\n | \"cancelled\"\n | \"context_invalid\"\n | \"plan_invalid\"\n | \"pointer_invalid\"\n | \"projection_invalid\"\n | \"release_conflict\"\n | \"release_invalid\"\n | \"source_invalid\"\n | \"stage_cleanup_failed\"\n | \"stage_effect_unknown\";\n\n/** 目标错误仅公开稳定分类和效应确定性,不携带远端路径或文件内容。 */\nexport class TargetError extends Error {\n constructor(\n readonly code: ErrorCode,\n readonly effect: Failure[\"effect\"],\n readonly retryable: boolean,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"ComposeHostTargetError\";\n }\n}\n\n/** Compose 主机目标只消费协调器持有的锁定会话,不获取第二把远端锁。 */\nexport function createTarget(session: Session): TargetAdapter {\n const target: TargetAdapter = {\n id: \"compose-host\",\n observe: (plan, context) => observe(plan, session, context),\n readRelease: (plan, releaseId, context) => readRelease(plan, session, releaseId, context),\n stage: (plan, artifact, context) => stage(plan, session, artifact, context),\n retain: (plan, context) => retain(plan, session, context),\n };\n return Object.freeze(target);\n}\n\n/** Compose 主机把镜像拉取固定到目标内由拉取凭据所有者维护的 Docker 配置。 */\nexport function createScope(plan: Plan): Scope {\n const environment = composeEnvironment(plan);\n return Object.freeze({\n root: environment.root,\n environment: plan.environmentName,\n dockerConfig: `${environment.root}/${DOCKER_CONFIG_DIRECTORY}`,\n });\n}\n\nasync function observe(\n plan: Plan,\n session: Session,\n rawContext: ObserveContext,\n): Promise<TargetObservation> {\n const context = parseContext(targetContextSchema, rawContext);\n assertActive(context.signal);\n const environment = composeEnvironment(plan);\n const observation = await observeReleases(plan, environment, session);\n return targetObservationSchema.parse(observation);\n}\n\nasync function readRelease(\n plan: Plan,\n session: Session,\n rawReleaseId: unknown,\n rawContext: unknown,\n): Promise<ObservedRelease> {\n const context = parseContext(targetContextSchema, rawContext);\n assertActive(context.signal);\n const environment = composeEnvironment(plan);\n const releaseId = parseReleaseIdentity(rawReleaseId);\n const release = await resolveRelease(plan, environment, session, releaseId);\n assertActive(context.signal);\n return release;\n}\n\nasync function stage(\n plan: ReleasePlan,\n session: Session,\n rawArtifact: PublishedArtifact,\n rawContext: StageContext,\n): Promise<StagedRelease> {\n const context = parseContext(stageContextSchema, rawContext);\n assertActive(context.signal);\n const environment = composeEnvironment(plan);\n const artifact = composeArtifact(plan, environment, rawArtifact);\n const sources = await resolveSources(environment, context.artifactRoot);\n const projection = createProjection(sources, environment.bindings, environment.rollout);\n const releaseId = createReleaseIdentity({ revision: plan.revision, artifact });\n const releasePath = `releases/${releaseId}`;\n const partialPath = `${releasePath}${PARTIAL_SUFFIX}`;\n const record = releaseRecordSchema.parse({\n schemaVersion: 1,\n releaseId,\n environment: plan.environmentName,\n revision: plan.revision,\n artifact,\n projection,\n stagedAt: context.stagedAt,\n });\n const previous = (await observeReleases(plan, environment, session)).current;\n let ownsPartial = false;\n let finalized = false;\n\n try {\n await assertReleaseAbsent(session, releasePath, partialPath);\n ownsPartial = true;\n\n for (const source of sources) {\n const uploaded = await session.upload({\n source: source.source,\n destination: `${partialPath}/${source.destination}`,\n identity: source.identity,\n });\n if (uploaded.identity !== source.identity) {\n throw new TargetError(\"stage_effect_unknown\", \"unknown\", false);\n }\n }\n\n await writeDocument(session, `${partialPath}/${projection.images}`, serializeImages(artifact));\n if (projection.ports && projection.bindings) {\n await writeDocument(\n session,\n `${partialPath}/${projection.ports}`,\n serializePorts(projection.bindings),\n );\n }\n if (projection.slotPorts && projection.slotBindings) {\n await writeDocument(\n session,\n `${partialPath}/${projection.slotPorts.blue}`,\n serializePorts(projection.slotBindings.blue),\n );\n await writeDocument(\n session,\n `${partialPath}/${projection.slotPorts.green}`,\n serializePorts(projection.slotBindings.green),\n );\n }\n await writeDocument(session, `${partialPath}/release.json`, serializeRelease(record));\n await session.rename({ source: partialPath, destination: releasePath, replace: false });\n finalized = true;\n\n const observed = await resolveRelease(plan, environment, session, releaseId);\n return stagedReleaseSchema.parse({ ...observedRecord(observed), previous });\n } catch (error) {\n if (finalized) {\n throw new TargetError(\"stage_effect_unknown\", \"unknown\", false, { cause: error });\n }\n if (!ownsPartial || effectOf(error) === \"unknown\") throw error;\n try {\n await removePartial(session, partialPath);\n } catch (cleanupError) {\n throw new TargetError(\"stage_cleanup_failed\", effectOf(cleanupError), false, {\n cause: new AggregateError([error, cleanupError]),\n });\n }\n throw error;\n }\n}\n\nasync function retain(\n plan: Plan,\n session: Session,\n rawContext: RetainContext,\n): Promise<RetentionResult> {\n const context = parseContext(retainContextSchema, rawContext);\n assertActive(context.signal);\n const environment = composeEnvironment(plan);\n const observation = await observeReleases(plan, environment, session);\n const protectedReleases = new Set<ReleaseIdentity>(context.protectedReleases);\n if (observation.current) protectedReleases.add(observation.current.releaseId);\n if (observation.previous) protectedReleases.add(observation.previous.releaseId);\n const protectedIds = [...protectedReleases].sort();\n\n const releases = await listReleases(plan, environment, session);\n const retained = environment.retention?.releases ?? DEFAULT_RELEASE_RETENTION;\n const unprotected = releases\n .filter((release) => !protectedReleases.has(release.releaseId))\n .sort(compareNewest);\n const candidates = unprotected.slice(retained);\n const removed: ReleaseIdentity[] = [];\n\n for (const candidate of candidates) {\n try {\n await session.remove({ path: `releases/${candidate.releaseId}`, kind: \"directory\" });\n removed.push(candidate.releaseId);\n } catch (error) {\n if (effectOf(error) === \"unknown\") throw error;\n return retentionResultSchema.parse({\n schemaVersion: 1,\n status: \"failed\",\n removed: removed.sort(),\n protected: protectedIds,\n });\n }\n }\n\n return retentionResultSchema.parse({\n schemaVersion: 1,\n status: \"succeeded\",\n removed: removed.sort(),\n protected: protectedIds,\n });\n}\n\nfunction composeEnvironment(plan: Plan): Environment {\n if (plan.environment.target !== \"compose-host\") {\n throw new TargetError(\"plan_invalid\", \"none\", false);\n }\n return plan.environment;\n}\n\nfunction composeArtifact(\n plan: ReleasePlan,\n environment: Environment,\n input: PublishedArtifact,\n): ComposeArtifact {\n const parsed = publishedArtifactSchema.safeParse(input);\n if (!parsed.success || parsed.data.kind === \"directory\") {\n throw new TargetError(\"artifact_invalid\", \"none\", false, {\n cause: parsed.success ? undefined : parsed.error,\n });\n }\n try {\n assertArtifact(plan, parsed.data);\n } catch (error) {\n throw new TargetError(\"artifact_invalid\", \"none\", false, { cause: error });\n }\n\n const rollout = environment.rollout;\n if (parsed.data.kind === \"oci\") {\n if (!(\"strategy\" in rollout)) {\n throw new TargetError(\"artifact_invalid\", \"none\", false);\n }\n assertBindingServices(environment.bindings, [\"app\"]);\n return parsed.data;\n }\n if (\"strategy\" in rollout) {\n throw new TargetError(\"artifact_invalid\", \"none\", false);\n }\n\n const declared = Object.keys(rollout.workloads).sort();\n const published = parsed.data.workloads.map((workload) => workload.workload);\n if (\n declared.length !== published.length ||\n declared.some((name, index) => name !== published[index])\n ) {\n throw new TargetError(\"artifact_invalid\", \"none\", false);\n }\n assertBindingServices(environment.bindings, published);\n return parsed.data;\n}\n\nfunction createProjection(\n sources: readonly SourceFile[],\n input: readonly PortBinding[] | undefined,\n rollout: Environment[\"rollout\"],\n): ComposeProjection {\n const bindings = input ? canonicalBindings(input) : undefined;\n const slotBindings = slotPortBindings(rollout);\n if (slotBindings) {\n return composeProjectionSchema.parse({\n kind: \"compose\",\n files: [\n ...sources.map((source) => source.destination),\n \"compose/ports-blue.yaml\",\n \"compose/ports-green.yaml\",\n ],\n images: \"compose/images.json\",\n slotPorts: {\n blue: \"compose/ports-blue.yaml\",\n green: \"compose/ports-green.yaml\",\n },\n slotBindings,\n });\n }\n return composeProjectionSchema.parse({\n kind: \"compose\",\n files: [\n ...sources.map((source) => source.destination),\n ...(bindings ? [PORTS_PROJECTION] : []),\n ],\n images: \"compose/images.json\",\n ...(bindings ? { ports: PORTS_PROJECTION, bindings } : {}),\n });\n}\n\nfunction slotPortBindings(\n rollout: Environment[\"rollout\"],\n): { readonly blue: readonly PortBinding[]; readonly green: readonly PortBinding[] } | undefined {\n if (\"strategy\" in rollout) {\n return rollout.strategy === \"blue-green\" && rollout.ports ? rollout.ports : undefined;\n }\n const blue: PortBinding[] = [];\n const green: PortBinding[] = [];\n for (const workload of Object.values(rollout.workloads)) {\n if (workload.strategy !== \"blue-green\" || !workload.ports) continue;\n blue.push(...workload.ports.blue);\n green.push(...workload.ports.green);\n }\n return blue.length > 0 && green.length > 0 ? { blue, green } : undefined;\n}\n\nasync function resolveSources(\n environment: Environment,\n artifactRoot: string,\n): Promise<readonly SourceFile[]> {\n let root: string;\n try {\n root = await realpath(artifactRoot);\n if (!(await stat(root)).isDirectory()) throw new Error();\n } catch (error) {\n throw new TargetError(\"source_invalid\", \"none\", false, { cause: error });\n }\n\n const seen = new Set<string>();\n const sources: SourceFile[] = [];\n for (let index = 0; index < environment.compose.length; index += 1) {\n const configured = environment.compose[index];\n if (!configured) throw new TargetError(\"source_invalid\", \"none\", false);\n const requested = path.resolve(root, configured);\n let source: string;\n try {\n const info = await lstat(requested);\n if (!info.isFile() || info.isSymbolicLink()) throw new Error();\n source = await realpath(requested);\n if (!isInside(root, source) || seen.has(source)) throw new Error();\n } catch (error) {\n throw new TargetError(\"source_invalid\", \"none\", false, { cause: error });\n }\n seen.add(source);\n sources.push(\n Object.freeze({\n source,\n destination: `compose/${String(index).padStart(3, \"0\")}.yaml`,\n identity: await digestFile(source),\n }),\n );\n }\n return Object.freeze(sources);\n}\n\nasync function observeReleases(\n plan: Plan,\n environment: Environment,\n session: Session,\n): Promise<TargetObservation> {\n const [currentId, previousId] = await Promise.all([\n observePointer(plan, session, \"current\"),\n observePointer(plan, session, \"previous\"),\n ]);\n const [current, previous] = await Promise.all([\n currentId ? resolveRelease(plan, environment, session, currentId) : undefined,\n previousId ? resolveRelease(plan, environment, session, previousId) : undefined,\n ]);\n return targetObservationSchema.parse({ schemaVersion: 1, current, previous });\n}\n\nasync function observePointer(\n plan: Plan,\n session: Session,\n pointer: \"current\" | \"previous\",\n): Promise<ReleaseIdentity | undefined> {\n const target = await session.observeLink(pointer);\n if (target === null) return undefined;\n const root = composeEnvironment(plan).root;\n const prefix = target.startsWith(\"/\") ? `${root}/releases/` : \"releases/\";\n if (!target.startsWith(prefix)) {\n throw new TargetError(\"pointer_invalid\", \"none\", false);\n }\n const releaseId = target.slice(prefix.length);\n const parsed = releaseIdentitySchema.safeParse(releaseId);\n if (!parsed.success || target !== `${prefix}${parsed.data}`) {\n throw new TargetError(\"pointer_invalid\", \"none\", false, { cause: parsed.error });\n }\n return parsed.data;\n}\n\nasync function resolveRelease(\n plan: Plan,\n environment: Environment,\n session: Session,\n releaseId: ReleaseIdentity,\n): Promise<ObservedRelease> {\n const pathPrefix = `releases/${releaseId}`;\n const document = await session.read(`${pathPrefix}/release.json`, MAX_DOCUMENT_BYTES);\n if (!document) throw new TargetError(\"release_invalid\", \"none\", false);\n\n let input: unknown;\n try {\n input = JSON.parse(document.content) as unknown;\n } catch (error) {\n throw new TargetError(\"release_invalid\", \"none\", false, { cause: error });\n }\n const parsed = releaseRecordSchema.safeParse(input);\n if (\n !parsed.success ||\n parsed.data.releaseId !== releaseId ||\n parsed.data.environment !== plan.environmentName ||\n parsed.data.artifact.profile !== plan.config.profile ||\n parsed.data.projection.kind !== \"compose\" ||\n document.content !== serializeRelease(parsed.data)\n ) {\n throw new TargetError(\"release_invalid\", \"none\", false, {\n cause: parsed.success ? undefined : parsed.error,\n });\n }\n\n await verifyProjection(session, pathPrefix, parsed.data);\n return observedReleaseSchema.parse({ ...parsed.data, health: \"unknown\" });\n}\n\nfunction parseReleaseIdentity(input: unknown): ReleaseIdentity {\n const parsed = releaseIdentitySchema.safeParse(input);\n if (!parsed.success) {\n throw new TargetError(\"release_invalid\", \"none\", false, { cause: parsed.error });\n }\n return parsed.data;\n}\n\nasync function verifyProjection(\n session: Session,\n releasePath: string,\n record: ReleaseRecord,\n): Promise<void> {\n if (record.projection.kind !== \"compose\" || record.artifact.kind === \"directory\") {\n throw new TargetError(\"projection_invalid\", \"none\", false);\n }\n const releaseEntries = await session.list(releasePath);\n assertEntries(releaseEntries, [\n { name: \"compose\", kind: \"directory\" },\n { name: \"release.json\", kind: \"file\" },\n ]);\n const composeEntries = await session.list(`${releasePath}/compose`);\n assertEntries(composeEntries, [\n ...record.projection.files.map((file) => ({\n name: path.posix.basename(file),\n kind: \"file\" as const,\n })),\n { name: \"images.json\", kind: \"file\" },\n ]);\n const images = await session.read(\n `${releasePath}/${record.projection.images}`,\n MAX_DOCUMENT_BYTES,\n );\n if (!images || images.content !== serializeImages(record.artifact)) {\n throw new TargetError(\"projection_invalid\", \"none\", false);\n }\n if (record.projection.ports && record.projection.bindings) {\n const ports = await session.read(\n `${releasePath}/${record.projection.ports}`,\n MAX_DOCUMENT_BYTES,\n );\n if (!ports || ports.content !== serializePorts(record.projection.bindings)) {\n throw new TargetError(\"projection_invalid\", \"none\", false);\n }\n }\n if (record.projection.slotPorts && record.projection.slotBindings) {\n for (const slot of [\"blue\", \"green\"] as const) {\n const ports = await session.read(\n `${releasePath}/${record.projection.slotPorts[slot]}`,\n MAX_DOCUMENT_BYTES,\n );\n if (!ports || ports.content !== serializePorts(record.projection.slotBindings[slot])) {\n throw new TargetError(\"projection_invalid\", \"none\", false);\n }\n }\n }\n}\n\nfunction assertEntries(\n actual: readonly { readonly name: string; readonly kind: string }[],\n expected: readonly { readonly name: string; readonly kind: string }[],\n): void {\n const sorted = [...expected].sort((left, right) => left.name.localeCompare(right.name));\n if (\n actual.length !== sorted.length ||\n actual.some(\n (entry, index) => entry.name !== sorted[index]?.name || entry.kind !== sorted[index]?.kind,\n )\n ) {\n throw new TargetError(\"projection_invalid\", \"none\", false);\n }\n}\n\nasync function listReleases(\n plan: Plan,\n environment: Environment,\n session: Session,\n): Promise<readonly ObservedRelease[]> {\n const root = await session.inspect(\"releases\");\n if (root.kind === \"absent\") return Object.freeze([]);\n if (root.kind !== \"directory\") throw new TargetError(\"release_invalid\", \"none\", false);\n\n const entries = await session.list(\"releases\");\n const releases: ObservedRelease[] = [];\n for (const entry of entries) {\n const parsed = releaseIdentitySchema.safeParse(entry.name);\n if (!parsed.success || entry.kind !== \"directory\") {\n throw new TargetError(\"release_invalid\", \"none\", false, { cause: parsed.error });\n }\n releases.push(await resolveRelease(plan, environment, session, parsed.data));\n }\n return Object.freeze(releases);\n}\n\nasync function assertReleaseAbsent(\n session: Session,\n releasePath: string,\n partialPath: string,\n): Promise<void> {\n const [release, partial] = await Promise.all([\n session.inspect(releasePath),\n session.inspect(partialPath),\n ]);\n if (release.kind !== \"absent\" || partial.kind !== \"absent\") {\n throw new TargetError(\"release_conflict\", \"none\", false);\n }\n}\n\nasync function writeDocument(\n session: Session,\n destination: string,\n content: string,\n): Promise<void> {\n const identity = digestText(content);\n const written = await session.writeAtomic({ destination, content, identity, mode: 0o644 });\n if (written.identity !== identity || written.content !== content) {\n throw new TargetError(\"stage_effect_unknown\", \"unknown\", false);\n }\n}\n\nasync function removePartial(session: Session, partialPath: string): Promise<void> {\n const observed = await session.inspect(partialPath);\n if (observed.kind === \"absent\") return;\n if (observed.kind !== \"directory\") {\n throw new TargetError(\"stage_cleanup_failed\", \"none\", false);\n }\n await session.remove({ path: partialPath, kind: \"directory\" });\n}\n\nfunction serializeRelease(record: ReleaseRecord): string {\n return `${JSON.stringify(record, null, 2)}\\n`;\n}\n\nfunction serializeImages(artifact: ComposeArtifact): string {\n const services =\n artifact.kind === \"oci\"\n ? { app: { image: artifact.reference, pull_policy: \"always\" } }\n : Object.fromEntries(\n artifact.workloads.map((workload) => [\n workload.workload,\n { image: workload.reference, pull_policy: \"always\" },\n ]),\n );\n return `${JSON.stringify({ services }, null, 2)}\\n`;\n}\n\nfunction serializePorts(bindings: readonly PortBinding[]): string {\n const services: Record<\n string,\n {\n ports: Array<{\n target: number;\n published: string;\n host_ip: PortBinding[\"host\"];\n protocol: PortBinding[\"protocol\"];\n }>;\n }\n > = {};\n for (const binding of bindings) {\n const service = (services[binding.service] ??= { ports: [] });\n service.ports.push({\n target: binding.targetPort,\n published: String(binding.publishedPort),\n host_ip: binding.host,\n protocol: binding.protocol,\n });\n }\n return `${JSON.stringify({ services }, null, 2)}\\n`;\n}\n\nfunction canonicalBindings(bindings: readonly PortBinding[]): readonly PortBinding[] {\n return portBindingsSchema.parse(\n [...bindings].sort(\n (left, right) =>\n left.service.localeCompare(right.service) ||\n left.targetPort - right.targetPort ||\n left.host.localeCompare(right.host) ||\n left.publishedPort - right.publishedPort ||\n left.protocol.localeCompare(right.protocol),\n ),\n );\n}\n\nfunction assertBindingServices(\n bindings: readonly PortBinding[] | undefined,\n workloads: readonly string[],\n): void {\n if (!bindings) return;\n const published = new Set(workloads);\n if (bindings.every((binding) => published.has(binding.service))) return;\n throw new TargetError(\"plan_invalid\", \"none\", false);\n}\n\nfunction observedRecord(release: ObservedRelease): ReleaseRecord {\n const { health: _health, migrationLedger: _migrationLedger, ...record } = release;\n return releaseRecordSchema.parse(record);\n}\n\nfunction compareNewest(left: ObservedRelease, right: ObservedRelease): number {\n const timestamp = Date.parse(right.stagedAt) - Date.parse(left.stagedAt);\n return timestamp || right.releaseId.localeCompare(left.releaseId);\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative.length > 0 &&\n relative !== \"..\" &&\n !relative.startsWith(`..${path.sep}`) &&\n !path.isAbsolute(relative)\n );\n}\n\nasync function digestFile(filename: string): Promise<string> {\n const hash = createHash(\"sha256\");\n try {\n for await (const chunk of createReadStream(filename)) hash.update(chunk);\n } catch (error) {\n throw new TargetError(\"source_invalid\", \"none\", false, { cause: error });\n }\n return `sha256:${hash.digest(\"hex\")}`;\n}\n\nfunction digestText(content: string): string {\n return `sha256:${createHash(\"sha256\").update(content, \"utf8\").digest(\"hex\")}`;\n}\n\nfunction effectOf(error: unknown): Failure[\"effect\"] {\n if (error instanceof TransportError || error instanceof TargetError) return error.effect;\n return \"none\";\n}\n\nfunction assertActive(signal: AbortSignal | undefined): void {\n if (signal?.aborted) throw new TargetError(\"cancelled\", \"none\", false);\n}\n\nfunction parseContext<Context>(schema: z.ZodType<Context>, input: unknown): Context {\n const parsed = schema.safeParse(input);\n if (!parsed.success) {\n throw new TargetError(\"context_invalid\", \"none\", false, { cause: parsed.error });\n }\n return parsed.data;\n}\n","import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { lstat, open, realpath, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isDeepStrictEqual, TextDecoder } from \"node:util\";\n\nimport { z } from \"zod\";\n\nimport { DEFAULT_RELEASE_RETENTION, directoryEnvironmentSchema } from \"../config.js\";\nimport { assertArtifact, type Plan, type ReleasePlan } from \"../plan.js\";\nimport {\n directoryManifestSchema,\n serializeDirectoryManifest,\n type DirectoryManifest,\n} from \"../profile.js\";\nimport { publishedDirectoryArtifactSchema, type PublishedDirectoryArtifact } from \"../receipt.js\";\nimport {\n createReleaseIdentity,\n directoryProjectionSchema,\n observeContextSchema,\n observedReleaseSchema,\n releaseIdentitySchema,\n releaseRecordSchema,\n retainContextSchema,\n retentionResultSchema,\n stagedReleaseSchema,\n stageContextSchema,\n targetObservationSchema,\n type ObservedRelease,\n type ReleaseIdentity,\n type ReleaseRecord,\n type RetainContext,\n type RetentionResult,\n type StageContext,\n type StagedRelease,\n type TargetAdapter,\n type TargetObservation,\n} from \"../target.js\";\nimport type { Session } from \"../transport/ssh.js\";\n\nconst MAX_MANIFEST_BYTES = 1024 * 1024;\nconst MAX_RELEASE_BYTES = 1024 * 1024;\nconst RELEASES = \"releases\";\nconst DIRECTORY_PROJECTION = directoryProjectionSchema.parse({\n kind: \"directory\",\n archive: \"payload/archive.tar\",\n manifest: \"payload/manifest.json\",\n content: \"payload/public\",\n});\n\nexport type Operation = \"observe\" | \"retain\" | \"stage\";\n\nexport type ErrorCode =\n | \"artifact_checksum_mismatch\"\n | \"artifact_file_invalid\"\n | \"artifact_invalid\"\n | \"artifact_manifest_invalid\"\n | \"artifact_manifest_mismatch\"\n | \"cancelled\"\n | \"context_invalid\"\n | \"invalid_plan\"\n | \"pointer_invalid\"\n | \"release_conflict\"\n | \"release_payload_invalid\"\n | \"release_record_invalid\"\n | \"retention_entry_invalid\"\n | \"stage_cleanup_failed\";\n\n/** 目录目标错误只暴露稳定分类,文件路径和远端内容保留在受控错误原因中。 */\nexport class TargetError extends Error {\n constructor(\n readonly code: ErrorCode,\n readonly operation: Operation,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"SSHDirectoryTargetError\";\n }\n}\n\ninterface LocalArtifact {\n readonly archive: string;\n readonly manifest: string;\n readonly manifestIdentity: string;\n}\n\n/** 目录目标复用调用方已持有的 SSH 会话,避免状态与目标操作重复获取同一环境锁。 */\nexport function createTarget(session: Session): TargetAdapter {\n const target: TargetAdapter = {\n id: \"ssh-directory\",\n observe: (plan, context) => observe(session, plan, context),\n readRelease: (plan, releaseId, context) => readRelease(session, plan, releaseId, context),\n stage: (plan, artifact, context) => stage(session, plan, artifact, context),\n retain: (plan, context) => retain(session, plan, context),\n };\n return Object.freeze(target);\n}\n\nasync function observe(\n session: Session,\n plan: Plan,\n rawContext: unknown,\n): Promise<TargetObservation> {\n const context = parseContext(observeContextSchema, rawContext, \"observe\");\n requirePlan(plan, \"observe\");\n assertActive(context.signal, \"observe\");\n return observeTarget(session, plan);\n}\n\nasync function readRelease(\n session: Session,\n plan: Plan,\n rawReleaseId: unknown,\n rawContext: unknown,\n): Promise<ObservedRelease> {\n const context = parseContext(observeContextSchema, rawContext, \"observe\");\n requirePlan(plan, \"observe\");\n const releaseId = parseReleaseIdentity(rawReleaseId);\n assertActive(context.signal, \"observe\");\n const release = await resolveRelease(session, plan, releaseId);\n assertActive(context.signal, \"observe\");\n return release;\n}\n\nasync function observeTarget(session: Session, plan: Plan): Promise<TargetObservation> {\n const current = await observePointer(session, plan, \"current\");\n const previous = await observePointer(session, plan, \"previous\");\n return targetObservationSchema.parse({\n schemaVersion: 1,\n ...(current ? { current } : {}),\n ...(previous ? { previous } : {}),\n });\n}\n\nasync function observePointer(\n session: Session,\n plan: Plan,\n pointer: \"current\" | \"previous\",\n): Promise<ObservedRelease | undefined> {\n const target = await session.observeLink(pointer);\n if (target === null) return undefined;\n const releaseId = releaseFromPointer(plan, target);\n return resolveRelease(session, plan, releaseId);\n}\n\nasync function resolveRelease(\n session: Session,\n plan: Plan,\n releaseId: ReleaseIdentity,\n): Promise<ObservedRelease> {\n const record = await readRecord(session, plan, releaseId);\n await verifyPayload(session, record);\n return observedReleaseSchema.parse({ ...record, health: \"unknown\" });\n}\n\nasync function stage(\n session: Session,\n plan: ReleasePlan,\n rawArtifact: unknown,\n rawContext: unknown,\n): Promise<StagedRelease> {\n requirePlan(plan, \"stage\");\n const context = parseContext(stageContextSchema, rawContext, \"stage\");\n const artifact = parseArtifact(plan, rawArtifact);\n assertActive(context.signal, \"stage\");\n\n const local = await verifyLocalArtifact(plan, artifact, context);\n const releaseId = createReleaseIdentity({ revision: plan.revision, artifact });\n const observation = await observeTarget(session, plan);\n if (observation.current?.releaseId === releaseId) {\n throw new TargetError(\"release_conflict\", \"stage\");\n }\n\n const finalDirectory = releaseDirectory(releaseId);\n const partialDirectory = `${finalDirectory}.partial`;\n const finalState = await session.inspect(finalDirectory);\n if (finalState.kind === \"directory\") {\n const existing = await resolveRelease(session, plan, releaseId);\n if (!isDeepStrictEqual(existing.artifact, artifact)) {\n throw new TargetError(\"release_conflict\", \"stage\");\n }\n return stagedReleaseSchema.parse({\n ...releaseRecord(existing),\n ...(observation.current ? { previous: observation.current } : {}),\n });\n }\n if (finalState.kind !== \"absent\" || (await session.inspect(partialDirectory)).kind !== \"absent\") {\n throw new TargetError(\"release_conflict\", \"stage\");\n }\n\n const record = releaseRecordSchema.parse({\n schemaVersion: 1,\n releaseId,\n environment: plan.environmentName,\n revision: plan.revision,\n artifact,\n projection: DIRECTORY_PROJECTION,\n stagedAt: context.stagedAt,\n });\n\n try {\n await writeRelease(session, partialDirectory, record, local, context);\n await session.rename({ source: partialDirectory, destination: finalDirectory, replace: false });\n const observed = await readRecord(session, plan, releaseId);\n if (!isDeepStrictEqual(observed, record)) {\n throw new TargetError(\"release_record_invalid\", \"stage\");\n }\n } catch (error) {\n await cleanupPartial(session, partialDirectory, error);\n throw error;\n }\n\n return stagedReleaseSchema.parse({\n ...record,\n ...(observation.current ? { previous: observation.current } : {}),\n });\n}\n\nasync function writeRelease(\n session: Session,\n partialDirectory: string,\n record: ReleaseRecord,\n local: LocalArtifact,\n context: StageContext,\n): Promise<void> {\n const archive = `${partialDirectory}/${DIRECTORY_PROJECTION.archive}`;\n const manifest = `${partialDirectory}/${DIRECTORY_PROJECTION.manifest}`;\n const content = `${partialDirectory}/${DIRECTORY_PROJECTION.content}`;\n\n await session.upload({\n source: local.archive,\n destination: archive,\n identity: record.artifact.identity,\n });\n assertActive(context.signal, \"stage\");\n await session.upload({\n source: local.manifest,\n destination: manifest,\n identity: local.manifestIdentity,\n });\n assertActive(context.signal, \"stage\");\n await session.execute({ executable: \"mkdir\", args: [\"-p\", content] });\n await session.execute({\n executable: \"tar\",\n args: [\n \"--extract\",\n \"--file\",\n archive,\n \"--directory\",\n content,\n \"--no-same-owner\",\n \"--no-same-permissions\",\n ],\n });\n assertActive(context.signal, \"stage\");\n await verifyPayload(session, record, partialDirectory);\n\n const document = serializeRelease(record);\n await session.writeAtomic({\n destination: `${partialDirectory}/release.json`,\n content: document,\n identity: digestText(document),\n mode: 0o644,\n });\n}\n\nasync function cleanupPartial(\n session: Session,\n partialDirectory: string,\n operationError: unknown,\n): Promise<void> {\n try {\n const observed = await session.inspect(partialDirectory);\n if (observed.kind === \"absent\") return;\n if (observed.kind !== \"directory\") {\n throw new TargetError(\"release_conflict\", \"stage\");\n }\n await session.remove({ path: partialDirectory, kind: \"directory\" });\n } catch (cleanupError) {\n throw new TargetError(\"stage_cleanup_failed\", \"stage\", {\n cause: new AggregateError([operationError, cleanupError]),\n });\n }\n}\n\nasync function retain(session: Session, plan: Plan, rawContext: unknown): Promise<RetentionResult> {\n const environment = requirePlan(plan, \"retain\");\n const context = parseContext(retainContextSchema, rawContext, \"retain\");\n assertActive(context.signal, \"retain\");\n const observation = await observeTarget(session, plan);\n const protectedReleases = new Set<ReleaseIdentity>(context.protectedReleases);\n if (observation.current) protectedReleases.add(observation.current.releaseId);\n if (observation.previous) protectedReleases.add(observation.previous.releaseId);\n\n const releasesState = await session.inspect(RELEASES);\n if (releasesState.kind === \"absent\") {\n return retentionResultSchema.parse({\n schemaVersion: 1,\n status: \"succeeded\",\n removed: [],\n protected: sorted(protectedReleases),\n });\n }\n if (releasesState.kind !== \"directory\") {\n throw new TargetError(\"retention_entry_invalid\", \"retain\");\n }\n\n const records: ReleaseRecord[] = [];\n for (const entry of await session.list(RELEASES)) {\n assertActive(context.signal, \"retain\");\n const releaseId = releaseIdentitySchema.safeParse(entry.name);\n if (entry.kind !== \"directory\" || !releaseId.success) {\n throw new TargetError(\"retention_entry_invalid\", \"retain\");\n }\n const record = await readRecord(session, plan, releaseId.data);\n await verifyPayload(session, record);\n records.push(record);\n }\n\n records.sort(compareNewest);\n const retainedCount = environment.retention?.releases ?? DEFAULT_RELEASE_RETENTION;\n for (const record of records.slice(0, retainedCount)) {\n protectedReleases.add(record.releaseId);\n }\n\n const removed = records\n .filter((record) => !protectedReleases.has(record.releaseId))\n .map((record) => record.releaseId)\n .sort(compareText);\n for (const releaseId of removed) {\n assertActive(context.signal, \"retain\");\n await session.remove({ path: releaseDirectory(releaseId), kind: \"directory\" });\n }\n\n return retentionResultSchema.parse({\n schemaVersion: 1,\n status: \"succeeded\",\n removed,\n protected: sorted(protectedReleases),\n });\n}\n\nasync function readRecord(\n session: Session,\n plan: Plan,\n releaseId: ReleaseIdentity,\n): Promise<ReleaseRecord> {\n const document = await session.read(\n `${releaseDirectory(releaseId)}/release.json`,\n MAX_RELEASE_BYTES,\n );\n if (document === null) throw new TargetError(\"release_record_invalid\", \"observe\");\n\n let record: ReleaseRecord;\n try {\n record = releaseRecordSchema.parse(JSON.parse(document.content) as unknown);\n } catch (error) {\n throw new TargetError(\"release_record_invalid\", \"observe\", { cause: error });\n }\n if (\n record.releaseId !== releaseId ||\n record.environment !== plan.environmentName ||\n record.artifact.profile !== plan.config.profile ||\n record.artifact.kind !== \"directory\" ||\n document.content !== serializeRelease(record)\n ) {\n throw new TargetError(\"release_record_invalid\", \"observe\");\n }\n return record;\n}\n\nfunction parseReleaseIdentity(input: unknown): ReleaseIdentity {\n const parsed = releaseIdentitySchema.safeParse(input);\n if (!parsed.success) {\n throw new TargetError(\"release_record_invalid\", \"observe\", { cause: parsed.error });\n }\n return parsed.data;\n}\n\nasync function verifyPayload(\n session: Session,\n record: ReleaseRecord,\n directory = releaseDirectory(record.releaseId),\n): Promise<void> {\n if (record.artifact.kind !== \"directory\" || record.projection.kind !== \"directory\") {\n throw new TargetError(\"release_payload_invalid\", \"observe\");\n }\n const archive = await session.inspect(`${directory}/${record.projection.archive}`);\n if (archive.kind !== \"file\" || archive.identity !== record.artifact.identity) {\n throw new TargetError(\"release_payload_invalid\", \"observe\");\n }\n const manifest = await session.read(\n `${directory}/${record.projection.manifest}`,\n MAX_MANIFEST_BYTES,\n );\n if (manifest === null) throw new TargetError(\"release_payload_invalid\", \"observe\");\n verifyManifest(record.artifact, manifest.content, \"observe\");\n\n const content = await session.inspect(`${directory}/${record.projection.content}`);\n const entry = await session.inspect(`${directory}/${record.projection.content}/index.html`);\n if (content.kind !== \"directory\" || entry.kind !== \"file\") {\n throw new TargetError(\"release_payload_invalid\", \"observe\");\n }\n}\n\nasync function verifyLocalArtifact(\n plan: ReleasePlan,\n artifact: PublishedDirectoryArtifact,\n context: StageContext,\n): Promise<LocalArtifact> {\n const root = await resolveArtifactRoot(context.artifactRoot);\n const archive = await resolveArtifactFile(root, artifact.archive);\n const manifest = await resolveArtifactFile(root, artifact.manifestFile);\n const archiveIdentity = await digestFile(archive, context.signal);\n if (archiveIdentity !== artifact.identity) {\n throw new TargetError(\"artifact_checksum_mismatch\", \"stage\");\n }\n const contents = await readLocalDocument(manifest, MAX_MANIFEST_BYTES);\n verifyManifest(artifact, contents, \"stage\", plan.revision);\n return Object.freeze({ archive, manifest, manifestIdentity: digestText(contents) });\n}\n\nfunction verifyManifest(\n artifact: PublishedDirectoryArtifact,\n contents: string,\n operation: Operation,\n revision = artifact.revision,\n): void {\n let manifest: DirectoryManifest;\n try {\n manifest = directoryManifestSchema.parse(JSON.parse(contents) as unknown);\n } catch (error) {\n throw new TargetError(\"artifact_manifest_invalid\", operation, { cause: error });\n }\n const expected: DirectoryManifest = {\n schemaVersion: 1,\n revision,\n archive: artifact.archive,\n identity: artifact.identity,\n };\n if (!isDeepStrictEqual(manifest, expected) || contents !== serializeDirectoryManifest(expected)) {\n throw new TargetError(\"artifact_manifest_mismatch\", operation);\n }\n}\n\nfunction parseArtifact(plan: ReleasePlan, input: unknown): PublishedDirectoryArtifact {\n const parsed = publishedDirectoryArtifactSchema.safeParse(input);\n if (!parsed.success) {\n throw new TargetError(\"artifact_invalid\", \"stage\", { cause: parsed.error });\n }\n try {\n assertArtifact(plan, parsed.data);\n } catch (error) {\n throw new TargetError(\"artifact_invalid\", \"stage\", { cause: error });\n }\n return parsed.data;\n}\n\nfunction requirePlan(plan: Plan, operation: Operation) {\n const environment = directoryEnvironmentSchema.safeParse(plan.environment);\n if (!environment.success || plan.config.profile !== \"static-files\") {\n throw new TargetError(\"invalid_plan\", operation, {\n cause: environment.success ? undefined : environment.error,\n });\n }\n return environment.data;\n}\n\nfunction parseContext<Result>(\n schema: z.ZodType<Result>,\n input: unknown,\n operation: Operation,\n): Result {\n const parsed = schema.safeParse(input);\n if (!parsed.success) {\n throw new TargetError(\"context_invalid\", operation, { cause: parsed.error });\n }\n return parsed.data;\n}\n\nfunction releaseFromPointer(plan: Plan, target: string): ReleaseIdentity {\n const environment = requirePlan(plan, \"observe\");\n const root = path.posix.normalize(environment.root);\n const relative = path.posix.isAbsolute(target) ? path.posix.relative(root, target) : target;\n const segments = relative.split(\"/\");\n const releaseId = segments[1];\n const parsed = releaseIdentitySchema.safeParse(releaseId);\n if (\n segments.length !== 2 ||\n segments[0] !== RELEASES ||\n !parsed.success ||\n path.posix.normalize(relative) !== relative\n ) {\n throw new TargetError(\"pointer_invalid\", \"observe\");\n }\n return parsed.data;\n}\n\nfunction releaseRecord(release: ObservedRelease): ReleaseRecord {\n return releaseRecordSchema.parse({\n schemaVersion: release.schemaVersion,\n releaseId: release.releaseId,\n environment: release.environment,\n revision: release.revision,\n artifact: release.artifact,\n projection: release.projection,\n stagedAt: release.stagedAt,\n });\n}\n\nfunction serializeRelease(record: ReleaseRecord): string {\n return `${JSON.stringify(releaseRecordSchema.parse(record))}\\n`;\n}\n\nfunction releaseDirectory(releaseId: ReleaseIdentity): string {\n return `${RELEASES}/${releaseId}`;\n}\n\nasync function resolveArtifactRoot(value: string): Promise<string> {\n try {\n const resolved = await realpath(value);\n if (!(await stat(resolved)).isDirectory()) throw new Error(\"not a directory\");\n return resolved;\n } catch (error) {\n throw new TargetError(\"artifact_file_invalid\", \"stage\", { cause: error });\n }\n}\n\nasync function resolveArtifactFile(root: string, relative: string): Promise<string> {\n const expected = path.resolve(root, ...relative.split(\"/\"));\n try {\n const details = await lstat(expected);\n const resolved = await realpath(expected);\n if (\n !details.isFile() ||\n details.isSymbolicLink() ||\n resolved !== expected ||\n !isInside(root, resolved)\n ) {\n throw new Error(\"not a confined regular file\");\n }\n return resolved;\n } catch (error) {\n throw new TargetError(\"artifact_file_invalid\", \"stage\", { cause: error });\n }\n}\n\nasync function readLocalDocument(filename: string, maxBytes: number): Promise<string> {\n let file;\n try {\n file = await open(filename, \"r\");\n const details = await file.stat();\n if (!details.isFile() || details.size > maxBytes) throw new Error(\"document exceeds limit\");\n const buffer = Buffer.alloc(details.size + 1);\n const { bytesRead } = await file.read(buffer, 0, buffer.byteLength, 0);\n if (bytesRead !== details.size) throw new Error(\"document size changed while reading\");\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(buffer.subarray(0, bytesRead));\n } catch (error) {\n throw new TargetError(\"artifact_manifest_invalid\", \"stage\", { cause: error });\n } finally {\n try {\n await file?.close();\n } catch (error) {\n throw new TargetError(\"artifact_manifest_invalid\", \"stage\", { cause: error });\n }\n }\n}\n\nasync function digestFile(filename: string, signal?: AbortSignal): Promise<string> {\n const hash = createHash(\"sha256\");\n try {\n for await (const chunk of createReadStream(filename)) {\n assertActive(signal, \"stage\");\n hash.update(chunk);\n }\n return `sha256:${hash.digest(\"hex\")}`;\n } catch (error) {\n if (error instanceof TargetError) throw error;\n throw new TargetError(\"artifact_file_invalid\", \"stage\", { cause: error });\n }\n}\n\nfunction digestText(contents: string): string {\n return `sha256:${createHash(\"sha256\").update(contents, \"utf8\").digest(\"hex\")}`;\n}\n\nfunction assertActive(signal: AbortSignal | undefined, operation: Operation): void {\n if (signal?.aborted) throw new TargetError(\"cancelled\", operation, { cause: signal.reason });\n}\n\nfunction isInside(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (relative !== \"..\" && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative))\n );\n}\n\nfunction compareNewest(left: ReleaseRecord, right: ReleaseRecord): number {\n const time = Date.parse(right.stagedAt) - Date.parse(left.stagedAt);\n return time === 0 ? compareText(left.releaseId, right.releaseId) : time;\n}\n\nfunction compareText(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction sorted(values: ReadonlySet<ReleaseIdentity>): readonly ReleaseIdentity[] {\n return [...values].sort(compareText);\n}\n","import { assertCompatible, type Operation } from \"./compatibility.js\";\nimport { parseConfig, type Config, type Environment, type Profile, type Target } from \"./config.js\";\nimport type { HealthPort } from \"./health.js\";\nimport type { Plan } from \"./plan.js\";\nimport type { ProfileAdapter } from \"./profile.js\";\nimport { createProfile as createComposeStackProfile } from \"./profiles/compose-stack.js\";\nimport { profile as goServiceProfile } from \"./profiles/go-service.js\";\nimport { profile as nuxtNodeProfile } from \"./profiles/nuxt-node.js\";\nimport { profile as staticFilesProfile } from \"./profiles/static-files.js\";\nimport { createProfile as createStaticNginxProfile } from \"./profiles/static-nginx.js\";\nimport type { RolloutAdapter, RolloutId } from \"./rollout.js\";\nimport { createRollout as createAtomicLinkRollout } from \"./rollouts/atomic-link.js\";\nimport {\n createRollout as createBlueGreenRollout,\n createWorkloadRollout as createBlueGreenWorkloadRollout,\n type Options as BlueGreenOptions,\n} from \"./rollouts/blue-green.js\";\nimport {\n createRollout as createRecreateRollout,\n createWorkloadRollout as createRecreateWorkloadRollout,\n} from \"./rollouts/recreate.js\";\nimport { createRollout as createStackRollout } from \"./rollouts/stack.js\";\nimport type { TargetAdapter } from \"./target.js\";\nimport { createTarget as createComposeHostTarget } from \"./targets/compose-host.js\";\nimport { createTarget as createSSHDirectoryTarget } from \"./targets/ssh-directory.js\";\nimport type { Session } from \"./transport/ssh.js\";\n\nexport type RuntimeTarget = Exclude<Target, \"registry-only\">;\nexport type RuntimeOperation = Exclude<Operation, \"build\" | \"publish\">;\n\nexport type ErrorCode =\n | \"adapter_mismatch\"\n | \"duplicate_profile\"\n | \"duplicate_rollout\"\n | \"duplicate_target\"\n | \"unknown_profile\"\n | \"unknown_rollout\"\n | \"unknown_target\";\n\nexport interface ProfileFactory {\n readonly id: Profile;\n create(): ProfileAdapter;\n}\n\nexport interface TargetFactory {\n readonly id: RuntimeTarget;\n create(session: Session): TargetAdapter;\n}\n\nexport interface RolloutFactory {\n readonly id: RolloutId;\n create(session: Session): RolloutAdapter;\n}\n\nexport interface Registrations {\n readonly profiles: readonly ProfileFactory[];\n readonly targets: readonly TargetFactory[];\n readonly rollouts: readonly RolloutFactory[];\n}\n\nexport interface Options {\n readonly health: HealthPort;\n readonly previewHealth: HealthPort;\n readonly blueGreen: Omit<BlueGreenOptions, \"health\" | \"previewHealth\" | \"session\">;\n readonly staticNginxDocker?: string;\n readonly recreateDocker?: string;\n}\n\n/** 注册错误只携带稳定分类和公开适配器标识,不包含注入依赖。 */\nexport class RegistryError extends Error {\n constructor(\n readonly code: ErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"DeploymentRegistryError\";\n }\n}\n\n/** 部署注册表在选择工厂前执行唯一兼容性策略,不包含任何具体适配器行为。 */\nexport class Registry {\n readonly #profiles = new Map<Profile, ProfileFactory>();\n readonly #targets = new Map<RuntimeTarget, TargetFactory>();\n readonly #rollouts = new Map<RolloutId, RolloutFactory>();\n\n constructor(registrations: Registrations) {\n for (const factory of registrations.profiles) this.registerProfile(factory);\n for (const factory of registrations.targets) this.registerTarget(factory);\n for (const factory of registrations.rollouts) this.registerRollout(factory);\n }\n\n profile(plan: Plan, operation: Operation): ProfileAdapter {\n const { config } = select(plan, operation);\n const factory = this.#profiles.get(config.profile);\n if (!factory) {\n throw new RegistryError(\"unknown_profile\", `Unknown deployment profile: ${config.profile}`);\n }\n return assertAdapter(factory.id, factory.create(), \"profile\");\n }\n\n target(plan: Plan, operation: RuntimeOperation, session: Session): TargetAdapter {\n const { environment } = select(plan, operation);\n if (environment.target === \"registry-only\") {\n throw new RegistryError(\"unknown_target\", \"Registry-only has no runtime target adapter\");\n }\n const factory = this.#targets.get(environment.target);\n if (!factory) {\n throw new RegistryError(\"unknown_target\", `Unknown deployment target: ${environment.target}`);\n }\n return assertAdapter(factory.id, factory.create(session), \"target\");\n }\n\n rollout(plan: Plan, operation: RuntimeOperation, session: Session): RolloutAdapter {\n const { environment } = select(plan, operation);\n const id = rolloutIdOf(environment);\n const factory = this.#rollouts.get(id);\n if (!factory) {\n throw new RegistryError(\"unknown_rollout\", `Unknown deployment rollout: ${id}`);\n }\n return assertAdapter(factory.id, factory.create(session), \"rollout\");\n }\n\n private registerProfile(factory: ProfileFactory): void {\n if (this.#profiles.has(factory.id)) {\n throw new RegistryError(\n \"duplicate_profile\",\n `Deployment profile is registered more than once: ${factory.id}`,\n );\n }\n this.#profiles.set(\n factory.id,\n Object.freeze({ id: factory.id, create: () => factory.create() }),\n );\n }\n\n private registerTarget(factory: TargetFactory): void {\n if (this.#targets.has(factory.id)) {\n throw new RegistryError(\n \"duplicate_target\",\n `Deployment target is registered more than once: ${factory.id}`,\n );\n }\n this.#targets.set(\n factory.id,\n Object.freeze({ id: factory.id, create: (session: Session) => factory.create(session) }),\n );\n }\n\n private registerRollout(factory: RolloutFactory): void {\n if (this.#rollouts.has(factory.id)) {\n throw new RegistryError(\n \"duplicate_rollout\",\n `Deployment rollout is registered more than once: ${factory.id}`,\n );\n }\n this.#rollouts.set(\n factory.id,\n Object.freeze({ id: factory.id, create: (session: Session) => factory.create(session) }),\n );\n }\n}\n\n/** 内置组合只登记已实现适配器,运行时能力由调用方显式注入。 */\nexport function createRegistry(options: Options): Registry {\n return new Registry({\n profiles: [\n { id: \"static-files\", create: () => staticFilesProfile },\n { id: \"static-nginx\", create: () => createStaticNginxProfile(options.staticNginxDocker) },\n { id: \"nuxt-node\", create: () => nuxtNodeProfile },\n { id: \"go-service\", create: () => goServiceProfile },\n { id: \"compose-stack\", create: createComposeStackProfile },\n ],\n targets: [\n { id: \"ssh-directory\", create: createSSHDirectoryTarget },\n { id: \"compose-host\", create: createComposeHostTarget },\n ],\n rollouts: [\n {\n id: \"atomic-link\",\n create: (session) => createAtomicLinkRollout(session, options.health),\n },\n {\n id: \"recreate\",\n create: (session) => createRecreateRollout(session, options.health, options.recreateDocker),\n },\n {\n id: \"blue-green\",\n create: (session) =>\n createBlueGreenRollout({\n ...options.blueGreen,\n health: options.health,\n previewHealth: options.previewHealth,\n session,\n }),\n },\n {\n id: \"stack\",\n create: (session) =>\n createStackRollout({\n session,\n adapters: [\n createRecreateWorkloadRollout(session, options.health, options.recreateDocker),\n createBlueGreenWorkloadRollout({\n ...options.blueGreen,\n health: options.health,\n previewHealth: options.previewHealth,\n session,\n }),\n ],\n }),\n },\n ],\n });\n}\n\nfunction rolloutIdOf(environment: Environment): RolloutId {\n if (environment.target === \"registry-only\") {\n throw new RegistryError(\"unknown_rollout\", \"Registry-only has no runtime rollout adapter\");\n }\n return \"strategy\" in environment.rollout ? environment.rollout.strategy : \"stack\";\n}\n\nfunction select(\n plan: Plan,\n operation: Operation,\n): Readonly<{ config: Config; environment: Environment }> {\n const config = parseConfig(plan.config);\n const environment = assertCompatible(config, plan.environmentName, operation);\n return { config, environment };\n}\n\nfunction assertAdapter<Id extends string, Adapter extends { readonly id: string }>(\n expected: Id,\n adapter: Adapter,\n kind: \"profile\" | \"rollout\" | \"target\",\n): Adapter {\n if (adapter.id !== expected) {\n throw new RegistryError(\n \"adapter_mismatch\",\n `Registered ${kind} factory returned a mismatched adapter`,\n );\n }\n return adapter;\n}\n","import { EnvFileError, readEnvironmentFiles } from \"../../deploy/env-file.js\";\nimport { materialize } from \"../../deploy/materialize.js\";\nimport { createPlan, createReleasePlan, parsePublishedArtifact } from \"../../deploy/plan.js\";\nimport { buildResultSchema } from \"../../deploy/profile.js\";\nimport {\n build as buildRelease,\n publish as publishRelease,\n reconcile as reconcileRelease,\n release as activateRelease,\n rollback as rollbackRelease,\n verify as verifyRelease,\n} from \"../../deploy/release.js\";\nimport { createRegistryTransport } from \"../../deploy/transport/registry.js\";\nimport { writeJson } from \"../../utils/fs.js\";\nimport {\n assertActive,\n CommandError,\n requireOption,\n succeeded,\n withExitCode,\n type ArtifactOptions,\n type BuildOptions,\n type CommandResult,\n type InitOptions,\n type PublishOptions,\n type RollbackOptions,\n type Scope,\n type SelectedOptions,\n type VerifyOptions,\n} from \"./contracts.js\";\nimport {\n assertAbsent,\n loadProject,\n readDocument,\n resolveInput,\n resolveOutput,\n toProjectPath,\n} from \"./io.js\";\nimport {\n buildContext,\n createAdapterRegistry,\n processOptions,\n registryOptions,\n withRuntime,\n} from \"./runtime.js\";\n\nexport async function init(options: InitOptions, scope: Scope): Promise<CommandResult> {\n assertActive(scope.signal);\n const input = {\n profile: requireOption(options.profile, \"profile\"),\n target: requireOption(options.target, \"target\"),\n ...(options.rollout === undefined ? {} : { rollout: options.rollout }),\n ...(options.ci === undefined ? {} : { ci: options.ci }),\n ...(options.stackonwardRef === undefined ? {} : { stackonwardRef: options.stackonwardRef }),\n };\n const materialized = await materialize({ projectRoot: process.cwd(), input });\n assertActive(scope.signal);\n return succeeded({ schemaVersion: 1, outcome: \"materialized\", files: materialized.paths });\n}\n\nexport async function validate(options: SelectedOptions, scope: Scope): Promise<CommandResult> {\n const environment = requireOption(options.environment, \"environment\");\n const project = await loadProject(options.config);\n const plan = createPlan({\n config: project.config,\n environmentName: environment,\n operation: \"build\",\n env: scope.env,\n });\n createAdapterRegistry(scope, project.root).profile(plan, \"build\");\n const outcome = await scope.runner.run(\n plan.config.source.verify,\n processOptions(project.root, scope, [plan.config.source.verify]),\n );\n if (outcome.status === \"failed\") throw new CommandError(\"source_verification_failed\", 5);\n return succeeded({\n schemaVersion: 1,\n outcome: \"validated\",\n profile: plan.config.profile,\n environment: plan.environmentName,\n target: plan.environment.target,\n });\n}\n\nexport async function build(options: BuildOptions, scope: Scope): Promise<CommandResult> {\n const environment = requireOption(options.environment, \"environment\");\n const revision = requireOption(options.revision, \"revision\");\n const outputInput = requireOption(options.output, \"output\");\n const project = await loadProject(options.config);\n const output = await resolveOutput(project.root, outputInput);\n await assertAbsent(output, \"output\");\n const plan = createReleasePlan({\n config: project.config,\n environmentName: environment,\n revision,\n operation: \"build\",\n env: scope.env,\n });\n let fileEnv: Readonly<Record<string, string>>;\n try {\n fileEnv = await readEnvironmentFiles(project.root, environment);\n } catch (error) {\n if (error instanceof EnvFileError) {\n throw new CommandError(error.code, 2, \"environment\");\n }\n throw error;\n }\n const context = buildContext(\n project.root,\n output,\n { ...scope, env: { ...fileEnv, ...scope.env } },\n [plan.config.source.verify, plan.config.source.build],\n );\n const result = await buildRelease(\n plan,\n createAdapterRegistry(scope, project.root).profile(plan, \"build\"),\n context,\n );\n await writeJson(output, result);\n return succeeded({\n schemaVersion: 1,\n outcome: \"built\",\n profile: result.artifact.profile,\n revision: result.artifact.revision,\n identity: result.artifact.identity,\n artifact: toProjectPath(project.root, output),\n });\n}\n\nexport async function publish(options: PublishOptions, scope: Scope): Promise<CommandResult> {\n const environment = requireOption(options.environment, \"environment\");\n const artifactInput = requireOption(options.artifact, \"artifact\");\n const outputInput = requireOption(options.output, \"output\");\n const project = await loadProject(options.config);\n const artifactFile = await resolveInput(project.root, artifactInput, \"artifact\");\n const output = await resolveOutput(project.root, outputInput);\n if (artifactFile === output) throw new CommandError(\"artifact_output_conflict\", 2, \"output\");\n await assertAbsent(output, \"output\");\n const input = buildResultSchema.parse(await readDocument(artifactFile, \"artifact\"));\n const plan = createReleasePlan({\n config: project.config,\n environmentName: environment,\n revision: input.artifact.revision,\n operation: \"publish\",\n env: scope.env,\n });\n const context = buildContext(project.root, artifactFile, scope);\n const publication = await publishRelease(plan, input, {\n build: context,\n ...(input.output.kind === \"directory\"\n ? {}\n : {\n registry: {\n port: createRegistryTransport(scope.runner),\n options: registryOptions(project.root, scope),\n },\n }),\n });\n await writeJson(output, publication.artifact);\n return succeeded(publication.receipt);\n}\n\nexport async function release(options: ArtifactOptions, scope: Scope): Promise<CommandResult> {\n const environment = requireOption(options.environment, \"environment\");\n const artifactInput = requireOption(options.artifact, \"artifact\");\n const project = await loadProject(options.config);\n const artifactFile = await resolveInput(project.root, artifactInput, \"artifact\");\n const artifact = parsePublishedArtifact(await readDocument(artifactFile, \"artifact\"));\n const plan = createReleasePlan({\n config: project.config,\n environmentName: environment,\n revision: artifact.revision,\n operation: \"release\",\n env: scope.env,\n });\n const receipt = await withRuntime(\n plan,\n \"release\",\n project.root,\n scope,\n (runtime, processOptionsValue) =>\n activateRelease(plan, artifact, runtime, {\n artifactRoot: project.root,\n process: processOptionsValue,\n signal: scope.signal,\n }),\n );\n return withExitCode(\n receipt,\n receipt.state === \"completed\" ? 0 : receipt.state === \"effect-unknown\" ? 7 : 5,\n );\n}\n\nexport async function verify(options: VerifyOptions, scope: Scope): Promise<CommandResult> {\n const environment = requireOption(options.environment, \"environment\");\n const releaseId = requireOption(options.release, \"release\");\n const project = await loadProject(options.config);\n const plan = createPlan({\n config: project.config,\n environmentName: environment,\n operation: \"verify\",\n env: scope.env,\n });\n const health = await withRuntime(plan, \"verify\", project.root, scope, (runtime) =>\n verifyRelease(plan, releaseId, runtime, { signal: scope.signal }),\n );\n return withExitCode(health, health.status === \"healthy\" ? 0 : 5);\n}\n\nexport async function rollback(options: RollbackOptions, scope: Scope): Promise<CommandResult> {\n const environment = requireOption(options.environment, \"environment\");\n const project = await loadProject(options.config);\n const plan = createPlan({\n config: project.config,\n environmentName: environment,\n operation: \"rollback\",\n env: scope.env,\n });\n const receipt = await withRuntime(\n plan,\n \"rollback\",\n project.root,\n scope,\n (runtime, processOptionsValue) =>\n rollbackRelease(plan, options.release, runtime, {\n artifactRoot: project.root,\n process: processOptionsValue,\n signal: scope.signal,\n }),\n );\n return withExitCode(\n receipt,\n receipt.state === \"rolled-back\" ? 0 : receipt.state === \"effect-unknown\" ? 7 : 5,\n );\n}\n\nexport async function reconcile(options: SelectedOptions, scope: Scope): Promise<CommandResult> {\n const environment = requireOption(options.environment, \"environment\");\n const project = await loadProject(options.config);\n const plan = createPlan({\n config: project.config,\n environmentName: environment,\n operation: \"reconcile\",\n env: scope.env,\n });\n const reconciliation = await withRuntime(\n plan,\n \"reconcile\",\n project.root,\n scope,\n (runtime, processOptionsValue) =>\n reconcileRelease(plan, runtime, { process: processOptionsValue, signal: scope.signal }),\n );\n return withExitCode(reconciliation, reconciliation.status === \"safe\" ? 0 : 7);\n}\n","import { createOneDevFactory } from \"@stackonward/onedev-provisioning\";\nimport type { Command as CLICommand } from \"commander\";\n\nimport { executeProvision, type Options as ProvisionOptions } from \"../../provision/command.js\";\nimport { createOneDevProbeExecutor } from \"../../provision/probes/onedev.js\";\nimport { createRegistry } from \"../../provision/registry.js\";\nimport { createSSHDockerConfigFactory } from \"../../provision/sinks/ssh-docker-config.js\";\nimport { guarded } from \"./guard.js\";\nimport { commandEnvironment } from \"./runtime.js\";\n\nexport function registerProvision(deploy: CLICommand): void {\n const provision = deploy\n .command(\"provision\")\n .description(\"Provision deployment platform resources\");\n const addInputs = (command: CLICommand): CLICommand =>\n command\n .option(\"--provider <provider>\", \"Provisioning provider\")\n .option(\"--config <file>\", \"Provisioning configuration\")\n .option(\"--secrets <file>\", \"Owner-only private input JSON\")\n .option(\"--attestation <file>\", \"Owner-only audit attestation JSON\")\n .option(\"--credential-file <file>\", \"Owner-only bootstrap credential file\")\n .option(\"--token-stdin\", \"Read bootstrap credential from standard input\")\n .option(\"--json\", \"Write one receipt JSON document\");\n const execute = (\n command: ProvisionOptions[\"command\"],\n options: Omit<ProvisionOptions, \"command\">,\n ) =>\n guarded((scope) =>\n executeProvision(\n { ...options, command },\n scope,\n createRegistry({\n providers: [createOneDevFactory({ probes: createOneDevProbeExecutor() })],\n sinks: [\n createSSHDockerConfigFactory({\n runner: scope.runner,\n cwd: process.cwd(),\n env: commandEnvironment(scope.env),\n }),\n ],\n }),\n ),\n );\n\n addInputs(\n provision.command(\"validate\").description(\"Validate provisioning inputs locally\"),\n ).action((options: Omit<ProvisionOptions, \"command\">) => execute(\"validate\", options));\n addInputs(provision.command(\"plan\").description(\"Observe and save a signed provisioning plan\"))\n .option(\"--intent <intent>\", \"converge, adopt, rotate, revoke, or verify\")\n .option(\"--out <file>\", \"New signed plan file\")\n .action((options: Omit<ProvisionOptions, \"command\">) => execute(\"plan\", options));\n addInputs(provision.command(\"apply\").description(\"Apply one exact signed provisioning plan\"))\n .option(\"--plan <file>\", \"Signed plan file\")\n .option(\"--yes\", \"Confirm planned effects\")\n .action((options: Omit<ProvisionOptions, \"command\">) => execute(\"apply\", options));\n addInputs(provision.command(\"verify\").description(\"Verify current provisioned resources\")).action(\n (options: Omit<ProvisionOptions, \"command\">) => execute(\"verify\", options),\n );\n addInputs(provision.command(\"reconcile\").description(\"Observe one pending provisioning effect\"))\n .option(\"--remote-id <id>\", \"Bounded remote identity for pending create recovery\")\n .option(\"--out <file>\", \"New signed recovery plan\")\n .action((options: Omit<ProvisionOptions, \"command\">) => execute(\"reconcile\", options));\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { Intent, Json, ProviderFactory } from \"@stackonward/provisioning\";\n\nimport type { Registry } from \"./contracts.js\";\nimport type { LoadedRuntime } from \"./runtime.js\";\n\nimport { loadAttestation, loadConfig, loadSecrets } from \"./config.js\";\nimport { Coordinator } from \"./coordinator.js\";\nimport { ProvisionError } from \"./contracts.js\";\nimport { loadPlanKey, readPlan, writePlan } from \"./plan.js\";\nimport { createPrivateInput, readPrivateText } from \"./secrets.js\";\nimport { createStateStore } from \"./state.js\";\nimport { createFileBackend } from \"../deploy/safety.js\";\nimport { writeReceipt } from \"./receipt.js\";\n\nconst MAX_TOKEN_BYTES = 64 * 1024;\n\nexport interface Scope {\n readonly env: Readonly<Record<string, string>>;\n readonly signal: AbortSignal;\n}\n\nexport interface Options {\n readonly command: \"validate\" | \"plan\" | \"apply\" | \"verify\" | \"reconcile\";\n readonly provider?: string;\n readonly config?: string;\n readonly secrets?: string;\n readonly attestation?: string;\n readonly credentialFile?: string;\n readonly tokenStdin?: boolean;\n readonly intent?: Intent;\n readonly out?: string;\n readonly plan?: string;\n readonly remoteId?: string;\n readonly yes?: boolean;\n}\n\nexport interface Result {\n readonly output: unknown;\n readonly exitCode: number;\n}\n\n/** 供应商命令只编排严格输入和生命周期,协议字段由注册的适配器解析。 */\nexport async function executeProvision(\n options: Options,\n scope: Scope,\n registry: Registry,\n): Promise<Result> {\n const loaded = await loadConfig(\n requirePath(options.config, \"config\"),\n options.provider,\n registry,\n );\n const coordinator = new Coordinator({ signal: scope.signal });\n if (options.command === \"validate\") {\n const secrets = await loadSecrets(options.secrets);\n const attestation = await loadAttestation(options.attestation);\n validateInvocation(\n loaded.providerFactory,\n loaded.config.providerConfig,\n options.command,\n attestation,\n );\n const input = createPrivateInput(secrets, \"validation-only\");\n const references = collectReferences(loaded.config as unknown as Json);\n const lease = await input.resolver.lease([\"bootstrap\", ...references]);\n const runtime = await localRuntime(loaded, registry, lease);\n try {\n return success(coordinator.validate(runtime));\n } finally {\n lease.destroy();\n Buffer.from(runtime.planKey).fill(0);\n }\n }\n\n const bootstrap = await readBootstrap(options, scope.env);\n const secrets = await loadSecrets(options.secrets);\n const attestation = await loadAttestation(options.attestation);\n validateInvocation(\n loaded.providerFactory,\n loaded.config.providerConfig,\n options.command,\n attestation,\n );\n const privateInput = createPrivateInput(secrets, bootstrap);\n const references = collectReferences(loaded.config as unknown as Json);\n const lease = await privateInput.resolver.lease([\"bootstrap\", ...references]);\n const stateDirectory = await prepareStateDirectory(\n loaded.root,\n loaded.config.provider,\n loaded.config.target,\n );\n const planKey = await loadPlanKey(stateDirectory);\n const runtime: LoadedRuntime = {\n config: loaded.config,\n providerFactory: loaded.providerFactory,\n sinks: loaded.sinkConfigs.map(({ id, config }) => ({ id, config, factory: registry.sink(id) })),\n lease,\n secretInput: {\n values: privateInput.commitmentInput,\n attestation: (attestation ?? null) as unknown as Json,\n } as unknown as Json,\n secretRevisions: privateInput.revisions,\n planKey,\n };\n const origin = resolveOrigin(loaded.config.providerConfig);\n const store = createStateStore(createFileBackend(path.join(stateDirectory, \"state.json\")), {\n provider: loaded.config.provider,\n origin,\n target: loaded.config.target,\n });\n\n try {\n if (options.command === \"plan\") {\n const intent = parseIntent(options.intent);\n const output = requirePath(options.out, \"out\");\n const result = await coordinator.plan(runtime, intent, store);\n await writePlan(output, result.plan);\n await writeReceipt(stateDirectory, result.receipt);\n return success(result.receipt);\n }\n if (options.command === \"apply\") {\n if (options.yes !== true) throw new ProvisionError(\"confirmation_required\", 2, \"yes\");\n const plan = await readPlan(requirePath(options.plan, \"plan\"));\n const receipt = await coordinator.apply(runtime, plan, store, (value) =>\n writeReceipt(stateDirectory, value),\n );\n return {\n output: receipt,\n exitCode: receipt.outcome === \"failed\" ? 5 : receipt.outcome === \"unknown\" ? 7 : 0,\n };\n }\n if (options.command === \"verify\") {\n const receipt = await coordinator.verify(runtime);\n await writeReceipt(stateDirectory, receipt);\n return { output: receipt, exitCode: receipt.outcome === \"verified\" ? 0 : 5 };\n }\n const result = await coordinator.reconcile(runtime, store, options.remoteId);\n if (result.recoveryPlan !== undefined) {\n await writePlan(requirePath(options.out, \"out\"), result.recoveryPlan);\n }\n await writeReceipt(stateDirectory, result.receipt);\n return { output: result.receipt, exitCode: result.receipt.outcome === \"unknown\" ? 7 : 0 };\n } finally {\n lease.destroy();\n planKey.fill(0);\n }\n}\n\nasync function localRuntime(\n loaded: Awaited<ReturnType<typeof loadConfig>>,\n registry: Registry,\n lease: import(\"@stackonward/provisioning\").SecretLease,\n): Promise<LoadedRuntime> {\n return {\n config: loaded.config,\n providerFactory: loaded.providerFactory,\n sinks: loaded.sinkConfigs.map(({ id, config }) => ({ id, config, factory: registry.sink(id) })),\n lease,\n secretInput: [],\n secretRevisions: {},\n planKey: Buffer.alloc(32),\n };\n}\n\nasync function readBootstrap(\n options: Options,\n env: Readonly<Record<string, string>>,\n): Promise<string> {\n const selected = [\n env.STACKONWARD_PROVISION_TOKEN === undefined ? undefined : \"env\",\n options.credentialFile === undefined ? undefined : \"file\",\n options.tokenStdin === true ? \"stdin\" : undefined,\n ].filter((value): value is string => value !== undefined);\n if (selected.length !== 1) throw new ProvisionError(\"credential_source_invalid\", 2, \"credential\");\n if (selected[0] === \"env\") return env.STACKONWARD_PROVISION_TOKEN ?? \"\";\n if (selected[0] === \"file\") {\n return (\n await readPrivateText(\n requirePath(options.credentialFile, \"credential-file\"),\n \"credential-file\",\n )\n ).replace(/\\r?\\n$/u, \"\");\n }\n const chunks: Buffer[] = [];\n let bytes = 0;\n for await (const chunk of process.stdin) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n bytes += buffer.byteLength;\n if (bytes > MAX_TOKEN_BYTES) throw new ProvisionError(\"credential_too_large\", 2, \"token-stdin\");\n chunks.push(buffer);\n }\n return Buffer.concat(chunks)\n .toString(\"utf8\")\n .replace(/\\r?\\n$/u, \"\");\n}\n\nfunction collectReferences(value: Json): readonly string[] {\n const references = new Set<string>();\n const visit = (current: Json, parentKey?: string): void => {\n if (Array.isArray(current)) {\n current.forEach((item) => visit(item));\n } else if (current !== null && typeof current === \"object\") {\n const record = current as Record<string, Json>;\n if (record.kind === \"input\" && typeof record.reference === \"string\") {\n references.add(record.reference);\n }\n if (parentKey === \"connection\") {\n for (const key of [\"host\", \"port\", \"user\", \"privateKey\", \"knownHosts\"]) {\n const reference = record[key];\n if (typeof reference === \"string\") references.add(reference);\n }\n }\n Object.entries(record).forEach(([childKey, item]) => visit(item, childKey));\n }\n };\n visit(value);\n references.delete(\"bootstrap\");\n return [...references].sort();\n}\n\nfunction validateInvocation(\n factory: ProviderFactory,\n providerConfig: Json,\n command: Options[\"command\"],\n attestation: Awaited<ReturnType<typeof loadAttestation>>,\n): void {\n const failure = factory.validateInvocation?.({\n config: providerConfig,\n command,\n ...(attestation === undefined ? {} : { attestation: attestation as Json }),\n });\n if (failure !== undefined)\n throw new ProvisionError(failure.code, 3, failure.field ?? \"attestation\");\n}\n\nfunction parseIntent(value: Intent | undefined): Exclude<Intent, \"recover\"> {\n if (\n value !== \"converge\" &&\n value !== \"adopt\" &&\n value !== \"rotate\" &&\n value !== \"revoke\" &&\n value !== \"verify\"\n ) {\n throw new ProvisionError(\"intent_invalid\", 2, \"intent\");\n }\n return value;\n}\n\nasync function prepareStateDirectory(\n root: string,\n provider: string,\n target: string,\n): Promise<string> {\n const scope = createHash(\"sha256\").update(target).digest(\"hex\").slice(0, 24);\n const directory = path.join(root, \".stackonward\", \"provision\", provider, scope);\n await mkdir(directory, { recursive: true, mode: 0o700 });\n const info = await stat(directory);\n if (!info.isDirectory() || (info.mode & 0o077) !== 0)\n throw new ProvisionError(\"state_directory_invalid\", 2);\n return directory;\n}\n\nfunction resolveOrigin(providerConfig: Json): string {\n const value = (providerConfig as Record<string, Json>).origin;\n return typeof value === \"string\" ? new URL(value).origin : \"local\";\n}\n\nfunction requirePath(value: string | undefined, field: string): string {\n if (value === undefined || value.length === 0 || /[\\0\\r\\n]/u.test(value)) {\n throw new ProvisionError(\"option_missing\", 2, field);\n }\n return path.resolve(value);\n}\n\nfunction success(output: unknown): Result {\n return { output, exitCode: 0 };\n}\n","import { lstat, readFile, realpath, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { jsonSchema, type Json } from \"@stackonward/provisioning\";\nimport { z } from \"zod\";\n\nimport type { AuditAttestation, Secrets } from \"./secrets.js\";\nimport type { Config, Registry } from \"./contracts.js\";\n\nimport { ProvisionError } from \"./contracts.js\";\nimport { auditAttestationSchema, readPrivateJson, secretsSchema } from \"./secrets.js\";\n\nconst keySchema = z\n .string()\n .min(1)\n .max(128)\n .regex(/^[a-z][a-z0-9._-]*$/u);\n\nconst configSchema = z\n .object({\n schemaVersion: z.literal(1),\n provider: keySchema,\n target: z.string().min(1).max(255),\n providerConfig: z.unknown(),\n sinks: z.array(z.unknown()).max(32).default([]),\n })\n .strict();\n\nexport interface LoadedConfig {\n readonly config: Config;\n readonly root: string;\n readonly providerFactory: ReturnType<Registry[\"provider\"]>;\n readonly sinkConfigs: readonly {\n readonly id: string;\n readonly config: Json;\n }[];\n}\n\nexport async function loadConfig(\n filename: string,\n provider: string | undefined,\n registry: Registry,\n): Promise<LoadedConfig> {\n const resolved = await resolveRegularFile(filename, \"config\");\n let input: unknown;\n try {\n input = JSON.parse(await readFile(resolved, \"utf8\"));\n } catch {\n throw new ProvisionError(\"configuration_unreadable\", 2, \"config\");\n }\n const parsed = configSchema.parse(input);\n if (provider !== undefined && parsed.provider !== provider) {\n throw new ProvisionError(\"provider_mismatch\", 2, \"provider\");\n }\n const providerFactory = registry.provider(parsed.provider);\n const providerConfig = parseOwned(\n () => providerFactory.parseConfig(parsed.providerConfig),\n \"providerConfig\",\n );\n const sinkConfigs = parsed.sinks.map((raw) => {\n const document = z.object({ kind: keySchema }).passthrough().parse(raw);\n const factory = registry.sink(document.kind);\n return Object.freeze({\n id: factory.id,\n config: parseOwned(() => factory.parseConfig(raw), \"sinks\"),\n });\n });\n const config = Object.freeze({\n schemaVersion: 1 as const,\n provider: parsed.provider,\n target: parsed.target,\n providerConfig: jsonSchema.parse(providerConfig),\n sinks: Object.freeze(sinkConfigs.map(({ config }) => config)),\n });\n return Object.freeze({ config, root: path.dirname(resolved), providerFactory, sinkConfigs });\n}\n\nexport async function loadSecrets(filename: string | undefined): Promise<Secrets | undefined> {\n if (filename === undefined) return undefined;\n return secretsSchema.parse(await readPrivateJson(filename, \"secrets\"));\n}\n\nexport async function loadAttestation(\n filename: string | undefined,\n): Promise<AuditAttestation | undefined> {\n if (filename === undefined) return undefined;\n return auditAttestationSchema.parse(await readPrivateJson(filename, \"attestation\"));\n}\n\nfunction parseOwned(parse: () => Json, field: string) {\n try {\n return parse();\n } catch (error) {\n if (error instanceof ProvisionError) throw error;\n throw new ProvisionError(\"configuration_invalid\", 2, field);\n }\n}\n\nasync function resolveRegularFile(filename: string, field: string): Promise<string> {\n try {\n const requested = path.resolve(filename);\n const info = await lstat(requested);\n const resolved = await realpath(requested);\n if (!info.isFile() || info.isSymbolicLink() || !(await stat(resolved)).isFile())\n throw new Error();\n return resolved;\n } catch {\n throw new ProvisionError(\"file_unreadable\", 2, field);\n }\n}\n","import { constants } from \"node:fs\";\nimport { lstat, open, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { SecretLease, SecretResolver } from \"@stackonward/provisioning\";\nimport { z } from \"zod\";\n\nimport { ProvisionError } from \"./contracts.js\";\n\nconst MAX_PRIVATE_BYTES = 1024 * 1024;\nconst referenceSchema = z\n .string()\n .min(1)\n .max(128)\n .regex(/^[a-z][a-z0-9._:-]*$/u)\n .refine((value) => value !== \"bootstrap\", \"Reserved secret reference\");\n\nexport const secretsSchema = z\n .object({\n schemaVersion: z.literal(1),\n secrets: z.record(\n referenceSchema,\n z.object({ value: z.string().min(1), revision: z.string().min(1).max(128) }).strict(),\n ),\n })\n .strict();\n\nexport const auditAttestationSchema = z\n .object({\n schemaVersion: z.literal(1),\n origin: z\n .string()\n .url()\n .refine((value) => new URL(value).protocol === \"https:\", \"HTTPS required\"),\n inspectedAt: z.string().datetime({ offset: true }),\n inspector: z.string().min(1).max(128),\n evidence: z.string().regex(/^sha256:[0-9a-f]{64}$/u),\n })\n .passthrough();\n\nexport type Secrets = z.infer<typeof secretsSchema>;\nexport type AuditAttestation = z.infer<typeof auditAttestationSchema>;\n\nexport interface PrivateInput {\n readonly resolver: SecretResolver;\n readonly revisions: Readonly<Record<string, string>>;\n readonly commitmentInput: unknown;\n}\n\nclass Lease implements SecretLease {\n readonly #values = new Map<string, Buffer>();\n #destroyed = false;\n\n constructor(values: Readonly<Record<string, string>>) {\n for (const [reference, value] of Object.entries(values)) {\n this.#values.set(reference, Buffer.from(value, \"utf8\"));\n }\n }\n\n read(reference: string): string {\n this.#active();\n const value = this.#values.get(reference);\n if (value === undefined) throw new ProvisionError(\"secret_missing\", 2, reference);\n return value.toString(\"utf8\");\n }\n\n store(reference: string, value: string): void {\n this.#active();\n const previous = this.#values.get(reference);\n previous?.fill(0);\n this.#values.set(reference, Buffer.from(value, \"utf8\"));\n }\n\n has(reference: string): boolean {\n this.#active();\n return this.#values.has(reference);\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n for (const value of this.#values.values()) value.fill(0);\n this.#values.clear();\n this.#destroyed = true;\n }\n\n #active(): void {\n if (this.#destroyed) throw new ProvisionError(\"secret_lease_destroyed\", 5);\n }\n}\n\nexport function createPrivateInput(secrets: Secrets | undefined, bootstrap: string): PrivateInput {\n if (bootstrap.length === 0) throw new ProvisionError(\"credential_missing\", 2, \"credential\");\n const source = secrets?.secrets ?? {};\n const values = Object.fromEntries([\n [\"bootstrap\", bootstrap],\n ...Object.entries(source).map(([reference, item]) => [reference, item.value]),\n ]);\n const revisions = Object.freeze(\n Object.fromEntries(\n Object.entries(source).map(([reference, item]) => [reference, item.revision]),\n ),\n );\n return {\n resolver: {\n async lease(references) {\n for (const reference of references) {\n if (!(reference in values)) throw new ProvisionError(\"secret_missing\", 2, reference);\n }\n return new Lease(values);\n },\n },\n revisions,\n commitmentInput: Object.freeze(\n Object.entries(values)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([reference, value]) => ({ reference, value })),\n ),\n };\n}\n\nexport async function readPrivateJson(filename: string, field: string): Promise<unknown> {\n const document = await readPrivateText(filename, field);\n try {\n return JSON.parse(document) as unknown;\n } catch {\n throw new ProvisionError(\"private_file_unreadable\", 2, field);\n }\n}\n\nexport async function readPrivateText(filename: string, field: string): Promise<string> {\n const resolved = path.resolve(filename);\n let handle;\n try {\n const before = await lstat(resolved);\n if (!before.isFile() || before.isSymbolicLink() || (before.mode & 0o777) !== 0o600) {\n throw new ProvisionError(\"private_file_invalid\", 2, field);\n }\n if (typeof process.getuid === \"function\" && before.uid !== process.getuid()) {\n throw new ProvisionError(\"private_file_owner_invalid\", 2, field);\n }\n if (before.size > MAX_PRIVATE_BYTES)\n throw new ProvisionError(\"private_file_too_large\", 2, field);\n handle = await open(resolved, constants.O_RDONLY | constants.O_NOFOLLOW);\n const opened = await handle.stat();\n if (opened.dev !== before.dev || opened.ino !== before.ino) {\n throw new ProvisionError(\"private_file_changed\", 2, field);\n }\n return await handle.readFile({ encoding: \"utf8\" });\n } catch (error) {\n if (error instanceof ProvisionError || error instanceof z.ZodError) throw error;\n throw new ProvisionError(\"private_file_unreadable\", 2, field);\n } finally {\n await handle?.close();\n }\n}\n\nexport async function assertPrivateDirectory(directory: string): Promise<string> {\n const resolved = path.resolve(directory);\n const info = await stat(resolved);\n if (!info.isDirectory() || (info.mode & 0o077) !== 0) {\n throw new ProvisionError(\"state_directory_invalid\", 2, \"state\");\n }\n return resolved;\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type {\n Capabilities,\n Diagnostic,\n EffectObservation,\n Intent,\n Json,\n Observation,\n ProviderContext,\n ProviderSession,\n SecretLease,\n Verification,\n} from \"@stackonward/provisioning\";\n\nimport type {\n CredentialSink,\n LoadedRuntime,\n Receipt,\n SavedPlan,\n SinkObservation,\n SinkOperation,\n} from \"./runtime.js\";\nimport type { PendingSinkIntent } from \"./contracts.js\";\nimport type { StateSession, StateStore } from \"./state.js\";\n\nimport { digest } from \"./canonical.js\";\nimport { ProvisionError } from \"./contracts.js\";\nimport { buildPlan, verifyPlan } from \"./plan.js\";\nimport { createReceipt } from \"./receipt.js\";\n\nexport interface CoordinatorOptions {\n readonly fetch?: typeof globalThis.fetch;\n readonly now?: () => Date;\n readonly signal: AbortSignal;\n}\n\nexport interface PlanResult {\n readonly plan: SavedPlan;\n readonly receipt: Receipt;\n}\n\nexport interface ReconcileResult {\n readonly receipt: Receipt;\n readonly recoveryPlan?: SavedPlan;\n}\n\nexport class Coordinator {\n readonly #fetch: typeof globalThis.fetch;\n readonly #now: () => Date;\n readonly #signal: AbortSignal;\n\n constructor(options: CoordinatorOptions) {\n this.#fetch = options.fetch ?? globalThis.fetch;\n this.#now = options.now ?? (() => new Date());\n this.#signal = options.signal;\n }\n\n validate(runtime: LoadedRuntime): Receipt {\n this.#active();\n return createReceipt({\n command: \"validate\",\n provider: runtime.config.provider,\n target: runtime.config.target,\n outcome: \"validated\",\n });\n }\n\n async plan(runtime: LoadedRuntime, intent: Intent, store: StateStore): Promise<PlanResult> {\n this.#active();\n const opened = await this.#open(runtime);\n try {\n return await store.withLock(async (state) => {\n const local = await state.load();\n if (local.status !== \"safe\" || local.pending !== undefined) {\n throw new ProvisionError(\"state_blocked\", 7);\n }\n await state.checkpoint(local);\n const observed = await observe(opened.provider, opened.sinks, runtime);\n const providerOperations = await opened.provider.plan(\n opened.desired,\n observed.provider,\n intent,\n );\n const operations = enforceOwnership(\n opened.desired,\n observed.provider,\n providerOperations,\n local,\n intent,\n );\n const sinkOperations = makeSinkOperations(\n runtime,\n observed.sinks,\n local,\n intent,\n operations,\n opened.desired,\n );\n const plan = buildPlan(\n {\n provider: runtime.config.provider,\n target: runtime.config.target,\n intent,\n config: runtime.config as unknown as Json,\n secretInput: runtime.secretInput,\n capabilities: opened.capabilities as unknown as Json,\n snapshot: bindState(observed.snapshot, local),\n operations,\n sinks: sinkOperations,\n now: this.#now(),\n },\n runtime.planKey,\n );\n return {\n plan,\n receipt: createReceipt({\n command: \"plan\",\n provider: runtime.config.provider,\n target: runtime.config.target,\n planId: plan.planId,\n principalId: principalId(opened.capabilities),\n outcome: \"planned\",\n changes: [\n ...operations.map((operation) => ({\n resourceKey: operation.resourceKey,\n action: operation.action,\n effect: \"none\" as const,\n })),\n ...sinkOperations.map((operation) => ({\n resourceKey: sinkResourceKey(operation),\n action: operation.action,\n effect: \"none\" as const,\n })),\n ],\n }),\n };\n });\n } finally {\n await opened.dispose();\n }\n }\n\n async apply(\n runtime: LoadedRuntime,\n plan: SavedPlan,\n store: StateStore,\n persist: (receipt: Receipt) => Promise<unknown> = async () => undefined,\n ): Promise<Receipt> {\n this.#active();\n if (plan.provider !== runtime.config.provider || plan.target !== runtime.config.target) {\n throw new ProvisionError(\"plan_scope_mismatch\", 4);\n }\n const opened = await this.#open(runtime);\n try {\n return await store.withLock(async (state) => {\n const current = await state.load();\n const recovery = plan.intent === \"recover\";\n if (\n recovery\n ? current.status !== \"elevated\" || current.elevation === undefined\n : current.status !== \"safe\" || current.pending !== undefined\n ) {\n throw new ProvisionError(\"state_blocked\", 7);\n }\n const observed = await observe(opened.provider, opened.sinks, runtime);\n verifyPlan(plan, runtime.planKey, this.#now(), {\n config: runtime.config as unknown as Json,\n secretInput: runtime.secretInput,\n capabilities: opened.capabilities as unknown as Json,\n snapshot: bindState(observed.snapshot, current),\n });\n const changes: Receipt[\"changes\"][number][] = [];\n const applyProvider = async (\n operations: readonly import(\"@stackonward/provisioning\").Operation[],\n ): Promise<void> => {\n for (const operation of operations) {\n this.#active();\n if (operation.action === \"retain\") continue;\n const attemptId = randomUUID();\n const pending = {\n attemptId,\n operation,\n recordedAt: this.#now().toISOString(),\n };\n if (recovery) await state.recordRecovery(pending);\n else await state.recordProvider(pending);\n if (operation.action === \"adopt\") {\n const binding = observed.provider.resources.find(\n ({ resourceKey }) => resourceKey === operation.resourceKey,\n )?.binding;\n if (binding === undefined) {\n await state.fail(attemptId);\n throw new ProvisionError(\"adoption_binding_missing\", 4);\n }\n await state.acknowledge(attemptId, binding);\n changes.push({\n resourceKey: operation.resourceKey,\n ...(binding.remoteId === undefined ? {} : { remoteId: binding.remoteId }),\n action: \"adopt\",\n effect: \"none\",\n });\n continue;\n }\n let result;\n try {\n result = await opened.provider.apply(operation, {\n attemptId,\n signal: this.#signal,\n lease: runtime.lease,\n });\n } catch (error) {\n if (knownNoEffect(error)) {\n await state.fail(attemptId);\n throw error;\n }\n await state.block(attemptId);\n throw new ProvisionError(\"provider_effect_unknown\", 7);\n }\n if (result.effect === \"unknown\") {\n await state.block(attemptId);\n const receipt = createReceipt({\n command: \"apply\",\n provider: runtime.config.provider,\n target: runtime.config.target,\n planId: plan.planId,\n principalId: principalId(opened.capabilities),\n outcome: \"unknown\",\n changes: [\n ...changes,\n {\n resourceKey: operation.resourceKey,\n action: operation.action,\n effect: \"unknown\",\n },\n ],\n diagnostics: result.diagnostic === undefined ? [] : [result.diagnostic],\n });\n await persist(receipt);\n throw new ProvisionError(result.diagnostic.code, 7);\n }\n const binding =\n result.effect === \"acknowledged\" && operation.action !== \"revoke\"\n ? result.binding\n : undefined;\n await state.acknowledge(\n attemptId,\n binding,\n plan.intent === \"revoke\" && operation.action === \"revoke\"\n ? operation.resourceKey\n : undefined,\n );\n changes.push({\n resourceKey: operation.resourceKey,\n ...(result.effect === \"acknowledged\" && result.binding?.remoteId !== undefined\n ? { remoteId: result.binding.remoteId }\n : {}),\n action: operation.action,\n effect: result.effect,\n });\n }\n };\n const retirement =\n plan.intent === \"rotate\" ? plan.operations.filter(isRetirementOperation) : [];\n const afterSink = [\n ...retirement.filter((operation) => operation.action === \"revoke\"),\n ...retirement.filter((operation) => operation.action !== \"revoke\"),\n ];\n const beforeSink =\n plan.intent === \"rotate\"\n ? plan.operations.filter((operation) => !isRetirementOperation(operation))\n : plan.operations;\n await applyProvider(beforeSink);\n for (const operation of plan.sinks) {\n this.#active();\n if (operation.action === \"retain\") continue;\n const sink = opened.sinks.find(({ session }) => session.id === operation.sink)?.session;\n if (sink === undefined) throw new ProvisionError(\"sink_unavailable\", 3);\n const attemptId = randomUUID();\n await state.recordSink({ attemptId, operation, recordedAt: this.#now().toISOString() });\n let result;\n try {\n result = await sink.apply(operation, runtime.lease);\n } catch (error) {\n if (knownNoEffect(error)) {\n await state.fail(attemptId);\n throw error;\n }\n await state.block(attemptId);\n throw new ProvisionError(\"sink_effect_unknown\", 7);\n }\n if (result.effect === \"unknown\") {\n await state.block(attemptId);\n const receipt = createReceipt({\n command: \"apply\",\n provider: runtime.config.provider,\n target: runtime.config.target,\n planId: plan.planId,\n principalId: principalId(opened.capabilities),\n outcome: \"unknown\",\n changes: [\n ...changes,\n {\n resourceKey: sinkResourceKey(operation),\n action: operation.action,\n effect: \"unknown\",\n },\n ],\n diagnostics: result.diagnostic === undefined ? [] : [result.diagnostic],\n });\n await persist(receipt);\n throw new ProvisionError(result.diagnostic.code, 7);\n }\n const binding =\n result.effect === \"acknowledged\"\n ? (result.binding ?? sinkBinding(operation, current.bindings))\n : undefined;\n await state.acknowledge(\n attemptId,\n operation.action === \"revoke\" ? undefined : binding,\n operation.action === \"revoke\" ? sinkResourceKey(operation) : undefined,\n );\n changes.push({\n resourceKey: sinkResourceKey(operation),\n action: operation.action,\n effect: result.effect,\n });\n }\n await applyProvider(afterSink);\n const verification: Verification = recovery\n ? {\n status: \"verified\",\n resources: changes.map(({ resourceKey }) => ({\n resourceKey,\n evidence: \"exact\",\n status: \"deny\",\n })),\n diagnostics: [],\n }\n : plan.intent === \"revoke\"\n ? await verifyRevocation(opened, plan, runtime)\n : await verifyAll(opened.provider, opened.sinks, opened.desired, runtime);\n if (verification.status !== \"verified\") throw new ProvisionError(\"verification_failed\", 5);\n const receipt = createReceipt({\n command: \"apply\",\n provider: runtime.config.provider,\n target: runtime.config.target,\n planId: plan.planId,\n principalId: principalId(opened.capabilities),\n outcome: changes.length === 0 ? \"unchanged\" : \"changed\",\n changes,\n verification,\n });\n try {\n await persist(receipt);\n } catch {\n await state.blockEvidence(receipt.executionId);\n throw new ProvisionError(\"receipt_write_failed\", 7);\n }\n await state.complete(\n receipt.executionId,\n runtime.secretRevisions,\n opened.desired.map(({ resourceKey, managedFields }) => ({\n resourceKey,\n fields: managedFields,\n })),\n );\n return receipt;\n });\n } finally {\n await opened.dispose();\n }\n }\n\n async verify(runtime: LoadedRuntime): Promise<Receipt> {\n const opened = await this.#open(runtime);\n try {\n const verification = await verifyAll(opened.provider, opened.sinks, opened.desired, runtime);\n return createReceipt({\n command: \"verify\",\n provider: runtime.config.provider,\n target: runtime.config.target,\n principalId: principalId(opened.capabilities),\n outcome: verification.status === \"verified\" ? \"verified\" : \"failed\",\n verification,\n diagnostics: verification.diagnostics,\n });\n } finally {\n await opened.dispose();\n }\n }\n\n async reconcile(\n runtime: LoadedRuntime,\n store: StateStore,\n remoteId?: string,\n ): Promise<ReconcileResult> {\n const opened = await this.#open(runtime);\n try {\n return await store.withLock(async (state) => {\n const current = await state.load();\n if (current.pending === undefined) {\n return {\n receipt: createReceipt({\n command: \"reconcile\",\n provider: runtime.config.provider,\n target: runtime.config.target,\n outcome: \"unchanged\",\n }),\n };\n }\n const pending = withRemoteId(current.pending, remoteId);\n const result = isSinkPending(pending)\n ? await reconcileSink(opened.sinks, pending, runtime.lease)\n : await opened.provider.reconcile(pending, runtime.lease);\n if (result.effect === \"unknown\") {\n await state.block(pending.attemptId);\n return {\n receipt: createReceipt({\n command: \"reconcile\",\n provider: runtime.config.provider,\n target: runtime.config.target,\n outcome: \"unknown\",\n diagnostics: result.diagnostic === undefined ? [] : [result.diagnostic],\n }),\n };\n }\n await state.acknowledge(\n pending.attemptId,\n result.effect === \"acknowledged\" ? result.binding : undefined,\n pending.operation.action === \"revoke\"\n ? isSinkPending(pending)\n ? sinkResourceKey(pending.operation)\n : pending.operation.resourceKey\n : undefined,\n );\n return {\n receipt: createReceipt({\n command: \"reconcile\",\n provider: runtime.config.provider,\n target: runtime.config.target,\n outcome: \"changed\",\n }),\n };\n });\n } finally {\n await opened.dispose();\n }\n }\n\n async #open(runtime: LoadedRuntime): Promise<Opened> {\n this.#active();\n const diagnostics: Diagnostic[] = [];\n const context: ProviderContext = {\n fetch: this.#fetch,\n now: this.#now,\n signal: this.#signal,\n lease: runtime.lease,\n diagnose: (diagnostic) => diagnostics.push(diagnostic),\n };\n const provider = await runtime.providerFactory.configure(\n runtime.config.providerConfig,\n context,\n );\n const sinks: OpenedSink[] = [];\n try {\n for (const sink of runtime.sinks) {\n sinks.push({\n config: sink.config,\n session: await sink.factory.configure(sink.config, {\n signal: this.#signal,\n now: this.#now,\n }),\n });\n }\n const capabilities = await provider.discover();\n if (capabilities.provider !== runtime.config.provider || capabilities.protocolVersion !== 1) {\n throw new ProvisionError(\"provider_incompatible\", 3);\n }\n return {\n provider,\n sinks,\n capabilities,\n desired: provider.desired(),\n diagnostics,\n dispose: async () => {\n const settled = await Promise.allSettled([\n provider.dispose(),\n ...sinks.map(({ session }) => session.dispose()),\n ]);\n if (settled.some(({ status }) => status === \"rejected\")) {\n throw new ProvisionError(\"adapter_cleanup_failed\", 5);\n }\n },\n };\n } catch (error) {\n await Promise.allSettled([\n provider.dispose(),\n ...sinks.map(({ session }) => session.dispose()),\n ]);\n throw error;\n }\n }\n\n #active(): void {\n if (this.#signal.aborted) throw new ProvisionError(\"cancelled\", 130);\n }\n}\n\ninterface OpenedSink {\n readonly config: Json;\n readonly session: CredentialSink;\n}\n\ninterface Opened {\n readonly provider: ProviderSession;\n readonly sinks: readonly OpenedSink[];\n readonly capabilities: Capabilities;\n readonly desired: ReturnType<ProviderSession[\"desired\"]>;\n readonly diagnostics: readonly Diagnostic[];\n dispose(): Promise<void>;\n}\n\nasync function observe(\n provider: ProviderSession,\n sinks: readonly OpenedSink[],\n runtime: LoadedRuntime,\n): Promise<{\n readonly provider: Observation;\n readonly sinks: readonly SinkObservation[];\n readonly snapshot: Json;\n}> {\n const desired = provider.desired();\n const providerObservation = await provider.observe(desired);\n const sinkObservations: SinkObservation[] = [];\n for (const sink of sinks)\n sinkObservations.push(await sink.session.observe(sink.config, runtime.lease));\n return {\n provider: providerObservation,\n sinks: sinkObservations,\n snapshot: {\n provider: providerObservation,\n sinks: sinkObservations.map((item, index) => ({\n id: sinks[index]?.session.id ?? \"\",\n ...item,\n })),\n } as unknown as Json,\n };\n}\n\nfunction makeSinkOperations(\n runtime: LoadedRuntime,\n observed: readonly SinkObservation[],\n state: import(\"./contracts.js\").State,\n intent: Intent,\n providerOperations: readonly import(\"@stackonward/provisioning\").Operation[],\n desired: readonly import(\"@stackonward/provisioning\").DesiredResource[],\n): readonly SinkOperation[] {\n return runtime.sinks.map((sink, index) => {\n const current = observed[index];\n if (current === undefined) throw new ProvisionError(\"sink_observation_missing\", 3);\n const desiredDigest = digest(sink.config);\n const initialAction =\n intent === \"revoke\"\n ? current.status === \"absent\"\n ? \"retain\"\n : \"revoke\"\n : intent === \"rotate\"\n ? \"rotate\"\n : current.status === \"absent\"\n ? \"create\"\n : current.status === \"present\" && current.observedDigest === desiredDigest\n ? \"retain\"\n : \"update\";\n const document = sink.config as Record<string, Json>;\n const key = typeof document.key === \"string\" ? document.key : \"\";\n const credential = typeof document.credential === \"string\" ? document.credential : \"\";\n if (key.length === 0 || credential.length === 0) {\n throw new ProvisionError(\"sink_identity_missing\", 2, \"sinks\");\n }\n const owned = state.bindings.some(({ resourceKey }) => resourceKey === `sink.${key}`);\n if (current.status === \"present\" && !owned && intent !== \"adopt\" && intent !== \"verify\") {\n throw new ProvisionError(\"ownership_conflict\", 4);\n }\n const action =\n intent === \"verify\"\n ? \"retain\"\n : intent === \"adopt\" && current.status === \"present\" && !owned\n ? \"update\"\n : initialAction;\n return {\n operationId: `${action}-sink.${key}`,\n sink: sink.id,\n credential,\n action,\n dependencies: [`credential.${credential}`],\n beforeDigest: current.observedDigest,\n desiredDigest,\n plan: {\n config: sink.config,\n probeDigest: resolveProbeDigest(providerOperations, desired),\n },\n };\n });\n}\n\nfunction sinkBinding(\n operation: SinkOperation,\n bindings: readonly import(\"@stackonward/provisioning\").Binding[],\n): import(\"@stackonward/provisioning\").Binding {\n const document = operation.plan as Record<string, Json>;\n const config = document.config as Record<string, Json>;\n const key = typeof config.key === \"string\" ? config.key : operation.sink;\n const previous = bindings.find(({ resourceKey }) => resourceKey === `sink.${key}`);\n return {\n resourceKey: `sink.${key}`,\n generation:\n operation.action === \"rotate\" ? (previous?.generation ?? 0) + 1 : (previous?.generation ?? 0),\n };\n}\n\nfunction sinkResourceKey(operation: SinkOperation): string {\n const document = operation.plan as Record<string, Json>;\n const config = document.config as Record<string, Json>;\n return `sink.${typeof config.key === \"string\" ? config.key : operation.sink}`;\n}\n\nfunction resolveProbeDigest(\n operations: readonly import(\"@stackonward/provisioning\").Operation[],\n desired: readonly import(\"@stackonward/provisioning\").DesiredResource[],\n): string {\n let candidate: string | undefined;\n for (const operation of operations) {\n if (operation.kind !== \"probe\") continue;\n const providerPlan = operation.providerPlan as Record<string, Json>;\n const probe = providerPlan.probe;\n if (probe === null || typeof probe !== \"object\" || Array.isArray(probe)) continue;\n const planned = probe as Record<string, Json>;\n if (typeof planned.digest === \"string\" && /^sha256:[0-9a-f]{64}$/u.test(planned.digest)) {\n if (providerPlan.writeProbe === true) return planned.digest;\n candidate ??= planned.digest;\n }\n }\n if (candidate !== undefined) return candidate;\n for (const resource of desired) {\n if (\n resource.kind !== \"probe\" ||\n resource.desired === null ||\n typeof resource.desired !== \"object\" ||\n Array.isArray(resource.desired)\n ) {\n continue;\n }\n const planned = resource.desired as Record<string, Json>;\n if (typeof planned.digest === \"string\" && /^sha256:[0-9a-f]{64}$/u.test(planned.digest)) {\n if (planned.writeProbe === true) return planned.digest;\n candidate ??= planned.digest;\n }\n }\n if (candidate !== undefined) return candidate;\n throw new ProvisionError(\"probe_digest_missing\", 2, \"providerConfig.probes\");\n}\n\nfunction isRetirementOperation(operation: import(\"@stackonward/provisioning\").Operation): boolean {\n if (operation.action === \"revoke\") return true;\n const providerPlan = operation.providerPlan as Record<string, Json>;\n return providerPlan.target === \"retired\";\n}\n\nfunction enforceOwnership(\n desired: ReturnType<ProviderSession[\"desired\"]>,\n observed: Observation,\n operations: readonly import(\"@stackonward/provisioning\").Operation[],\n state: import(\"./contracts.js\").State,\n intent: Intent,\n): readonly import(\"@stackonward/provisioning\").Operation[] {\n const owned = new Set(state.bindings.map(({ resourceKey }) => resourceKey));\n const operationKeys = new Set(operations.map(({ resourceKey }) => resourceKey));\n const unbound = observed.resources.filter(\n ({ status, binding, resourceKey }) =>\n status === \"present\" && binding !== undefined && !owned.has(resourceKey),\n );\n if (unbound.length > 0 && intent !== \"adopt\" && intent !== \"verify\") {\n throw new ProvisionError(\"ownership_conflict\", 4);\n }\n if (intent !== \"adopt\") return operations;\n const adopted = unbound\n .filter(({ resourceKey }) => !operationKeys.has(resourceKey))\n .map((resource) => {\n const target = desired.find(({ resourceKey }) => resourceKey === resource.resourceKey);\n if (target === undefined) throw new ProvisionError(\"observation_incomplete\", 3);\n const providerPlan: Json = {\n remoteId: resource.binding?.remoteId ?? null,\n observedDigest: resource.observedDigest,\n };\n return {\n operationId: `adopt-${resource.resourceKey}`,\n resourceKey: resource.resourceKey,\n kind: target.kind,\n action: \"adopt\" as const,\n dependencies: target.dependencies,\n beforeDigest: resource.observedDigest,\n desiredDigest: digest(target.desired),\n providerPlan,\n providerPlanDigest: digest(providerPlan),\n };\n });\n const order = new Map(desired.map(({ resourceKey }, index) => [resourceKey, index]));\n return [...operations, ...adopted].sort(\n (left, right) =>\n (order.get(left.resourceKey) ?? Number.MAX_SAFE_INTEGER) -\n (order.get(right.resourceKey) ?? Number.MAX_SAFE_INTEGER) ||\n left.operationId.localeCompare(right.operationId),\n );\n}\n\nasync function verifyAll(\n provider: ProviderSession,\n sinks: readonly OpenedSink[],\n desired: ReturnType<ProviderSession[\"desired\"]>,\n runtime: LoadedRuntime,\n): Promise<Verification> {\n const results = [await provider.verify(desired, runtime.lease)];\n for (const sink of sinks) results.push(await sink.session.verify(sink.config, runtime.lease));\n const resources = results.flatMap(({ resources }) => resources);\n const diagnostics = results.flatMap(({ diagnostics }) => diagnostics);\n const status = results.some((result) => result.status === \"unknown\")\n ? \"unknown\"\n : results.every((result) => result.status === \"verified\")\n ? \"verified\"\n : \"failed\";\n return { status, resources, diagnostics };\n}\n\nasync function verifyRevocation(\n opened: Opened,\n plan: SavedPlan,\n runtime: LoadedRuntime,\n): Promise<Verification> {\n const revoked = new Set(\n plan.operations\n .filter(({ action }) => action === \"revoke\")\n .map(({ resourceKey }) => resourceKey),\n );\n const retained = opened.desired.filter(\n ({ resourceKey, kind, desired }) =>\n !revoked.has(resourceKey) &&\n kind !== \"credential\" &&\n kind !== \"grant\" &&\n (kind !== \"probe\" ||\n (desired !== null &&\n typeof desired === \"object\" &&\n !Array.isArray(desired) &&\n (desired as Record<string, Json>).retainOnRevoke === true)),\n );\n const retainedVerification = await opened.provider.verify(retained, runtime.lease);\n const observation = await opened.provider.observe(opened.desired);\n const resources = [...retainedVerification.resources];\n for (const resourceKey of revoked) {\n const observed = observation.resources.find((resource) => resource.resourceKey === resourceKey);\n resources.push({\n resourceKey,\n evidence: \"exact\",\n status:\n observed?.status === \"absent\"\n ? \"deny\"\n : observed?.status === \"unknown\"\n ? \"unknown\"\n : \"mismatch\",\n });\n }\n for (const operation of plan.sinks) {\n const sink = opened.sinks.find(({ session }) => session.id === operation.sink);\n if (sink === undefined) throw new ProvisionError(\"sink_unavailable\", 3);\n const observed = await sink.session.observe(sink.config, runtime.lease);\n resources.push({\n resourceKey: sinkResourceKey(operation),\n evidence: \"exact\",\n status:\n observed.status === \"absent\"\n ? \"deny\"\n : observed.status === \"unknown\"\n ? \"unknown\"\n : \"mismatch\",\n });\n }\n const diagnostics = retainedVerification.diagnostics;\n const status = resources.some(({ status }) => status === \"unknown\")\n ? \"unknown\"\n : resources.every(({ status }) => status === \"match\" || status === \"allow\" || status === \"deny\")\n ? \"verified\"\n : \"failed\";\n return { status, resources, diagnostics };\n}\n\nasync function reconcileSink(\n sinks: readonly OpenedSink[],\n pending: Extract<\n NonNullable<import(\"./contracts.js\").State[\"pending\"]>,\n { operation: { sink: string } }\n >,\n lease: SecretLease,\n): Promise<EffectObservation> {\n const sink = sinks.find(({ session }) => session.id === pending.operation.sink)?.session;\n if (sink === undefined) throw new ProvisionError(\"sink_unavailable\", 3);\n return sink.reconcile(pending, lease);\n}\n\nfunction withRemoteId<T extends NonNullable<import(\"./contracts.js\").State[\"pending\"]>>(\n pending: T,\n remoteId: string | undefined,\n): T {\n if (remoteId === undefined || \"sink\" in pending.operation) return pending;\n if (!/^\\d+$/u.test(remoteId)) throw new ProvisionError(\"remote_id_invalid\", 2, \"remote-id\");\n return {\n ...pending,\n operation: {\n ...pending.operation,\n providerPlan: { ...(pending.operation.providerPlan as Record<string, Json>), remoteId },\n },\n } as T;\n}\n\nfunction isSinkPending(\n pending: NonNullable<import(\"./contracts.js\").State[\"pending\"]>,\n): pending is PendingSinkIntent {\n return \"sink\" in pending.operation;\n}\n\nfunction principalId(capabilities: Capabilities): string | undefined {\n const evidence = capabilities.evidence as Record<string, Json>;\n const value = evidence.principalId;\n return typeof value === \"number\" || typeof value === \"string\" ? String(value) : undefined;\n}\n\nfunction bindState(snapshot: Json, state: import(\"./contracts.js\").State): Json {\n return {\n remote: snapshot,\n state: {\n lineage: state.lineage,\n serial: state.serial,\n status: state.status,\n bindings: state.bindings,\n },\n } as unknown as Json;\n}\n\nfunction knownNoEffect(error: unknown): boolean {\n if (error === null || typeof error !== \"object\") return false;\n const record = error as Readonly<Record<string, unknown>>;\n if (record.effect === \"none\") return true;\n return typeof record.status === \"number\" && record.status >= 400 && record.status < 500;\n}\n","import { createHash, createHmac, timingSafeEqual } from \"node:crypto\";\n\nexport function canonical(value: unknown): string {\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`;\n return `{${Object.entries(value as Readonly<Record<string, unknown>>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`)\n .join(\",\")}}`;\n}\n\nexport function digest(value: unknown): string {\n return `sha256:${createHash(\"sha256\").update(canonical(value)).digest(\"hex\")}`;\n}\n\nexport function hmac(key: Uint8Array, value: unknown): string {\n return `hmac-sha256:${createHmac(\"sha256\", key).update(canonical(value)).digest(\"hex\")}`;\n}\n\nexport function equalHmac(left: string, right: string): boolean {\n const pattern = /^hmac-sha256:([0-9a-f]{64})$/u;\n const leftMatch = pattern.exec(left);\n const rightMatch = pattern.exec(right);\n if (!leftMatch?.[1] || !rightMatch?.[1]) return false;\n return timingSafeEqual(Buffer.from(leftMatch[1], \"hex\"), Buffer.from(rightMatch[1], \"hex\"));\n}\n","import { randomBytes, randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { lstat, mkdir, open, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport type { SavedPlan, SinkOperation } from \"./contracts.js\";\n\nimport { canonical, digest, equalHmac, hmac } from \"./canonical.js\";\nimport { ProvisionError } from \"./contracts.js\";\n\nconst MAX_PLAN_BYTES = 4 * 1024 * 1024;\nconst PLAN_TTL_MS = 15 * 60 * 1_000;\nconst hmacSchema = z.string().regex(/^hmac-sha256:[0-9a-f]{64}$/u);\nconst digestSchema = z.string().regex(/^sha256:[0-9a-f]{64}$/u);\nconst operationSchema = z\n .object({\n operationId: z.string().min(1).max(255),\n resourceKey: z.string().min(1).max(255),\n kind: z.enum([\n \"feature\",\n \"identity\",\n \"variable\",\n \"secret\",\n \"role\",\n \"credential\",\n \"grant\",\n \"probe\",\n ]),\n action: z.enum([\"create\", \"update\", \"retain\", \"adopt\", \"rotate\", \"revoke\"]),\n dependencies: z.array(z.string().min(1).max(255)).max(256),\n beforeDigest: digestSchema,\n desiredDigest: digestSchema,\n providerPlan: z.unknown(),\n providerPlanDigest: digestSchema,\n })\n .strict();\nconst sinkOperationSchema = z\n .object({\n operationId: z.string().min(1).max(255),\n sink: z.string().min(1).max(128),\n credential: z.string().min(1).max(128),\n action: z.enum([\"create\", \"update\", \"retain\", \"rotate\", \"revoke\"]),\n dependencies: z.array(z.string().min(1).max(255)).max(256),\n beforeDigest: digestSchema,\n desiredDigest: digestSchema,\n plan: z.unknown(),\n })\n .strict();\nconst savedPlanSchema = z\n .object({\n schemaVersion: z.literal(1),\n protocolVersion: z.literal(1),\n provider: z.string().min(1).max(128),\n target: z.string().min(1).max(255),\n intent: z.enum([\"converge\", \"adopt\", \"rotate\", \"revoke\", \"verify\", \"recover\"]),\n planId: z.uuid(),\n configDigest: digestSchema,\n secretCommitment: hmacSchema,\n capabilityDigest: digestSchema,\n snapshotCommitment: hmacSchema,\n createdAt: z.string().datetime({ offset: true }),\n expiresAt: z.string().datetime({ offset: true }),\n operations: z.array(operationSchema).max(4096),\n sinks: z.array(sinkOperationSchema).max(32),\n signature: hmacSchema,\n })\n .strict();\n\nexport interface PlanInput {\n readonly provider: string;\n readonly target: string;\n readonly intent: SavedPlan[\"intent\"];\n readonly config: import(\"@stackonward/provisioning\").Json;\n readonly secretInput: import(\"@stackonward/provisioning\").Json;\n readonly capabilities: import(\"@stackonward/provisioning\").Json;\n readonly snapshot: import(\"@stackonward/provisioning\").Json;\n readonly operations: SavedPlan[\"operations\"];\n readonly sinks: readonly SinkOperation[];\n readonly now: Date;\n}\n\nexport function buildPlan(input: PlanInput, key: Uint8Array): SavedPlan {\n const unsigned = {\n schemaVersion: 1 as const,\n protocolVersion: 1 as const,\n provider: input.provider,\n target: input.target,\n intent: input.intent,\n planId: randomUUID(),\n configDigest: digest(input.config),\n secretCommitment: hmac(key, input.secretInput),\n capabilityDigest: digest(input.capabilities),\n snapshotCommitment: hmac(key, input.snapshot),\n createdAt: input.now.toISOString(),\n expiresAt: new Date(input.now.getTime() + PLAN_TTL_MS).toISOString(),\n operations: input.operations,\n sinks: input.sinks,\n };\n return savedPlanSchema.parse({ ...unsigned, signature: hmac(key, unsigned) }) as SavedPlan;\n}\n\nexport function verifyPlan(\n plan: SavedPlan,\n key: Uint8Array,\n now: Date,\n commitments: Pick<PlanInput, \"config\" | \"secretInput\" | \"capabilities\" | \"snapshot\">,\n): void {\n const { signature, ...unsigned } = plan;\n if (!equalHmac(signature, hmac(key, unsigned)))\n throw new ProvisionError(\"plan_signature_invalid\", 4);\n if (Date.parse(plan.expiresAt) <= now.getTime()) throw new ProvisionError(\"plan_expired\", 4);\n if (plan.configDigest !== digest(commitments.config))\n throw new ProvisionError(\"config_changed\", 4);\n if (!equalHmac(plan.secretCommitment, hmac(key, commitments.secretInput))) {\n throw new ProvisionError(\"secrets_changed\", 4);\n }\n if (plan.capabilityDigest !== digest(commitments.capabilities)) {\n throw new ProvisionError(\"capabilities_changed\", 4);\n }\n if (!equalHmac(plan.snapshotCommitment, hmac(key, commitments.snapshot))) {\n throw new ProvisionError(\"snapshot_changed\", 4);\n }\n}\n\nexport async function readPlan(filename: string): Promise<SavedPlan> {\n try {\n const document = await readPrivateFile(filename, MAX_PLAN_BYTES);\n return savedPlanSchema.parse(JSON.parse(document.toString(\"utf8\"))) as SavedPlan;\n } catch (error) {\n if (error instanceof z.ZodError) throw error;\n throw new ProvisionError(\"plan_unreadable\", 2, \"plan\");\n }\n}\n\nexport async function writePlan(filename: string, plan: SavedPlan): Promise<void> {\n let handle;\n try {\n handle = await open(path.resolve(filename), \"wx\", 0o600);\n await handle.writeFile(`${JSON.stringify(plan, null, 2)}\\n`, \"utf8\");\n await handle.sync();\n } catch (error) {\n throw new ProvisionError(\"plan_write_failed\", 2, \"out\");\n } finally {\n await handle?.close();\n }\n}\n\nexport async function loadPlanKey(directory: string): Promise<Buffer> {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n const info = await stat(directory);\n if (!info.isDirectory() || (info.mode & 0o077) !== 0)\n throw new ProvisionError(\"state_directory_invalid\", 2);\n const filename = path.join(directory, \"plan.key\");\n try {\n const current = await readPrivateFile(filename, 32);\n if (current.byteLength !== 32) throw new Error();\n return current;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n const key = randomBytes(32);\n const handle = await open(\n filename,\n constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY,\n 0o600,\n );\n try {\n await handle.writeFile(key);\n await handle.sync();\n } finally {\n await handle.close();\n }\n return key;\n }\n throw new ProvisionError(\"plan_key_invalid\", 2);\n }\n}\n\nasync function readPrivateFile(filename: string, maxBytes: number): Promise<Buffer> {\n const info = await lstat(filename);\n if (\n !info.isFile() ||\n info.isSymbolicLink() ||\n (info.mode & 0o777) !== 0o600 ||\n info.size > maxBytes ||\n (typeof process.getuid === \"function\" && info.uid !== process.getuid())\n ) {\n throw new Error();\n }\n const handle = await open(filename, constants.O_RDONLY | constants.O_NOFOLLOW);\n try {\n const opened = await handle.stat();\n if (opened.dev !== info.dev || opened.ino !== info.ino) throw new Error();\n return await handle.readFile();\n } finally {\n await handle.close();\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { Diagnostic, Verification } from \"@stackonward/provisioning\";\n\nimport type { CommandName, Receipt } from \"./contracts.js\";\n\nexport function createReceipt(input: {\n readonly command: CommandName;\n readonly provider: string;\n readonly target: string;\n readonly outcome: Receipt[\"outcome\"];\n readonly planId?: string;\n readonly principalId?: string;\n readonly changes?: Receipt[\"changes\"];\n readonly verification?: Verification;\n readonly diagnostics?: readonly Diagnostic[];\n}): Receipt {\n return Object.freeze({\n schemaVersion: 1,\n command: input.command,\n provider: input.provider,\n target: input.target,\n executionId: randomUUID(),\n ...(input.planId === undefined ? {} : { planId: input.planId }),\n ...(input.principalId === undefined ? {} : { principalId: input.principalId }),\n outcome: input.outcome,\n changes: Object.freeze([...(input.changes ?? [])]),\n ...(input.verification === undefined ? {} : { verification: input.verification }),\n diagnostics: Object.freeze([...(input.diagnostics ?? [])]),\n });\n}\n\nexport async function writeReceipt(directory: string, receipt: Receipt): Promise<string> {\n const targetDirectory = path.join(directory, \"receipts\");\n await mkdir(targetDirectory, { recursive: true, mode: 0o700 });\n const info = await stat(targetDirectory);\n if (!info.isDirectory() || (info.mode & 0o077) !== 0)\n throw new Error(\"receipt_directory_invalid\");\n const filename = path.join(targetDirectory, `${receipt.executionId}.json`);\n const handle = await open(filename, \"wx\", 0o600);\n try {\n await handle.writeFile(`${JSON.stringify(receipt, null, 2)}\\n`, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n return filename;\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport { z } from \"zod\";\n\nimport {\n createTypedStore,\n type StateCodec,\n type StoreBackend,\n type TypedSession,\n} from \"../deploy/safety.js\";\nimport type { PendingSinkIntent, State } from \"./contracts.js\";\n\nimport { ProvisionError } from \"./contracts.js\";\n\nconst digestSchema = z.string().regex(/^sha256:[0-9a-f]{64}$/u);\nconst bindingSchema = z\n .object({\n resourceKey: z.string().min(1).max(255),\n remoteId: z.string().min(1).max(512).optional(),\n generation: z.number().int().nonnegative(),\n })\n .strict();\nconst providerOperationSchema = z\n .object({\n operationId: z.string().min(1).max(255),\n resourceKey: z.string().min(1).max(255),\n kind: z.enum([\n \"feature\",\n \"identity\",\n \"variable\",\n \"secret\",\n \"role\",\n \"credential\",\n \"grant\",\n \"probe\",\n ]),\n action: z.enum([\"create\", \"update\", \"retain\", \"adopt\", \"rotate\", \"revoke\"]),\n dependencies: z.array(z.string().min(1).max(255)).max(256),\n beforeDigest: digestSchema,\n desiredDigest: digestSchema,\n providerPlan: z.unknown(),\n providerPlanDigest: digestSchema,\n })\n .strict();\nconst pendingIntentSchema = z\n .object({\n attemptId: z.string().min(1).max(255),\n operation: providerOperationSchema,\n recordedAt: z.string().datetime({ offset: true }),\n })\n .strict();\nconst sinkOperationSchema = z\n .object({\n operationId: z.string().min(1).max(255),\n sink: z.string().min(1).max(128),\n credential: z.string().min(1).max(128),\n action: z.enum([\"create\", \"update\", \"retain\", \"rotate\", \"revoke\"]),\n dependencies: z.array(z.string().min(1).max(255)).max(256),\n beforeDigest: digestSchema,\n desiredDigest: digestSchema,\n plan: z.unknown(),\n })\n .strict();\nconst pendingSinkSchema = z\n .object({\n attemptId: z.uuid(),\n operation: sinkOperationSchema,\n recordedAt: z.string().datetime({ offset: true }),\n })\n .strict();\nconst stateSchema = z\n .object({\n schemaVersion: z.literal(1),\n lineage: z.uuid(),\n serial: z.number().int().nonnegative(),\n provider: z.string().min(1).max(128),\n scope: z.object({ origin: z.string().min(1), target: z.string().min(1) }).strict(),\n status: z.enum([\"safe\", \"elevated\", \"blocked\"]),\n bindings: z.array(bindingSchema),\n managedFields: z.array(\n z.object({ resourceKey: z.string().min(1), fields: z.array(z.string().min(1)) }).strict(),\n ),\n secretRevisions: z.record(z.string(), z.string()),\n elevation: z\n .object({\n attemptId: z.string().min(1),\n authorizationIds: z.array(z.string().min(1).max(128)).min(1),\n phase: z.enum([\"granting\", \"cleanup\"]),\n })\n .strict()\n .optional(),\n pending: z.union([pendingIntentSchema, pendingSinkSchema]).optional(),\n lastReceipt: z.string().optional(),\n })\n .strict();\n\nexport interface StateSession {\n load(): Promise<State>;\n checkpoint(state: State): Promise<void>;\n recordProvider(intent: import(\"@stackonward/provisioning\").PendingIntent): Promise<State>;\n recordRecovery(intent: import(\"@stackonward/provisioning\").PendingIntent): Promise<State>;\n recordSink(intent: PendingSinkIntent): Promise<State>;\n acknowledge(\n attemptId: string,\n binding: import(\"@stackonward/provisioning\").Binding | undefined,\n removeResourceKey?: string,\n ): Promise<State>;\n fail(attemptId: string): Promise<State>;\n block(attemptId: string, elevationId?: string): Promise<State>;\n blockEvidence(receiptId: string): Promise<State>;\n complete(\n receiptId: string,\n revisions: Readonly<Record<string, string>>,\n managedFields: State[\"managedFields\"],\n ): Promise<State>;\n}\n\nexport interface StateStore {\n load(): Promise<State>;\n withLock<Result>(operation: (session: StateSession) => Promise<Result>): Promise<Result>;\n}\n\nexport function createStateStore(\n backend: StoreBackend,\n scope: { readonly provider: string; readonly origin: string; readonly target: string },\n): StateStore {\n const initial = (): State => ({\n schemaVersion: 1,\n lineage: randomUUID(),\n serial: 0,\n provider: scope.provider,\n scope: { origin: scope.origin, target: scope.target },\n status: \"safe\",\n bindings: [],\n managedFields: [],\n secretRevisions: {},\n });\n const codec: StateCodec<State> = {\n parse: (document) => {\n const state = decode(document, initial);\n if (\n state.provider !== scope.provider ||\n state.scope.origin !== scope.origin ||\n state.scope.target !== scope.target\n ) {\n throw new ProvisionError(\"state_scope_mismatch\", 7);\n }\n return state;\n },\n serialize: (state) => `${JSON.stringify(stateSchema.parse(state), null, 2)}\\n`,\n };\n const store = createTypedStore(backend, codec);\n return {\n load: async () => (await store.load()) as State,\n withLock: (operation) => store.withLock((session) => operation(createSession(session))),\n };\n}\n\nfunction createSession(backend: TypedSession<State>): StateSession {\n const update = async (change: (state: State) => State): Promise<State> => {\n const state = (await backend.load()) as State;\n const next = stateSchema.parse(change(state)) as State;\n await backend.save(next);\n return next;\n };\n return {\n load: async () => (await backend.load()) as State,\n checkpoint: (state) => backend.save(stateSchema.parse(state) as State),\n recordProvider: (intent) =>\n update((state) => {\n assertEffectAllowed(state);\n return {\n ...state,\n pending: pendingIntentSchema.parse(\n intent,\n ) as import(\"@stackonward/provisioning\").PendingIntent,\n };\n }),\n recordRecovery: (intent) =>\n update((state) => {\n if (state.status !== \"elevated\" || state.elevation === undefined) {\n throw new ProvisionError(\"recovery_not_allowed\", 7);\n }\n return {\n ...state,\n pending: pendingIntentSchema.parse(\n intent,\n ) as import(\"@stackonward/provisioning\").PendingIntent,\n };\n }),\n recordSink: (intent) =>\n update((state) => {\n assertEffectAllowed(state);\n return { ...state, pending: pendingSinkSchema.parse(intent) as PendingSinkIntent };\n }),\n acknowledge: (attemptId, binding, removeResourceKey) =>\n update((state) => {\n assertAttempt(state, attemptId);\n const retained =\n removeResourceKey === undefined\n ? state.bindings\n : state.bindings.filter(({ resourceKey }) => resourceKey !== removeResourceKey);\n const bindings = binding\n ? [...retained.filter(({ resourceKey }) => resourceKey !== binding.resourceKey), binding]\n : retained;\n return {\n ...state,\n serial: state.serial + 1,\n status: \"safe\",\n bindings,\n pending: undefined,\n elevation: undefined,\n };\n }),\n fail: (attemptId) =>\n update((state) => {\n assertAttempt(state, attemptId);\n return { ...state, serial: state.serial + 1, status: \"safe\", pending: undefined };\n }),\n block: (attemptId, elevationId) =>\n update((state) => {\n assertAttempt(state, attemptId);\n return {\n ...state,\n serial: state.serial + 1,\n status: elevationId === undefined ? \"blocked\" : \"elevated\",\n ...(elevationId === undefined\n ? {}\n : {\n elevation: {\n attemptId,\n authorizationIds: [elevationId],\n phase: \"cleanup\" as const,\n },\n }),\n };\n }),\n blockEvidence: (receiptId) =>\n update((state) => {\n if (state.pending !== undefined) throw new ProvisionError(\"intent_pending\", 7);\n return {\n ...state,\n serial: state.serial + 1,\n status: \"blocked\",\n lastReceipt: receiptId,\n };\n }),\n complete: (receiptId, revisions, managedFields) =>\n update((state) => {\n if (state.pending !== undefined || state.status !== \"safe\") {\n throw new ProvisionError(\"state_blocked\", 7);\n }\n return {\n ...state,\n serial: state.serial + 1,\n secretRevisions: { ...revisions },\n managedFields,\n lastReceipt: receiptId,\n };\n }),\n };\n}\n\nfunction decode(document: string | null, initial: () => State): State {\n if (document === null) return initial();\n try {\n return stateSchema.parse(JSON.parse(document)) as State;\n } catch {\n throw new ProvisionError(\"state_corrupt\", 7);\n }\n}\n\nfunction assertEffectAllowed(state: State): void {\n if (state.status !== \"safe\" || state.pending !== undefined) {\n throw new ProvisionError(\"state_blocked\", 7);\n }\n}\n\nfunction assertAttempt(state: State, attemptId: string): void {\n if (state.pending?.attemptId !== attemptId) throw new ProvisionError(\"intent_stale\", 7);\n}\n","import { createHash } from \"node:crypto\";\n\nimport type {\n GrantTarget,\n PlannedProbe,\n ProbeContext,\n ProbeExecutor,\n ProbeResult,\n} from \"@stackonward/onedev-provisioning\";\nimport type { Json } from \"@stackonward/provisioning\";\n\nconst MANIFEST_ACCEPT = [\n \"application/vnd.oci.image.manifest.v1+json\",\n \"application/vnd.docker.distribution.manifest.v2+json\",\n \"application/vnd.oci.image.index.v1+json\",\n \"application/vnd.docker.distribution.manifest.list.v2+json\",\n].join(\", \");\n\ninterface Options {\n readonly fetch?: typeof globalThis.fetch;\n}\n\ninterface Cleanup {\n readonly repository: string;\n readonly digest: string;\n readonly context: ProbeContext;\n}\n\ninterface Source {\n readonly repository: string;\n readonly digest: string;\n}\n\ntype Context = ProbeContext & { readonly grantTarget?: GrantTarget };\ntype AuthMode = \"bearer\" | \"basic\";\n\n/** OneDev 探针把已签名计划投影为安全 HTTP 或 OCI 操作,凭据只进入请求头。 */\nexport function createOneDevProbeExecutor(options: Options = {}): ProbeExecutor {\n const request = options.fetch ?? globalThis.fetch;\n const cleanups: Cleanup[] = [];\n const authModes = new Map<string, AuthMode>();\n let disposed = false;\n\n return {\n async run(probe, context) {\n if (disposed) return unknown(\"probe_executor_disposed\");\n if (context.signal.aborted) return unknown(\"probe_cancelled\");\n const result = await (probe.assertion.startsWith(\"package-\")\n ? runPackageProbe(probe, context, request, cleanups)\n : runAPIProbe(probe, context, request, authModes));\n return result;\n },\n async dispose() {\n if (disposed) return;\n disposed = true;\n const failures: unknown[] = [];\n for (const cleanup of cleanups.reverse()) {\n try {\n const response = await registryFetch(\n request,\n cleanup.context,\n cleanup.repository,\n \"pull,push\",\n `/v2/${cleanup.repository}/manifests/${cleanup.digest}`,\n { method: \"DELETE\" },\n );\n if (response.status !== 202 && response.status !== 404) failures.push(response.status);\n } catch (error) {\n failures.push(error);\n }\n }\n if (failures.length > 0) throw new Error(\"OneDev probe cleanup failed\");\n },\n };\n}\n\nasync function runPackageProbe(\n probe: Readonly<PlannedProbe>,\n context: ProbeContext,\n request: typeof globalThis.fetch,\n cleanups: Cleanup[],\n): Promise<ProbeResult> {\n if (probe.repository === undefined || probe.digest === undefined) {\n return unknown(\"probe_plan_invalid\");\n }\n const source: Source = { repository: probe.repository, digest: probe.digest };\n if (probe.assertion === \"package-pull\") {\n const result = await readManifest(request, context, source);\n return result.status === \"allow\"\n ? allow({ digest: source.digest, assertion: \"package-pull\" })\n : result;\n }\n if (probe.assertion === \"package-delete-denied\") {\n return denialResponse(\n await registryFetch(\n request,\n context,\n source.repository,\n \"pull,push\",\n `/v2/${source.repository}/manifests/${source.digest}`,\n { method: \"DELETE\" },\n ),\n \"package-delete\",\n );\n }\n if (probe.tag === undefined || probe.manifest === undefined || probe.mediaType === undefined) {\n return unknown(\"probe_plan_invalid\");\n }\n const bytes = new TextEncoder().encode(probe.manifest);\n const plannedDigest = `sha256:${createHash(\"sha256\").update(bytes).digest(\"hex\")}`;\n if (plannedDigest !== probe.digest) return unknown(\"probe_digest_mismatch\");\n const response = await registryFetch(\n request,\n context,\n probe.repository,\n \"pull,push\",\n `/v2/${probe.repository}/manifests/${encodeURIComponent(probe.tag)}`,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": probe.mediaType },\n body: bytes,\n },\n );\n if (probe.assertion === \"package-push-denied\") {\n if (response.status === 201 && response.headers.get(\"Docker-Content-Digest\") === probe.digest) {\n cleanups.push({ repository: probe.repository, digest: probe.digest, context });\n }\n return denialResponse(response, \"package-push\");\n }\n if (response.status !== 201) return classifyResponse(response, \"package-push\");\n if (response.headers.get(\"Docker-Content-Digest\") !== probe.digest) {\n return unknown(\"probe_digest_mismatch\");\n }\n cleanups.push({ repository: probe.repository, digest: probe.digest, context });\n return allow({ digest: probe.digest, assertion: \"package-push\" });\n}\n\nasync function readManifest(\n request: typeof globalThis.fetch,\n context: ProbeContext,\n source: Source,\n): Promise<ProbeResult> {\n const response = await registryFetch(\n request,\n context,\n source.repository,\n \"pull\",\n `/v2/${source.repository}/manifests/${source.digest}`,\n { headers: { Accept: MANIFEST_ACCEPT } },\n );\n if (!response.ok) return classifyResponse(response, \"package-pull\");\n const bytes = new Uint8Array(await response.arrayBuffer());\n const observed = `sha256:${createHash(\"sha256\").update(bytes).digest(\"hex\")}`;\n return observed === source.digest\n ? allow({ digest: source.digest, assertion: \"package-pull\" })\n : unknown(\"probe_digest_mismatch\");\n}\n\nasync function runAPIProbe(\n probe: Readonly<PlannedProbe>,\n context: Readonly<Context>,\n request: typeof globalThis.fetch,\n authModes: Map<string, AuthMode>,\n): Promise<ProbeResult> {\n if (probe.assertion === \"old-token-denied\") {\n return denialResponse(\n await apiRequest(request, context, \"/~api/users/me\", {}, authModes),\n \"authentication\",\n );\n }\n if (probe.assertion === \"outside-project-denied\") {\n return denialResponse(\n await apiRequest(\n request,\n context,\n `/~api/projects/ids/${encodePath(probe.reference ?? context.projectPath)}`,\n {},\n authModes,\n ),\n \"outside-project\",\n true,\n );\n }\n const project = await apiRequest(\n request,\n context,\n `/~api/projects/ids/${encodePath(context.projectPath)}`,\n {},\n authModes,\n );\n if (!project.ok) return classifyResponse(project, \"project-resolution\");\n const projectId = await numericBody(project);\n if (projectId === undefined) return unknown(\"probe_response_invalid\");\n if (probe.assertion === \"code-read\") {\n const revision = probe.reference ?? \"main\";\n return classifyResponse(\n await apiRequest(\n request,\n context,\n `/~api/repositories/${projectId}/directories/${encodeURIComponent(revision)}`,\n {},\n authModes,\n ),\n \"code-read\",\n );\n }\n if (probe.assertion === \"project-manage-denied\") {\n const setting = await apiRequest(\n request,\n context,\n `/~api/projects/${projectId}/setting`,\n {},\n authModes,\n );\n if (!setting.ok) return classifyResponse(setting, \"project-setting-read\");\n return denialResponse(\n await apiRequest(\n request,\n context,\n `/~api/projects/${projectId}/setting`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: await setting.text(),\n },\n authModes,\n ),\n \"project-manage\",\n );\n }\n if (probe.assertion === \"grant-create-denied\") {\n const target = context.grantTarget;\n if (\n target === undefined ||\n ![target.tokenId, target.projectId, target.roleId].every(\n (value) => Number.isSafeInteger(value) && value > 0,\n )\n )\n return unknown(\"probe_plan_missing_grant_target\");\n if (target.projectId !== projectId) return unknown(\"probe_grant_target_mismatch\");\n const response = await apiRequest(\n request,\n context,\n \"/~api/access-token-authorizations\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(target),\n },\n authModes,\n );\n if (response.ok) {\n const created = await numericBody(response.clone());\n if (created === undefined) return unknown(\"probe_response_invalid\");\n const removed = await apiRequest(\n request,\n context,\n `/~api/access-token-authorizations/${created}`,\n { method: \"DELETE\" },\n authModes,\n );\n if (!removed.ok) return unknown(\"probe_cleanup_failed\");\n const remaining = await apiRequest(\n request,\n context,\n `/~api/access-token-authorizations/${created}`,\n {},\n authModes,\n );\n if (remaining.status !== 404) return unknown(\"probe_cleanup_unverified\");\n return allow({ assertion: \"grant-create\", authorized: true, status: response.status });\n }\n if (response.status === 401 || response.status === 403) {\n return deny({ assertion: \"grant-create\", status: response.status });\n }\n if (response.status === 400) {\n const message = await response.text();\n if (/access token owner should have permission to manage authorized project/iu.test(message))\n return deny({ assertion: \"grant-create\", status: response.status });\n return unknown(\"probe_grant_target_rejected\");\n }\n if (response.status === 404) return unknown(\"probe_grant_target_rejected\");\n return unknown(\"probe_response_unexpected\");\n }\n return unknown(\"probe_assertion_unsupported\");\n}\n\nasync function apiRequest(\n request: typeof globalThis.fetch,\n context: Readonly<Context>,\n pathname: string,\n init: RequestInit = {},\n authModes: Map<string, AuthMode>,\n): Promise<Response> {\n const target = new URL(pathname, context.origin);\n const key = `${context.origin}\\n${context.credentialUsername}\\n${context.credential}`;\n const mode = authModes.get(key);\n if (mode !== undefined) return requestWithMode(request, target, context, init, mode);\n\n const discovered = await discoverAuth(request, context);\n if (discovered.mode !== undefined) {\n authModes.set(key, discovered.mode);\n if (pathname === \"/~api/users/me\" && init.method === undefined) return discovered.response;\n return requestWithMode(request, target, context, init, discovered.mode);\n }\n return discovered.response;\n}\n\nasync function discoverAuth(\n request: typeof globalThis.fetch,\n context: Readonly<Context>,\n): Promise<{ readonly mode?: AuthMode; readonly response: Response }> {\n const readOnly = new URL(\"/~api/users/me\", context.origin);\n const bearer = await request(readOnly, {\n headers: { Authorization: `Bearer ${context.credential}` },\n redirect: \"error\",\n signal: context.signal,\n });\n if (bearer.status !== 401 && bearer.status !== 403) return { mode: \"bearer\", response: bearer };\n const basic = basicAuthorization(context);\n const basicResponse = await request(readOnly, {\n headers: { Authorization: basic },\n redirect: \"error\",\n signal: context.signal,\n });\n if (basicResponse.status !== 401 && basicResponse.status !== 403)\n return { mode: \"basic\", response: basicResponse };\n return { response: basicResponse };\n}\n\nfunction requestWithMode(\n request: typeof globalThis.fetch,\n target: URL,\n context: Readonly<Context>,\n init: RequestInit,\n mode: AuthMode,\n): Promise<Response> {\n return request(target, {\n ...init,\n headers: {\n ...init.headers,\n Authorization:\n mode === \"bearer\" ? `Bearer ${context.credential}` : basicAuthorization(context),\n },\n redirect: \"error\",\n signal: context.signal,\n });\n}\n\nfunction basicAuthorization(context: Readonly<Context>): string {\n return `Basic ${Buffer.from(\n `${context.credentialUsername}:${context.credential}`,\n \"utf8\",\n ).toString(\"base64\")}`;\n}\n\nasync function registryFetch(\n request: typeof globalThis.fetch,\n context: ProbeContext,\n repository: string,\n actions: string,\n pathname: string,\n init: RequestInit,\n): Promise<Response> {\n const basic = `Basic ${Buffer.from(\n `${context.credentialUsername}:${context.credential}`,\n \"utf8\",\n ).toString(\"base64\")}`;\n const target = new URL(pathname, context.origin);\n const first = await request(target, {\n ...init,\n headers: { ...init.headers, Authorization: basic },\n redirect: \"error\",\n signal: context.signal,\n });\n if (first.status !== 401) return first;\n const challenge = parseChallenge(first.headers.get(\"WWW-Authenticate\"));\n if (challenge === undefined) return first;\n const realm = new URL(challenge.realm);\n if (realm.protocol !== \"https:\" || realm.origin !== new URL(context.origin).origin) {\n return new Response(null, { status: 502 });\n }\n realm.searchParams.set(\"service\", challenge.service);\n realm.searchParams.set(\"scope\", `repository:${repository}:${actions}`);\n realm.searchParams.set(\"account\", context.credentialUsername);\n const issued = await request(realm, {\n headers: { Authorization: basic },\n redirect: \"error\",\n signal: context.signal,\n });\n if (!issued.ok) return issued;\n let document: unknown;\n try {\n document = await issued.json();\n } catch {\n return new Response(null, { status: 502 });\n }\n const token =\n document !== null && typeof document === \"object\"\n ? ((document as Readonly<Record<string, unknown>>).token ??\n (document as Readonly<Record<string, unknown>>).access_token)\n : undefined;\n if (typeof token !== \"string\" || token.length === 0 || token.length > 16_384) {\n return new Response(null, { status: 502 });\n }\n return request(target, {\n ...init,\n headers: { ...init.headers, Authorization: `Bearer ${token}` },\n redirect: \"error\",\n signal: context.signal,\n });\n}\n\nfunction parseChallenge(\n input: string | null,\n): { readonly realm: string; readonly service: string } | undefined {\n if (input === null || !input.startsWith(\"Bearer \")) return undefined;\n const attributes = new Map<string, string>();\n for (const match of input.slice(7).matchAll(/(?:^|,)\\s*([a-z]+)=\"([^\"]+)\"/gu)) {\n if (match[1] && match[2]) attributes.set(match[1], match[2]);\n }\n const realm = attributes.get(\"realm\");\n const service = attributes.get(\"service\");\n return realm !== undefined && service !== undefined ? { realm, service } : undefined;\n}\n\nfunction encodePath(value: string): string {\n return value.split(\"/\").map(encodeURIComponent).join(\"/\");\n}\n\nasync function numericBody(response: Response): Promise<number | undefined> {\n try {\n const value: unknown = await response.json();\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0\n ? value\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction classifyResponse(response: Response, assertion: string): ProbeResult {\n if (response.ok) return allow({ assertion, status: response.status });\n if (response.status === 401 || response.status === 403) {\n return deny({ assertion, status: response.status });\n }\n return unknown(\"probe_response_unexpected\");\n}\n\nfunction denialResponse(response: Response, assertion: string, hidden404 = false): ProbeResult {\n if (\n response.status === 401 ||\n response.status === 403 ||\n (hidden404 && response.status === 404)\n ) {\n return deny({ assertion, status: response.status });\n }\n if (\n response.ok ||\n response.status === 400 ||\n response.status === 404 ||\n response.status === 409\n ) {\n return allow({ assertion, authorized: true, status: response.status });\n }\n return unknown(\"probe_response_unexpected\");\n}\n\nfunction allow(evidence: Record<string, Json>): ProbeResult {\n return { status: \"allow\", evidence };\n}\n\nfunction deny(evidence: Record<string, Json>): ProbeResult {\n return { status: \"deny\", evidence };\n}\n\nfunction unknown(reason: string): ProbeResult {\n return { status: \"unknown\", evidence: { reason } };\n}\n","import type { ProviderFactory } from \"@stackonward/provisioning\";\n\nimport type { Registry, SinkFactory } from \"./contracts.js\";\n\nimport { ProvisionError } from \"./contracts.js\";\n\nexport interface RegistryOptions {\n readonly providers: readonly ProviderFactory[];\n readonly sinks: readonly SinkFactory[];\n}\n\n/** 注册表在组合层绑定实现,协调器不按供应商名称分支。 */\nexport function createRegistry(options: RegistryOptions): Registry {\n const providers = unique(options.providers, \"provider\");\n const sinks = unique(options.sinks, \"sink\");\n return Object.freeze({\n provider(id: string) {\n const factory = providers.get(id);\n if (factory === undefined) throw new ProvisionError(\"provider_unknown\", 2, \"provider\");\n return factory;\n },\n sink(id: string) {\n const factory = sinks.get(id);\n if (factory === undefined) throw new ProvisionError(\"sink_unknown\", 2, \"sinks\");\n return factory;\n },\n });\n}\n\nfunction unique<T extends { readonly id: string }>(\n items: readonly T[],\n field: string,\n): Map<string, T> {\n const result = new Map<string, T>();\n for (const item of items) {\n if (result.has(item.id)) throw new ProvisionError(`${field}_duplicate`, 2, field);\n result.set(item.id, item);\n }\n return result;\n}\n","import { createHash } from \"node:crypto\";\nimport path from \"node:path\";\n\nimport {\n effectObservationSchema,\n effectResultSchema,\n verificationSchema,\n type Effect,\n type EffectObservation,\n type EffectResult,\n type Json,\n type SecretLease,\n type Verification,\n} from \"@stackonward/provisioning\";\nimport { z } from \"zod\";\n\nimport type {\n CredentialSink,\n PendingSinkIntent,\n SinkFactory,\n SinkContext,\n SinkObservation,\n SinkOperation,\n} from \"../contracts.js\";\nimport type { ProcessRunner } from \"../../deploy/process.js\";\nimport {\n createTransport,\n TransportError,\n type Executables,\n type Options as SSHOptions,\n type Port,\n type Scope,\n type SecureSession,\n} from \"../../deploy/transport/ssh.js\";\nimport { digest } from \"../canonical.js\";\n\nconst MAX_CONFIG_BYTES = 2 * 1024 * 1024;\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst KEY = /^[a-z][a-z0-9._-]*$/u;\nconst HOST = /^(?:[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?)(?::[1-9][0-9]{0,4})?$/u;\nconst USER = /^[a-z_][a-z0-9_-]{0,31}$/u;\nconst REGISTRY_USER = /^[A-Za-z0-9._@-]+$/u;\nconst REPOSITORY = /^[a-z0-9]+(?:[._/-][a-z0-9]+)*$/u;\nconst DIGEST = /^sha256:[0-9a-f]{64}$/u;\n\nconst referenceSchema = z.string().min(1).max(128).regex(KEY);\nconst configSchema = z\n .object({\n key: referenceSchema,\n kind: z.literal(\"ssh-docker-config\"),\n credential: referenceSchema,\n registryHost: z.string().min(1).max(255).regex(HOST),\n registryUsername: z.string().min(1).max(255).regex(REGISTRY_USER),\n connection: z\n .object({\n host: referenceSchema,\n port: referenceSchema,\n user: referenceSchema,\n privateKey: referenceSchema,\n knownHosts: referenceSchema,\n })\n .strict(),\n root: z.string().min(1).max(4096),\n configDirectory: z.string().min(1).max(4096),\n environment: referenceSchema,\n probeRepository: z.string().min(1).max(255).regex(REPOSITORY),\n })\n .strict()\n .superRefine((config, context) => {\n const root = path.posix.normalize(config.root);\n const directory = path.posix.normalize(config.configDirectory);\n if (!path.posix.isAbsolute(root) || root === \"/\" || root !== config.root) {\n context.addIssue({ code: \"custom\", path: [\"root\"], message: \"SSH root is invalid\" });\n }\n if (\n !path.posix.isAbsolute(directory) ||\n directory !== config.configDirectory ||\n directory === root ||\n !directory.startsWith(`${root}/`)\n ) {\n context.addIssue({\n code: \"custom\",\n path: [\"configDirectory\"],\n message: \"Docker config directory must remain inside the SSH root\",\n });\n }\n });\n\nconst planSchema = z\n .object({\n config: configSchema,\n probeDigest: z.string().regex(DIGEST),\n })\n .strict();\n\nconst dockerConfigSchema = z\n .object({\n auths: z.record(\n z.string().min(1).max(255),\n z.object({ auth: z.string().min(1).optional() }).passthrough(),\n ),\n })\n .passthrough();\n\ntype Config = z.infer<typeof configSchema>;\ntype DockerConfig = z.infer<typeof dockerConfigSchema>;\n\nexport interface FactoryOptions {\n readonly runner: ProcessRunner;\n readonly cwd: string;\n readonly env?: Readonly<Record<string, string>>;\n readonly timeoutMs?: number;\n readonly executables?: Executables;\n}\n\nexport type SinkErrorCode =\n | \"config_conflict\"\n | \"config_invalid\"\n | \"effect_failed\"\n | \"effect_unknown\"\n | \"probe_failed\"\n | \"secret_invalid\"\n | \"session_closed\";\n\n/** 凭据接收端错误只保留稳定分类和效应确定性,避免泄露远端文档与私密值。 */\nexport class SinkError extends Error {\n constructor(\n readonly code: SinkErrorCode,\n readonly effect: Effect,\n readonly retryable: boolean,\n options?: ErrorOptions,\n ) {\n super(code, options);\n this.name = \"SSHDockerConfigSinkError\";\n }\n}\n\n/** 工厂只持有进程端口和非私密本地执行配置,凭据由每次调用租约注入。 */\nexport function createSSHDockerConfigFactory(\n options: FactoryOptions,\n transport: Port = createTransport(options.runner, options.executables),\n): SinkFactory {\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {\n throw new SinkError(\"config_invalid\", \"none\", false);\n }\n return Object.freeze({\n id: \"ssh-docker-config\",\n parseConfig: (input: unknown): Json => configSchema.parse(input) as Json,\n configure: async (input: Json, context: SinkContext) =>\n createSink(configSchema.parse(input), transport, {\n cwd: options.cwd,\n env: options.env ?? {},\n timeoutMs,\n signal: context.signal,\n }),\n });\n}\n\nfunction createSink(\n config: Config,\n transport: ReturnType<typeof createTransport>,\n options: Omit<SSHOptions, \"credentials\">,\n): CredentialSink {\n let disposed = false;\n const active = (): void => {\n if (disposed) throw new SinkError(\"session_closed\", \"none\", false);\n };\n return Object.freeze({\n id: \"ssh-docker-config\",\n parseConfig: (input: unknown): Json => configSchema.parse(input) as Json,\n observe: async (input: Json, lease: SecretLease) => {\n active();\n return withSession(configSchema.parse(input), lease, transport, options, (session, current) =>\n observeCurrent(current, session, lease),\n );\n },\n apply: async (operation: SinkOperation, lease: SecretLease) => {\n active();\n return apply(operation, lease, transport, options);\n },\n verify: async (input: Json, lease: SecretLease) => {\n active();\n return verify(configSchema.parse(input), lease, transport, options);\n },\n reconcile: async (intent: PendingSinkIntent, lease: SecretLease) => {\n active();\n return reconcile(intent, lease, transport, options);\n },\n dispose: async () => {\n disposed = true;\n },\n });\n}\n\nasync function withSession<Result>(\n config: Config,\n lease: SecretLease,\n transport: ReturnType<typeof createTransport>,\n options: Omit<SSHOptions, \"credentials\">,\n operation: (session: SecureSession, config: Config) => Promise<Result>,\n): Promise<Result> {\n const sshOptions: SSHOptions = {\n ...options,\n credentials: {\n host: lease.read(config.connection.host),\n port: parsePort(lease.read(config.connection.port)),\n user: parseUser(lease.read(config.connection.user)),\n privateKey: lease.read(config.connection.privateKey),\n knownHosts: lease.read(config.connection.knownHosts),\n },\n };\n const scope: Scope = {\n root: config.root,\n environment: config.environment,\n dockerConfig: config.configDirectory,\n };\n return transport.withLock(scope, sshOptions, (session) => operation(session, config));\n}\n\nasync function observeCurrent(\n config: Config,\n session: SecureSession,\n lease: SecretLease,\n credentialReference = `credential:${config.credential}`,\n): Promise<SinkObservation> {\n const location = locations(config);\n // 同一把远端锁上串行观察,避免并发 SSH 被 MaxStartups 或边缘防护掐成 session_incomplete。\n const directoryAccess = await session.inspectAccess(location.directory);\n const fileAccess = await session.inspectAccess(location.file);\n const document = await session.read(location.file, MAX_CONFIG_BYTES);\n const user = parseUser(lease.read(config.connection.user));\n if (\n document === null &&\n fileAccess.kind === \"absent\" &&\n (directoryAccess.kind === \"absent\" ||\n (directoryAccess.kind === \"directory\" &&\n directoryAccess.owner === user &&\n directoryAccess.mode === \"700\"))\n ) {\n return Object.freeze({\n status: \"absent\",\n observedDigest: digest(null),\n evidence: { configured: false },\n });\n }\n if (\n directoryAccess.kind !== \"directory\" ||\n directoryAccess.owner !== user ||\n directoryAccess.mode !== \"700\" ||\n fileAccess.kind !== \"file\" ||\n fileAccess.owner !== directoryAccess.owner ||\n fileAccess.mode !== \"600\" ||\n document === null\n ) {\n return conflict(\"access\");\n }\n const current = parseDockerConfig(document.content);\n const entry = current.auths[config.registryHost];\n if (entry === undefined && !hasCredentialHelper(current, config.registryHost)) {\n return Object.freeze({\n status: \"absent\",\n observedDigest: digest(null),\n evidence: { configured: false, sharedConfig: true },\n });\n }\n if (\n !entry?.auth ||\n Object.keys(entry).some((key) => key !== \"auth\") ||\n hasCredentialHelper(current, config.registryHost)\n ) {\n return conflict(\"registry-entry\");\n }\n const expected = lease.has(credentialReference)\n ? encodeAuth(config.registryUsername, lease.read(credentialReference))\n : undefined;\n if (expected !== undefined && entry.auth !== expected) return conflict(\"credential\");\n return Object.freeze({\n status: \"present\",\n observedDigest: digest(config as Json),\n evidence: {\n configured: true,\n access: \"owner-only\",\n credential: expected === undefined ? \"remote-metadata\" : \"exact\",\n },\n });\n}\n\nasync function apply(\n operation: SinkOperation,\n lease: SecretLease,\n transport: ReturnType<typeof createTransport>,\n options: Omit<SSHOptions, \"credentials\">,\n): Promise<EffectResult> {\n const plan = planSchema.parse(operation.plan);\n if (operation.sink !== \"ssh-docker-config\" || operation.credential !== plan.config.credential) {\n throw new SinkError(\"config_invalid\", \"none\", false);\n }\n if (operation.action === \"retain\") {\n return effectResultSchema.parse({ effect: \"none\", evidence: { configured: true } });\n }\n try {\n return await withSession(plan.config, lease, transport, options, async (session, config) => {\n const previousCredential = `retired-credential:${config.credential}`;\n const before = await observeCurrent(\n config,\n session,\n lease,\n operation.action === \"rotate\" && lease.has(previousCredential)\n ? previousCredential\n : `credential:${config.credential}`,\n );\n if (before.observedDigest !== operation.beforeDigest) {\n throw new SinkError(\"config_conflict\", \"none\", false);\n }\n return operation.action === \"revoke\"\n ? revoke(config, session)\n : install(config, plan.probeDigest, session, lease);\n });\n } catch (error) {\n if (effectOf(error) === \"unknown\") {\n return effectResultSchema.parse({\n effect: \"unknown\",\n diagnostic: { code: \"ssh_docker_config_unknown\", retryable: false },\n });\n }\n throw error;\n }\n}\n\nasync function install(\n config: Config,\n probeDigest: string,\n session: SecureSession,\n lease: SecretLease,\n): Promise<EffectResult> {\n const token = lease.read(`credential:${config.credential}`);\n const location = locations(config);\n await session.execute({ executable: \"mkdir\", args: [\"-p\", location.directory] });\n await session.execute({ executable: \"chmod\", args: [\"700\", location.directory] });\n const current = await session.read(location.file, MAX_CONFIG_BYTES);\n const document = current === null ? { auths: {} } : parseDockerConfig(current.content);\n const next: DockerConfig = {\n ...document,\n auths: {\n ...document.auths,\n [config.registryHost]: { auth: encodeAuth(config.registryUsername, token) },\n },\n };\n const serialized = serialize(next);\n const backup = current === null ? undefined : location.backup;\n if (backup !== undefined && current !== null) {\n await session.writeAtomic({\n destination: backup,\n content: current.content,\n identity: current.identity,\n mode: 0o600,\n });\n }\n try {\n await session.writeAtomic({\n destination: location.file,\n content: serialized,\n identity: hash(serialized),\n mode: 0o600,\n });\n await verifyInstalled(config, probeDigest, session, lease);\n } catch (error) {\n if (effectOf(error) === \"unknown\") throw error;\n try {\n if (backup !== undefined) {\n await restore(session, backup, location.file);\n } else {\n await session.remove({ path: location.file, kind: \"file\" });\n }\n } catch (rollbackError) {\n throw new SinkError(\"effect_unknown\", \"unknown\", false, {\n cause: new AggregateError([error, rollbackError]),\n });\n }\n throw new SinkError(error instanceof SinkError ? error.code : \"effect_failed\", \"none\", false, {\n cause: error,\n });\n }\n if (backup) await session.remove({ path: backup, kind: \"file\" });\n return effectResultSchema.parse({\n effect: \"acknowledged\",\n evidence: { configured: true, access: \"owner-only\", probe: \"verified\" },\n });\n}\n\nasync function revoke(config: Config, session: SecureSession): Promise<EffectResult> {\n const location = locations(config);\n const current = await session.read(location.file, MAX_CONFIG_BYTES);\n if (current === null) return effectResultSchema.parse({ effect: \"none\" });\n const document = parseDockerConfig(current.content);\n if (!(config.registryHost in document.auths)) {\n return effectResultSchema.parse({ effect: \"none\" });\n }\n const auths = { ...document.auths };\n delete auths[config.registryHost];\n const next = { ...document, auths };\n if (Object.keys(auths).length === 0 && Object.keys(next).every((key) => key === \"auths\")) {\n await session.remove({ path: location.file, kind: \"file\" });\n } else {\n const serialized = serialize(next);\n await session.writeAtomic({\n destination: location.file,\n content: serialized,\n identity: hash(serialized),\n mode: 0o600,\n });\n }\n return effectResultSchema.parse({\n effect: \"acknowledged\",\n evidence: { configured: false, registryEntryRemoved: true },\n });\n}\n\nasync function verify(\n config: Config,\n lease: SecretLease,\n transport: ReturnType<typeof createTransport>,\n options: Omit<SSHOptions, \"credentials\">,\n): Promise<Verification> {\n try {\n const observed = await withSession(config, lease, transport, options, (session, current) =>\n observeCurrent(current, session, lease),\n );\n return verificationSchema.parse({\n status: observed.status === \"present\" ? \"verified\" : \"failed\",\n resources: [\n {\n resourceKey: `sink.${config.key}`,\n evidence: \"exact\",\n status: observed.status === \"present\" ? \"match\" : \"mismatch\",\n },\n ],\n diagnostics:\n observed.status === \"present\" ? [] : [{ code: \"sink_mismatch\", retryable: false }],\n });\n } catch (error) {\n if (effectOf(error) !== \"unknown\") throw error;\n return verificationSchema.parse({\n status: \"unknown\",\n resources: [\n { resourceKey: `sink.${config.key}`, evidence: \"remote-metadata\", status: \"unknown\" },\n ],\n diagnostics: [{ code: \"ssh_docker_config_unknown\", retryable: false }],\n });\n }\n}\n\nasync function reconcile(\n intent: PendingSinkIntent,\n lease: SecretLease,\n transport: ReturnType<typeof createTransport>,\n options: Omit<SSHOptions, \"credentials\">,\n): Promise<EffectObservation> {\n const plan = planSchema.parse(intent.operation.plan);\n try {\n const observed = await withSession(plan.config, lease, transport, options, (session, config) =>\n observeCurrent(config, session, lease),\n );\n if (intent.operation.action === \"revoke\" && observed.status === \"absent\") {\n return effectObservationSchema.parse({ effect: \"acknowledged\", evidence: observed.evidence });\n }\n if (\n observed.status === \"absent\" &&\n (intent.operation.action === \"create\" ||\n intent.operation.action === \"update\" ||\n intent.operation.action === \"rotate\")\n ) {\n return effectObservationSchema.parse({ effect: \"none\", evidence: observed.evidence });\n }\n if (\n observed.status === \"present\" &&\n observed.observedDigest === intent.operation.desiredDigest\n ) {\n return effectObservationSchema.parse({ effect: \"acknowledged\", evidence: observed.evidence });\n }\n return effectObservationSchema.parse({\n effect: \"unknown\",\n evidence: observed.evidence,\n diagnostic: { code: \"ssh_docker_config_unresolved\", retryable: false },\n });\n } catch (error) {\n return effectObservationSchema.parse({\n effect: \"unknown\",\n evidence: { observed: false },\n diagnostic: { code: \"ssh_docker_config_unresolved\", retryable: false },\n });\n }\n}\n\nasync function verifyInstalled(\n config: Config,\n probeDigest: string,\n session: SecureSession,\n lease: SecretLease,\n): Promise<void> {\n const observed = await observeCurrent(config, session, lease);\n if (observed.status !== \"present\") throw new SinkError(\"effect_failed\", \"acknowledged\", false);\n const token = lease.read(`credential:${config.credential}`);\n const endpoint = `https://${config.registryHost}/v2/${config.probeRepository}/manifests/${probeDigest}`;\n const authorization = `Basic ${Buffer.from(`${config.registryUsername}:${token}`).toString(\"base64\")}`;\n // 探针清单是空 OCI index,docker pull 不能当镜像拉;用 puller GET 证明可读,PUT/DELETE 必须被拒。\n const pulled = await session.execute(\n { executable: \"curl\", args: [\"--config\", \"-\"] },\n { input: curlConfig(endpoint, \"GET\", authorization), redactions: [token, authorization] },\n );\n if (pulled.stdout.trim() !== \"200\") {\n throw new SinkError(\"probe_failed\", \"acknowledged\", false);\n }\n for (const method of [\"PUT\", \"DELETE\"] as const) {\n const result = await session.execute(\n { executable: \"curl\", args: [\"--config\", \"-\"] },\n { input: curlConfig(endpoint, method, authorization), redactions: [token, authorization] },\n );\n if (result.stdout.trim() !== \"401\" && result.stdout.trim() !== \"403\") {\n throw new SinkError(\"probe_failed\", \"acknowledged\", false);\n }\n }\n}\n\nasync function restore(session: SecureSession, backup: string, destination: string): Promise<void> {\n await session.rename({ source: backup, destination, replace: true });\n}\n\nfunction locations(config: Config) {\n const directory = path.posix.relative(config.root, config.configDirectory);\n return Object.freeze({\n directory,\n file: `${directory}/config.json`,\n backup: `${directory}/config.json.rotation`,\n });\n}\n\nfunction parseDockerConfig(document: string): DockerConfig {\n let input: unknown;\n try {\n input = JSON.parse(document) as unknown;\n } catch (error) {\n throw new SinkError(\"config_conflict\", \"none\", false, { cause: error });\n }\n const parsed = dockerConfigSchema.safeParse(input);\n if (!parsed.success) {\n throw new SinkError(\"config_conflict\", \"none\", false, { cause: parsed.error });\n }\n return parsed.data;\n}\n\nfunction serialize(config: DockerConfig): string {\n return `${JSON.stringify(config, null, 2)}\\n`;\n}\n\nfunction encodeAuth(username: string, token: string): string {\n return Buffer.from(`${username}:${token}`).toString(\"base64\");\n}\n\nfunction hasCredentialHelper(config: DockerConfig, registryHost: string): boolean {\n if (typeof config.credsStore === \"string\" && config.credsStore.length > 0) return true;\n if (\n !config.credHelpers ||\n typeof config.credHelpers !== \"object\" ||\n Array.isArray(config.credHelpers)\n ) {\n return false;\n }\n return Object.prototype.hasOwnProperty.call(config.credHelpers, registryHost);\n}\n\nfunction curlConfig(\n endpoint: string,\n method: \"GET\" | \"PUT\" | \"DELETE\",\n authorization: string,\n): string {\n return [\n \"silent\",\n \"show-error\",\n 'output = \"/dev/null\"',\n 'write-out = \"%{http_code}\"',\n `request = \"${method}\"`,\n `url = \"${endpoint}\"`,\n `header = \"Authorization: ${authorization}\"`,\n ...(method === \"GET\"\n ? ['header = \"Accept: application/vnd.oci.image.index.v1+json\"']\n : ['header = \"Content-Type: application/vnd.oci.image.manifest.v1+json\"']),\n ...(method === \"PUT\" ? ['data = \"{}\"'] : []),\n \"\",\n ].join(\"\\n\");\n}\n\nfunction parsePort(value: string): number {\n const port = Number(value);\n if (!/^[1-9][0-9]{0,4}$/u.test(value) || !Number.isSafeInteger(port) || port > 65_535) {\n throw new SinkError(\"secret_invalid\", \"none\", false);\n }\n return port;\n}\n\nfunction parseUser(value: string): string {\n if (!USER.test(value)) throw new SinkError(\"secret_invalid\", \"none\", false);\n return value;\n}\n\nfunction conflict(reason: string): SinkObservation {\n return Object.freeze({\n status: \"conflict\",\n observedDigest: digest({ configured: false, reason }),\n evidence: { configured: false, reason },\n });\n}\n\nfunction hash(document: string): string {\n return `sha256:${createHash(\"sha256\").update(document).digest(\"hex\")}`;\n}\n\nfunction effectOf(error: unknown): Effect {\n if (error instanceof SinkError || error instanceof TransportError) return error.effect;\n return \"none\";\n}\n","import type { Command as CLICommand } from \"commander\";\n\nimport type {\n ArtifactOptions,\n BuildOptions,\n InitOptions,\n PublishOptions,\n RollbackOptions,\n SelectedOptions,\n VerifyOptions,\n} from \"./deploy/contracts.js\";\nimport { guarded } from \"./deploy/guard.js\";\nimport {\n build,\n init,\n publish,\n reconcile,\n release,\n rollback,\n validate,\n verify,\n} from \"./deploy/operations.js\";\nimport { registerProvision } from \"./deploy/provision.js\";\n\nconst DEFAULT_CONFIG = \"deploy.config.json\";\n\nexport function registerDeploy(program: CLICommand): void {\n const deploy = program.command(\"deploy\").description(\"Build, publish and operate deployments\");\n deploy\n .command(\"init\")\n .description(\"Materialize one deployment profile and target\")\n .option(\"--profile <profile>\", \"Deployment profile\")\n .option(\"--target <target>\", \"Deployment target\")\n .option(\"--rollout <rollout>\", \"Deployment rollout strategy\")\n .option(\"--ci <provider>\", \"CI caller provider\")\n .option(\"--stackonward-ref <sha>\", \"Full StackOnward commit for the CI caller\")\n .action((options: InitOptions) => guarded((scope) => init(options, scope)));\n deploy\n .command(\"validate\")\n .description(\"Validate deployment configuration and source contracts\")\n .option(\"--config <file>\", \"Deployment configuration\", DEFAULT_CONFIG)\n .option(\"--environment <name>\", \"Deployment environment\")\n .action((options: SelectedOptions) => guarded((scope) => validate(options, scope)));\n deploy\n .command(\"build\")\n .description(\"Build one immutable local deployment artifact\")\n .option(\"--config <file>\", \"Deployment configuration\", DEFAULT_CONFIG)\n .option(\"--environment <name>\", \"Deployment environment\")\n .option(\"--revision <sha>\", \"Full source revision\")\n .option(\"--output <file>\", \"Build result JSON\")\n .action((options: BuildOptions) => guarded((scope) => build(options, scope)));\n deploy\n .command(\"publish\")\n .description(\"Publish one verified deployment artifact\")\n .option(\"--config <file>\", \"Deployment configuration\", DEFAULT_CONFIG)\n .option(\"--environment <name>\", \"Deployment environment\")\n .option(\"--artifact <file>\", \"Build result JSON\")\n .option(\"--output <file>\", \"Published artifact JSON\")\n .action((options: PublishOptions) => guarded((scope) => publish(options, scope)));\n deploy\n .command(\"release\")\n .description(\"Release one exact published artifact\")\n .option(\"--config <file>\", \"Deployment configuration\", DEFAULT_CONFIG)\n .option(\"--environment <name>\", \"Deployment environment\")\n .option(\"--artifact <file>\", \"Published artifact JSON\")\n .action((options: ArtifactOptions) => guarded((scope) => release(options, scope)));\n deploy\n .command(\"verify\")\n .description(\"Verify one exact retained release\")\n .option(\"--config <file>\", \"Deployment configuration\", DEFAULT_CONFIG)\n .option(\"--environment <name>\", \"Deployment environment\")\n .option(\"--release <release-id>\", \"Exact release identity\")\n .action((options: VerifyOptions) => guarded((scope) => verify(options, scope)));\n deploy\n .command(\"rollback\")\n .description(\"Restore one exact retained release\")\n .option(\"--config <file>\", \"Deployment configuration\", DEFAULT_CONFIG)\n .option(\"--environment <name>\", \"Deployment environment\")\n .option(\"--release <release-id>\", \"Exact retained release identity\")\n .action((options: RollbackOptions) => guarded((scope) => rollback(options, scope)));\n deploy\n .command(\"reconcile\")\n .description(\"Reconcile observed target and lifecycle state\")\n .option(\"--config <file>\", \"Deployment configuration\", DEFAULT_CONFIG)\n .option(\"--environment <name>\", \"Deployment environment\")\n .action((options: SelectedOptions) => guarded((scope) => reconcile(options, scope)));\n registerProvision(deploy);\n}\n"],"mappings":"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","names":["path","fs","execa","file","error","fs","path","fs","path","fs","path","registry","path","registry","file","path","profile","path","url","blue","green","path","fs","execa","file","error","result","registry","path","fs","prompts","ora","registry","ora","error","file","path","fs","prompts","registry","z","path","os","mkdir","writeFile","readFile","realpath","retryable","z","stat","path","z","result","path","stat","offer","group","readFile","stat","realpath","path","realpath","path","readFile","stat","z","z","init","url","error","retryable","wait","decode","id","error","open","rename","rm","realpath","readFile","z","path","randomUUID","realpath","path","randomUUID","open","rename","rm","z","readFile","error","update","result","fields","effect","id","path","randomUUID","access","z","prepare","path","randomUUID","error","resource","id","failure","fields","z","path","release","list","fields","linked","result","z","id","path","createHash","id","group","fields","createHash","z","createHash","path","z","sorted","url","resolve","createHash","state","locale","resource","group","path","error","id","subscription","price","territory","result","subscription","id","offer","price","result","fields","resource","territory","linked","id","price","territory","normalize","result","base","release","build","submission","purchase","group","id","fields","path","z","id","path","z","build","fields","group","execa","path","os","result","execa","mkdir","readFile","rm","realpath","os","path","z","z","path","readFile","os","mkdir","realpath","error","rm","path","readFile","realpath","lstat","mkdtemp","rm","os","z","z","build","realpath","path","lstat","error","result","id","release","readFile","mkdtemp","os","info","profile","rm","path","realpath","lstat","build","realpath","path","lstat","error","locale","asset","run","result","error","failure","program","path","realpath","readFile","writeFile","os","mkdir","z","prepare","randomUUID","mkdir","rename","rm","writeFile","path","generator","error","program","generator","path","mkdir","writeFile","error","randomUUID","rename","rm","failure","z","execa","createProcessRunner","command","resolve","result","error","randomUUID","z","createHash","z","z","environmentSchema","repositoryPathSchema","url","artifactSchema","digest","reference","createHash","terminal","z","failure","result","command","effect","retryable","z","revisionSchema","z","artifactSchema","createHash","randomUUID","lstat","readFile","realpath","rename","rm","stat","writeFile","path","isDeepStrictEqual","z","MAX_PATH_LENGTH","artifactSchema","revisionSchema","z","path","workloadSchema","randomUUID","writeFile","rename","error","rm","result","realpath","stat","lstat","isDeepStrictEqual","reference","file","readFile","hash","createHash","randomUUID","constants","lstat","mkdir","open","realpath","rename","rm","path","isDeepStrictEqual","z","z","locked","assertActive","randomUUID","readDocument","release","error","isDeepStrictEqual","path","mkdir","lstat","realpath","open","constants","rename","rm","path","z","MAX_PATH_LENGTH","MAX_TEXT_LENGTH","z","revisionSchema","attemptIdSchema","path","releaseIdentitySchema","mkdtemp","rm","stat","writeFile","os","path","z","MAX_TIMEOUT_MS","manifestSchema","repositoryPathSchema","effect","retryable","RETRYABLE_PROCESS_FAILURES","reference","digest","processError","error","result","isNodeError","url","failure","failure","result","releaseIdentitySchema","release","error","fields","command","unknown","acknowledge","randomUUID","id","depth","assertActive","guarded","createProcessRunner","error","failure","normalize","z","isRecord","readFile","stat","path","ENV_NAME","error","text","os","path","fs","glob","isInside","path","fs","error","glob","stage","os","result","lstat","realpath","stat","path","z","z","realpath","path","stat","readDocument","isInside","lstat","error","z","sleep","z","z","signalSchema","isRecord","release","releaseIdentitySchema","systemClock","sleep","assertActive","resolve","error","z","createHash","randomUUID","createReadStream","lstat","mkdtemp","realpath","rm","stat","writeFile","os","path","isDeepStrictEqual","TextDecoder","z","MAX_TEXT_LENGTH","MAX_TIMEOUT_MS","digestSchema","effect","retryable","readDocument","acquire","createSession","error","release","command","result","processError","script","replace","link","fields","file","symlink","prepare","validateOptions","processOptions","commandEnvironment","ENVIRONMENT_NAME","hash","failure","z","error","profile","result","processError","lstat","realpath","path","z","z","url","BuildError","retryable","RETRYABLE_PROCESS_FAILURES","image","reference","execute","result","registry","realpath","error","path","lstat","isNodeError","command","lstat","realpath","stat","path","z","z","BuildError","profile","image","processOptions","reference","createReference","assertAbsent","realpath","registry","url","command","resolveProjectPath","isInside","path","stat","error","lstat","createHash","randomUUID","createReadStream","copyFile","lstat","mkdir","mkdtemp","realpath","rm","stat","symlink","writeFile","path","BuildError","profile","stage","path","randomUUID","digestFile","rm","command","assertActive","realpath","stat","error","isInside","lstat","mkdir","assertAbsent","toPosixRelative","mkdtemp","copyFile","symlink","processOptions","hash","createHash","createReadStream","writeFile","lstat","realpath","rm","path","z","namespaceSchema","z","RETRYABLE_PROCESS_FAILURES","BuildError","retryable","createProfile","build","image","realpath","assertMetadataAbsent","reference","createReference","run","rm","readIdentity","command","lstat","isInside","error","path","registry","validHost","url","path","failure","release","verify","recover","assertActive","error","effect","path","releaseIdentitySchema","retryable","z","z","RolloutError","failure","createRollout","release","activate","verify","recover","error","normalize","effect","failureOf","result","releaseIdentitySchema","reference","file","assertEnvironment","z","composeConfigSchema","z","RolloutError","failure","createRollout","rolloutError","release","activate","verify","recover","createWorkloadRollout","activateWorkload","verifyWorkload","recoverWorkload","parseContext","assertPlannedRelease","assertActive","result","error","observePointer","reference","waitSeconds","effectOf","effect","releasePath","file","releaseIdentitySchema","unknownRecovery","retryable","RolloutError","failure","createRollout","release","activate","verify","recover","observePointer","result","effect","stagedOf","toStaged","failedRecovery","unknownRecovery","id","releaseIdentitySchema","createHash","createReadStream","lstat","realpath","stat","path","MAX_DOCUMENT_BYTES","effect","retryable","observe","parseContext","assertActive","release","releasePath","writeDocument","error","effectOf","blue","green","realpath","stat","path","lstat","isInside","digestFile","observePointer","releaseIdentitySchema","file","sorted","digestText","timestamp","hash","createHash","createReadStream","createHash","createReadStream","lstat","open","realpath","stat","path","isDeepStrictEqual","TextDecoder","TargetError","createTarget","observe","readRelease","stage","retain","parseContext","requirePlan","assertActive","parseReleaseIdentity","release","resolveRelease","observePointer","parseArtifact","isDeepStrictEqual","error","serializeRelease","digestText","releaseIdentitySchema","compareNewest","resolveArtifactRoot","digestFile","path","realpath","stat","lstat","isInside","file","open","TextDecoder","hash","createHash","createReadStream","RegistryError","id","profile","createProfile","createTarget","createRollout","createWorkloadRollout","portSchema","z","execute","process","processOptions","command","init","assertActive","processOptions","build","error","result","publish","readDocument","release","verify","rollback","reconcile","createHash","mkdir","stat","path","lstat","readFile","realpath","stat","path","z","constants","lstat","open","stat","path","z","referenceSchema","z","reference","path","lstat","open","constants","error","z","configSchema","loadConfig","registry","readFile","config","path","error","lstat","realpath","stat","randomUUID","createHash","canonical","digest","randomBytes","randomUUID","constants","lstat","mkdir","open","stat","path","z","z","digestSchema","randomUUID","digest","verifyPlan","error","open","path","mkdir","stat","randomBytes","constants","lstat","randomUUID","mkdir","open","stat","path","observe","verifyPlan","randomUUID","binding","result","error","receipt","digest","resource","resources","diagnostics","status","randomUUID","z","digestSchema","z","sinkOperationSchema","randomUUID","createSession","update","registry","loadConfig","secrets","attestation","references","lease","runtime","id","path","parseIntent","result","reference","command","failure","createHash","mkdir","stat","createHash","result","error","init","createRegistry","unique","id","result","createHash","path","effectObservationSchema","z","USER","referenceSchema","z","configSchema","path","planSchema","effect","retryable","verify","reconcile","sshOptions","digest","install","error","effectOf","effectObservationSchema","result","createHash","deploy","command","execute","guarded","createRegistry","program","deploy","guarded","init","build","publish","release","verify","rollback","reconcile"]}