@vm0/cli 9.107.0 → 9.107.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/auth/index.ts","../src/commands/auth/login.ts","../src/lib/api/auth.ts","../src/commands/auth/logout.ts","../src/commands/auth/status.ts","../src/commands/auth/setup-token.ts","../src/commands/info/index.ts","../src/lib/utils/update-checker.ts","../src/lib/utils/spawn.ts","../src/commands/compose/index.ts","../src/lib/domain/yaml-validator.ts","../src/lib/domain/github-skills.ts","../src/lib/external/git-client.ts","../src/lib/storage/system-storage.ts","../src/lib/storage/direct-upload.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/@isaacs/fs-minipass/src/index.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/minipass/src/index.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/create.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/list.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/options.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/make-command.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/parse.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/minizlib/src/index.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/minizlib/src/constants.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/header.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/large-numbers.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/types.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/pax.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/normalize-windows-path.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/read-entry.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/warn-method.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/strip-trailing-slashes.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/pack.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/write-entry.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/mode-fix.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/strip-absolute-path.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/winchars.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/yallist/src/index.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/extract.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/unpack.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/get-write-flag.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/chownr/src/index.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/mkdir.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/cwd-error.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/symlink-error.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/path-reservations.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/normalize-unicode.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/process-umask.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/replace.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/update.ts","../src/lib/utils/file-utils.ts","../src/commands/run/index.ts","../src/commands/run/run.ts","../src/commands/run/resume.ts","../src/commands/run/continue.ts","../src/commands/run/list.ts","../src/commands/run/kill.ts","../src/commands/run/queue.ts","../src/commands/volume/index.ts","../src/commands/volume/init.ts","../src/lib/storage/storage-utils.ts","../src/commands/volume/push.ts","../src/commands/volume/pull.ts","../src/lib/storage/pull-utils.ts","../src/commands/volume/status.ts","../src/commands/volume/list.ts","../src/commands/volume/clone.ts","../src/lib/storage/clone-utils.ts","../src/commands/artifact/index.ts","../src/commands/artifact/init.ts","../src/commands/artifact/push.ts","../src/commands/artifact/pull.ts","../src/commands/artifact/status.ts","../src/commands/artifact/list.ts","../src/commands/artifact/clone.ts","../src/commands/memory/index.ts","../src/commands/memory/init.ts","../src/commands/memory/push.ts","../src/commands/memory/pull.ts","../src/commands/memory/status.ts","../src/commands/memory/list.ts","../src/commands/memory/clone.ts","../src/commands/cook/index.ts","../src/commands/cook/cook.ts","../src/lib/domain/cook-state.ts","../src/commands/cook/utils.ts","../src/commands/cook/logs.ts","../src/commands/cook/continue.ts","../src/commands/cook/resume.ts","../src/commands/logs/index.ts","../src/commands/logs/search.ts","../src/commands/init/index.ts","../src/commands/upgrade/index.ts","../src/commands/whoami.ts"],"sourcesContent":["// VM0 CLI entry point - main module\n// Sentry must be initialized before any other imports\nimport \"./instrument.js\";\nimport { Command } from \"commander\";\nimport { configureGlobalProxyFromEnv } from \"./lib/network/proxy.js\";\nimport { authCommand } from \"./commands/auth\";\nimport { infoCommand } from \"./commands/info\";\nimport { composeCommand } from \"./commands/compose\";\nimport { runCommand } from \"./commands/run\";\nimport { volumeCommand } from \"./commands/volume\";\nimport { artifactCommand } from \"./commands/artifact\";\nimport { memoryCommand } from \"./commands/memory\";\nimport { cookCommand } from \"./commands/cook\";\nimport { logsCommand } from \"./commands/logs\";\n\nimport { initCommand } from \"./commands/init\";\n\nimport { upgradeCommand } from \"./commands/upgrade\";\nimport { whoamiCommand } from \"./commands/whoami\";\n\nconst program = new Command();\n\ndeclare const __CLI_VERSION__: string;\n\nprogram\n .name(\"vm0\")\n .description(\"VM0 CLI - Build and run agents with natural language\")\n .version(__CLI_VERSION__);\n\n// Register all commands\nprogram.addCommand(authCommand);\nprogram.addCommand(infoCommand);\nprogram.addCommand(composeCommand);\nprogram.addCommand(runCommand);\nprogram.addCommand(volumeCommand);\nprogram.addCommand(artifactCommand);\nprogram.addCommand(memoryCommand);\nprogram.addCommand(cookCommand);\nprogram.addCommand(logsCommand);\n\nprogram.addCommand(initCommand);\nprogram.addCommand(upgradeCommand);\nprogram.addCommand(whoamiCommand);\n\nexport { program };\n\nif (\n process.argv[1]?.endsWith(\"index.js\") ||\n process.argv[1]?.endsWith(\"index.ts\") ||\n process.argv[1]?.endsWith(\"vm0\")\n) {\n configureGlobalProxyFromEnv();\n program.parse();\n}\n","import { Command } from \"commander\";\nimport { loginCommand } from \"./login\";\nimport { logoutCommand } from \"./logout\";\nimport { statusCommand } from \"./status\";\nimport { setupTokenCommand } from \"./setup-token\";\n\nexport const authCommand = new Command()\n .name(\"auth\")\n .description(\"Authenticate vm0\")\n .addCommand(loginCommand)\n .addCommand(logoutCommand)\n .addCommand(statusCommand)\n .addCommand(setupTokenCommand);\n","import { Command } from \"commander\";\nimport { authenticate } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const loginCommand = new Command()\n .name(\"login\")\n .description(\"Log in to VM0 (use VM0_API_URL env var to set API URL)\")\n .action(\n withErrorHandler(async () => {\n await authenticate();\n }),\n );\n","import chalk from \"chalk\";\nimport {\n saveConfig,\n clearConfig,\n loadConfig,\n getApiUrl,\n getToken,\n} from \"./config\";\n\n/**\n * Build headers with optional Vercel bypass secret\n * Used to bypass Vercel deployment protection in CI/preview environments\n */\nfunction buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Add Vercel bypass secret if available (for CI/preview deployments)\n const bypassSecret = process.env.VERCEL_AUTOMATION_BYPASS_SECRET;\n if (bypassSecret) {\n headers[\"x-vercel-protection-bypass\"] = bypassSecret;\n }\n\n return headers;\n}\n\nasync function requestDeviceCode(apiUrl: string): Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/device`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify({}),\n });\n\n if (!response.ok) {\n if (response.status === 403) {\n throw new Error(\"An unexpected network issue occurred\");\n }\n throw new Error(`Failed to request device code: ${response.statusText}`);\n }\n\n return response.json() as Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n }>;\n}\n\nasync function exchangeToken(\n apiUrl: string,\n deviceCode: string,\n): Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/token`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify({ device_code: deviceCode }),\n });\n\n return response.json() as Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n }>;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\nexport async function authenticate(apiUrl?: string): Promise<void> {\n // Use provided apiUrl or get from config/env (with fallback to production)\n const targetApiUrl = apiUrl ?? (await getApiUrl());\n console.log(\"Initiating authentication...\");\n\n // Request device code\n const deviceAuth = await requestDeviceCode(targetApiUrl);\n\n console.log(chalk.green(\"\\nDevice code generated\"));\n\n // Construct verification URL from API URL and server-provided path\n const verificationUrl = `${targetApiUrl}${deviceAuth.verification_path}`;\n console.log(chalk.cyan(`\\nTo authenticate, visit: ${verificationUrl}`));\n console.log(`And enter this code: ${chalk.bold(deviceAuth.user_code)}`);\n console.log(\n `\\nThe code expires in ${Math.floor(deviceAuth.expires_in / 60)} minutes.`,\n );\n\n console.log(\"\\nWaiting for authentication...\");\n\n // Poll for token\n const startTime = Date.now();\n const maxWaitTime = deviceAuth.expires_in * 1000; // Convert to milliseconds\n const pollInterval = (deviceAuth.interval || 5) * 1000; // Use server-specified interval or default to 5 seconds\n\n let isFirstPoll = true;\n\n while (Date.now() - startTime < maxWaitTime) {\n // Skip delay on first poll for faster response\n if (!isFirstPoll) {\n await delay(pollInterval); // Use dynamic polling interval\n }\n isFirstPoll = false;\n\n const tokenResult = await exchangeToken(\n targetApiUrl,\n deviceAuth.device_code,\n );\n\n if (tokenResult.access_token) {\n // Success! Store the token and org context\n await saveConfig({\n token: tokenResult.access_token,\n apiUrl: targetApiUrl,\n });\n\n console.log(chalk.green(\"\\nAuthentication successful!\"));\n console.log(\"Your credentials have been saved\");\n return;\n }\n\n if (tokenResult.error === \"authorization_pending\") {\n // Still waiting for user to authenticate\n process.stdout.write(chalk.dim(\".\"));\n continue;\n }\n\n // Handle other errors\n if (tokenResult.error === \"expired_token\") {\n throw new Error(\"Device code expired, please try again\");\n }\n\n if (tokenResult.error) {\n throw new Error(\n `Authentication failed: ${tokenResult.error_description ?? tokenResult.error}`,\n );\n }\n }\n\n // Timeout\n throw new Error(\"Authentication timed out, please try again\");\n}\n\nexport async function logout(): Promise<void> {\n await clearConfig();\n console.log(chalk.green(\"✓ Successfully logged out\"));\n console.log(\"Your credentials have been cleared\");\n}\n\nexport async function checkAuthStatus(): Promise<void> {\n const config = await loadConfig();\n\n if (config.token) {\n console.log(chalk.green(\"✓ Authenticated\"));\n console.log(\"You are logged in to VM0.\");\n } else {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(chalk.dim(\" Run: vm0 auth login\"));\n }\n\n // Also check for environment variable\n if (process.env.VM0_TOKEN) {\n console.log(\"Using token from VM0_TOKEN environment variable\");\n }\n}\n\nexport async function setupToken(): Promise<void> {\n const token = await getToken();\n\n if (!token) {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(\"\");\n console.error(\"To get a token for CI/CD:\");\n console.error(\" 1. Run 'vm0 auth login' to authenticate\");\n console.error(\" 2. Run 'vm0 auth setup-token' to get your token\");\n console.error(\n \" 3. Store the token in your CI/CD secrets (e.g., VM0_TOKEN)\",\n );\n process.exit(1);\n }\n\n console.log(chalk.green(\"✓ Authentication token exported successfully!\"));\n console.log(\"\");\n console.log(\"Your token:\");\n console.log(\"\");\n console.log(token);\n console.log(\"\");\n console.log(\n `Use this token by setting: ${chalk.cyan(\"export VM0_TOKEN=<token>\")}`,\n );\n}\n","import { Command } from \"commander\";\nimport { logout } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const logoutCommand = new Command()\n .name(\"logout\")\n .description(\"Log out of VM0\")\n .action(\n withErrorHandler(async () => {\n await logout();\n }),\n );\n","import { Command } from \"commander\";\nimport { checkAuthStatus } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show current authentication status\")\n .action(\n withErrorHandler(async () => {\n await checkAuthStatus();\n }),\n );\n","import { Command } from \"commander\";\nimport { setupToken } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const setupTokenCommand = new Command()\n .name(\"setup-token\")\n .description(\"Output auth token for CI/CD environments\")\n .action(\n withErrorHandler(async () => {\n await setupToken();\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { existsSync } from \"fs\";\nimport { homedir, release, type } from \"os\";\nimport { join } from \"path\";\nimport { getApiUrl, loadConfig } from \"../../lib/api/config\";\nimport { detectPackageManager } from \"../../lib/utils/update-checker\";\n\ndeclare const __CLI_VERSION__: string;\n\nfunction getConfigPath() {\n return join(homedir(), \".vm0\", \"config.json\");\n}\n\nexport const infoCommand = new Command()\n .name(\"info\")\n .description(\"Display environment and debug information\")\n .action(async () => {\n // CLI version header\n console.log(chalk.bold(`VM0 CLI v${__CLI_VERSION__}`));\n console.log();\n\n // Authentication section\n const config = await loadConfig();\n const hasEnvToken = !!process.env.VM0_TOKEN;\n const hasConfigToken = !!config.token;\n const isAuthenticated = hasEnvToken || hasConfigToken;\n\n console.log(chalk.bold(\"Authentication:\"));\n if (isAuthenticated) {\n const tokenSource = hasEnvToken ? \"VM0_TOKEN env var\" : \"config file\";\n console.log(` ${chalk.green(\"✓\")} Logged in (via ${tokenSource})`);\n } else {\n console.log(` ${chalk.red(\"✗\")} Not authenticated`);\n }\n\n const configExists = existsSync(getConfigPath());\n const configDisplay = configExists\n ? `~/.vm0/config.json`\n : `~/.vm0/config.json (not found)`;\n console.log(` Config: ${configDisplay}`);\n console.log();\n\n // API section\n const apiUrl = await getApiUrl();\n console.log(chalk.bold(\"API:\"));\n console.log(` Host: ${apiUrl}`);\n console.log();\n\n // System section\n console.log(chalk.bold(\"System:\"));\n console.log(` Node: ${process.version}`);\n console.log(` Platform: ${process.platform} (${process.arch})`);\n console.log(` OS: ${type()} ${release()}`);\n console.log(` Shell: ${process.env.SHELL ?? \"unknown\"}`);\n console.log(` Package Manager: ${detectPackageManager()}`);\n });\n","import type { ChildProcess } from \"child_process\";\nimport chalk from \"chalk\";\nimport { safeSpawn } from \"./spawn\";\n\nconst PACKAGE_NAME = \"@vm0/cli\";\nconst NPM_REGISTRY_URL = `https://registry.npmjs.org/${encodeURIComponent(PACKAGE_NAME)}/latest`;\nconst TIMEOUT_MS = 5000;\n\ntype PackageManager = \"npm\" | \"pnpm\" | \"bun\" | \"yarn\" | \"unknown\";\n\n/**\n * Internal state for pending upgrade process\n */\ninterface UpgradeHandle {\n promise: Promise<boolean>;\n child: ChildProcess;\n packageManager: \"npm\" | \"pnpm\";\n}\n\n// Module-level state for pending upgrade\nlet pendingUpgrade: UpgradeHandle | null = null;\n\n/**\n * Detect which package manager was used to install the CLI\n * by checking the executable path for known package manager patterns.\n * Returns \"unknown\" if no known pattern is matched.\n */\nexport function detectPackageManager(): PackageManager {\n const execPath = process.argv[1] ?? \"\";\n\n // Check for pnpm (supported for auto-upgrade)\n if (execPath.includes(\"pnpm\")) {\n return \"pnpm\";\n }\n\n // Check for bun (unsupported - manual upgrade only)\n if (execPath.includes(\"/.bun/\") || execPath.includes(\"/bun/\")) {\n return \"bun\";\n }\n\n // Check for yarn (unsupported - manual upgrade only)\n if (execPath.includes(\"/.yarn/\") || execPath.includes(\"/yarn/\")) {\n return \"yarn\";\n }\n\n // Check for npm (supported for auto-upgrade)\n // Common npm paths: Homebrew, nvm, fnm, volta, nodenv, n, or node_modules\n if (\n execPath.includes(\"/usr/local/\") || // Homebrew on Intel Mac\n execPath.includes(\"/opt/homebrew/\") || // Homebrew on arm64 Mac\n execPath.includes(\"/.nvm/\") ||\n execPath.includes(\"/.fnm/\") ||\n execPath.includes(\"/.volta/\") ||\n execPath.includes(\"/.nodenv/\") ||\n execPath.includes(\"/.n/\") ||\n execPath.includes(\"/node_modules/\") ||\n execPath.includes(\"\\\\npm\\\\\") || // Windows: AppData\\Roaming\\npm\n execPath.includes(\"\\\\nodejs\\\\\") // Windows: Program Files\\nodejs\n ) {\n return \"npm\";\n }\n\n // Unknown package manager - don't assume npm\n return \"unknown\";\n}\n\n/**\n * Check if the package manager supports auto-upgrade\n */\nexport function isAutoUpgradeSupported(\n pm: PackageManager,\n): pm is \"npm\" | \"pnpm\" {\n return pm === \"npm\" || pm === \"pnpm\";\n}\n\n/**\n * Get the manual upgrade command for a package manager\n */\nexport function getManualUpgradeCommand(pm: PackageManager): string {\n switch (pm) {\n case \"bun\":\n return `bun add -g ${PACKAGE_NAME}@latest`;\n case \"yarn\":\n return `yarn global add ${PACKAGE_NAME}@latest`;\n case \"pnpm\":\n return `pnpm add -g ${PACKAGE_NAME}@latest`;\n case \"npm\":\n return `npm install -g ${PACKAGE_NAME}@latest`;\n case \"unknown\":\n return `npm install -g ${PACKAGE_NAME}@latest`;\n }\n}\n\n/**\n * Escape a string for use in shell command display.\n * Uses single quotes which don't interpret any special characters.\n * Embedded single quotes are handled via the '\\'' idiom\n * (end quote, escaped literal quote, start quote).\n */\nfunction escapeForShell(str: string): string {\n return `'${str.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/**\n * Build the re-run command string\n */\nfunction buildRerunCommand(prompt: string | undefined): string {\n if (prompt) {\n return `vm0 cook ${escapeForShell(prompt)}`;\n }\n return \"vm0 cook\";\n}\n\n/**\n * Fetch the latest version of the package from npm registry\n * Returns null if the request fails or times out\n */\nexport async function getLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n return controller.abort();\n }, TIMEOUT_MS);\n\n const response = await fetch(NPM_REGISTRY_URL, {\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return null;\n }\n\n const json = (await response.json()) as { version?: string };\n return json.version ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Execute package manager upgrade command\n * - npm: npm install -g @vm0/cli@latest\n * - pnpm: pnpm add -g @vm0/cli@latest\n * Returns true on success, false on failure\n */\nexport function performUpgrade(\n packageManager: \"npm\" | \"pnpm\",\n): Promise<boolean> {\n return new Promise((resolve) => {\n const args =\n packageManager === \"pnpm\"\n ? [\"add\", \"-g\", `${PACKAGE_NAME}@latest`]\n : [\"install\", \"-g\", `${PACKAGE_NAME}@latest`];\n\n const child = safeSpawn(packageManager, args, {\n stdio: \"inherit\",\n });\n\n child.on(\"close\", (code) => {\n resolve(code === 0);\n });\n\n child.on(\"error\", () => {\n resolve(false);\n });\n });\n}\n\n/**\n * Check for updates and perform upgrade if needed\n * Returns true if caller should exit (upgrade happened or failed)\n * Returns false if caller should continue (no update needed, check failed, or unsupported PM)\n */\nexport async function checkAndUpgrade(\n currentVersion: string,\n prompt: string | undefined,\n): Promise<boolean> {\n const latestVersion = await getLatestVersion();\n\n // If we couldn't check, warn and continue\n if (latestVersion === null) {\n console.log(chalk.yellow(\"⚠ Could not check for updates\"));\n console.log();\n return false;\n }\n\n // If already on latest, continue\n if (latestVersion === currentVersion) {\n return false;\n }\n\n // New version available - show beta notice\n console.log(chalk.yellow(\"vm0 is currently in beta.\"));\n console.log(\n chalk.yellow(\n `Current version: ${currentVersion} -> Latest version: ${latestVersion}`,\n ),\n );\n console.log(\n chalk.yellow(\n \"Please always use the latest version for best compatibility.\",\n ),\n );\n console.log();\n\n // Check package manager\n const packageManager = detectPackageManager();\n\n // For unsupported package managers, show manual upgrade instructions and continue\n if (!isAutoUpgradeSupported(packageManager)) {\n if (packageManager === \"unknown\") {\n console.log(\n chalk.yellow(\"Could not detect your package manager for auto-upgrade.\"),\n );\n } else {\n console.log(\n chalk.yellow(`Auto-upgrade is not supported for ${packageManager}.`),\n );\n }\n console.log(chalk.yellow(\"Please upgrade manually:\"));\n console.log(chalk.cyan(` ${getManualUpgradeCommand(packageManager)}`));\n console.log();\n return false;\n }\n\n // Perform upgrade for supported package managers (npm, pnpm)\n console.log(`Upgrading via ${packageManager}...`);\n const success = await performUpgrade(packageManager);\n\n if (success) {\n console.log(chalk.green(`Upgraded to ${latestVersion}`));\n console.log();\n console.log(\"To continue, run:\");\n console.log(chalk.cyan(` ${buildRerunCommand(prompt)}`));\n return true;\n }\n\n // Upgrade failed - show manual instructions\n console.error();\n console.error(chalk.red(\"✗ Upgrade failed. Please run manually:\"));\n console.error(chalk.cyan(` ${getManualUpgradeCommand(packageManager)}`));\n console.error();\n console.error(\"Then re-run:\");\n console.error(chalk.cyan(` ${buildRerunCommand(prompt)}`));\n return true;\n}\n\n/**\n * Start silent upgrade in background.\n * Call this at command start. Does NOT block after spawning.\n * The upgrade runs in parallel with command execution.\n *\n * @param currentVersion - Current CLI version\n * @returns Promise that resolves after starting upgrade (or determining no upgrade needed)\n */\nexport async function startSilentUpgrade(\n currentVersion: string,\n): Promise<void> {\n // Reset any previous state\n pendingUpgrade = null;\n\n // Check for new version\n const latestVersion = await getLatestVersion();\n\n // If check failed or already on latest, return silently\n if (latestVersion === null || latestVersion === currentVersion) {\n return;\n }\n\n // Check package manager\n const packageManager = detectPackageManager();\n\n // For unsupported package managers, return silently (no whisper)\n if (!isAutoUpgradeSupported(packageManager)) {\n return;\n }\n\n // Spawn upgrade process (don't wait for completion)\n const isWindows = process.platform === \"win32\";\n const args =\n packageManager === \"pnpm\"\n ? [\"add\", \"-g\", `${PACKAGE_NAME}@latest`]\n : [\"install\", \"-g\", `${PACKAGE_NAME}@latest`];\n\n const child = safeSpawn(packageManager, args, {\n stdio: \"pipe\",\n detached: !isWindows,\n windowsHide: true,\n });\n\n const promise = new Promise<boolean>((resolve) => {\n child.on(\"close\", (code) => {\n return resolve(code === 0);\n });\n child.on(\"error\", () => {\n return resolve(false);\n });\n });\n\n pendingUpgrade = { promise, child, packageManager };\n}\n\n/**\n * Wait for pending upgrade to complete and show warning if failed.\n * Call this at command end.\n *\n * @param timeout - Max time to wait if upgrade still running (ms)\n * @returns Promise that resolves when upgrade completes or times out\n */\nexport async function waitForSilentUpgrade(\n timeout: number = TIMEOUT_MS,\n): Promise<void> {\n if (!pendingUpgrade) {\n return;\n }\n\n const { promise, child, packageManager } = pendingUpgrade;\n pendingUpgrade = null; // Clear state\n\n // Race between upgrade completion and timeout\n const result = await Promise.race([\n promise,\n new Promise<false>((resolve) => {\n setTimeout(() => {\n child.kill();\n resolve(false);\n }, timeout);\n }),\n ]);\n\n // Show whisper message only on failure\n if (!result) {\n console.log(\n chalk.yellow(\n `\\n⚠ vm0 auto upgrade failed. Please run: ${getManualUpgradeCommand(packageManager)}`,\n ),\n );\n }\n}\n","import { spawn, type SpawnOptions } from \"child_process\";\nimport type { ChildProcess } from \"child_process\";\n\n/**\n * Spawn a child process with safe Windows shell handling.\n *\n * On Windows, `shell: true` is required to resolve `.cmd` extensions for\n * commands like `npm`, `pnpm`, etc. On other platforms, shell is disabled\n * to avoid unnecessary shell interpretation. Commands passed to this\n * function must be hardcoded strings (not user input), and arguments\n * must use array form to prevent shell injection.\n *\n */\nexport function safeSpawn(\n command: string,\n args: string[],\n options?: Omit<SpawnOptions, \"shell\">,\n): ChildProcess {\n const isWindows = process.platform === \"win32\";\n const resolvedCommand = isWindows ? `${command}.cmd` : command;\n\n // nosemgrep: javascript.lang.security.audit.spawn-shell-true.spawn-shell-true, javascript.lang.security.detect-child-process.detect-child-process\n return spawn(resolvedCommand, args, {\n ...options,\n shell: isWindows,\n });\n}\n","import { Command, Option } from \"commander\";\nimport chalk from \"chalk\";\nimport { readFile, rm } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { extractAndGroupVariables, resolveSkillRef } from \"@vm0/core\";\nimport {\n getComposeByName,\n createOrUpdateCompose,\n listZeroSecrets,\n listZeroVariables,\n listZeroConnectors,\n resolveSkills,\n} from \"../../lib/api\";\nimport { validateAgentCompose } from \"../../lib/domain/yaml-validator\";\nimport {\n downloadGitHubDirectory,\n parseGitHubTreeUrl,\n} from \"../../lib/domain/github-skills\";\nimport {\n uploadInstructions,\n uploadSkill,\n type SkillUploadResult,\n} from \"../../lib/storage/system-storage\";\nimport { isInteractive, promptConfirm } from \"../../lib/utils/prompt-utils\";\nimport {\n startSilentUpgrade,\n waitForSilentUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nconst DEFAULT_CONFIG_FILE = \"vm0.yaml\";\n\n/**\n * Check if input is a GitHub URL (supports plain repo, root with branch, and subdirectory)\n * Matches: https://github.com/owner/repo[/tree/branch[/path]]\n */\nfunction isGitHubUrl(input: string): boolean {\n return /^https:\\/\\/github\\.com\\/[^/]+\\/[^/]+/.test(input);\n}\n\n/**\n * Extract secret names from compose content using variable references.\n * Looks for ${{ secrets.XXX }} patterns in the compose.\n */\nexport function getSecretsFromComposeContent(content: unknown): Set<string> {\n const grouped = extractAndGroupVariables(content);\n return new Set(\n grouped.secrets.map((r) => {\n return r.name;\n }),\n );\n}\n\n/**\n * Extract variable names from compose content using variable references.\n * Looks for ${{ vars.XXX }} patterns in the compose.\n */\nfunction getVarsFromComposeContent(content: unknown): Set<string> {\n const grouped = extractAndGroupVariables(content);\n return new Set(\n grouped.vars.map((r) => {\n return r.name;\n }),\n );\n}\n\ninterface AgentConfig {\n instructions?: string;\n framework?: string;\n skills?: string[];\n environment?: Record<string, string>;\n}\n\ninterface LoadedConfig {\n config: unknown;\n agentName: string;\n agent: AgentConfig;\n basePath: string;\n}\n\n/**\n * Load and validate the compose config file.\n * Returns parsed config with agent info or exits on error.\n */\nasync function loadAndValidateConfig(\n configFile: string,\n): Promise<LoadedConfig> {\n if (!existsSync(configFile)) {\n throw new Error(`Config file not found: ${configFile}`);\n }\n\n const content = await readFile(configFile, \"utf8\");\n\n let config: unknown;\n try {\n config = parseYaml(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n throw new Error(`Invalid YAML format: ${message}`);\n }\n\n const validation = validateAgentCompose(config);\n if (!validation.valid) {\n throw new Error(validation.error);\n }\n\n const cfg = config as Record<string, unknown>;\n const agentsConfig = cfg.agents as Record<string, Record<string, unknown>>;\n const agentName = Object.keys(agentsConfig)[0]!;\n const agent = agentsConfig[agentName] as AgentConfig;\n const basePath = dirname(configFile);\n\n return { config, agentName, agent, basePath };\n}\n\n/**\n * Type guard to check if config has a non-empty volumes field.\n */\nfunction hasVolumes(config: unknown): boolean {\n if (typeof config !== \"object\" || config === null) {\n return false;\n }\n const cfg = config as Record<string, unknown>;\n const volumes = cfg.volumes;\n return (\n typeof volumes === \"object\" &&\n volumes !== null &&\n Object.keys(volumes).length > 0\n );\n}\n\n/**\n * Upload instructions and skills, returning skill results.\n */\nasync function uploadAssets(\n agentName: string,\n agent: AgentConfig,\n basePath: string,\n jsonMode?: boolean,\n): Promise<SkillUploadResult[]> {\n if (agent.instructions) {\n if (!jsonMode) {\n console.log(`Uploading instructions: ${agent.instructions}`);\n }\n const result = await uploadInstructions(\n agentName,\n agent.instructions,\n basePath,\n agent.framework,\n );\n if (!jsonMode) {\n console.log(\n chalk.green(\n `✓ Instructions ${result.action === \"deduplicated\" ? \"(unchanged)\" : \"uploaded\"}: ${result.versionId.slice(0, 8)}`,\n ),\n );\n }\n }\n\n const skillResults: SkillUploadResult[] = [];\n if (agent.skills && Array.isArray(agent.skills)) {\n // Normalize bare skill names to full GitHub URLs before upload\n agent.skills = agent.skills.map(resolveSkillRef);\n\n if (!jsonMode) {\n console.log(`Uploading ${agent.skills.length} skill(s)...`);\n }\n\n // Batch resolve official skills against server cache\n const { resolved, unresolved } = await resolveSkills(agent.skills);\n\n // Use resolved skills directly (no download, no upload)\n for (const skillUrl of agent.skills) {\n const skill = resolved[skillUrl];\n if (skill) {\n const parsed = parseGitHubTreeUrl(skillUrl);\n skillResults.push({\n name: skill.storageName,\n versionId: skill.versionHash,\n action: \"resolved\",\n skillName: parsed.skillName,\n frontmatter: skill.frontmatter,\n });\n if (!jsonMode) {\n console.log(chalk.green(` ✓ ${parsed.skillName} (cached)`));\n }\n }\n }\n\n // Fall back to old flow for unresolved skills\n for (const skillUrl of unresolved) {\n if (!jsonMode) {\n console.log(chalk.dim(` Downloading: ${skillUrl}`));\n }\n const result = await uploadSkill(skillUrl);\n skillResults.push(result);\n if (!jsonMode) {\n console.log(\n chalk.green(\n ` ✓ Skill ${result.action === \"deduplicated\" ? \"(unchanged)\" : \"uploaded\"}: ${result.skillName} (${result.versionId.slice(0, 8)})`,\n ),\n );\n }\n }\n }\n\n return skillResults;\n}\n\n/**\n * Derive the app URL from the API URL by replacing \"www\" with \"app\" in the hostname.\n */\ninterface MissingItemsResult {\n missingSecrets: string[];\n missingVars: string[];\n}\n\n/**\n * Check for missing secrets/vars and print setup URL if any are missing.\n */\nasync function checkAndPromptMissingItems(\n config: unknown,\n options: { json?: boolean },\n): Promise<MissingItemsResult> {\n const requiredSecrets = getSecretsFromComposeContent(config);\n const requiredVars = getVarsFromComposeContent(config);\n\n if (requiredSecrets.size === 0 && requiredVars.size === 0) {\n return { missingSecrets: [], missingVars: [] };\n }\n\n const [secretsResponse, variablesResponse, connectorsResponse] =\n await Promise.all([\n requiredSecrets.size > 0 ? listZeroSecrets() : { secrets: [] },\n requiredVars.size > 0 ? listZeroVariables() : { variables: [] },\n listZeroConnectors(),\n ]);\n\n const existingSecretNames = new Set(\n secretsResponse.secrets.map((s) => {\n return s.name;\n }),\n );\n const existingVarNames = new Set(\n variablesResponse.variables.map((v) => {\n return v.name;\n }),\n );\n\n // Connector-provided secrets (e.g., GH_TOKEN from GitHub connector)\n // Use server-computed list to avoid CLI/server version skew issues\n const connectorProvided = new Set(\n connectorsResponse.connectorProvidedSecretNames,\n );\n\n const missingSecrets = [...requiredSecrets].filter((name) => {\n return !existingSecretNames.has(name) && !connectorProvided.has(name);\n });\n const missingVars = [...requiredVars].filter((name) => {\n return !existingVarNames.has(name);\n });\n\n if (missingSecrets.length === 0 && missingVars.length === 0) {\n return { missingSecrets: [], missingVars: [] };\n }\n\n if (!options.json) {\n console.log();\n console.log(chalk.yellow(\"⚠ Missing secrets/variables detected:\"));\n if (missingSecrets.length > 0) {\n console.log(chalk.yellow(` Secrets: ${missingSecrets.join(\", \")}`));\n }\n if (missingVars.length > 0) {\n console.log(chalk.yellow(` Variables: ${missingVars.join(\", \")}`));\n }\n console.log();\n }\n\n return { missingSecrets, missingVars };\n}\n\n/**\n * Result from finalizeCompose for JSON output\n */\ninterface ComposeResult {\n composeId: string;\n composeName: string;\n versionId: string;\n action: \"created\" | \"existing\";\n displayName: string;\n missingSecrets?: string[];\n missingVars?: string[];\n}\n\n/**\n * Finalize compose: call API and display result.\n * Shared by both GitHub URL and local file flows.\n * Returns the compose result for JSON output mode.\n */\nasync function finalizeCompose(\n config: unknown,\n agent: AgentConfig,\n options: { yes?: boolean; autoUpdate?: boolean; json?: boolean },\n): Promise<ComposeResult> {\n // Call API\n if (!options.json) {\n console.log(\"Uploading compose...\");\n }\n const response = await createOrUpdateCompose({ content: config });\n\n const shortVersionId = response.versionId.slice(0, 8);\n const displayName = response.name;\n\n // Build result\n const result: ComposeResult = {\n composeId: response.composeId,\n composeName: response.name,\n versionId: response.versionId,\n action: response.action,\n displayName,\n };\n\n // In --json mode, skip missing items check — E2B doesn't read these fields\n if (!options.json) {\n const missingItems = await checkAndPromptMissingItems(config, options);\n if (\n missingItems.missingSecrets.length > 0 ||\n missingItems.missingVars.length > 0\n ) {\n result.missingSecrets = missingItems.missingSecrets;\n result.missingVars = missingItems.missingVars;\n }\n }\n\n // Display human-readable result (skip in JSON mode)\n if (!options.json) {\n if (response.action === \"created\") {\n console.log(chalk.green(`✓ Compose created: ${displayName}`));\n } else {\n console.log(chalk.green(`✓ Compose version exists: ${displayName}`));\n }\n\n console.log(chalk.dim(` Version: ${shortVersionId}`));\n console.log();\n console.log(\" Run your agent:\");\n console.log(\n chalk.cyan(\n ` vm0 run ${displayName}:${shortVersionId} --artifact-name <artifact> \"your prompt\"`,\n ),\n );\n }\n\n // Wait for upgrade at command end (shows warning if failed)\n if (options.autoUpdate !== false) {\n await waitForSilentUpgrade();\n }\n\n return result;\n}\n\n/**\n * Handle compose from GitHub URL\n */\nasync function handleGitHubCompose(\n url: string,\n options: { yes?: boolean; autoUpdate?: boolean; json?: boolean },\n): Promise<ComposeResult> {\n if (!options.json) {\n console.log(`Downloading from GitHub: ${url}`);\n }\n\n const { dir: downloadedDir, tempRoot } = await downloadGitHubDirectory(url);\n const configFile = join(downloadedDir, \"vm0.yaml\");\n\n try {\n if (!existsSync(configFile)) {\n throw new Error(\"vm0.yaml not found in the GitHub directory\", {\n cause: new Error(`URL: ${url}`),\n });\n }\n\n // Load and validate config\n const { config, agentName, agent, basePath } =\n await loadAndValidateConfig(configFile);\n\n // Check if agent with same name already exists\n const existingCompose = await getComposeByName(agentName);\n if (existingCompose) {\n if (!options.json) {\n console.log();\n console.log(\n chalk.yellow(`⚠ An agent named \"${agentName}\" already exists.`),\n );\n }\n\n if (!isInteractive()) {\n // Non-interactive mode: require --yes flag to overwrite\n if (!options.yes) {\n throw new Error(\n \"Cannot overwrite existing agent in non-interactive mode\",\n {\n cause: new Error(\n \"Use --yes flag to confirm overwriting the existing agent.\",\n ),\n },\n );\n }\n } else {\n // Interactive mode: prompt user (default No)\n const confirmed = await promptConfirm(\n \"Do you want to overwrite it?\",\n false,\n );\n if (!confirmed) {\n if (!options.json) {\n console.log(chalk.yellow(\"Compose cancelled.\"));\n }\n process.exit(0);\n }\n }\n }\n\n // Check for unsupported volumes\n if (hasVolumes(config)) {\n throw new Error(\"Volumes are not supported for GitHub URL compose\", {\n cause: new Error(\n \"Clone the repository locally and run: vm0 compose ./path/to/vm0.yaml\",\n ),\n });\n }\n\n // Upload instructions and skills\n await uploadAssets(agentName, agent, basePath, options.json);\n\n // Finalize compose (upload, display)\n return await finalizeCompose(config, agent, options);\n } finally {\n // Cleanup temp directory\n await rm(tempRoot, { recursive: true, force: true });\n }\n}\n\nexport const composeCommand = new Command()\n .name(\"compose\")\n .description(\"Create or update agent compose (e.g., vm0.yaml)\")\n .argument(\n \"[agent-yaml]\",\n `Path to agent YAML file or GitHub tree URL (default: ${DEFAULT_CONFIG_FILE})`,\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\n \"--experimental-shared-compose\",\n \"[deprecated] No longer required, kept for backward compatibility\",\n )\n .option(\"--json\", \"Output JSON for scripts (suppresses interactive output)\")\n .option(\n \"--porcelain\",\n \"[deprecated: use --json] Output JSON for scripts\",\n false,\n )\n .addOption(new Option(\"--no-auto-update\").hideHelp())\n .action(\n withErrorHandler(\n async (\n configFile: string | undefined,\n options: {\n yes?: boolean;\n autoUpdate?: boolean;\n experimentalSharedCompose?: boolean;\n json?: boolean;\n porcelain?: boolean;\n },\n ) => {\n const resolvedConfigFile = configFile ?? DEFAULT_CONFIG_FILE;\n\n // Handle deprecated --porcelain flag\n if (options.porcelain && !options.json) {\n console.error(\n chalk.yellow(\"⚠ --porcelain is deprecated, use --json instead\"),\n );\n options.json = true;\n }\n\n // JSON mode implies --yes and disables auto-update (for CI/CD usage)\n if (options.json) {\n options.yes = true;\n options.autoUpdate = false;\n }\n\n // Start upgrade in background at command start (runs in parallel)\n if (options.autoUpdate !== false) {\n await startSilentUpgrade(__CLI_VERSION__);\n }\n\n try {\n let result: ComposeResult;\n\n // Branch based on input type\n if (isGitHubUrl(resolvedConfigFile)) {\n result = await handleGitHubCompose(resolvedConfigFile, options);\n } else {\n // Existing local file flow\n // 1. Load and validate config\n const { config, agentName, agent, basePath } =\n await loadAndValidateConfig(resolvedConfigFile);\n\n // 3. Upload instructions and skills\n await uploadAssets(agentName, agent, basePath, options.json);\n\n // 4. Finalize compose (upload, display)\n result = await finalizeCompose(config, agent, options);\n }\n\n // Output JSON result if requested\n if (options.json) {\n console.log(JSON.stringify(result));\n }\n } catch (error) {\n if (options.json) {\n const message =\n error instanceof Error\n ? error.message\n : \"An unexpected error occurred\";\n console.log(JSON.stringify({ error: message }));\n process.exit(1);\n }\n\n throw error;\n }\n },\n ),\n );\n","import { z } from \"zod\";\nimport {\n agentDefinitionSchema,\n volumeConfigSchema,\n resolveSkillRef,\n} from \"@vm0/core\";\n\n/**\n * CLI-specific agent name schema that allows 3-character names.\n * Pattern: start/end with alphanumeric, middle can have hyphens\n */\nconst cliAgentNameSchema = z\n .string()\n .min(3, \"Agent name must be at least 3 characters\")\n .max(64, \"Agent name must be 64 characters or less\")\n .regex(\n /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$/,\n \"Agent name must start and end with letter or number, and contain only letters, numbers, and hyphens\",\n );\n\n/**\n * CLI-extended agent definition schema with skills URL validation\n *\n * Note: Framework validation is handled server-side.\n * The server rejects unsupported frameworks.\n */\nconst cliAgentDefinitionSchema = agentDefinitionSchema.superRefine(\n (agent, ctx) => {\n // Validate skills: bare names or full GitHub URLs\n if (agent.skills) {\n for (let i = 0; i < agent.skills.length; i++) {\n const skillRef = agent.skills[i];\n if (skillRef) {\n try {\n resolveSkillRef(skillRef);\n } catch (error) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n error instanceof Error\n ? error.message\n : `Invalid skill reference: ${skillRef}`,\n path: [\"skills\", i],\n });\n }\n }\n }\n }\n },\n);\n\n/**\n * CLI compose schema with single-agent rule and volume mount validation\n */\nconst cliComposeSchema = z\n .object({\n version: z.string().min(1, \"Missing config.version\"),\n agents: z.record(cliAgentNameSchema, cliAgentDefinitionSchema),\n volumes: z.record(z.string(), volumeConfigSchema).optional(),\n })\n .superRefine((config, ctx) => {\n const agentKeys = Object.keys(config.agents);\n\n // CLI business rule: at least one agent required\n if (agentKeys.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"agents must have at least one agent defined\",\n path: [\"agents\"],\n });\n return;\n }\n\n // CLI business rule: only one agent allowed\n if (agentKeys.length > 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Multiple agents not supported yet. Only one agent allowed.\",\n path: [\"agents\"],\n });\n return;\n }\n\n // Volume mount validation\n const agentName = agentKeys[0]!;\n const agent = config.agents[agentName];\n const agentVolumes = agent?.volumes;\n\n if (agentVolumes && agentVolumes.length > 0) {\n if (!config.volumes) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Agent references volumes but no volumes section defined. Each volume must have explicit name and version.\",\n path: [\"volumes\"],\n });\n return;\n }\n\n for (const volDeclaration of agentVolumes) {\n const parts = volDeclaration.split(\":\");\n if (parts.length !== 2) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid volume declaration: ${volDeclaration}. Expected format: volume-key:/mount/path`,\n path: [\"agents\", agentName, \"volumes\"],\n });\n continue;\n }\n\n const volumeKey = parts[0]!.trim();\n if (!config.volumes[volumeKey]) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Volume \"${volumeKey}\" is not defined in volumes section. Each volume must have explicit name and version.`,\n path: [\"volumes\", volumeKey],\n });\n }\n }\n }\n });\n\n/**\n * Format an invalid_type Zod issue into a user-friendly message.\n * Returns null if no special formatting applies.\n */\nfunction formatInvalidTypeIssue(\n path: string,\n issue: z.ZodIssue & { expected?: string },\n): string | null {\n // Zod 4 uses 'input' instead of 'received' in types, but runtime has 'received'\n const received = (issue as unknown as { received?: string }).received;\n\n // Missing required fields (handles both \"Required\" and \"Invalid input:\" messages)\n const isMissing =\n received === \"undefined\" ||\n issue.message.includes(\"received undefined\") ||\n issue.message === \"Required\";\n\n if (path === \"version\" && isMissing) {\n return \"Missing config.version\";\n }\n if (path === \"agents\" && isMissing) {\n return \"Missing agents object in config\";\n }\n // Volume field errors\n if (path.startsWith(\"volumes.\") && path.endsWith(\".name\")) {\n const volumeKey = path.split(\".\")[1];\n return `Volume \"${volumeKey}\" must have a 'name' field (string)`;\n }\n if (path.startsWith(\"volumes.\") && path.endsWith(\".version\")) {\n const volumeKey = path.split(\".\")[1];\n return `Volume \"${volumeKey}\" must have a 'version' field (string)`;\n }\n // Array type errors\n if (issue.expected === \"array\") {\n const fieldName = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n return `${fieldName} must be an array`;\n }\n // Array element type errors (number where string expected)\n if (issue.expected === \"string\" && received === \"number\") {\n const fieldName = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n const match = fieldName.match(/^(agent\\.[^.]+)\\.\\d+$/);\n if (match) {\n return `Each entry in ${match[1]?.replace(\"agent.\", \"\")} must be a string`;\n }\n }\n return null;\n}\n\n/**\n * Formats a Zod error into a user-friendly string\n */\nfunction formatZodError(error: z.ZodError): string {\n const issue = error.issues[0];\n if (!issue) return \"Validation failed\";\n\n const path = issue.path.join(\".\");\n const message = issue.message;\n\n // Root-level errors or custom messages without path context\n if (!path) return message;\n\n // Handle invalid_type errors with user-friendly messages\n if (issue.code === \"invalid_type\") {\n const formatted = formatInvalidTypeIssue(path, issue);\n if (formatted) return formatted;\n }\n\n // Handle invalid_key for agent name key validation (Zod 4 uses invalid_key instead of invalid_string)\n if (issue.code === \"invalid_key\" && path.startsWith(\"agents.\")) {\n return \"Invalid agent name format. Must be 3-64 characters, letters, numbers, and hyphens only. Must start and end with letter or number.\";\n }\n\n // Handle invalid key in record (agent name validation)\n if (message === \"Invalid key in record\" && path.startsWith(\"agents.\")) {\n return \"Invalid agent name format. Must be 3-64 characters, letters, numbers, and hyphens only. Must start and end with letter or number.\";\n }\n\n // Handle custom errors (our superRefine messages) - return without path prefix\n if (issue.code === \"custom\") {\n return message;\n }\n\n // Handle agent-level errors with cleaner paths\n if (path.startsWith(\"agents.\")) {\n const cleanPath = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n // For \"Invalid input\" messages, provide cleaner error\n if (message.startsWith(\"Invalid input:\")) {\n const match = message.match(/expected (\\w+), received (\\w+)/);\n if (match && match[1] === \"string\" && match[2] === \"number\") {\n const fieldMatch = cleanPath.match(/^(agent\\.[^.]+)\\.\\d+$/);\n if (fieldMatch) {\n return `Each entry in ${fieldMatch[1]?.replace(\"agent.\", \"\")} must be a string`;\n }\n }\n }\n return `${cleanPath}: ${message}`;\n }\n\n return `${path}: ${message}`;\n}\n\n/**\n * Validates agent.name format\n */\nexport function validateAgentName(name: string): boolean {\n return cliAgentNameSchema.safeParse(name).success;\n}\n\n/**\n * Known fields in agent definition schema, derived from the Zod schema shape.\n * Used for typo detection against unknown fields in YAML config.\n */\nconst KNOWN_AGENT_FIELDS = Object.keys(agentDefinitionSchema.shape);\n\n/**\n * Computes Levenshtein edit distance between two strings.\n * Uses single-row DP optimization for O(min(m,n)) space.\n */\nfunction levenshteinDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n\n // Ensure a is the shorter string for space optimization\n if (a.length > b.length) [a, b] = [b, a];\n\n const row = Array.from({ length: a.length + 1 }, (_, i) => {\n return i;\n });\n\n for (let j = 1; j <= b.length; j++) {\n let prev = j - 1;\n row[0] = j;\n for (let i = 1; i <= a.length; i++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n const current = Math.min(\n row[i]! + 1, // deletion\n row[i - 1]! + 1, // insertion\n prev + cost, // substitution\n );\n prev = row[i]!;\n row[i] = current;\n }\n }\n\n return row[a.length]!;\n}\n\n/**\n * Finds the most similar known field for an unknown field name.\n * Uses two strategies:\n * 1. Levenshtein distance ≤ 2 for close typos (e.g., \"environments\" → \"environment\")\n * 2. Prefix containment for abbreviations (e.g., \"env\" → \"environment\")\n *\n * Returns the best matching field name, or null if no match found.\n */\nfunction findSimilarField(\n unknown: string,\n knownFields: string[],\n): string | null {\n let bestMatch: string | null = null;\n let bestDistance = Infinity;\n\n for (const known of knownFields) {\n if (unknown === known) continue;\n\n // Check 1: Levenshtein distance ≤ 2\n const distance = levenshteinDistance(unknown, known);\n if (distance <= 2 && distance < bestDistance) {\n bestDistance = distance;\n bestMatch = known;\n }\n\n // Check 2: Prefix containment (unknown is a prefix of known, min 3 chars)\n if (unknown.length >= 3 && known.startsWith(unknown) && !bestMatch) {\n bestMatch = known;\n }\n }\n\n return bestMatch;\n}\n\n/**\n * Extracts agent entries from raw config, with type guards.\n * Returns null if config structure is invalid for agent inspection.\n */\nfunction extractAgentEntries(\n config: unknown,\n): Record<string, Record<string, unknown>> | null {\n if (!config || typeof config !== \"object\") return null;\n const cfg = config as Record<string, unknown>;\n const agents = cfg.agents as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (!agents || typeof agents !== \"object\" || Array.isArray(agents))\n return null;\n return agents;\n}\n\n/**\n * Checks for unknown fields in agent definitions that look like typos.\n * Returns an error message listing all detected typos, or null if none found.\n */\nfunction checkForFieldTypos(config: unknown): string | null {\n const agents = extractAgentEntries(config);\n if (!agents) return null;\n\n const errors: string[] = [];\n\n for (const [agentName, agent] of Object.entries(agents)) {\n if (!agent || typeof agent !== \"object\" || Array.isArray(agent)) continue;\n\n for (const field of Object.keys(agent)) {\n if (KNOWN_AGENT_FIELDS.includes(field)) continue;\n\n const suggestion = findSimilarField(field, KNOWN_AGENT_FIELDS);\n if (suggestion) {\n errors.push(\n `Unknown field \"${field}\" in agent \"${agentName}\". Did you mean \"${suggestion}\"?`,\n );\n }\n }\n }\n\n return errors.length > 0 ? errors.join(\"\\n\") : null;\n}\n\n/**\n * Checks for deprecated 'provider' field and returns migration error message\n */\nfunction checkForDeprecatedProvider(config: unknown): string | null {\n const agents = extractAgentEntries(config);\n if (!agents) return null;\n\n for (const agent of Object.values(agents)) {\n if (agent && typeof agent === \"object\" && !Array.isArray(agent)) {\n if (\"provider\" in agent && !(\"framework\" in agent)) {\n const providerValue = agent.provider;\n return `'provider' field is deprecated. Use 'framework' instead.\\n\\nChange in your vm0.yaml:\\n - provider: ${providerValue}\\n + framework: ${providerValue}`;\n }\n }\n }\n return null;\n}\n\n/**\n * Validates agent compose structure using Zod schemas\n */\nexport function validateAgentCompose(config: unknown): {\n valid: boolean;\n error?: string;\n} {\n // Pre-check: Deprecated 'provider' field\n const deprecationError = checkForDeprecatedProvider(config);\n if (deprecationError) {\n return { valid: false, error: deprecationError };\n }\n\n // Pre-check: Detect likely typos in agent definition fields\n const typoError = checkForFieldTypos(config);\n if (typoError) {\n return { valid: false, error: typoError };\n }\n\n // Pre-check: Better error for array agents (common mistake)\n if (\n config &&\n typeof config === \"object\" &&\n Array.isArray((config as Record<string, unknown>).agents)\n ) {\n return {\n valid: false,\n error:\n \"agents must be an object, not an array. Use format: agents: { agent-name: { ... } }\",\n };\n }\n\n // Pre-check: Basic object check\n if (!config || typeof config !== \"object\") {\n return { valid: false, error: \"Config must be an object\" };\n }\n\n // Main validation using CLI compose schema\n const result = cliComposeSchema.safeParse(config);\n if (!result.success) {\n return { valid: false, error: formatZodError(result.error) };\n }\n\n return { valid: true };\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport {\n getInstructionsStorageName,\n getSkillStorageName as getCoreSkillStorageName,\n parseGitHubTreeUrl as parseGitHubTreeUrlCore,\n parseSkillFrontmatter,\n type ParsedGitHubTreeUrl,\n type SkillFrontmatter,\n} from \"@vm0/core\";\n\n// Re-export from @vm0/core for convenience\nexport { getInstructionsStorageName, type SkillFrontmatter };\n\n// Re-export git operations from boundary module for backward compatibility\nexport {\n downloadGitHubSkill,\n downloadGitHubDirectory,\n} from \"../external/git-client\";\n\n// Re-export the type with the local name for backwards compatibility\ntype ParsedGitHubUrl = ParsedGitHubTreeUrl;\n\n/**\n * Parse a GitHub tree URL into its components\n * Expected format: https://github.com/{owner}/{repo}/tree/{branch}/{path}\n *\n * Note: Branch names containing slashes (e.g., feature/foo) may not parse correctly.\n * The fullPath field is always correct and used for unique storage naming.\n *\n * @param url - GitHub tree URL\n * @returns Parsed URL components\n * @throws Error if URL format is invalid\n */\nexport function parseGitHubTreeUrl(url: string): ParsedGitHubUrl {\n const parsed = parseGitHubTreeUrlCore(url);\n if (!parsed) {\n throw new Error(\n `Invalid GitHub tree URL: ${url}. Expected format: https://github.com/{owner}/{repo}/tree/{branch}/{path}`,\n );\n }\n return parsed;\n}\n\n/**\n * Generate the storage name for an agent skill\n * Format: agent-skills@{fullPath}\n *\n * @param parsed - Parsed GitHub URL\n * @returns Storage name for the skill\n */\nexport function getSkillStorageName(parsed: ParsedGitHubUrl): string {\n return getCoreSkillStorageName(parsed.fullPath);\n}\n\n/**\n * Validate that a downloaded skill has the required SKILL.md file\n *\n * @param skillDir - Path to the downloaded skill directory\n * @returns True if valid, throws error otherwise\n */\nexport async function validateSkillDirectory(skillDir: string): Promise<void> {\n const skillMdPath = path.join(skillDir, \"SKILL.md\");\n try {\n await fs.access(skillMdPath);\n } catch {\n throw new Error(\n `Skill directory missing required SKILL.md file: ${skillDir}`,\n );\n }\n}\n\n/**\n * Read and parse SKILL.md frontmatter from a skill directory\n *\n * @param skillDir - Path to the skill directory\n * @returns Parsed frontmatter fields\n */\nexport async function readSkillFrontmatter(\n skillDir: string,\n): Promise<SkillFrontmatter> {\n const skillMdPath = path.join(skillDir, \"SKILL.md\");\n const content = await fs.readFile(skillMdPath, \"utf8\");\n return parseSkillFrontmatter(content);\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport {\n parseGitHubUrl as parseGitHubUrlCore,\n type ParsedGitHubTreeUrl,\n} from \"@vm0/core\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Sanitize a value intended as a git positional argument to prevent\n * second-order command injection via flags like `--upload-pack`.\n * Only allows safe characters (alphanumeric, dash, underscore, dot, slash).\n * Returns the value if safe; throws otherwise.\n */\nfunction sanitizeGitArg(value: string, label: string): string {\n if (!/^[a-zA-Z0-9._/\\-@]+$/.test(value)) {\n throw new Error(\n `Invalid ${label}: contains disallowed characters. Only alphanumeric, dash, underscore, dot, slash, and @ are permitted.`,\n );\n }\n if (value.startsWith(\"-\")) {\n throw new Error(`Invalid ${label}: must not start with a dash`);\n }\n return value;\n}\n\n/**\n * Result of downloading a GitHub directory\n */\ninterface GitHubDownloadResult {\n /** Path to the downloaded directory */\n dir: string;\n /** Path to the temp root directory (for cleanup) */\n tempRoot: string;\n}\n\n/**\n * Download a GitHub directory using git sparse-checkout\n *\n * @param parsed - Parsed GitHub URL\n * @param destDir - Destination directory for the downloaded content\n * @returns Path to the downloaded skill directory\n */\nexport async function downloadGitHubSkill(\n parsed: ParsedGitHubTreeUrl,\n destDir: string,\n): Promise<string> {\n const owner = sanitizeGitArg(parsed.owner, \"repository owner\");\n const repo = sanitizeGitArg(parsed.repo, \"repository name\");\n const branch = sanitizeGitArg(parsed.branch, \"branch name\");\n const repoUrl = `https://github.com/${owner}/${repo}.git`;\n const skillDir = path.join(destDir, parsed.skillName);\n\n // Create a temporary directory for sparse checkout\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), \"vm0-skill-\"));\n\n try {\n // Initialize sparse checkout\n await execFileAsync(\"git\", [\"init\"], { cwd: tempDir });\n await execFileAsync(\"git\", [\"remote\", \"add\", \"origin\", repoUrl], {\n cwd: tempDir,\n });\n await execFileAsync(\"git\", [\"config\", \"core.sparseCheckout\", \"true\"], {\n cwd: tempDir,\n });\n\n // Configure sparse checkout to only fetch the skill path\n // For root: use \"/*\" to get all root-level files\n // For path: use the path directly\n const sparsePattern = parsed.path || \"/*\";\n const sparseFile = path.join(tempDir, \".git\", \"info\", \"sparse-checkout\");\n await fs.writeFile(sparseFile, sparsePattern + \"\\n\");\n\n // Fetch only the required branch\n await execFileAsync(\"git\", [\"fetch\", \"--depth\", \"1\", \"origin\", branch], {\n cwd: tempDir,\n });\n await execFileAsync(\"git\", [\"checkout\", branch], { cwd: tempDir });\n\n // Move the skill directory to destination\n await fs.mkdir(path.dirname(skillDir), { recursive: true });\n if (parsed.path) {\n // Subdirectory: move the fetched subdirectory\n const fetchedPath = path.join(tempDir, parsed.path);\n await fs.rename(fetchedPath, skillDir);\n } else {\n // Root: move all entries except .git from tempDir\n await fs.mkdir(skillDir, { recursive: true });\n const entries = await fs.readdir(tempDir);\n for (const entry of entries) {\n if (entry === \".git\") continue;\n await fs.rename(path.join(tempDir, entry), path.join(skillDir, entry));\n }\n }\n\n return skillDir;\n } finally {\n // Clean up temp directory\n await fs.rm(tempDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Get the default branch of a GitHub repository using git ls-remote.\n * This avoids dependency on gh CLI and works with just git installed.\n *\n * @param owner - Repository owner\n * @param repo - Repository name\n * @returns Default branch name\n */\nasync function getDefaultBranch(owner: string, repo: string): Promise<string> {\n const safeOwner = sanitizeGitArg(owner, \"repository owner\");\n const safeRepo = sanitizeGitArg(repo, \"repository name\");\n const repoUrl = `https://github.com/${safeOwner}/${safeRepo}.git`;\n try {\n // git ls-remote --symref outputs:\n // ref: refs/heads/main HEAD\n // a1b2c3d... HEAD\n const { stdout } = await execFileAsync(\"git\", [\n \"ls-remote\",\n \"--symref\",\n repoUrl,\n \"HEAD\",\n ]);\n\n // Extract branch name from \"ref: refs/heads/main\" line\n const match = stdout.match(/ref: refs\\/heads\\/([^\\s]+)/);\n if (!match) {\n throw new Error(\n `Could not determine default branch for ${owner}/${repo}`,\n );\n }\n return match[1]!;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"not found\") ||\n message.includes(\"Repository not found\")\n ) {\n throw new Error(`Repository not found: ${owner}/${repo}`);\n }\n if (\n message.includes(\"Authentication failed\") ||\n message.includes(\"could not read Username\")\n ) {\n throw new Error(\n `Cannot access repository ${owner}/${repo}. Is it private?`,\n );\n }\n throw error;\n }\n}\n\n/**\n * Download a GitHub directory using git sparse-checkout.\n * Returns paths to both the downloaded directory and the temp root for cleanup.\n *\n * Supports multiple URL formats:\n * - https://github.com/owner/repo (plain repo, uses default branch, downloads root)\n * - https://github.com/owner/repo/tree/branch (root directory with explicit branch)\n * - https://github.com/owner/repo/tree/branch/path (subdirectory)\n *\n * @param url - GitHub URL\n * @returns Object with dir (downloaded path) and tempRoot (for cleanup)\n */\nexport async function downloadGitHubDirectory(\n url: string,\n): Promise<GitHubDownloadResult> {\n const parsed = parseGitHubUrlCore(url);\n if (!parsed) {\n throw new Error(\n `Invalid GitHub URL: ${url}. Expected format: https://github.com/{owner}/{repo}[/tree/{branch}[/path]]`,\n );\n }\n\n const safeOwner = sanitizeGitArg(parsed.owner, \"repository owner\");\n const safeRepo = sanitizeGitArg(parsed.repo, \"repository name\");\n const repoUrl = `https://github.com/${safeOwner}/${safeRepo}.git`;\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), \"vm0-github-\"));\n\n try {\n // Check git is available\n try {\n await execFileAsync(\"git\", [\"--version\"]);\n } catch {\n throw new Error(\n \"git command not found. Please install git to use GitHub URLs.\",\n );\n }\n\n // Resolve branch if not specified\n const branch = sanitizeGitArg(\n parsed.branch ?? (await getDefaultBranch(safeOwner, safeRepo)),\n \"branch name\",\n );\n\n // Initialize sparse checkout\n await execFileAsync(\"git\", [\"init\"], { cwd: tempDir });\n await execFileAsync(\"git\", [\"remote\", \"add\", \"origin\", repoUrl], {\n cwd: tempDir,\n });\n await execFileAsync(\"git\", [\"config\", \"core.sparseCheckout\", \"true\"], {\n cwd: tempDir,\n });\n\n // Configure sparse checkout pattern\n // For root: use \"/*\" to get all root-level files\n // For path: use the path directly\n const sparsePattern = parsed.path ?? \"/*\";\n const sparseFile = path.join(tempDir, \".git\", \"info\", \"sparse-checkout\");\n await fs.writeFile(sparseFile, sparsePattern + \"\\n\");\n\n // Fetch only the required branch with better error handling\n try {\n await execFileAsync(\"git\", [\"fetch\", \"--depth\", \"1\", \"origin\", branch], {\n cwd: tempDir,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"Authentication failed\") ||\n message.includes(\"could not read Username\")\n ) {\n throw new Error(`Cannot access repository. Is it private? URL: ${url}`);\n }\n if (message.includes(\"couldn't find remote ref\")) {\n throw new Error(`Branch \"${branch}\" not found in repository: ${url}`);\n }\n throw error;\n }\n\n await execFileAsync(\"git\", [\"checkout\", branch], { cwd: tempDir });\n\n // Return directory path\n // For root: return tempDir directly\n // For path: return tempDir/path\n const downloadedDir = parsed.path\n ? path.join(tempDir, parsed.path)\n : tempDir;\n\n return {\n dir: downloadedDir,\n tempRoot: tempDir,\n };\n } catch (error) {\n // Clean up on error\n await fs.rm(tempDir, { recursive: true, force: true });\n throw error;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport {\n parseGitHubTreeUrl,\n downloadGitHubSkill,\n getSkillStorageName,\n getInstructionsStorageName,\n validateSkillDirectory,\n readSkillFrontmatter,\n type SkillFrontmatter,\n} from \"../domain/github-skills\";\nimport { directUpload } from \"./direct-upload\";\nimport { getInstructionsFilename } from \"@vm0/core\";\n\ninterface StorageUploadResult {\n name: string;\n versionId: string;\n action: \"created\" | \"deduplicated\";\n}\n\n/**\n * Result of uploading or resolving a skill, including parsed frontmatter.\n * Action \"resolved\" means the skill was found in server cache (no download/upload needed).\n */\nexport interface SkillUploadResult {\n name: string;\n versionId: string;\n action: \"created\" | \"deduplicated\" | \"resolved\";\n skillName: string;\n frontmatter: SkillFrontmatter;\n}\n\n/**\n * Upload instructions file as a volume\n *\n * @param agentName - Name of the agent (used for storage name)\n * @param instructionsFilePath - Path to the instructions file (e.g., AGENTS.md)\n * @param basePath - Base path for resolving relative paths\n * @param framework - Framework name for determining canonical filename\n * @returns Upload result with storage name and version\n */\nexport async function uploadInstructions(\n agentName: string,\n instructionsFilePath: string,\n basePath: string,\n framework?: string,\n): Promise<StorageUploadResult> {\n // Normalize agent name to lowercase to match server's normalization behavior\n // Server normalizes agent names to lowercase when storing compose configs\n const storageName = getInstructionsStorageName(agentName.toLowerCase());\n\n // Resolve file path relative to base path\n const absolutePath = path.isAbsolute(instructionsFilePath)\n ? instructionsFilePath\n : path.join(basePath, instructionsFilePath);\n\n // Read the instructions file\n const content = await fs.readFile(absolutePath, \"utf8\");\n\n // Create a temporary directory with the file\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), \"vm0-instructions-\"));\n const instructionsDir = path.join(tmpDir, \"instructions\");\n await fs.mkdir(instructionsDir);\n\n // Write file with framework-specific name (e.g., CLAUDE.md for claude-code)\n const filename = getInstructionsFilename(framework);\n await fs.writeFile(path.join(instructionsDir, filename), content);\n\n try {\n // Use direct upload (bypasses Vercel 4.5MB limit)\n const result = await directUpload(storageName, \"volume\", instructionsDir);\n\n return {\n name: storageName,\n versionId: result.versionId,\n action: result.deduplicated ? \"deduplicated\" : \"created\",\n };\n } finally {\n // Clean up temp directory\n await fs.rm(tmpDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Upload a skill from GitHub as a volume\n *\n * @param skillUrl - GitHub tree URL for the skill\n * @returns Upload result with storage name, version, and parsed frontmatter\n */\nexport async function uploadSkill(\n skillUrl: string,\n): Promise<SkillUploadResult> {\n const parsed = parseGitHubTreeUrl(skillUrl);\n const storageName = getSkillStorageName(parsed);\n\n // Create temp directory for download\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), \"vm0-skill-\"));\n\n try {\n // Download skill from GitHub\n const skillDir = await downloadGitHubSkill(parsed, tmpDir);\n\n // Validate the skill has SKILL.md\n await validateSkillDirectory(skillDir);\n\n // Parse frontmatter before upload\n const frontmatter = await readSkillFrontmatter(skillDir);\n\n // Use direct upload (bypasses Vercel 4.5MB limit)\n const result = await directUpload(storageName, \"volume\", skillDir);\n\n return {\n name: storageName,\n versionId: result.versionId,\n action: result.deduplicated ? \"deduplicated\" : \"created\",\n skillName: parsed.skillName,\n frontmatter,\n };\n } finally {\n // Clean up temp directory\n await fs.rm(tmpDir, { recursive: true, force: true });\n }\n}\n","import { createHash } from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { prepareStorage, commitStorage } from \"../api\";\nimport { excludeVm0Filter } from \"../utils/file-utils\";\n\n/**\n * File entry with pre-computed hash for direct upload\n */\ninterface FileEntryWithHash {\n path: string;\n hash: string;\n size: number;\n}\n\n/**\n * Result of direct upload operation\n */\ninterface DirectUploadResult {\n versionId: string;\n size: number;\n fileCount: number;\n deduplicated: boolean;\n empty: boolean;\n}\n\n/**\n * Progress callback for upload operations\n */\ntype ProgressCallback = (message: string) => void;\n\n/**\n * Compute SHA-256 hash of a file using streaming to avoid loading large files into memory\n */\nasync function hashFileStream(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = createHash(\"sha256\");\n const stream = fs.createReadStream(filePath);\n\n stream.on(\"data\", (chunk) => {\n return hash.update(chunk);\n });\n stream.on(\"end\", () => {\n return resolve(hash.digest(\"hex\"));\n });\n stream.on(\"error\", reject);\n });\n}\n\n/**\n * Get all files in directory recursively, excluding .vm0/\n */\nasync function getAllFiles(\n dirPath: string,\n baseDir: string = dirPath,\n): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n const relativePath = path.relative(baseDir, fullPath);\n\n // Skip .vm0 directory\n if (relativePath.startsWith(\".vm0\")) {\n continue;\n }\n\n if (entry.isDirectory()) {\n const subFiles = await getAllFiles(fullPath, baseDir);\n files.push(...subFiles);\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n/**\n * Collect file metadata with hashes using streaming to handle large files\n */\nasync function collectFileMetadata(\n cwd: string,\n files: string[],\n onProgress?: ProgressCallback,\n): Promise<FileEntryWithHash[]> {\n const fileEntries: FileEntryWithHash[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i]!;\n const relativePath = path.relative(cwd, file);\n\n // Use streaming hash to avoid loading large files into memory\n const [hash, stats] = await Promise.all([\n hashFileStream(file),\n fs.promises.stat(file),\n ]);\n\n fileEntries.push({\n path: relativePath,\n hash,\n size: stats.size,\n });\n\n // Report progress every 100 files\n if (onProgress && (i + 1) % 100 === 0) {\n onProgress(`Hashing files... ${i + 1}/${files.length}`);\n }\n }\n\n return fileEntries;\n}\n\n/**\n * Create tar.gz archive of files\n */\nasync function createArchive(cwd: string, files: string[]): Promise<Buffer> {\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"archive.tar.gz\");\n\n try {\n const relativePaths = files.map((file) => {\n return path.relative(cwd, file);\n });\n\n if (relativePaths.length > 0) {\n await tar.create(\n {\n gzip: true,\n file: tarPath,\n cwd: cwd,\n },\n relativePaths,\n );\n } else {\n // For empty directories, create tar.gz excluding .vm0\n await tar.create(\n {\n gzip: true,\n file: tarPath,\n cwd: cwd,\n filter: excludeVm0Filter,\n },\n [\".\"],\n );\n }\n\n const tarBuffer = await fs.promises.readFile(tarPath);\n return tarBuffer;\n } finally {\n // Clean up temp files\n if (fs.existsSync(tarPath)) {\n await fs.promises.unlink(tarPath);\n }\n await fs.promises.rmdir(tmpDir);\n }\n}\n\n/**\n * Create manifest JSON for the upload\n */\nfunction createManifest(files: FileEntryWithHash[]): Buffer {\n const manifest = {\n version: 1,\n files,\n createdAt: new Date().toISOString(),\n };\n return Buffer.from(JSON.stringify(manifest, null, 2));\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\n/**\n * Upload buffer to presigned URL with retry logic\n */\nasync function uploadToPresignedUrl(\n presignedUrl: string,\n data: Buffer,\n contentType: string,\n maxRetries: number = 3,\n): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const response = await fetch(presignedUrl, {\n method: \"PUT\",\n body: data,\n headers: {\n \"Content-Type\": contentType,\n },\n });\n\n if (response.ok) {\n return;\n }\n\n // For 4xx errors (client errors), don't retry\n if (response.status >= 400 && response.status < 500) {\n const text = await response.text();\n throw new Error(`S3 upload failed: ${response.status} - ${text}`);\n }\n\n // For 5xx errors, retry with backoff\n const text = await response.text();\n lastError = new Error(`S3 upload failed: ${response.status} - ${text}`);\n } catch (error) {\n lastError =\n error instanceof Error ? error : new Error(\"Unknown upload error\");\n\n // Don't retry on client errors\n if (\n lastError.message.includes(\"400\") ||\n lastError.message.includes(\"403\")\n ) {\n throw lastError;\n }\n }\n\n // Exponential backoff: 1s, 2s, 4s...\n if (attempt < maxRetries) {\n const backoffMs = Math.pow(2, attempt - 1) * 1000;\n await sleep(backoffMs);\n }\n }\n\n throw lastError || new Error(\"S3 upload failed after retries\");\n}\n\n/**\n * Options for direct upload\n */\ninterface DirectUploadOptions {\n onProgress?: ProgressCallback;\n force?: boolean;\n}\n\n/**\n * Perform direct S3 upload for a storage (volume or artifact)\n *\n * This bypasses Vercel's 4.5MB request body limit by:\n * 1. Computing file hashes locally\n * 2. Getting presigned URLs from /api/storages/prepare\n * 3. Uploading directly to S3\n * 4. Committing via /api/storages/commit\n */\nexport async function directUpload(\n storageName: string,\n storageType: \"volume\" | \"artifact\" | \"memory\",\n cwd: string,\n options?: DirectUploadOptions,\n): Promise<DirectUploadResult> {\n const { onProgress, force } = options || {};\n\n // Step 1: Collect all files\n onProgress?.(\"Collecting files...\");\n const files = await getAllFiles(cwd);\n\n // Step 2: Compute hashes for all files\n onProgress?.(\"Computing file hashes...\");\n const fileEntries = await collectFileMetadata(cwd, files, onProgress);\n\n // Step 3: Call prepare endpoint\n onProgress?.(\"Preparing upload...\");\n const prepareResult = await prepareStorage({\n storageName,\n storageType,\n files: fileEntries,\n force,\n });\n\n // Step 4: Check if version already exists (deduplication)\n // Skip upload but still call commit to update HEAD (fixes #626)\n if (prepareResult.existing) {\n onProgress?.(\"Version exists, updating HEAD...\");\n\n const commitResult = await commitStorage({\n storageName,\n storageType,\n versionId: prepareResult.versionId,\n files: fileEntries,\n });\n\n return {\n versionId: commitResult.versionId,\n size: commitResult.size,\n fileCount: commitResult.fileCount,\n deduplicated: true,\n empty: commitResult.fileCount === 0,\n };\n }\n\n // Step 5: Create and upload archive (skip for empty artifacts)\n if (files.length > 0) {\n onProgress?.(\"Compressing files...\");\n const archiveBuffer = await createArchive(cwd, files);\n\n onProgress?.(\"Uploading archive to S3...\");\n if (!prepareResult.uploads) {\n throw new Error(\"No upload URLs received from prepare endpoint\");\n }\n\n await uploadToPresignedUrl(\n prepareResult.uploads.archive.presignedUrl,\n archiveBuffer,\n \"application/gzip\",\n );\n }\n\n // Step 6: Create and upload manifest\n onProgress?.(\"Uploading manifest...\");\n if (!prepareResult.uploads) {\n throw new Error(\"No upload URLs received from prepare endpoint\");\n }\n const manifestBuffer = createManifest(fileEntries);\n await uploadToPresignedUrl(\n prepareResult.uploads.manifest.presignedUrl,\n manifestBuffer,\n \"application/json\",\n );\n\n // Step 7: Commit the upload\n onProgress?.(\"Committing...\");\n const commitResult = await commitStorage({\n storageName,\n storageType,\n versionId: prepareResult.versionId,\n files: fileEntries,\n });\n\n return {\n versionId: commitResult.versionId,\n size: commitResult.size,\n fileCount: commitResult.fileCount,\n deduplicated: commitResult.deduplicated || false,\n empty: commitResult.fileCount === 0,\n };\n}\n","import EE from 'events'\nimport fs from 'fs'\nimport { Minipass } from 'minipass'\n\nconst writev = fs.writev\n\nconst _autoClose = Symbol('_autoClose')\nconst _close = Symbol('_close')\nconst _ended = Symbol('_ended')\nconst _fd = Symbol('_fd')\nconst _finished = Symbol('_finished')\nconst _flags = Symbol('_flags')\nconst _flush = Symbol('_flush')\nconst _handleChunk = Symbol('_handleChunk')\nconst _makeBuf = Symbol('_makeBuf')\nconst _mode = Symbol('_mode')\nconst _needDrain = Symbol('_needDrain')\nconst _onerror = Symbol('_onerror')\nconst _onopen = Symbol('_onopen')\nconst _onread = Symbol('_onread')\nconst _onwrite = Symbol('_onwrite')\nconst _open = Symbol('_open')\nconst _path = Symbol('_path')\nconst _pos = Symbol('_pos')\nconst _queue = Symbol('_queue')\nconst _read = Symbol('_read')\nconst _readSize = Symbol('_readSize')\nconst _reading = Symbol('_reading')\nconst _remain = Symbol('_remain')\nconst _size = Symbol('_size')\nconst _write = Symbol('_write')\nconst _writing = Symbol('_writing')\nconst _defaultFlag = Symbol('_defaultFlag')\nconst _errored = Symbol('_errored')\n\nexport type ReadStreamOptions =\n Minipass.Options<Minipass.ContiguousData> & {\n fd?: number\n readSize?: number\n size?: number\n autoClose?: boolean\n }\n\nexport type ReadStreamEvents = Minipass.Events<Minipass.ContiguousData> & {\n open: [fd: number]\n}\n\nexport class ReadStream extends Minipass<\n Minipass.ContiguousData,\n Buffer,\n ReadStreamEvents\n> {\n [_errored]: boolean = false;\n [_fd]?: number;\n [_path]: string;\n [_readSize]: number;\n [_reading]: boolean = false;\n [_size]: number;\n [_remain]: number;\n [_autoClose]: boolean\n\n constructor(path: string, opt: ReadStreamOptions) {\n opt = opt || {}\n super(opt)\n\n this.readable = true\n this.writable = false\n\n if (typeof path !== 'string') {\n throw new TypeError('path must be a string')\n }\n\n this[_errored] = false\n this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined\n this[_path] = path\n this[_readSize] = opt.readSize || 16 * 1024 * 1024\n this[_reading] = false\n this[_size] = typeof opt.size === 'number' ? opt.size : Infinity\n this[_remain] = this[_size]\n this[_autoClose] =\n typeof opt.autoClose === 'boolean' ? opt.autoClose : true\n\n if (typeof this[_fd] === 'number') {\n this[_read]()\n } else {\n this[_open]()\n }\n }\n\n get fd() {\n return this[_fd]\n }\n\n get path() {\n return this[_path]\n }\n\n //@ts-ignore\n write() {\n throw new TypeError('this is a readable stream')\n }\n\n //@ts-ignore\n end() {\n throw new TypeError('this is a readable stream')\n }\n\n [_open]() {\n fs.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd))\n }\n\n [_onopen](er?: NodeJS.ErrnoException | null, fd?: number) {\n if (er) {\n this[_onerror](er)\n } else {\n this[_fd] = fd\n this.emit('open', fd as number)\n this[_read]()\n }\n }\n\n [_makeBuf]() {\n return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain]))\n }\n\n [_read]() {\n if (!this[_reading]) {\n this[_reading] = true\n const buf = this[_makeBuf]()\n /* c8 ignore start */\n if (buf.length === 0) {\n return process.nextTick(() => this[_onread](null, 0, buf))\n }\n /* c8 ignore stop */\n fs.read(this[_fd] as number, buf, 0, buf.length, null, (er, br, b) =>\n this[_onread](er, br, b),\n )\n }\n }\n\n [_onread](er?: NodeJS.ErrnoException | null, br?: number, buf?: Buffer) {\n this[_reading] = false\n if (er) {\n this[_onerror](er)\n } else if (this[_handleChunk](br as number, buf as Buffer)) {\n this[_read]()\n }\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.close(fd, er =>\n er ? this.emit('error', er) : this.emit('close'),\n )\n }\n }\n\n [_onerror](er: NodeJS.ErrnoException) {\n this[_reading] = true\n this[_close]()\n this.emit('error', er)\n }\n\n [_handleChunk](br: number, buf: Buffer) {\n let ret = false\n // no effect if infinite\n this[_remain] -= br\n if (br > 0) {\n ret = super.write(br < buf.length ? buf.subarray(0, br) : buf)\n }\n\n if (br === 0 || this[_remain] <= 0) {\n ret = false\n this[_close]()\n super.end()\n }\n\n return ret\n }\n\n emit<Event extends keyof ReadStreamEvents>(\n ev: Event,\n ...args: ReadStreamEvents[Event]\n ): boolean {\n switch (ev) {\n case 'prefinish':\n case 'finish':\n return false\n\n case 'drain':\n if (typeof this[_fd] === 'number') {\n this[_read]()\n }\n return false\n\n case 'error':\n if (this[_errored]) {\n return false\n }\n this[_errored] = true\n return super.emit(ev, ...args)\n\n default:\n return super.emit(ev, ...args)\n }\n }\n}\n\nexport class ReadStreamSync extends ReadStream {\n [_open]() {\n let threw = true\n try {\n this[_onopen](null, fs.openSync(this[_path], 'r'))\n threw = false\n } finally {\n if (threw) {\n this[_close]()\n }\n }\n }\n\n [_read]() {\n let threw = true\n try {\n if (!this[_reading]) {\n this[_reading] = true\n do {\n const buf = this[_makeBuf]()\n /* c8 ignore start */\n const br =\n buf.length === 0\n ? 0\n : fs.readSync(this[_fd] as number, buf, 0, buf.length, null)\n /* c8 ignore stop */\n if (!this[_handleChunk](br, buf)) {\n break\n }\n } while (true)\n this[_reading] = false\n }\n threw = false\n } finally {\n if (threw) {\n this[_close]()\n }\n }\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.closeSync(fd)\n this.emit('close')\n }\n }\n}\n\nexport type WriteStreamOptions = {\n fd?: number\n autoClose?: boolean\n mode?: number\n captureRejections?: boolean\n start?: number\n flags?: string\n}\n\nexport class WriteStream extends EE {\n readable: false = false\n writable: boolean = true;\n [_errored]: boolean = false;\n [_writing]: boolean = false;\n [_ended]: boolean = false;\n [_queue]: Buffer[] = [];\n [_needDrain]: boolean = false;\n [_path]: string;\n [_mode]: number;\n [_autoClose]: boolean;\n [_fd]?: number;\n [_defaultFlag]: boolean;\n [_flags]: string;\n [_finished]: boolean = false;\n [_pos]?: number\n\n constructor(path: string, opt: WriteStreamOptions) {\n opt = opt || {}\n super(opt)\n this[_path] = path\n this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined\n this[_mode] = opt.mode === undefined ? 0o666 : opt.mode\n this[_pos] = typeof opt.start === 'number' ? opt.start : undefined\n this[_autoClose] =\n typeof opt.autoClose === 'boolean' ? opt.autoClose : true\n\n // truncating makes no sense when writing into the middle\n const defaultFlag = this[_pos] !== undefined ? 'r+' : 'w'\n this[_defaultFlag] = opt.flags === undefined\n this[_flags] = opt.flags === undefined ? defaultFlag : opt.flags\n\n if (this[_fd] === undefined) {\n this[_open]()\n }\n }\n\n emit(ev: string, ...args: any[]) {\n if (ev === 'error') {\n if (this[_errored]) {\n return false\n }\n this[_errored] = true\n }\n return super.emit(ev, ...args)\n }\n\n get fd() {\n return this[_fd]\n }\n\n get path() {\n return this[_path]\n }\n\n [_onerror](er: NodeJS.ErrnoException) {\n this[_close]()\n this[_writing] = true\n this.emit('error', er)\n }\n\n [_open]() {\n fs.open(this[_path], this[_flags], this[_mode], (er, fd) =>\n this[_onopen](er, fd),\n )\n }\n\n [_onopen](er?: null | NodeJS.ErrnoException, fd?: number) {\n if (\n this[_defaultFlag] &&\n this[_flags] === 'r+' &&\n er &&\n er.code === 'ENOENT'\n ) {\n this[_flags] = 'w'\n this[_open]()\n } else if (er) {\n this[_onerror](er)\n } else {\n this[_fd] = fd\n this.emit('open', fd)\n if (!this[_writing]) {\n this[_flush]()\n }\n }\n }\n\n end(buf: string, enc?: BufferEncoding): this\n end(buf?: Buffer, enc?: undefined): this\n end(buf?: Buffer | string, enc?: BufferEncoding): this {\n if (buf) {\n //@ts-ignore\n this.write(buf, enc)\n }\n\n this[_ended] = true\n\n // synthetic after-write logic, where drain/finish live\n if (\n !this[_writing] &&\n !this[_queue].length &&\n typeof this[_fd] === 'number'\n ) {\n this[_onwrite](null, 0)\n }\n return this\n }\n\n write(buf: string, enc?: BufferEncoding): boolean\n write(buf: Buffer, enc?: undefined): boolean\n write(buf: Buffer | string, enc?: BufferEncoding): boolean {\n if (typeof buf === 'string') {\n buf = Buffer.from(buf, enc)\n }\n\n if (this[_ended]) {\n this.emit('error', new Error('write() after end()'))\n return false\n }\n\n if (this[_fd] === undefined || this[_writing] || this[_queue].length) {\n this[_queue].push(buf)\n this[_needDrain] = true\n return false\n }\n\n this[_writing] = true\n this[_write](buf)\n return true\n }\n\n [_write](buf: Buffer) {\n fs.write(\n this[_fd] as number,\n buf,\n 0,\n buf.length,\n this[_pos],\n (er, bw) => this[_onwrite](er, bw),\n )\n }\n\n [_onwrite](er?: null | NodeJS.ErrnoException, bw?: number) {\n if (er) {\n this[_onerror](er)\n } else {\n if (this[_pos] !== undefined && typeof bw === 'number') {\n this[_pos] += bw\n }\n if (this[_queue].length) {\n this[_flush]()\n } else {\n this[_writing] = false\n\n if (this[_ended] && !this[_finished]) {\n this[_finished] = true\n this[_close]()\n this.emit('finish')\n } else if (this[_needDrain]) {\n this[_needDrain] = false\n this.emit('drain')\n }\n }\n }\n }\n\n [_flush]() {\n if (this[_queue].length === 0) {\n if (this[_ended]) {\n this[_onwrite](null, 0)\n }\n } else if (this[_queue].length === 1) {\n this[_write](this[_queue].pop() as Buffer)\n } else {\n const iovec = this[_queue]\n this[_queue] = []\n writev(this[_fd] as number, iovec, this[_pos] as number, (er, bw) =>\n this[_onwrite](er, bw),\n )\n }\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.close(fd, er =>\n er ? this.emit('error', er) : this.emit('close'),\n )\n }\n }\n}\n\nexport class WriteStreamSync extends WriteStream {\n [_open](): void {\n let fd\n // only wrap in a try{} block if we know we'll retry, to avoid\n // the rethrow obscuring the error's source frame in most cases.\n if (this[_defaultFlag] && this[_flags] === 'r+') {\n try {\n fd = fs.openSync(this[_path], this[_flags], this[_mode])\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') {\n this[_flags] = 'w'\n return this[_open]()\n } else {\n throw er\n }\n }\n } else {\n fd = fs.openSync(this[_path], this[_flags], this[_mode])\n }\n\n this[_onopen](null, fd)\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.closeSync(fd)\n this.emit('close')\n }\n }\n\n [_write](buf: Buffer) {\n // throw the original, but try to close if it fails\n let threw = true\n try {\n this[_onwrite](\n null,\n fs.writeSync(this[_fd] as number, buf, 0, buf.length, this[_pos]),\n )\n threw = false\n } finally {\n if (threw) {\n try {\n this[_close]()\n } catch {\n // ok error\n }\n }\n }\n }\n}\n","const proc =\n typeof process === 'object' && process\n ? process\n : {\n stdout: null,\n stderr: null,\n }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n s: any\n): s is Minipass.Readable | Minipass.Writable =>\n !!s &&\n typeof s === 'object' &&\n (s instanceof Minipass ||\n s instanceof Stream ||\n isReadable(s) ||\n isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Readable).pipe === 'function' &&\n // node core Writable streams have a pipe() method, but it throws\n (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Writable).write === 'function' &&\n typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n b instanceof ArrayBuffer ||\n (!!b &&\n typeof b === 'object' &&\n b.constructor &&\n b.constructor.name === 'ArrayBuffer' &&\n b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n /**\n * end the destination stream when the source stream ends\n */\n end?: boolean\n /**\n * proxy errors from the source stream to the destination stream\n */\n proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe<T extends unknown> {\n src: Minipass<T>\n dest: Minipass<any, T>\n opts: PipeOptions\n ondrain: () => any\n constructor(\n src: Minipass<T>,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n this.src = src\n this.dest = dest as Minipass<any, T>\n this.opts = opts\n this.ondrain = () => src[RESUME]()\n this.dest.on('drain', this.ondrain)\n }\n unpipe() {\n this.dest.removeListener('drain', this.ondrain)\n }\n // only here for the prototype\n /* c8 ignore start */\n proxyErrors(_er: any) {}\n /* c8 ignore stop */\n end() {\n this.unpipe()\n if (this.opts.end) this.dest.end()\n }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors<T> extends Pipe<T> {\n unpipe() {\n this.src.removeListener('error', this.proxyErrors)\n super.unpipe()\n }\n constructor(\n src: Minipass<T>,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n super(src, dest, opts)\n this.proxyErrors = (er: Error) => this.dest.emit('error', er)\n src.on('error', this.proxyErrors)\n }\n}\n\nexport namespace Minipass {\n /**\n * Encoding used to create a stream that outputs strings rather than\n * Buffer objects.\n */\n export type Encoding = BufferEncoding | 'buffer' | null\n\n /**\n * Any stream that Minipass can pipe into\n */\n export type Writable =\n | Minipass<any, any, any>\n | NodeJS.WriteStream\n | (NodeJS.WriteStream & { fd: number })\n | (EventEmitter & {\n end(): any\n write(chunk: any, ...args: any[]): any\n })\n\n /**\n * Any stream that can be read from\n */\n export type Readable =\n | Minipass<any, any, any>\n | NodeJS.ReadStream\n | (NodeJS.ReadStream & { fd: number })\n | (EventEmitter & {\n pause(): any\n resume(): any\n pipe(...destArgs: any[]): any\n })\n\n /**\n * Utility type that can be iterated sync or async\n */\n export type DualIterable<T> = Iterable<T> & AsyncIterable<T>\n\n type EventArguments = Record<string | symbol, unknown[]>\n\n /**\n * The listing of events that a Minipass class can emit.\n * Extend this when extending the Minipass class, and pass as\n * the third template argument. The key is the name of the event,\n * and the value is the argument list.\n *\n * Any undeclared events will still be allowed, but the handler will get\n * arguments as `unknown[]`.\n */\n export interface Events<RType extends any = Buffer>\n extends EventArguments {\n readable: []\n data: [chunk: RType]\n error: [er: unknown]\n abort: [reason: unknown]\n drain: []\n resume: []\n end: []\n finish: []\n prefinish: []\n close: []\n [DESTROYED]: [er?: unknown]\n [ERROR]: [er: unknown]\n }\n\n /**\n * String or buffer-like data that can be joined and sliced\n */\n export type ContiguousData =\n | Buffer\n | ArrayBufferLike\n | ArrayBufferView\n | string\n export type BufferOrString = Buffer | string\n\n /**\n * Options passed to the Minipass constructor.\n */\n export type SharedOptions = {\n /**\n * Defer all data emission and other events until the end of the\n * current tick, similar to Node core streams\n */\n async?: boolean\n /**\n * A signal which will abort the stream\n */\n signal?: AbortSignal\n /**\n * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n * emit Buffer objects rather than strings.\n *\n * Conflicts with `objectMode`\n */\n encoding?: BufferEncoding | null | 'buffer'\n /**\n * Output data exactly as it was written, supporting non-buffer/string\n * data (such as arbitrary objects, falsey values, etc.)\n *\n * Conflicts with `encoding`\n */\n objectMode?: boolean\n }\n\n /**\n * Options for a string encoded output\n */\n export type EncodingOptions = SharedOptions & {\n encoding: BufferEncoding\n objectMode?: false\n }\n\n /**\n * Options for contiguous data buffer output\n */\n export type BufferOptions = SharedOptions & {\n encoding?: null | 'buffer'\n objectMode?: false\n }\n\n /**\n * Options for objectMode arbitrary output\n */\n export type ObjectModeOptions = SharedOptions & {\n objectMode: true\n encoding?: null\n }\n\n /**\n * Utility type to determine allowed options based on read type\n */\n export type Options<T> =\n | ObjectModeOptions\n | (T extends string\n ? EncodingOptions\n : T extends Buffer\n ? BufferOptions\n : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n RType extends unknown = Buffer,\n WType extends unknown = RType extends Minipass.BufferOrString\n ? Minipass.ContiguousData\n : RType,\n Events extends Minipass.Events<RType> = Minipass.Events<RType>\n >\n extends EventEmitter\n implements Minipass.DualIterable<RType>\n{\n [FLOWING]: boolean = false;\n [PAUSED]: boolean = false;\n [PIPES]: Pipe<RType>[] = [];\n [BUFFER]: RType[] = [];\n [OBJECTMODE]: boolean;\n [ENCODING]: BufferEncoding | null;\n [ASYNC]: boolean;\n [DECODER]: SD | null;\n [EOF]: boolean = false;\n [EMITTED_END]: boolean = false;\n [EMITTING_END]: boolean = false;\n [CLOSED]: boolean = false;\n [EMITTED_ERROR]: unknown = null;\n [BUFFERLENGTH]: number = 0;\n [DESTROYED]: boolean = false;\n [SIGNAL]?: AbortSignal;\n [ABORTED]: boolean = false;\n [DATALISTENERS]: number = 0;\n [DISCARDED]: boolean = false\n\n /**\n * true if the stream can be written\n */\n writable: boolean = true\n /**\n * true if the stream can be read\n */\n readable: boolean = true\n\n /**\n * If `RType` is Buffer, then options do not need to be provided.\n * Otherwise, an options object must be provided to specify either\n * {@link Minipass.SharedOptions.objectMode} or\n * {@link Minipass.SharedOptions.encoding}, as appropriate.\n */\n constructor(\n ...args:\n | [Minipass.ObjectModeOptions]\n | (RType extends Buffer\n ? [] | [Minipass.Options<RType>]\n : [Minipass.Options<RType>])\n ) {\n const options: Minipass.Options<RType> = (args[0] ||\n {}) as Minipass.Options<RType>\n super()\n if (options.objectMode && typeof options.encoding === 'string') {\n throw new TypeError(\n 'Encoding and objectMode may not be used together'\n )\n }\n if (isObjectModeOptions(options)) {\n this[OBJECTMODE] = true\n this[ENCODING] = null\n } else if (isEncodingOptions(options)) {\n this[ENCODING] = options.encoding\n this[OBJECTMODE] = false\n } else {\n this[OBJECTMODE] = false\n this[ENCODING] = null\n }\n this[ASYNC] = !!options.async\n this[DECODER] = this[ENCODING]\n ? (new StringDecoder(this[ENCODING]) as SD)\n : null\n\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposeBuffer === true) {\n Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n }\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposePipes === true) {\n Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n }\n\n const { signal } = options\n if (signal) {\n this[SIGNAL] = signal\n if (signal.aborted) {\n this[ABORT]()\n } else {\n signal.addEventListener('abort', () => this[ABORT]())\n }\n }\n }\n\n /**\n * The amount of data stored in the buffer waiting to be read.\n *\n * For Buffer strings, this will be the total byte length.\n * For string encoding streams, this will be the string character length,\n * according to JavaScript's `string.length` logic.\n * For objectMode streams, this is a count of the items waiting to be\n * emitted.\n */\n get bufferLength() {\n return this[BUFFERLENGTH]\n }\n\n /**\n * The `BufferEncoding` currently in use, or `null`\n */\n get encoding() {\n return this[ENCODING]\n }\n\n /**\n * @deprecated - This is a read only property\n */\n set encoding(_enc) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * @deprecated - Encoding may only be set at instantiation time\n */\n setEncoding(_enc: Minipass.Encoding) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * True if this is an objectMode stream\n */\n get objectMode() {\n return this[OBJECTMODE]\n }\n\n /**\n * @deprecated - This is a read-only property\n */\n set objectMode(_om) {\n throw new Error('objectMode must be set at instantiation time')\n }\n\n /**\n * true if this is an async stream\n */\n get ['async'](): boolean {\n return this[ASYNC]\n }\n /**\n * Set to true to make this stream async.\n *\n * Once set, it cannot be unset, as this would potentially cause incorrect\n * behavior. Ie, a sync stream can be made async, but an async stream\n * cannot be safely made sync.\n */\n set ['async'](a: boolean) {\n this[ASYNC] = this[ASYNC] || !!a\n }\n\n // drop everything and get out of the flow completely\n [ABORT]() {\n this[ABORTED] = true\n this.emit('abort', this[SIGNAL]?.reason)\n this.destroy(this[SIGNAL]?.reason)\n }\n\n /**\n * True if the stream has been aborted.\n */\n get aborted() {\n return this[ABORTED]\n }\n /**\n * No-op setter. Stream aborted status is set via the AbortSignal provided\n * in the constructor options.\n */\n set aborted(_) {}\n\n /**\n * Write data into the stream\n *\n * If the chunk written is a string, and encoding is not specified, then\n * `utf8` will be assumed. If the stream encoding matches the encoding of\n * a written string, and the state of the string decoder allows it, then\n * the string will be passed through to either the output or the internal\n * buffer without any processing. Otherwise, it will be turned into a\n * Buffer object for processing into the desired encoding.\n *\n * If provided, `cb` function is called immediately before return for\n * sync streams, or on next tick for async streams, because for this\n * base class, a chunk is considered \"processed\" once it is accepted\n * and either emitted or buffered. That is, the callback does not indicate\n * that the chunk has been eventually emitted, though of course child\n * classes can override this function to do whatever processing is required\n * and call `super.write(...)` only once processing is completed.\n */\n write(chunk: WType, cb?: () => void): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding,\n cb?: () => void\n ): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): boolean {\n if (this[ABORTED]) return false\n if (this[EOF]) throw new Error('write after end')\n\n if (this[DESTROYED]) {\n this.emit(\n 'error',\n Object.assign(\n new Error('Cannot call write after a stream was destroyed'),\n { code: 'ERR_STREAM_DESTROYED' }\n )\n )\n return true\n }\n\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n\n if (!encoding) encoding = 'utf8'\n\n const fn = this[ASYNC] ? defer : nodefer\n\n // convert array buffers and typed array views into buffers\n // at some point in the future, we may want to do the opposite!\n // leave strings and buffers as-is\n // anything is only allowed if in object mode, so throw\n if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n if (isArrayBufferView(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(\n chunk.buffer,\n chunk.byteOffset,\n chunk.byteLength\n )\n } else if (isArrayBufferLike(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(chunk)\n } else if (typeof chunk !== 'string') {\n throw new Error(\n 'Non-contiguous data written to non-objectMode stream'\n )\n }\n }\n\n // handle object mode up front, since it's simpler\n // this yields better performance, fewer checks later.\n if (this[OBJECTMODE]) {\n // maybe impossible?\n /* c8 ignore start */\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n /* c8 ignore stop */\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n // at this point the chunk is a buffer or string\n // don't buffer it up or send it to the decoder\n if (!(chunk as Minipass.BufferOrString).length) {\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n if (cb) fn(cb)\n return this[FLOWING]\n }\n\n // fast-path writing strings of same encoding to a stream with\n // an empty buffer, skipping the buffer/decoder dance\n if (\n typeof chunk === 'string' &&\n // unless it is a string already ready for us to use\n !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n ) {\n //@ts-ignore - sinful unsafe type change\n chunk = Buffer.from(chunk, encoding)\n }\n\n if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n //@ts-ignore - sinful unsafe type change\n chunk = this[DECODER].write(chunk)\n }\n\n // Note: flushing CAN potentially switch us into not-flowing mode\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n /**\n * Low-level explicit read method.\n *\n * In objectMode, the argument is ignored, and one item is returned if\n * available.\n *\n * `n` is the number of bytes (or in the case of encoding streams,\n * characters) to consume. If `n` is not provided, then the entire buffer\n * is returned, or `null` is returned if no data is available.\n *\n * If `n` is greater that the amount of data in the internal buffer,\n * then `null` is returned.\n */\n read(n?: number | null): RType | null {\n if (this[DESTROYED]) return null\n this[DISCARDED] = false\n\n if (\n this[BUFFERLENGTH] === 0 ||\n n === 0 ||\n (n && n > this[BUFFERLENGTH])\n ) {\n this[MAYBE_EMIT_END]()\n return null\n }\n\n if (this[OBJECTMODE]) n = null\n\n if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n // not object mode, so if we have an encoding, then RType is string\n // otherwise, must be Buffer\n this[BUFFER] = [\n (this[ENCODING]\n ? this[BUFFER].join('')\n : Buffer.concat(\n this[BUFFER] as Buffer[],\n this[BUFFERLENGTH]\n )) as RType,\n ]\n }\n\n const ret = this[READ](n || null, this[BUFFER][0] as RType)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [READ](n: number | null, chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n else {\n const c = chunk as Minipass.BufferOrString\n if (n === c.length || n === null) this[BUFFERSHIFT]()\n else if (typeof c === 'string') {\n this[BUFFER][0] = c.slice(n) as RType\n chunk = c.slice(0, n) as RType\n this[BUFFERLENGTH] -= n\n } else {\n this[BUFFER][0] = c.subarray(n) as RType\n chunk = c.subarray(0, n) as RType\n this[BUFFERLENGTH] -= n\n }\n }\n\n this.emit('data', chunk)\n\n if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n return chunk\n }\n\n /**\n * End the stream, optionally providing a final write.\n *\n * See {@link Minipass#write} for argument descriptions\n */\n end(cb?: () => void): this\n end(chunk: WType, cb?: () => void): this\n end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n end(\n chunk?: WType | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): this {\n if (typeof chunk === 'function') {\n cb = chunk as () => void\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n if (chunk !== undefined) this.write(chunk, encoding)\n if (cb) this.once('end', cb)\n this[EOF] = true\n this.writable = false\n\n // if we haven't written anything, then go ahead and emit,\n // even if we're not reading.\n // we'll re-emit if a new 'end' listener is added anyway.\n // This makes MP more suitable to write-only use cases.\n if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n return this\n }\n\n // don't let the internal resume be overwritten\n [RESUME]() {\n if (this[DESTROYED]) return\n\n if (!this[DATALISTENERS] && !this[PIPES].length) {\n this[DISCARDED] = true\n }\n this[PAUSED] = false\n this[FLOWING] = true\n this.emit('resume')\n if (this[BUFFER].length) this[FLUSH]()\n else if (this[EOF]) this[MAYBE_EMIT_END]()\n else this.emit('drain')\n }\n\n /**\n * Resume the stream if it is currently in a paused state\n *\n * If called when there are no pipe destinations or `data` event listeners,\n * this will place the stream in a \"discarded\" state, where all data will\n * be thrown away. The discarded state is removed if a pipe destination or\n * data handler is added, if pause() is called, or if any synchronous or\n * asynchronous iteration is started.\n */\n resume() {\n return this[RESUME]()\n }\n\n /**\n * Pause the stream\n */\n pause() {\n this[FLOWING] = false\n this[PAUSED] = true\n this[DISCARDED] = false\n }\n\n /**\n * true if the stream has been forcibly destroyed\n */\n get destroyed() {\n return this[DESTROYED]\n }\n\n /**\n * true if the stream is currently in a flowing state, meaning that\n * any writes will be immediately emitted.\n */\n get flowing() {\n return this[FLOWING]\n }\n\n /**\n * true if the stream is currently in a paused state\n */\n get paused() {\n return this[PAUSED]\n }\n\n [BUFFERPUSH](chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n this[BUFFER].push(chunk)\n }\n\n [BUFFERSHIFT](): RType {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n else\n this[BUFFERLENGTH] -= (\n this[BUFFER][0] as Minipass.BufferOrString\n ).length\n return this[BUFFER].shift() as RType\n }\n\n [FLUSH](noDrain: boolean = false) {\n do {} while (\n this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n this[BUFFER].length\n )\n\n if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n }\n\n [FLUSHCHUNK](chunk: RType) {\n this.emit('data', chunk)\n return this[FLOWING]\n }\n\n /**\n * Pipe all data emitted by this stream into the destination provided.\n *\n * Triggers the flow of data.\n */\n pipe<W extends Minipass.Writable>(dest: W, opts?: PipeOptions): W {\n if (this[DESTROYED]) return dest\n this[DISCARDED] = false\n\n const ended = this[EMITTED_END]\n opts = opts || {}\n if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n else opts.end = opts.end !== false\n opts.proxyErrors = !!opts.proxyErrors\n\n // piping an ended stream ends immediately\n if (ended) {\n if (opts.end) dest.end()\n } else {\n // \"as\" here just ignores the WType, which pipes don't care about,\n // since they're only consuming from us, and writing to the dest\n this[PIPES].push(\n !opts.proxyErrors\n ? new Pipe<RType>(this as Minipass<RType>, dest, opts)\n : new PipeProxyErrors<RType>(this as Minipass<RType>, dest, opts)\n )\n if (this[ASYNC]) defer(() => this[RESUME]())\n else this[RESUME]()\n }\n\n return dest\n }\n\n /**\n * Fully unhook a piped destination stream.\n *\n * If the destination stream was the only consumer of this stream (ie,\n * there are no other piped destinations or `'data'` event listeners)\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n unpipe<W extends Minipass.Writable>(dest: W) {\n const p = this[PIPES].find(p => p.dest === dest)\n if (p) {\n if (this[PIPES].length === 1) {\n if (this[FLOWING] && this[DATALISTENERS] === 0) {\n this[FLOWING] = false\n }\n this[PIPES] = []\n } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n p.unpipe()\n }\n }\n\n /**\n * Alias for {@link Minipass#on}\n */\n addListener<Event extends keyof Events>(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n return this.on(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.on`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * - Adding a 'data' event handler will trigger the flow of data\n *\n * - Adding a 'readable' event handler when there is data waiting to be read\n * will cause 'readable' to be emitted immediately.\n *\n * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n * already passed will cause the event to be emitted immediately and all\n * handlers removed.\n *\n * - Adding an 'error' event handler after an error has been emitted will\n * cause the event to be re-emitted immediately with the error previously\n * raised.\n */\n on<Event extends keyof Events>(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n const ret = super.on(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n if (ev === 'data') {\n this[DISCARDED] = false\n this[DATALISTENERS]++\n if (!this[PIPES].length && !this[FLOWING]) {\n this[RESUME]()\n }\n } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n super.emit('readable')\n } else if (isEndish(ev) && this[EMITTED_END]) {\n super.emit(ev)\n this.removeAllListeners(ev)\n } else if (ev === 'error' && this[EMITTED_ERROR]) {\n const h = handler as (...a: Events['error']) => any\n if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n else h.call(this, this[EMITTED_ERROR])\n }\n return ret\n }\n\n /**\n * Alias for {@link Minipass#off}\n */\n removeListener<Event extends keyof Events>(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n return this.off(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.off`\n *\n * If a 'data' event handler is removed, and it was the last consumer\n * (ie, there are no pipe destinations or other 'data' event listeners),\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n off<Event extends keyof Events>(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n const ret = super.off(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n // if we previously had listeners, and now we don't, and we don't\n // have any pipes, then stop the flow, unless it's been explicitly\n // put in a discarded flowing state via stream.resume().\n if (ev === 'data') {\n this[DATALISTENERS] = this.listeners('data').length\n if (\n this[DATALISTENERS] === 0 &&\n !this[DISCARDED] &&\n !this[PIPES].length\n ) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * Mostly identical to `EventEmitter.removeAllListeners`\n *\n * If all 'data' event handlers are removed, and they were the last consumer\n * (ie, there are no pipe destinations), then the flow of data will stop\n * until there is another consumer or {@link Minipass#resume} is explicitly\n * called.\n */\n removeAllListeners<Event extends keyof Events>(ev?: Event) {\n const ret = super.removeAllListeners(ev as string | symbol | undefined)\n if (ev === 'data' || ev === undefined) {\n this[DATALISTENERS] = 0\n if (!this[DISCARDED] && !this[PIPES].length) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * true if the 'end' event has been emitted\n */\n get emittedEnd() {\n return this[EMITTED_END]\n }\n\n [MAYBE_EMIT_END]() {\n if (\n !this[EMITTING_END] &&\n !this[EMITTED_END] &&\n !this[DESTROYED] &&\n this[BUFFER].length === 0 &&\n this[EOF]\n ) {\n this[EMITTING_END] = true\n this.emit('end')\n this.emit('prefinish')\n this.emit('finish')\n if (this[CLOSED]) this.emit('close')\n this[EMITTING_END] = false\n }\n }\n\n /**\n * Mostly identical to `EventEmitter.emit`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * If the stream has been destroyed, and the event is something other\n * than 'close' or 'error', then `false` is returned and no handlers\n * are called.\n *\n * If the event is 'end', and has already been emitted, then the event\n * is ignored. If the stream is in a paused or non-flowing state, then\n * the event will be deferred until data flow resumes. If the stream is\n * async, then handlers will be called on the next tick rather than\n * immediately.\n *\n * If the event is 'close', and 'end' has not yet been emitted, then\n * the event will be deferred until after 'end' is emitted.\n *\n * If the event is 'error', and an AbortSignal was provided for the stream,\n * and there are no listeners, then the event is ignored, matching the\n * behavior of node core streams in the presense of an AbortSignal.\n *\n * If the event is 'finish' or 'prefinish', then all listeners will be\n * removed after emitting the event, to prevent double-firing.\n */\n emit<Event extends keyof Events>(\n ev: Event,\n ...args: Events[Event]\n ): boolean {\n const data = args[0]\n // error and close are only events allowed after calling destroy()\n if (\n ev !== 'error' &&\n ev !== 'close' &&\n ev !== DESTROYED &&\n this[DESTROYED]\n ) {\n return false\n } else if (ev === 'data') {\n return !this[OBJECTMODE] && !data\n ? false\n : this[ASYNC]\n ? (defer(() => this[EMITDATA](data as RType)), true)\n : this[EMITDATA](data as RType)\n } else if (ev === 'end') {\n return this[EMITEND]()\n } else if (ev === 'close') {\n this[CLOSED] = true\n // don't emit close before 'end' and 'finish'\n if (!this[EMITTED_END] && !this[DESTROYED]) return false\n const ret = super.emit('close')\n this.removeAllListeners('close')\n return ret\n } else if (ev === 'error') {\n this[EMITTED_ERROR] = data\n super.emit(ERROR, data)\n const ret =\n !this[SIGNAL] || this.listeners('error').length\n ? super.emit('error', data)\n : false\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'resume') {\n const ret = super.emit('resume')\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'finish' || ev === 'prefinish') {\n const ret = super.emit(ev)\n this.removeAllListeners(ev)\n return ret\n }\n\n // Some other unknown event\n const ret = super.emit(ev as string, ...args)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITDATA](data: RType) {\n for (const p of this[PIPES]) {\n if (p.dest.write(data as RType) === false) this.pause()\n }\n const ret = this[DISCARDED] ? false : super.emit('data', data)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITEND]() {\n if (this[EMITTED_END]) return false\n\n this[EMITTED_END] = true\n this.readable = false\n return this[ASYNC]\n ? (defer(() => this[EMITEND2]()), true)\n : this[EMITEND2]()\n }\n\n [EMITEND2]() {\n if (this[DECODER]) {\n const data = this[DECODER].end()\n if (data) {\n for (const p of this[PIPES]) {\n p.dest.write(data as RType)\n }\n if (!this[DISCARDED]) super.emit('data', data)\n }\n }\n\n for (const p of this[PIPES]) {\n p.end()\n }\n const ret = super.emit('end')\n this.removeAllListeners('end')\n return ret\n }\n\n /**\n * Return a Promise that resolves to an array of all emitted data once\n * the stream ends.\n */\n async collect(): Promise<RType[] & { dataLength: number }> {\n const buf: RType[] & { dataLength: number } = Object.assign([], {\n dataLength: 0,\n })\n if (!this[OBJECTMODE]) buf.dataLength = 0\n // set the promise first, in case an error is raised\n // by triggering the flow here.\n const p = this.promise()\n this.on('data', c => {\n buf.push(c)\n if (!this[OBJECTMODE])\n buf.dataLength += (c as Minipass.BufferOrString).length\n })\n await p\n return buf\n }\n\n /**\n * Return a Promise that resolves to the concatenation of all emitted data\n * once the stream ends.\n *\n * Not allowed on objectMode streams.\n */\n async concat(): Promise<RType> {\n if (this[OBJECTMODE]) {\n throw new Error('cannot concat in objectMode')\n }\n const buf = await this.collect()\n return (\n this[ENCODING]\n ? buf.join('')\n : Buffer.concat(buf as Buffer[], buf.dataLength)\n ) as RType\n }\n\n /**\n * Return a void Promise that resolves once the stream ends.\n */\n async promise(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n this.on('error', er => reject(er))\n this.on('end', () => resolve())\n })\n }\n\n /**\n * Asynchronous `for await of` iteration.\n *\n * This will continue emitting all chunks until the stream terminates.\n */\n [Symbol.asyncIterator](): AsyncGenerator<RType, void, void> {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = async (): Promise<IteratorReturnResult<void>> => {\n this.pause()\n stopped = true\n return { value: undefined, done: true }\n }\n const next = (): Promise<IteratorResult<RType, void>> => {\n if (stopped) return stop()\n const res = this.read()\n if (res !== null) return Promise.resolve({ done: false, value: res })\n\n if (this[EOF]) return stop()\n\n let resolve!: (res: IteratorResult<RType>) => void\n let reject!: (er: unknown) => void\n const onerr = (er: unknown) => {\n this.off('data', ondata)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n stop()\n reject(er)\n }\n const ondata = (value: RType) => {\n this.off('error', onerr)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n this.pause()\n resolve({ value, done: !!this[EOF] })\n }\n const onend = () => {\n this.off('error', onerr)\n this.off('data', ondata)\n this.off(DESTROYED, ondestroy)\n stop()\n resolve({ done: true, value: undefined })\n }\n const ondestroy = () => onerr(new Error('stream destroyed'))\n return new Promise<IteratorResult<RType>>((res, rej) => {\n reject = rej\n resolve = res\n this.once(DESTROYED, ondestroy)\n this.once('error', onerr)\n this.once('end', onend)\n this.once('data', ondata)\n })\n }\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.asyncIterator]() {\n return this\n },\n [Symbol.asyncDispose]: async () => {},\n }\n }\n\n /**\n * Synchronous `for of` iteration.\n *\n * The iteration will terminate when the internal buffer runs out, even\n * if the stream has not yet terminated.\n */\n [Symbol.iterator](): Generator<RType, void, void> {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = (): IteratorReturnResult<void> => {\n this.pause()\n this.off(ERROR, stop)\n this.off(DESTROYED, stop)\n this.off('end', stop)\n stopped = true\n return { done: true, value: undefined }\n }\n\n const next = (): IteratorResult<RType, void> => {\n if (stopped) return stop()\n const value = this.read()\n return value === null ? stop() : { done: false, value }\n }\n\n this.once('end', stop)\n this.once(ERROR, stop)\n this.once(DESTROYED, stop)\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.iterator]() {\n return this\n },\n [Symbol.dispose]: () => {},\n }\n }\n\n /**\n * Destroy a stream, preventing it from being used for any further purpose.\n *\n * If the stream has a `close()` method, then it will be called on\n * destruction.\n *\n * After destruction, any attempt to write data, read data, or emit most\n * events will be ignored.\n *\n * If an error argument is provided, then it will be emitted in an\n * 'error' event.\n */\n destroy(er?: unknown) {\n if (this[DESTROYED]) {\n if (er) this.emit('error', er)\n else this.emit(DESTROYED)\n return this\n }\n\n this[DESTROYED] = true\n this[DISCARDED] = true\n\n // throw away all buffered data, it's never coming out\n this[BUFFER].length = 0\n this[BUFFERLENGTH] = 0\n\n const wc = this as Minipass<RType, WType, Events> & {\n close?: () => void\n }\n if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n if (er) this.emit('error', er)\n // if no error to emit, still reject pending promises\n else this.emit(DESTROYED)\n\n return this\n }\n\n /**\n * Alias for {@link isStream}\n *\n * Former export location, maintained for backwards compatibility.\n *\n * @deprecated\n */\n static get isStream() {\n return isStream\n }\n}\n","import { WriteStream, WriteStreamSync } from '@isaacs/fs-minipass'\nimport type { Minipass } from 'minipass'\nimport path from 'node:path'\nimport { list } from './list.js'\nimport { makeCommand } from './make-command.js'\nimport type {\n TarOptions,\n TarOptionsFile,\n TarOptionsSync,\n TarOptionsSyncFile,\n} from './options.js'\nimport { Pack, PackSync } from './pack.js'\n\nconst createFileSync = (opt: TarOptionsSyncFile, files: string[]) => {\n const p = new PackSync(opt)\n const stream = new WriteStreamSync(opt.file, {\n mode: opt.mode || 0o666,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n addFilesSync(p, files)\n}\n\nconst createFile = (opt: TarOptionsFile, files: string[]) => {\n const p = new Pack(opt)\n const stream = new WriteStream(opt.file, {\n mode: opt.mode || 0o666,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n\n const promise = new Promise<void>((res, rej) => {\n stream.on('error', rej)\n stream.on('close', res)\n p.on('error', rej)\n })\n\n addFilesAsync(p, files).catch(er => p.emit('error', er))\n\n return promise\n}\n\nconst addFilesSync = (p: PackSync, files: string[]) => {\n files.forEach(file => {\n if (file.charAt(0) === '@') {\n list({\n file: path.resolve(p.cwd, file.slice(1)),\n sync: true,\n noResume: true,\n onReadEntry: entry => p.add(entry),\n })\n } else {\n p.add(file)\n }\n })\n p.end()\n}\n\nconst addFilesAsync = async (p: Pack, files: string[]): Promise<void> => {\n for (const file of files) {\n if (file.charAt(0) === '@') {\n await list({\n file: path.resolve(String(p.cwd), file.slice(1)),\n noResume: true,\n onReadEntry: entry => {\n p.add(entry)\n },\n })\n } else {\n p.add(file)\n }\n }\n p.end()\n}\n\nconst createSync = (opt: TarOptionsSync, files: string[]) => {\n const p = new PackSync(opt)\n addFilesSync(p, files)\n return p\n}\n\nconst createAsync = (opt: TarOptions, files: string[]) => {\n const p = new Pack(opt)\n addFilesAsync(p, files).catch(er => p.emit('error', er))\n return p\n}\n\nexport const create = makeCommand(\n createFileSync,\n createFile,\n createSync,\n createAsync,\n (_opt, files) => {\n if (!files?.length) {\n throw new TypeError('no paths specified to add to archive')\n }\n },\n)\n","// tar -t\nimport * as fsm from '@isaacs/fs-minipass'\nimport fs from 'node:fs'\nimport { dirname, parse } from 'path'\nimport { makeCommand } from './make-command.js'\nimport type {\n TarOptions,\n TarOptionsFile,\n TarOptionsSyncFile,\n} from './options.js'\nimport { Parser } from './parse.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\n\nconst onReadEntryFunction = (opt: TarOptions) => {\n const onReadEntry = opt.onReadEntry\n opt.onReadEntry =\n onReadEntry ?\n e => {\n onReadEntry(e)\n e.resume()\n }\n : e => e.resume()\n}\n\n// construct a filter that limits the file entries listed\n// include child entries if a dir is included\nexport const filesFilter = (opt: TarOptions, files: string[]) => {\n const map = new Map<string, boolean>(\n files.map(f => [stripTrailingSlashes(f), true]),\n )\n const filter = opt.filter\n\n const mapHas = (file: string, r: string = ''): boolean => {\n const root = r || parse(file).root || '.'\n let ret: boolean\n if (file === root) ret = false\n else {\n const m = map.get(file)\n ret = m !== undefined ? m : mapHas(dirname(file), root)\n }\n\n map.set(file, ret)\n return ret\n }\n\n opt.filter =\n filter ?\n (file, entry) =>\n filter(file, entry) && mapHas(stripTrailingSlashes(file))\n : file => mapHas(stripTrailingSlashes(file))\n}\n\nconst listFileSync = (opt: TarOptionsSyncFile) => {\n const p = new Parser(opt)\n const file = opt.file\n let fd: number | undefined\n try {\n fd = fs.openSync(file, 'r')\n const stat: fs.Stats = fs.fstatSync(fd)\n const readSize: number = opt.maxReadSize || 16 * 1024 * 1024\n if (stat.size < readSize) {\n const buf = Buffer.allocUnsafe(stat.size)\n const read = fs.readSync(fd, buf, 0, stat.size, 0)\n p.end(read === buf.byteLength ? buf : buf.subarray(0, read))\n } else {\n let pos = 0\n const buf = Buffer.allocUnsafe(readSize)\n while (pos < stat.size) {\n const bytesRead = fs.readSync(fd, buf, 0, readSize, pos)\n if (bytesRead === 0) break\n pos += bytesRead\n p.write(buf.subarray(0, bytesRead))\n }\n p.end()\n }\n } finally {\n if (typeof fd === 'number') {\n try {\n fs.closeSync(fd)\n /* c8 ignore next */\n } catch {}\n }\n }\n}\n\nconst listFile = (\n opt: TarOptionsFile,\n _files: string[],\n): Promise<void> => {\n const parse = new Parser(opt)\n const readSize = opt.maxReadSize || 16 * 1024 * 1024\n\n const file = opt.file\n const p = new Promise<void>((resolve, reject) => {\n parse.on('error', reject)\n parse.on('end', resolve)\n\n fs.stat(file, (er, stat) => {\n if (er) {\n reject(er)\n } else {\n const stream = new fsm.ReadStream(file, {\n readSize: readSize,\n size: stat.size,\n })\n stream.on('error', reject)\n stream.pipe(parse)\n }\n })\n })\n return p\n}\n\nexport const list = makeCommand(\n listFileSync,\n listFile,\n opt => new Parser(opt) as Parser & { sync: true },\n opt => new Parser(opt),\n (opt, files) => {\n if (files?.length) filesFilter(opt, files)\n if (!opt.noResume) onReadEntryFunction(opt)\n },\n)\n","// turn tar(1) style args like `C` into the more verbose things like `cwd`\n\nimport { type GzipOptions, type ZlibOptions } from 'minizlib'\nimport { type Stats } from 'node:fs'\nimport { type ReadEntry } from './read-entry.js'\nimport { type WarnData } from './warn-method.js'\nimport type { WriteEntry } from './write-entry.js'\n\nconst argmap = new Map<keyof TarOptionsWithAliases, keyof TarOptions>([\n ['C', 'cwd'],\n ['f', 'file'],\n ['z', 'gzip'],\n ['P', 'preservePaths'],\n ['U', 'unlink'],\n ['strip-components', 'strip'],\n ['stripComponents', 'strip'],\n ['keep-newer', 'newer'],\n ['keepNewer', 'newer'],\n ['keep-newer-files', 'newer'],\n ['keepNewerFiles', 'newer'],\n ['k', 'keep'],\n ['keep-existing', 'keep'],\n ['keepExisting', 'keep'],\n ['m', 'noMtime'],\n ['no-mtime', 'noMtime'],\n ['p', 'preserveOwner'],\n ['L', 'follow'],\n ['h', 'follow'],\n ['onentry', 'onReadEntry'],\n])\n\n/**\n * The options that can be provided to tar commands.\n *\n * Note that some of these are only relevant for certain commands, since\n * they are specific to reading or writing.\n *\n * Aliases are provided in the {@link TarOptionsWithAliases} type.\n */\nexport interface TarOptions {\n //////////////////////////\n // shared options\n\n /**\n * Perform all I/O operations synchronously. If the stream is ended\n * immediately, then it will be processed entirely synchronously.\n */\n sync?: boolean\n\n /**\n * The tar file to be read and/or written. When this is set, a stream\n * is not returned. Asynchronous commands will return a promise indicating\n * when the operation is completed, and synchronous commands will return\n * immediately.\n */\n file?: string\n\n /**\n * Treat warnings as crash-worthy errors. Defaults false.\n */\n strict?: boolean\n\n /**\n * The effective current working directory for this tar command\n */\n cwd?: string\n\n /**\n * When creating a tar archive, this can be used to compress it as well.\n * Set to `true` to use the default gzip options, or customize them as\n * needed.\n *\n * When reading, if this is unset, then the compression status will be\n * inferred from the archive data. This is generally best, unless you are\n * sure of the compression settings in use to create the archive, and want to\n * fail if the archive doesn't match expectations.\n */\n gzip?: boolean | GzipOptions\n\n /**\n * When creating archives, preserve absolute and `..` paths in the archive,\n * rather than sanitizing them under the cwd.\n *\n * When extracting, allow absolute paths, paths containing `..`, and\n * extracting through symbolic links. By default, the root `/` is stripped\n * from absolute paths (eg, turning `/x/y/z` into `x/y/z`), paths containing\n * `..` are not extracted, and any file whose location would be modified by a\n * symbolic link is not extracted.\n *\n * **WARNING** This is almost always unsafe, and must NEVER be used on\n * archives from untrusted sources, such as user input, and every entry must\n * be validated to ensure it is safe to write. Even if the input is not\n * malicious, mistakes can cause a lot of damage!\n */\n preservePaths?: boolean\n\n /**\n * When extracting, do not set the `mtime` value for extracted entries to\n * match the `mtime` in the archive.\n *\n * When creating archives, do not store the `mtime` value in the entry. Note\n * that this prevents properly using other mtime-based features (such as\n * `tar.update` or the `newer` option) with the resulting archive.\n */\n noMtime?: boolean\n\n /**\n * Set to `true` or an object with settings for `zlib.BrotliCompress()` to\n * create a brotli-compressed archive\n *\n * When extracting, this will cause the archive to be treated as a\n * brotli-compressed file if set to `true` or a ZlibOptions object.\n *\n * If set `false`, then brotli options will not be used.\n *\n * If this, the `gzip`, and `zstd` options are left `undefined`, then tar\n * will attempt to infer the brotli compression status, but can only do so\n * based on the filename. If the filename ends in `.tbr` or `.tar.br`, and\n * the first 512 bytes are not a valid tar header, then brotli decompression\n * will be attempted.\n */\n brotli?: boolean | ZlibOptions\n\n /**\n * Set to `true` or an object with settings for `zstd.compress()` to\n * create a zstd-compressed archive\n *\n * When extracting, this will cause the archive to be treated as a\n * zstd-compressed file if set to `true` or a ZlibOptions object.\n *\n * If set `false`, then zstd options will not be used.\n *\n * If this, the `gzip`, and `brotli` options are left `undefined`, then tar\n * will attempt to infer the zstd compression status, but can only do so\n * based on the filename. If the filename ends in `.tzst` or `.tar.zst`, and\n * the first 512 bytes are not a valid tar header, then zstd decompression\n * will be attempted.\n */\n zstd?: boolean | ZlibOptions\n\n /**\n * A function that is called with `(path, stat)` when creating an archive, or\n * `(path, entry)` when extracting. Return true to process the file/entry, or\n * false to exclude it.\n */\n filter?: (path: string, entry: Stats | ReadEntry) => boolean\n\n /**\n * A function that gets called for any warning encountered.\n *\n * Note: if `strict` is set, then the warning will throw, and this method\n * will not be called.\n */\n onwarn?: (code: string, message: string, data: WarnData) => unknown\n\n //////////////////////////\n // extraction options\n\n /**\n * When extracting, unlink files before creating them. Without this option,\n * tar overwrites existing files, which preserves existing hardlinks. With\n * this option, existing hardlinks will be broken, as will any symlink that\n * would affect the location of an extracted file.\n */\n unlink?: boolean\n\n /**\n * When extracting, strip the specified number of path portions from the\n * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be\n * extracted to `{cwd}/c/d`.\n *\n * Any entry whose entire path is stripped will be excluded.\n */\n strip?: number\n\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n newer?: boolean\n\n /**\n * When extracting, do not overwrite existing files at all.\n */\n keep?: boolean\n\n /**\n * When extracting, set the `uid` and `gid` of extracted entries to the `uid`\n * and `gid` fields in the archive. Defaults to true when run as root, and\n * false otherwise.\n *\n * If false, then files and directories will be set with the owner and group\n * of the user running the process. This is similar to `-p` in `tar(1)`, but\n * ACLs and other system-specific data is never unpacked in this\n * implementation, and modes are set by default already.\n */\n preserveOwner?: boolean\n\n /**\n * The maximum depth of subfolders to extract into. This defaults to 1024.\n * Anything deeper than the limit will raise a warning and skip the entry.\n * Set to `Infinity` to remove the limitation.\n */\n maxDepth?: number\n\n /**\n * When extracting, force all created files and directories, and all\n * implicitly created directories, to be owned by the specified user id,\n * regardless of the `uid` field in the archive.\n *\n * Cannot be used along with `preserveOwner`. Requires also setting the `gid`\n * option.\n */\n uid?: number\n\n /**\n * When extracting, force all created files and directories, and all\n * implicitly created directories, to be owned by the specified group id,\n * regardless of the `gid` field in the archive.\n *\n * Cannot be used along with `preserveOwner`. Requires also setting the `uid`\n * option.\n */\n gid?: number\n\n /**\n * When extracting, provide a function that takes an `entry` object, and\n * returns a stream, or any falsey value. If a stream is provided, then that\n * stream's data will be written instead of the contents of the archive\n * entry. If a falsey value is provided, then the entry is written to disk as\n * normal.\n *\n * To exclude items from extraction, use the `filter` option.\n *\n * Note that using an asynchronous stream type with the `transform` option\n * will cause undefined behavior in synchronous extractions.\n * [MiniPass](http://npm.im/minipass)-based streams are designed for this use\n * case.\n */\n transform?: (entry: ReadEntry) => ReadEntry\n\n /**\n * Call `chmod()` to ensure that extracted files match the entry's mode\n * field. Without this field set, all mode fields in archive entries are a\n * best effort attempt only.\n *\n * Setting this necessitates a call to the deprecated `process.umask()`\n * method to determine the default umask value, unless a `processUmask`\n * config is provided as well.\n *\n * If not set, tar will attempt to create file system entries with whatever\n * mode is provided, and let the implicit process `umask` apply normally, but\n * if a file already exists to be written to, then its existing mode will not\n * be modified.\n *\n * When setting `chmod: true`, it is highly recommend to set the\n * {@link TarOptions#processUmask} option as well, to avoid the call to the\n * deprecated (and thread-unsafe) `process.umask()` method.\n */\n chmod?: boolean\n\n /**\n * When setting the {@link TarOptions#chmod} option to `true`, you may\n * provide a value here to avoid having to call the deprecated and\n * thread-unsafe `process.umask()` method.\n *\n * This has no effect with `chmod` is not set to true, as mode values are not\n * set explicitly anyway. If `chmod` is set to `true`, and a value is not\n * provided here, then `process.umask()` must be called, which will result in\n * deprecation warnings.\n *\n * The most common values for this are `0o22` (resulting in directories\n * created with mode `0o755` and files with `0o644` by default) and `0o2`\n * (resulting in directores created with mode `0o775` and files `0o664`, so\n * they are group-writable).\n */\n processUmask?: number\n\n //////////////////////////\n // archive creation options\n\n /**\n * When parsing/listing archives, `entry` streams are by default resumed\n * (set into \"flowing\" mode) immediately after the call to `onReadEntry()`.\n * Set `noResume: true` to suppress this behavior.\n *\n * Note that when this is set, the stream will never complete until the\n * data is consumed somehow.\n *\n * Set automatically in extract operations, since the entry is piped to\n * a file system entry right away. Only relevant when parsing.\n */\n noResume?: boolean\n\n /**\n * When creating, updating, or replacing within archives, this method will\n * be called with each WriteEntry that is created.\n */\n onWriteEntry?: (entry: WriteEntry) => unknown\n\n /**\n * When extracting or listing archives, this method will be called with\n * each entry that is not excluded by a `filter`.\n *\n * Important when listing archives synchronously from a file, because there\n * is otherwise no way to interact with the data!\n */\n onReadEntry?: (entry: ReadEntry) => unknown\n\n /**\n * Pack the targets of symbolic links rather than the link itself.\n */\n follow?: boolean\n\n /**\n * When creating archives, omit any metadata that is system-specific:\n * `ctime`, `atime`, `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and\n * `nlink`. Note that `mtime` is still included, because this is necessary\n * for other time-based operations such as `tar.update`. Additionally, `mode`\n * is set to a \"reasonable default\" for mose unix systems, based on an\n * effective `umask` of `0o22`.\n *\n * This also defaults the `portable` option in the gzip configs when creating\n * a compressed archive, in order to produce deterministic archives that are\n * not operating-system specific.\n */\n portable?: boolean\n\n /**\n * When creating archives, do not recursively archive the contents of\n * directories. By default, archiving a directory archives all of its\n * contents as well.\n */\n noDirRecurse?: boolean\n\n /**\n * Suppress Pax extended headers when creating archives. Note that this means\n * long paths and linkpaths will be truncated, and large or negative numeric\n * values may be interpreted incorrectly.\n */\n noPax?: boolean\n\n /**\n * Set to a `Date` object to force a specific `mtime` value for everything\n * written to an archive.\n *\n * This is useful when creating archives that are intended to be\n * deterministic based on their contents, irrespective of the file's last\n * modification time.\n *\n * Overridden by `noMtime`.\n */\n mtime?: Date\n\n /**\n * A path portion to prefix onto the entries added to an archive.\n */\n prefix?: string\n\n /**\n * The mode to set on any created file archive, defaults to 0o666\n * masked by the process umask, often resulting in 0o644.\n *\n * This does *not* affect the mode fields of individual entries, or the\n * mode status of extracted entries on the filesystem.\n */\n mode?: number\n\n //////////////////////////\n // internal options\n\n /**\n * A cache of mtime values, to avoid having to stat the same file repeatedly.\n *\n * @internal\n */\n mtimeCache?: Map<string, Date>\n\n /**\n * maximum buffer size for `fs.read()` operations.\n *\n * @internal\n */\n maxReadSize?: number\n\n /**\n * Filter modes of entries being unpacked, like `process.umask()`\n *\n * @internal\n */\n umask?: number\n\n /**\n * Default mode for directories. Used for all implicitly created directories,\n * and any directories in the archive that do not have a mode field.\n *\n * @internal\n */\n dmode?: number\n\n /**\n * default mode for files\n *\n * @internal\n */\n fmode?: number\n\n /**\n * Map that tracks which directories already exist, for extraction\n *\n * @internal\n */\n dirCache?: Map<string, boolean>\n /**\n * maximum supported size of meta entries. Defaults to 1MB\n *\n * @internal\n */\n maxMetaEntrySize?: number\n\n /**\n * A Map object containing the device and inode value for any file whose\n * `nlink` value is greater than 1, to identify hard links when creating\n * archives.\n *\n * @internal\n */\n linkCache?: Map<LinkCacheKey, string>\n\n /**\n * A map object containing the results of `fs.readdir()` calls.\n *\n * @internal\n */\n readdirCache?: Map<string, string[]>\n\n /**\n * A cache of all `lstat` results, for use in creating archives.\n *\n * @internal\n */\n statCache?: Map<string, Stats>\n\n /**\n * Number of concurrent jobs to run when creating archives.\n *\n * Defaults to 4.\n *\n * @internal\n */\n jobs?: number\n\n /**\n * Automatically set to true on Windows systems.\n *\n * When extracting, causes behavior where filenames containing `<|>?:`\n * characters are converted to windows-compatible escape sequences in the\n * created filesystem entries.\n *\n * When packing, causes behavior where paths replace `\\` with `/`, and\n * filenames containing the windows-compatible escaped forms of `<|>?:` are\n * converted to actual `<|>?:` characters in the archive.\n *\n * @internal\n */\n win32?: boolean\n\n /**\n * For `WriteEntry` objects, the absolute path to the entry on the\n * filesystem. By default, this is `resolve(cwd, entry.path)`, but it can be\n * overridden explicitly.\n *\n * @internal\n */\n absolute?: string\n\n /**\n * Used with Parser stream interface, to attach and take over when the\n * stream is completely parsed. If this is set, then the prefinish,\n * finish, and end events will not fire, and are the responsibility of\n * the ondone method to emit properly.\n *\n * @internal\n */\n ondone?: () => void\n\n /**\n * Mostly for testing, but potentially useful in some cases.\n * Forcibly trigger a chown on every entry, no matter what.\n */\n forceChown?: boolean\n\n /**\n * ambiguous deprecated name for {@link onReadEntry}\n *\n * @deprecated\n */\n onentry?: (entry: ReadEntry) => unknown\n}\n\nexport type TarOptionsSync = TarOptions & { sync: true }\nexport type TarOptionsAsync = TarOptions & { sync?: false }\nexport type TarOptionsFile = TarOptions & { file: string }\nexport type TarOptionsNoFile = TarOptions & { file?: undefined }\nexport type TarOptionsSyncFile = TarOptionsSync & TarOptionsFile\nexport type TarOptionsAsyncFile = TarOptionsAsync & TarOptionsFile\nexport type TarOptionsSyncNoFile = TarOptionsSync & TarOptionsNoFile\nexport type TarOptionsAsyncNoFile = TarOptionsAsync & TarOptionsNoFile\n\nexport type LinkCacheKey = `${number}:${number}`\n\nexport interface TarOptionsWithAliases extends TarOptions {\n /**\n * The effective current working directory for this tar command\n */\n C?: TarOptions['cwd']\n /**\n * The tar file to be read and/or written. When this is set, a stream\n * is not returned. Asynchronous commands will return a promise indicating\n * when the operation is completed, and synchronous commands will return\n * immediately.\n */\n f?: TarOptions['file']\n /**\n * When creating a tar archive, this can be used to compress it as well.\n * Set to `true` to use the default gzip options, or customize them as\n * needed.\n *\n * When reading, if this is unset, then the compression status will be\n * inferred from the archive data. This is generally best, unless you are\n * sure of the compression settings in use to create the archive, and want to\n * fail if the archive doesn't match expectations.\n */\n z?: TarOptions['gzip']\n /**\n * When creating archives, preserve absolute and `..` paths in the archive,\n * rather than sanitizing them under the cwd.\n *\n * When extracting, allow absolute paths, paths containing `..`, and\n * extracting through symbolic links. By default, the root `/` is stripped\n * from absolute paths (eg, turning `/x/y/z` into `x/y/z`), paths containing\n * `..` are not extracted, and any file whose location would be modified by a\n * symbolic link is not extracted.\n *\n * **WARNING** This is almost always unsafe, and must NEVER be used on\n * archives from untrusted sources, such as user input, and every entry must\n * be validated to ensure it is safe to write. Even if the input is not\n * malicious, mistakes can cause a lot of damage!\n */\n P?: TarOptions['preservePaths']\n /**\n * When extracting, unlink files before creating them. Without this option,\n * tar overwrites existing files, which preserves existing hardlinks. With\n * this option, existing hardlinks will be broken, as will any symlink that\n * would affect the location of an extracted file.\n */\n U?: TarOptions['unlink']\n /**\n * When extracting, strip the specified number of path portions from the\n * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be\n * extracted to `{cwd}/c/d`.\n */\n 'strip-components'?: TarOptions['strip']\n /**\n * When extracting, strip the specified number of path portions from the\n * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be\n * extracted to `{cwd}/c/d`.\n */\n stripComponents?: TarOptions['strip']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n 'keep-newer'?: TarOptions['newer']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n keepNewer?: TarOptions['newer']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n 'keep-newer-files'?: TarOptions['newer']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n keepNewerFiles?: TarOptions['newer']\n /**\n * When extracting, do not overwrite existing files at all.\n */\n k?: TarOptions['keep']\n /**\n * When extracting, do not overwrite existing files at all.\n */\n 'keep-existing'?: TarOptions['keep']\n /**\n * When extracting, do not overwrite existing files at all.\n */\n keepExisting?: TarOptions['keep']\n /**\n * When extracting, do not set the `mtime` value for extracted entries to\n * match the `mtime` in the archive.\n *\n * When creating archives, do not store the `mtime` value in the entry. Note\n * that this prevents properly using other mtime-based features (such as\n * `tar.update` or the `newer` option) with the resulting archive.\n */\n m?: TarOptions['noMtime']\n /**\n * When extracting, do not set the `mtime` value for extracted entries to\n * match the `mtime` in the archive.\n *\n * When creating archives, do not store the `mtime` value in the entry. Note\n * that this prevents properly using other mtime-based features (such as\n * `tar.update` or the `newer` option) with the resulting archive.\n */\n 'no-mtime'?: TarOptions['noMtime']\n /**\n * When extracting, set the `uid` and `gid` of extracted entries to the `uid`\n * and `gid` fields in the archive. Defaults to true when run as root, and\n * false otherwise.\n *\n * If false, then files and directories will be set with the owner and group\n * of the user running the process. This is similar to `-p` in `tar(1)`, but\n * ACLs and other system-specific data is never unpacked in this\n * implementation, and modes are set by default already.\n */\n p?: TarOptions['preserveOwner']\n /**\n * Pack the targets of symbolic links rather than the link itself.\n */\n L?: TarOptions['follow']\n /**\n * Pack the targets of symbolic links rather than the link itself.\n */\n h?: TarOptions['follow']\n\n /**\n * Deprecated option. Set explicitly false to set `chmod: true`. Ignored\n * if {@link TarOptions#chmod} is set to any boolean value.\n *\n * @deprecated\n */\n noChmod?: boolean\n}\n\nexport type TarOptionsWithAliasesSync = TarOptionsWithAliases & {\n sync: true\n}\nexport type TarOptionsWithAliasesAsync = TarOptionsWithAliases & {\n sync?: false\n}\nexport type TarOptionsWithAliasesFile =\n | (TarOptionsWithAliases & {\n file: string\n })\n | (TarOptionsWithAliases & { f: string })\nexport type TarOptionsWithAliasesSyncFile = TarOptionsWithAliasesSync &\n TarOptionsWithAliasesFile\nexport type TarOptionsWithAliasesAsyncFile = TarOptionsWithAliasesAsync &\n TarOptionsWithAliasesFile\n\nexport type TarOptionsWithAliasesNoFile = TarOptionsWithAliases & {\n f?: undefined\n file?: undefined\n}\n\nexport type TarOptionsWithAliasesSyncNoFile = TarOptionsWithAliasesSync &\n TarOptionsWithAliasesNoFile\nexport type TarOptionsWithAliasesAsyncNoFile = TarOptionsWithAliasesAsync &\n TarOptionsWithAliasesNoFile\n\nexport const isSyncFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsSyncFile => !!o.sync && !!o.file\nexport const isAsyncFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsAsyncFile => !o.sync && !!o.file\nexport const isSyncNoFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsSyncNoFile => !!o.sync && !o.file\nexport const isAsyncNoFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsAsyncNoFile => !o.sync && !o.file\nexport const isSync = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsSync => !!o.sync\nexport const isAsync = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsAsync => !o.sync\nexport const isFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsFile => !!o.file\nexport const isNoFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsNoFile => !o.file\n\nconst dealiasKey = (k: keyof TarOptionsWithAliases): keyof TarOptions => {\n const d = argmap.get(k)\n if (d) return d\n return k as keyof TarOptions\n}\n\nexport const dealias = (opt: TarOptionsWithAliases = {}): TarOptions => {\n if (!opt) return {}\n const result: Record<string, unknown> = {}\n for (const [key, v] of Object.entries(opt) as [\n keyof TarOptionsWithAliases,\n unknown,\n ][]) {\n // TS doesn't know that aliases are going to always be the same type\n const k = dealiasKey(key)\n result[k] = v\n }\n // affordance for deprecated noChmod -> chmod\n if (result.chmod === undefined && result.noChmod === false) {\n result.chmod = true\n }\n delete result.noChmod\n return result as TarOptions\n}\n","import type {\n TarOptions,\n TarOptionsAsyncFile,\n TarOptionsAsyncNoFile,\n TarOptionsSyncFile,\n TarOptionsSyncNoFile,\n TarOptionsWithAliases,\n TarOptionsWithAliasesAsync,\n TarOptionsWithAliasesAsyncFile,\n TarOptionsWithAliasesAsyncNoFile,\n TarOptionsWithAliasesFile,\n TarOptionsWithAliasesNoFile,\n TarOptionsWithAliasesSync,\n TarOptionsWithAliasesSyncFile,\n TarOptionsWithAliasesSyncNoFile,\n} from './options.js'\nimport {\n dealias,\n isAsyncFile,\n isAsyncNoFile,\n isSyncFile,\n isSyncNoFile,\n} from './options.js'\n\nexport type CB = (er?: Error) => unknown\n\nexport type TarCommand<AsyncClass, SyncClass extends { sync: true }> = {\n // async and no file specified\n (): AsyncClass\n (opt: TarOptionsWithAliasesAsyncNoFile): AsyncClass\n (entries: string[]): AsyncClass\n (opt: TarOptionsWithAliasesAsyncNoFile, entries: string[]): AsyncClass\n} & {\n // sync and no file\n (opt: TarOptionsWithAliasesSyncNoFile): SyncClass\n (opt: TarOptionsWithAliasesSyncNoFile, entries: string[]): SyncClass\n} & {\n // async and file\n (opt: TarOptionsWithAliasesAsyncFile): Promise<void>\n (opt: TarOptionsWithAliasesAsyncFile, entries: string[]): Promise<void>\n (opt: TarOptionsWithAliasesAsyncFile, cb: CB): Promise<void>\n (\n opt: TarOptionsWithAliasesAsyncFile,\n entries: string[],\n cb: CB,\n ): Promise<void>\n} & {\n // sync and file\n (opt: TarOptionsWithAliasesSyncFile): void\n (opt: TarOptionsWithAliasesSyncFile, entries: string[]): void\n} & {\n // sync, maybe file\n (opt: TarOptionsWithAliasesSync): typeof opt extends (\n TarOptionsWithAliasesFile\n ) ?\n void\n : typeof opt extends TarOptionsWithAliasesNoFile ? SyncClass\n : void | SyncClass\n (\n opt: TarOptionsWithAliasesSync,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesFile ? void\n : typeof opt extends TarOptionsWithAliasesNoFile ? SyncClass\n : void | SyncClass\n} & {\n // async, maybe file\n (opt: TarOptionsWithAliasesAsync): typeof opt extends (\n TarOptionsWithAliasesFile\n ) ?\n Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ? AsyncClass\n : Promise<void> | AsyncClass\n (\n opt: TarOptionsWithAliasesAsync,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesFile ? Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ? AsyncClass\n : Promise<void> | AsyncClass\n (opt: TarOptionsWithAliasesAsync, cb: CB): Promise<void>\n (\n opt: TarOptionsWithAliasesAsync,\n entries: string[],\n cb: CB,\n ): typeof opt extends TarOptionsWithAliasesFile ? Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ? never\n : Promise<void>\n} & {\n // maybe sync, file\n (opt: TarOptionsWithAliasesFile): Promise<void> | void\n (\n opt: TarOptionsWithAliasesFile,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesSync ? void\n : typeof opt extends TarOptionsWithAliasesAsync ? Promise<void>\n : Promise<void> | void\n (opt: TarOptionsWithAliasesFile, cb: CB): Promise<void>\n (\n opt: TarOptionsWithAliasesFile,\n entries: string[],\n cb: CB,\n ): typeof opt extends TarOptionsWithAliasesSync ? never\n : typeof opt extends TarOptionsWithAliasesAsync ? Promise<void>\n : Promise<void>\n} & {\n // maybe sync, no file\n (opt: TarOptionsWithAliasesNoFile): typeof opt extends (\n TarOptionsWithAliasesSync\n ) ?\n SyncClass\n : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass\n : SyncClass | AsyncClass\n (\n opt: TarOptionsWithAliasesNoFile,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesSync ? SyncClass\n : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass\n : SyncClass | AsyncClass\n} & {\n // maybe sync, maybe file\n (opt: TarOptionsWithAliases): typeof opt extends (\n TarOptionsWithAliasesFile\n ) ?\n typeof opt extends TarOptionsWithAliasesSync ? void\n : typeof opt extends TarOptionsWithAliasesAsync ? Promise<void>\n : void | Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ?\n typeof opt extends TarOptionsWithAliasesSync ? SyncClass\n : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass\n : SyncClass | AsyncClass\n : typeof opt extends TarOptionsWithAliasesSync ? SyncClass | void\n : typeof opt extends TarOptionsWithAliasesAsync ?\n AsyncClass | Promise<void>\n : SyncClass | void | AsyncClass | Promise<void>\n} & {\n // extras\n syncFile: (opt: TarOptionsSyncFile, entries: string[]) => void\n asyncFile: (\n opt: TarOptionsAsyncFile,\n entries: string[],\n cb?: CB,\n ) => Promise<void>\n syncNoFile: (opt: TarOptionsSyncNoFile, entries: string[]) => SyncClass\n asyncNoFile: (\n opt: TarOptionsAsyncNoFile,\n entries: string[],\n ) => AsyncClass\n validate?: (opt: TarOptions, entries?: string[]) => void\n}\n\nexport const makeCommand = <AsyncClass, SyncClass extends { sync: true }>(\n syncFile: (opt: TarOptionsSyncFile, entries: string[]) => void,\n asyncFile: (\n opt: TarOptionsAsyncFile,\n entries: string[],\n cb?: CB,\n ) => Promise<void>,\n syncNoFile: (opt: TarOptionsSyncNoFile, entries: string[]) => SyncClass,\n asyncNoFile: (\n opt: TarOptionsAsyncNoFile,\n entries: string[],\n ) => AsyncClass,\n validate?: (opt: TarOptions, entries?: string[]) => void,\n): TarCommand<AsyncClass, SyncClass> => {\n return Object.assign(\n (\n opt_: TarOptionsWithAliases | string[] = [],\n entries?: string[] | CB,\n cb?: CB,\n ) => {\n if (Array.isArray(opt_)) {\n entries = opt_\n opt_ = {}\n }\n\n if (typeof entries === 'function') {\n cb = entries\n entries = undefined\n }\n\n entries = !entries ? [] : Array.from(entries)\n\n const opt = dealias(opt_)\n\n validate?.(opt, entries)\n\n if (isSyncFile(opt)) {\n if (typeof cb === 'function') {\n throw new TypeError(\n 'callback not supported for sync tar functions',\n )\n }\n return syncFile(opt, entries)\n } else if (isAsyncFile(opt)) {\n const p = asyncFile(opt, entries)\n return cb ? p.then(() => cb(), cb) : p\n } else if (isSyncNoFile(opt)) {\n if (typeof cb === 'function') {\n throw new TypeError(\n 'callback not supported for sync tar functions',\n )\n }\n return syncNoFile(opt, entries)\n } else if (isAsyncNoFile(opt)) {\n if (typeof cb === 'function') {\n throw new TypeError('callback only supported with file option')\n }\n return asyncNoFile(opt, entries)\n /* c8 ignore start */\n }\n throw new Error('impossible options??')\n\n /* c8 ignore stop */\n },\n {\n syncFile,\n asyncFile,\n syncNoFile,\n asyncNoFile,\n validate,\n },\n ) as TarCommand<AsyncClass, SyncClass>\n}\n","// this[BUFFER] is the remainder of a chunk if we're waiting for\n// the full 512 bytes of a header to come in. We will Buffer.concat()\n// it to the next write(), which is a mem copy, but a small one.\n//\n// this[QUEUE] is a list of entries that haven't been emitted\n// yet this can only get filled up if the user keeps write()ing after\n// a write() returns false, or does a write() with more than one entry\n//\n// We don't buffer chunks, we always parse them and either create an\n// entry, or push it into the active entry. The ReadEntry class knows\n// to throw data away if .ignore=true\n//\n// Shift entry off the buffer when it emits 'end', and emit 'entry' for\n// the next one in the list.\n//\n// At any time, we're pushing body chunks into the entry at WRITEENTRY,\n// and waiting for 'end' on the entry at READENTRY\n//\n// ignored entries get .resume() called on them straight away\n\nimport { EventEmitter as EE } from 'events'\nimport { BrotliDecompress, Unzip, ZstdDecompress } from 'minizlib'\nimport { Header } from './header.js'\nimport type { TarOptions } from './options.js'\nimport { Pax } from './pax.js'\nimport { ReadEntry } from './read-entry.js'\nimport { warnMethod, type WarnData, type Warner } from './warn-method.js'\n\nconst maxMetaEntrySize = 1024 * 1024\nconst gzipHeader = Buffer.from([0x1f, 0x8b])\nconst zstdHeader = Buffer.from([0x28, 0xb5, 0x2f, 0xfd])\nconst ZIP_HEADER_LEN = Math.max(gzipHeader.length, zstdHeader.length)\n\nconst STATE = Symbol('state')\nconst WRITEENTRY = Symbol('writeEntry')\nconst READENTRY = Symbol('readEntry')\nconst NEXTENTRY = Symbol('nextEntry')\nconst PROCESSENTRY = Symbol('processEntry')\nconst EX = Symbol('extendedHeader')\nconst GEX = Symbol('globalExtendedHeader')\nconst META = Symbol('meta')\nconst EMITMETA = Symbol('emitMeta')\nconst BUFFER = Symbol('buffer')\nconst QUEUE = Symbol('queue')\nconst ENDED = Symbol('ended')\nconst EMITTEDEND = Symbol('emittedEnd')\nconst EMIT = Symbol('emit')\nconst UNZIP = Symbol('unzip')\nconst CONSUMECHUNK = Symbol('consumeChunk')\nconst CONSUMECHUNKSUB = Symbol('consumeChunkSub')\nconst CONSUMEBODY = Symbol('consumeBody')\nconst CONSUMEMETA = Symbol('consumeMeta')\nconst CONSUMEHEADER = Symbol('consumeHeader')\nconst CONSUMING = Symbol('consuming')\nconst BUFFERCONCAT = Symbol('bufferConcat')\nconst MAYBEEND = Symbol('maybeEnd')\nconst WRITING = Symbol('writing')\nconst ABORTED = Symbol('aborted')\nconst DONE = Symbol('onDone')\nconst SAW_VALID_ENTRY = Symbol('sawValidEntry')\nconst SAW_NULL_BLOCK = Symbol('sawNullBlock')\nconst SAW_EOF = Symbol('sawEOF')\nconst CLOSESTREAM = Symbol('closeStream')\n\nconst noop = () => true\n\nexport type State = 'begin' | 'header' | 'ignore' | 'meta' | 'body'\n\nexport class Parser extends EE implements Warner {\n file: string\n strict: boolean\n maxMetaEntrySize: number\n filter: Exclude<TarOptions['filter'], undefined>\n brotli?: TarOptions['brotli']\n zstd?: TarOptions['zstd']\n\n writable: true = true\n readable: false = false;\n\n [QUEUE]: (ReadEntry | [string | symbol, unknown, unknown])[] = [];\n [BUFFER]?: Buffer;\n [READENTRY]?: ReadEntry;\n [WRITEENTRY]?: ReadEntry;\n [STATE]: State = 'begin';\n [META]: string = '';\n [EX]?: Pax;\n [GEX]?: Pax;\n [ENDED]: boolean = false;\n [UNZIP]?: false | Unzip | BrotliDecompress | ZstdDecompress;\n [ABORTED]: boolean = false;\n [SAW_VALID_ENTRY]?: boolean;\n [SAW_NULL_BLOCK]: boolean = false;\n [SAW_EOF]: boolean = false;\n [WRITING]: boolean = false;\n [CONSUMING]: boolean = false;\n [EMITTEDEND]: boolean = false\n\n constructor(opt: TarOptions = {}) {\n super()\n\n this.file = opt.file || ''\n\n // these BADARCHIVE errors can't be detected early. listen on DONE.\n this.on(DONE, () => {\n if (this[STATE] === 'begin' || this[SAW_VALID_ENTRY] === false) {\n // either less than 1 block of data, or all entries were invalid.\n // Either way, probably not even a tarball.\n this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format')\n }\n })\n\n if (opt.ondone) {\n this.on(DONE, opt.ondone)\n } else {\n this.on(DONE, () => {\n this.emit('prefinish')\n this.emit('finish')\n this.emit('end')\n })\n }\n\n this.strict = !!opt.strict\n this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize\n this.filter = typeof opt.filter === 'function' ? opt.filter : noop\n // Unlike gzip, brotli doesn't have any magic bytes to identify it\n // Users need to explicitly tell us they're extracting a brotli file\n // Or we infer from the file extension\n const isTBR =\n opt.file &&\n (opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr'))\n // if it's a tbr file it MIGHT be brotli, but we don't know until\n // we look at it and verify it's not a valid tar file.\n this.brotli =\n !(opt.gzip || opt.zstd) && opt.brotli !== undefined ? opt.brotli\n : isTBR ? undefined\n : false\n\n // zstd has magic bytes to identify it, but we also support explicit options\n // and file extension detection\n const isTZST =\n opt.file &&\n (opt.file.endsWith('.tar.zst') || opt.file.endsWith('.tzst'))\n this.zstd =\n !(opt.gzip || opt.brotli) && opt.zstd !== undefined ? opt.zstd\n : isTZST ? true\n : undefined\n\n // have to set this so that streams are ok piping into it\n this.on('end', () => this[CLOSESTREAM]())\n\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n if (typeof opt.onReadEntry === 'function') {\n this.on('entry', opt.onReadEntry)\n }\n }\n\n warn(code: string, message: string | Error, data: WarnData = {}): void {\n warnMethod(this, code, message, data)\n }\n\n [CONSUMEHEADER](chunk: Buffer, position: number) {\n if (this[SAW_VALID_ENTRY] === undefined) {\n this[SAW_VALID_ENTRY] = false\n }\n let header\n try {\n header = new Header(chunk, position, this[EX], this[GEX])\n } catch (er) {\n return this.warn('TAR_ENTRY_INVALID', er as Error)\n }\n\n if (header.nullBlock) {\n if (this[SAW_NULL_BLOCK]) {\n this[SAW_EOF] = true\n // ending an archive with no entries. pointless, but legal.\n if (this[STATE] === 'begin') {\n this[STATE] = 'header'\n }\n this[EMIT]('eof')\n } else {\n this[SAW_NULL_BLOCK] = true\n this[EMIT]('nullBlock')\n }\n } else {\n this[SAW_NULL_BLOCK] = false\n if (!header.cksumValid) {\n this.warn('TAR_ENTRY_INVALID', 'checksum failure', { header })\n } else if (!header.path) {\n this.warn('TAR_ENTRY_INVALID', 'path is required', { header })\n } else {\n const type = header.type\n if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) {\n this.warn('TAR_ENTRY_INVALID', 'linkpath required', {\n header,\n })\n } else if (\n !/^(Symbolic)?Link$/.test(type) &&\n !/^(Global)?ExtendedHeader$/.test(type) &&\n header.linkpath\n ) {\n this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', {\n header,\n })\n } else {\n const entry = (this[WRITEENTRY] = new ReadEntry(\n header,\n this[EX],\n this[GEX],\n ))\n\n // we do this for meta & ignored entries as well, because they\n // are still valid tar, or else we wouldn't know to ignore them\n if (!this[SAW_VALID_ENTRY]) {\n if (entry.remain) {\n // this might be the one!\n const onend = () => {\n if (!entry.invalid) {\n this[SAW_VALID_ENTRY] = true\n }\n }\n entry.on('end', onend)\n } else {\n this[SAW_VALID_ENTRY] = true\n }\n }\n\n if (entry.meta) {\n if (entry.size > this.maxMetaEntrySize) {\n entry.ignore = true\n this[EMIT]('ignoredEntry', entry)\n this[STATE] = 'ignore'\n entry.resume()\n } else if (entry.size > 0) {\n this[META] = ''\n entry.on('data', c => (this[META] += c))\n this[STATE] = 'meta'\n }\n } else {\n this[EX] = undefined\n entry.ignore = entry.ignore || !this.filter(entry.path, entry)\n\n if (entry.ignore) {\n // probably valid, just not something we care about\n this[EMIT]('ignoredEntry', entry)\n this[STATE] = entry.remain ? 'ignore' : 'header'\n entry.resume()\n } else {\n if (entry.remain) {\n this[STATE] = 'body'\n } else {\n this[STATE] = 'header'\n entry.end()\n }\n\n if (!this[READENTRY]) {\n this[QUEUE].push(entry)\n this[NEXTENTRY]()\n } else {\n this[QUEUE].push(entry)\n }\n }\n }\n }\n }\n }\n }\n\n [CLOSESTREAM]() {\n queueMicrotask(() => this.emit('close'))\n }\n\n [PROCESSENTRY](entry?: ReadEntry | [string | symbol, unknown, unknown]) {\n let go = true\n\n if (!entry) {\n this[READENTRY] = undefined\n go = false\n } else if (Array.isArray(entry)) {\n const [ev, ...args]: [string | symbol, unknown, unknown] = entry\n this.emit(ev, ...args)\n } else {\n this[READENTRY] = entry\n this.emit('entry', entry)\n if (!entry.emittedEnd) {\n entry.on('end', () => this[NEXTENTRY]())\n go = false\n }\n }\n\n return go\n }\n\n [NEXTENTRY]() {\n do {} while (this[PROCESSENTRY](this[QUEUE].shift()))\n\n if (this[QUEUE].length === 0) {\n // At this point, there's nothing in the queue, but we may have an\n // entry which is being consumed (readEntry).\n // If we don't, then we definitely can handle more data.\n // If we do, and either it's flowing, or it has never had any data\n // written to it, then it needs more.\n // The only other possibility is that it has returned false from a\n // write() call, so we wait for the next drain to continue.\n const re = this[READENTRY]\n const drainNow = !re || re.flowing || re.size === re.remain\n if (drainNow) {\n if (!this[WRITING]) {\n this.emit('drain')\n }\n } else {\n re.once('drain', () => this.emit('drain'))\n }\n }\n }\n\n [CONSUMEBODY](chunk: Buffer, position: number) {\n // write up to but no more than writeEntry.blockRemain\n const entry = this[WRITEENTRY]\n /* c8 ignore start */\n if (!entry) {\n throw new Error('attempt to consume body without entry??')\n }\n const br = entry.blockRemain ?? 0\n /* c8 ignore stop */\n const c =\n br >= chunk.length && position === 0 ?\n chunk\n : chunk.subarray(position, position + br)\n\n entry.write(c)\n\n if (!entry.blockRemain) {\n this[STATE] = 'header'\n this[WRITEENTRY] = undefined\n entry.end()\n }\n\n return c.length\n }\n\n [CONSUMEMETA](chunk: Buffer, position: number) {\n const entry = this[WRITEENTRY]\n const ret = this[CONSUMEBODY](chunk, position)\n\n // if we finished, then the entry is reset\n if (!this[WRITEENTRY] && entry) {\n this[EMITMETA](entry)\n }\n\n return ret\n }\n\n [EMIT](ev: string | symbol, data?: unknown, extra?: unknown) {\n if (this[QUEUE].length === 0 && !this[READENTRY]) {\n this.emit(ev, data, extra)\n } else {\n this[QUEUE].push([ev, data, extra])\n }\n }\n\n [EMITMETA](entry: ReadEntry) {\n this[EMIT]('meta', this[META])\n switch (entry.type) {\n case 'ExtendedHeader':\n case 'OldExtendedHeader':\n this[EX] = Pax.parse(this[META], this[EX], false)\n break\n\n case 'GlobalExtendedHeader':\n this[GEX] = Pax.parse(this[META], this[GEX], true)\n break\n\n case 'NextFileHasLongPath':\n case 'OldGnuLongPath': {\n const ex = this[EX] ?? Object.create(null)\n this[EX] = ex\n ex.path = this[META].replace(/\\0.*/, '')\n break\n }\n\n case 'NextFileHasLongLinkpath': {\n const ex = this[EX] || Object.create(null)\n this[EX] = ex\n ex.linkpath = this[META].replace(/\\0.*/, '')\n break\n }\n\n /* c8 ignore start */\n default:\n throw new Error('unknown meta: ' + entry.type)\n /* c8 ignore stop */\n }\n }\n\n abort(error: Error) {\n this[ABORTED] = true\n this.emit('abort', error)\n // always throws, even in non-strict mode\n this.warn('TAR_ABORT', error, { recoverable: false })\n }\n\n write(\n buffer: Uint8Array | string,\n cb?: (err?: Error | null) => void,\n ): boolean\n write(\n str: string,\n encoding?: BufferEncoding,\n cb?: (err?: Error | null) => void,\n ): boolean\n write(\n chunk: Buffer | string,\n encoding?: BufferEncoding | (() => unknown),\n cb?: () => unknown,\n ): boolean {\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(\n chunk,\n /* c8 ignore next */\n typeof encoding === 'string' ? encoding : 'utf8',\n )\n }\n if (this[ABORTED]) {\n /* c8 ignore next */\n cb?.()\n return false\n }\n\n // first write, might be gzipped, zstd, or brotli compressed\n const needSniff =\n this[UNZIP] === undefined ||\n (this.brotli === undefined && this[UNZIP] === false)\n if (needSniff && chunk) {\n if (this[BUFFER]) {\n chunk = Buffer.concat([this[BUFFER], chunk])\n this[BUFFER] = undefined\n }\n if (chunk.length < ZIP_HEADER_LEN) {\n this[BUFFER] = chunk\n /* c8 ignore next */\n cb?.()\n return true\n }\n\n // look for gzip header\n for (\n let i = 0;\n this[UNZIP] === undefined && i < gzipHeader.length;\n i++\n ) {\n if (chunk[i] !== gzipHeader[i]) {\n this[UNZIP] = false\n }\n }\n\n // look for zstd header if gzip header not found\n let isZstd = false\n if (this[UNZIP] === false && this.zstd !== false) {\n isZstd = true\n for (let i = 0; i < zstdHeader.length; i++) {\n if (chunk[i] !== zstdHeader[i]) {\n isZstd = false\n break\n }\n }\n }\n\n const maybeBrotli = this.brotli === undefined && !isZstd\n if (this[UNZIP] === false && maybeBrotli) {\n // read the first header to see if it's a valid tar file. If so,\n // we can safely assume that it's not actually brotli, despite the\n // .tbr or .tar.br file extension.\n // if we ended before getting a full chunk, yes, def brotli\n if (chunk.length < 512) {\n if (this[ENDED]) {\n this.brotli = true\n } else {\n this[BUFFER] = chunk\n /* c8 ignore next */\n cb?.()\n return true\n }\n } else {\n // if it's tar, it's pretty reliably not brotli, chances of\n // that happening are astronomical.\n try {\n new Header(chunk.subarray(0, 512))\n this.brotli = false\n } catch (_) {\n this.brotli = true\n }\n }\n }\n\n if (\n this[UNZIP] === undefined ||\n (this[UNZIP] === false && (this.brotli || isZstd))\n ) {\n const ended = this[ENDED]\n this[ENDED] = false\n this[UNZIP] =\n this[UNZIP] === undefined ? new Unzip({})\n : isZstd ? new ZstdDecompress({})\n : new BrotliDecompress({})\n this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk))\n this[UNZIP].on('error', er => this.abort(er as Error))\n this[UNZIP].on('end', () => {\n this[ENDED] = true\n this[CONSUMECHUNK]()\n })\n this[WRITING] = true\n const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk)\n this[WRITING] = false\n cb?.()\n return ret\n }\n }\n\n this[WRITING] = true\n if (this[UNZIP]) {\n this[UNZIP].write(chunk)\n } else {\n this[CONSUMECHUNK](chunk)\n }\n this[WRITING] = false\n\n // return false if there's a queue, or if the current entry isn't flowing\n const ret =\n this[QUEUE].length > 0 ? false\n : this[READENTRY] ? this[READENTRY].flowing\n : true\n\n // if we have no queue, then that means a clogged READENTRY\n if (!ret && this[QUEUE].length === 0) {\n this[READENTRY]?.once('drain', () => this.emit('drain'))\n }\n\n /* c8 ignore next */\n cb?.()\n return ret\n }\n\n [BUFFERCONCAT](c: Buffer) {\n if (c && !this[ABORTED]) {\n this[BUFFER] = this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c\n }\n }\n\n [MAYBEEND]() {\n if (\n this[ENDED] &&\n !this[EMITTEDEND] &&\n !this[ABORTED] &&\n !this[CONSUMING]\n ) {\n this[EMITTEDEND] = true\n const entry = this[WRITEENTRY]\n if (entry && entry.blockRemain) {\n // truncated, likely a damaged file\n const have = this[BUFFER] ? this[BUFFER].length : 0\n this.warn(\n 'TAR_BAD_ARCHIVE',\n `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`,\n { entry },\n )\n if (this[BUFFER]) {\n entry.write(this[BUFFER])\n }\n entry.end()\n }\n this[EMIT](DONE)\n }\n }\n\n [CONSUMECHUNK](chunk?: Buffer) {\n if (this[CONSUMING] && chunk) {\n this[BUFFERCONCAT](chunk)\n } else if (!chunk && !this[BUFFER]) {\n this[MAYBEEND]()\n } else if (chunk) {\n this[CONSUMING] = true\n if (this[BUFFER]) {\n this[BUFFERCONCAT](chunk)\n const c = this[BUFFER]\n this[BUFFER] = undefined\n this[CONSUMECHUNKSUB](c)\n } else {\n this[CONSUMECHUNKSUB](chunk)\n }\n\n while (\n this[BUFFER] &&\n (this[BUFFER] as Buffer)?.length >= 512 &&\n !this[ABORTED] &&\n !this[SAW_EOF]\n ) {\n const c = this[BUFFER]\n this[BUFFER] = undefined\n this[CONSUMECHUNKSUB](c)\n }\n this[CONSUMING] = false\n }\n\n if (!this[BUFFER] || this[ENDED]) {\n this[MAYBEEND]()\n }\n }\n\n [CONSUMECHUNKSUB](chunk: Buffer) {\n // we know that we are in CONSUMING mode, so anything written goes into\n // the buffer. Advance the position and put any remainder in the buffer.\n let position = 0\n const length = chunk.length\n while (position + 512 <= length && !this[ABORTED] && !this[SAW_EOF]) {\n switch (this[STATE]) {\n case 'begin':\n case 'header':\n this[CONSUMEHEADER](chunk, position)\n position += 512\n break\n\n case 'ignore':\n case 'body':\n position += this[CONSUMEBODY](chunk, position)\n break\n\n case 'meta':\n position += this[CONSUMEMETA](chunk, position)\n break\n\n /* c8 ignore start */\n default:\n throw new Error('invalid state: ' + this[STATE])\n /* c8 ignore stop */\n }\n }\n\n if (position < length) {\n this[BUFFER] =\n this[BUFFER] ?\n Buffer.concat([chunk.subarray(position), this[BUFFER]])\n : chunk.subarray(position)\n }\n }\n\n end(cb?: () => void): this\n end(data: string | Buffer, cb?: () => void): this\n end(str: string, encoding?: BufferEncoding, cb?: () => void): this\n end(\n chunk?: string | Buffer | (() => void),\n encoding?: BufferEncoding | (() => void),\n cb?: () => void,\n ) {\n if (typeof chunk === 'function') {\n cb = chunk\n encoding = undefined\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding)\n }\n if (cb) this.once('finish', cb)\n if (!this[ABORTED]) {\n if (this[UNZIP]) {\n /* c8 ignore start */\n if (chunk) this[UNZIP].write(chunk)\n /* c8 ignore stop */\n this[UNZIP].end()\n } else {\n this[ENDED] = true\n if (this.brotli === undefined || this.zstd === undefined)\n chunk = chunk || Buffer.alloc(0)\n if (chunk) this.write(chunk)\n this[MAYBEEND]()\n }\n }\n return this\n }\n}\n","import assert from 'assert'\nimport { Buffer } from 'buffer'\nimport { Minipass } from 'minipass'\nimport * as realZlib from 'zlib'\nimport { constants } from './constants.js'\nexport { constants } from './constants.js'\n\nconst OriginalBufferConcat = Buffer.concat\nconst desc = Object.getOwnPropertyDescriptor(Buffer, 'concat')\nconst noop = (args: Buffer[]) => args as unknown as Buffer\nconst passthroughBufferConcat =\n desc?.writable === true || desc?.set !== undefined\n ? (makeNoOp: boolean) => {\n Buffer.concat = makeNoOp ? noop : OriginalBufferConcat\n }\n : (_: boolean) => {}\n\nconst _superWrite = Symbol('_superWrite')\n\nexport class ZlibError extends Error {\n code?: string\n errno?: number\n constructor(err: NodeJS.ErrnoException | Error, origin?: Function) {\n super('zlib: ' + err.message, { cause: err })\n this.code = (err as NodeJS.ErrnoException).code\n this.errno = (err as NodeJS.ErrnoException).errno\n /* c8 ignore next */\n if (!this.code) this.code = 'ZLIB_ERROR'\n\n this.message = 'zlib: ' + err.message\n Error.captureStackTrace(this, origin ?? this.constructor)\n }\n\n get name() {\n return 'ZlibError'\n }\n}\n\n// the Zlib class they all inherit from\n// This thing manages the queue of requests, and returns\n// true or false if there is anything in the queue when\n// you call the .write() method.\nconst _flushFlag = Symbol('flushFlag')\n\nexport type ChunkWithFlushFlag = Minipass.ContiguousData & {\n [_flushFlag]?: number\n}\n\nexport type ZlibBaseOptions = Minipass.Options<Minipass.ContiguousData> & {\n flush?: number\n finishFlush?: number\n fullFlushFlag?: number\n}\n\nexport type ZlibHandle =\n | realZlib.Gzip\n | realZlib.Gunzip\n | realZlib.Deflate\n | realZlib.Inflate\n | realZlib.DeflateRaw\n | realZlib.InflateRaw\n | realZlib.BrotliCompress\n | realZlib.BrotliDecompress\n | realZlib.ZstdCompress\n | realZlib.ZstdDecompress\nexport type ZlibMode =\n | 'Gzip'\n | 'Gunzip'\n | 'Deflate'\n | 'Inflate'\n | 'DeflateRaw'\n | 'InflateRaw'\n | 'Unzip'\nexport type BrotliMode = 'BrotliCompress' | 'BrotliDecompress'\nexport type ZstdMode = 'ZstdCompress' | 'ZstdDecompress'\n\nabstract class ZlibBase extends Minipass<Buffer, ChunkWithFlushFlag> {\n #sawError: boolean = false\n #ended: boolean = false\n #flushFlag: number\n #finishFlushFlag: number\n #fullFlushFlag: number\n #handle?: ZlibHandle\n #onError: (err: ZlibError) => any\n\n get sawError() {\n return this.#sawError\n }\n get handle() {\n return this.#handle\n }\n /* c8 ignore start */\n get flushFlag() {\n return this.#flushFlag\n }\n /* c8 ignore stop */\n\n constructor(opts: ZlibBaseOptions, mode: ZlibMode | BrotliMode | ZstdMode) {\n if (!opts || typeof opts !== 'object')\n throw new TypeError('invalid options for ZlibBase constructor')\n\n //@ts-ignore\n super(opts)\n\n /* c8 ignore start */\n this.#flushFlag = opts.flush ?? 0\n this.#finishFlushFlag = opts.finishFlush ?? 0\n this.#fullFlushFlag = opts.fullFlushFlag ?? 0\n /* c8 ignore stop */\n\n //@ts-ignore\n if (typeof realZlib[mode] !== 'function') {\n throw new TypeError('Compression method not supported: ' + mode)\n }\n\n // this will throw if any options are invalid for the class selected\n try {\n // @types/node doesn't know that it exports the classes, but they're there\n //@ts-ignore\n this.#handle = new realZlib[mode](opts)\n } catch (er) {\n // make sure that all errors get decorated properly\n throw new ZlibError(er as NodeJS.ErrnoException, this.constructor)\n }\n\n this.#onError = err => {\n // no sense raising multiple errors, since we abort on the first one.\n if (this.#sawError) return\n\n this.#sawError = true\n\n // there is no way to cleanly recover.\n // continuing only obscures problems.\n this.close()\n this.emit('error', err)\n }\n\n this.#handle?.on('error', er => this.#onError(new ZlibError(er)))\n this.once('end', () => this.close)\n }\n\n close() {\n if (this.#handle) {\n this.#handle.close()\n this.#handle = undefined\n this.emit('close')\n }\n }\n\n reset() {\n if (!this.#sawError) {\n assert(this.#handle, 'zlib binding closed')\n //@ts-ignore\n return this.#handle.reset?.()\n }\n }\n\n flush(flushFlag?: number) {\n if (this.ended) return\n\n if (typeof flushFlag !== 'number') flushFlag = this.#fullFlushFlag\n\n this.write(Object.assign(Buffer.alloc(0), { [_flushFlag]: flushFlag }))\n }\n\n end(cb?: () => void): this\n end(chunk: ChunkWithFlushFlag, cb?: () => void): this\n end(\n chunk: ChunkWithFlushFlag,\n encoding?: Minipass.Encoding,\n cb?: () => void,\n ): this\n end(\n chunk?: ChunkWithFlushFlag | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void,\n ) {\n /* c8 ignore start */\n if (typeof chunk === 'function') {\n cb = chunk\n encoding = undefined\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n /* c8 ignore stop */\n if (chunk) {\n if (encoding) this.write(chunk, encoding)\n else this.write(chunk)\n }\n this.flush(this.#finishFlushFlag)\n this.#ended = true\n return super.end(cb)\n }\n\n get ended() {\n return this.#ended\n }\n\n // overridden in the gzip classes to do portable writes\n [_superWrite](data: Buffer & { [_flushFlag]?: number }) {\n return super.write(data)\n }\n\n write(chunk: ChunkWithFlushFlag, cb?: () => void): boolean\n write(\n chunk: ChunkWithFlushFlag,\n encoding?: Minipass.Encoding,\n cb?: () => void,\n ): boolean\n write(\n chunk: ChunkWithFlushFlag,\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void,\n ) {\n // process the chunk using the sync process\n // then super.write() all the outputted chunks\n if (typeof encoding === 'function')\n (cb = encoding), (encoding = 'utf8')\n\n if (typeof chunk === 'string')\n chunk = Buffer.from(chunk as string, encoding as BufferEncoding)\n\n if (this.#sawError) return\n assert(this.#handle, 'zlib binding closed')\n\n // _processChunk tries to .close() the native handle after it's done, so we\n // intercept that by temporarily making it a no-op.\n // diving into the node:zlib internals a bit here\n const nativeHandle = (this.#handle as unknown as { _handle: any })\n ._handle\n const originalNativeClose = nativeHandle.close\n nativeHandle.close = () => {}\n const originalClose = this.#handle.close\n this.#handle.close = () => {}\n // It also calls `Buffer.concat()` at the end, which may be convenient\n // for some, but which we are not interested in as it slows us down.\n passthroughBufferConcat(true)\n let result: undefined | Buffer | Buffer[] = undefined\n try {\n const flushFlag =\n typeof chunk[_flushFlag] === 'number'\n ? chunk[_flushFlag]\n : this.#flushFlag\n result = (\n this.#handle as unknown as {\n _processChunk: (chunk: Buffer, flushFlag: number) => Buffer[]\n }\n )._processChunk(chunk as Buffer, flushFlag)\n // if we don't throw, reset it back how it was\n passthroughBufferConcat(false)\n } catch (err) {\n // or if we do, put Buffer.concat() back before we emit error\n // Error events call into user code, which may call Buffer.concat()\n passthroughBufferConcat(false)\n this.#onError(new ZlibError(err as NodeJS.ErrnoException, this.write))\n } finally {\n if (this.#handle) {\n // Core zlib resets `_handle` to null after attempting to close the\n // native handle. Our no-op handler prevented actual closure, but we\n // need to restore the `._handle` property.\n ;(this.#handle as unknown as { _handle: any })._handle =\n nativeHandle\n nativeHandle.close = originalNativeClose\n this.#handle.close = originalClose\n // `_processChunk()` adds an 'error' listener. If we don't remove it\n // after each call, these handlers start piling up.\n this.#handle.removeAllListeners('error')\n // make sure OUR error listener is still attached tho\n }\n }\n\n if (this.#handle)\n this.#handle.on('error', er => this.#onError(new ZlibError(er, this.write)))\n\n let writeReturn\n if (result) {\n if (Array.isArray(result) && result.length > 0) {\n const r = result[0]\n // The first buffer is always `handle._outBuffer`, which would be\n // re-used for later invocations; so, we always have to copy that one.\n writeReturn = this[_superWrite](Buffer.from(r as Buffer))\n for (let i = 1; i < result.length; i++) {\n writeReturn = this[_superWrite](result[i] as Buffer)\n }\n } else {\n // either a single Buffer or an empty array\n writeReturn = this[_superWrite](Buffer.from(result as Buffer | []))\n }\n }\n\n if (cb) cb()\n return writeReturn\n }\n}\n\nexport type ZlibOptions = ZlibBaseOptions & {\n level?: number\n strategy?: number\n}\n\nexport class Zlib extends ZlibBase {\n #level?: number\n #strategy?: number\n\n constructor(opts: ZlibOptions, mode: ZlibMode) {\n opts = opts || {}\n\n opts.flush = opts.flush || constants.Z_NO_FLUSH\n opts.finishFlush = opts.finishFlush || constants.Z_FINISH\n opts.fullFlushFlag = constants.Z_FULL_FLUSH\n super(opts, mode)\n\n this.#level = opts.level\n this.#strategy = opts.strategy\n }\n\n params(level: number, strategy: number) {\n if (this.sawError) return\n\n if (!this.handle)\n throw new Error('cannot switch params when binding is closed')\n\n // no way to test this without also not supporting params at all\n /* c8 ignore start */\n if (!(this.handle as { params?: any }).params)\n throw new Error('not supported in this implementation')\n /* c8 ignore stop */\n\n if (this.#level !== level || this.#strategy !== strategy) {\n this.flush(constants.Z_SYNC_FLUSH)\n assert(this.handle, 'zlib binding closed')\n // .params() calls .flush(), but the latter is always async in the\n // core zlib. We override .flush() temporarily to intercept that and\n // flush synchronously.\n const origFlush = this.handle.flush\n this.handle.flush = (\n flushFlag?: (() => void) | number,\n cb?: () => void,\n ) => {\n /* c8 ignore start */\n if (typeof flushFlag === 'function') {\n cb = flushFlag\n flushFlag = this.flushFlag\n }\n /* c8 ignore stop */\n this.flush(flushFlag)\n cb?.()\n }\n try {\n ;(\n this.handle as unknown as {\n params: (level?: number, strategy?: number) => void\n }\n ).params(level, strategy)\n } finally {\n this.handle.flush = origFlush\n }\n /* c8 ignore start */\n if (this.handle) {\n this.#level = level\n this.#strategy = strategy\n }\n /* c8 ignore stop */\n }\n }\n}\n\n// minimal 2-byte header\nexport class Deflate extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Deflate')\n }\n}\n\nexport class Inflate extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Inflate')\n }\n}\n\n// gzip - bigger header, same deflate compression\nexport type GzipOptions = ZlibOptions & { portable?: boolean }\nexport class Gzip extends Zlib {\n #portable: boolean\n constructor(opts: GzipOptions) {\n super(opts, 'Gzip')\n this.#portable = opts && !!opts.portable\n }\n\n [_superWrite](data: Buffer & { [_flushFlag]?: number }) {\n if (!this.#portable) return super[_superWrite](data)\n\n // we'll always get the header emitted in one first chunk\n // overwrite the OS indicator byte with 0xFF\n this.#portable = false\n data[9] = 255\n return super[_superWrite](data)\n }\n}\n\nexport class Gunzip extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Gunzip')\n }\n}\n\n// raw - no header\nexport class DeflateRaw extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'DeflateRaw')\n }\n}\n\nexport class InflateRaw extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'InflateRaw')\n }\n}\n\n// auto-detect header.\nexport class Unzip extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Unzip')\n }\n}\n\nclass Brotli extends ZlibBase {\n constructor(opts: ZlibOptions, mode: BrotliMode) {\n opts = opts || {}\n\n opts.flush = opts.flush || constants.BROTLI_OPERATION_PROCESS\n opts.finishFlush =\n opts.finishFlush || constants.BROTLI_OPERATION_FINISH\n opts.fullFlushFlag = constants.BROTLI_OPERATION_FLUSH\n super(opts, mode)\n }\n}\n\nexport class BrotliCompress extends Brotli {\n constructor(opts: ZlibOptions) {\n super(opts, 'BrotliCompress')\n }\n}\n\nexport class BrotliDecompress extends Brotli {\n constructor(opts: ZlibOptions) {\n super(opts, 'BrotliDecompress')\n }\n}\n\nclass Zstd extends ZlibBase {\n constructor(opts: ZlibOptions, mode: ZstdMode) {\n opts = opts || {}\n\n opts.flush = opts.flush || constants.ZSTD_e_continue\n opts.finishFlush = opts.finishFlush || constants.ZSTD_e_end\n opts.fullFlushFlag = constants.ZSTD_e_flush\n super(opts, mode)\n }\n}\n\nexport class ZstdCompress extends Zstd {\n constructor(opts: ZlibOptions) {\n super(opts, 'ZstdCompress')\n }\n}\n\nexport class ZstdDecompress extends Zstd {\n constructor(opts: ZlibOptions) {\n super(opts, 'ZstdDecompress')\n }\n}\n","// Update with any zlib constants that are added or changed in the future.\n// Node v6 didn't export this, so we just hard code the version and rely\n// on all the other hard-coded values from zlib v4736. When node v6\n// support drops, we can just export the realZlibConstants object.\nimport realZlib from 'zlib'\n/* c8 ignore start */\nconst realZlibConstants = realZlib.constants || { ZLIB_VERNUM: 4736 }\n/* c8 ignore stop */\n\nexport const constants = Object.freeze(\n Object.assign(\n Object.create(null),\n {\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n Z_VERSION_ERROR: -6,\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n DEFLATE: 1,\n INFLATE: 2,\n GZIP: 3,\n GUNZIP: 4,\n DEFLATERAW: 5,\n INFLATERAW: 6,\n UNZIP: 7,\n BROTLI_DECODE: 8,\n BROTLI_ENCODE: 9,\n Z_MIN_WINDOWBITS: 8,\n Z_MAX_WINDOWBITS: 15,\n Z_DEFAULT_WINDOWBITS: 15,\n Z_MIN_CHUNK: 64,\n Z_MAX_CHUNK: Infinity,\n Z_DEFAULT_CHUNK: 16384,\n Z_MIN_MEMLEVEL: 1,\n Z_MAX_MEMLEVEL: 9,\n Z_DEFAULT_MEMLEVEL: 8,\n Z_MIN_LEVEL: -1,\n Z_MAX_LEVEL: 9,\n Z_DEFAULT_LEVEL: -1,\n BROTLI_OPERATION_PROCESS: 0,\n BROTLI_OPERATION_FLUSH: 1,\n BROTLI_OPERATION_FINISH: 2,\n BROTLI_OPERATION_EMIT_METADATA: 3,\n BROTLI_MODE_GENERIC: 0,\n BROTLI_MODE_TEXT: 1,\n BROTLI_MODE_FONT: 2,\n BROTLI_DEFAULT_MODE: 0,\n BROTLI_MIN_QUALITY: 0,\n BROTLI_MAX_QUALITY: 11,\n BROTLI_DEFAULT_QUALITY: 11,\n BROTLI_MIN_WINDOW_BITS: 10,\n BROTLI_MAX_WINDOW_BITS: 24,\n BROTLI_LARGE_MAX_WINDOW_BITS: 30,\n BROTLI_DEFAULT_WINDOW: 22,\n BROTLI_MIN_INPUT_BLOCK_BITS: 16,\n BROTLI_MAX_INPUT_BLOCK_BITS: 24,\n BROTLI_PARAM_MODE: 0,\n BROTLI_PARAM_QUALITY: 1,\n BROTLI_PARAM_LGWIN: 2,\n BROTLI_PARAM_LGBLOCK: 3,\n BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: 4,\n BROTLI_PARAM_SIZE_HINT: 5,\n BROTLI_PARAM_LARGE_WINDOW: 6,\n BROTLI_PARAM_NPOSTFIX: 7,\n BROTLI_PARAM_NDIRECT: 8,\n BROTLI_DECODER_RESULT_ERROR: 0,\n BROTLI_DECODER_RESULT_SUCCESS: 1,\n BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: 2,\n BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: 3,\n BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: 0,\n BROTLI_DECODER_PARAM_LARGE_WINDOW: 1,\n BROTLI_DECODER_NO_ERROR: 0,\n BROTLI_DECODER_SUCCESS: 1,\n BROTLI_DECODER_NEEDS_MORE_INPUT: 2,\n BROTLI_DECODER_NEEDS_MORE_OUTPUT: 3,\n BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: -1,\n BROTLI_DECODER_ERROR_FORMAT_RESERVED: -2,\n BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: -3,\n BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: -4,\n BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: -5,\n BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: -6,\n BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: -7,\n BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: -8,\n BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: -9,\n BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: -10,\n BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: -11,\n BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: -12,\n BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: -13,\n BROTLI_DECODER_ERROR_FORMAT_PADDING_1: -14,\n BROTLI_DECODER_ERROR_FORMAT_PADDING_2: -15,\n BROTLI_DECODER_ERROR_FORMAT_DISTANCE: -16,\n BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: -19,\n BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: -20,\n BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: -21,\n BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: -22,\n BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: -25,\n BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: -26,\n BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: -27,\n BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: -30,\n BROTLI_DECODER_ERROR_UNREACHABLE: -31,\n },\n realZlibConstants,\n ),\n)\n","// parse a 512-byte header block to a data object, or vice-versa\n// encode returns `true` if a pax extended header is needed, because\n// the data could not be faithfully encoded in a simple header.\n// (Also, check header.needPax to see if it needs a pax header.)\n\nimport { posix as pathModule } from 'node:path'\nimport * as large from './large-numbers.js'\nimport type { EntryTypeCode, EntryTypeName } from './types.js'\nimport * as types from './types.js'\n\nexport type HeaderData = {\n path?: string\n mode?: number\n uid?: number\n gid?: number\n size?: number\n cksum?: number\n type?: EntryTypeName | 'Unsupported'\n linkpath?: string\n uname?: string\n gname?: string\n devmaj?: number\n devmin?: number\n atime?: Date\n ctime?: Date\n mtime?: Date\n\n // fields that are common in extended PAX headers, but not in the\n // \"standard\" tar header block\n charset?: string\n comment?: string\n dev?: number\n ino?: number\n nlink?: number\n}\n\nexport class Header implements HeaderData {\n cksumValid: boolean = false\n needPax: boolean = false\n nullBlock: boolean = false\n\n block?: Buffer\n path?: string\n mode?: number\n uid?: number\n gid?: number\n size?: number\n cksum?: number\n #type: EntryTypeCode | 'Unsupported' = 'Unsupported'\n linkpath?: string\n uname?: string\n gname?: string\n devmaj: number = 0\n devmin: number = 0\n atime?: Date\n ctime?: Date\n mtime?: Date\n\n charset?: string\n comment?: string\n\n constructor(\n data?: Buffer | HeaderData,\n off: number = 0,\n ex?: HeaderData,\n gex?: HeaderData,\n ) {\n if (Buffer.isBuffer(data)) {\n this.decode(data, off || 0, ex, gex)\n } else if (data) {\n this.#slurp(data)\n }\n }\n\n decode(buf: Buffer, off: number, ex?: HeaderData, gex?: HeaderData) {\n if (!off) {\n off = 0\n }\n\n if (!buf || !(buf.length >= off + 512)) {\n throw new Error('need 512 bytes for header')\n }\n\n this.path = ex?.path ?? decString(buf, off, 100)\n this.mode = ex?.mode ?? gex?.mode ?? decNumber(buf, off + 100, 8)\n this.uid = ex?.uid ?? gex?.uid ?? decNumber(buf, off + 108, 8)\n this.gid = ex?.gid ?? gex?.gid ?? decNumber(buf, off + 116, 8)\n this.size = ex?.size ?? gex?.size ?? decNumber(buf, off + 124, 12)\n this.mtime = ex?.mtime ?? gex?.mtime ?? decDate(buf, off + 136, 12)\n this.cksum = decNumber(buf, off + 148, 12)\n\n // if we have extended or global extended headers, apply them now\n // See https://github.com/npm/node-tar/pull/187\n // Apply global before local, so it overrides\n if (gex) this.#slurp(gex, true)\n if (ex) this.#slurp(ex)\n\n // old tar versions marked dirs as a file with a trailing /\n const t = decString(buf, off + 156, 1)\n if (types.isCode(t)) {\n this.#type = t || '0'\n }\n if (this.#type === '0' && this.path.slice(-1) === '/') {\n this.#type = '5'\n }\n\n // tar implementations sometimes incorrectly put the stat(dir).size\n // as the size in the tarball, even though Directory entries are\n // not able to have any body at all. In the very rare chance that\n // it actually DOES have a body, we weren't going to do anything with\n // it anyway, and it'll just be a warning about an invalid header.\n if (this.#type === '5') {\n this.size = 0\n }\n\n this.linkpath = decString(buf, off + 157, 100)\n if (\n buf.subarray(off + 257, off + 265).toString() === 'ustar\\u000000'\n ) {\n /* c8 ignore start */\n this.uname = ex?.uname ?? gex?.uname ?? decString(buf, off + 265, 32)\n this.gname = ex?.gname ?? gex?.gname ?? decString(buf, off + 297, 32)\n this.devmaj =\n ex?.devmaj ?? gex?.devmaj ?? decNumber(buf, off + 329, 8) ?? 0\n this.devmin =\n ex?.devmin ?? gex?.devmin ?? decNumber(buf, off + 337, 8) ?? 0\n /* c8 ignore stop */\n if (buf[off + 475] !== 0) {\n // definitely a prefix, definitely >130 chars.\n const prefix = decString(buf, off + 345, 155)\n this.path = prefix + '/' + this.path\n } else {\n const prefix = decString(buf, off + 345, 130)\n if (prefix) {\n this.path = prefix + '/' + this.path\n }\n /* c8 ignore start */\n this.atime = ex?.atime ?? gex?.atime ?? decDate(buf, off + 476, 12)\n this.ctime = ex?.ctime ?? gex?.ctime ?? decDate(buf, off + 488, 12)\n /* c8 ignore stop */\n }\n }\n\n let sum = 8 * 0x20\n for (let i = off; i < off + 148; i++) {\n sum += buf[i] as number\n }\n\n for (let i = off + 156; i < off + 512; i++) {\n sum += buf[i] as number\n }\n\n this.cksumValid = sum === this.cksum\n if (this.cksum === undefined && sum === 8 * 0x20) {\n this.nullBlock = true\n }\n }\n\n #slurp(ex: HeaderData, gex: boolean = false) {\n Object.assign(\n this,\n Object.fromEntries(\n Object.entries(ex).filter(([k, v]) => {\n // we slurp in everything except for the path attribute in\n // a global extended header, because that's weird. Also, any\n // null/undefined values are ignored.\n return !(\n v === null ||\n v === undefined ||\n (k === 'path' && gex) ||\n (k === 'linkpath' && gex) ||\n k === 'global'\n )\n }),\n ),\n )\n }\n\n encode(buf?: Buffer, off: number = 0) {\n if (!buf) {\n buf = this.block = Buffer.alloc(512)\n }\n\n if (this.#type === 'Unsupported') {\n this.#type = '0'\n }\n\n if (!(buf.length >= off + 512)) {\n throw new Error('need 512 bytes for header')\n }\n\n const prefixSize = this.ctime || this.atime ? 130 : 155\n const split = splitPrefix(this.path || '', prefixSize)\n const path = split[0]\n const prefix = split[1]\n this.needPax = !!split[2]\n\n this.needPax = encString(buf, off, 100, path) || this.needPax\n this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax\n this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax\n this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax\n this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax\n this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax\n buf[off + 156] = Number(this.#type.codePointAt(0))\n this.needPax =\n encString(buf, off + 157, 100, this.linkpath) || this.needPax\n buf.write('ustar\\u000000', off + 257, 8)\n this.needPax =\n encString(buf, off + 265, 32, this.uname) || this.needPax\n this.needPax =\n encString(buf, off + 297, 32, this.gname) || this.needPax\n this.needPax =\n encNumber(buf, off + 329, 8, this.devmaj) || this.needPax\n this.needPax =\n encNumber(buf, off + 337, 8, this.devmin) || this.needPax\n this.needPax =\n encString(buf, off + 345, prefixSize, prefix) || this.needPax\n if (buf[off + 475] !== 0) {\n this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax\n } else {\n this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax\n this.needPax =\n encDate(buf, off + 476, 12, this.atime) || this.needPax\n this.needPax =\n encDate(buf, off + 488, 12, this.ctime) || this.needPax\n }\n\n let sum = 8 * 0x20\n for (let i = off; i < off + 148; i++) {\n sum += buf[i] as number\n }\n\n for (let i = off + 156; i < off + 512; i++) {\n sum += buf[i] as number\n }\n\n this.cksum = sum\n encNumber(buf, off + 148, 8, this.cksum)\n this.cksumValid = true\n\n return this.needPax\n }\n\n get type(): EntryTypeName {\n return (\n this.#type === 'Unsupported' ?\n this.#type\n : types.name.get(this.#type)) as EntryTypeName\n }\n\n get typeKey(): EntryTypeCode | 'Unsupported' {\n return this.#type\n }\n\n set type(type: EntryTypeCode | EntryTypeName | 'Unsupported') {\n const c = String(types.code.get(type as EntryTypeName))\n if (types.isCode(c) || c === 'Unsupported') {\n this.#type = c\n } else if (types.isCode(type)) {\n this.#type = type\n } else {\n throw new TypeError('invalid entry type: ' + type)\n }\n }\n}\n\nconst splitPrefix = (\n p: string,\n prefixSize: number,\n): [string, string, boolean] => {\n const pathSize = 100\n let pp = p\n let prefix = ''\n let ret: undefined | [string, string, boolean] = undefined\n const root = pathModule.parse(p).root || '.'\n\n if (Buffer.byteLength(pp) < pathSize) {\n ret = [pp, prefix, false]\n } else {\n // first set prefix to the dir, and path to the base\n prefix = pathModule.dirname(pp)\n pp = pathModule.basename(pp)\n\n do {\n if (\n Buffer.byteLength(pp) <= pathSize &&\n Buffer.byteLength(prefix) <= prefixSize\n ) {\n // both fit!\n ret = [pp, prefix, false]\n } else if (\n Buffer.byteLength(pp) > pathSize &&\n Buffer.byteLength(prefix) <= prefixSize\n ) {\n // prefix fits in prefix, but path doesn't fit in path\n ret = [pp.slice(0, pathSize - 1), prefix, true]\n } else {\n // make path take a bit from prefix\n pp = pathModule.join(pathModule.basename(prefix), pp)\n prefix = pathModule.dirname(prefix)\n }\n } while (prefix !== root && ret === undefined)\n\n // at this point, found no resolution, just truncate\n if (!ret) {\n ret = [p.slice(0, pathSize - 1), '', true]\n }\n }\n return ret\n}\n\nconst decString = (buf: Buffer, off: number, size: number) =>\n buf\n .subarray(off, off + size)\n .toString('utf8')\n .replace(/\\0.*/, '')\n\nconst decDate = (buf: Buffer, off: number, size: number) =>\n numToDate(decNumber(buf, off, size))\n\nconst numToDate = (num?: number) =>\n num === undefined ? undefined : new Date(num * 1000)\n\nconst decNumber = (buf: Buffer, off: number, size: number) =>\n Number(buf[off]) & 0x80 ?\n large.parse(buf.subarray(off, off + size))\n : decSmallNumber(buf, off, size)\n\nconst nanUndef = (value: number) => (isNaN(value) ? undefined : value)\n\nconst decSmallNumber = (buf: Buffer, off: number, size: number) =>\n nanUndef(\n parseInt(\n buf\n .subarray(off, off + size)\n .toString('utf8')\n .replace(/\\0.*$/, '')\n .trim(),\n 8,\n ),\n )\n\n// the maximum encodable as a null-terminated octal, by field size\nconst MAXNUM = {\n 12: 0o77777777777,\n 8: 0o7777777,\n}\n\nconst encNumber = (\n buf: Buffer,\n off: number,\n size: 12 | 8,\n num?: number,\n) =>\n num === undefined ? false\n : num > MAXNUM[size] || num < 0 ?\n (large.encode(num, buf.subarray(off, off + size)), true)\n : (encSmallNumber(buf, off, size, num), false)\n\nconst encSmallNumber = (\n buf: Buffer,\n off: number,\n size: number,\n num: number,\n) => buf.write(octalString(num, size), off, size, 'ascii')\n\nconst octalString = (num: number, size: number) =>\n padOctal(Math.floor(num).toString(8), size)\n\nconst padOctal = (str: string, size: number) =>\n (str.length === size - 1 ?\n str\n : new Array(size - str.length - 1).join('0') + str + ' ') + '\\0'\n\nconst encDate = (buf: Buffer, off: number, size: 8 | 12, date?: Date) =>\n date === undefined ? false : (\n encNumber(buf, off, size, date.getTime() / 1000)\n )\n\n// enough to fill the longest string we've got\nconst NULLS = new Array(156).join('\\0')\n// pad with nulls, return true if it's longer or non-ascii\nconst encString = (\n buf: Buffer,\n off: number,\n size: number,\n str?: string,\n) =>\n str === undefined ? false : (\n (buf.write(str + NULLS, off, size, 'utf8'),\n str.length !== Buffer.byteLength(str) || str.length > size)\n )\n","// Tar can encode large and negative numbers using a leading byte of\n// 0xff for negative, and 0x80 for positive.\n\nexport const encode = (num: number, buf: Buffer) => {\n if (!Number.isSafeInteger(num)) {\n // The number is so large that javascript cannot represent it with integer\n // precision.\n throw Error(\n 'cannot encode number outside of javascript safe integer range',\n )\n } else if (num < 0) {\n encodeNegative(num, buf)\n } else {\n encodePositive(num, buf)\n }\n return buf\n}\n\nconst encodePositive = (num: number, buf: Buffer) => {\n buf[0] = 0x80\n\n for (var i = buf.length; i > 1; i--) {\n buf[i - 1] = num & 0xff\n num = Math.floor(num / 0x100)\n }\n}\n\nconst encodeNegative = (num: number, buf: Buffer) => {\n buf[0] = 0xff\n var flipped = false\n num = num * -1\n for (var i = buf.length; i > 1; i--) {\n var byte = num & 0xff\n num = Math.floor(num / 0x100)\n if (flipped) {\n buf[i - 1] = onesComp(byte)\n } else if (byte === 0) {\n buf[i - 1] = 0\n } else {\n flipped = true\n buf[i - 1] = twosComp(byte)\n }\n }\n}\n\nexport const parse = (buf: Buffer) => {\n const pre = buf[0]\n const value =\n pre === 0x80 ? pos(buf.subarray(1, buf.length))\n : pre === 0xff ? twos(buf)\n : null\n if (value === null) {\n throw Error('invalid base256 encoding')\n }\n\n if (!Number.isSafeInteger(value)) {\n // The number is so large that javascript cannot represent it with integer\n // precision.\n throw Error('parsed number outside of javascript safe integer range')\n }\n\n return value\n}\n\nconst twos = (buf: Buffer) => {\n var len = buf.length\n var sum = 0\n var flipped = false\n for (var i = len - 1; i > -1; i--) {\n var byte = Number(buf[i])\n var f\n if (flipped) {\n f = onesComp(byte)\n } else if (byte === 0) {\n f = byte\n } else {\n flipped = true\n f = twosComp(byte)\n }\n if (f !== 0) {\n sum -= f * Math.pow(256, len - i - 1)\n }\n }\n return sum\n}\n\nconst pos = (buf: Buffer) => {\n var len = buf.length\n var sum = 0\n for (var i = len - 1; i > -1; i--) {\n var byte = Number(buf[i])\n if (byte !== 0) {\n sum += byte * Math.pow(256, len - i - 1)\n }\n }\n return sum\n}\n\nconst onesComp = (byte: number) => (0xff ^ byte) & 0xff\n\nconst twosComp = (byte: number) => ((0xff ^ byte) + 1) & 0xff\n","export const isCode = (c: string): c is EntryTypeCode =>\n name.has(c as EntryTypeCode)\n\nexport const isName = (c: string): c is EntryTypeName =>\n code.has(c as EntryTypeName)\n\nexport type EntryTypeCode =\n | '0'\n | ''\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | 'g'\n | 'x'\n | 'A'\n | 'D'\n | 'I'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'S'\n | 'V'\n | 'X'\n\nexport type EntryTypeName =\n | 'File'\n | 'OldFile'\n | 'Link'\n | 'SymbolicLink'\n | 'CharacterDevice'\n | 'BlockDevice'\n | 'Directory'\n | 'FIFO'\n | 'ContiguousFile'\n | 'GlobalExtendedHeader'\n | 'ExtendedHeader'\n | 'SolarisACL'\n | 'GNUDumpDir'\n | 'Inode'\n | 'NextFileHasLongLinkpath'\n | 'NextFileHasLongPath'\n | 'ContinuationFile'\n | 'OldGnuLongPath'\n | 'SparseFile'\n | 'TapeVolumeHeader'\n | 'OldExtendedHeader'\n | 'Unsupported'\n\n// map types from key to human-friendly name\nexport const name = new Map<EntryTypeCode, EntryTypeName>([\n ['0', 'File'],\n // same as File\n ['', 'OldFile'],\n ['1', 'Link'],\n ['2', 'SymbolicLink'],\n // Devices and FIFOs aren't fully supported\n // they are parsed, but skipped when unpacking\n ['3', 'CharacterDevice'],\n ['4', 'BlockDevice'],\n ['5', 'Directory'],\n ['6', 'FIFO'],\n // same as File\n ['7', 'ContiguousFile'],\n // pax headers\n ['g', 'GlobalExtendedHeader'],\n ['x', 'ExtendedHeader'],\n // vendor-specific stuff\n // skip\n ['A', 'SolarisACL'],\n // like 5, but with data, which should be skipped\n ['D', 'GNUDumpDir'],\n // metadata only, skip\n ['I', 'Inode'],\n // data = link path of next file\n ['K', 'NextFileHasLongLinkpath'],\n // data = path of next file\n ['L', 'NextFileHasLongPath'],\n // skip\n ['M', 'ContinuationFile'],\n // like L\n ['N', 'OldGnuLongPath'],\n // skip\n ['S', 'SparseFile'],\n // skip\n ['V', 'TapeVolumeHeader'],\n // like x\n ['X', 'OldExtendedHeader'],\n])\n\n// map the other direction\nexport const code = new Map<EntryTypeName, EntryTypeCode>(\n Array.from(name).map(kv => [kv[1], kv[0]]),\n)\n","import { basename } from 'node:path'\nimport type { HeaderData } from './header.js'\nimport { Header } from './header.js'\n\nexport class Pax implements HeaderData {\n atime?: Date\n mtime?: Date\n ctime?: Date\n\n charset?: string\n comment?: string\n\n gid?: number\n uid?: number\n\n gname?: string\n uname?: string\n linkpath?: string\n dev?: number\n ino?: number\n nlink?: number\n path?: string\n size?: number\n mode?: number\n\n global: boolean\n\n constructor(obj: HeaderData, global: boolean = false) {\n this.atime = obj.atime\n this.charset = obj.charset\n this.comment = obj.comment\n this.ctime = obj.ctime\n this.dev = obj.dev\n this.gid = obj.gid\n this.global = global\n this.gname = obj.gname\n this.ino = obj.ino\n this.linkpath = obj.linkpath\n this.mtime = obj.mtime\n this.nlink = obj.nlink\n this.path = obj.path\n this.size = obj.size\n this.uid = obj.uid\n this.uname = obj.uname\n }\n\n encode() {\n const body = this.encodeBody()\n if (body === '') {\n return Buffer.allocUnsafe(0)\n }\n\n const bodyLen = Buffer.byteLength(body)\n // round up to 512 bytes\n // add 512 for header\n const bufLen = 512 * Math.ceil(1 + bodyLen / 512)\n const buf = Buffer.allocUnsafe(bufLen)\n\n // 0-fill the header section, it might not hit every field\n for (let i = 0; i < 512; i++) {\n buf[i] = 0\n }\n\n new Header({\n // XXX split the path\n // then the path should be PaxHeader + basename, but less than 99,\n // prepend with the dirname\n /* c8 ignore start */\n path: ('PaxHeader/' + basename(this.path ?? '')).slice(0, 99),\n /* c8 ignore stop */\n mode: this.mode || 0o644,\n uid: this.uid,\n gid: this.gid,\n size: bodyLen,\n mtime: this.mtime,\n type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader',\n linkpath: '',\n uname: this.uname || '',\n gname: this.gname || '',\n devmaj: 0,\n devmin: 0,\n atime: this.atime,\n ctime: this.ctime,\n }).encode(buf)\n\n buf.write(body, 512, bodyLen, 'utf8')\n\n // null pad after the body\n for (let i = bodyLen + 512; i < buf.length; i++) {\n buf[i] = 0\n }\n\n return buf\n }\n\n encodeBody() {\n return (\n this.encodeField('path') +\n this.encodeField('ctime') +\n this.encodeField('atime') +\n this.encodeField('dev') +\n this.encodeField('ino') +\n this.encodeField('nlink') +\n this.encodeField('charset') +\n this.encodeField('comment') +\n this.encodeField('gid') +\n this.encodeField('gname') +\n this.encodeField('linkpath') +\n this.encodeField('mtime') +\n this.encodeField('size') +\n this.encodeField('uid') +\n this.encodeField('uname')\n )\n }\n\n encodeField(field: keyof Pax): string {\n if (this[field] === undefined) {\n return ''\n }\n const r = this[field]\n const v = r instanceof Date ? r.getTime() / 1000 : r\n const s =\n ' ' +\n (field === 'dev' || field === 'ino' || field === 'nlink' ?\n 'SCHILY.'\n : '') +\n field +\n '=' +\n v +\n '\\n'\n const byteLen = Buffer.byteLength(s)\n // the digits includes the length of the digits in ascii base-10\n // so if it's 9 characters, then adding 1 for the 9 makes it 10\n // which makes it 11 chars.\n let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1\n if (byteLen + digits >= Math.pow(10, digits)) {\n digits += 1\n }\n const len = digits + byteLen\n return len + s\n }\n\n static parse(str: string, ex?: HeaderData, g: boolean = false) {\n return new Pax(merge(parseKV(str), ex), g)\n }\n}\n\nconst merge = (a: HeaderData, b?: HeaderData) =>\n b ? Object.assign({}, b, a) : a\n\nconst parseKV = (str: string) =>\n str\n .replace(/\\n$/, '')\n .split('\\n')\n .reduce(parseKVLine, Object.create(null))\n\nconst parseKVLine = (set: Record<string, unknown>, line: string) => {\n const n = parseInt(line, 10)\n\n // XXX Values with \\n in them will fail this.\n // Refactor to not be a naive line-by-line parse.\n if (n !== Buffer.byteLength(line) + 1) {\n return set\n }\n\n line = line.slice((n + ' ').length)\n const kv = line.split('=')\n const r = kv.shift()\n\n if (!r) {\n return set\n }\n\n const k = r.replace(/^SCHILY\\.(dev|ino|nlink)/, '$1')\n\n const v = kv.join('=')\n set[k] =\n /^([A-Z]+\\.)?([mac]|birth|creation)time$/.test(k) ?\n new Date(Number(v) * 1000)\n : /^[0-9]+$/.test(v) ? +v\n : v\n return set\n}\n","// on windows, either \\ or / are valid directory separators.\n// on unix, \\ is a valid character in filenames.\n// so, on windows, and only on windows, we replace all \\ chars with /,\n// so that we can use / as our one and only directory separator char.\n\nconst platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform\n\nexport const normalizeWindowsPath =\n platform !== 'win32' ?\n (p: string) => p\n : (p: string) => p && p.replaceAll(/\\\\/g, '/')\n","import { Minipass } from 'minipass'\nimport type { Header } from './header.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport type { Pax } from './pax.js'\nimport type { EntryTypeName } from './types.js'\n\nexport class ReadEntry extends Minipass<Buffer, Buffer> {\n extended?: Pax\n globalExtended?: Pax\n header: Header\n startBlockSize: number\n blockRemain: number\n remain: number\n type: EntryTypeName\n meta: boolean = false\n ignore: boolean = false\n path: string\n mode?: number\n uid?: number\n gid?: number\n uname?: string\n gname?: string\n size: number = 0\n mtime?: Date\n atime?: Date\n ctime?: Date\n linkpath?: string\n\n dev?: number\n ino?: number\n nlink?: number\n invalid: boolean = false\n absolute?: string\n unsupported: boolean = false\n\n constructor(header: Header, ex?: Pax, gex?: Pax) {\n super({})\n // read entries always start life paused. this is to avoid the\n // situation where Minipass's auto-ending empty streams results\n // in an entry ending before we're ready for it.\n this.pause()\n this.extended = ex\n this.globalExtended = gex\n this.header = header\n /* c8 ignore start */\n this.remain = header.size ?? 0\n /* c8 ignore stop */\n this.startBlockSize = 512 * Math.ceil(this.remain / 512)\n this.blockRemain = this.startBlockSize\n this.type = header.type\n switch (this.type) {\n case 'File':\n case 'OldFile':\n case 'Link':\n case 'SymbolicLink':\n case 'CharacterDevice':\n case 'BlockDevice':\n case 'Directory':\n case 'FIFO':\n case 'ContiguousFile':\n case 'GNUDumpDir':\n break\n\n case 'NextFileHasLongLinkpath':\n case 'NextFileHasLongPath':\n case 'OldGnuLongPath':\n case 'GlobalExtendedHeader':\n case 'ExtendedHeader':\n case 'OldExtendedHeader':\n this.meta = true\n break\n\n // NOTE: gnutar and bsdtar treat unrecognized types as 'File'\n // it may be worth doing the same, but with a warning.\n default:\n this.ignore = true\n }\n\n /* c8 ignore start */\n if (!header.path) {\n throw new Error('no path provided for tar.ReadEntry')\n }\n /* c8 ignore stop */\n\n this.path = normalizeWindowsPath(header.path) as string\n this.mode = header.mode\n if (this.mode) {\n this.mode = this.mode & 0o7777\n }\n this.uid = header.uid\n this.gid = header.gid\n this.uname = header.uname\n this.gname = header.gname\n this.size = this.remain\n this.mtime = header.mtime\n this.atime = header.atime\n this.ctime = header.ctime\n /* c8 ignore start */\n this.linkpath =\n header.linkpath ? normalizeWindowsPath(header.linkpath) : undefined\n /* c8 ignore stop */\n this.uname = header.uname\n this.gname = header.gname\n\n if (ex) {\n this.#slurp(ex)\n }\n if (gex) {\n this.#slurp(gex, true)\n }\n }\n\n write(data: Buffer) {\n const writeLen = data.length\n if (writeLen > this.blockRemain) {\n throw new Error('writing more to entry than is appropriate')\n }\n\n const r = this.remain\n const br = this.blockRemain\n this.remain = Math.max(0, r - writeLen)\n this.blockRemain = Math.max(0, br - writeLen)\n if (this.ignore) {\n return true\n }\n\n if (r >= writeLen) {\n return super.write(data)\n }\n\n // r < writeLen\n return super.write(data.subarray(0, r))\n }\n\n #slurp(ex: Pax, gex: boolean = false) {\n if (ex.path) ex.path = normalizeWindowsPath(ex.path)\n if (ex.linkpath) ex.linkpath = normalizeWindowsPath(ex.linkpath)\n Object.assign(\n this,\n Object.fromEntries(\n Object.entries(ex).filter(([k, v]) => {\n // we slurp in everything except for the path attribute in\n // a global extended header, because that's weird. Also, any\n // null/undefined values are ignored.\n return !(v === null || v === undefined || (k === 'path' && gex))\n }),\n ),\n )\n }\n}\n","import { type Minipass } from 'minipass'\n\n/** has a warn method */\nexport type Warner = {\n warn(code: string, message: string | Error, data: unknown): void\n file?: string\n cwd?: string\n strict?: boolean\n\n emit(event: 'warn', code: string, message: string, data?: WarnData): void\n emit(event: 'error', error: TarError): void\n}\n\nexport type WarnEvent<T = Buffer> = Minipass.Events<T> & {\n warn: [code: string, message: string, data: WarnData]\n}\n\nexport type WarnData = {\n file?: string\n cwd?: string\n code?: string\n tarCode?: string\n recoverable?: boolean\n [k: string]: unknown\n}\n\nexport type TarError = Error & WarnData\n\nexport const warnMethod = (\n self: Warner,\n code: string,\n message: string | Error,\n data: WarnData = {},\n) => {\n if (self.file) {\n data.file = self.file\n }\n if (self.cwd) {\n data.cwd = self.cwd\n }\n data.code =\n (message instanceof Error &&\n (message as NodeJS.ErrnoException).code) ||\n code\n data.tarCode = code\n if (!self.strict && data.recoverable !== false) {\n if (message instanceof Error) {\n data = Object.assign(message, data)\n message = message.message\n }\n self.emit('warn', code, message, data)\n } else if (message instanceof Error) {\n self.emit('error', Object.assign(message, data))\n } else {\n self.emit(\n 'error',\n Object.assign(new Error(`${code}: ${message}`), data),\n )\n }\n}\n","// warning: extremely hot code path.\n// This has been meticulously optimized for use\n// within npm install on large package trees.\n// Do not edit without careful benchmarking.\nexport const stripTrailingSlashes = (str: string) => {\n let i = str.length - 1\n let slashesStart = -1\n while (i > -1 && str.charAt(i) === '/') {\n slashesStart = i\n i--\n }\n return slashesStart === -1 ? str : str.slice(0, slashesStart)\n}\n","// A readable tar stream creator\n// Technically, this is a transform stream that you write paths into,\n// and tar format comes out of.\n// The `add()` method is like `write()` but returns this,\n// and end() return `this` as well, so you can\n// do `new Pack(opt).add('files').add('dir').end().pipe(output)\n// You could also do something like:\n// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar'))\n\nimport fs, { type Stats } from 'fs'\nimport {\n WriteEntry,\n WriteEntrySync,\n WriteEntryTar,\n} from './write-entry.js'\n\nexport class PackJob {\n path: string\n absolute: string\n entry?: WriteEntry | WriteEntryTar\n stat?: Stats\n readdir?: string[]\n pending: boolean = false\n ignore: boolean = false\n piped: boolean = false\n constructor(path: string, absolute: string) {\n this.path = path || './'\n this.absolute = absolute\n }\n}\n\nimport { Minipass } from 'minipass'\nimport * as zlib from 'minizlib'\nimport { Yallist } from 'yallist'\nimport { ReadEntry } from './read-entry.js'\nimport type { WarnEvent } from './warn-method.js'\nimport { warnMethod, type WarnData, type Warner } from './warn-method.js'\n\nconst EOF = Buffer.alloc(1024)\nconst ONSTAT = Symbol('onStat')\nconst ENDED = Symbol('ended')\nconst QUEUE = Symbol('queue')\nconst CURRENT = Symbol('current')\nconst PROCESS = Symbol('process')\nconst PROCESSING = Symbol('processing')\nconst PROCESSJOB = Symbol('processJob')\nconst JOBS = Symbol('jobs')\nconst JOBDONE = Symbol('jobDone')\nconst ADDFSENTRY = Symbol('addFSEntry')\nconst ADDTARENTRY = Symbol('addTarEntry')\nconst STAT = Symbol('stat')\nconst READDIR = Symbol('readdir')\nconst ONREADDIR = Symbol('onreaddir')\nconst PIPE = Symbol('pipe')\nconst ENTRY = Symbol('entry')\nconst ENTRYOPT = Symbol('entryOpt')\nconst WRITEENTRYCLASS = Symbol('writeEntryClass')\nconst WRITE = Symbol('write')\nconst ONDRAIN = Symbol('ondrain')\n\nimport path from 'path'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport type { TarOptions } from './options.js'\n\nexport class Pack\n extends Minipass<Buffer, ReadEntry | string, WarnEvent<Buffer>>\n implements Warner\n{\n sync: boolean = false\n opt: TarOptions\n cwd: string\n maxReadSize?: number\n preservePaths: boolean\n strict: boolean\n noPax: boolean\n prefix: string\n linkCache: Exclude<TarOptions['linkCache'], undefined>\n statCache: Exclude<TarOptions['statCache'], undefined>\n file: string\n portable: boolean\n zip?: zlib.BrotliCompress | zlib.Gzip | zlib.ZstdCompress\n readdirCache: Exclude<TarOptions['readdirCache'], undefined>\n noDirRecurse: boolean\n follow: boolean\n noMtime: boolean\n mtime?: Date\n filter: Exclude<TarOptions['filter'], undefined>\n jobs: number;\n\n [WRITEENTRYCLASS]: typeof WriteEntry | typeof WriteEntrySync\n onWriteEntry?: (entry: WriteEntry) => void;\n // Note: we actually DO need a linked list here, because we\n // shift() to update the head of the list where we start, but still\n // while that happens, need to know what the next item in the queue\n // will be. Since we do multiple jobs in parallel, it's not as simple\n // as just an Array.shift(), since that would lose the information about\n // the next job in the list. We could add a .next field on the PackJob\n // class, but then we'd have to be tracking the tail of the queue the\n // whole time, and Yallist just does that for us anyway.\n [QUEUE]: Yallist<PackJob>;\n [JOBS]: number = 0;\n [PROCESSING]: boolean = false;\n [ENDED]: boolean = false\n\n constructor(opt: TarOptions = {}) {\n super()\n this.opt = opt\n this.file = opt.file || ''\n this.cwd = opt.cwd || process.cwd()\n this.maxReadSize = opt.maxReadSize\n this.preservePaths = !!opt.preservePaths\n this.strict = !!opt.strict\n this.noPax = !!opt.noPax\n this.prefix = normalizeWindowsPath(opt.prefix || '')\n this.linkCache = opt.linkCache || new Map()\n this.statCache = opt.statCache || new Map()\n this.readdirCache = opt.readdirCache || new Map()\n this.onWriteEntry = opt.onWriteEntry\n\n this[WRITEENTRYCLASS] = WriteEntry\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n\n this.portable = !!opt.portable\n\n if (opt.gzip || opt.brotli || opt.zstd) {\n if (\n (opt.gzip ? 1 : 0) + (opt.brotli ? 1 : 0) + (opt.zstd ? 1 : 0) >\n 1\n ) {\n throw new TypeError('gzip, brotli, zstd are mutually exclusive')\n }\n if (opt.gzip) {\n if (typeof opt.gzip !== 'object') {\n opt.gzip = {}\n }\n if (this.portable) {\n opt.gzip.portable = true\n }\n this.zip = new zlib.Gzip(opt.gzip)\n }\n if (opt.brotli) {\n if (typeof opt.brotli !== 'object') {\n opt.brotli = {}\n }\n this.zip = new zlib.BrotliCompress(opt.brotli)\n }\n if (opt.zstd) {\n if (typeof opt.zstd !== 'object') {\n opt.zstd = {}\n }\n this.zip = new zlib.ZstdCompress(opt.zstd)\n }\n /* c8 ignore next */\n if (!this.zip) throw new Error('impossible')\n const zip = this.zip\n zip.on('data', chunk => super.write(chunk as unknown as string))\n zip.on('end', () => super.end())\n zip.on('drain', () => this[ONDRAIN]())\n this.on('resume', () => zip.resume())\n } else {\n this.on('drain', this[ONDRAIN])\n }\n\n this.noDirRecurse = !!opt.noDirRecurse\n this.follow = !!opt.follow\n this.noMtime = !!opt.noMtime\n if (opt.mtime) this.mtime = opt.mtime\n\n this.filter =\n typeof opt.filter === 'function' ? opt.filter : () => true\n\n this[QUEUE] = new Yallist<PackJob>()\n this[JOBS] = 0\n this.jobs = Number(opt.jobs) || 4\n this[PROCESSING] = false\n this[ENDED] = false\n }\n\n [WRITE](chunk: Buffer) {\n return super.write(chunk as unknown as string)\n }\n\n add(path: string | ReadEntry) {\n this.write(path)\n return this\n }\n\n end(cb?: () => void): this\n end(path: string | ReadEntry, cb?: () => void): this\n end(\n path: string | ReadEntry,\n encoding?: Minipass.Encoding,\n cb?: () => void,\n ): this\n end(\n path?: string | ReadEntry | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void,\n ) {\n /* c8 ignore start */\n if (typeof path === 'function') {\n cb = path\n path = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n /* c8 ignore stop */\n if (path) {\n this.add(path)\n }\n this[ENDED] = true\n this[PROCESS]()\n /* c8 ignore next */\n if (cb) cb()\n return this\n }\n\n write(path: string | ReadEntry) {\n if (this[ENDED]) {\n throw new Error('write after end')\n }\n\n if (path instanceof ReadEntry) {\n this[ADDTARENTRY](path)\n } else {\n this[ADDFSENTRY](path)\n }\n return this.flowing\n }\n\n [ADDTARENTRY](p: ReadEntry) {\n const absolute = normalizeWindowsPath(path.resolve(this.cwd, p.path))\n // in this case, we don't have to wait for the stat\n if (!this.filter(p.path, p)) {\n p.resume()\n } else {\n const job = new PackJob(p.path, absolute)\n job.entry = new WriteEntryTar(p, this[ENTRYOPT](job))\n job.entry.on('end', () => this[JOBDONE](job))\n this[JOBS] += 1\n this[QUEUE].push(job)\n }\n\n this[PROCESS]()\n }\n\n [ADDFSENTRY](p: string) {\n const absolute = normalizeWindowsPath(path.resolve(this.cwd, p))\n this[QUEUE].push(new PackJob(p, absolute))\n this[PROCESS]()\n }\n\n [STAT](job: PackJob) {\n job.pending = true\n this[JOBS] += 1\n const stat = this.follow ? 'stat' : 'lstat'\n fs[stat](job.absolute, (er, stat) => {\n job.pending = false\n this[JOBS] -= 1\n if (er) {\n this.emit('error', er)\n } else {\n this[ONSTAT](job, stat)\n }\n })\n }\n\n [ONSTAT](job: PackJob, stat: Stats) {\n this.statCache.set(job.absolute, stat)\n job.stat = stat\n\n // now we have the stat, we can filter it.\n if (!this.filter(job.path, stat)) {\n job.ignore = true\n } else if (\n stat.isFile() &&\n stat.nlink > 1 &&\n job === this[CURRENT] &&\n !this.linkCache.get(`${stat.dev}:${stat.ino}`) &&\n !this.sync\n ) {\n // if it's not filtered, and it's a new File entry,\n // jump the queue in case any pending Link entries are about\n // to try to link to it. This prevents a hardlink from coming ahead\n // of its target in the archive.\n this[PROCESSJOB](job)\n }\n\n this[PROCESS]()\n }\n\n [READDIR](job: PackJob) {\n job.pending = true\n this[JOBS] += 1\n fs.readdir(job.absolute, (er, entries) => {\n job.pending = false\n this[JOBS] -= 1\n if (er) {\n return this.emit('error', er)\n }\n this[ONREADDIR](job, entries)\n })\n }\n\n [ONREADDIR](job: PackJob, entries: string[]) {\n this.readdirCache.set(job.absolute, entries)\n job.readdir = entries\n this[PROCESS]()\n }\n\n [PROCESS]() {\n if (this[PROCESSING]) {\n return\n }\n\n this[PROCESSING] = true\n for (\n let w = this[QUEUE].head;\n !!w && this[JOBS] < this.jobs;\n w = w.next\n ) {\n this[PROCESSJOB](w.value)\n if (w.value.ignore) {\n const p = w.next\n this[QUEUE].removeNode(w)\n w.next = p\n }\n }\n\n this[PROCESSING] = false\n\n if (this[ENDED] && this[QUEUE].length === 0 && this[JOBS] === 0) {\n if (this.zip) {\n this.zip.end(EOF)\n } else {\n super.write(EOF as unknown as string)\n super.end()\n }\n }\n }\n\n get [CURRENT]() {\n return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value\n }\n\n [JOBDONE](_job: PackJob) {\n this[QUEUE].shift()\n this[JOBS] -= 1\n this[PROCESS]()\n }\n\n [PROCESSJOB](job: PackJob) {\n if (job.pending) {\n return\n }\n\n if (job.entry) {\n if (job === this[CURRENT] && !job.piped) {\n this[PIPE](job)\n }\n return\n }\n\n if (!job.stat) {\n const sc = this.statCache.get(job.absolute)\n if (sc) {\n this[ONSTAT](job, sc)\n } else {\n this[STAT](job)\n }\n }\n if (!job.stat) {\n return\n }\n\n // filtered out!\n if (job.ignore) {\n return\n }\n\n if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) {\n const rc = this.readdirCache.get(job.absolute)\n if (rc) {\n this[ONREADDIR](job, rc)\n } else {\n this[READDIR](job)\n }\n if (!job.readdir) {\n return\n }\n }\n\n // we know it doesn't have an entry, because that got checked above\n job.entry = this[ENTRY](job)\n if (!job.entry) {\n job.ignore = true\n return\n }\n\n if (job === this[CURRENT] && !job.piped) {\n this[PIPE](job)\n }\n }\n\n [ENTRYOPT](job: PackJob): TarOptions {\n return {\n onwarn: (code, msg, data) => this.warn(code, msg, data),\n noPax: this.noPax,\n cwd: this.cwd,\n absolute: job.absolute,\n preservePaths: this.preservePaths,\n maxReadSize: this.maxReadSize,\n strict: this.strict,\n portable: this.portable,\n linkCache: this.linkCache,\n statCache: this.statCache,\n noMtime: this.noMtime,\n mtime: this.mtime,\n prefix: this.prefix,\n onWriteEntry: this.onWriteEntry,\n }\n }\n\n [ENTRY](job: PackJob) {\n this[JOBS] += 1\n try {\n const e = new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job))\n return e\n .on('end', () => this[JOBDONE](job))\n .on('error', er => this.emit('error', er))\n } catch (er) {\n this.emit('error', er)\n }\n }\n\n [ONDRAIN]() {\n if (this[CURRENT] && this[CURRENT].entry) {\n this[CURRENT].entry.resume()\n }\n }\n\n // like .pipe() but using super, because our write() is special\n [PIPE](job: PackJob) {\n job.piped = true\n\n if (job.readdir) {\n job.readdir.forEach(entry => {\n const p = job.path\n const base = p === './' ? '' : p.replace(/\\/*$/, '/')\n this[ADDFSENTRY](base + entry)\n })\n }\n\n const source = job.entry\n const zip = this.zip\n /* c8 ignore start */\n if (!source) throw new Error('cannot pipe without source')\n /* c8 ignore stop */\n\n if (zip) {\n source.on('data', chunk => {\n if (!zip.write(chunk)) {\n source.pause()\n }\n })\n } else {\n source.on('data', chunk => {\n if (!super.write(chunk as unknown as string)) {\n source.pause()\n }\n })\n }\n }\n\n pause() {\n if (this.zip) {\n this.zip.pause()\n }\n return super.pause()\n }\n warn(code: string, message: string | Error, data: WarnData = {}): void {\n warnMethod(this, code, message, data)\n }\n}\n\nexport class PackSync extends Pack {\n sync: true = true\n constructor(opt: TarOptions) {\n super(opt)\n this[WRITEENTRYCLASS] = WriteEntrySync\n }\n\n // pause/resume are no-ops in sync streams.\n pause() {}\n resume() {}\n\n [STAT](job: PackJob) {\n const stat = this.follow ? 'statSync' : 'lstatSync'\n this[ONSTAT](job, fs[stat](job.absolute))\n }\n\n [READDIR](job: PackJob) {\n this[ONREADDIR](job, fs.readdirSync(job.absolute))\n }\n\n // gotta get it all in this tick\n [PIPE](job: PackJob) {\n const source = job.entry\n const zip = this.zip\n\n if (job.readdir) {\n job.readdir.forEach(entry => {\n const p = job.path\n const base = p === './' ? '' : p.replace(/\\/*$/, '/')\n this[ADDFSENTRY](base + entry)\n })\n }\n\n /* c8 ignore start */\n if (!source) throw new Error('Cannot pipe without source')\n /* c8 ignore stop */\n\n if (zip) {\n source.on('data', chunk => {\n zip.write(chunk)\n })\n } else {\n source.on('data', chunk => {\n super[WRITE](chunk)\n })\n }\n }\n}\n","import fs, { type Stats } from 'fs'\nimport { Minipass } from 'minipass'\nimport path from 'path'\nimport { Header } from './header.js'\nimport { modeFix } from './mode-fix.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport type {\n LinkCacheKey,\n TarOptions,\n TarOptionsWithAliases,\n} from './options.js'\nimport { dealias } from './options.js'\nimport { Pax } from './pax.js'\nimport type { ReadEntry } from './read-entry.js'\nimport { stripAbsolutePath } from './strip-absolute-path.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\nimport type { EntryTypeName } from './types.js'\nimport type { WarnData, Warner, WarnEvent } from './warn-method.js'\nimport { warnMethod } from './warn-method.js'\nimport * as winchars from './winchars.js'\n\nconst prefixPath = (path: string, prefix?: string) => {\n if (!prefix) {\n return normalizeWindowsPath(path)\n }\n path = normalizeWindowsPath(path).replace(/^\\.(\\/|$)/, '')\n return stripTrailingSlashes(prefix) + '/' + path\n}\n\nconst maxReadSize = 16 * 1024 * 1024\n\nconst PROCESS = Symbol('process')\nconst FILE = Symbol('file')\nconst DIRECTORY = Symbol('directory')\nconst SYMLINK = Symbol('symlink')\nconst HARDLINK = Symbol('hardlink')\nconst HEADER = Symbol('header')\nconst READ = Symbol('read')\nconst LSTAT = Symbol('lstat')\nconst ONLSTAT = Symbol('onlstat')\nconst ONREAD = Symbol('onread')\nconst ONREADLINK = Symbol('onreadlink')\nconst OPENFILE = Symbol('openfile')\nconst ONOPENFILE = Symbol('onopenfile')\nconst CLOSE = Symbol('close')\nconst MODE = Symbol('mode')\nconst AWAITDRAIN = Symbol('awaitDrain')\nconst ONDRAIN = Symbol('ondrain')\nconst PREFIX = Symbol('prefix')\n\nexport class WriteEntry\n extends Minipass<Buffer, Minipass.ContiguousData, WarnEvent>\n implements Warner\n{\n path: string\n portable: boolean\n myuid: number = (process.getuid && process.getuid()) || 0\n // until node has builtin pwnam functions, this'll have to do\n myuser: string = process.env.USER || ''\n maxReadSize: number\n linkCache: Exclude<TarOptions['linkCache'], undefined>\n statCache: Exclude<TarOptions['statCache'], undefined>\n preservePaths: boolean\n cwd: string\n strict: boolean\n mtime?: Date\n noPax: boolean\n noMtime: boolean\n prefix?: string\n fd?: number\n\n blockLen: number = 0\n blockRemain: number = 0\n buf?: Buffer\n pos: number = 0\n remain: number = 0\n length: number = 0\n offset: number = 0\n\n win32: boolean\n absolute: string\n\n header?: Header\n type?: EntryTypeName | 'Unsupported'\n linkpath?: string\n stat?: Stats\n onWriteEntry?: (entry: WriteEntry) => unknown\n\n #hadError: boolean = false\n\n constructor(p: string, opt_: TarOptionsWithAliases = {}) {\n const opt = dealias(opt_)\n super()\n this.path = normalizeWindowsPath(p)\n // suppress atime, ctime, uid, gid, uname, gname\n this.portable = !!opt.portable\n this.maxReadSize = opt.maxReadSize || maxReadSize\n this.linkCache = opt.linkCache || new Map()\n this.statCache = opt.statCache || new Map()\n this.preservePaths = !!opt.preservePaths\n this.cwd = normalizeWindowsPath(opt.cwd || process.cwd())\n this.strict = !!opt.strict\n this.noPax = !!opt.noPax\n this.noMtime = !!opt.noMtime\n this.mtime = opt.mtime\n this.prefix = opt.prefix ? normalizeWindowsPath(opt.prefix) : undefined\n this.onWriteEntry = opt.onWriteEntry\n\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n\n let pathWarn: string | boolean = false\n if (!this.preservePaths) {\n const [root, stripped] = stripAbsolutePath(this.path)\n if (root && typeof stripped === 'string') {\n this.path = stripped\n pathWarn = root\n }\n }\n\n this.win32 = !!opt.win32 || process.platform === 'win32'\n if (this.win32) {\n // force the \\ to / normalization, since we might not *actually*\n // be on windows, but want \\ to be considered a path separator.\n this.path = winchars.decode(this.path.replaceAll(/\\\\/g, '/'))\n p = p.replaceAll(/\\\\/g, '/')\n }\n\n this.absolute = normalizeWindowsPath(\n opt.absolute || path.resolve(this.cwd, p),\n )\n\n if (this.path === '') {\n this.path = './'\n }\n\n if (pathWarn) {\n this.warn(\n 'TAR_ENTRY_INFO',\n `stripping ${pathWarn} from absolute path`,\n {\n entry: this,\n path: pathWarn + this.path,\n },\n )\n }\n\n const cs = this.statCache.get(this.absolute)\n if (cs) {\n this[ONLSTAT](cs)\n } else {\n this[LSTAT]()\n }\n }\n\n warn(code: string, message: string | Error, data: WarnData = {}) {\n return warnMethod(this, code, message, data)\n }\n\n emit(ev: keyof WarnEvent, ...data: unknown[]) {\n if (ev === 'error') {\n this.#hadError = true\n }\n return super.emit(ev, ...data)\n }\n\n [LSTAT]() {\n fs.lstat(this.absolute, (er, stat) => {\n if (er) {\n return this.emit('error', er)\n }\n this[ONLSTAT](stat)\n })\n }\n\n [ONLSTAT](stat: Stats) {\n this.statCache.set(this.absolute, stat)\n this.stat = stat\n if (!stat.isFile()) {\n stat.size = 0\n }\n this.type = getType(stat)\n this.emit('stat', stat)\n this[PROCESS]()\n }\n\n [PROCESS]() {\n switch (this.type) {\n case 'File':\n return this[FILE]()\n case 'Directory':\n return this[DIRECTORY]()\n case 'SymbolicLink':\n return this[SYMLINK]()\n // unsupported types are ignored.\n default:\n return this.end()\n }\n }\n\n [MODE](mode: number) {\n return modeFix(mode, this.type === 'Directory', this.portable)\n }\n\n [PREFIX](path: string) {\n return prefixPath(path, this.prefix)\n }\n\n [HEADER]() {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot write header before stat')\n }\n /* c8 ignore stop */\n\n if (this.type === 'Directory' && this.portable) {\n this.noMtime = true\n }\n\n this.onWriteEntry?.(this)\n this.header = new Header({\n path: this[PREFIX](this.path),\n // only apply the prefix to hard links.\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n // only the permissions and setuid/setgid/sticky bitflags\n // not the higher-order bits that specify file type\n mode: this[MODE](this.stat.mode),\n uid: this.portable ? undefined : this.stat.uid,\n gid: this.portable ? undefined : this.stat.gid,\n size: this.stat.size,\n mtime: this.noMtime ? undefined : this.mtime || this.stat.mtime,\n /* c8 ignore next */\n type: this.type === 'Unsupported' ? undefined : this.type,\n uname:\n this.portable ? undefined\n : this.stat.uid === this.myuid ? this.myuser\n : '',\n atime: this.portable ? undefined : this.stat.atime,\n ctime: this.portable ? undefined : this.stat.ctime,\n })\n\n if (this.header.encode() && !this.noPax) {\n super.write(\n new Pax({\n atime: this.portable ? undefined : this.header.atime,\n ctime: this.portable ? undefined : this.header.ctime,\n gid: this.portable ? undefined : this.header.gid,\n mtime:\n this.noMtime ? undefined : this.mtime || this.header.mtime,\n path: this[PREFIX](this.path),\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n size: this.header.size,\n uid: this.portable ? undefined : this.header.uid,\n uname: this.portable ? undefined : this.header.uname,\n dev: this.portable ? undefined : this.stat.dev,\n ino: this.portable ? undefined : this.stat.ino,\n nlink: this.portable ? undefined : this.stat.nlink,\n }).encode(),\n )\n }\n const block = this.header?.block\n /* c8 ignore start */\n if (!block) {\n throw new Error('failed to encode header')\n }\n /* c8 ignore stop */\n super.write(block)\n }\n\n [DIRECTORY]() {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot create directory entry without stat')\n }\n /* c8 ignore stop */\n if (this.path.slice(-1) !== '/') {\n this.path += '/'\n }\n this.stat.size = 0\n this[HEADER]()\n this.end()\n }\n\n [SYMLINK]() {\n fs.readlink(this.absolute, (er, linkpath) => {\n if (er) {\n return this.emit('error', er)\n }\n this[ONREADLINK](linkpath)\n })\n }\n\n [ONREADLINK](linkpath: string) {\n this.linkpath = normalizeWindowsPath(linkpath)\n this[HEADER]()\n this.end()\n }\n\n [HARDLINK](linkpath: string) {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot create link entry without stat')\n }\n /* c8 ignore stop */\n this.type = 'Link'\n this.linkpath = normalizeWindowsPath(path.relative(this.cwd, linkpath))\n this.stat.size = 0\n this[HEADER]()\n this.end()\n }\n\n [FILE]() {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot create file entry without stat')\n }\n /* c8 ignore stop */\n if (this.stat.nlink > 1) {\n const linkKey = `${this.stat.dev}:${this.stat.ino}` as LinkCacheKey\n const linkpath = this.linkCache.get(linkKey)\n if (linkpath?.indexOf(this.cwd) === 0) {\n return this[HARDLINK](linkpath)\n }\n this.linkCache.set(linkKey, this.absolute)\n }\n\n this[HEADER]()\n if (this.stat.size === 0) {\n return this.end()\n }\n\n this[OPENFILE]()\n }\n\n [OPENFILE]() {\n fs.open(this.absolute, 'r', (er, fd) => {\n if (er) {\n return this.emit('error', er)\n }\n this[ONOPENFILE](fd)\n })\n }\n\n [ONOPENFILE](fd: number) {\n this.fd = fd\n if (this.#hadError) {\n return this[CLOSE]()\n }\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('should stat before calling onopenfile')\n }\n /* c8 ignore start */\n\n this.blockLen = 512 * Math.ceil(this.stat.size / 512)\n this.blockRemain = this.blockLen\n const bufLen = Math.min(this.blockLen, this.maxReadSize)\n this.buf = Buffer.allocUnsafe(bufLen)\n this.offset = 0\n this.pos = 0\n this.remain = this.stat.size\n this.length = this.buf.length\n this[READ]()\n }\n\n [READ]() {\n const { fd, buf, offset, length, pos } = this\n if (fd === undefined || buf === undefined) {\n throw new Error('cannot read file without first opening')\n }\n fs.read(fd, buf, offset, length, pos, (er, bytesRead) => {\n if (er) {\n // ignoring the error from close(2) is a bad practice, but at\n // this point we already have an error, don't need another one\n return this[CLOSE](() => this.emit('error', er))\n }\n this[ONREAD](bytesRead)\n })\n }\n\n /* c8 ignore start */\n [CLOSE](\n cb: (er?: null | Error | NodeJS.ErrnoException) => unknown = () => {},\n ) {\n /* c8 ignore stop */\n if (this.fd !== undefined) fs.close(this.fd, cb)\n }\n\n [ONREAD](bytesRead: number) {\n if (bytesRead <= 0 && this.remain > 0) {\n const er = Object.assign(new Error('encountered unexpected EOF'), {\n path: this.absolute,\n syscall: 'read',\n code: 'EOF',\n })\n return this[CLOSE](() => this.emit('error', er))\n }\n\n if (bytesRead > this.remain) {\n const er = Object.assign(\n new Error('did not encounter expected EOF'),\n {\n path: this.absolute,\n syscall: 'read',\n code: 'EOF',\n },\n )\n return this[CLOSE](() => this.emit('error', er))\n }\n\n /* c8 ignore start */\n if (!this.buf) {\n throw new Error('should have created buffer prior to reading')\n }\n /* c8 ignore stop */\n\n // null out the rest of the buffer, if we could fit the block padding\n // at the end of this loop, we've incremented bytesRead and this.remain\n // to be incremented up to the blockRemain level, as if we had expected\n // to get a null-padded file, and read it until the end. then we will\n // decrement both remain and blockRemain by bytesRead, and know that we\n // reached the expected EOF, without any null buffer to append.\n if (bytesRead === this.remain) {\n for (\n let i = bytesRead;\n i < this.length && bytesRead < this.blockRemain;\n i++\n ) {\n this.buf[i + this.offset] = 0\n bytesRead++\n this.remain++\n }\n }\n\n const chunk =\n this.offset === 0 && bytesRead === this.buf.length ?\n this.buf\n : this.buf.subarray(this.offset, this.offset + bytesRead)\n\n const flushed = this.write(chunk)\n if (!flushed) {\n this[AWAITDRAIN](() => this[ONDRAIN]())\n } else {\n this[ONDRAIN]()\n }\n }\n\n [AWAITDRAIN](cb: () => unknown) {\n this.once('drain', cb)\n }\n\n write(buffer: Buffer | string, cb?: () => void): boolean\n write(\n str: Buffer | string,\n encoding?: BufferEncoding | null,\n cb?: () => void,\n ): boolean\n write(\n chunk: Buffer | string,\n encoding?: BufferEncoding | (() => unknown) | null,\n cb?: () => unknown,\n ): boolean {\n /* c8 ignore start - just junk to comply with NodeJS.WritableStream */\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(\n chunk,\n typeof encoding === 'string' ? encoding : 'utf8',\n )\n }\n /* c8 ignore stop */\n\n if (this.blockRemain < chunk.length) {\n const er = Object.assign(\n new Error('writing more data than expected'),\n {\n path: this.absolute,\n },\n )\n return this.emit('error', er)\n }\n this.remain -= chunk.length\n this.blockRemain -= chunk.length\n this.pos += chunk.length\n this.offset += chunk.length\n return super.write(chunk, null, cb)\n }\n\n [ONDRAIN]() {\n if (!this.remain) {\n if (this.blockRemain) {\n super.write(Buffer.alloc(this.blockRemain))\n }\n return this[CLOSE](er => (er ? this.emit('error', er) : this.end()))\n }\n\n /* c8 ignore start */\n if (!this.buf) {\n throw new Error('buffer lost somehow in ONDRAIN')\n }\n /* c8 ignore stop */\n\n if (this.offset >= this.length) {\n // if we only have a smaller bit left to read, alloc a smaller buffer\n // otherwise, keep it the same length it was before.\n this.buf = Buffer.allocUnsafe(\n Math.min(this.blockRemain, this.buf.length),\n )\n this.offset = 0\n }\n this.length = this.buf.length - this.offset\n this[READ]()\n }\n}\n\nexport class WriteEntrySync extends WriteEntry implements Warner {\n sync: true = true;\n\n [LSTAT]() {\n this[ONLSTAT](fs.lstatSync(this.absolute))\n }\n\n [SYMLINK]() {\n this[ONREADLINK](fs.readlinkSync(this.absolute))\n }\n\n [OPENFILE]() {\n this[ONOPENFILE](fs.openSync(this.absolute, 'r'))\n }\n\n [READ]() {\n let threw = true\n try {\n const { fd, buf, offset, length, pos } = this\n /* c8 ignore start */\n if (fd === undefined || buf === undefined) {\n throw new Error('fd and buf must be set in READ method')\n }\n /* c8 ignore stop */\n const bytesRead = fs.readSync(fd, buf, offset, length, pos)\n this[ONREAD](bytesRead)\n threw = false\n } finally {\n // ignoring the error from close(2) is a bad practice, but at\n // this point we already have an error, don't need another one\n if (threw) {\n try {\n this[CLOSE](() => {})\n } catch {}\n }\n }\n }\n\n [AWAITDRAIN](cb: () => unknown) {\n cb()\n }\n\n /* c8 ignore start */\n [CLOSE](\n cb: (er?: null | Error | NodeJS.ErrnoException) => unknown = () => {},\n ) {\n /* c8 ignore stop */\n if (this.fd !== undefined) fs.closeSync(this.fd)\n cb()\n }\n}\n\nexport class WriteEntryTar\n extends Minipass<Buffer, Buffer | string, WarnEvent>\n implements Warner\n{\n blockLen: number = 0\n blockRemain: number = 0\n buf: number = 0\n pos: number = 0\n remain: number = 0\n length: number = 0\n preservePaths: boolean\n portable: boolean\n strict: boolean\n noPax: boolean\n noMtime: boolean\n readEntry: ReadEntry\n type: EntryTypeName\n prefix?: string\n path: string\n mode?: number\n uid?: number\n gid?: number\n uname?: string\n gname?: string\n header?: Header\n mtime?: Date\n atime?: Date\n ctime?: Date\n linkpath?: string\n size: number\n onWriteEntry?: (entry: WriteEntry) => unknown\n\n warn(code: string, message: string | Error, data: WarnData = {}) {\n return warnMethod(this, code, message, data)\n }\n\n constructor(readEntry: ReadEntry, opt_: TarOptionsWithAliases = {}) {\n const opt = dealias(opt_)\n super()\n this.preservePaths = !!opt.preservePaths\n this.portable = !!opt.portable\n this.strict = !!opt.strict\n this.noPax = !!opt.noPax\n this.noMtime = !!opt.noMtime\n this.onWriteEntry = opt.onWriteEntry\n\n this.readEntry = readEntry\n const { type } = readEntry\n /* c8 ignore start */\n if (type === 'Unsupported') {\n throw new Error('writing entry that should be ignored')\n }\n /* c8 ignore stop */\n this.type = type\n if (this.type === 'Directory' && this.portable) {\n this.noMtime = true\n }\n\n this.prefix = opt.prefix\n\n this.path = normalizeWindowsPath(readEntry.path)\n this.mode =\n readEntry.mode !== undefined ? this[MODE](readEntry.mode) : undefined\n this.uid = this.portable ? undefined : readEntry.uid\n this.gid = this.portable ? undefined : readEntry.gid\n this.uname = this.portable ? undefined : readEntry.uname\n this.gname = this.portable ? undefined : readEntry.gname\n this.size = readEntry.size\n this.mtime = this.noMtime ? undefined : opt.mtime || readEntry.mtime\n this.atime = this.portable ? undefined : readEntry.atime\n this.ctime = this.portable ? undefined : readEntry.ctime\n this.linkpath =\n readEntry.linkpath !== undefined ?\n normalizeWindowsPath(readEntry.linkpath)\n : undefined\n\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n\n let pathWarn: false | string = false\n if (!this.preservePaths) {\n const [root, stripped] = stripAbsolutePath(this.path)\n if (root && typeof stripped === 'string') {\n this.path = stripped\n pathWarn = root\n }\n }\n\n this.remain = readEntry.size\n this.blockRemain = readEntry.startBlockSize\n\n this.onWriteEntry?.(this as unknown as WriteEntry)\n this.header = new Header({\n path: this[PREFIX](this.path),\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n // only the permissions and setuid/setgid/sticky bitflags\n // not the higher-order bits that specify file type\n mode: this.mode,\n uid: this.portable ? undefined : this.uid,\n gid: this.portable ? undefined : this.gid,\n size: this.size,\n mtime: this.noMtime ? undefined : this.mtime,\n type: this.type,\n uname: this.portable ? undefined : this.uname,\n atime: this.portable ? undefined : this.atime,\n ctime: this.portable ? undefined : this.ctime,\n })\n\n if (pathWarn) {\n this.warn(\n 'TAR_ENTRY_INFO',\n `stripping ${pathWarn} from absolute path`,\n {\n entry: this,\n path: pathWarn + this.path,\n },\n )\n }\n\n if (this.header.encode() && !this.noPax) {\n super.write(\n new Pax({\n atime: this.portable ? undefined : this.atime,\n ctime: this.portable ? undefined : this.ctime,\n gid: this.portable ? undefined : this.gid,\n mtime: this.noMtime ? undefined : this.mtime,\n path: this[PREFIX](this.path),\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n size: this.size,\n uid: this.portable ? undefined : this.uid,\n uname: this.portable ? undefined : this.uname,\n dev: this.portable ? undefined : this.readEntry.dev,\n ino: this.portable ? undefined : this.readEntry.ino,\n nlink: this.portable ? undefined : this.readEntry.nlink,\n }).encode(),\n )\n }\n\n const b = this.header?.block\n /* c8 ignore start */\n if (!b) throw new Error('failed to encode header')\n /* c8 ignore stop */\n super.write(b)\n readEntry.pipe(this)\n }\n\n [PREFIX](path: string) {\n return prefixPath(path, this.prefix)\n }\n\n [MODE](mode: number) {\n return modeFix(mode, this.type === 'Directory', this.portable)\n }\n\n write(buffer: Buffer | string, cb?: () => void): boolean\n write(\n str: Buffer | string,\n encoding?: BufferEncoding | null,\n cb?: () => void,\n ): boolean\n write(\n chunk: Buffer | string,\n encoding?: BufferEncoding | (() => unknown) | null,\n cb?: () => unknown,\n ): boolean {\n /* c8 ignore start - just junk to comply with NodeJS.WritableStream */\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(\n chunk,\n typeof encoding === 'string' ? encoding : 'utf8',\n )\n }\n /* c8 ignore stop */\n const writeLen = chunk.length\n if (writeLen > this.blockRemain) {\n throw new Error('writing more to entry than is appropriate')\n }\n this.blockRemain -= writeLen\n return super.write(chunk, cb)\n }\n\n end(cb?: () => void): this\n end(chunk: Buffer | string, cb?: () => void): this\n end(\n chunk: Buffer | string,\n encoding?: BufferEncoding,\n cb?: () => void,\n ): this\n end(\n chunk?: Buffer | string | (() => void),\n encoding?: BufferEncoding | (() => void),\n cb?: () => void,\n ): this {\n if (this.blockRemain) {\n super.write(Buffer.alloc(this.blockRemain))\n }\n /* c8 ignore start - just junk to comply with NodeJS.WritableStream */\n if (typeof chunk === 'function') {\n cb = chunk\n encoding = undefined\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding ?? 'utf8')\n }\n if (cb) this.once('finish', cb)\n if (chunk) super.end(chunk, cb)\n else super.end(cb)\n /* c8 ignore stop */\n return this\n }\n}\n\nconst getType = (stat: Stats): EntryTypeName | 'Unsupported' =>\n stat.isFile() ? 'File'\n : stat.isDirectory() ? 'Directory'\n : stat.isSymbolicLink() ? 'SymbolicLink'\n : 'Unsupported'\n","export const modeFix = (\n mode: number,\n isDir: boolean,\n portable: boolean,\n) => {\n mode &= 0o7777\n\n // in portable mode, use the minimum reasonable umask\n // if this system creates files with 0o664 by default\n // (as some linux distros do), then we'll write the\n // archive with 0o644 instead. Also, don't ever create\n // a file that is not readable/writable by the owner.\n if (portable) {\n mode = (mode | 0o600) & ~0o22\n }\n\n // if dirs are readable, then they should be listable\n if (isDir) {\n if (mode & 0o400) {\n mode |= 0o100\n }\n if (mode & 0o40) {\n mode |= 0o10\n }\n if (mode & 0o4) {\n mode |= 0o1\n }\n }\n return mode\n}\n","// unix absolute paths are also absolute on win32, so we use this for both\nimport { win32 } from 'node:path'\nconst { isAbsolute, parse } = win32\n\n// returns [root, stripped]\n// Note that windows will think that //x/y/z/a has a \"root\" of //x/y, and in\n// those cases, we want to sanitize it to x/y/z/a, not z/a, so we strip /\n// explicitly if it's the first character.\n// drive-specific relative paths on Windows get their root stripped off even\n// though they are not absolute, so `c:../foo` becomes ['c:', '../foo']\nexport const stripAbsolutePath = (path: string): [string, string] => {\n let r = ''\n\n let parsed = parse(path)\n while (isAbsolute(path) || parsed.root) {\n // windows will think that //x/y/z has a \"root\" of //x/y/\n // but strip the //?/C:/ off of //?/C:/path\n const root =\n path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ?\n '/'\n : parsed.root\n path = path.slice(root.length)\n r += root\n parsed = parse(path)\n }\n return [r, path]\n}\n","// When writing files on Windows, translate the characters to their\n// 0xf000 higher-encoded versions.\n\nconst raw = ['|', '<', '>', '?', ':']\n\nconst win = raw.map(char =>\n String.fromCodePoint(0xf000 + Number(char.codePointAt(0))),\n)\n\nconst toWin = new Map(raw.map((char, i) => [char, win[i]]))\nconst toRaw = new Map(win.map((char, i) => [char, raw[i]]))\n\nexport const encode = (s: string) =>\n raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s)\nexport const decode = (s: string) =>\n win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s)\n","export class Yallist<T = unknown> {\n tail?: Node<T>\n head?: Node<T>\n length: number = 0\n\n static create<T = unknown>(list: Iterable<T> = []) {\n return new Yallist(list)\n }\n\n constructor(list: Iterable<T> = []) {\n for (const item of list) {\n this.push(item)\n }\n }\n\n *[Symbol.iterator]() {\n for (let walker = this.head; walker; walker = walker.next) {\n yield walker.value\n }\n }\n\n removeNode(node: Node<T>) {\n if (node.list !== this) {\n throw new Error(\n 'removing node which does not belong to this list',\n )\n }\n\n const next = node.next\n const prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n this.length--\n node.next = undefined\n node.prev = undefined\n node.list = undefined\n\n return next\n }\n\n unshiftNode(node: Node<T>) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n const head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length++\n }\n\n pushNode(node: Node<T>) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n const tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length++\n }\n\n push(...args: T[]) {\n for (let i = 0, l = args.length; i < l; i++) {\n push(this, args[i])\n }\n return this.length\n }\n\n unshift(...args: T[]) {\n for (var i = 0, l = args.length; i < l; i++) {\n unshift(this, args[i])\n }\n return this.length\n }\n\n pop() {\n if (!this.tail) {\n return undefined\n }\n\n const res = this.tail.value\n const t = this.tail\n this.tail = this.tail.prev\n if (this.tail) {\n this.tail.next = undefined\n } else {\n this.head = undefined\n }\n t.list = undefined\n this.length--\n return res\n }\n\n shift() {\n if (!this.head) {\n return undefined\n }\n\n const res = this.head.value\n const h = this.head\n this.head = this.head.next\n if (this.head) {\n this.head.prev = undefined\n } else {\n this.tail = undefined\n }\n h.list = undefined\n this.length--\n return res\n }\n\n forEach(\n fn: (value: T, i: number, list: Yallist<T>) => any,\n thisp?: any,\n ) {\n thisp = thisp || this\n for (let walker = this.head, i = 0; !!walker; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n }\n\n forEachReverse(\n fn: (value: T, i: number, list: Yallist<T>) => any,\n thisp?: any,\n ) {\n thisp = thisp || this\n for (let walker = this.tail, i = this.length - 1; !!walker; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n }\n\n get(n: number) {\n let i = 0\n let walker = this.head\n for (; !!walker && i < n; i++) {\n walker = walker.next\n }\n if (i === n && !!walker) {\n return walker.value\n }\n }\n\n getReverse(n: number) {\n let i = 0\n let walker = this.tail\n for (; !!walker && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && !!walker) {\n return walker.value\n }\n }\n\n map<R = any>(\n fn: (value: T, list: Yallist<T>) => R,\n thisp?: any,\n ): Yallist<R> {\n thisp = thisp || this\n const res = new Yallist<R>()\n for (let walker = this.head; !!walker; ) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n }\n\n mapReverse<R = any>(\n fn: (value: T, list: Yallist<T>) => R,\n thisp?: any,\n ): Yallist<R> {\n thisp = thisp || this\n var res = new Yallist<R>()\n for (let walker = this.tail; !!walker; ) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n }\n\n reduce(fn: (left: T, right: T, i: number) => T): T\n reduce<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial: R,\n ): R\n reduce<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial?: R,\n ): R {\n let acc: R | T\n let walker = this.head\n if (arguments.length > 1) {\n acc = initial as R\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError(\n 'Reduce of empty list with no initial value',\n )\n }\n\n for (var i = 0; !!walker; i++) {\n acc = fn(acc as R, walker.value, i)\n walker = walker.next\n }\n\n return acc as R\n }\n\n reduceReverse(fn: (left: T, right: T, i: number) => T): T\n reduceReverse<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial: R,\n ): R\n reduceReverse<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial?: R,\n ): R {\n let acc: R | T\n let walker = this.tail\n if (arguments.length > 1) {\n acc = initial as R\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError(\n 'Reduce of empty list with no initial value',\n )\n }\n\n for (let i = this.length - 1; !!walker; i--) {\n acc = fn(acc as R, walker.value, i)\n walker = walker.prev\n }\n\n return acc as R\n }\n\n toArray() {\n const arr = new Array(this.length)\n for (let i = 0, walker = this.head; !!walker; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n }\n\n toArrayReverse() {\n const arr = new Array(this.length)\n for (let i = 0, walker = this.tail; !!walker; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n }\n\n slice(from: number = 0, to: number = this.length) {\n if (to < 0) {\n to += this.length\n }\n if (from < 0) {\n from += this.length\n }\n const ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n let walker = this.head\n let i = 0\n for (i = 0; !!walker && i < from; i++) {\n walker = walker.next\n }\n for (; !!walker && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n }\n\n sliceReverse(from: number = 0, to: number = this.length) {\n if (to < 0) {\n to += this.length\n }\n if (from < 0) {\n from += this.length\n }\n const ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n let i = this.length\n let walker = this.tail\n for (; !!walker && i > to; i--) {\n walker = walker.prev\n }\n for (; !!walker && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n }\n\n splice(start: number, deleteCount: number = 0, ...nodes: T[]) {\n if (start > this.length) {\n start = this.length - 1\n }\n if (start < 0) {\n start = this.length + start\n }\n\n let walker = this.head\n\n for (let i = 0; !!walker && i < start; i++) {\n walker = walker.next\n }\n\n const ret: T[] = []\n for (let i = 0; !!walker && i < deleteCount; i++) {\n ret.push(walker.value)\n walker = this.removeNode(walker)\n }\n if (!walker) {\n walker = this.tail\n } else if (walker !== this.tail) {\n walker = walker.prev\n }\n\n for (const v of nodes) {\n walker = insertAfter<T>(this, walker, v)\n }\n\n return ret\n }\n\n reverse() {\n const head = this.head\n const tail = this.tail\n for (let walker = head; !!walker; walker = walker.prev) {\n const p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n }\n}\n\n// insertAfter undefined means \"make the node the new head of list\"\nfunction insertAfter<T>(\n self: Yallist<T>,\n node: Node<T> | undefined,\n value: T,\n) {\n const prev = node\n const next = node ? node.next : self.head\n const inserted = new Node<T>(value, prev, next, self)\n\n if (inserted.next === undefined) {\n self.tail = inserted\n }\n if (inserted.prev === undefined) {\n self.head = inserted\n }\n\n self.length++\n\n return inserted\n}\n\nfunction push<T>(self: Yallist<T>, item: T) {\n self.tail = new Node<T>(item, self.tail, undefined, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length++\n}\n\nfunction unshift<T>(self: Yallist<T>, item: T) {\n self.head = new Node<T>(item, undefined, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length++\n}\n\nexport class Node<T = unknown> {\n list?: Yallist<T>\n next?: Node<T>\n prev?: Node<T>\n value: T\n\n constructor(\n value: T,\n prev?: Node<T> | undefined,\n next?: Node<T> | undefined,\n list?: Yallist<T> | undefined,\n ) {\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = undefined\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = undefined\n }\n }\n}\n","// tar -x\nimport * as fsm from '@isaacs/fs-minipass'\nimport fs from 'node:fs'\nimport { filesFilter } from './list.js'\nimport { makeCommand } from './make-command.js'\nimport type { TarOptionsFile, TarOptionsSyncFile } from './options.js'\nimport { Unpack, UnpackSync } from './unpack.js'\n\nconst extractFileSync = (opt: TarOptionsSyncFile) => {\n const u = new UnpackSync(opt)\n const file = opt.file\n const stat = fs.statSync(file)\n // This trades a zero-byte read() syscall for a stat\n // However, it will usually result in less memory allocation\n const readSize = opt.maxReadSize || 16 * 1024 * 1024\n const stream = new fsm.ReadStreamSync(file, {\n readSize: readSize,\n size: stat.size,\n })\n stream.pipe(u)\n}\n\nconst extractFile = (opt: TarOptionsFile, _?: string[]) => {\n const u = new Unpack(opt)\n const readSize = opt.maxReadSize || 16 * 1024 * 1024\n\n const file = opt.file\n const p = new Promise<void>((resolve, reject) => {\n u.on('error', reject)\n u.on('close', resolve)\n\n // This trades a zero-byte read() syscall for a stat\n // However, it will usually result in less memory allocation\n fs.stat(file, (er, stat) => {\n if (er) {\n reject(er)\n } else {\n const stream = new fsm.ReadStream(file, {\n readSize: readSize,\n size: stat.size,\n })\n stream.on('error', reject)\n stream.pipe(u)\n }\n })\n })\n return p\n}\n\nexport const extract = makeCommand<Unpack, UnpackSync>(\n extractFileSync,\n extractFile,\n opt => new UnpackSync(opt),\n opt => new Unpack(opt),\n (opt, files) => {\n if (files?.length) filesFilter(opt, files)\n },\n)\n","// the PEND/UNPEND stuff tracks whether we're ready to emit end/close yet.\n// but the path reservations are required to avoid race conditions where\n// parallelized unpack ops may mess with one another, due to dependencies\n// (like a Link depending on its target) or destructive operations (like\n// clobbering an fs object to create one of a different type.)\n\nimport * as fsm from '@isaacs/fs-minipass'\nimport assert from 'node:assert'\nimport { randomBytes } from 'node:crypto'\nimport fs, { type Stats } from 'node:fs'\nimport path from 'node:path'\nimport { getWriteFlag } from './get-write-flag.js'\nimport type { MkdirError } from './mkdir.js'\nimport { mkdir, mkdirSync } from './mkdir.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport { Parser } from './parse.js'\nimport { stripAbsolutePath } from './strip-absolute-path.js'\nimport * as wc from './winchars.js'\n\nimport type { TarOptions } from './options.js'\nimport { PathReservations } from './path-reservations.js'\nimport type { ReadEntry } from './read-entry.js'\nimport type { WarnData } from './warn-method.js'\nimport { SymlinkError } from './symlink-error.js'\nimport { umask } from './process-umask.js'\n\nconst ONENTRY = Symbol('onEntry')\nconst CHECKFS = Symbol('checkFs')\nconst CHECKFS2 = Symbol('checkFs2')\nconst ISREUSABLE = Symbol('isReusable')\nconst MAKEFS = Symbol('makeFs')\nconst FILE = Symbol('file')\nconst DIRECTORY = Symbol('directory')\nconst LINK = Symbol('link')\nconst SYMLINK = Symbol('symlink')\nconst HARDLINK = Symbol('hardlink')\nconst ENSURE_NO_SYMLINK = Symbol('ensureNoSymlink')\nconst UNSUPPORTED = Symbol('unsupported')\nconst CHECKPATH = Symbol('checkPath')\nconst STRIPABSOLUTEPATH = Symbol('stripAbsolutePath')\nconst MKDIR = Symbol('mkdir')\nconst ONERROR = Symbol('onError')\nconst PENDING = Symbol('pending')\nconst PEND = Symbol('pend')\nconst UNPEND = Symbol('unpend')\nconst ENDED = Symbol('ended')\nconst MAYBECLOSE = Symbol('maybeClose')\nconst SKIP = Symbol('skip')\nconst DOCHOWN = Symbol('doChown')\nconst UID = Symbol('uid')\nconst GID = Symbol('gid')\nconst CHECKED_CWD = Symbol('checkedCwd')\nconst platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform\nconst isWindows = platform === 'win32'\nconst DEFAULT_MAX_DEPTH = 1024\n\n// Unlinks on Windows are not atomic.\n//\n// This means that if you have a file entry, followed by another\n// file entry with an identical name, and you cannot re-use the file\n// (because it's a hardlink, or because unlink:true is set, or it's\n// Windows, which does not have useful nlink values), then the unlink\n// will be committed to the disk AFTER the new file has been written\n// over the old one, deleting the new file.\n//\n// To work around this, on Windows systems, we rename the file and then\n// delete the renamed file. It's a sloppy kludge, but frankly, I do not\n// know of a better way to do this, given windows' non-atomic unlink\n// semantics.\n//\n// See: https://github.com/npm/node-tar/issues/183\n/* c8 ignore start */\nconst unlinkFile = (path: string, cb: (er?: Error | null) => void) => {\n if (!isWindows) {\n return fs.unlink(path, cb)\n }\n\n const name = path + '.DELETE.' + randomBytes(16).toString('hex')\n fs.rename(path, name, er => {\n if (er) {\n return cb(er)\n }\n fs.unlink(name, cb)\n })\n}\n/* c8 ignore stop */\n\n/* c8 ignore start */\nconst unlinkFileSync = (path: string) => {\n if (!isWindows) {\n return fs.unlinkSync(path)\n }\n\n const name = path + '.DELETE.' + randomBytes(16).toString('hex')\n fs.renameSync(path, name)\n fs.unlinkSync(name)\n}\n/* c8 ignore stop */\n\n// this.gid, entry.gid, this.processUid\nconst uint32 = (\n a: number | undefined,\n b: number | undefined,\n c: number | undefined,\n) =>\n a !== undefined && a === a >>> 0 ? a\n : b !== undefined && b === b >>> 0 ? b\n : c\n\nexport class Unpack extends Parser {\n [ENDED]: boolean = false;\n [CHECKED_CWD]: boolean = false;\n [PENDING]: number = 0\n\n reservations: PathReservations = new PathReservations()\n transform?: TarOptions['transform']\n writable: true = true\n readable: false = false\n uid?: number\n gid?: number\n setOwner: boolean\n preserveOwner: boolean\n processGid?: number\n processUid?: number\n maxDepth: number\n forceChown: boolean\n win32: boolean\n newer: boolean\n keep: boolean\n noMtime: boolean\n preservePaths: boolean\n unlink: boolean\n cwd: string\n strip: number\n processUmask: number\n umask: number\n dmode: number\n fmode: number\n chmod: boolean\n\n constructor(opt: TarOptions = {}) {\n opt.ondone = () => {\n this[ENDED] = true\n this[MAYBECLOSE]()\n }\n\n super(opt)\n\n this.transform = opt.transform\n\n this.chmod = !!opt.chmod\n\n if (typeof opt.uid === 'number' || typeof opt.gid === 'number') {\n // need both or neither\n if (typeof opt.uid !== 'number' || typeof opt.gid !== 'number') {\n throw new TypeError('cannot set owner without number uid and gid')\n }\n if (opt.preserveOwner) {\n throw new TypeError(\n 'cannot preserve owner in archive and also set owner explicitly',\n )\n }\n this.uid = opt.uid\n this.gid = opt.gid\n this.setOwner = true\n } else {\n this.uid = undefined\n this.gid = undefined\n this.setOwner = false\n }\n\n // default true for root\n this.preserveOwner =\n opt.preserveOwner === undefined && typeof opt.uid !== 'number' ?\n !!(process.getuid && process.getuid() === 0)\n : !!opt.preserveOwner\n\n this.processUid =\n (this.preserveOwner || this.setOwner) && process.getuid ?\n process.getuid()\n : undefined\n this.processGid =\n (this.preserveOwner || this.setOwner) && process.getgid ?\n process.getgid()\n : undefined\n\n // prevent excessively deep nesting of subfolders\n // set to `Infinity` to remove this restriction\n this.maxDepth =\n typeof opt.maxDepth === 'number' ? opt.maxDepth : DEFAULT_MAX_DEPTH\n\n // mostly just for testing, but useful in some cases.\n // Forcibly trigger a chown on every entry, no matter what\n this.forceChown = opt.forceChown === true\n\n // turn ><?| in filenames into 0xf000-higher encoded forms\n this.win32 = !!opt.win32 || isWindows\n\n // do not unpack over files that are newer than what's in the archive\n this.newer = !!opt.newer\n\n // do not unpack over ANY files\n this.keep = !!opt.keep\n\n // do not set mtime/atime of extracted entries\n this.noMtime = !!opt.noMtime\n\n // allow .., absolute path entries, and unpacking through symlinks\n // without this, warn and skip .., relativize absolutes, and error\n // on symlinks in extraction path\n this.preservePaths = !!opt.preservePaths\n\n // unlink files and links before writing. This breaks existing hard\n // links, and removes symlink directories rather than erroring\n this.unlink = !!opt.unlink\n\n this.cwd = normalizeWindowsPath(path.resolve(opt.cwd || process.cwd()))\n this.strip = Number(opt.strip) || 0\n // if we're not chmodding, then we don't need the process umask\n this.processUmask =\n !this.chmod ? 0\n : typeof opt.processUmask === 'number' ? opt.processUmask\n : umask()\n this.umask =\n typeof opt.umask === 'number' ? opt.umask : this.processUmask\n\n // default mode for dirs created as parents\n this.dmode = opt.dmode || 0o0777 & ~this.umask\n this.fmode = opt.fmode || 0o0666 & ~this.umask\n\n this.on('entry', entry => this[ONENTRY](entry))\n }\n\n // a bad or damaged archive is a warning for Parser, but an error\n // when extracting. Mark those errors as unrecoverable, because\n // the Unpack contract cannot be met.\n warn(code: string, msg: string | Error, data: WarnData = {}) {\n if (code === 'TAR_BAD_ARCHIVE' || code === 'TAR_ABORT') {\n data.recoverable = false\n }\n return super.warn(code, msg, data)\n }\n\n [MAYBECLOSE]() {\n if (this[ENDED] && this[PENDING] === 0) {\n this.emit('prefinish')\n this.emit('finish')\n this.emit('end')\n }\n }\n\n // return false if we need to skip this file\n // return true if the field was successfully sanitized\n [STRIPABSOLUTEPATH](\n entry: ReadEntry,\n field: 'path' | 'linkpath',\n ): boolean {\n const p = entry[field]\n const { type } = entry\n if (!p || this.preservePaths) return true\n\n // strip off the root\n const [root, stripped] = stripAbsolutePath(p)\n const parts = stripped.replaceAll(/\\\\/g, '/').split('/')\n\n if (\n parts.includes('..') ||\n /* c8 ignore next */\n (isWindows && /^[a-z]:\\.\\.$/i.test(parts[0] ?? ''))\n ) {\n // For linkpath, check if the resolved path escapes cwd rather than\n // just rejecting any path with '..' - relative symlinks like\n // '../sibling/file' are valid if they resolve within the cwd.\n // For paths, they just simply may not ever use .. at all.\n if (field === 'path' || type === 'Link') {\n this.warn('TAR_ENTRY_ERROR', `${field} contains '..'`, {\n entry,\n [field]: p,\n })\n // not ok!\n return false\n }\n // Resolve linkpath relative to the entry's directory.\n // `path.posix` is safe to use because we're operating on\n // tar paths, not a filesystem.\n const entryDir = path.posix.dirname(entry.path)\n const resolved = path.posix.normalize(\n path.posix.join(entryDir, parts.join('/')),\n )\n // If the resolved path escapes (starts with ..), reject it\n if (resolved.startsWith('../') || resolved === '..') {\n this.warn(\n 'TAR_ENTRY_ERROR',\n `${field} escapes extraction directory`,\n {\n entry,\n [field]: p,\n },\n )\n return false\n }\n }\n\n if (root) {\n // ok, but triggers warning about stripping root\n entry[field] = String(stripped)\n this.warn(\n 'TAR_ENTRY_INFO',\n `stripping ${root} from absolute ${field}`,\n {\n entry,\n [field]: p,\n },\n )\n }\n return true\n }\n\n // no IO, just string checking for absolute indicators\n [CHECKPATH](entry: ReadEntry) {\n const p = normalizeWindowsPath(entry.path)\n const parts = p.split('/')\n\n if (this.strip) {\n if (parts.length < this.strip) {\n return false\n }\n if (entry.type === 'Link') {\n const linkparts = normalizeWindowsPath(\n String(entry.linkpath),\n ).split('/')\n if (linkparts.length >= this.strip) {\n entry.linkpath = linkparts.slice(this.strip).join('/')\n } else {\n return false\n }\n }\n parts.splice(0, this.strip)\n entry.path = parts.join('/')\n }\n\n if (isFinite(this.maxDepth) && parts.length > this.maxDepth) {\n this.warn('TAR_ENTRY_ERROR', 'path excessively deep', {\n entry,\n path: p,\n depth: parts.length,\n maxDepth: this.maxDepth,\n })\n return false\n }\n\n if (\n !this[STRIPABSOLUTEPATH](entry, 'path') ||\n !this[STRIPABSOLUTEPATH](entry, 'linkpath')\n ) {\n return false\n }\n\n entry.absolute =\n path.isAbsolute(entry.path) ?\n normalizeWindowsPath(path.resolve(entry.path))\n : normalizeWindowsPath(path.resolve(this.cwd, entry.path))\n\n // if we somehow ended up with a path that escapes the cwd, and we are\n // not in preservePaths mode, then something is fishy! This should have\n // been prevented above, so ignore this for coverage.\n /* c8 ignore start - defense in depth */\n if (\n !this.preservePaths &&\n typeof entry.absolute === 'string' &&\n entry.absolute.indexOf(this.cwd + '/') !== 0 &&\n entry.absolute !== this.cwd\n ) {\n this.warn('TAR_ENTRY_ERROR', 'path escaped extraction target', {\n entry,\n path: normalizeWindowsPath(entry.path),\n resolvedPath: entry.absolute,\n cwd: this.cwd,\n })\n return false\n }\n /* c8 ignore stop */\n\n // an archive can set properties on the extraction directory, but it\n // may not replace the cwd with a different kind of thing entirely.\n if (\n entry.absolute === this.cwd &&\n entry.type !== 'Directory' &&\n entry.type !== 'GNUDumpDir'\n ) {\n return false\n }\n\n // only encode : chars that aren't drive letter indicators\n if (this.win32) {\n const { root: aRoot } = path.win32.parse(String(entry.absolute))\n entry.absolute =\n aRoot + wc.encode(String(entry.absolute).slice(aRoot.length))\n const { root: pRoot } = path.win32.parse(entry.path)\n entry.path = pRoot + wc.encode(entry.path.slice(pRoot.length))\n }\n\n return true\n }\n\n [ONENTRY](entry: ReadEntry) {\n if (!this[CHECKPATH](entry)) {\n return entry.resume()\n }\n\n assert.equal(typeof entry.absolute, 'string')\n\n switch (entry.type) {\n case 'Directory':\n case 'GNUDumpDir':\n if (entry.mode) {\n entry.mode = entry.mode | 0o700\n }\n\n // eslint-disable-next-line no-fallthrough\n case 'File':\n case 'OldFile':\n case 'ContiguousFile':\n case 'Link':\n case 'SymbolicLink':\n return this[CHECKFS](entry)\n\n case 'CharacterDevice':\n case 'BlockDevice':\n case 'FIFO':\n default:\n return this[UNSUPPORTED](entry)\n }\n }\n\n [ONERROR](er: Error, entry: ReadEntry) {\n // Cwd has to exist, or else nothing works. That's serious.\n // Other errors are warnings, which raise the error in strict\n // mode, but otherwise continue on.\n if (er.name === 'CwdError') {\n this.emit('error', er)\n } else {\n this.warn('TAR_ENTRY_ERROR', er, { entry })\n this[UNPEND]()\n entry.resume()\n }\n }\n\n [MKDIR](\n dir: string,\n mode: number,\n cb: (er?: null | MkdirError, made?: string) => void,\n ) {\n mkdir(\n normalizeWindowsPath(dir),\n {\n uid: this.uid,\n gid: this.gid,\n processUid: this.processUid,\n processGid: this.processGid,\n umask: this.processUmask,\n preserve: this.preservePaths,\n unlink: this.unlink,\n cwd: this.cwd,\n mode: mode,\n },\n cb,\n )\n }\n\n [DOCHOWN](entry: ReadEntry) {\n // in preserve owner mode, chown if the entry doesn't match process\n // in set owner mode, chown if setting doesn't match process\n return (\n this.forceChown ||\n (this.preserveOwner &&\n ((typeof entry.uid === 'number' &&\n entry.uid !== this.processUid) ||\n (typeof entry.gid === 'number' &&\n entry.gid !== this.processGid))) ||\n (typeof this.uid === 'number' && this.uid !== this.processUid) ||\n (typeof this.gid === 'number' && this.gid !== this.processGid)\n )\n }\n\n [UID](entry: ReadEntry) {\n return uint32(this.uid, entry.uid, this.processUid)\n }\n\n [GID](entry: ReadEntry) {\n return uint32(this.gid, entry.gid, this.processGid)\n }\n\n [FILE](entry: ReadEntry, fullyDone: () => void) {\n const mode =\n typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.fmode\n const stream = new fsm.WriteStream(String(entry.absolute), {\n // slight lie, but it can be numeric flags\n flags: getWriteFlag(entry.size) as string,\n mode: mode,\n autoClose: false,\n })\n stream.on('error', (er: Error) => {\n if (stream.fd) {\n fs.close(stream.fd, () => {})\n }\n\n // flush all the data out so that we aren't left hanging\n // if the error wasn't actually fatal. otherwise the parse\n // is blocked, and we never proceed.\n stream.write = () => true\n this[ONERROR](er, entry)\n fullyDone()\n })\n\n let actions = 1\n const done = (er?: null | Error) => {\n if (er) {\n /* c8 ignore start - we should always have a fd by now */\n if (stream.fd) {\n fs.close(stream.fd, () => {})\n }\n /* c8 ignore stop */\n\n this[ONERROR](er, entry)\n fullyDone()\n return\n }\n\n if (--actions === 0) {\n if (stream.fd !== undefined) {\n fs.close(stream.fd, er => {\n if (er) {\n this[ONERROR](er, entry)\n } else {\n this[UNPEND]()\n }\n fullyDone()\n })\n }\n }\n }\n\n stream.on('finish', () => {\n // if futimes fails, try utimes\n // if utimes fails, fail with the original error\n // same for fchown/chown\n const abs = String(entry.absolute)\n const fd = stream.fd\n\n if (typeof fd === 'number' && entry.mtime && !this.noMtime) {\n actions++\n const atime = entry.atime || new Date()\n const mtime = entry.mtime\n fs.futimes(fd, atime, mtime, er =>\n er ?\n fs.utimes(abs, atime, mtime, er2 => done(er2 && er))\n : done(),\n )\n }\n\n if (typeof fd === 'number' && this[DOCHOWN](entry)) {\n actions++\n const uid = this[UID](entry)\n const gid = this[GID](entry)\n if (typeof uid === 'number' && typeof gid === 'number') {\n fs.fchown(fd, uid, gid, er =>\n er ? fs.chown(abs, uid, gid, er2 => done(er2 && er)) : done(),\n )\n }\n }\n\n done()\n })\n\n const tx = this.transform ? this.transform(entry) || entry : entry\n if (tx !== entry) {\n tx.on('error', er => {\n this[ONERROR](er as Error, entry)\n fullyDone()\n })\n entry.pipe(tx)\n }\n tx.pipe(stream)\n }\n\n [DIRECTORY](entry: ReadEntry, fullyDone: () => void) {\n const mode =\n typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.dmode\n this[MKDIR](String(entry.absolute), mode, er => {\n if (er) {\n this[ONERROR](er, entry)\n fullyDone()\n return\n }\n\n let actions = 1\n const done = () => {\n if (--actions === 0) {\n fullyDone()\n this[UNPEND]()\n entry.resume()\n }\n }\n\n if (entry.mtime && !this.noMtime) {\n actions++\n fs.utimes(\n String(entry.absolute),\n entry.atime || new Date(),\n entry.mtime,\n done,\n )\n }\n\n if (this[DOCHOWN](entry)) {\n actions++\n fs.chown(\n String(entry.absolute),\n Number(this[UID](entry)),\n Number(this[GID](entry)),\n done,\n )\n }\n\n done()\n })\n }\n\n [UNSUPPORTED](entry: ReadEntry) {\n entry.unsupported = true\n this.warn(\n 'TAR_ENTRY_UNSUPPORTED',\n `unsupported entry type: ${entry.type}`,\n { entry },\n )\n entry.resume()\n }\n\n [SYMLINK](entry: ReadEntry, done: () => void) {\n const parts = normalizeWindowsPath(\n path.relative(\n this.cwd,\n path.resolve(\n path.dirname(String(entry.absolute)),\n String(entry.linkpath),\n ),\n ),\n ).split('/')\n this[ENSURE_NO_SYMLINK](\n entry,\n this.cwd,\n parts,\n () => this[LINK](entry, String(entry.linkpath), 'symlink', done),\n er => {\n this[ONERROR](er, entry)\n done()\n },\n )\n }\n\n [HARDLINK](entry: ReadEntry, done: () => void) {\n const linkpath = normalizeWindowsPath(\n path.resolve(this.cwd, String(entry.linkpath)),\n )\n const parts = normalizeWindowsPath(String(entry.linkpath)).split('/')\n this[ENSURE_NO_SYMLINK](\n entry,\n this.cwd,\n parts,\n () => this[LINK](entry, linkpath, 'link', done),\n er => {\n this[ONERROR](er, entry)\n done()\n },\n )\n }\n\n [ENSURE_NO_SYMLINK](\n entry: ReadEntry,\n cwd: string,\n parts: string[],\n done: () => void,\n onError: (er: SymlinkError) => void,\n ) {\n const p = parts.shift()\n if (this.preservePaths || p === undefined) return done()\n const t = path.resolve(cwd, p)\n fs.lstat(t, (er, st) => {\n if (er) return done()\n if (st?.isSymbolicLink()) {\n return onError(\n new SymlinkError(t, path.resolve(t, parts.join('/'))),\n )\n }\n this[ENSURE_NO_SYMLINK](entry, t, parts, done, onError)\n })\n }\n\n [PEND]() {\n this[PENDING]++\n }\n\n [UNPEND]() {\n this[PENDING]--\n this[MAYBECLOSE]()\n }\n\n [SKIP](entry: ReadEntry) {\n this[UNPEND]()\n entry.resume()\n }\n\n // Check if we can reuse an existing filesystem entry safely and\n // overwrite it, rather than unlinking and recreating\n // Windows doesn't report a useful nlink, so we just never reuse entries\n [ISREUSABLE](entry: ReadEntry, st: Stats) {\n return (\n entry.type === 'File' &&\n !this.unlink &&\n st.isFile() &&\n st.nlink <= 1 &&\n !isWindows\n )\n }\n\n // check if a thing is there, and if so, try to clobber it\n [CHECKFS](entry: ReadEntry) {\n this[PEND]()\n const paths = [entry.path]\n if (entry.linkpath) {\n paths.push(entry.linkpath)\n }\n this.reservations.reserve(paths, done => this[CHECKFS2](entry, done))\n }\n\n [CHECKFS2](entry: ReadEntry, fullyDone: (er?: Error) => void) {\n const done = (er?: Error) => {\n fullyDone(er)\n }\n\n const checkCwd = () => {\n this[MKDIR](this.cwd, this.dmode, er => {\n if (er) {\n this[ONERROR](er, entry)\n done()\n return\n }\n this[CHECKED_CWD] = true\n start()\n })\n }\n\n const start = () => {\n if (entry.absolute !== this.cwd) {\n const parent = normalizeWindowsPath(\n path.dirname(String(entry.absolute)),\n )\n if (parent !== this.cwd) {\n return this[MKDIR](parent, this.dmode, er => {\n if (er) {\n this[ONERROR](er, entry)\n done()\n return\n }\n afterMakeParent()\n })\n }\n }\n afterMakeParent()\n }\n\n const afterMakeParent = () => {\n fs.lstat(String(entry.absolute), (lstatEr, st) => {\n if (\n st &&\n (this.keep ||\n /* c8 ignore next */\n (this.newer && st.mtime > (entry.mtime ?? st.mtime)))\n ) {\n this[SKIP](entry)\n done()\n return\n }\n if (lstatEr || this[ISREUSABLE](entry, st)) {\n return this[MAKEFS](null, entry, done)\n }\n\n if (st.isDirectory()) {\n if (entry.type === 'Directory') {\n const needChmod =\n this.chmod && entry.mode && (st.mode & 0o7777) !== entry.mode\n const afterChmod = (er?: Error | null | undefined) =>\n this[MAKEFS](er ?? null, entry, done)\n if (!needChmod) {\n return afterChmod()\n }\n return fs.chmod(\n String(entry.absolute),\n Number(entry.mode),\n afterChmod,\n )\n }\n // Not a dir entry, have to remove it.\n // NB: the only way to end up with an entry that is the cwd\n // itself, in such a way that == does not detect, is a\n // tricky windows absolute path with UNC or 8.3 parts (and\n // preservePaths:true, or else it will have been stripped).\n // In that case, the user has opted out of path protections\n // explicitly, so if they blow away the cwd, c'est la vie.\n if (entry.absolute !== this.cwd) {\n return fs.rmdir(String(entry.absolute), (er?: null | Error) =>\n this[MAKEFS](er ?? null, entry, done),\n )\n }\n }\n\n // not a dir, and not reusable\n // don't remove if the cwd, we want that error\n if (entry.absolute === this.cwd) {\n return this[MAKEFS](null, entry, done)\n }\n\n unlinkFile(String(entry.absolute), er =>\n this[MAKEFS](er ?? null, entry, done),\n )\n })\n }\n\n if (this[CHECKED_CWD]) {\n start()\n } else {\n checkCwd()\n }\n }\n\n [MAKEFS](\n er: null | undefined | Error,\n entry: ReadEntry,\n done: () => void,\n ) {\n if (er) {\n this[ONERROR](er, entry)\n done()\n return\n }\n\n switch (entry.type) {\n case 'File':\n case 'OldFile':\n case 'ContiguousFile':\n return this[FILE](entry, done)\n\n case 'Link':\n return this[HARDLINK](entry, done)\n\n case 'SymbolicLink':\n return this[SYMLINK](entry, done)\n\n case 'Directory':\n case 'GNUDumpDir':\n return this[DIRECTORY](entry, done)\n }\n }\n\n [LINK](\n entry: ReadEntry,\n linkpath: string,\n link: 'link' | 'symlink',\n done: () => void,\n ) {\n fs[link](linkpath, String(entry.absolute), er => {\n if (er) {\n this[ONERROR](er, entry)\n } else {\n this[UNPEND]()\n entry.resume()\n }\n done()\n })\n }\n}\n\nconst callSync = <T>(\n fn: () => T,\n): [null, T] | [NodeJS.ErrnoException, null] => {\n try {\n return [null, fn()]\n } catch (er) {\n return [er as NodeJS.ErrnoException, null]\n }\n}\n\nexport class UnpackSync extends Unpack {\n sync: true = true;\n\n [MAKEFS](er: null | Error | undefined, entry: ReadEntry) {\n return super[MAKEFS](er, entry, () => {})\n }\n\n [CHECKFS](entry: ReadEntry) {\n if (!this[CHECKED_CWD]) {\n const er = this[MKDIR](this.cwd, this.dmode)\n if (er) {\n return this[ONERROR](er as Error, entry)\n }\n this[CHECKED_CWD] = true\n }\n\n // don't bother to make the parent if the current entry is the cwd,\n // we've already checked it.\n if (entry.absolute !== this.cwd) {\n const parent = normalizeWindowsPath(\n path.dirname(String(entry.absolute)),\n )\n if (parent !== this.cwd) {\n const mkParent = this[MKDIR](parent, this.dmode)\n if (mkParent) {\n return this[ONERROR](mkParent as Error, entry)\n }\n }\n }\n\n const [lstatEr, st] = callSync(() =>\n fs.lstatSync(String(entry.absolute)),\n )\n if (\n st &&\n (this.keep ||\n /* c8 ignore next */\n (this.newer && st.mtime > (entry.mtime ?? st.mtime)))\n ) {\n return this[SKIP](entry)\n }\n\n if (lstatEr || this[ISREUSABLE](entry, st)) {\n return this[MAKEFS](null, entry)\n }\n\n if (st.isDirectory()) {\n if (entry.type === 'Directory') {\n const needChmod =\n this.chmod && entry.mode && (st.mode & 0o7777) !== entry.mode\n const [er] =\n needChmod ?\n callSync(() => {\n fs.chmodSync(String(entry.absolute), Number(entry.mode))\n })\n : []\n return this[MAKEFS](er, entry)\n }\n // not a dir entry, have to remove it\n const [er] = callSync(() => fs.rmdirSync(String(entry.absolute)))\n this[MAKEFS](er, entry)\n }\n\n // not a dir, and not reusable.\n // don't remove if it's the cwd, since we want that error.\n const [er] =\n entry.absolute === this.cwd ?\n []\n : callSync(() => unlinkFileSync(String(entry.absolute)))\n this[MAKEFS](er, entry)\n }\n\n [FILE](entry: ReadEntry, done: () => void) {\n const mode =\n typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.fmode\n\n const oner = (er?: null | Error | undefined) => {\n let closeError\n try {\n fs.closeSync(fd)\n } catch (e) {\n closeError = e\n }\n if (er || closeError) {\n this[ONERROR]((er as Error) || closeError, entry)\n }\n done()\n }\n\n let fd: number\n try {\n fd = fs.openSync(\n String(entry.absolute),\n getWriteFlag(entry.size),\n mode,\n )\n /* c8 ignore start - This is only a problem if the file was successfully\n * statted, BUT failed to open. Testing this is annoying, and we\n * already have ample testint for other uses of oner() methods.\n */\n } catch (er) {\n return oner(er as Error)\n }\n /* c8 ignore stop */\n const tx = this.transform ? this.transform(entry) || entry : entry\n if (tx !== entry) {\n tx.on('error', er => this[ONERROR](er as Error, entry))\n entry.pipe(tx)\n }\n\n tx.on('data', (chunk: Buffer) => {\n try {\n fs.writeSync(fd, chunk, 0, chunk.length)\n } catch (er) {\n oner(er as Error)\n }\n })\n\n tx.on('end', () => {\n let er = null\n // try both, falling futimes back to utimes\n // if either fails, handle the first error\n if (entry.mtime && !this.noMtime) {\n const atime = entry.atime || new Date()\n const mtime = entry.mtime\n try {\n fs.futimesSync(fd, atime, mtime)\n } catch (futimeser) {\n try {\n fs.utimesSync(String(entry.absolute), atime, mtime)\n } catch {\n er = futimeser\n }\n }\n }\n\n if (this[DOCHOWN](entry)) {\n const uid = this[UID](entry)\n const gid = this[GID](entry)\n\n try {\n fs.fchownSync(fd, Number(uid), Number(gid))\n } catch (fchowner) {\n try {\n fs.chownSync(String(entry.absolute), Number(uid), Number(gid))\n } catch {\n er = er || fchowner\n }\n }\n }\n\n oner(er as Error)\n })\n }\n\n [DIRECTORY](entry: ReadEntry, done: () => void) {\n const mode =\n typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.dmode\n const er = this[MKDIR](String(entry.absolute), mode)\n if (er) {\n this[ONERROR](er as Error, entry)\n done()\n return\n }\n if (entry.mtime && !this.noMtime) {\n try {\n fs.utimesSync(\n String(entry.absolute),\n entry.atime || new Date(),\n entry.mtime,\n )\n /* c8 ignore next */\n } catch {}\n }\n if (this[DOCHOWN](entry)) {\n try {\n fs.chownSync(\n String(entry.absolute),\n Number(this[UID](entry)),\n Number(this[GID](entry)),\n )\n } catch {}\n }\n done()\n entry.resume()\n }\n\n [MKDIR](dir: string, mode: number) {\n try {\n return mkdirSync(normalizeWindowsPath(dir), {\n uid: this.uid,\n gid: this.gid,\n processUid: this.processUid,\n processGid: this.processGid,\n umask: this.processUmask,\n preserve: this.preservePaths,\n unlink: this.unlink,\n cwd: this.cwd,\n mode: mode,\n })\n } catch (er) {\n return er\n }\n }\n\n [ENSURE_NO_SYMLINK](\n _entry: ReadEntry,\n cwd: string,\n parts: string[],\n done: () => void,\n onError: (er: SymlinkError) => void,\n ) {\n if (this.preservePaths || parts.length === 0) return done()\n let t = cwd\n for (const p of parts) {\n t = path.resolve(t, p)\n const [er, st] = callSync(() => fs.lstatSync(t))\n if (er) return done()\n if (st.isSymbolicLink()) {\n return onError(\n new SymlinkError(t, path.resolve(cwd, parts.join('/'))),\n )\n }\n }\n done()\n }\n\n [LINK](\n entry: ReadEntry,\n linkpath: string,\n link: 'link' | 'symlink',\n done: () => void,\n ) {\n const linkSync: `${typeof link}Sync` = `${link}Sync`\n try {\n fs[linkSync](linkpath, String(entry.absolute))\n done()\n entry.resume()\n } catch (er) {\n return this[ONERROR](er as Error, entry)\n }\n }\n}\n","// Get the appropriate flag to use for creating files\n// We use fmap on Windows platforms for files less than\n// 512kb. This is a fairly low limit, but avoids making\n// things slower in some cases. Since most of what this\n// library is used for is extracting tarballs of many\n// relatively small files in npm packages and the like,\n// it can be a big boost on Windows platforms.\n\nimport fs from 'fs'\n\nconst platform = process.env.__FAKE_PLATFORM__ || process.platform\nconst isWindows = platform === 'win32'\n\n/* c8 ignore start */\nconst { O_CREAT, O_NOFOLLOW, O_TRUNC, O_WRONLY } = fs.constants\nconst UV_FS_O_FILEMAP =\n Number(process.env.__FAKE_FS_O_FILENAME__) ||\n fs.constants.UV_FS_O_FILEMAP ||\n 0\n/* c8 ignore stop */\n\nconst fMapEnabled = isWindows && !!UV_FS_O_FILEMAP\nconst fMapLimit = 512 * 1024\nconst fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY\nconst noFollowFlag =\n !isWindows && typeof O_NOFOLLOW === 'number' ?\n O_NOFOLLOW | O_TRUNC | O_CREAT | O_WRONLY\n : null\nexport const getWriteFlag =\n noFollowFlag !== null ? () => noFollowFlag\n : !fMapEnabled ? () => 'w'\n : (size: number) => (size < fMapLimit ? fMapFlag : 'w')\n","import fs, { type Dirent } from 'node:fs'\nimport path from 'node:path'\n\nconst lchownSync = (path: string, uid: number, gid: number) => {\n try {\n return fs.lchownSync(path, uid, gid)\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code !== 'ENOENT') throw er\n }\n}\n\nconst chown = (\n cpath: string,\n uid: number,\n gid: number,\n cb: (er?: unknown) => any,\n) => {\n fs.lchown(cpath, uid, gid, er => {\n // Skip ENOENT error\n cb(er && (er as NodeJS.ErrnoException)?.code !== 'ENOENT' ? er : null)\n })\n}\n\nconst chownrKid = (\n p: string,\n child: Dirent,\n uid: number,\n gid: number,\n cb: (er?: unknown) => any,\n) => {\n if (child.isDirectory()) {\n chownr(path.resolve(p, child.name), uid, gid, (er: unknown) => {\n if (er) return cb(er)\n const cpath = path.resolve(p, child.name)\n chown(cpath, uid, gid, cb)\n })\n } else {\n const cpath = path.resolve(p, child.name)\n chown(cpath, uid, gid, cb)\n }\n}\n\nexport const chownr = (\n p: string,\n uid: number,\n gid: number,\n cb: (er?: unknown) => any,\n) => {\n fs.readdir(p, { withFileTypes: true }, (er, children) => {\n // any error other than ENOTDIR or ENOTSUP means it's not readable,\n // or doesn't exist. give up.\n if (er) {\n if (er.code === 'ENOENT') return cb()\n else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP')\n return cb(er)\n }\n if (er || !children.length) return chown(p, uid, gid, cb)\n\n let len = children.length\n let errState: null | NodeJS.ErrnoException = null\n const then = (er?: unknown) => {\n /* c8 ignore start */\n if (errState) return\n /* c8 ignore stop */\n if (er) return cb((errState = er as NodeJS.ErrnoException))\n if (--len === 0) return chown(p, uid, gid, cb)\n }\n\n for (const child of children) {\n chownrKid(p, child, uid, gid, then)\n }\n })\n}\n\nconst chownrKidSync = (\n p: string,\n child: Dirent,\n uid: number,\n gid: number,\n) => {\n if (child.isDirectory())\n chownrSync(path.resolve(p, child.name), uid, gid)\n\n lchownSync(path.resolve(p, child.name), uid, gid)\n}\n\nexport const chownrSync = (p: string, uid: number, gid: number) => {\n let children: Dirent[]\n try {\n children = fs.readdirSync(p, { withFileTypes: true })\n } catch (er) {\n const e = er as NodeJS.ErrnoException\n if (e?.code === 'ENOENT') return\n else if (e?.code === 'ENOTDIR' || e?.code === 'ENOTSUP')\n return lchownSync(p, uid, gid)\n else throw e\n }\n\n for (const child of children) {\n chownrKidSync(p, child, uid, gid)\n }\n\n return lchownSync(p, uid, gid)\n}\n","import { chownr, chownrSync } from 'chownr'\nimport fs from 'node:fs'\nimport fsp from 'node:fs/promises'\nimport path from 'node:path'\nimport { CwdError } from './cwd-error.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport { SymlinkError } from './symlink-error.js'\n\nexport type MkdirOptions = {\n uid?: number\n gid?: number\n processUid?: number\n processGid?: number\n umask?: number\n preserve: boolean\n unlink: boolean\n cwd: string\n mode: number\n}\n\nexport type MkdirError = NodeJS.ErrnoException | CwdError | SymlinkError\n\nconst checkCwd = (\n dir: string,\n cb: (er?: null | MkdirError) => unknown,\n) => {\n fs.stat(dir, (er, st) => {\n if (er || !st.isDirectory()) {\n er = new CwdError(\n dir,\n (er as NodeJS.ErrnoException)?.code || 'ENOTDIR',\n )\n }\n cb(er)\n })\n}\n\n/**\n * Wrapper around fs/promises.mkdir for tar's needs.\n *\n * The main purpose is to avoid creating directories if we know that\n * they already exist (and track which ones exist for this purpose),\n * and prevent entries from being extracted into symlinked folders,\n * if `preservePaths` is not set.\n */\nexport const mkdir = (\n dir: string,\n opt: MkdirOptions,\n cb: (er?: null | MkdirError, made?: string) => void,\n) => {\n dir = normalizeWindowsPath(dir)\n\n // if there's any overlap between mask and mode,\n // then we'll need an explicit chmod\n /* c8 ignore next */\n const umask = opt.umask ?? 0o22\n const mode = opt.mode | 0o0700\n const needChmod = (mode & umask) !== 0\n\n const uid = opt.uid\n const gid = opt.gid\n const doChown =\n typeof uid === 'number' &&\n typeof gid === 'number' &&\n (uid !== opt.processUid || gid !== opt.processGid)\n\n const preserve = opt.preserve\n const unlink = opt.unlink\n const cwd = normalizeWindowsPath(opt.cwd)\n\n const done = (er?: null | MkdirError, created?: string) => {\n if (er) {\n cb(er)\n } else {\n if (created && doChown) {\n chownr(created, uid, gid, er => done(er as NodeJS.ErrnoException))\n } else if (needChmod) {\n fs.chmod(dir, mode, cb)\n } else {\n cb()\n }\n }\n }\n\n if (dir === cwd) {\n return checkCwd(dir, done)\n }\n\n if (preserve) {\n return fsp.mkdir(dir, { mode, recursive: true }).then(\n made => done(null, made ?? undefined), // oh, ts\n done,\n )\n }\n\n const sub = normalizeWindowsPath(path.relative(cwd, dir))\n const parts = sub.split('/')\n mkdir_(cwd, parts, mode, unlink, cwd, undefined, done)\n}\n\nconst mkdir_ = (\n base: string,\n parts: string[],\n mode: number,\n unlink: boolean,\n cwd: string,\n created: string | undefined,\n cb: (er?: null | MkdirError, made?: string) => void,\n): void => {\n if (parts.length === 0) {\n return cb(null, created)\n }\n const p = parts.shift()\n const part = normalizeWindowsPath(path.resolve(base + '/' + p))\n fs.mkdir(\n part,\n mode,\n onmkdir(part, parts, mode, unlink, cwd, created, cb),\n )\n}\n\nconst onmkdir =\n (\n part: string,\n parts: string[],\n mode: number,\n unlink: boolean,\n cwd: string,\n created: string | undefined,\n cb: (er?: null | MkdirError, made?: string) => void,\n ) =>\n (er?: null | NodeJS.ErrnoException) => {\n if (er) {\n fs.lstat(part, (statEr, st) => {\n if (statEr) {\n statEr.path = statEr.path && normalizeWindowsPath(statEr.path)\n cb(statEr)\n } else if (st.isDirectory()) {\n mkdir_(part, parts, mode, unlink, cwd, created, cb)\n } else if (unlink) {\n fs.unlink(part, er => {\n if (er) {\n return cb(er)\n }\n fs.mkdir(\n part,\n mode,\n onmkdir(part, parts, mode, unlink, cwd, created, cb),\n )\n })\n } else if (st.isSymbolicLink()) {\n return cb(new SymlinkError(part, part + '/' + parts.join('/')))\n } else {\n cb(er)\n }\n })\n } else {\n created = created || part\n mkdir_(part, parts, mode, unlink, cwd, created, cb)\n }\n }\n\nconst checkCwdSync = (dir: string) => {\n let ok = false\n let code\n try {\n ok = fs.statSync(dir).isDirectory()\n } catch (er) {\n code = (er as NodeJS.ErrnoException)?.code\n } finally {\n if (!ok) {\n throw new CwdError(dir, code ?? 'ENOTDIR')\n }\n }\n}\n\nexport const mkdirSync = (dir: string, opt: MkdirOptions) => {\n dir = normalizeWindowsPath(dir)\n // if there's any overlap between mask and mode,\n // then we'll need an explicit chmod\n /* c8 ignore next */\n const umask = opt.umask ?? 0o22\n const mode = opt.mode | 0o700\n const needChmod = (mode & umask) !== 0\n\n const uid = opt.uid\n const gid = opt.gid\n const doChown =\n typeof uid === 'number' &&\n typeof gid === 'number' &&\n (uid !== opt.processUid || gid !== opt.processGid)\n\n const preserve = opt.preserve\n const unlink = opt.unlink\n const cwd = normalizeWindowsPath(opt.cwd)\n\n const done = (created?: string | undefined) => {\n if (created && doChown) {\n chownrSync(created, uid, gid)\n }\n if (needChmod) {\n fs.chmodSync(dir, mode)\n }\n }\n\n if (dir === cwd) {\n checkCwdSync(cwd)\n return done()\n }\n\n if (preserve) {\n return done(fs.mkdirSync(dir, { mode, recursive: true }) ?? undefined)\n }\n\n const sub = normalizeWindowsPath(path.relative(cwd, dir))\n const parts = sub.split('/')\n let created\n for (\n let p = parts.shift(), part = cwd;\n p && (part += '/' + p);\n p = parts.shift()\n ) {\n part = normalizeWindowsPath(path.resolve(part))\n\n try {\n fs.mkdirSync(part, mode)\n created = created || part\n } catch {\n const st = fs.lstatSync(part)\n if (st.isDirectory()) {\n continue\n } else if (unlink) {\n fs.unlinkSync(part)\n fs.mkdirSync(part, mode)\n created = created || part\n continue\n } else if (st.isSymbolicLink()) {\n return new SymlinkError(part, part + '/' + parts.join('/'))\n }\n }\n }\n\n return done(created)\n}\n","export class CwdError extends Error {\n path: string\n code: string\n syscall = 'chdir' as const\n\n constructor(path: string, code: string) {\n super(`${code}: Cannot cd into '${path}'`)\n this.path = path\n this.code = code\n }\n\n get name() {\n return 'CwdError'\n }\n}\n","export class SymlinkError extends Error {\n path: string\n symlink: string\n syscall = 'symlink' as const\n code = 'TAR_SYMLINK_ERROR' as const\n constructor(symlink: string, path: string) {\n super('TAR_SYMLINK_ERROR: Cannot extract through symbolic link')\n this.symlink = symlink\n this.path = path\n }\n get name() {\n return 'SymlinkError'\n }\n}\n","// A path exclusive reservation system\n// reserve([list, of, paths], fn)\n// When the fn is first in line for all its paths, it\n// is called with a cb that clears the reservation.\n//\n// Used by async unpack to avoid clobbering paths in use,\n// while still allowing maximal safe parallelization.\n\nimport { join } from 'node:path'\nimport { normalizeUnicode } from './normalize-unicode.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\n\nconst platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform\nconst isWindows = platform === 'win32'\n\nexport type Reservation = {\n paths: string[]\n dirs: Set<string>\n}\n\nexport type Handler = (clear: () => void) => void\n\n// return a set of parent dirs for a given path\n// '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d']\nconst getDirs = (path: string) => {\n const dirs = path\n .split('/')\n .slice(0, -1)\n .reduce((set: string[], path) => {\n const s = set.at(-1)\n if (s !== undefined) {\n path = join(s, path)\n }\n set.push(path || '/')\n return set\n }, [])\n return dirs\n}\n\nexport class PathReservations {\n // path => [function or Set]\n // A Set object means a directory reservation\n // A fn is a direct reservation on that path\n #queues = new Map<string, (Handler | Set<Handler>)[]>()\n\n // fn => {paths:[path,...], dirs:[path, ...]}\n #reservations = new Map<Handler, Reservation>()\n\n // functions currently running\n #running = new Set<Handler>()\n\n reserve(paths: string[], fn: Handler) {\n paths =\n isWindows ?\n ['win32 parallelization disabled']\n : paths.map(p => {\n // don't need normPath, because we skip this entirely for windows\n return stripTrailingSlashes(join(normalizeUnicode(p)))\n })\n\n const dirs = new Set<string>(\n paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b)),\n )\n this.#reservations.set(fn, { dirs, paths })\n for (const p of paths) {\n const q = this.#queues.get(p)\n if (!q) {\n this.#queues.set(p, [fn])\n } else {\n q.push(fn)\n }\n }\n for (const dir of dirs) {\n const q = this.#queues.get(dir)\n if (!q) {\n this.#queues.set(dir, [new Set([fn])])\n } else {\n const l = q.at(-1)\n if (l instanceof Set) {\n l.add(fn)\n } else {\n q.push(new Set([fn]))\n }\n }\n }\n return this.#run(fn)\n }\n\n // return the queues for each path the function cares about\n // fn => {paths, dirs}\n #getQueues(fn: Handler): {\n paths: Handler[][]\n dirs: (Handler | Set<Handler>)[][]\n } {\n const res = this.#reservations.get(fn)\n /* c8 ignore start */\n if (!res) {\n throw new Error('function does not have any path reservations')\n }\n /* c8 ignore stop */\n return {\n paths: res.paths.map((path: string) =>\n this.#queues.get(path),\n ) as Handler[][],\n dirs: [...res.dirs].map(path => this.#queues.get(path)) as (\n | Handler\n | Set<Handler>\n )[][],\n }\n }\n\n // check if fn is first in line for all its paths, and is\n // included in the first set for all its dir queues\n check(fn: Handler) {\n const { paths, dirs } = this.#getQueues(fn)\n return (\n paths.every(q => q && q[0] === fn) &&\n dirs.every(q => q && q[0] instanceof Set && q[0].has(fn))\n )\n }\n\n // run the function if it's first in line and not already running\n #run(fn: Handler) {\n if (this.#running.has(fn) || !this.check(fn)) {\n return false\n }\n this.#running.add(fn)\n fn(() => this.#clear(fn))\n return true\n }\n\n #clear(fn: Handler) {\n if (!this.#running.has(fn)) {\n return false\n }\n const res = this.#reservations.get(fn)\n /* c8 ignore start */\n if (!res) {\n throw new Error('invalid reservation')\n }\n /* c8 ignore stop */\n const { paths, dirs } = res\n\n const next = new Set<Handler>()\n for (const path of paths) {\n const q = this.#queues.get(path)\n /* c8 ignore start */\n if (!q || q?.[0] !== fn) {\n continue\n }\n /* c8 ignore stop */\n const q0 = q[1]\n if (!q0) {\n this.#queues.delete(path)\n continue\n }\n q.shift()\n if (typeof q0 === 'function') {\n next.add(q0)\n } else {\n for (const f of q0) {\n next.add(f)\n }\n }\n }\n\n for (const dir of dirs) {\n const q = this.#queues.get(dir)\n const q0 = q?.[0]\n /* c8 ignore next - type safety only */\n if (!q || !(q0 instanceof Set)) continue\n if (q0.size === 1 && q.length === 1) {\n this.#queues.delete(dir)\n continue\n } else if (q0.size === 1) {\n q.shift()\n // next one must be a function,\n // or else the Set would've been reused\n const n = q[0]\n if (typeof n === 'function') {\n next.add(n)\n }\n } else {\n q0.delete(fn)\n }\n }\n\n this.#running.delete(fn)\n next.forEach(fn => this.#run(fn))\n return true\n }\n}\n","// warning: extremely hot code path.\n// This has been meticulously optimized for use\n// within npm install on large package trees.\n// Do not edit without careful benchmarking.\nconst normalizeCache: Record<string, string> = Object.create(null)\n\n// Limit the size of this. Very low-sophistication LRU cache\nconst MAX = 10000\nconst cache = new Set<string>()\nexport const normalizeUnicode = (s: string): string => {\n if (!cache.has(s)) {\n // shake out identical accents and ligatures\n normalizeCache[s] = s\n .normalize('NFD')\n .toLocaleLowerCase('en')\n .toLocaleUpperCase('en')\n } else {\n cache.delete(s)\n }\n cache.add(s)\n\n const ret = normalizeCache[s] as string\n\n let i = cache.size - MAX\n // only prune when we're 10% over the max\n if (i > MAX / 10) {\n for (const s of cache) {\n cache.delete(s)\n delete normalizeCache[s]\n if (--i <= 0) break\n }\n }\n\n return ret\n}\n","// separate file so I stop getting nagged in vim about deprecated API.\nexport const umask = () => process.umask()\n","// tar -r\nimport { WriteStream, WriteStreamSync } from '@isaacs/fs-minipass'\nimport type { Minipass } from 'minipass'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { Header } from './header.js'\nimport { list } from './list.js'\nimport { makeCommand } from './make-command.js'\nimport type { TarOptionsFile, TarOptionsSyncFile } from './options.js'\nimport { isFile } from './options.js'\nimport { Pack, PackSync } from './pack.js'\n\n// starting at the head of the file, read a Header\n// If the checksum is invalid, that's our position to start writing\n// If it is, jump forward by the specified size (round up to 512)\n// and try again.\n// Write the new Pack stream starting there.\n\nconst replaceSync = (opt: TarOptionsSyncFile, files: string[]) => {\n const p = new PackSync(opt)\n\n let threw = true\n let fd\n let position\n\n try {\n try {\n fd = fs.openSync(opt.file, 'r+')\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') {\n fd = fs.openSync(opt.file, 'w+')\n } else {\n throw er\n }\n }\n\n const st = fs.fstatSync(fd)\n const headBuf = Buffer.alloc(512)\n\n POSITION: for (position = 0; position < st.size; position += 512) {\n for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) {\n bytes = fs.readSync(\n fd,\n headBuf,\n bufPos,\n headBuf.length - bufPos,\n position + bufPos,\n )\n\n if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) {\n throw new Error('cannot append to compressed archives')\n }\n\n if (!bytes) {\n break POSITION\n }\n }\n\n const h = new Header(headBuf)\n if (!h.cksumValid) {\n break\n }\n const entryBlockSize = 512 * Math.ceil((h.size || 0) / 512)\n if (position + entryBlockSize + 512 > st.size) {\n break\n }\n // the 512 for the header we just parsed will be added as well\n // also jump ahead all the blocks for the body\n position += entryBlockSize\n if (opt.mtimeCache && h.mtime) {\n opt.mtimeCache.set(String(h.path), h.mtime)\n }\n }\n threw = false\n\n streamSync(opt, p, position, fd, files)\n } finally {\n if (threw) {\n try {\n fs.closeSync(fd as number)\n } catch {}\n }\n }\n}\n\nconst streamSync = (\n opt: TarOptionsSyncFile,\n p: Pack,\n position: number,\n fd: number,\n files: string[],\n) => {\n const stream = new WriteStreamSync(opt.file, {\n fd: fd,\n start: position,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n addFilesSync(p, files)\n}\n\nconst replaceAsync = (\n opt: TarOptionsFile,\n files: string[],\n): Promise<void> => {\n files = Array.from(files)\n const p = new Pack(opt)\n\n const getPos = (\n fd: number,\n size: number,\n cb_: (er?: null | Error, pos?: number) => void,\n ) => {\n const cb = (er?: Error | null, pos?: number) => {\n if (er) {\n fs.close(fd, _ => cb_(er))\n } else {\n cb_(null, pos)\n }\n }\n\n let position = 0\n if (size === 0) {\n return cb(null, 0)\n }\n\n let bufPos = 0\n const headBuf = Buffer.alloc(512)\n const onread = (er?: null | Error, bytes?: number): void => {\n if (er || bytes === undefined) {\n return cb(er)\n }\n bufPos += bytes\n if (bufPos < 512 && bytes) {\n return fs.read(\n fd,\n headBuf,\n bufPos,\n headBuf.length - bufPos,\n position + bufPos,\n onread,\n )\n }\n\n if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) {\n return cb(new Error('cannot append to compressed archives'))\n }\n\n // truncated header\n if (bufPos < 512) {\n return cb(null, position)\n }\n\n const h = new Header(headBuf)\n if (!h.cksumValid) {\n return cb(null, position)\n }\n\n /* c8 ignore next */\n const entryBlockSize = 512 * Math.ceil((h.size ?? 0) / 512)\n if (position + entryBlockSize + 512 > size) {\n return cb(null, position)\n }\n\n position += entryBlockSize + 512\n if (position >= size) {\n return cb(null, position)\n }\n\n if (opt.mtimeCache && h.mtime) {\n opt.mtimeCache.set(String(h.path), h.mtime)\n }\n bufPos = 0\n fs.read(fd, headBuf, 0, 512, position, onread)\n }\n fs.read(fd, headBuf, 0, 512, position, onread)\n }\n\n const promise = new Promise<void>((resolve, reject) => {\n p.on('error', reject)\n let flag = 'r+'\n const onopen = (er?: NodeJS.ErrnoException | null, fd?: number) => {\n if (er && er.code === 'ENOENT' && flag === 'r+') {\n flag = 'w+'\n return fs.open(opt.file, flag, onopen)\n }\n\n if (er || !fd) {\n return reject(er)\n }\n\n fs.fstat(fd, (er, st) => {\n if (er) {\n return fs.close(fd, () => reject(er))\n }\n\n getPos(fd, st.size, (er, position) => {\n if (er) {\n return reject(er)\n }\n const stream = new WriteStream(opt.file, {\n fd: fd,\n start: position,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n stream.on('error', reject)\n stream.on('close', resolve)\n addFilesAsync(p, files)\n })\n })\n }\n fs.open(opt.file, flag, onopen)\n })\n\n return promise\n}\n\nconst addFilesSync = (p: Pack, files: string[]) => {\n files.forEach(file => {\n if (file.charAt(0) === '@') {\n list({\n file: path.resolve(p.cwd, file.slice(1)),\n sync: true,\n noResume: true,\n onReadEntry: entry => p.add(entry),\n })\n } else {\n p.add(file)\n }\n })\n p.end()\n}\n\nconst addFilesAsync = async (p: Pack, files: string[]): Promise<void> => {\n for (const file of files) {\n if (file.charAt(0) === '@') {\n await list({\n file: path.resolve(String(p.cwd), file.slice(1)),\n noResume: true,\n onReadEntry: entry => p.add(entry),\n })\n } else {\n p.add(file)\n }\n }\n p.end()\n}\n\nexport const replace = makeCommand(\n replaceSync,\n replaceAsync,\n /* c8 ignore start */\n (): never => {\n throw new TypeError('file is required')\n },\n (): never => {\n throw new TypeError('file is required')\n },\n /* c8 ignore stop */\n (opt, entries) => {\n if (!isFile(opt)) {\n throw new TypeError('file is required')\n }\n\n if (\n opt.gzip ||\n opt.brotli ||\n opt.zstd ||\n opt.file.endsWith('.br') ||\n opt.file.endsWith('.tbr')\n ) {\n throw new TypeError('cannot append to compressed archives')\n }\n\n if (!entries?.length) {\n throw new TypeError('no paths specified to add/replace')\n }\n },\n)\n","// tar -u\n\nimport { makeCommand } from './make-command.js'\nimport { type TarOptionsWithAliases } from './options.js'\n\nimport { replace as r } from './replace.js'\n\n// just call tar.r with the filter and mtimeCache\nexport const update = makeCommand(\n r.syncFile,\n r.asyncFile,\n r.syncNoFile,\n r.asyncNoFile,\n (opt, entries = []) => {\n r.validate?.(opt, entries)\n mtimeFilter(opt)\n },\n)\n\nconst mtimeFilter = (opt: TarOptionsWithAliases) => {\n const filter = opt.filter\n\n if (!opt.mtimeCache) {\n opt.mtimeCache = new Map()\n }\n\n opt.filter =\n filter ?\n (path, stat) =>\n filter(path, stat) &&\n !(\n /* c8 ignore start */\n (\n (opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) >\n (stat.mtime ?? 0)\n )\n /* c8 ignore stop */\n )\n : (path, stat) =>\n !(\n /* c8 ignore start */\n (\n (opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) >\n (stat.mtime ?? 0)\n )\n /* c8 ignore stop */\n )\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as tar from \"tar\";\n\n/**\n * Check if a directory exists and is empty (contains no files or subdirectories).\n * Returns: { exists: boolean, empty: boolean }\n * - Non-existent path: { exists: false, empty: true }\n * - Existing empty directory: { exists: true, empty: true }\n * - Existing non-empty directory: { exists: true, empty: false }\n * - Existing file (not directory): { exists: true, empty: false }\n */\nexport function checkDirectoryStatus(dirPath: string): {\n exists: boolean;\n empty: boolean;\n} {\n if (!fs.existsSync(dirPath)) {\n return { exists: false, empty: true };\n }\n\n const stat = fs.statSync(dirPath);\n if (!stat.isDirectory()) {\n // Path exists but is a file, not a directory\n return { exists: true, empty: false };\n }\n\n const entries = fs.readdirSync(dirPath);\n return { exists: true, empty: entries.length === 0 };\n}\n\n/**\n * Format bytes to human-readable format\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n}\n\n/**\n * Format relative time from ISO date string\n */\nexport function formatRelativeTime(isoDate: string): string {\n const date = new Date(isoDate);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n const diffWeek = Math.floor(diffDay / 7);\n\n if (diffSec < 60) return \"just now\";\n if (diffMin < 60) return `${diffMin} minute${diffMin === 1 ? \"\" : \"s\"} ago`;\n if (diffHour < 24) return `${diffHour} hour${diffHour === 1 ? \"\" : \"s\"} ago`;\n if (diffDay < 7) return `${diffDay} day${diffDay === 1 ? \"\" : \"s\"} ago`;\n return `${diffWeek} week${diffWeek === 1 ? \"\" : \"s\"} ago`;\n}\n\n/**\n * Filter function for tar.create to exclude .vm0 directory.\n * Paths come as \"./.vm0\" or \".vm0\" depending on tar version.\n */\nexport function excludeVm0Filter(filePath: string): boolean {\n const shouldExclude =\n filePath === \".vm0\" ||\n filePath.startsWith(\".vm0/\") ||\n filePath.startsWith(\"./.vm0\");\n return !shouldExclude;\n}\n\n/**\n * List files in tar.gz buffer using streaming parser.\n */\nexport function listTarFiles(tarPath: string): Promise<string[]> {\n return new Promise((resolve, reject) => {\n const files: string[] = [];\n\n tar\n .list({\n file: tarPath,\n onReadEntry: (entry) => {\n if (entry.type === \"File\") {\n files.push(entry.path);\n }\n },\n })\n .then(() => {\n return resolve(files);\n })\n .catch(reject);\n });\n}\n\n/**\n * Recursively list all files in a directory, excluding specified directories.\n * Returns relative paths from the base directory.\n */\nasync function listLocalFiles(\n dir: string,\n excludeDirs: string[] = [\".vm0\"],\n): Promise<string[]> {\n const files: string[] = [];\n\n async function walkDir(currentDir: string, relativePath: string = \"\") {\n const entries = await fs.promises.readdir(currentDir, {\n withFileTypes: true,\n });\n\n for (const entry of entries) {\n const entryRelativePath = relativePath\n ? path.join(relativePath, entry.name)\n : entry.name;\n\n if (entry.isDirectory()) {\n if (!excludeDirs.includes(entry.name)) {\n await walkDir(path.join(currentDir, entry.name), entryRelativePath);\n }\n } else {\n files.push(entryRelativePath);\n }\n }\n }\n\n await walkDir(dir);\n return files;\n}\n\n/**\n * Remove files that exist locally but not in remote.\n * Returns the number of files removed.\n */\nexport async function removeExtraFiles(\n dir: string,\n remoteFiles: Set<string>,\n excludeDirs: string[] = [\".vm0\"],\n): Promise<number> {\n const localFiles = await listLocalFiles(dir, excludeDirs);\n let removedCount = 0;\n\n for (const localFile of localFiles) {\n // Normalize path separators for comparison\n const normalizedPath = localFile.replace(/\\\\/g, \"/\");\n if (!remoteFiles.has(normalizedPath)) {\n const fullPath = path.join(dir, localFile);\n await fs.promises.unlink(fullPath);\n removedCount++;\n }\n }\n\n // Clean up empty directories\n await removeEmptyDirs(dir, excludeDirs);\n\n return removedCount;\n}\n\n/**\n * Recursively remove empty directories, excluding specified directories.\n */\nasync function removeEmptyDirs(\n dir: string,\n excludeDirs: string[] = [\".vm0\"],\n): Promise<boolean> {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n let isEmpty = true;\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (excludeDirs.includes(entry.name)) {\n isEmpty = false;\n } else {\n const subDirEmpty = await removeEmptyDirs(fullPath, excludeDirs);\n if (subDirEmpty) {\n await fs.promises.rmdir(fullPath);\n } else {\n isEmpty = false;\n }\n }\n } else {\n isEmpty = false;\n }\n }\n\n return isEmpty;\n}\n","import { mainRunCommand } from \"./run\";\nimport { resumeCommand } from \"./resume\";\nimport { continueCommand } from \"./continue\";\nimport { listCommand } from \"./list\";\nimport { killCommand } from \"./kill\";\nimport { queueCommand } from \"./queue\";\n\n// Add subcommands to the main run command\nmainRunCommand.addCommand(resumeCommand);\nmainRunCommand.addCommand(continueCommand);\nmainRunCommand.addCommand(listCommand);\nmainRunCommand.addCommand(killCommand);\nmainRunCommand.addCommand(queueCommand);\n\nexport const runCommand = mainRunCommand;\n","import { Command, Option } from \"commander\";\nimport {\n getComposeById,\n getComposeByName,\n getComposeVersion,\n createRun,\n} from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectVolumeVersions,\n isUUID,\n extractVarNames,\n extractSecretNames,\n loadValues,\n parseFirewallPolicies,\n parseIdentifier,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport {\n startSilentUpgrade,\n waitForSilentUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nexport const mainRunCommand = new Command()\n .name(\"run\")\n .description(\"Run an agent\")\n .argument(\n \"<agent-name>\",\n \"Agent reference: name[:version] (e.g., 'my-agent', 'my-agent:abc123', 'my-agent:latest')\",\n )\n .argument(\"<prompt>\", \"Prompt for the agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\"--artifact-name <name>\", \"Artifact storage name (required for run)\")\n .option(\n \"--artifact-version <hash>\",\n \"Artifact version hash (defaults to latest)\",\n )\n .option(\n \"--volume-version <name=version>\",\n \"Volume version override (repeatable, format: volumeName=version)\",\n collectVolumeVersions,\n {},\n )\n .option(\"--memory <name>\", \"Memory storage name\")\n .option(\n \"--conversation <id>\",\n \"Resume from conversation ID (for fine-grained control)\",\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--firewall-policies <json>\",\n 'Firewall policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .option(\n \"--capture-network-bodies\",\n \"Capture HTTP request headers, request bodies, and response bodies in network logs\",\n )\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--no-auto-update\").hideHelp())\n .action(\n withErrorHandler(\n async (\n identifier: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifactName?: string;\n artifactVersion?: string;\n memory?: string;\n volumeVersion: Record<string, string>;\n conversation?: string;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n firewallPolicies?: string;\n verbose?: boolean;\n captureNetworkBodies?: boolean;\n debugNoMockClaude?: boolean;\n autoUpdate?: boolean;\n },\n ) => {\n // Start upgrade in background at command start (runs in parallel)\n if (options.autoUpdate !== false) {\n await startSilentUpgrade(__CLI_VERSION__);\n }\n\n // 1. Parse identifier for optional version specifier\n const { name, version } = parseIdentifier(identifier);\n\n // 2. Resolve name to composeId and get compose content\n let composeId: string;\n let composeContent: unknown;\n\n if (isUUID(name)) {\n // It's a UUID compose ID - fetch compose to get content\n const compose = await getComposeById(name);\n composeId = compose.id;\n composeContent = compose.content;\n } else {\n // It's an agent name - resolve to compose ID\n const compose = await getComposeByName(name);\n if (!compose) {\n throw new Error(`Agent not found: ${identifier}`, {\n cause: new Error(\n \"Make sure you've composed the agent with: vm0 compose\",\n ),\n });\n }\n\n composeId = compose.id;\n composeContent = compose.content;\n }\n\n // 3. Resolve version if specified\n let agentComposeVersionId: string | undefined;\n\n if (version && version !== \"latest\") {\n // Resolve version hash to full version ID\n try {\n const versionInfo = await getComposeVersion(composeId, version);\n agentComposeVersionId = versionInfo.versionId;\n } catch (error) {\n throw new Error(`Version not found: ${version}`, {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n // Note: \"latest\" version uses agentComposeId which resolves to HEAD\n\n // 4. Load vars and secrets with priority: CLI args > --env-file > env vars\n const varNames = extractVarNames(composeContent);\n const vars = loadValues(options.vars, varNames, options.envFile);\n\n const secretNames = extractSecretNames(composeContent);\n const secrets = loadValues(\n options.secrets,\n secretNames,\n options.envFile,\n );\n\n // 5. Call unified API (server handles all variable expansion)\n const response = await createRun({\n // Use agentComposeVersionId if resolved, otherwise use agentComposeId (resolves to HEAD)\n ...(agentComposeVersionId\n ? { agentComposeVersionId }\n : { agentComposeId: composeId }),\n prompt,\n vars,\n secrets,\n artifactName: options.artifactName,\n artifactVersion: options.artifactVersion,\n memoryName: options.memory,\n volumeVersions:\n Object.keys(options.volumeVersion).length > 0\n ? options.volumeVersion\n : undefined,\n conversationId: options.conversation,\n appendSystemPrompt: options.appendSystemPrompt,\n disallowedTools: options.disallowedTools,\n tools: options.tools,\n settings: options.settings,\n firewallPolicies: parseFirewallPolicies(options.firewallPolicies),\n captureNetworkBodies: options.captureNetworkBodies || undefined,\n debugNoMockClaude: options.debugNoMockClaude || undefined,\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const result = await pollEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n\n // Wait for upgrade at command end (shows warning if failed)\n if (options.autoUpdate !== false) {\n await waitForSilentUpgrade();\n }\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { getCheckpoint, createRun } from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectVolumeVersions,\n isUUID,\n loadValues,\n parseFirewallPolicies,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const resumeCommand = new Command()\n .name(\"resume\")\n .description(\"Resume an agent run from a checkpoint (uses all snapshot data)\")\n .argument(\"<checkpointId>\", \"Checkpoint ID to resume from\")\n .argument(\"<prompt>\", \"Prompt for the resumed agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--volume-version <name=version>\",\n \"Volume version override (repeatable)\",\n collectVolumeVersions,\n {},\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--firewall-policies <json>\",\n 'Firewall policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .action(\n withErrorHandler(\n async (\n checkpointId: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n firewallPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n },\n command: { optsWithGlobals: () => Record<string, unknown> },\n ) => {\n // Commander.js quirk: when parent command has same option name,\n // the option value goes to parent. Use optsWithGlobals() to get all options.\n const allOpts = command.optsWithGlobals() as {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n volumeVersion: Record<string, string>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n firewallPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n };\n\n // Merge vars and secrets from command options\n const vars = { ...allOpts.vars, ...options.vars };\n const secrets = { ...allOpts.secrets, ...options.secrets };\n\n // 1. Validate checkpoint ID format\n if (!isUUID(checkpointId)) {\n throw new Error(`Invalid checkpoint ID format: ${checkpointId}`, {\n cause: new Error(\"Checkpoint ID must be a valid UUID\"),\n });\n }\n\n // 2. Fetch checkpoint info to get required secret names\n // This allows loading secrets from environment variables\n const checkpointInfo = await getCheckpoint(checkpointId);\n const requiredSecretNames =\n checkpointInfo.agentComposeSnapshot.secretNames || [];\n\n // 3. Load secrets from CLI options + --env-file + environment variables\n // Priority: CLI flags > --env-file > env vars\n const envFile = options.envFile || allOpts.envFile;\n const loadedSecrets = loadValues(secrets, requiredSecretNames, envFile);\n\n // 4. Call unified API with checkpointId\n const response = await createRun({\n checkpointId,\n prompt,\n vars: Object.keys(vars).length > 0 ? vars : undefined,\n secrets: loadedSecrets,\n volumeVersions:\n Object.keys(allOpts.volumeVersion).length > 0\n ? allOpts.volumeVersion\n : undefined,\n appendSystemPrompt:\n options.appendSystemPrompt || allOpts.appendSystemPrompt,\n disallowedTools: options.disallowedTools || allOpts.disallowedTools,\n tools: options.tools || allOpts.tools,\n settings: options.settings || allOpts.settings,\n firewallPolicies: parseFirewallPolicies(\n options.firewallPolicies || allOpts.firewallPolicies,\n ),\n debugNoMockClaude:\n options.debugNoMockClaude || allOpts.debugNoMockClaude || undefined,\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const verbose = options.verbose || allOpts.verbose;\n const result = await pollEvents(response.runId, { verbose });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { getSession, createRun } from \"../../lib/api\";\nimport {\n collectKeyValue,\n isUUID,\n loadValues,\n parseFirewallPolicies,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const continueCommand = new Command()\n .name(\"continue\")\n .description(\n \"Continue an agent run from a session (uses latest artifact version)\",\n )\n .argument(\"<agentSessionId>\", \"Agent session ID to continue from\")\n .argument(\"<prompt>\", \"Prompt for the continued agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--firewall-policies <json>\",\n 'Firewall policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .action(\n withErrorHandler(\n async (\n agentSessionId: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n firewallPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n },\n command: { optsWithGlobals: () => Record<string, unknown> },\n ) => {\n // Commander.js quirk: when parent command has same option name,\n // the option value goes to parent. Use optsWithGlobals() to get all options.\n const allOpts = command.optsWithGlobals() as {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n firewallPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n };\n\n // Merge vars and secrets from command options\n const vars = { ...allOpts.vars, ...options.vars };\n const secrets = { ...allOpts.secrets, ...options.secrets };\n\n // 1. Validate session ID format\n if (!isUUID(agentSessionId)) {\n throw new Error(\n `Invalid agent session ID format: ${agentSessionId}`,\n { cause: new Error(\"Agent session ID must be a valid UUID\") },\n );\n }\n\n // 2. Fetch session info to get required secret names\n // This allows loading secrets from environment variables\n const sessionInfo = await getSession(agentSessionId);\n const requiredSecretNames = sessionInfo.secretNames || [];\n\n // 3. Load secrets from CLI options + --env-file + environment variables\n // Priority: CLI flags > --env-file > env vars\n const envFile = options.envFile || allOpts.envFile;\n const loadedSecrets = loadValues(secrets, requiredSecretNames, envFile);\n\n // 4. Call unified API with sessionId\n const response = await createRun({\n sessionId: agentSessionId,\n prompt,\n vars: Object.keys(vars).length > 0 ? vars : undefined,\n secrets: loadedSecrets,\n appendSystemPrompt:\n options.appendSystemPrompt || allOpts.appendSystemPrompt,\n disallowedTools: options.disallowedTools || allOpts.disallowedTools,\n tools: options.tools || allOpts.tools,\n settings: options.settings || allOpts.settings,\n firewallPolicies: parseFirewallPolicies(\n options.firewallPolicies || allOpts.firewallPolicies,\n ),\n debugNoMockClaude:\n options.debugNoMockClaude || allOpts.debugNoMockClaude || undefined,\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const verbose = options.verbose || allOpts.verbose;\n const result = await pollEvents(response.runId, { verbose });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listRuns } from \"../../lib/api\";\nimport { formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport { ALL_RUN_STATUSES, type RunStatus, type RunListItem } from \"@vm0/core\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/** Standard UUID string length (with hyphens) */\nconst UUID_LENGTH = 36;\n\n/** All valid status values as a string for help text */\nconst VALID_STATUSES = ALL_RUN_STATUSES.join(\",\");\n\n/**\n * Command options type\n */\ninterface ListOptions {\n status?: string;\n all?: boolean;\n agent?: string;\n since?: string;\n until?: string;\n limit?: string;\n}\n\n/**\n * Format run status with color and optional padding\n */\nfunction formatRunStatus(status: RunStatus, width?: number): string {\n const paddedStatus = width ? status.padEnd(width) : status;\n switch (status) {\n case \"queued\":\n return chalk.blue(paddedStatus);\n case \"running\":\n return chalk.green(paddedStatus);\n case \"pending\":\n return chalk.yellow(paddedStatus);\n case \"completed\":\n return chalk.dim(paddedStatus);\n case \"failed\":\n case \"timeout\":\n return chalk.red(paddedStatus);\n default:\n return paddedStatus;\n }\n}\n\n/**\n * Validate and parse status filter from options\n */\nfunction parseStatusFilter(options: ListOptions): string | undefined {\n if (options.all) {\n return VALID_STATUSES;\n }\n\n if (options.status) {\n const values = options.status.split(\",\").map((s) => {\n return s.trim();\n });\n for (const v of values) {\n if (!ALL_RUN_STATUSES.includes(v as RunStatus)) {\n throw new Error(`Invalid status \"${v}\"`, {\n cause: new Error(`Valid values: ${VALID_STATUSES}`),\n });\n }\n }\n return values.join(\",\");\n }\n\n if (options.since) {\n // Implicit all when --since is used\n return VALID_STATUSES;\n }\n\n // undefined = backend default (pending,running)\n return undefined;\n}\n\n/**\n * Parse time option to ISO string\n */\nfunction parseTimeOption(value: string, optionName: string): string {\n try {\n return new Date(parseTime(value)).toISOString();\n } catch {\n throw new Error(\n `Invalid ${optionName} format. Use ISO (2026-01-01) or relative (1h, 7d, 30d)`,\n );\n }\n}\n\n/**\n * Parse and validate limit option\n */\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 100) {\n throw new Error(\"--limit must be between 1 and 100\");\n }\n return limit;\n}\n\n/**\n * Display runs in table format\n */\nfunction displayRuns(runs: RunListItem[]): void {\n // Calculate column widths\n const agentWidth = Math.max(\n 5,\n ...runs.map((r) => {\n return r.agentName.length;\n }),\n );\n const statusWidth = Math.max(\n 6,\n ...runs.map((r) => {\n return r.status.length;\n }),\n );\n\n // Print header\n const header = [\n \"ID\".padEnd(UUID_LENGTH),\n \"AGENT\".padEnd(agentWidth),\n \"STATUS\".padEnd(statusWidth),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const run of runs) {\n const row = [\n run.id.padEnd(UUID_LENGTH),\n run.agentName.padEnd(agentWidth),\n formatRunStatus(run.status, statusWidth),\n formatRelativeTime(run.createdAt),\n ].join(\" \");\n console.log(row);\n }\n}\n\n/**\n * Display empty state message\n */\nfunction displayEmptyState(hasFilters: boolean): void {\n if (hasFilters) {\n console.log(chalk.dim(\"No runs found matching filters\"));\n } else {\n console.log(chalk.dim(\"No active runs\"));\n console.log(chalk.dim(' Run: vm0 run <agent> \"<prompt>\"'));\n }\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List runs\")\n .option(\n \"--status <status,...>\",\n `Filter by status: ${VALID_STATUSES} (default: pending,running)`,\n )\n .option(\"--all\", \"Show all statuses (mutually exclusive with --status)\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--since <date>\", \"Start time (ISO format or relative: 1h, 7d, 30d)\")\n .option(\"--until <date>\", \"End time (defaults to now)\")\n .option(\"--limit <n>\", \"Maximum number of results (default: 50, max: 100)\")\n .action(\n withErrorHandler(async (options: ListOptions) => {\n // Validate mutual exclusion\n if (options.all && options.status) {\n throw new Error(\"--all and --status are mutually exclusive\");\n }\n\n // Parse options\n const statusFilter = parseStatusFilter(options);\n const since = options.since\n ? parseTimeOption(options.since, \"--since\")\n : undefined;\n const until = options.until\n ? parseTimeOption(options.until, \"--until\")\n : undefined;\n const limit = parseLimit(options.limit);\n\n // Validate since < until\n if (since && until && new Date(since) >= new Date(until)) {\n throw new Error(\"--since must be before --until\");\n }\n\n // Fetch runs with filters\n const response = await listRuns({\n status: statusFilter,\n agent: options.agent,\n since,\n until,\n limit,\n });\n\n const runs = response.runs;\n\n if (runs.length === 0) {\n const hasFilters = !!(\n options.status ||\n options.all ||\n options.agent ||\n options.since\n );\n displayEmptyState(hasFilters);\n return;\n }\n\n displayRuns(runs);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cancelRun } from \"../../lib/api\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const killCommand = new Command()\n .name(\"kill\")\n .description(\"Kill (cancel) a pending or running run\")\n .argument(\"<run-id>\", \"Run ID to kill\")\n .action(\n withErrorHandler(async (runId: string) => {\n await cancelRun(runId);\n console.log(chalk.green(`✓ Run ${runId} cancelled`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getRunQueue } from \"../../lib/api\";\nimport { formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const queueCommand = new Command()\n .name(\"queue\")\n .description(\"Show org run queue status\")\n .action(\n withErrorHandler(async () => {\n const data = await getRunQueue();\n const { concurrency, queue } = data;\n\n // Concurrency header\n const limitDisplay =\n concurrency.limit === 0\n ? \"unlimited\"\n : `${concurrency.active}/${concurrency.limit} slots used`;\n console.log(`Concurrency: ${limitDisplay} (${concurrency.tier} tier)`);\n\n // Queue status\n if (queue.length === 0) {\n console.log(chalk.dim(\"Queue: empty — all slots available\"));\n return;\n }\n\n console.log(\n `Queue: ${queue.length} run${queue.length > 1 ? \"s\" : \"\"} waiting`,\n );\n console.log();\n\n // Dynamic column widths\n const posWidth = Math.max(1, String(queue.length).length);\n const agentWidth = Math.max(\n 5,\n ...queue.map((e) => {\n return (e.agentName ?? \"-\").length;\n }),\n );\n const emailWidth = Math.max(\n 4,\n ...queue.map((e) => {\n return (e.userEmail ?? \"-\").length;\n }),\n );\n\n // Header\n const header = [\n \"#\".padEnd(posWidth),\n \"AGENT\".padEnd(agentWidth),\n \"USER\".padEnd(emailWidth),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Rows\n for (const entry of queue) {\n const marker = entry.runId !== null ? chalk.cyan(\" ← you\") : \"\";\n const row = [\n String(entry.position).padEnd(posWidth),\n (entry.agentName ?? \"-\").padEnd(agentWidth),\n (entry.userEmail ?? \"-\").padEnd(emailWidth),\n formatRelativeTime(entry.createdAt),\n ].join(\" \");\n console.log(row + marker);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init\";\nimport { pushCommand } from \"./push\";\nimport { pullCommand } from \"./pull\";\nimport { statusCommand } from \"./status\";\nimport { listCommand } from \"./list\";\nimport { cloneCommand } from \"./clone\";\n\nexport const volumeCommand = new Command()\n .name(\"volume\")\n .description(\"Manage volumes (defined in compose, not versioned after run)\")\n .addCommand(initCommand)\n .addCommand(pushCommand)\n .addCommand(pullCommand)\n .addCommand(statusCommand)\n .addCommand(listCommand)\n .addCommand(cloneCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport {\n isValidStorageName,\n writeStorageConfig,\n readStorageConfig,\n} from \"../../lib/storage/storage-utils\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize a volume in the current directory\")\n .option(\"-n, --name <name>\", \"Volume name (required in non-interactive mode)\")\n .action(\n withErrorHandler(async (options: { name?: string }) => {\n const cwd = process.cwd();\n const dirName = path.basename(cwd);\n\n // Check if storage config already exists\n const existingConfig = await readStorageConfig(cwd);\n if (existingConfig) {\n console.log(\n chalk.yellow(`Volume already initialized: ${existingConfig.name}`),\n );\n console.log(\n chalk.dim(`Config file: ${path.join(cwd, \".vm0\", \"storage.yaml\")}`),\n );\n return;\n }\n\n // Determine volume name\n let volumeName: string;\n\n if (options.name) {\n // Use provided name (non-interactive mode)\n volumeName = options.name;\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 volume init --name <volume-name>\"),\n });\n } else {\n // Interactive prompt with directory name as default\n const defaultName = isValidStorageName(dirName) ? dirName : undefined;\n const name = await promptText(\n \"Enter volume name\",\n defaultName,\n (value: string) => {\n if (!isValidStorageName(value)) {\n return \"Must be 3-64 characters, lowercase alphanumeric with hyphens\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n volumeName = name;\n }\n\n // Validate volume name\n if (!isValidStorageName(volumeName)) {\n throw new Error(`Invalid volume name: \"${volumeName}\"`, {\n cause: new Error(\n \"Volume names must be 3-64 characters, lowercase alphanumeric with hyphens\",\n ),\n });\n }\n\n // Write config file\n await writeStorageConfig(volumeName, cwd);\n\n console.log(chalk.green(`✓ Initialized volume: ${volumeName}`));\n console.log(\n chalk.dim(\n ` Config saved to ${path.join(cwd, \".vm0\", \"storage.yaml\")}`,\n ),\n );\n }),\n );\n","import { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport path from \"path\";\n\n/**\n * Storage type\n * - \"volume\": Static storage that doesn't auto-version after runs\n * - \"artifact\": Work products that auto-version after runs\n */\nexport type StorageType = \"volume\" | \"artifact\" | \"memory\";\n\ninterface StorageConfig {\n name: string;\n type: StorageType;\n}\n\nconst CONFIG_DIR = \".vm0\";\nconst CONFIG_FILE = \"storage.yaml\";\n\n/**\n * Validate storage name format\n * Length: 3-64 characters\n * Characters: lowercase letters, numbers, hyphens\n * Must start and end with alphanumeric\n * No consecutive hyphens\n */\nexport function isValidStorageName(name: string): boolean {\n if (name.length < 3 || name.length > 64) {\n return false;\n }\n const pattern = /^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/;\n return pattern.test(name) && !name.includes(\"--\");\n}\n\n/**\n * Read storage config from .vm0/storage.yaml\n * Also supports legacy .vm0/volume.yaml for backward compatibility\n */\nexport async function readStorageConfig(\n basePath: string = process.cwd(),\n): Promise<StorageConfig | null> {\n const configPath = path.join(basePath, CONFIG_DIR, CONFIG_FILE);\n const legacyConfigPath = path.join(basePath, CONFIG_DIR, \"volume.yaml\");\n\n // Check for new config file first, then legacy\n let actualPath: string | null = null;\n if (existsSync(configPath)) {\n actualPath = configPath;\n } else if (existsSync(legacyConfigPath)) {\n actualPath = legacyConfigPath;\n }\n\n if (!actualPath) {\n return null;\n }\n\n const content = await readFile(actualPath, \"utf8\");\n const config = parseYaml(content) as StorageConfig;\n\n // Default to \"volume\" type for backward compatibility\n if (!config.type) {\n config.type = \"volume\";\n }\n\n return config;\n}\n\n/**\n * Write storage config to .vm0/storage.yaml\n */\nexport async function writeStorageConfig(\n storageName: string,\n basePath: string = process.cwd(),\n type: StorageType = \"volume\",\n): Promise<void> {\n const configDir = path.join(basePath, CONFIG_DIR);\n const configPath = path.join(configDir, CONFIG_FILE);\n\n // Create .vm0 directory if it doesn't exist\n if (!existsSync(configDir)) {\n await mkdir(configDir, { recursive: true });\n }\n\n const config: StorageConfig = {\n name: storageName,\n type,\n };\n\n const yamlContent = stringifyYaml(config);\n await writeFile(configPath, yamlContent, \"utf8\");\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { directUpload } from \"../../lib/storage/direct-upload\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pushCommand = new Command()\n .name(\"push\")\n .description(\"Push local files to cloud volume\")\n .option(\n \"-f, --force\",\n \"Force upload even if content unchanged (recreate archive)\",\n )\n .action(\n withErrorHandler(async (options: { force?: boolean }) => {\n const cwd = process.cwd();\n\n // Read storage config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n console.log(`Pushing volume: ${config.name}`);\n\n // Perform direct S3 upload\n const result = await directUpload(config.name, \"volume\", cwd, {\n onProgress: (message) => {\n console.log(chalk.dim(message));\n },\n force: options.force,\n });\n\n // Display short version (8 characters) by default\n const shortVersion = result.versionId.slice(0, 8);\n\n if (result.empty) {\n console.log(chalk.dim(\"No files found (empty volume)\"));\n } else if (result.deduplicated) {\n console.log(chalk.green(\"✓ Content unchanged (deduplicated)\"));\n } else {\n console.log(chalk.green(\"✓ Upload complete\"));\n }\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${result.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(result.size)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload } from \"../../lib/api\";\nimport {\n formatBytes,\n listTarFiles,\n removeExtraFiles,\n} from \"../../lib/utils/file-utils\";\nimport { handleEmptyStorageResponse } from \"../../lib/storage/pull-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pullCommand = new Command()\n .name(\"pull\")\n .description(\"Pull cloud files to local directory\")\n .argument(\"[versionId]\", \"Version ID to pull (default: latest)\")\n .action(\n withErrorHandler(async (versionId?: string) => {\n const cwd = process.cwd();\n\n // Read storage config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n if (versionId) {\n console.log(`Pulling volume: ${config.name} (version: ${versionId})`);\n } else {\n console.log(`Pulling volume: ${config.name}`);\n }\n\n // Get download URL from API\n console.log(chalk.dim(\"Getting download URL...\"));\n\n const downloadInfo = await getStorageDownload({\n name: config.name,\n type: \"volume\",\n version: versionId,\n });\n\n // Handle empty volume\n if (\"empty\" in downloadInfo) {\n await handleEmptyStorageResponse(cwd);\n return;\n }\n\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download directly from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"volume.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get remote files list for sync\n console.log(chalk.dim(\"Syncing local files...\"));\n const remoteFiles = await listTarFiles(tarPath);\n const remoteFilesSet = new Set(\n remoteFiles.map((f) => {\n return f.replace(/\\\\/g, \"/\");\n }),\n );\n\n // Remove local files not in remote\n const removedCount = await removeExtraFiles(cwd, remoteFilesSet);\n if (removedCount > 0) {\n console.log(\n chalk.green(`✓ Removed ${removedCount} files not in remote`),\n );\n }\n\n // Extract tar.gz\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: cwd,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${remoteFiles.length} files`));\n }),\n );\n","import chalk from \"chalk\";\nimport { removeExtraFiles } from \"../utils/file-utils\";\n\n/**\n * Result of handling an empty storage response (HTTP 204).\n */\ninterface EmptyStorageResult {\n removedCount: number;\n}\n\n/**\n * Handle empty storage response (HTTP 204 No Content).\n * Syncs local directory to empty state by removing all tracked files.\n *\n * @param cwd - Current working directory\n * @returns Result with count of removed files\n */\nexport async function handleEmptyStorageResponse(\n cwd: string,\n): Promise<EmptyStorageResult> {\n console.log(chalk.dim(\"Syncing local files...\"));\n\n // Sync to empty state - remove all local files\n const removedCount = await removeExtraFiles(cwd, new Set());\n\n if (removedCount > 0) {\n console.log(chalk.green(`✓ Removed ${removedCount} files not in remote`));\n }\n\n console.log(chalk.green(\"✓ Synced (0 files)\"));\n\n return { removedCount };\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload, ApiRequestError } from \"../../lib/api\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show status of cloud volume\")\n .action(\n withErrorHandler(async () => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n if (config.type !== \"volume\") {\n throw new Error(\n \"This directory is initialized as an artifact, not a volume\",\n { cause: new Error(\"Use: vm0 artifact status\") },\n );\n }\n\n // Start message\n console.log(`Checking volume: ${config.name}`);\n\n // Call API\n try {\n const info = await getStorageDownload({\n name: config.name,\n type: \"volume\",\n });\n const shortVersion = info.versionId.slice(0, 8);\n\n if (\"empty\" in info) {\n console.log(chalk.green(\"✓ Found (empty)\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n } else {\n console.log(chalk.green(\"✓ Found\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${info.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(info.size)}`));\n }\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"Not found on remote\", {\n cause: new Error(\"Run: vm0 volume push\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listStorages } from \"../../lib/api\";\nimport { formatBytes, formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all remote volumes\")\n .action(\n withErrorHandler(async () => {\n // Call API\n const items = await listStorages({ type: \"volume\" });\n\n if (items.length === 0) {\n console.log(chalk.dim(\"No volumes found\"));\n console.log(\n chalk.dim(\" Create one with: vm0 volume init && vm0 volume push\"),\n );\n return;\n }\n\n // Calculate column widths\n const nameWidth = Math.max(\n 4,\n ...items.map((i) => {\n return i.name.length;\n }),\n );\n const sizeWidth = Math.max(\n 4,\n ...items.map((i) => {\n return formatBytes(i.size).length;\n }),\n );\n const filesWidth = Math.max(\n 5,\n ...items.map((i) => {\n return i.fileCount.toString().length;\n }),\n );\n\n // Print header\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"SIZE\".padStart(sizeWidth),\n \"FILES\".padStart(filesWidth),\n \"UPDATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const item of items) {\n const row = [\n item.name.padEnd(nameWidth),\n formatBytes(item.size).padStart(sizeWidth),\n item.fileCount.toString().padStart(filesWidth),\n formatRelativeTime(item.updatedAt),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const cloneCommand = new Command()\n .name(\"clone\")\n .description(\"Clone a remote volume to local directory (latest version)\")\n .argument(\"<name>\", \"Volume name to clone\")\n .argument(\"[destination]\", \"Destination directory (default: volume name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n // Use volume name as destination if not specified\n const targetDir = destination || name;\n\n console.log(`Cloning volume: ${name}`);\n\n const result = await cloneStorage(name, \"volume\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully cloned volume: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { writeStorageConfig, type StorageType } from \"./storage-utils\";\nimport { getStorageDownload } from \"../api\";\nimport {\n listTarFiles,\n formatBytes,\n checkDirectoryStatus,\n} from \"../utils/file-utils\";\n\ninterface CloneOptions {\n version?: string;\n}\n\ninterface CloneResult {\n success: boolean;\n fileCount: number;\n size: number;\n versionId: string;\n}\n\n/**\n * Clone a remote storage to a local directory\n * Creates the directory, downloads contents, and initializes .vm0 config\n */\nexport async function cloneStorage(\n name: string,\n type: StorageType,\n destination: string,\n options: CloneOptions = {},\n): Promise<CloneResult> {\n const typeLabel = type;\n\n // Check if destination already exists and is non-empty\n const dirStatus = checkDirectoryStatus(destination);\n if (dirStatus.exists && !dirStatus.empty) {\n throw new Error(`Directory \"${destination}\" is not empty`);\n }\n\n // Check if storage exists on remote\n console.log(chalk.dim(`Checking remote ${typeLabel}...`));\n\n const downloadInfo = await getStorageDownload({\n name,\n type,\n version: options.version,\n });\n\n // Create destination directory\n console.log(chalk.dim(`Creating directory: ${destination}/`));\n await fs.promises.mkdir(destination, { recursive: true });\n\n // Handle empty storage (type guard)\n if (\"empty\" in downloadInfo) {\n // Create .vm0 directory and config\n await writeStorageConfig(name, destination, type);\n\n console.log(chalk.green(`✓ Cloned empty ${typeLabel}: ${name}`));\n console.log(chalk.dim(`✓ Initialized .vm0/storage.yaml`));\n\n return {\n success: true,\n fileCount: 0,\n size: 0,\n versionId: downloadInfo.versionId,\n };\n }\n\n // TypeScript now knows downloadInfo has url property\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n // Clean up directory on failure\n await fs.promises.rm(destination, { recursive: true, force: true });\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-clone-\"));\n const tarPath = path.join(tmpDir, \"archive.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get file list from tar\n const files = await listTarFiles(tarPath);\n\n // Extract tar.gz to destination\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: destination,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${files.length} files`));\n\n // Create .vm0 directory and config\n await writeStorageConfig(name, destination, type);\n console.log(chalk.green(`✓ Initialized .vm0/storage.yaml`));\n\n return {\n success: true,\n fileCount: downloadInfo.fileCount,\n size: downloadInfo.size,\n versionId: downloadInfo.versionId,\n };\n}\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init\";\nimport { pushCommand } from \"./push\";\nimport { pullCommand } from \"./pull\";\nimport { statusCommand } from \"./status\";\nimport { listCommand } from \"./list\";\nimport { cloneCommand } from \"./clone\";\n\nexport const artifactCommand = new Command()\n .name(\"artifact\")\n .description(\"Manage artifacts (specified at run, versioned after run)\")\n .addCommand(initCommand)\n .addCommand(pushCommand)\n .addCommand(pullCommand)\n .addCommand(statusCommand)\n .addCommand(listCommand)\n .addCommand(cloneCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport {\n isValidStorageName,\n writeStorageConfig,\n readStorageConfig,\n} from \"../../lib/storage/storage-utils\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize an artifact in the current directory\")\n .option(\n \"-n, --name <name>\",\n \"Artifact name (required in non-interactive mode)\",\n )\n .action(\n withErrorHandler(async (options: { name?: string }) => {\n const cwd = process.cwd();\n const dirName = path.basename(cwd);\n\n // Check if config already exists\n const existingConfig = await readStorageConfig(cwd);\n if (existingConfig) {\n if (existingConfig.type === \"artifact\") {\n console.log(\n chalk.yellow(\n `Artifact already initialized: ${existingConfig.name}`,\n ),\n );\n } else {\n console.log(\n chalk.yellow(\n `Directory already initialized as volume: ${existingConfig.name}`,\n ),\n );\n console.log(\n chalk.dim(\n \" To change type, delete .vm0/storage.yaml and reinitialize\",\n ),\n );\n }\n console.log(\n chalk.dim(`Config file: ${path.join(cwd, \".vm0\", \"storage.yaml\")}`),\n );\n return;\n }\n\n // Determine artifact name\n let artifactName: string;\n\n if (options.name) {\n // Use provided name (non-interactive mode)\n artifactName = options.name;\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 artifact init --name <artifact-name>\"),\n });\n } else {\n // Interactive prompt with directory name as default\n const defaultName = isValidStorageName(dirName) ? dirName : undefined;\n const name = await promptText(\n \"Enter artifact name\",\n defaultName,\n (value: string) => {\n if (!isValidStorageName(value)) {\n return \"Must be 3-64 characters, lowercase alphanumeric with hyphens\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n artifactName = name;\n }\n\n // Validate name\n if (!isValidStorageName(artifactName)) {\n throw new Error(`Invalid artifact name: \"${artifactName}\"`, {\n cause: new Error(\n \"Artifact names must be 3-64 characters, lowercase alphanumeric with hyphens\",\n ),\n });\n }\n\n // Write config file with type: artifact\n await writeStorageConfig(artifactName, cwd, \"artifact\");\n\n console.log(chalk.green(`✓ Initialized artifact: ${artifactName}`));\n console.log(\n chalk.dim(\n ` Config saved to ${path.join(cwd, \".vm0\", \"storage.yaml\")}`,\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { directUpload } from \"../../lib/storage/direct-upload\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pushCommand = new Command()\n .name(\"push\")\n .description(\"Push local files to cloud artifact\")\n .option(\n \"-f, --force\",\n \"Force upload even if content unchanged (recreate archive)\",\n )\n .action(\n withErrorHandler(async (options: { force?: boolean }) => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume push\") },\n );\n }\n\n console.log(`Pushing artifact: ${config.name}`);\n\n // Perform direct S3 upload\n const result = await directUpload(config.name, \"artifact\", cwd, {\n onProgress: (message) => {\n console.log(chalk.dim(message));\n },\n force: options.force,\n });\n\n // Display short version (8 characters) by default\n const shortVersion = result.versionId.slice(0, 8);\n\n if (result.empty) {\n console.log(chalk.dim(\"No files found (empty artifact)\"));\n } else if (result.deduplicated) {\n console.log(chalk.green(\"✓ Content unchanged (deduplicated)\"));\n } else {\n console.log(chalk.green(\"✓ Upload complete\"));\n }\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${result.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(result.size)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload } from \"../../lib/api\";\nimport {\n formatBytes,\n listTarFiles,\n removeExtraFiles,\n} from \"../../lib/utils/file-utils\";\nimport { handleEmptyStorageResponse } from \"../../lib/storage/pull-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pullCommand = new Command()\n .name(\"pull\")\n .description(\"Pull cloud artifact to local directory\")\n .argument(\"[versionId]\", \"Version ID to pull (default: latest)\")\n .action(\n withErrorHandler(async (versionId?: string) => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume pull\") },\n );\n }\n\n if (versionId) {\n console.log(`Pulling artifact: ${config.name} (version: ${versionId})`);\n } else {\n console.log(`Pulling artifact: ${config.name}`);\n }\n\n // Get download URL from API\n console.log(chalk.dim(\"Getting download URL...\"));\n\n const downloadInfo = await getStorageDownload({\n name: config.name,\n type: \"artifact\",\n version: versionId,\n });\n\n // Handle empty artifact\n if (\"empty\" in downloadInfo) {\n await handleEmptyStorageResponse(cwd);\n return;\n }\n\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download directly from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"artifact.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get remote files list for sync\n console.log(chalk.dim(\"Syncing local files...\"));\n const remoteFiles = await listTarFiles(tarPath);\n const remoteFilesSet = new Set(\n remoteFiles.map((f) => {\n return f.replace(/\\\\/g, \"/\");\n }),\n );\n\n // Remove local files not in remote\n const removedCount = await removeExtraFiles(cwd, remoteFilesSet);\n if (removedCount > 0) {\n console.log(\n chalk.green(`✓ Removed ${removedCount} files not in remote`),\n );\n }\n\n // Extract tar.gz\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: cwd,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${remoteFiles.length} files`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload, ApiRequestError } from \"../../lib/api\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show status of cloud artifact\")\n .action(\n withErrorHandler(async () => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume status\") },\n );\n }\n\n // Start message\n console.log(`Checking artifact: ${config.name}`);\n\n // Call API\n try {\n const info = await getStorageDownload({\n name: config.name,\n type: \"artifact\",\n });\n const shortVersion = info.versionId.slice(0, 8);\n\n if (\"empty\" in info) {\n console.log(chalk.green(\"✓ Found (empty)\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n } else {\n console.log(chalk.green(\"✓ Found\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${info.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(info.size)}`));\n }\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"Not found on remote\", {\n cause: new Error(\"Run: vm0 artifact push\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listStorages } from \"../../lib/api\";\nimport { formatBytes, formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all remote artifacts\")\n .action(\n withErrorHandler(async () => {\n // Call API\n const items = await listStorages({ type: \"artifact\" });\n\n if (items.length === 0) {\n console.log(chalk.dim(\"No artifacts found\"));\n console.log(\n chalk.dim(\n \" Create one with: vm0 artifact init && vm0 artifact push\",\n ),\n );\n return;\n }\n\n // Calculate column widths\n const nameWidth = Math.max(\n 4,\n ...items.map((i) => {\n return i.name.length;\n }),\n );\n const sizeWidth = Math.max(\n 4,\n ...items.map((i) => {\n return formatBytes(i.size).length;\n }),\n );\n const filesWidth = Math.max(\n 5,\n ...items.map((i) => {\n return i.fileCount.toString().length;\n }),\n );\n\n // Print header\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"SIZE\".padStart(sizeWidth),\n \"FILES\".padStart(filesWidth),\n \"UPDATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const item of items) {\n const row = [\n item.name.padEnd(nameWidth),\n formatBytes(item.size).padStart(sizeWidth),\n item.fileCount.toString().padStart(filesWidth),\n formatRelativeTime(item.updatedAt),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const cloneCommand = new Command()\n .name(\"clone\")\n .description(\"Clone a remote artifact to local directory (latest version)\")\n .argument(\"<name>\", \"Artifact name to clone\")\n .argument(\"[destination]\", \"Destination directory (default: artifact name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n // Use artifact name as destination if not specified\n const targetDir = destination || name;\n\n console.log(`Cloning artifact: ${name}`);\n\n const result = await cloneStorage(name, \"artifact\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully cloned artifact: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init\";\nimport { pushCommand } from \"./push\";\nimport { pullCommand } from \"./pull\";\nimport { statusCommand } from \"./status\";\nimport { listCommand } from \"./list\";\nimport { cloneCommand } from \"./clone\";\n\nexport const memoryCommand = new Command()\n .name(\"memory\")\n .description(\"Manage agent long-term memory\")\n .addCommand(initCommand)\n .addCommand(pushCommand)\n .addCommand(pullCommand)\n .addCommand(statusCommand)\n .addCommand(listCommand)\n .addCommand(cloneCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport {\n isValidStorageName,\n writeStorageConfig,\n readStorageConfig,\n} from \"../../lib/storage/storage-utils\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize a memory in the current directory\")\n .option(\"-n, --name <name>\", \"Memory name (required in non-interactive mode)\")\n .action(\n withErrorHandler(async (options: { name?: string }) => {\n const cwd = process.cwd();\n const dirName = path.basename(cwd);\n\n // Check if config already exists\n const existingConfig = await readStorageConfig(cwd);\n if (existingConfig) {\n if (existingConfig.type === \"memory\") {\n console.log(\n chalk.yellow(`Memory already initialized: ${existingConfig.name}`),\n );\n } else {\n console.log(\n chalk.yellow(\n `Directory already initialized as ${existingConfig.type}: ${existingConfig.name}`,\n ),\n );\n console.log(\n chalk.dim(\n \" To change type, delete .vm0/storage.yaml and reinitialize\",\n ),\n );\n }\n console.log(\n chalk.dim(`Config file: ${path.join(cwd, \".vm0\", \"storage.yaml\")}`),\n );\n return;\n }\n\n // Determine memory name\n let memoryName: string;\n\n if (options.name) {\n memoryName = options.name;\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 memory init --name <memory-name>\"),\n });\n } else {\n // Interactive prompt with directory name as default\n const defaultName = isValidStorageName(dirName) ? dirName : undefined;\n const name = await promptText(\n \"Enter memory name\",\n defaultName,\n (value: string) => {\n if (!isValidStorageName(value)) {\n return \"Must be 3-64 characters, lowercase alphanumeric with hyphens\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n memoryName = name;\n }\n\n // Validate name\n if (!isValidStorageName(memoryName)) {\n throw new Error(`Invalid memory name: \"${memoryName}\"`, {\n cause: new Error(\n \"Memory names must be 3-64 characters, lowercase alphanumeric with hyphens\",\n ),\n });\n }\n\n // Write config file with type: memory\n await writeStorageConfig(memoryName, cwd, \"memory\");\n\n console.log(chalk.green(`✓ Initialized memory: ${memoryName}`));\n console.log(\n chalk.dim(\n ` Config saved to ${path.join(cwd, \".vm0\", \"storage.yaml\")}`,\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { directUpload } from \"../../lib/storage/direct-upload\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pushCommand = new Command()\n .name(\"push\")\n .description(\"Push local files to cloud memory\")\n .option(\n \"-f, --force\",\n \"Force upload even if content unchanged (recreate archive)\",\n )\n .action(\n withErrorHandler(async (options: { force?: boolean }) => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No memory initialized in this directory\", {\n cause: new Error(\"Run: vm0 memory init\"),\n });\n }\n\n if (config.type !== \"memory\") {\n throw new Error(\n `This directory is initialized as ${config.type === \"artifact\" ? \"an artifact\" : \"a volume\"}, not a memory`,\n { cause: new Error(`Use: vm0 ${config.type} push`) },\n );\n }\n\n console.log(`Pushing memory: ${config.name}`);\n\n // Perform direct S3 upload\n const result = await directUpload(config.name, \"memory\", cwd, {\n onProgress: (message) => {\n console.log(chalk.dim(message));\n },\n force: options.force,\n });\n\n // Display short version (8 characters) by default\n const shortVersion = result.versionId.slice(0, 8);\n\n if (result.empty) {\n console.log(chalk.dim(\"No files found (empty memory)\"));\n } else if (result.deduplicated) {\n console.log(chalk.green(\"✓ Content unchanged (deduplicated)\"));\n } else {\n console.log(chalk.green(\"✓ Upload complete\"));\n }\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${result.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(result.size)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pullCommand = new Command()\n .name(\"pull\")\n .description(\"Pull remote memory to local directory (latest version)\")\n .argument(\"[name]\", \"Memory name to pull\", \"memory\")\n .argument(\"[destination]\", \"Destination directory (default: memory name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n const targetDir = destination || name;\n\n console.log(`Pulling memory: ${name}`);\n\n const result = await cloneStorage(name, \"memory\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully pulled memory: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload, ApiRequestError } from \"../../lib/api\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show status of cloud memory\")\n .action(\n withErrorHandler(async () => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No memory initialized in this directory\", {\n cause: new Error(\"Run: vm0 memory init\"),\n });\n }\n\n if (config.type !== \"memory\") {\n throw new Error(\n `This directory is initialized as ${config.type === \"artifact\" ? \"an artifact\" : \"a volume\"}, not a memory`,\n { cause: new Error(`Use: vm0 ${config.type} status`) },\n );\n }\n\n // Start message\n console.log(`Checking memory: ${config.name}`);\n\n // Call API\n try {\n const info = await getStorageDownload({\n name: config.name,\n type: \"memory\",\n });\n const shortVersion = info.versionId.slice(0, 8);\n\n if (\"empty\" in info) {\n console.log(chalk.green(\"✓ Found (empty)\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n } else {\n console.log(chalk.green(\"✓ Found\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${info.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(info.size)}`));\n }\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"Not found on remote\", {\n cause: new Error(\"Run: vm0 memory push\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listStorages } from \"../../lib/api\";\nimport { formatBytes, formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all remote memory storages\")\n .action(\n withErrorHandler(async () => {\n const items = await listStorages({ type: \"memory\" });\n\n if (items.length === 0) {\n console.log(chalk.dim(\"No memory storages found\"));\n console.log(\n chalk.dim(\" Memory is created automatically on first agent run\"),\n );\n return;\n }\n\n // Calculate column widths\n const nameWidth = Math.max(\n 4,\n ...items.map((i) => {\n return i.name.length;\n }),\n );\n const sizeWidth = Math.max(\n 4,\n ...items.map((i) => {\n return formatBytes(i.size).length;\n }),\n );\n const filesWidth = Math.max(\n 5,\n ...items.map((i) => {\n return i.fileCount.toString().length;\n }),\n );\n\n // Print header\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"SIZE\".padStart(sizeWidth),\n \"FILES\".padStart(filesWidth),\n \"UPDATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const item of items) {\n const row = [\n item.name.padEnd(nameWidth),\n formatBytes(item.size).padStart(sizeWidth),\n item.fileCount.toString().padStart(filesWidth),\n formatRelativeTime(item.updatedAt),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const cloneCommand = new Command()\n .name(\"clone\")\n .description(\"Clone a remote memory to local directory (latest version)\")\n .argument(\"<name>\", \"Memory name to clone\")\n .argument(\"[destination]\", \"Destination directory (default: memory name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n // Use memory name as destination if not specified\n const targetDir = destination || name;\n\n console.log(`Cloning memory: ${name}`);\n\n const result = await cloneStorage(name, \"memory\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully cloned memory: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import { cookAction } from \"./cook\";\nimport { logsCommand } from \"./logs\";\nimport { continueCommand } from \"./continue\";\nimport { resumeCommand } from \"./resume\";\n\n// Add subcommands to the cook command\ncookAction.addCommand(logsCommand);\ncookAction.addCommand(continueCommand);\ncookAction.addCommand(resumeCommand);\n\nexport const cookCommand = cookAction;\n","import { Command, Option } from \"commander\";\nimport chalk from \"chalk\";\nimport { readFile, mkdir } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { validateAgentCompose } from \"../../lib/domain/yaml-validator\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { checkAndUpgrade } from \"../../lib/utils/update-checker\";\nimport { saveCookState } from \"../../lib/domain/cook-state\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n CONFIG_FILE,\n ARTIFACT_DIR,\n printCommand,\n execVm0Command,\n execVm0RunWithCapture,\n parseRunIdsFromOutput,\n autoPullArtifact,\n} from \"./utils\";\n\ndeclare const __CLI_VERSION__: string;\n\ninterface VolumeConfig {\n name: string;\n version: string;\n}\n\ninterface AgentConfig {\n description?: string;\n framework: string;\n volumes?: string[];\n environment?: Record<string, string>;\n}\n\ninterface AgentComposeConfig {\n version: string;\n agents: Record<string, AgentConfig>;\n volumes?: Record<string, VolumeConfig>;\n}\n\ninterface LoadedConfig {\n config: AgentComposeConfig;\n agentName: string;\n volumeCount: number;\n}\n\n/**\n * Load and validate the compose config file.\n * Returns parsed config or exits on error.\n */\nasync function loadAndValidateConfig(): Promise<LoadedConfig> {\n console.log(chalk.bold(`Reading config: ${CONFIG_FILE}`));\n\n if (!existsSync(CONFIG_FILE)) {\n throw new Error(`Config file not found: ${CONFIG_FILE}`);\n }\n\n let config: AgentComposeConfig;\n try {\n const content = await readFile(CONFIG_FILE, \"utf8\");\n config = parseYaml(content) as AgentComposeConfig;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\"Invalid YAML format\", { cause: error });\n }\n throw new Error(\"Invalid YAML format\");\n }\n\n const validation = validateAgentCompose(config);\n if (!validation.valid) {\n throw new Error(validation.error);\n }\n\n const agentNames = Object.keys(config.agents);\n const agentName = agentNames[0]!;\n const volumeCount = config.volumes ? Object.keys(config.volumes).length : 0;\n\n console.log(\n chalk.green(`✓ Config validated: 1 agent, ${volumeCount} volume(s)`),\n );\n\n return { config, agentName, volumeCount };\n}\n\n/**\n * Process and push all volumes defined in config.\n */\nasync function processVolumes(\n config: AgentComposeConfig,\n cwd: string,\n): Promise<void> {\n if (!config.volumes || Object.keys(config.volumes).length === 0) {\n return;\n }\n\n console.log();\n console.log(chalk.bold(\"Processing volumes:\"));\n\n for (const volumeConfig of Object.values(config.volumes)) {\n const volumeDir = path.join(cwd, volumeConfig.name);\n\n if (!existsSync(volumeDir)) {\n throw new Error(`Directory not found: ${volumeConfig.name}`, {\n cause: new Error(\"Create the directory and add files first\"),\n });\n }\n\n try {\n printCommand(`cd ${volumeConfig.name}`);\n\n // Check if already initialized\n const existingConfig = await readStorageConfig(volumeDir);\n if (!existingConfig) {\n printCommand(`vm0 volume init --name ${volumeConfig.name}`);\n await execVm0Command([\"volume\", \"init\", \"--name\", volumeConfig.name], {\n cwd: volumeDir,\n silent: true,\n });\n }\n\n // Push volume\n printCommand(\"vm0 volume push\");\n await execVm0Command([\"volume\", \"push\"], {\n cwd: volumeDir,\n silent: true,\n });\n\n printCommand(\"cd ..\");\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\"Volume processing failed\", { cause: error });\n }\n throw error;\n }\n }\n}\n\n/**\n * Initialize and push artifact directory.\n */\nasync function processArtifact(cwd: string): Promise<string> {\n console.log();\n console.log(chalk.bold(\"Processing artifact:\"));\n\n const artifactDir = path.join(cwd, ARTIFACT_DIR);\n\n try {\n // Create directory if not exists\n if (!existsSync(artifactDir)) {\n printCommand(`mkdir ${ARTIFACT_DIR}`);\n await mkdir(artifactDir, { recursive: true });\n }\n\n printCommand(`cd ${ARTIFACT_DIR}`);\n\n // Check if already initialized\n const existingConfig = await readStorageConfig(artifactDir);\n if (!existingConfig) {\n printCommand(`vm0 artifact init --name ${ARTIFACT_DIR}`);\n await execVm0Command([\"artifact\", \"init\", \"--name\", ARTIFACT_DIR], {\n cwd: artifactDir,\n silent: true,\n });\n }\n\n // Push artifact\n printCommand(\"vm0 artifact push\");\n await execVm0Command([\"artifact\", \"push\"], {\n cwd: artifactDir,\n silent: true,\n });\n\n printCommand(\"cd ..\");\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\"Artifact processing failed\", { cause: error });\n }\n throw error;\n }\n\n return artifactDir;\n}\n\n/**\n * Compose the agent using vm0 compose command.\n */\nasync function composeAgent(cwd: string, skipConfirm: boolean): Promise<void> {\n console.log();\n console.log(chalk.bold(\"Composing agent:\"));\n const composeArgs = skipConfirm\n ? [\"compose\", \"--yes\", CONFIG_FILE]\n : [\"compose\", CONFIG_FILE];\n printCommand(`vm0 ${composeArgs.join(\" \")}`);\n\n try {\n await execVm0Command(composeArgs, { cwd });\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\"Compose failed\", { cause: error });\n }\n throw error;\n }\n}\n\n/**\n * Run the agent with the given prompt.\n */\nasync function runAgent(\n agentName: string,\n artifactDir: string,\n prompt: string,\n cwd: string,\n options: {\n envFile?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n },\n): Promise<void> {\n console.log();\n console.log(chalk.bold(\"Running agent:\"));\n printCommand(\n `vm0 run ${agentName} --artifact-name ${ARTIFACT_DIR} \"${prompt}\"`,\n );\n console.log();\n\n const runArgs = [\n \"run\",\n agentName,\n \"--artifact-name\",\n ARTIFACT_DIR,\n ...(options.envFile ? [\"--env-file\", options.envFile] : []),\n ...(options.verbose ? [\"--verbose\"] : []),\n ...(options.debugNoMockClaude ? [\"--debug-no-mock-claude\"] : []),\n prompt,\n ];\n const runOutput = await execVm0RunWithCapture(runArgs, { cwd });\n\n // Save session state for continue/resume commands\n const runIds = parseRunIdsFromOutput(runOutput);\n if (runIds.runId || runIds.sessionId || runIds.checkpointId) {\n await saveCookState({\n lastRunId: runIds.runId,\n lastSessionId: runIds.sessionId,\n lastCheckpointId: runIds.checkpointId,\n });\n }\n\n // Auto-pull artifact if run completed with artifact changes\n await autoPullArtifact(runOutput, artifactDir);\n}\n\nexport const cookAction = new Command()\n .name(\"cook\")\n .description(\"Quick start: prepare, compose and run agent from vm0.yaml\")\n .argument(\"[prompt]\", \"Prompt for the agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-v, --verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--no-auto-update\").hideHelp())\n .action(\n withErrorHandler(\n async (\n prompt: string | undefined,\n options: {\n envFile?: string;\n yes?: boolean;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n autoUpdate?: boolean;\n },\n ) => {\n // Step 0: Check for updates and auto-upgrade if needed\n // Note: --no-auto-update sets autoUpdate to false\n if (options.autoUpdate !== false) {\n const shouldExit = await checkAndUpgrade(__CLI_VERSION__, prompt);\n if (shouldExit) {\n process.exit(0);\n }\n }\n\n const cwd = process.cwd();\n\n // Step 1: Load and validate config\n const { config, agentName } = await loadAndValidateConfig();\n\n // Step 2: Process volumes\n await processVolumes(config, cwd);\n\n // Step 3: Process artifact\n const artifactDir = await processArtifact(cwd);\n\n // Step 4: Compose agent\n await composeAgent(cwd, options.yes ?? false);\n\n // Step 5: Run agent (if prompt provided)\n if (prompt) {\n await runAgent(agentName, artifactDir, prompt, cwd, {\n envFile: options.envFile,\n verbose: options.verbose,\n debugNoMockClaude: options.debugNoMockClaude,\n });\n } else {\n console.log();\n console.log(\"To run your agent:\");\n printCommand(\n `vm0 run ${agentName} --artifact-name ${ARTIFACT_DIR} \"your prompt\"`,\n );\n }\n },\n ),\n );\n","import { homedir } from \"os\";\nimport { join } from \"path\";\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { existsSync } from \"fs\";\n\nconst CONFIG_DIR = join(homedir(), \".vm0\");\nconst COOK_STATE_FILE = join(CONFIG_DIR, \"cook.json\");\nconst STALE_THRESHOLD_MS = 48 * 60 * 60 * 1000; // 48 hours\n\n// Public API interface (unchanged for backward compatibility)\ninterface CookState {\n lastRunId?: string;\n lastSessionId?: string;\n lastCheckpointId?: string;\n}\n\n// Internal storage structure\ninterface CookStateEntry {\n lastRunId?: string;\n lastSessionId?: string;\n lastCheckpointId?: string;\n lastActiveAt: number;\n}\n\ninterface CookStateFile {\n ppid: Record<string, CookStateEntry>;\n}\n\n/**\n * Load cook state file with automatic migration from old format\n */\nasync function loadCookStateFile(): Promise<CookStateFile> {\n if (!existsSync(COOK_STATE_FILE)) {\n return { ppid: {} };\n }\n\n try {\n const content = await readFile(COOK_STATE_FILE, \"utf8\");\n const data = JSON.parse(content) as Record<string, unknown>;\n\n // Detect old format (no ppid field)\n if (!data.ppid) {\n // Migrate old data to current PPID\n const oldState = data as CookState;\n return {\n ppid: {\n [String(process.ppid)]: {\n lastRunId: oldState.lastRunId,\n lastSessionId: oldState.lastSessionId,\n lastCheckpointId: oldState.lastCheckpointId,\n lastActiveAt: Date.now(),\n },\n },\n };\n }\n\n return data as unknown as CookStateFile;\n } catch {\n // If file is corrupted, return empty state\n return { ppid: {} };\n }\n}\n\nexport async function loadCookState(): Promise<CookState> {\n const file = await loadCookStateFile();\n const ppid = String(process.ppid);\n const entry = file.ppid[ppid];\n\n if (!entry) return {};\n\n return {\n lastRunId: entry.lastRunId,\n lastSessionId: entry.lastSessionId,\n lastCheckpointId: entry.lastCheckpointId,\n };\n}\n\nexport async function saveCookState(state: CookState): Promise<void> {\n // Ensure config directory exists\n await mkdir(CONFIG_DIR, { recursive: true });\n\n const file = await loadCookStateFile();\n const ppid = String(process.ppid);\n const now = Date.now();\n\n // Clean up stale entries (older than 48 hours)\n for (const key of Object.keys(file.ppid)) {\n const entry = file.ppid[key];\n if (entry && now - entry.lastActiveAt > STALE_THRESHOLD_MS) {\n delete file.ppid[key];\n }\n }\n\n // Merge with existing entry for this PPID\n const existing = file.ppid[ppid];\n file.ppid[ppid] = {\n lastRunId: state.lastRunId ?? existing?.lastRunId,\n lastSessionId: state.lastSessionId ?? existing?.lastSessionId,\n lastCheckpointId: state.lastCheckpointId ?? existing?.lastCheckpointId,\n lastActiveAt: now,\n };\n\n // Write state file\n await writeFile(COOK_STATE_FILE, JSON.stringify(file, null, 2), \"utf8\");\n}\n","import chalk from \"chalk\";\nimport { existsSync } from \"fs\";\nimport { safeSpawn } from \"../../lib/utils/spawn\";\n\nexport const CONFIG_FILE = \"vm0.yaml\";\nexport const ARTIFACT_DIR = \"artifact\";\n\n/**\n * Print a command hint for tutorial output\n */\nexport function printCommand(cmd: string): void {\n console.log(chalk.dim(`> ${cmd}`));\n}\n\n/**\n * Execute a vm0 command in a subprocess\n * Returns stdout on success, throws on failure with stderr\n *\n * @param options.silent - If true, capture stdout/stderr (no output to terminal)\n */\nexport function execVm0Command(\n args: string[],\n options: { cwd?: string; silent?: boolean } = {},\n): Promise<string> {\n return new Promise((resolve, reject) => {\n // Determine stdio configuration:\n // - silent: pipe all (capture output, no terminal interaction)\n // - default: inherit all (full terminal passthrough, allows prompts)\n const stdio: \"pipe\" | \"inherit\" = options.silent ? \"pipe\" : \"inherit\";\n\n const proc = safeSpawn(\"vm0\", args, {\n cwd: options.cwd,\n stdio,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n if (options.silent) {\n proc.stdout?.on(\"data\", (data: Buffer) => {\n stdout += data.toString();\n });\n proc.stderr?.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n }\n\n proc.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(stderr || `Command failed with exit code ${code}`));\n }\n });\n\n proc.on(\"error\", (err) => {\n reject(err);\n });\n });\n}\n\n/**\n * Execute vm0 run command while capturing output for artifact version parsing\n * Streams output to console while also capturing it\n * Returns the captured stdout\n */\nexport function execVm0RunWithCapture(\n args: string[],\n options: { cwd?: string } = {},\n): Promise<string> {\n return new Promise((resolve, reject) => {\n // Force color output when parent is a TTY, since piped stdio disables TTY detection\n const env = process.stdout.isTTY\n ? { ...process.env, FORCE_COLOR: \"1\" }\n : process.env;\n\n const proc = safeSpawn(\"vm0\", args, {\n cwd: options.cwd,\n env,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n proc.stdout?.on(\"data\", (data: Buffer) => {\n const chunk = data.toString();\n stdout += chunk;\n process.stdout.write(chunk);\n });\n\n proc.stderr?.on(\"data\", (data: Buffer) => {\n const chunk = data.toString();\n stderr += chunk;\n process.stderr.write(chunk);\n });\n\n proc.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(stderr || `Command failed with exit code ${code}`));\n }\n });\n\n proc.on(\"error\", (err) => {\n reject(err);\n });\n });\n}\n\n/**\n * Parse artifact version from vm0 run completion output\n * Looks for pattern like:\n * ✓ Run completed successfully\n * ...\n * Artifact:\n * artifactName: abc12345\n * Returns the version string (8 char truncated hash)\n */\nfunction parseArtifactVersionFromCompletion(\n output: string,\n artifactName: string,\n): string | null {\n // Find the completion section marker\n const completionMarker = \"Run completed successfully\";\n const completionIndex = output.indexOf(completionMarker);\n if (completionIndex === -1) return null;\n\n // Get the completion section\n const section = output.slice(completionIndex);\n\n // Look for Artifact section and extract version\n // Pattern: \" artifactName: version\" (with ANSI codes possibly)\n const artifactPattern = new RegExp(\n `^\\\\s*${escapeRegExp(artifactName)}:\\\\s*(?:\\\\x1b\\\\[[0-9;]*m)?([a-f0-9]+)`,\n \"m\",\n );\n const match = section.match(artifactPattern);\n return match ? match[1]! : null;\n}\n\n/**\n * Escape special regex characters in a string\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Parse run IDs from vm0 run completion output\n * Extracts runId, sessionId, and checkpointId from the \"Next steps\" section\n */\ninterface ParsedRunIds {\n runId?: string;\n sessionId?: string;\n checkpointId?: string;\n}\n\nexport function parseRunIdsFromOutput(output: string): ParsedRunIds {\n const completionMarker = \"Run completed successfully\";\n const completionIndex = output.indexOf(completionMarker);\n if (completionIndex === -1) return {};\n\n const section = output.slice(completionIndex);\n\n // Strip ANSI codes for reliable matching\n // ESC character (0x1B) followed by [ and ANSI sequence\n const ESC = String.fromCharCode(0x1b);\n const ansiPattern = new RegExp(`${ESC}\\\\[[0-9;]*m`, \"g\");\n const stripped = section.replace(ansiPattern, \"\");\n\n return {\n runId: stripped.match(/vm0 logs ([0-9a-f-]{36})/)?.[1],\n sessionId: stripped.match(/vm0 run continue ([0-9a-f-]{36})/)?.[1],\n checkpointId: stripped.match(/vm0 run resume ([0-9a-f-]{36})/)?.[1],\n };\n}\n\n/**\n * Auto-pull artifact after a successful run\n */\nexport async function autoPullArtifact(\n runOutput: string,\n artifactDir: string,\n): Promise<void> {\n const serverVersion = parseArtifactVersionFromCompletion(\n runOutput,\n ARTIFACT_DIR,\n );\n\n if (serverVersion && existsSync(artifactDir)) {\n console.log();\n console.log(chalk.bold(\"Pulling updated artifact:\"));\n printCommand(`cd ${ARTIFACT_DIR}`);\n printCommand(`vm0 artifact pull ${serverVersion}`);\n\n try {\n await execVm0Command([\"artifact\", \"pull\", serverVersion], {\n cwd: artifactDir,\n silent: true,\n });\n printCommand(\"cd ..\");\n } catch (error) {\n console.error(chalk.red(`✗ Artifact pull failed`));\n if (error instanceof Error) {\n console.error(chalk.dim(` ${error.message}`));\n }\n // Don't exit - the run succeeded, pull is optional\n }\n }\n}\n","import { Command } from \"commander\";\nimport { loadCookState } from \"../../lib/domain/cook-state\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport { printCommand, execVm0Command } from \"./utils\";\n\nexport const logsCommand = new Command()\n .name(\"logs\")\n .description(\"View logs from the last cook run\")\n .option(\"-a, --agent\", \"Show agent events (default)\")\n .option(\"-s, --system\", \"Show system log\")\n .option(\"-m, --metrics\", \"Show metrics\")\n .option(\"-n, --network\", \"Show network logs (proxy traffic)\")\n .option(\n \"--since <time>\",\n \"Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--tail <n>\", \"Show last N entries (default: 5, max: 100)\")\n .option(\"--head <n>\", \"Show first N entries (max: 100)\")\n .action(\n withErrorHandler(\n async (options: {\n agent?: boolean;\n system?: boolean;\n metrics?: boolean;\n network?: boolean;\n since?: string;\n tail?: string;\n head?: string;\n }) => {\n const state = await loadCookState();\n if (!state.lastRunId) {\n throw new Error(\"No previous run found\", {\n cause: new Error(\"Run 'vm0 cook <prompt>' first\"),\n });\n }\n\n // Build command args\n const args = [\"logs\", state.lastRunId];\n const displayArgs = [`vm0 logs ${state.lastRunId}`];\n\n if (options.agent) {\n args.push(\"--agent\");\n displayArgs.push(\"--agent\");\n }\n if (options.system) {\n args.push(\"--system\");\n displayArgs.push(\"--system\");\n }\n if (options.metrics) {\n args.push(\"--metrics\");\n displayArgs.push(\"--metrics\");\n }\n if (options.network) {\n args.push(\"--network\");\n displayArgs.push(\"--network\");\n }\n if (options.since) {\n args.push(\"--since\", options.since);\n displayArgs.push(`--since ${options.since}`);\n }\n if (options.tail) {\n args.push(\"--tail\", options.tail);\n displayArgs.push(`--tail ${options.tail}`);\n }\n if (options.head) {\n args.push(\"--head\", options.head);\n displayArgs.push(`--head ${options.head}`);\n }\n\n printCommand(displayArgs.join(\" \"));\n await execVm0Command(args);\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport path from \"path\";\nimport { loadCookState, saveCookState } from \"../../lib/domain/cook-state\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n ARTIFACT_DIR,\n printCommand,\n execVm0RunWithCapture,\n parseRunIdsFromOutput,\n autoPullArtifact,\n} from \"./utils\";\n\nexport const continueCommand = new Command()\n .name(\"continue\")\n .description(\n \"Continue from the last session (latest conversation and artifact)\",\n )\n .argument(\"<prompt>\", \"Prompt for the continued agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\"-v, --verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .action(\n withErrorHandler(\n async (\n prompt: string,\n options: {\n envFile?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n },\n ) => {\n const state = await loadCookState();\n if (!state.lastSessionId) {\n throw new Error(\"No previous session found\", {\n cause: new Error(\"Run 'vm0 cook <prompt>' first\"),\n });\n }\n\n const cwd = process.cwd();\n const artifactDir = path.join(cwd, ARTIFACT_DIR);\n\n const envFileArg = options.envFile\n ? ` --env-file ${options.envFile}`\n : \"\";\n printCommand(\n `vm0 run continue${envFileArg} ${state.lastSessionId} \"${prompt}\"`,\n );\n console.log();\n\n const runOutput = await execVm0RunWithCapture(\n [\n \"run\",\n \"continue\",\n ...(options.envFile ? [\"--env-file\", options.envFile] : []),\n ...(options.verbose ? [\"--verbose\"] : []),\n state.lastSessionId,\n ...(options.debugNoMockClaude ? [\"--debug-no-mock-claude\"] : []),\n prompt,\n ],\n { cwd },\n );\n\n // Update state with new IDs\n const newIds = parseRunIdsFromOutput(runOutput);\n if (newIds.runId || newIds.sessionId || newIds.checkpointId) {\n await saveCookState({\n lastRunId: newIds.runId,\n lastSessionId: newIds.sessionId,\n lastCheckpointId: newIds.checkpointId,\n });\n }\n\n // Auto-pull artifact\n await autoPullArtifact(runOutput, artifactDir);\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport path from \"path\";\nimport { loadCookState, saveCookState } from \"../../lib/domain/cook-state\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n ARTIFACT_DIR,\n printCommand,\n execVm0RunWithCapture,\n parseRunIdsFromOutput,\n autoPullArtifact,\n} from \"./utils\";\n\nexport const resumeCommand = new Command()\n .name(\"resume\")\n .description(\n \"Resume from the last checkpoint (snapshotted conversation and artifact)\",\n )\n .argument(\"<prompt>\", \"Prompt for the resumed agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\"-v, --verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .action(\n withErrorHandler(\n async (\n prompt: string,\n options: {\n envFile?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n },\n ) => {\n const state = await loadCookState();\n if (!state.lastCheckpointId) {\n throw new Error(\"No previous checkpoint found\", {\n cause: new Error(\"Run 'vm0 cook <prompt>' first\"),\n });\n }\n\n const cwd = process.cwd();\n const artifactDir = path.join(cwd, ARTIFACT_DIR);\n\n const envFileArg = options.envFile\n ? ` --env-file ${options.envFile}`\n : \"\";\n printCommand(\n `vm0 run resume${envFileArg} ${state.lastCheckpointId} \"${prompt}\"`,\n );\n console.log();\n\n const runOutput = await execVm0RunWithCapture(\n [\n \"run\",\n \"resume\",\n ...(options.envFile ? [\"--env-file\", options.envFile] : []),\n ...(options.verbose ? [\"--verbose\"] : []),\n state.lastCheckpointId,\n ...(options.debugNoMockClaude ? [\"--debug-no-mock-claude\"] : []),\n prompt,\n ],\n { cwd },\n );\n\n // Update state with new IDs\n const newIds = parseRunIdsFromOutput(runOutput);\n if (newIds.runId || newIds.sessionId || newIds.checkpointId) {\n await saveCookState({\n lastRunId: newIds.runId,\n lastSessionId: newIds.sessionId,\n lastCheckpointId: newIds.checkpointId,\n });\n }\n\n // Auto-pull artifact\n await autoPullArtifact(runOutput, artifactDir);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getAgentEvents,\n getSystemLog,\n getMetrics,\n getNetworkLogs,\n type TelemetryMetric,\n type RunEvent,\n type NetworkLogEntry,\n} from \"../../lib/api\";\nimport { getApiUrl } from \"../../lib/api/config\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { ClaudeEventParser } from \"../../lib/events/claude-event-parser\";\nimport { EventRenderer } from \"../../lib/events/event-renderer\";\nimport { paginate } from \"../../lib/utils/paginate\";\nimport { searchCommand } from \"./search\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/**\n * Maximum entries per API request\n */\nconst PAGE_LIMIT = 100;\n\n/**\n * Build platform URL for logs viewer\n * Transforms API URL to platform URL and appends logs path\n */\nfunction buildPlatformLogsUrl(apiUrl: string, runId: string): string {\n const url = new URL(apiUrl);\n const hostname = url.hostname;\n\n // Handle localhost\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `http://${hostname}:3001/logs/${runId}`;\n }\n\n // Transform: www.vm0.ai → app.vm0.ai\n // vm0.ai → app.vm0.ai\n const parts = hostname.split(\".\");\n if (parts[0] === \"www\" || parts[0] === \"app\" || parts[0] === \"platform\") {\n parts[0] = \"app\";\n } else {\n parts.unshift(\"app\");\n }\n\n const platformHost = parts.join(\".\");\n const port = url.port ? `:${url.port}` : \"\";\n return `https://${platformHost}${port}/logs/${runId}`;\n}\n\n/**\n * Log type for mutually exclusive options\n */\ntype LogType = \"agent\" | \"system\" | \"metrics\" | \"network\";\n\n/**\n * Format a single metric line\n */\nfunction formatMetric(metric: TelemetryMetric): string {\n const memPercent = ((metric.mem_used / metric.mem_total) * 100).toFixed(1);\n const diskPercent = ((metric.disk_used / metric.disk_total) * 100).toFixed(1);\n\n return `[${metric.ts}] CPU: ${metric.cpu.toFixed(1)}% | Mem: ${formatBytes(metric.mem_used)}/${formatBytes(metric.mem_total)} (${memPercent}%) | Disk: ${formatBytes(metric.disk_used)}/${formatBytes(metric.disk_total)} (${diskPercent}%)`;\n}\n\n/**\n * Format a denied network request (blocked by firewall permission)\n */\nfunction formatNetworkDeny(entry: NetworkLogEntry): string {\n const method = entry.method || \"???\";\n const url = entry.url || entry.host || \"unknown\";\n const firewall = entry.firewall_name\n ? ` ${chalk.cyan(`[${entry.firewall_name}]`)}`\n : \"\";\n return `[${entry.timestamp}] ${method.padEnd(6)} ${chalk.red.bold(\"DENY\")} ${chalk.dim(url)}${firewall}`;\n}\n\n/**\n * Format auth resolution info (resolved secrets, refresh/cache status, URL rewrite)\n */\nfunction formatAuthInfo(entry: NetworkLogEntry): string {\n const tags: string[] = [];\n if (entry.auth_url_rewrite) {\n tags.push(\"url-rewrite\");\n }\n if (entry.auth_resolved_secrets && entry.auth_resolved_secrets.length > 0) {\n const refreshedSet = new Set(entry.auth_refreshed_secrets ?? []);\n for (const name of entry.auth_resolved_secrets) {\n if (refreshedSet.has(name)) {\n tags.push(`${name} (refreshed)`);\n } else if (entry.auth_cache_hit) {\n tags.push(`${name} (cached)`);\n } else {\n tags.push(name);\n }\n }\n }\n if (tags.length === 0) return \"\";\n return ` ${chalk.yellow(`\\u2194 ${tags.join(\", \")}`)}`;\n}\n\n/**\n * Format an ALLOW or ERROR network request with full HTTP details\n */\nfunction formatNetworkRequest(entry: NetworkLogEntry): string {\n let statusColor: typeof chalk.green;\n const status = entry.status || 0;\n if (status >= 200 && status < 300) {\n statusColor = chalk.green;\n } else if (status >= 300 && status < 400) {\n statusColor = chalk.yellow;\n } else if (status >= 400) {\n statusColor = chalk.red;\n } else {\n statusColor = chalk.gray;\n }\n\n let latencyColor: typeof chalk.green;\n const latencyMs = entry.latency_ms || 0;\n if (latencyMs < 500) {\n latencyColor = chalk.green;\n } else if (latencyMs < 2000) {\n latencyColor = chalk.yellow;\n } else {\n latencyColor = chalk.red;\n }\n\n const method = entry.method || \"???\";\n const requestSize = entry.request_size || 0;\n const responseSize = entry.response_size || 0;\n const url = entry.url || entry.host || \"unknown\";\n const firewall = entry.firewall_name\n ? ` ${chalk.cyan(`[${entry.firewall_name}]`)}`\n : \"\";\n const error = entry.firewall_error\n ? ` ${chalk.red(entry.firewall_error)}`\n : \"\";\n\n let line = `[${entry.timestamp}] ${method.padEnd(6)} ${statusColor(status)} ${latencyColor(latencyMs + \"ms\")} ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${chalk.dim(url)}${firewall}${error}${formatAuthInfo(entry)}`;\n\n line += formatCaptureFields(entry);\n\n return line;\n}\n\n/**\n * Maximum characters of body content shown in CLI log output.\n */\nconst BODY_PREVIEW_LENGTH = 200;\n\n/**\n * Format captured body fields (request headers, request body, response body)\n * when present from --capture-network-bodies runs.\n */\nfunction formatCaptureFields(entry: NetworkLogEntry): string {\n let result = \"\";\n if (entry.request_headers) {\n const hdrs = Object.entries(entry.request_headers)\n .map(([k, v]) => {\n return `${k}: ${v}`;\n })\n .join(\", \");\n result += `\\n ${chalk.gray(\"request_headers:\")} ${hdrs}`;\n }\n if (entry.request_body) {\n const truncated = entry.request_body_truncated ? \" (truncated)\" : \"\";\n const preview = entry.request_body.slice(0, BODY_PREVIEW_LENGTH);\n const ellipsis =\n entry.request_body.length > BODY_PREVIEW_LENGTH ? \"...\" : \"\";\n result += `\\n ${chalk.gray(\"request_body:\")} ${preview}${ellipsis}${truncated}`;\n }\n if (entry.response_body) {\n const truncated = entry.response_body_truncated ? \" (truncated)\" : \"\";\n const preview = entry.response_body.slice(0, BODY_PREVIEW_LENGTH);\n const ellipsis =\n entry.response_body.length > BODY_PREVIEW_LENGTH ? \"...\" : \"\";\n result += `\\n ${chalk.gray(\"response_body:\")} ${preview}${ellipsis}${truncated}`;\n }\n return result;\n}\n\n/**\n * Format a TCP connection log entry\n */\nfunction formatNetworkTcp(entry: NetworkLogEntry): string {\n const host = entry.host || \"unknown\";\n const port = entry.port || 0;\n const requestSize = entry.request_size || 0;\n const responseSize = entry.response_size || 0;\n const latencyMs = entry.latency_ms || 0;\n const error = entry.error ? ` ${chalk.red(entry.error)}` : \"\";\n\n return `[${entry.timestamp}] ${chalk.blue(\"TCP\")} ${latencyMs}ms ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${chalk.dim(`${host}:${port}`)}${error}`;\n}\n\n/**\n * Format a non-TCP/non-HTTP log entry (UDP, ICMP, DNS, etc).\n * These come from iptables LOG via /dev/kmsg or dnsmasq query log.\n */\nfunction formatNetworkOther(entry: NetworkLogEntry): string {\n const proto = (entry.type || \"???\").toUpperCase();\n const host = entry.host || \"unknown\";\n const port = entry.port || 0;\n const size = entry.request_size ? ` ${formatBytes(entry.request_size)}` : \"\";\n\n return `[${entry.timestamp}] ${chalk.magenta(proto.padEnd(5))}${size} ${chalk.dim(`${host}:${port}`)}`;\n}\n\n/**\n * Format a network log entry\n */\nfunction formatNetworkLog(entry: NetworkLogEntry): string {\n if (entry.type === \"tcp\") return formatNetworkTcp(entry);\n if (entry.type && entry.type !== \"http\") return formatNetworkOther(entry);\n if (entry.action === \"DENY\") return formatNetworkDeny(entry);\n return formatNetworkRequest(entry);\n}\n\n/**\n * Create an EventRenderer for log viewing (with timestamps)\n * Uses buffered mode to group tool_use/tool_result together for consistent\n * rendering with vm0 run output\n */\nfunction createLogRenderer(verbose: boolean): EventRenderer {\n return new EventRenderer({\n showTimestamp: true,\n verbose,\n });\n}\n\n/**\n * Render an agent event with timestamp for historical log viewing\n */\nfunction renderAgentEvent(event: RunEvent, renderer: EventRenderer): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = ClaudeEventParser.parse(eventData);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\n/**\n * Validate mutually exclusive options and return the log type\n */\nfunction getLogType(options: {\n agent?: boolean;\n system?: boolean;\n metrics?: boolean;\n network?: boolean;\n}): LogType {\n const selected = [\n options.agent,\n options.system,\n options.metrics,\n options.network,\n ].filter(Boolean).length;\n\n if (selected > 1) {\n throw new Error(\n \"Options --agent, --system, --metrics, and --network are mutually exclusive\",\n );\n }\n\n if (options.system) return \"system\";\n if (options.metrics) return \"metrics\";\n if (options.network) return \"network\";\n return \"agent\"; // Default\n}\n\nexport const logsCommand = new Command()\n .name(\"logs\")\n .description(\"View and search agent run logs\")\n .argument(\"[runId]\", \"Run ID to fetch logs for\")\n .addCommand(searchCommand)\n .option(\"-a, --agent\", \"Show agent events (default)\")\n .option(\"-s, --system\", \"Show system log\")\n .option(\"-m, --metrics\", \"Show metrics\")\n .option(\"-n, --network\", \"Show network logs (proxy traffic)\")\n .option(\n \"--since <time>\",\n \"Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z, 1705312200)\",\n )\n .option(\"--tail <n>\", \"Show last N entries (default: 5)\")\n .option(\"--head <n>\", \"Show first N entries\")\n .option(\"--all\", \"Fetch all log entries\")\n .action(\n withErrorHandler(\n async (\n runId: string | undefined,\n options: {\n agent?: boolean;\n system?: boolean;\n metrics?: boolean;\n network?: boolean;\n since?: string;\n tail?: string;\n head?: string;\n all?: boolean;\n },\n ) => {\n if (!runId) {\n logsCommand.help();\n return;\n }\n\n const logType = getLogType(options);\n\n // Validate --tail, --head, and --all are mutually exclusive\n const countModes = [\n options.tail !== undefined,\n options.head !== undefined,\n options.all === true,\n ].filter(Boolean).length;\n if (countModes > 1) {\n throw new Error(\n \"Options --tail, --head, and --all are mutually exclusive\",\n );\n }\n\n // Parse since option\n let since: number | undefined;\n if (options.since) {\n since = parseTime(options.since);\n }\n\n // Determine pagination mode and order based on flags\n const isAll = options.all === true;\n const isHead = options.head !== undefined;\n const isTail = options.tail !== undefined;\n\n // targetCount: number for --head/--tail, \"all\" for --all, default 5 for no flag\n let targetCount: number | \"all\";\n if (isAll) {\n targetCount = \"all\";\n } else if (isHead) {\n targetCount = Math.max(1, parseInt(options.head!, 10));\n } else if (isTail) {\n targetCount = Math.max(1, parseInt(options.tail!, 10));\n } else {\n // Default: show last 5 entries\n targetCount = 5;\n }\n\n // Order: asc for --head, desc for --tail/--all/default\n const order: \"asc\" | \"desc\" = isHead ? \"asc\" : \"desc\";\n\n // Build platform URL for agent logs\n const apiUrl = await getApiUrl();\n const platformUrl = buildPlatformLogsUrl(apiUrl, runId);\n\n switch (logType) {\n case \"agent\":\n await showAgentEvents(\n runId,\n { since, targetCount, order },\n platformUrl,\n );\n break;\n case \"system\":\n await showSystemLog(runId, { since, targetCount, order });\n break;\n case \"metrics\":\n await showMetrics(runId, { since, targetCount, order });\n break;\n case \"network\":\n await showNetworkLogs(runId, { since, targetCount, order });\n break;\n }\n },\n ),\n );\n\n/**\n * Show agent events with pagination support\n */\nasync function showAgentEvents(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n platformUrl: string,\n): Promise<void> {\n // Fetch first page to get framework info\n const firstResponse = await getAgentEvents(runId, {\n since: options.since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n\n if (firstResponse.events.length === 0) {\n console.log(chalk.yellow(\"No agent events found for this run\"));\n return;\n }\n\n // Use pagination to collect all needed events\n let allEvents: RunEvent[];\n\n if (\n !firstResponse.hasMore ||\n (options.targetCount !== \"all\" &&\n firstResponse.events.length >= options.targetCount)\n ) {\n // Single page is enough\n allEvents =\n options.targetCount === \"all\"\n ? firstResponse.events\n : firstResponse.events.slice(0, options.targetCount);\n } else {\n // Need to paginate\n const lastEvent = firstResponse.events[firstResponse.events.length - 1];\n const firstPageTimestamp = lastEvent\n ? new Date(lastEvent.createdAt).getTime()\n : undefined;\n\n const remainingEvents = await paginate<RunEvent>({\n fetchPage: async (since) => {\n const response = await getAgentEvents(runId, {\n since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n return { items: response.events, hasMore: response.hasMore };\n },\n getTimestamp: (event) => {\n return new Date(event.createdAt).getTime();\n },\n targetCount:\n options.targetCount === \"all\"\n ? \"all\"\n : options.targetCount - firstResponse.events.length,\n initialSince: firstPageTimestamp,\n });\n\n allEvents = [...firstResponse.events, ...remainingEvents];\n\n // Trim to target count if needed\n if (\n options.targetCount !== \"all\" &&\n allEvents.length > options.targetCount\n ) {\n allEvents = allEvents.slice(0, options.targetCount);\n }\n }\n\n // Reverse for chronological display when using desc order (--tail)\n const events =\n options.order === \"desc\" ? [...allEvents].reverse() : allEvents;\n\n // Create renderer for log viewing (with timestamps, always verbose)\n const renderer = createLogRenderer(true);\n\n for (const event of events) {\n renderAgentEvent(event, renderer);\n }\n\n console.log(chalk.dim(`View on platform: ${platformUrl}`));\n}\n\n/**\n * Show system log with pagination support\n * Note: System log pagination is limited because the API returns aggregated strings\n * without individual timestamps. The --tail/--head/--all options work on batch count,\n * not line count.\n */\nasync function showSystemLog(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n // For system log, we fetch with a high limit to get more batches\n // The API aggregates batches into a single string\n const limit =\n options.targetCount === \"all\"\n ? PAGE_LIMIT\n : Math.min(options.targetCount, PAGE_LIMIT);\n\n const response = await getSystemLog(runId, {\n since: options.since,\n limit,\n order: options.order,\n });\n\n if (!response.systemLog) {\n console.log(chalk.yellow(\"No system log found for this run\"));\n return;\n }\n\n console.log(response.systemLog);\n}\n\n/**\n * Show metrics with pagination support\n */\nasync function showMetrics(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n // Fetch first page\n const firstResponse = await getMetrics(runId, {\n since: options.since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n\n if (firstResponse.metrics.length === 0) {\n console.log(chalk.yellow(\"No metrics found for this run\"));\n return;\n }\n\n // Use pagination to collect all needed metrics\n let allMetrics: TelemetryMetric[];\n\n if (\n !firstResponse.hasMore ||\n (options.targetCount !== \"all\" &&\n firstResponse.metrics.length >= options.targetCount)\n ) {\n // Single page is enough\n allMetrics =\n options.targetCount === \"all\"\n ? firstResponse.metrics\n : firstResponse.metrics.slice(0, options.targetCount);\n } else {\n // Need to paginate\n const lastMetric = firstResponse.metrics[firstResponse.metrics.length - 1];\n const firstPageTimestamp = lastMetric\n ? new Date(lastMetric.ts).getTime()\n : undefined;\n\n const remainingMetrics = await paginate<TelemetryMetric>({\n fetchPage: async (since) => {\n const response = await getMetrics(runId, {\n since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n return { items: response.metrics, hasMore: response.hasMore };\n },\n getTimestamp: (metric) => {\n return new Date(metric.ts).getTime();\n },\n targetCount:\n options.targetCount === \"all\"\n ? \"all\"\n : options.targetCount - firstResponse.metrics.length,\n initialSince: firstPageTimestamp,\n });\n\n allMetrics = [...firstResponse.metrics, ...remainingMetrics];\n\n // Trim to target count if needed\n if (\n options.targetCount !== \"all\" &&\n allMetrics.length > options.targetCount\n ) {\n allMetrics = allMetrics.slice(0, options.targetCount);\n }\n }\n\n // Reverse for chronological display when using desc order (--tail)\n const metrics =\n options.order === \"desc\" ? [...allMetrics].reverse() : allMetrics;\n\n for (const metric of metrics) {\n console.log(formatMetric(metric));\n }\n}\n\n/**\n * Show network logs with pagination support\n */\nasync function showNetworkLogs(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n // Fetch first page\n const firstResponse = await getNetworkLogs(runId, {\n since: options.since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n\n if (firstResponse.networkLogs.length === 0) {\n console.log(\n chalk.yellow(\n \"No network logs found for this run. Network logs are only captured when using a runner with proxy enabled\",\n ),\n );\n return;\n }\n\n // Use pagination to collect all needed network logs\n let allNetworkLogs: NetworkLogEntry[];\n\n if (\n !firstResponse.hasMore ||\n (options.targetCount !== \"all\" &&\n firstResponse.networkLogs.length >= options.targetCount)\n ) {\n // Single page is enough\n allNetworkLogs =\n options.targetCount === \"all\"\n ? firstResponse.networkLogs\n : firstResponse.networkLogs.slice(0, options.targetCount);\n } else {\n // Need to paginate\n const lastLog =\n firstResponse.networkLogs[firstResponse.networkLogs.length - 1];\n const firstPageTimestamp = lastLog\n ? new Date(lastLog.timestamp).getTime()\n : undefined;\n\n const remainingLogs = await paginate<NetworkLogEntry>({\n fetchPage: async (since) => {\n const response = await getNetworkLogs(runId, {\n since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n return { items: response.networkLogs, hasMore: response.hasMore };\n },\n getTimestamp: (entry) => {\n return new Date(entry.timestamp).getTime();\n },\n targetCount:\n options.targetCount === \"all\"\n ? \"all\"\n : options.targetCount - firstResponse.networkLogs.length,\n initialSince: firstPageTimestamp,\n });\n\n allNetworkLogs = [...firstResponse.networkLogs, ...remainingLogs];\n\n // Trim to target count if needed\n if (\n options.targetCount !== \"all\" &&\n allNetworkLogs.length > options.targetCount\n ) {\n allNetworkLogs = allNetworkLogs.slice(0, options.targetCount);\n }\n }\n\n // Reverse for chronological display when using desc order (--tail)\n const networkLogs =\n options.order === \"desc\" ? [...allNetworkLogs].reverse() : allNetworkLogs;\n\n for (const entry of networkLogs) {\n console.log(formatNetworkLog(entry));\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n searchLogs,\n type RunEvent,\n type LogsSearchResponse,\n} from \"../../lib/api\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport { ClaudeEventParser } from \"../../lib/events/claude-event-parser\";\nimport { EventRenderer } from \"../../lib/events/event-renderer\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface SearchOptions {\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n}\n\n/**\n * Render a single agent event using EventRenderer\n */\nfunction renderEvent(event: RunEvent, renderer: EventRenderer): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = ClaudeEventParser.parse(eventData);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\n/**\n * Format a run header line\n */\nfunction formatRunHeader(\n runId: string,\n agentName: string,\n timestamp: string,\n): string {\n const shortId = runId.slice(0, 8);\n const time = new Date(timestamp).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n return `── Run ${shortId} (${agentName}, ${time}) ──────────`;\n}\n\n/**\n * Parse and validate context options (-A, -B, -C)\n */\nfunction parseContextOptions(options: SearchOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\n/**\n * Parse --limit option with validation\n */\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\n/**\n * Render search results grouped by run\n */\nfunction renderResults(response: LogsSearchResponse): void {\n // Group results by run\n const grouped = new Map<\n string,\n { agentName: string; results: LogsSearchResponse[\"results\"] }\n >();\n for (const result of response.results) {\n const existing = grouped.get(result.runId);\n if (existing) {\n existing.results.push(result);\n } else {\n grouped.set(result.runId, {\n agentName: result.agentName,\n results: [result],\n });\n }\n }\n\n // Render each group\n let isFirstGroup = true;\n for (const [runId, group] of grouped) {\n if (!isFirstGroup) {\n console.log(); // Separator between runs\n }\n isFirstGroup = false;\n\n const firstTimestamp = group.results[0]!.matchedEvent.createdAt;\n console.log(\n chalk.bold(formatRunHeader(runId, group.agentName, firstTimestamp)),\n );\n\n for (const result of group.results) {\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: false,\n buffered: false,\n });\n\n for (const event of result.contextBefore) {\n renderEvent(event, renderer);\n }\n renderEvent(result.matchedEvent, renderer);\n for (const event of result.contextAfter) {\n renderEvent(event, renderer);\n }\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search agent events across runs\")\n .argument(\"<keyword>\", \"Search keyword\")\n .option(\"-A, --after-context <n>\", \"Show n events after each match\")\n .option(\"-B, --before-context <n>\", \"Show n events before each match\")\n .option(\"-C, --context <n>\", \"Show n events before and after each match\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--run <id>\", \"Filter by specific run ID\")\n .option(\"--since <time>\", \"Search logs since (default: 7d)\")\n .option(\"--limit <n>\", \"Maximum number of matches (default: 20)\")\n .action(\n withErrorHandler(async (keyword: string, options: SearchOptions) => {\n const { before, after } = parseContextOptions(options);\n const since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n const limit = parseLimit(options.limit);\n\n const response = await searchLogs({\n keyword,\n agent: options.agent,\n runId: options.run,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderResults(response);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport { existsSync } from \"fs\";\nimport { writeFile } from \"fs/promises\";\nimport { validateAgentName } from \"../../lib/domain/yaml-validator\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nconst VM0_YAML_FILE = \"vm0.yaml\";\nconst AGENTS_MD_FILE = \"AGENTS.md\";\n\nfunction generateVm0Yaml(agentName: string): string {\n return `version: \"1.0\"\n\nagents:\n ${agentName}:\n framework: claude-code\n # Build agentic workflow using natural language\n instructions: AGENTS.md\n # Agent skills - see https://github.com/vm0-ai/vm0-skills for available skills\n # skills:\n # - https://github.com/vm0-ai/vm0-skills/tree/main/github\n`;\n}\n\nfunction generateAgentsMd(): string {\n return `# Agent Instructions\n\nYou are a HackerNews AI content curator.\n\n## Workflow\n\n1. Go to HackerNews and read the top 10 articles\n2. Find and extract AI-related content from these articles\n3. Summarize the findings into a X (Twitter) post format\n4. Write the summary to content.md\n`;\n}\n\nfunction checkExistingFiles(): string[] {\n const existingFiles: string[] = [];\n if (existsSync(VM0_YAML_FILE)) existingFiles.push(VM0_YAML_FILE);\n if (existsSync(AGENTS_MD_FILE)) existingFiles.push(AGENTS_MD_FILE);\n return existingFiles;\n}\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize a new VM0 project in the current directory\")\n .option(\"-f, --force\", \"Overwrite existing files\")\n .option(\"-n, --name <name>\", \"Agent name (required in non-interactive mode)\")\n .action(\n withErrorHandler(async (options: { force?: boolean; name?: string }) => {\n // Check existing files\n const existingFiles = checkExistingFiles();\n if (existingFiles.length > 0 && !options.force) {\n throw new Error(`${existingFiles.join(\", \")} already exists`, {\n cause: new Error(\"To overwrite: vm0 init --force\"),\n });\n }\n\n // Get agent name from option or prompt\n let agentName: string;\n if (options.name) {\n agentName = options.name.trim();\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 init --name <agent-name>\"),\n });\n } else {\n // Use directory name as default suggestion\n const dirName = path.basename(process.cwd());\n const defaultName = validateAgentName(dirName) ? dirName : undefined;\n\n const name = await promptText(\n \"Enter agent name\",\n defaultName,\n (value: string) => {\n if (!validateAgentName(value)) {\n return \"Must be 3-64 characters, alphanumeric and hyphens, start/end with letter or number\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n agentName = name;\n }\n\n // Validate agent name\n if (!agentName || !validateAgentName(agentName)) {\n throw new Error(\"Invalid agent name\", {\n cause: new Error(\n \"Must be 3-64 characters, alphanumeric and hyphens only, start and end with letter or number\",\n ),\n });\n }\n\n // Write vm0.yaml\n await writeFile(VM0_YAML_FILE, generateVm0Yaml(agentName));\n const vm0Status = existingFiles.includes(VM0_YAML_FILE)\n ? \" (overwritten)\"\n : \"\";\n console.log(chalk.green(`✓ Created ${VM0_YAML_FILE}${vm0Status}`));\n\n // Write AGENTS.md\n await writeFile(AGENTS_MD_FILE, generateAgentsMd());\n const agentsStatus = existingFiles.includes(AGENTS_MD_FILE)\n ? \" (overwritten)\"\n : \"\";\n console.log(chalk.green(`✓ Created ${AGENTS_MD_FILE}${agentsStatus}`));\n\n // Print next steps\n console.log();\n console.log(\"Next steps:\");\n console.log(\n ` 1. Set up model provider (one-time): ${chalk.cyan(\"zero org model-provider setup\")}`,\n );\n console.log(\n ` 2. Edit ${chalk.cyan(\"AGENTS.md\")} to customize your agent's workflow`,\n );\n console.log(\n ` 3. Run your agent: ${chalk.cyan('vm0 cook \"let\\'s start working\"')}`,\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n detectPackageManager,\n getLatestVersion,\n getManualUpgradeCommand,\n isAutoUpgradeSupported,\n performUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nexport const upgradeCommand = new Command()\n .name(\"upgrade\")\n .description(\"Upgrade vm0 CLI to the latest version\")\n .action(\n withErrorHandler(async () => {\n console.log(\"Checking for updates...\");\n\n const latestVersion = await getLatestVersion();\n\n if (latestVersion === null) {\n throw new Error(\"Could not check for updates. Please try again later.\");\n }\n\n if (latestVersion === __CLI_VERSION__) {\n console.log(chalk.green(`✓ Already up to date (${__CLI_VERSION__})`));\n return;\n }\n\n console.log(\n chalk.yellow(\n `Current version: ${__CLI_VERSION__} -> Latest version: ${latestVersion}`,\n ),\n );\n console.log();\n\n const packageManager = detectPackageManager();\n\n if (!isAutoUpgradeSupported(packageManager)) {\n if (packageManager === \"unknown\") {\n console.log(\n chalk.yellow(\n \"Could not detect your package manager for auto-upgrade.\",\n ),\n );\n } else {\n console.log(\n chalk.yellow(\n `Auto-upgrade is not supported for ${packageManager}.`,\n ),\n );\n }\n console.log(chalk.yellow(\"Please upgrade manually:\"));\n console.log(chalk.cyan(` ${getManualUpgradeCommand(packageManager)}`));\n return;\n }\n\n console.log(`Upgrading via ${packageManager}...`);\n const success = await performUpgrade(packageManager);\n\n if (success) {\n console.log(\n chalk.green(`✓ Upgraded from ${__CLI_VERSION__} to ${latestVersion}`),\n );\n return;\n }\n\n throw new Error(\"Upgrade failed\", {\n cause: new Error(\n `Please run manually: ${getManualUpgradeCommand(packageManager)}`,\n ),\n });\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getApiUrl, getActiveOrg, getToken } from \"../lib/api/config\";\nimport { withErrorHandler } from \"../lib/command\";\n\n/**\n * Detect if running inside a VM0 sandbox (agent runtime).\n * Presence of VM0_RUN_ID indicates sandbox execution.\n */\nfunction isInsideSandbox(): boolean {\n return !!process.env.VM0_RUN_ID;\n}\n\n/**\n * Display agent identity and run information when inside a sandbox.\n */\nasync function showSandboxInfo(): Promise<void> {\n const agentId = process.env.ZERO_AGENT_ID;\n const cliAgentType = process.env.CLI_AGENT_TYPE;\n\n const runId = process.env.VM0_RUN_ID;\n const activeOrg = await getActiveOrg();\n const apiUrl = process.env.VM0_API_URL;\n\n // Agent section\n const hasAgentInfo = agentId || cliAgentType;\n if (hasAgentInfo) {\n console.log(chalk.bold(\"Agent:\"));\n if (agentId) console.log(` ID: ${agentId}`);\n if (cliAgentType) console.log(` Framework: ${cliAgentType}`);\n console.log();\n }\n\n // Run section\n console.log(chalk.bold(\"Run:\"));\n if (runId) console.log(` ID: ${runId}`);\n if (activeOrg) console.log(` Org: ${activeOrg}`);\n if (apiUrl) console.log(` API: ${apiUrl}`);\n}\n\n/**\n * Display authentication and org information when running outside a sandbox.\n */\nasync function showLocalInfo(): Promise<void> {\n const token = await getToken();\n const apiUrl = await getApiUrl();\n const activeOrg = await getActiveOrg();\n\n // Auth section\n console.log(chalk.bold(\"Auth:\"));\n if (token) {\n const tokenSource = process.env.VM0_TOKEN\n ? \"VM0_TOKEN env var\"\n : \"config file\";\n console.log(\n ` Status: ${chalk.green(\"Authenticated\")} (via ${tokenSource})`,\n );\n } else {\n console.log(` Status: ${chalk.dim(\"Not authenticated\")}`);\n }\n console.log(` API: ${apiUrl}`);\n console.log();\n\n // Org section\n if (activeOrg) {\n console.log(chalk.bold(\"Org:\"));\n console.log(` Active: ${activeOrg}`);\n }\n}\n\nexport const whoamiCommand = new Command()\n .name(\"whoami\")\n .description(\"Show current identity and environment information\")\n .action(\n withErrorHandler(async () => {\n if (isInsideSandbox()) {\n await showSandboxInfo();\n } else {\n await showLocalInfo();\n }\n }),\n );\n"],"mappings":"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","names":["ms","readFile","rm","existsSync","dirname","join","path","b","_","j","fs","path","parseGitHubTreeUrl","getSkillStorageName","fs","path","os","fs","path","os","EE","fs","EventEmitter","Stream","StringDecoder","path","dirname","parse","assert","Buffer","realZlib","pathModule","basename","win32","randomBytes","fsp","join","proc","isStream","s","Minipass","isReadable","isWritable","EOF","MAYBE_EMIT_END","EMITTED_END","EMITTING_END","EMITTED_ERROR","CLOSED","READ","FLUSH","FLUSHCHUNK","ENCODING","DECODER","FLOWING","PAUSED","RESUME","BUFFER","PIPES","BUFFERLENGTH","BUFFERPUSH","BUFFERSHIFT","OBJECTMODE","DESTROYED","ERROR","EMITDATA","EMITEND","EMITEND2","ASYNC","ABORT","ABORTED","SIGNAL","DATALISTENERS","DISCARDED","defer","fn","nodefer","isEndish","ev","isArrayBufferLike","b","isArrayBufferView","Pipe","src","dest","opts","_er","PipeProxyErrors","er","isObjectModeOptions","o","isEncodingOptions","args","options","signal","_enc","_om","a","_","chunk","encoding","cb","n","ret","c","noDrain","ended","p","handler","h","data","buf","resolve","reject","stopped","stop","res","onerr","ondata","onend","ondestroy","value","rej","next","wc","writev","_autoClose","_close","_ended","_fd","_finished","_flags","_flush","_handleChunk","_makeBuf","_mode","_needDrain","_onerror","_onopen","_onread","_onwrite","_open","_path","_pos","_queue","_read","_readSize","_reading","_remain","_size","_write","_writing","_defaultFlag","_errored","ReadStream","opt","fd","br","ReadStreamSync","threw","WriteStream","defaultFlag","enc","bw","iovec","WriteStreamSync","argmap","isSyncFile","isAsyncFile","isSyncNoFile","isAsyncNoFile","isFile","dealiasKey","k","d","dealias","result","key","v","makeCommand","syncFile","asyncFile","syncNoFile","asyncNoFile","validate","opt_","entries","realZlibConstants","constants","OriginalBufferConcat","desc","noop","passthroughBufferConcat","makeNoOp","_superWrite","ZlibError","err","origin","_flushFlag","ZlibBase","#sawError","#ended","#flushFlag","#finishFlushFlag","#fullFlushFlag","#handle","#onError","mode","flushFlag","nativeHandle","originalNativeClose","originalClose","writeReturn","r","i","Zlib","#level","#strategy","level","strategy","origFlush","Gzip","#portable","Unzip","Brotli","BrotliCompress","BrotliDecompress","Zstd","ZstdCompress","ZstdDecompress","encode","num","encodeNegative","encodePositive","flipped","byte","onesComp","twosComp","pre","pos","twos","len","sum","f","types_exports","__export","code","isCode","isName","name","kv","Header","#type","off","ex","gex","#slurp","decString","decNumber","decDate","t","prefix","prefixSize","split","splitPrefix","encString","encNumber","encDate","type","pp","root","size","numToDate","decSmallNumber","nanUndef","MAXNUM","encSmallNumber","octalString","padOctal","str","date","NULLS","Pax","_Pax","obj","global","body","bodyLen","bufLen","field","byteLen","digits","g","merge","parseKV","parseKVLine","set","line","platform","normalizeWindowsPath","ReadEntry","header","writeLen","warnMethod","self","message","maxMetaEntrySize","gzipHeader","zstdHeader","ZIP_HEADER_LEN","STATE","WRITEENTRY","READENTRY","NEXTENTRY","PROCESSENTRY","EX","GEX","META","EMITMETA","QUEUE","ENDED","EMITTEDEND","EMIT","UNZIP","CONSUMECHUNK","CONSUMECHUNKSUB","CONSUMEBODY","CONSUMEMETA","CONSUMEHEADER","CONSUMING","BUFFERCONCAT","MAYBEEND","WRITING","DONE","SAW_VALID_ENTRY","SAW_NULL_BLOCK","SAW_EOF","CLOSESTREAM","Parser","isTBR","isTZST","position","entry","go","re","extra","error","isZstd","maybeBrotli","have","length","stripTrailingSlashes","slashesStart","onReadEntryFunction","onReadEntry","filesFilter","files","map","filter","mapHas","file","m","listFileSync","stat","readSize","read","bytesRead","listFile","_files","stream","list","modeFix","isDir","portable","isAbsolute","stripAbsolutePath","parsed","raw","win","char","toWin","toRaw","decode","prefixPath","maxReadSize","PROCESS","FILE","DIRECTORY","SYMLINK","HARDLINK","HEADER","LSTAT","ONLSTAT","ONREAD","ONREADLINK","OPENFILE","ONOPENFILE","CLOSE","MODE","AWAITDRAIN","ONDRAIN","PREFIX","WriteEntry","#hadError","pathWarn","stripped","cs","getType","block","linkpath","linkKey","offset","WriteEntrySync","WriteEntryTar","readEntry","Yallist","_Yallist","item","walker","node","prev","head","tail","l","push","unshift","thisp","initial","acc","arr","from","to","start","deleteCount","nodes","insertAfter","inserted","Node","PackJob","absolute","ONSTAT","CURRENT","PROCESSING","PROCESSJOB","JOBS","JOBDONE","ADDFSENTRY","ADDTARENTRY","STAT","READDIR","ONREADDIR","PIPE","ENTRY","ENTRYOPT","WRITEENTRYCLASS","WRITE","Pack","zip","job","w","_job","sc","rc","msg","base","source","PackSync","createFileSync","addFilesSync","createFile","promise","addFilesAsync","createSync","createAsync","create","_opt","isWindows","O_CREAT","O_NOFOLLOW","O_TRUNC","O_WRONLY","UV_FS_O_FILEMAP","fMapEnabled","fMapLimit","fMapFlag","noFollowFlag","getWriteFlag","lchownSync","uid","gid","chown","cpath","chownrKid","child","chownr","children","errState","then","chownrKidSync","chownrSync","e","CwdError","SymlinkError","symlink","checkCwd","dir","st","mkdir","umask","needChmod","doChown","preserve","unlink","cwd","done","created","made","parts","mkdir_","part","onmkdir","statEr","checkCwdSync","ok","mkdirSync","normalizeCache","MAX","cache","normalizeUnicode","getDirs","PathReservations","#queues","#reservations","#running","paths","dirs","q","#run","#getQueues","#clear","q0","ONENTRY","CHECKFS","CHECKFS2","ISREUSABLE","MAKEFS","LINK","ENSURE_NO_SYMLINK","UNSUPPORTED","CHECKPATH","STRIPABSOLUTEPATH","MKDIR","ONERROR","PENDING","PEND","UNPEND","MAYBECLOSE","SKIP","DOCHOWN","UID","GID","CHECKED_CWD","DEFAULT_MAX_DEPTH","unlinkFile","unlinkFileSync","uint32","Unpack","entryDir","resolved","linkparts","aRoot","pRoot","fullyDone","actions","abs","atime","mtime","er2","tx","onError","parent","afterMakeParent","lstatEr","afterChmod","link","callSync","UnpackSync","mkParent","oner","closeError","futimeser","fchowner","_entry","linkSync","extractFileSync","u","extractFile","extract","replaceSync","headBuf","POSITION","bufPos","bytes","entryBlockSize","streamSync","replaceAsync","getPos","cb_","onread","flag","onopen","replace","update","mtimeFilter","fs","path","k","ms","text","commitResult","parseGitHubTreeUrl","getSkillStorageName","existsSync","readFile","parseYaml","dirname","parseGitHubTreeUrl","s","v","join","rm","s","v","path","import_yaml","readFile","writeFile","mkdir","existsSync","path","parseYaml","type","stringifyYaml","path","path","fs","os","path","f","statusCommand","listCommand","path","fs","os","type","path","statusCommand","listCommand","path","initCommand","path","pushCommand","path","fs","os","pullCommand","path","f","statusCommand","listCommand","cloneCommand","initCommand","pushCommand","pullCommand","statusCommand","listCommand","cloneCommand","path","initCommand","path","pushCommand","pullCommand","statusCommand","listCommand","cloneCommand","initCommand","pushCommand","pullCommand","statusCommand","listCommand","cloneCommand","import_yaml","readFile","mkdir","existsSync","path","homedir","join","readFile","writeFile","mkdir","existsSync","CONFIG_DIR","existsSync","CONFIG_FILE","existsSync","loadAndValidateConfig","CONFIG_FILE","existsSync","readFile","parseYaml","path","mkdir","path","continueCommand","path","path","resumeCommand","path","continueCommand","resumeCommand","parseLimit","k","v","logsCommand","path","existsSync","writeFile","existsSync","initCommand","path","writeFile","logsCommand","initCommand"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/auth/index.ts","../src/commands/auth/login.ts","../src/lib/api/auth.ts","../src/commands/auth/logout.ts","../src/commands/auth/status.ts","../src/commands/auth/setup-token.ts","../src/commands/info/index.ts","../src/lib/utils/update-checker.ts","../src/lib/utils/spawn.ts","../src/commands/compose/index.ts","../src/lib/domain/yaml-validator.ts","../src/lib/domain/github-skills.ts","../src/lib/external/git-client.ts","../src/lib/storage/system-storage.ts","../src/lib/storage/direct-upload.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/@isaacs/fs-minipass/src/index.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/minipass/src/index.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/create.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/list.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/options.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/make-command.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/parse.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/minizlib/src/index.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/minizlib/src/constants.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/header.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/large-numbers.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/types.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/pax.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/normalize-windows-path.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/read-entry.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/warn-method.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/strip-trailing-slashes.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/pack.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/write-entry.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/mode-fix.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/strip-absolute-path.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/winchars.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/yallist/src/index.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/extract.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/unpack.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/get-write-flag.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/node_modules/chownr/src/index.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/mkdir.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/cwd-error.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/symlink-error.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/path-reservations.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/normalize-unicode.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/process-umask.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/replace.ts","../../../node_modules/.pnpm/tar@7.5.13/node_modules/tar/src/update.ts","../src/lib/utils/file-utils.ts","../src/commands/run/index.ts","../src/commands/run/run.ts","../src/commands/run/resume.ts","../src/commands/run/continue.ts","../src/commands/run/list.ts","../src/commands/run/kill.ts","../src/commands/run/queue.ts","../src/commands/volume/index.ts","../src/commands/volume/init.ts","../src/lib/storage/storage-utils.ts","../src/commands/volume/push.ts","../src/commands/volume/pull.ts","../src/lib/storage/pull-utils.ts","../src/commands/volume/status.ts","../src/commands/volume/list.ts","../src/commands/volume/clone.ts","../src/lib/storage/clone-utils.ts","../src/commands/artifact/index.ts","../src/commands/artifact/init.ts","../src/commands/artifact/push.ts","../src/commands/artifact/pull.ts","../src/commands/artifact/status.ts","../src/commands/artifact/list.ts","../src/commands/artifact/clone.ts","../src/commands/memory/index.ts","../src/commands/memory/init.ts","../src/commands/memory/push.ts","../src/commands/memory/pull.ts","../src/commands/memory/status.ts","../src/commands/memory/list.ts","../src/commands/memory/clone.ts","../src/commands/cook/index.ts","../src/commands/cook/cook.ts","../src/lib/domain/cook-state.ts","../src/commands/cook/utils.ts","../src/commands/cook/logs.ts","../src/commands/cook/continue.ts","../src/commands/cook/resume.ts","../src/commands/logs/index.ts","../src/commands/logs/search.ts","../src/commands/init/index.ts","../src/commands/upgrade/index.ts","../src/commands/whoami.ts"],"sourcesContent":["// VM0 CLI entry point - main module\n// Sentry must be initialized before any other imports\nimport \"./instrument.js\";\nimport { Command } from \"commander\";\nimport { configureGlobalProxyFromEnv } from \"./lib/network/proxy.js\";\nimport { authCommand } from \"./commands/auth\";\nimport { infoCommand } from \"./commands/info\";\nimport { composeCommand } from \"./commands/compose\";\nimport { runCommand } from \"./commands/run\";\nimport { volumeCommand } from \"./commands/volume\";\nimport { artifactCommand } from \"./commands/artifact\";\nimport { memoryCommand } from \"./commands/memory\";\nimport { cookCommand } from \"./commands/cook\";\nimport { logsCommand } from \"./commands/logs\";\n\nimport { initCommand } from \"./commands/init\";\n\nimport { upgradeCommand } from \"./commands/upgrade\";\nimport { whoamiCommand } from \"./commands/whoami\";\n\nconst program = new Command();\n\ndeclare const __CLI_VERSION__: string;\n\nprogram\n .name(\"vm0\")\n .description(\"VM0 CLI - Build and run agents with natural language\")\n .version(__CLI_VERSION__);\n\n// Register all commands\nprogram.addCommand(authCommand);\nprogram.addCommand(infoCommand);\nprogram.addCommand(composeCommand);\nprogram.addCommand(runCommand);\nprogram.addCommand(volumeCommand);\nprogram.addCommand(artifactCommand);\nprogram.addCommand(memoryCommand);\nprogram.addCommand(cookCommand);\nprogram.addCommand(logsCommand);\n\nprogram.addCommand(initCommand);\nprogram.addCommand(upgradeCommand);\nprogram.addCommand(whoamiCommand);\n\nexport { program };\n\nif (\n process.argv[1]?.endsWith(\"index.js\") ||\n process.argv[1]?.endsWith(\"index.ts\") ||\n process.argv[1]?.endsWith(\"vm0\")\n) {\n configureGlobalProxyFromEnv();\n program.parse();\n}\n","import { Command } from \"commander\";\nimport { loginCommand } from \"./login\";\nimport { logoutCommand } from \"./logout\";\nimport { statusCommand } from \"./status\";\nimport { setupTokenCommand } from \"./setup-token\";\n\nexport const authCommand = new Command()\n .name(\"auth\")\n .description(\"Authenticate vm0\")\n .addCommand(loginCommand)\n .addCommand(logoutCommand)\n .addCommand(statusCommand)\n .addCommand(setupTokenCommand);\n","import { Command } from \"commander\";\nimport { authenticate } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const loginCommand = new Command()\n .name(\"login\")\n .description(\"Log in to VM0 (use VM0_API_URL env var to set API URL)\")\n .action(\n withErrorHandler(async () => {\n await authenticate();\n }),\n );\n","import chalk from \"chalk\";\nimport {\n saveConfig,\n clearConfig,\n loadConfig,\n getApiUrl,\n getToken,\n} from \"./config\";\n\n/**\n * Build headers with optional Vercel bypass secret\n * Used to bypass Vercel deployment protection in CI/preview environments\n */\nfunction buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n // Add Vercel bypass secret if available (for CI/preview deployments)\n const bypassSecret = process.env.VERCEL_AUTOMATION_BYPASS_SECRET;\n if (bypassSecret) {\n headers[\"x-vercel-protection-bypass\"] = bypassSecret;\n }\n\n return headers;\n}\n\nasync function requestDeviceCode(apiUrl: string): Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/device`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify({}),\n });\n\n if (!response.ok) {\n if (response.status === 403) {\n throw new Error(\"An unexpected network issue occurred\");\n }\n throw new Error(`Failed to request device code: ${response.statusText}`);\n }\n\n return response.json() as Promise<{\n device_code: string;\n user_code: string;\n verification_path: string;\n expires_in: number;\n interval: number;\n }>;\n}\n\nasync function exchangeToken(\n apiUrl: string,\n deviceCode: string,\n): Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n}> {\n const response = await fetch(`${apiUrl}/api/cli/auth/token`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: JSON.stringify({ device_code: deviceCode }),\n });\n\n return response.json() as Promise<{\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n }>;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\nexport async function authenticate(apiUrl?: string): Promise<void> {\n // Use provided apiUrl or get from config/env (with fallback to production)\n const targetApiUrl = apiUrl ?? (await getApiUrl());\n console.log(\"Initiating authentication...\");\n\n // Request device code\n const deviceAuth = await requestDeviceCode(targetApiUrl);\n\n console.log(chalk.green(\"\\nDevice code generated\"));\n\n // Construct verification URL from API URL and server-provided path\n const verificationUrl = `${targetApiUrl}${deviceAuth.verification_path}`;\n console.log(chalk.cyan(`\\nTo authenticate, visit: ${verificationUrl}`));\n console.log(`And enter this code: ${chalk.bold(deviceAuth.user_code)}`);\n console.log(\n `\\nThe code expires in ${Math.floor(deviceAuth.expires_in / 60)} minutes.`,\n );\n\n console.log(\"\\nWaiting for authentication...\");\n\n // Poll for token\n const startTime = Date.now();\n const maxWaitTime = deviceAuth.expires_in * 1000; // Convert to milliseconds\n const pollInterval = (deviceAuth.interval || 5) * 1000; // Use server-specified interval or default to 5 seconds\n\n let isFirstPoll = true;\n\n while (Date.now() - startTime < maxWaitTime) {\n // Skip delay on first poll for faster response\n if (!isFirstPoll) {\n await delay(pollInterval); // Use dynamic polling interval\n }\n isFirstPoll = false;\n\n const tokenResult = await exchangeToken(\n targetApiUrl,\n deviceAuth.device_code,\n );\n\n if (tokenResult.access_token) {\n // Success! Store the token and org context\n await saveConfig({\n token: tokenResult.access_token,\n apiUrl: targetApiUrl,\n });\n\n console.log(chalk.green(\"\\nAuthentication successful!\"));\n console.log(\"Your credentials have been saved\");\n return;\n }\n\n if (tokenResult.error === \"authorization_pending\") {\n // Still waiting for user to authenticate\n process.stdout.write(chalk.dim(\".\"));\n continue;\n }\n\n // Handle other errors\n if (tokenResult.error === \"expired_token\") {\n throw new Error(\"Device code expired, please try again\");\n }\n\n if (tokenResult.error) {\n throw new Error(\n `Authentication failed: ${tokenResult.error_description ?? tokenResult.error}`,\n );\n }\n }\n\n // Timeout\n throw new Error(\"Authentication timed out, please try again\");\n}\n\nexport async function logout(): Promise<void> {\n await clearConfig();\n console.log(chalk.green(\"✓ Successfully logged out\"));\n console.log(\"Your credentials have been cleared\");\n}\n\nexport async function checkAuthStatus(): Promise<void> {\n const config = await loadConfig();\n\n if (config.token) {\n console.log(chalk.green(\"✓ Authenticated\"));\n console.log(\"You are logged in to VM0.\");\n } else {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(chalk.dim(\" Run: vm0 auth login\"));\n }\n\n // Also check for environment variable\n if (process.env.VM0_TOKEN) {\n console.log(\"Using token from VM0_TOKEN environment variable\");\n }\n}\n\nexport async function setupToken(): Promise<void> {\n const token = await getToken();\n\n if (!token) {\n console.error(chalk.red(\"✗ Not authenticated\"));\n console.error(\"\");\n console.error(\"To get a token for CI/CD:\");\n console.error(\" 1. Run 'vm0 auth login' to authenticate\");\n console.error(\" 2. Run 'vm0 auth setup-token' to get your token\");\n console.error(\n \" 3. Store the token in your CI/CD secrets (e.g., VM0_TOKEN)\",\n );\n process.exit(1);\n }\n\n console.log(chalk.green(\"✓ Authentication token exported successfully!\"));\n console.log(\"\");\n console.log(\"Your token:\");\n console.log(\"\");\n console.log(token);\n console.log(\"\");\n console.log(\n `Use this token by setting: ${chalk.cyan(\"export VM0_TOKEN=<token>\")}`,\n );\n}\n","import { Command } from \"commander\";\nimport { logout } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const logoutCommand = new Command()\n .name(\"logout\")\n .description(\"Log out of VM0\")\n .action(\n withErrorHandler(async () => {\n await logout();\n }),\n );\n","import { Command } from \"commander\";\nimport { checkAuthStatus } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show current authentication status\")\n .action(\n withErrorHandler(async () => {\n await checkAuthStatus();\n }),\n );\n","import { Command } from \"commander\";\nimport { setupToken } from \"../../lib/api/auth\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const setupTokenCommand = new Command()\n .name(\"setup-token\")\n .description(\"Output auth token for CI/CD environments\")\n .action(\n withErrorHandler(async () => {\n await setupToken();\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { existsSync } from \"fs\";\nimport { homedir, release, type } from \"os\";\nimport { join } from \"path\";\nimport { getApiUrl, loadConfig } from \"../../lib/api/config\";\nimport { detectPackageManager } from \"../../lib/utils/update-checker\";\n\ndeclare const __CLI_VERSION__: string;\n\nfunction getConfigPath() {\n return join(homedir(), \".vm0\", \"config.json\");\n}\n\nexport const infoCommand = new Command()\n .name(\"info\")\n .description(\"Display environment and debug information\")\n .action(async () => {\n // CLI version header\n console.log(chalk.bold(`VM0 CLI v${__CLI_VERSION__}`));\n console.log();\n\n // Authentication section\n const config = await loadConfig();\n const hasEnvToken = !!process.env.VM0_TOKEN;\n const hasConfigToken = !!config.token;\n const isAuthenticated = hasEnvToken || hasConfigToken;\n\n console.log(chalk.bold(\"Authentication:\"));\n if (isAuthenticated) {\n const tokenSource = hasEnvToken ? \"VM0_TOKEN env var\" : \"config file\";\n console.log(` ${chalk.green(\"✓\")} Logged in (via ${tokenSource})`);\n } else {\n console.log(` ${chalk.red(\"✗\")} Not authenticated`);\n }\n\n const configExists = existsSync(getConfigPath());\n const configDisplay = configExists\n ? `~/.vm0/config.json`\n : `~/.vm0/config.json (not found)`;\n console.log(` Config: ${configDisplay}`);\n console.log();\n\n // API section\n const apiUrl = await getApiUrl();\n console.log(chalk.bold(\"API:\"));\n console.log(` Host: ${apiUrl}`);\n console.log();\n\n // System section\n console.log(chalk.bold(\"System:\"));\n console.log(` Node: ${process.version}`);\n console.log(` Platform: ${process.platform} (${process.arch})`);\n console.log(` OS: ${type()} ${release()}`);\n console.log(` Shell: ${process.env.SHELL ?? \"unknown\"}`);\n console.log(` Package Manager: ${detectPackageManager()}`);\n });\n","import type { ChildProcess } from \"child_process\";\nimport chalk from \"chalk\";\nimport { safeSpawn } from \"./spawn\";\n\nconst PACKAGE_NAME = \"@vm0/cli\";\nconst NPM_REGISTRY_URL = `https://registry.npmjs.org/${encodeURIComponent(PACKAGE_NAME)}/latest`;\nconst TIMEOUT_MS = 5000;\n\ntype PackageManager = \"npm\" | \"pnpm\" | \"bun\" | \"yarn\" | \"unknown\";\n\n/**\n * Internal state for pending upgrade process\n */\ninterface UpgradeHandle {\n promise: Promise<boolean>;\n child: ChildProcess;\n packageManager: \"npm\" | \"pnpm\";\n}\n\n// Module-level state for pending upgrade\nlet pendingUpgrade: UpgradeHandle | null = null;\n\n/**\n * Detect which package manager was used to install the CLI\n * by checking the executable path for known package manager patterns.\n * Returns \"unknown\" if no known pattern is matched.\n */\nexport function detectPackageManager(): PackageManager {\n const execPath = process.argv[1] ?? \"\";\n\n // Check for pnpm (supported for auto-upgrade)\n if (execPath.includes(\"pnpm\")) {\n return \"pnpm\";\n }\n\n // Check for bun (unsupported - manual upgrade only)\n if (execPath.includes(\"/.bun/\") || execPath.includes(\"/bun/\")) {\n return \"bun\";\n }\n\n // Check for yarn (unsupported - manual upgrade only)\n if (execPath.includes(\"/.yarn/\") || execPath.includes(\"/yarn/\")) {\n return \"yarn\";\n }\n\n // Check for npm (supported for auto-upgrade)\n // Common npm paths: Homebrew, nvm, fnm, volta, nodenv, n, or node_modules\n if (\n execPath.includes(\"/usr/local/\") || // Homebrew on Intel Mac\n execPath.includes(\"/opt/homebrew/\") || // Homebrew on arm64 Mac\n execPath.includes(\"/.nvm/\") ||\n execPath.includes(\"/.fnm/\") ||\n execPath.includes(\"/.volta/\") ||\n execPath.includes(\"/.nodenv/\") ||\n execPath.includes(\"/.n/\") ||\n execPath.includes(\"/node_modules/\") ||\n execPath.includes(\"\\\\npm\\\\\") || // Windows: AppData\\Roaming\\npm\n execPath.includes(\"\\\\nodejs\\\\\") // Windows: Program Files\\nodejs\n ) {\n return \"npm\";\n }\n\n // Unknown package manager - don't assume npm\n return \"unknown\";\n}\n\n/**\n * Check if the package manager supports auto-upgrade\n */\nexport function isAutoUpgradeSupported(\n pm: PackageManager,\n): pm is \"npm\" | \"pnpm\" {\n return pm === \"npm\" || pm === \"pnpm\";\n}\n\n/**\n * Get the manual upgrade command for a package manager\n */\nexport function getManualUpgradeCommand(pm: PackageManager): string {\n switch (pm) {\n case \"bun\":\n return `bun add -g ${PACKAGE_NAME}@latest`;\n case \"yarn\":\n return `yarn global add ${PACKAGE_NAME}@latest`;\n case \"pnpm\":\n return `pnpm add -g ${PACKAGE_NAME}@latest`;\n case \"npm\":\n return `npm install -g ${PACKAGE_NAME}@latest`;\n case \"unknown\":\n return `npm install -g ${PACKAGE_NAME}@latest`;\n }\n}\n\n/**\n * Escape a string for use in shell command display.\n * Uses single quotes which don't interpret any special characters.\n * Embedded single quotes are handled via the '\\'' idiom\n * (end quote, escaped literal quote, start quote).\n */\nfunction escapeForShell(str: string): string {\n return `'${str.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/**\n * Build the re-run command string\n */\nfunction buildRerunCommand(prompt: string | undefined): string {\n if (prompt) {\n return `vm0 cook ${escapeForShell(prompt)}`;\n }\n return \"vm0 cook\";\n}\n\n/**\n * Fetch the latest version of the package from npm registry\n * Returns null if the request fails or times out\n */\nexport async function getLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n return controller.abort();\n }, TIMEOUT_MS);\n\n const response = await fetch(NPM_REGISTRY_URL, {\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return null;\n }\n\n const json = (await response.json()) as { version?: string };\n return json.version ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Execute package manager upgrade command\n * - npm: npm install -g @vm0/cli@latest\n * - pnpm: pnpm add -g @vm0/cli@latest\n * Returns true on success, false on failure\n */\nexport function performUpgrade(\n packageManager: \"npm\" | \"pnpm\",\n): Promise<boolean> {\n return new Promise((resolve) => {\n const args =\n packageManager === \"pnpm\"\n ? [\"add\", \"-g\", `${PACKAGE_NAME}@latest`]\n : [\"install\", \"-g\", `${PACKAGE_NAME}@latest`];\n\n const child = safeSpawn(packageManager, args, {\n stdio: \"inherit\",\n });\n\n child.on(\"close\", (code) => {\n resolve(code === 0);\n });\n\n child.on(\"error\", () => {\n resolve(false);\n });\n });\n}\n\n/**\n * Check for updates and perform upgrade if needed\n * Returns true if caller should exit (upgrade happened or failed)\n * Returns false if caller should continue (no update needed, check failed, or unsupported PM)\n */\nexport async function checkAndUpgrade(\n currentVersion: string,\n prompt: string | undefined,\n): Promise<boolean> {\n const latestVersion = await getLatestVersion();\n\n // If we couldn't check, warn and continue\n if (latestVersion === null) {\n console.log(chalk.yellow(\"⚠ Could not check for updates\"));\n console.log();\n return false;\n }\n\n // If already on latest, continue\n if (latestVersion === currentVersion) {\n return false;\n }\n\n // New version available - show beta notice\n console.log(chalk.yellow(\"vm0 is currently in beta.\"));\n console.log(\n chalk.yellow(\n `Current version: ${currentVersion} -> Latest version: ${latestVersion}`,\n ),\n );\n console.log(\n chalk.yellow(\n \"Please always use the latest version for best compatibility.\",\n ),\n );\n console.log();\n\n // Check package manager\n const packageManager = detectPackageManager();\n\n // For unsupported package managers, show manual upgrade instructions and continue\n if (!isAutoUpgradeSupported(packageManager)) {\n if (packageManager === \"unknown\") {\n console.log(\n chalk.yellow(\"Could not detect your package manager for auto-upgrade.\"),\n );\n } else {\n console.log(\n chalk.yellow(`Auto-upgrade is not supported for ${packageManager}.`),\n );\n }\n console.log(chalk.yellow(\"Please upgrade manually:\"));\n console.log(chalk.cyan(` ${getManualUpgradeCommand(packageManager)}`));\n console.log();\n return false;\n }\n\n // Perform upgrade for supported package managers (npm, pnpm)\n console.log(`Upgrading via ${packageManager}...`);\n const success = await performUpgrade(packageManager);\n\n if (success) {\n console.log(chalk.green(`Upgraded to ${latestVersion}`));\n console.log();\n console.log(\"To continue, run:\");\n console.log(chalk.cyan(` ${buildRerunCommand(prompt)}`));\n return true;\n }\n\n // Upgrade failed - show manual instructions\n console.error();\n console.error(chalk.red(\"✗ Upgrade failed. Please run manually:\"));\n console.error(chalk.cyan(` ${getManualUpgradeCommand(packageManager)}`));\n console.error();\n console.error(\"Then re-run:\");\n console.error(chalk.cyan(` ${buildRerunCommand(prompt)}`));\n return true;\n}\n\n/**\n * Start silent upgrade in background.\n * Call this at command start. Does NOT block after spawning.\n * The upgrade runs in parallel with command execution.\n *\n * @param currentVersion - Current CLI version\n * @returns Promise that resolves after starting upgrade (or determining no upgrade needed)\n */\nexport async function startSilentUpgrade(\n currentVersion: string,\n): Promise<void> {\n // Reset any previous state\n pendingUpgrade = null;\n\n // Check for new version\n const latestVersion = await getLatestVersion();\n\n // If check failed or already on latest, return silently\n if (latestVersion === null || latestVersion === currentVersion) {\n return;\n }\n\n // Check package manager\n const packageManager = detectPackageManager();\n\n // For unsupported package managers, return silently (no whisper)\n if (!isAutoUpgradeSupported(packageManager)) {\n return;\n }\n\n // Spawn upgrade process (don't wait for completion)\n const isWindows = process.platform === \"win32\";\n const args =\n packageManager === \"pnpm\"\n ? [\"add\", \"-g\", `${PACKAGE_NAME}@latest`]\n : [\"install\", \"-g\", `${PACKAGE_NAME}@latest`];\n\n const child = safeSpawn(packageManager, args, {\n stdio: \"pipe\",\n detached: !isWindows,\n windowsHide: true,\n });\n\n const promise = new Promise<boolean>((resolve) => {\n child.on(\"close\", (code) => {\n return resolve(code === 0);\n });\n child.on(\"error\", () => {\n return resolve(false);\n });\n });\n\n pendingUpgrade = { promise, child, packageManager };\n}\n\n/**\n * Wait for pending upgrade to complete and show warning if failed.\n * Call this at command end.\n *\n * @param timeout - Max time to wait if upgrade still running (ms)\n * @returns Promise that resolves when upgrade completes or times out\n */\nexport async function waitForSilentUpgrade(\n timeout: number = TIMEOUT_MS,\n): Promise<void> {\n if (!pendingUpgrade) {\n return;\n }\n\n const { promise, child, packageManager } = pendingUpgrade;\n pendingUpgrade = null; // Clear state\n\n // Race between upgrade completion and timeout\n const result = await Promise.race([\n promise,\n new Promise<false>((resolve) => {\n setTimeout(() => {\n child.kill();\n resolve(false);\n }, timeout);\n }),\n ]);\n\n // Show whisper message only on failure\n if (!result) {\n console.log(\n chalk.yellow(\n `\\n⚠ vm0 auto upgrade failed. Please run: ${getManualUpgradeCommand(packageManager)}`,\n ),\n );\n }\n}\n","import { spawn, type SpawnOptions } from \"child_process\";\nimport type { ChildProcess } from \"child_process\";\n\n/**\n * Spawn a child process with safe Windows shell handling.\n *\n * On Windows, `shell: true` is required to resolve `.cmd` extensions for\n * commands like `npm`, `pnpm`, etc. On other platforms, shell is disabled\n * to avoid unnecessary shell interpretation. Commands passed to this\n * function must be hardcoded strings (not user input), and arguments\n * must use array form to prevent shell injection.\n *\n */\nexport function safeSpawn(\n command: string,\n args: string[],\n options?: Omit<SpawnOptions, \"shell\">,\n): ChildProcess {\n const isWindows = process.platform === \"win32\";\n const resolvedCommand = isWindows ? `${command}.cmd` : command;\n\n // nosemgrep: javascript.lang.security.audit.spawn-shell-true.spawn-shell-true, javascript.lang.security.detect-child-process.detect-child-process\n return spawn(resolvedCommand, args, {\n ...options,\n shell: isWindows,\n });\n}\n","import { Command, Option } from \"commander\";\nimport chalk from \"chalk\";\nimport { readFile, rm } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { extractAndGroupVariables, resolveSkillRef } from \"@vm0/core\";\nimport {\n getComposeByName,\n createOrUpdateCompose,\n listZeroSecrets,\n listZeroVariables,\n listZeroConnectors,\n resolveSkills,\n} from \"../../lib/api\";\nimport { validateAgentCompose } from \"../../lib/domain/yaml-validator\";\nimport {\n downloadGitHubDirectory,\n parseGitHubTreeUrl,\n} from \"../../lib/domain/github-skills\";\nimport {\n uploadInstructions,\n uploadSkill,\n type SkillUploadResult,\n} from \"../../lib/storage/system-storage\";\nimport { isInteractive, promptConfirm } from \"../../lib/utils/prompt-utils\";\nimport {\n startSilentUpgrade,\n waitForSilentUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nconst DEFAULT_CONFIG_FILE = \"vm0.yaml\";\n\n/**\n * Check if input is a GitHub URL (supports plain repo, root with branch, and subdirectory)\n * Matches: https://github.com/owner/repo[/tree/branch[/path]]\n */\nfunction isGitHubUrl(input: string): boolean {\n return /^https:\\/\\/github\\.com\\/[^/]+\\/[^/]+/.test(input);\n}\n\n/**\n * Extract secret names from compose content using variable references.\n * Looks for ${{ secrets.XXX }} patterns in the compose.\n */\nexport function getSecretsFromComposeContent(content: unknown): Set<string> {\n const grouped = extractAndGroupVariables(content);\n return new Set(\n grouped.secrets.map((r) => {\n return r.name;\n }),\n );\n}\n\n/**\n * Extract variable names from compose content using variable references.\n * Looks for ${{ vars.XXX }} patterns in the compose.\n */\nfunction getVarsFromComposeContent(content: unknown): Set<string> {\n const grouped = extractAndGroupVariables(content);\n return new Set(\n grouped.vars.map((r) => {\n return r.name;\n }),\n );\n}\n\ninterface AgentConfig {\n instructions?: string;\n framework?: string;\n skills?: string[];\n environment?: Record<string, string>;\n}\n\ninterface LoadedConfig {\n config: unknown;\n agentName: string;\n agent: AgentConfig;\n basePath: string;\n}\n\n/**\n * Load and validate the compose config file.\n * Returns parsed config with agent info or exits on error.\n */\nasync function loadAndValidateConfig(\n configFile: string,\n): Promise<LoadedConfig> {\n if (!existsSync(configFile)) {\n throw new Error(`Config file not found: ${configFile}`);\n }\n\n const content = await readFile(configFile, \"utf8\");\n\n let config: unknown;\n try {\n config = parseYaml(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n throw new Error(`Invalid YAML format: ${message}`);\n }\n\n const validation = validateAgentCompose(config);\n if (!validation.valid) {\n throw new Error(validation.error);\n }\n\n const cfg = config as Record<string, unknown>;\n const agentsConfig = cfg.agents as Record<string, Record<string, unknown>>;\n const agentName = Object.keys(agentsConfig)[0]!;\n const agent = agentsConfig[agentName] as AgentConfig;\n const basePath = dirname(configFile);\n\n return { config, agentName, agent, basePath };\n}\n\n/**\n * Type guard to check if config has a non-empty volumes field.\n */\nfunction hasVolumes(config: unknown): boolean {\n if (typeof config !== \"object\" || config === null) {\n return false;\n }\n const cfg = config as Record<string, unknown>;\n const volumes = cfg.volumes;\n return (\n typeof volumes === \"object\" &&\n volumes !== null &&\n Object.keys(volumes).length > 0\n );\n}\n\n/**\n * Upload instructions and skills, returning skill results.\n */\nasync function uploadAssets(\n agentName: string,\n agent: AgentConfig,\n basePath: string,\n jsonMode?: boolean,\n): Promise<SkillUploadResult[]> {\n if (agent.instructions) {\n if (!jsonMode) {\n console.log(`Uploading instructions: ${agent.instructions}`);\n }\n const result = await uploadInstructions(\n agentName,\n agent.instructions,\n basePath,\n agent.framework,\n );\n if (!jsonMode) {\n console.log(\n chalk.green(\n `✓ Instructions ${result.action === \"deduplicated\" ? \"(unchanged)\" : \"uploaded\"}: ${result.versionId.slice(0, 8)}`,\n ),\n );\n }\n }\n\n const skillResults: SkillUploadResult[] = [];\n if (agent.skills && Array.isArray(agent.skills)) {\n // Normalize bare skill names to full GitHub URLs before upload\n agent.skills = agent.skills.map(resolveSkillRef);\n\n if (!jsonMode) {\n console.log(`Uploading ${agent.skills.length} skill(s)...`);\n }\n\n // Batch resolve official skills against server cache\n const { resolved, unresolved } = await resolveSkills(agent.skills);\n\n // Use resolved skills directly (no download, no upload)\n for (const skillUrl of agent.skills) {\n const skill = resolved[skillUrl];\n if (skill) {\n const parsed = parseGitHubTreeUrl(skillUrl);\n skillResults.push({\n name: skill.storageName,\n versionId: skill.versionHash,\n action: \"resolved\",\n skillName: parsed.skillName,\n frontmatter: skill.frontmatter,\n });\n if (!jsonMode) {\n console.log(chalk.green(` ✓ ${parsed.skillName} (cached)`));\n }\n }\n }\n\n // Fall back to old flow for unresolved skills\n for (const skillUrl of unresolved) {\n if (!jsonMode) {\n console.log(chalk.dim(` Downloading: ${skillUrl}`));\n }\n const result = await uploadSkill(skillUrl);\n skillResults.push(result);\n if (!jsonMode) {\n console.log(\n chalk.green(\n ` ✓ Skill ${result.action === \"deduplicated\" ? \"(unchanged)\" : \"uploaded\"}: ${result.skillName} (${result.versionId.slice(0, 8)})`,\n ),\n );\n }\n }\n }\n\n return skillResults;\n}\n\n/**\n * Derive the app URL from the API URL by replacing \"www\" with \"app\" in the hostname.\n */\ninterface MissingItemsResult {\n missingSecrets: string[];\n missingVars: string[];\n}\n\n/**\n * Check for missing secrets/vars and print setup URL if any are missing.\n */\nasync function checkAndPromptMissingItems(\n config: unknown,\n options: { json?: boolean },\n): Promise<MissingItemsResult> {\n const requiredSecrets = getSecretsFromComposeContent(config);\n const requiredVars = getVarsFromComposeContent(config);\n\n if (requiredSecrets.size === 0 && requiredVars.size === 0) {\n return { missingSecrets: [], missingVars: [] };\n }\n\n const [secretsResponse, variablesResponse, connectorsResponse] =\n await Promise.all([\n requiredSecrets.size > 0 ? listZeroSecrets() : { secrets: [] },\n requiredVars.size > 0 ? listZeroVariables() : { variables: [] },\n listZeroConnectors(),\n ]);\n\n const existingSecretNames = new Set(\n secretsResponse.secrets.map((s) => {\n return s.name;\n }),\n );\n const existingVarNames = new Set(\n variablesResponse.variables.map((v) => {\n return v.name;\n }),\n );\n\n // Connector-provided secrets (e.g., GH_TOKEN from GitHub connector)\n // Use server-computed list to avoid CLI/server version skew issues\n const connectorProvided = new Set(\n connectorsResponse.connectorProvidedSecretNames,\n );\n\n const missingSecrets = [...requiredSecrets].filter((name) => {\n return !existingSecretNames.has(name) && !connectorProvided.has(name);\n });\n const missingVars = [...requiredVars].filter((name) => {\n return !existingVarNames.has(name);\n });\n\n if (missingSecrets.length === 0 && missingVars.length === 0) {\n return { missingSecrets: [], missingVars: [] };\n }\n\n if (!options.json) {\n console.log();\n console.log(chalk.yellow(\"⚠ Missing secrets/variables detected:\"));\n if (missingSecrets.length > 0) {\n console.log(chalk.yellow(` Secrets: ${missingSecrets.join(\", \")}`));\n }\n if (missingVars.length > 0) {\n console.log(chalk.yellow(` Variables: ${missingVars.join(\", \")}`));\n }\n console.log();\n }\n\n return { missingSecrets, missingVars };\n}\n\n/**\n * Result from finalizeCompose for JSON output\n */\ninterface ComposeResult {\n composeId: string;\n composeName: string;\n versionId: string;\n action: \"created\" | \"existing\";\n displayName: string;\n missingSecrets?: string[];\n missingVars?: string[];\n}\n\n/**\n * Finalize compose: call API and display result.\n * Shared by both GitHub URL and local file flows.\n * Returns the compose result for JSON output mode.\n */\nasync function finalizeCompose(\n config: unknown,\n agent: AgentConfig,\n options: { yes?: boolean; autoUpdate?: boolean; json?: boolean },\n): Promise<ComposeResult> {\n // Call API\n if (!options.json) {\n console.log(\"Uploading compose...\");\n }\n const response = await createOrUpdateCompose({ content: config });\n\n const shortVersionId = response.versionId.slice(0, 8);\n const displayName = response.name;\n\n // Build result\n const result: ComposeResult = {\n composeId: response.composeId,\n composeName: response.name,\n versionId: response.versionId,\n action: response.action,\n displayName,\n };\n\n // In --json mode, skip missing items check — E2B doesn't read these fields\n if (!options.json) {\n const missingItems = await checkAndPromptMissingItems(config, options);\n if (\n missingItems.missingSecrets.length > 0 ||\n missingItems.missingVars.length > 0\n ) {\n result.missingSecrets = missingItems.missingSecrets;\n result.missingVars = missingItems.missingVars;\n }\n }\n\n // Display human-readable result (skip in JSON mode)\n if (!options.json) {\n if (response.action === \"created\") {\n console.log(chalk.green(`✓ Compose created: ${displayName}`));\n } else {\n console.log(chalk.green(`✓ Compose version exists: ${displayName}`));\n }\n\n console.log(chalk.dim(` Version: ${shortVersionId}`));\n console.log();\n console.log(\" Run your agent:\");\n console.log(\n chalk.cyan(\n ` vm0 run ${displayName}:${shortVersionId} --artifact-name <artifact> \"your prompt\"`,\n ),\n );\n }\n\n // Wait for upgrade at command end (shows warning if failed)\n if (options.autoUpdate !== false) {\n await waitForSilentUpgrade();\n }\n\n return result;\n}\n\n/**\n * Handle compose from GitHub URL\n */\nasync function handleGitHubCompose(\n url: string,\n options: { yes?: boolean; autoUpdate?: boolean; json?: boolean },\n): Promise<ComposeResult> {\n if (!options.json) {\n console.log(`Downloading from GitHub: ${url}`);\n }\n\n const { dir: downloadedDir, tempRoot } = await downloadGitHubDirectory(url);\n const configFile = join(downloadedDir, \"vm0.yaml\");\n\n try {\n if (!existsSync(configFile)) {\n throw new Error(\"vm0.yaml not found in the GitHub directory\", {\n cause: new Error(`URL: ${url}`),\n });\n }\n\n // Load and validate config\n const { config, agentName, agent, basePath } =\n await loadAndValidateConfig(configFile);\n\n // Check if agent with same name already exists\n const existingCompose = await getComposeByName(agentName);\n if (existingCompose) {\n if (!options.json) {\n console.log();\n console.log(\n chalk.yellow(`⚠ An agent named \"${agentName}\" already exists.`),\n );\n }\n\n if (!isInteractive()) {\n // Non-interactive mode: require --yes flag to overwrite\n if (!options.yes) {\n throw new Error(\n \"Cannot overwrite existing agent in non-interactive mode\",\n {\n cause: new Error(\n \"Use --yes flag to confirm overwriting the existing agent.\",\n ),\n },\n );\n }\n } else {\n // Interactive mode: prompt user (default No)\n const confirmed = await promptConfirm(\n \"Do you want to overwrite it?\",\n false,\n );\n if (!confirmed) {\n if (!options.json) {\n console.log(chalk.yellow(\"Compose cancelled.\"));\n }\n process.exit(0);\n }\n }\n }\n\n // Check for unsupported volumes\n if (hasVolumes(config)) {\n throw new Error(\"Volumes are not supported for GitHub URL compose\", {\n cause: new Error(\n \"Clone the repository locally and run: vm0 compose ./path/to/vm0.yaml\",\n ),\n });\n }\n\n // Upload instructions and skills\n await uploadAssets(agentName, agent, basePath, options.json);\n\n // Finalize compose (upload, display)\n return await finalizeCompose(config, agent, options);\n } finally {\n // Cleanup temp directory\n await rm(tempRoot, { recursive: true, force: true });\n }\n}\n\nexport const composeCommand = new Command()\n .name(\"compose\")\n .description(\"Create or update agent compose (e.g., vm0.yaml)\")\n .argument(\n \"[agent-yaml]\",\n `Path to agent YAML file or GitHub tree URL (default: ${DEFAULT_CONFIG_FILE})`,\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\n \"--experimental-shared-compose\",\n \"[deprecated] No longer required, kept for backward compatibility\",\n )\n .option(\"--json\", \"Output JSON for scripts (suppresses interactive output)\")\n .option(\n \"--porcelain\",\n \"[deprecated: use --json] Output JSON for scripts\",\n false,\n )\n .addOption(new Option(\"--no-auto-update\").hideHelp())\n .action(\n withErrorHandler(\n async (\n configFile: string | undefined,\n options: {\n yes?: boolean;\n autoUpdate?: boolean;\n experimentalSharedCompose?: boolean;\n json?: boolean;\n porcelain?: boolean;\n },\n ) => {\n const resolvedConfigFile = configFile ?? DEFAULT_CONFIG_FILE;\n\n // Handle deprecated --porcelain flag\n if (options.porcelain && !options.json) {\n console.error(\n chalk.yellow(\"⚠ --porcelain is deprecated, use --json instead\"),\n );\n options.json = true;\n }\n\n // JSON mode implies --yes and disables auto-update (for CI/CD usage)\n if (options.json) {\n options.yes = true;\n options.autoUpdate = false;\n }\n\n // Start upgrade in background at command start (runs in parallel)\n if (options.autoUpdate !== false) {\n await startSilentUpgrade(__CLI_VERSION__);\n }\n\n try {\n let result: ComposeResult;\n\n // Branch based on input type\n if (isGitHubUrl(resolvedConfigFile)) {\n result = await handleGitHubCompose(resolvedConfigFile, options);\n } else {\n // Existing local file flow\n // 1. Load and validate config\n const { config, agentName, agent, basePath } =\n await loadAndValidateConfig(resolvedConfigFile);\n\n // 3. Upload instructions and skills\n await uploadAssets(agentName, agent, basePath, options.json);\n\n // 4. Finalize compose (upload, display)\n result = await finalizeCompose(config, agent, options);\n }\n\n // Output JSON result if requested\n if (options.json) {\n console.log(JSON.stringify(result));\n }\n } catch (error) {\n if (options.json) {\n const message =\n error instanceof Error\n ? error.message\n : \"An unexpected error occurred\";\n console.log(JSON.stringify({ error: message }));\n process.exit(1);\n }\n\n throw error;\n }\n },\n ),\n );\n","import { z } from \"zod\";\nimport {\n agentDefinitionSchema,\n volumeConfigSchema,\n resolveSkillRef,\n} from \"@vm0/core\";\n\n/**\n * CLI-specific agent name schema that allows 3-character names.\n * Pattern: start/end with alphanumeric, middle can have hyphens\n */\nconst cliAgentNameSchema = z\n .string()\n .min(3, \"Agent name must be at least 3 characters\")\n .max(64, \"Agent name must be 64 characters or less\")\n .regex(\n /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,62}[a-zA-Z0-9])?$/,\n \"Agent name must start and end with letter or number, and contain only letters, numbers, and hyphens\",\n );\n\n/**\n * CLI-extended agent definition schema with skills URL validation\n *\n * Note: Framework validation is handled server-side.\n * The server rejects unsupported frameworks.\n */\nconst cliAgentDefinitionSchema = agentDefinitionSchema.superRefine(\n (agent, ctx) => {\n // Validate skills: bare names or full GitHub URLs\n if (agent.skills) {\n for (let i = 0; i < agent.skills.length; i++) {\n const skillRef = agent.skills[i];\n if (skillRef) {\n try {\n resolveSkillRef(skillRef);\n } catch (error) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n error instanceof Error\n ? error.message\n : `Invalid skill reference: ${skillRef}`,\n path: [\"skills\", i],\n });\n }\n }\n }\n }\n },\n);\n\n/**\n * CLI compose schema with single-agent rule and volume mount validation\n */\nconst cliComposeSchema = z\n .object({\n version: z.string().min(1, \"Missing config.version\"),\n agents: z.record(cliAgentNameSchema, cliAgentDefinitionSchema),\n volumes: z.record(z.string(), volumeConfigSchema).optional(),\n })\n .superRefine((config, ctx) => {\n const agentKeys = Object.keys(config.agents);\n\n // CLI business rule: at least one agent required\n if (agentKeys.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"agents must have at least one agent defined\",\n path: [\"agents\"],\n });\n return;\n }\n\n // CLI business rule: only one agent allowed\n if (agentKeys.length > 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Multiple agents not supported yet. Only one agent allowed.\",\n path: [\"agents\"],\n });\n return;\n }\n\n // Volume mount validation\n const agentName = agentKeys[0]!;\n const agent = config.agents[agentName];\n const agentVolumes = agent?.volumes;\n\n if (agentVolumes && agentVolumes.length > 0) {\n if (!config.volumes) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Agent references volumes but no volumes section defined. Each volume must have explicit name and version.\",\n path: [\"volumes\"],\n });\n return;\n }\n\n for (const volDeclaration of agentVolumes) {\n const parts = volDeclaration.split(\":\");\n if (parts.length !== 2) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid volume declaration: ${volDeclaration}. Expected format: volume-key:/mount/path`,\n path: [\"agents\", agentName, \"volumes\"],\n });\n continue;\n }\n\n const volumeKey = parts[0]!.trim();\n if (!config.volumes[volumeKey]) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Volume \"${volumeKey}\" is not defined in volumes section. Each volume must have explicit name and version.`,\n path: [\"volumes\", volumeKey],\n });\n }\n }\n }\n });\n\n/**\n * Format an invalid_type Zod issue into a user-friendly message.\n * Returns null if no special formatting applies.\n */\nfunction formatInvalidTypeIssue(\n path: string,\n issue: z.ZodIssue & { expected?: string },\n): string | null {\n // Zod 4 uses 'input' instead of 'received' in types, but runtime has 'received'\n const received = (issue as unknown as { received?: string }).received;\n\n // Missing required fields (handles both \"Required\" and \"Invalid input:\" messages)\n const isMissing =\n received === \"undefined\" ||\n issue.message.includes(\"received undefined\") ||\n issue.message === \"Required\";\n\n if (path === \"version\" && isMissing) {\n return \"Missing config.version\";\n }\n if (path === \"agents\" && isMissing) {\n return \"Missing agents object in config\";\n }\n // Volume field errors\n if (path.startsWith(\"volumes.\") && path.endsWith(\".name\")) {\n const volumeKey = path.split(\".\")[1];\n return `Volume \"${volumeKey}\" must have a 'name' field (string)`;\n }\n if (path.startsWith(\"volumes.\") && path.endsWith(\".version\")) {\n const volumeKey = path.split(\".\")[1];\n return `Volume \"${volumeKey}\" must have a 'version' field (string)`;\n }\n // Array type errors\n if (issue.expected === \"array\") {\n const fieldName = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n return `${fieldName} must be an array`;\n }\n // Array element type errors (number where string expected)\n if (issue.expected === \"string\" && received === \"number\") {\n const fieldName = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n const match = fieldName.match(/^(agent\\.[^.]+)\\.\\d+$/);\n if (match) {\n return `Each entry in ${match[1]?.replace(\"agent.\", \"\")} must be a string`;\n }\n }\n return null;\n}\n\n/**\n * Formats a Zod error into a user-friendly string\n */\nfunction formatZodError(error: z.ZodError): string {\n const issue = error.issues[0];\n if (!issue) return \"Validation failed\";\n\n const path = issue.path.join(\".\");\n const message = issue.message;\n\n // Root-level errors or custom messages without path context\n if (!path) return message;\n\n // Handle invalid_type errors with user-friendly messages\n if (issue.code === \"invalid_type\") {\n const formatted = formatInvalidTypeIssue(path, issue);\n if (formatted) return formatted;\n }\n\n // Handle invalid_key for agent name key validation (Zod 4 uses invalid_key instead of invalid_string)\n if (issue.code === \"invalid_key\" && path.startsWith(\"agents.\")) {\n return \"Invalid agent name format. Must be 3-64 characters, letters, numbers, and hyphens only. Must start and end with letter or number.\";\n }\n\n // Handle invalid key in record (agent name validation)\n if (message === \"Invalid key in record\" && path.startsWith(\"agents.\")) {\n return \"Invalid agent name format. Must be 3-64 characters, letters, numbers, and hyphens only. Must start and end with letter or number.\";\n }\n\n // Handle custom errors (our superRefine messages) - return without path prefix\n if (issue.code === \"custom\") {\n return message;\n }\n\n // Handle agent-level errors with cleaner paths\n if (path.startsWith(\"agents.\")) {\n const cleanPath = path.replace(/^agents\\.[^.]+\\./, \"agent.\");\n // For \"Invalid input\" messages, provide cleaner error\n if (message.startsWith(\"Invalid input:\")) {\n const match = message.match(/expected (\\w+), received (\\w+)/);\n if (match && match[1] === \"string\" && match[2] === \"number\") {\n const fieldMatch = cleanPath.match(/^(agent\\.[^.]+)\\.\\d+$/);\n if (fieldMatch) {\n return `Each entry in ${fieldMatch[1]?.replace(\"agent.\", \"\")} must be a string`;\n }\n }\n }\n return `${cleanPath}: ${message}`;\n }\n\n return `${path}: ${message}`;\n}\n\n/**\n * Validates agent.name format\n */\nexport function validateAgentName(name: string): boolean {\n return cliAgentNameSchema.safeParse(name).success;\n}\n\n/**\n * Known fields in agent definition schema, derived from the Zod schema shape.\n * Used for typo detection against unknown fields in YAML config.\n */\nconst KNOWN_AGENT_FIELDS = Object.keys(agentDefinitionSchema.shape);\n\n/**\n * Computes Levenshtein edit distance between two strings.\n * Uses single-row DP optimization for O(min(m,n)) space.\n */\nfunction levenshteinDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n\n // Ensure a is the shorter string for space optimization\n if (a.length > b.length) [a, b] = [b, a];\n\n const row = Array.from({ length: a.length + 1 }, (_, i) => {\n return i;\n });\n\n for (let j = 1; j <= b.length; j++) {\n let prev = j - 1;\n row[0] = j;\n for (let i = 1; i <= a.length; i++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n const current = Math.min(\n row[i]! + 1, // deletion\n row[i - 1]! + 1, // insertion\n prev + cost, // substitution\n );\n prev = row[i]!;\n row[i] = current;\n }\n }\n\n return row[a.length]!;\n}\n\n/**\n * Finds the most similar known field for an unknown field name.\n * Uses two strategies:\n * 1. Levenshtein distance ≤ 2 for close typos (e.g., \"environments\" → \"environment\")\n * 2. Prefix containment for abbreviations (e.g., \"env\" → \"environment\")\n *\n * Returns the best matching field name, or null if no match found.\n */\nfunction findSimilarField(\n unknown: string,\n knownFields: string[],\n): string | null {\n let bestMatch: string | null = null;\n let bestDistance = Infinity;\n\n for (const known of knownFields) {\n if (unknown === known) continue;\n\n // Check 1: Levenshtein distance ≤ 2\n const distance = levenshteinDistance(unknown, known);\n if (distance <= 2 && distance < bestDistance) {\n bestDistance = distance;\n bestMatch = known;\n }\n\n // Check 2: Prefix containment (unknown is a prefix of known, min 3 chars)\n if (unknown.length >= 3 && known.startsWith(unknown) && !bestMatch) {\n bestMatch = known;\n }\n }\n\n return bestMatch;\n}\n\n/**\n * Extracts agent entries from raw config, with type guards.\n * Returns null if config structure is invalid for agent inspection.\n */\nfunction extractAgentEntries(\n config: unknown,\n): Record<string, Record<string, unknown>> | null {\n if (!config || typeof config !== \"object\") return null;\n const cfg = config as Record<string, unknown>;\n const agents = cfg.agents as\n | Record<string, Record<string, unknown>>\n | undefined;\n if (!agents || typeof agents !== \"object\" || Array.isArray(agents))\n return null;\n return agents;\n}\n\n/**\n * Checks for unknown fields in agent definitions that look like typos.\n * Returns an error message listing all detected typos, or null if none found.\n */\nfunction checkForFieldTypos(config: unknown): string | null {\n const agents = extractAgentEntries(config);\n if (!agents) return null;\n\n const errors: string[] = [];\n\n for (const [agentName, agent] of Object.entries(agents)) {\n if (!agent || typeof agent !== \"object\" || Array.isArray(agent)) continue;\n\n for (const field of Object.keys(agent)) {\n if (KNOWN_AGENT_FIELDS.includes(field)) continue;\n\n const suggestion = findSimilarField(field, KNOWN_AGENT_FIELDS);\n if (suggestion) {\n errors.push(\n `Unknown field \"${field}\" in agent \"${agentName}\". Did you mean \"${suggestion}\"?`,\n );\n }\n }\n }\n\n return errors.length > 0 ? errors.join(\"\\n\") : null;\n}\n\n/**\n * Checks for deprecated 'provider' field and returns migration error message\n */\nfunction checkForDeprecatedProvider(config: unknown): string | null {\n const agents = extractAgentEntries(config);\n if (!agents) return null;\n\n for (const agent of Object.values(agents)) {\n if (agent && typeof agent === \"object\" && !Array.isArray(agent)) {\n if (\"provider\" in agent && !(\"framework\" in agent)) {\n const providerValue = agent.provider;\n return `'provider' field is deprecated. Use 'framework' instead.\\n\\nChange in your vm0.yaml:\\n - provider: ${providerValue}\\n + framework: ${providerValue}`;\n }\n }\n }\n return null;\n}\n\n/**\n * Validates agent compose structure using Zod schemas\n */\nexport function validateAgentCompose(config: unknown): {\n valid: boolean;\n error?: string;\n} {\n // Pre-check: Deprecated 'provider' field\n const deprecationError = checkForDeprecatedProvider(config);\n if (deprecationError) {\n return { valid: false, error: deprecationError };\n }\n\n // Pre-check: Detect likely typos in agent definition fields\n const typoError = checkForFieldTypos(config);\n if (typoError) {\n return { valid: false, error: typoError };\n }\n\n // Pre-check: Better error for array agents (common mistake)\n if (\n config &&\n typeof config === \"object\" &&\n Array.isArray((config as Record<string, unknown>).agents)\n ) {\n return {\n valid: false,\n error:\n \"agents must be an object, not an array. Use format: agents: { agent-name: { ... } }\",\n };\n }\n\n // Pre-check: Basic object check\n if (!config || typeof config !== \"object\") {\n return { valid: false, error: \"Config must be an object\" };\n }\n\n // Main validation using CLI compose schema\n const result = cliComposeSchema.safeParse(config);\n if (!result.success) {\n return { valid: false, error: formatZodError(result.error) };\n }\n\n return { valid: true };\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport {\n getInstructionsStorageName,\n getSkillStorageName as getCoreSkillStorageName,\n parseGitHubTreeUrl as parseGitHubTreeUrlCore,\n parseSkillFrontmatter,\n type ParsedGitHubTreeUrl,\n type SkillFrontmatter,\n} from \"@vm0/core\";\n\n// Re-export from @vm0/core for convenience\nexport { getInstructionsStorageName, type SkillFrontmatter };\n\n// Re-export git operations from boundary module for backward compatibility\nexport {\n downloadGitHubSkill,\n downloadGitHubDirectory,\n} from \"../external/git-client\";\n\n// Re-export the type with the local name for backwards compatibility\ntype ParsedGitHubUrl = ParsedGitHubTreeUrl;\n\n/**\n * Parse a GitHub tree URL into its components\n * Expected format: https://github.com/{owner}/{repo}/tree/{branch}/{path}\n *\n * Note: Branch names containing slashes (e.g., feature/foo) may not parse correctly.\n * The fullPath field is always correct and used for unique storage naming.\n *\n * @param url - GitHub tree URL\n * @returns Parsed URL components\n * @throws Error if URL format is invalid\n */\nexport function parseGitHubTreeUrl(url: string): ParsedGitHubUrl {\n const parsed = parseGitHubTreeUrlCore(url);\n if (!parsed) {\n throw new Error(\n `Invalid GitHub tree URL: ${url}. Expected format: https://github.com/{owner}/{repo}/tree/{branch}/{path}`,\n );\n }\n return parsed;\n}\n\n/**\n * Generate the storage name for an agent skill\n * Format: agent-skills@{fullPath}\n *\n * @param parsed - Parsed GitHub URL\n * @returns Storage name for the skill\n */\nexport function getSkillStorageName(parsed: ParsedGitHubUrl): string {\n return getCoreSkillStorageName(parsed.fullPath);\n}\n\n/**\n * Validate that a downloaded skill has the required SKILL.md file\n *\n * @param skillDir - Path to the downloaded skill directory\n * @returns True if valid, throws error otherwise\n */\nexport async function validateSkillDirectory(skillDir: string): Promise<void> {\n const skillMdPath = path.join(skillDir, \"SKILL.md\");\n try {\n await fs.access(skillMdPath);\n } catch {\n throw new Error(\n `Skill directory missing required SKILL.md file: ${skillDir}`,\n );\n }\n}\n\n/**\n * Read and parse SKILL.md frontmatter from a skill directory\n *\n * @param skillDir - Path to the skill directory\n * @returns Parsed frontmatter fields\n */\nexport async function readSkillFrontmatter(\n skillDir: string,\n): Promise<SkillFrontmatter> {\n const skillMdPath = path.join(skillDir, \"SKILL.md\");\n const content = await fs.readFile(skillMdPath, \"utf8\");\n return parseSkillFrontmatter(content);\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport {\n parseGitHubUrl as parseGitHubUrlCore,\n type ParsedGitHubTreeUrl,\n} from \"@vm0/core\";\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Sanitize a value intended as a git positional argument to prevent\n * second-order command injection via flags like `--upload-pack`.\n * Only allows safe characters (alphanumeric, dash, underscore, dot, slash).\n * Returns the value if safe; throws otherwise.\n */\nfunction sanitizeGitArg(value: string, label: string): string {\n if (!/^[a-zA-Z0-9._/\\-@]+$/.test(value)) {\n throw new Error(\n `Invalid ${label}: contains disallowed characters. Only alphanumeric, dash, underscore, dot, slash, and @ are permitted.`,\n );\n }\n if (value.startsWith(\"-\")) {\n throw new Error(`Invalid ${label}: must not start with a dash`);\n }\n return value;\n}\n\n/**\n * Result of downloading a GitHub directory\n */\ninterface GitHubDownloadResult {\n /** Path to the downloaded directory */\n dir: string;\n /** Path to the temp root directory (for cleanup) */\n tempRoot: string;\n}\n\n/**\n * Download a GitHub directory using git sparse-checkout\n *\n * @param parsed - Parsed GitHub URL\n * @param destDir - Destination directory for the downloaded content\n * @returns Path to the downloaded skill directory\n */\nexport async function downloadGitHubSkill(\n parsed: ParsedGitHubTreeUrl,\n destDir: string,\n): Promise<string> {\n const owner = sanitizeGitArg(parsed.owner, \"repository owner\");\n const repo = sanitizeGitArg(parsed.repo, \"repository name\");\n const branch = sanitizeGitArg(parsed.branch, \"branch name\");\n const repoUrl = `https://github.com/${owner}/${repo}.git`;\n const skillDir = path.join(destDir, parsed.skillName);\n\n // Create a temporary directory for sparse checkout\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), \"vm0-skill-\"));\n\n try {\n // Initialize sparse checkout\n await execFileAsync(\"git\", [\"init\"], { cwd: tempDir });\n await execFileAsync(\"git\", [\"remote\", \"add\", \"origin\", repoUrl], {\n cwd: tempDir,\n });\n await execFileAsync(\"git\", [\"config\", \"core.sparseCheckout\", \"true\"], {\n cwd: tempDir,\n });\n\n // Configure sparse checkout to only fetch the skill path\n // For root: use \"/*\" to get all root-level files\n // For path: use the path directly\n const sparsePattern = parsed.path || \"/*\";\n const sparseFile = path.join(tempDir, \".git\", \"info\", \"sparse-checkout\");\n await fs.writeFile(sparseFile, sparsePattern + \"\\n\");\n\n // Fetch only the required branch\n await execFileAsync(\"git\", [\"fetch\", \"--depth\", \"1\", \"origin\", branch], {\n cwd: tempDir,\n });\n await execFileAsync(\"git\", [\"checkout\", branch], { cwd: tempDir });\n\n // Move the skill directory to destination\n await fs.mkdir(path.dirname(skillDir), { recursive: true });\n if (parsed.path) {\n // Subdirectory: move the fetched subdirectory\n const fetchedPath = path.join(tempDir, parsed.path);\n await fs.rename(fetchedPath, skillDir);\n } else {\n // Root: move all entries except .git from tempDir\n await fs.mkdir(skillDir, { recursive: true });\n const entries = await fs.readdir(tempDir);\n for (const entry of entries) {\n if (entry === \".git\") continue;\n await fs.rename(path.join(tempDir, entry), path.join(skillDir, entry));\n }\n }\n\n return skillDir;\n } finally {\n // Clean up temp directory\n await fs.rm(tempDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Get the default branch of a GitHub repository using git ls-remote.\n * This avoids dependency on gh CLI and works with just git installed.\n *\n * @param owner - Repository owner\n * @param repo - Repository name\n * @returns Default branch name\n */\nasync function getDefaultBranch(owner: string, repo: string): Promise<string> {\n const safeOwner = sanitizeGitArg(owner, \"repository owner\");\n const safeRepo = sanitizeGitArg(repo, \"repository name\");\n const repoUrl = `https://github.com/${safeOwner}/${safeRepo}.git`;\n try {\n // git ls-remote --symref outputs:\n // ref: refs/heads/main HEAD\n // a1b2c3d... HEAD\n const { stdout } = await execFileAsync(\"git\", [\n \"ls-remote\",\n \"--symref\",\n repoUrl,\n \"HEAD\",\n ]);\n\n // Extract branch name from \"ref: refs/heads/main\" line\n const match = stdout.match(/ref: refs\\/heads\\/([^\\s]+)/);\n if (!match) {\n throw new Error(\n `Could not determine default branch for ${owner}/${repo}`,\n );\n }\n return match[1]!;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"not found\") ||\n message.includes(\"Repository not found\")\n ) {\n throw new Error(`Repository not found: ${owner}/${repo}`);\n }\n if (\n message.includes(\"Authentication failed\") ||\n message.includes(\"could not read Username\")\n ) {\n throw new Error(\n `Cannot access repository ${owner}/${repo}. Is it private?`,\n );\n }\n throw error;\n }\n}\n\n/**\n * Download a GitHub directory using git sparse-checkout.\n * Returns paths to both the downloaded directory and the temp root for cleanup.\n *\n * Supports multiple URL formats:\n * - https://github.com/owner/repo (plain repo, uses default branch, downloads root)\n * - https://github.com/owner/repo/tree/branch (root directory with explicit branch)\n * - https://github.com/owner/repo/tree/branch/path (subdirectory)\n *\n * @param url - GitHub URL\n * @returns Object with dir (downloaded path) and tempRoot (for cleanup)\n */\nexport async function downloadGitHubDirectory(\n url: string,\n): Promise<GitHubDownloadResult> {\n const parsed = parseGitHubUrlCore(url);\n if (!parsed) {\n throw new Error(\n `Invalid GitHub URL: ${url}. Expected format: https://github.com/{owner}/{repo}[/tree/{branch}[/path]]`,\n );\n }\n\n const safeOwner = sanitizeGitArg(parsed.owner, \"repository owner\");\n const safeRepo = sanitizeGitArg(parsed.repo, \"repository name\");\n const repoUrl = `https://github.com/${safeOwner}/${safeRepo}.git`;\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), \"vm0-github-\"));\n\n try {\n // Check git is available\n try {\n await execFileAsync(\"git\", [\"--version\"]);\n } catch {\n throw new Error(\n \"git command not found. Please install git to use GitHub URLs.\",\n );\n }\n\n // Resolve branch if not specified\n const branch = sanitizeGitArg(\n parsed.branch ?? (await getDefaultBranch(safeOwner, safeRepo)),\n \"branch name\",\n );\n\n // Initialize sparse checkout\n await execFileAsync(\"git\", [\"init\"], { cwd: tempDir });\n await execFileAsync(\"git\", [\"remote\", \"add\", \"origin\", repoUrl], {\n cwd: tempDir,\n });\n await execFileAsync(\"git\", [\"config\", \"core.sparseCheckout\", \"true\"], {\n cwd: tempDir,\n });\n\n // Configure sparse checkout pattern\n // For root: use \"/*\" to get all root-level files\n // For path: use the path directly\n const sparsePattern = parsed.path ?? \"/*\";\n const sparseFile = path.join(tempDir, \".git\", \"info\", \"sparse-checkout\");\n await fs.writeFile(sparseFile, sparsePattern + \"\\n\");\n\n // Fetch only the required branch with better error handling\n try {\n await execFileAsync(\"git\", [\"fetch\", \"--depth\", \"1\", \"origin\", branch], {\n cwd: tempDir,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"Authentication failed\") ||\n message.includes(\"could not read Username\")\n ) {\n throw new Error(`Cannot access repository. Is it private? URL: ${url}`);\n }\n if (message.includes(\"couldn't find remote ref\")) {\n throw new Error(`Branch \"${branch}\" not found in repository: ${url}`);\n }\n throw error;\n }\n\n await execFileAsync(\"git\", [\"checkout\", branch], { cwd: tempDir });\n\n // Return directory path\n // For root: return tempDir directly\n // For path: return tempDir/path\n const downloadedDir = parsed.path\n ? path.join(tempDir, parsed.path)\n : tempDir;\n\n return {\n dir: downloadedDir,\n tempRoot: tempDir,\n };\n } catch (error) {\n // Clean up on error\n await fs.rm(tempDir, { recursive: true, force: true });\n throw error;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport {\n parseGitHubTreeUrl,\n downloadGitHubSkill,\n getSkillStorageName,\n getInstructionsStorageName,\n validateSkillDirectory,\n readSkillFrontmatter,\n type SkillFrontmatter,\n} from \"../domain/github-skills\";\nimport { directUpload } from \"./direct-upload\";\nimport { getInstructionsFilename } from \"@vm0/core\";\n\ninterface StorageUploadResult {\n name: string;\n versionId: string;\n action: \"created\" | \"deduplicated\";\n}\n\n/**\n * Result of uploading or resolving a skill, including parsed frontmatter.\n * Action \"resolved\" means the skill was found in server cache (no download/upload needed).\n */\nexport interface SkillUploadResult {\n name: string;\n versionId: string;\n action: \"created\" | \"deduplicated\" | \"resolved\";\n skillName: string;\n frontmatter: SkillFrontmatter;\n}\n\n/**\n * Upload instructions file as a volume\n *\n * @param agentName - Name of the agent (used for storage name)\n * @param instructionsFilePath - Path to the instructions file (e.g., AGENTS.md)\n * @param basePath - Base path for resolving relative paths\n * @param framework - Framework name for determining canonical filename\n * @returns Upload result with storage name and version\n */\nexport async function uploadInstructions(\n agentName: string,\n instructionsFilePath: string,\n basePath: string,\n framework?: string,\n): Promise<StorageUploadResult> {\n // Normalize agent name to lowercase to match server's normalization behavior\n // Server normalizes agent names to lowercase when storing compose configs\n const storageName = getInstructionsStorageName(agentName.toLowerCase());\n\n // Resolve file path relative to base path\n const absolutePath = path.isAbsolute(instructionsFilePath)\n ? instructionsFilePath\n : path.join(basePath, instructionsFilePath);\n\n // Read the instructions file\n const content = await fs.readFile(absolutePath, \"utf8\");\n\n // Create a temporary directory with the file\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), \"vm0-instructions-\"));\n const instructionsDir = path.join(tmpDir, \"instructions\");\n await fs.mkdir(instructionsDir);\n\n // Write file with framework-specific name (e.g., CLAUDE.md for claude-code)\n const filename = getInstructionsFilename(framework);\n await fs.writeFile(path.join(instructionsDir, filename), content);\n\n try {\n // Use direct upload (bypasses Vercel 4.5MB limit)\n const result = await directUpload(storageName, \"volume\", instructionsDir);\n\n return {\n name: storageName,\n versionId: result.versionId,\n action: result.deduplicated ? \"deduplicated\" : \"created\",\n };\n } finally {\n // Clean up temp directory\n await fs.rm(tmpDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Upload a skill from GitHub as a volume\n *\n * @param skillUrl - GitHub tree URL for the skill\n * @returns Upload result with storage name, version, and parsed frontmatter\n */\nexport async function uploadSkill(\n skillUrl: string,\n): Promise<SkillUploadResult> {\n const parsed = parseGitHubTreeUrl(skillUrl);\n const storageName = getSkillStorageName(parsed);\n\n // Create temp directory for download\n const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), \"vm0-skill-\"));\n\n try {\n // Download skill from GitHub\n const skillDir = await downloadGitHubSkill(parsed, tmpDir);\n\n // Validate the skill has SKILL.md\n await validateSkillDirectory(skillDir);\n\n // Parse frontmatter before upload\n const frontmatter = await readSkillFrontmatter(skillDir);\n\n // Use direct upload (bypasses Vercel 4.5MB limit)\n const result = await directUpload(storageName, \"volume\", skillDir);\n\n return {\n name: storageName,\n versionId: result.versionId,\n action: result.deduplicated ? \"deduplicated\" : \"created\",\n skillName: parsed.skillName,\n frontmatter,\n };\n } finally {\n // Clean up temp directory\n await fs.rm(tmpDir, { recursive: true, force: true });\n }\n}\n","import { createHash } from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { prepareStorage, commitStorage } from \"../api\";\nimport { excludeVm0Filter } from \"../utils/file-utils\";\n\n/**\n * File entry with pre-computed hash for direct upload\n */\ninterface FileEntryWithHash {\n path: string;\n hash: string;\n size: number;\n}\n\n/**\n * Result of direct upload operation\n */\ninterface DirectUploadResult {\n versionId: string;\n size: number;\n fileCount: number;\n deduplicated: boolean;\n empty: boolean;\n}\n\n/**\n * Progress callback for upload operations\n */\ntype ProgressCallback = (message: string) => void;\n\n/**\n * Compute SHA-256 hash of a file using streaming to avoid loading large files into memory\n */\nasync function hashFileStream(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = createHash(\"sha256\");\n const stream = fs.createReadStream(filePath);\n\n stream.on(\"data\", (chunk) => {\n return hash.update(chunk);\n });\n stream.on(\"end\", () => {\n return resolve(hash.digest(\"hex\"));\n });\n stream.on(\"error\", reject);\n });\n}\n\n/**\n * Get all files in directory recursively, excluding .vm0/\n */\nasync function getAllFiles(\n dirPath: string,\n baseDir: string = dirPath,\n): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n const relativePath = path.relative(baseDir, fullPath);\n\n // Skip .vm0 directory\n if (relativePath.startsWith(\".vm0\")) {\n continue;\n }\n\n if (entry.isDirectory()) {\n const subFiles = await getAllFiles(fullPath, baseDir);\n files.push(...subFiles);\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n/**\n * Collect file metadata with hashes using streaming to handle large files\n */\nasync function collectFileMetadata(\n cwd: string,\n files: string[],\n onProgress?: ProgressCallback,\n): Promise<FileEntryWithHash[]> {\n const fileEntries: FileEntryWithHash[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i]!;\n const relativePath = path.relative(cwd, file);\n\n // Use streaming hash to avoid loading large files into memory\n const [hash, stats] = await Promise.all([\n hashFileStream(file),\n fs.promises.stat(file),\n ]);\n\n fileEntries.push({\n path: relativePath,\n hash,\n size: stats.size,\n });\n\n // Report progress every 100 files\n if (onProgress && (i + 1) % 100 === 0) {\n onProgress(`Hashing files... ${i + 1}/${files.length}`);\n }\n }\n\n return fileEntries;\n}\n\n/**\n * Create tar.gz archive of files\n */\nasync function createArchive(cwd: string, files: string[]): Promise<Buffer> {\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"archive.tar.gz\");\n\n try {\n const relativePaths = files.map((file) => {\n return path.relative(cwd, file);\n });\n\n if (relativePaths.length > 0) {\n await tar.create(\n {\n gzip: true,\n file: tarPath,\n cwd: cwd,\n },\n relativePaths,\n );\n } else {\n // For empty directories, create tar.gz excluding .vm0\n await tar.create(\n {\n gzip: true,\n file: tarPath,\n cwd: cwd,\n filter: excludeVm0Filter,\n },\n [\".\"],\n );\n }\n\n const tarBuffer = await fs.promises.readFile(tarPath);\n return tarBuffer;\n } finally {\n // Clean up temp files\n if (fs.existsSync(tarPath)) {\n await fs.promises.unlink(tarPath);\n }\n await fs.promises.rmdir(tmpDir);\n }\n}\n\n/**\n * Create manifest JSON for the upload\n */\nfunction createManifest(files: FileEntryWithHash[]): Buffer {\n const manifest = {\n version: 1,\n files,\n createdAt: new Date().toISOString(),\n };\n return Buffer.from(JSON.stringify(manifest, null, 2));\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n return setTimeout(resolve, ms);\n });\n}\n\n/**\n * Upload buffer to presigned URL with retry logic\n */\nasync function uploadToPresignedUrl(\n presignedUrl: string,\n data: Buffer,\n contentType: string,\n maxRetries: number = 3,\n): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n const response = await fetch(presignedUrl, {\n method: \"PUT\",\n body: data,\n headers: {\n \"Content-Type\": contentType,\n },\n });\n\n if (response.ok) {\n return;\n }\n\n // For 4xx errors (client errors), don't retry\n if (response.status >= 400 && response.status < 500) {\n const text = await response.text();\n throw new Error(`S3 upload failed: ${response.status} - ${text}`);\n }\n\n // For 5xx errors, retry with backoff\n const text = await response.text();\n lastError = new Error(`S3 upload failed: ${response.status} - ${text}`);\n } catch (error) {\n lastError =\n error instanceof Error ? error : new Error(\"Unknown upload error\");\n\n // Don't retry on client errors\n if (\n lastError.message.includes(\"400\") ||\n lastError.message.includes(\"403\")\n ) {\n throw lastError;\n }\n }\n\n // Exponential backoff: 1s, 2s, 4s...\n if (attempt < maxRetries) {\n const backoffMs = Math.pow(2, attempt - 1) * 1000;\n await sleep(backoffMs);\n }\n }\n\n throw lastError || new Error(\"S3 upload failed after retries\");\n}\n\n/**\n * Options for direct upload\n */\ninterface DirectUploadOptions {\n onProgress?: ProgressCallback;\n force?: boolean;\n}\n\n/**\n * Perform direct S3 upload for a storage (volume or artifact)\n *\n * This bypasses Vercel's 4.5MB request body limit by:\n * 1. Computing file hashes locally\n * 2. Getting presigned URLs from /api/storages/prepare\n * 3. Uploading directly to S3\n * 4. Committing via /api/storages/commit\n */\nexport async function directUpload(\n storageName: string,\n storageType: \"volume\" | \"artifact\" | \"memory\",\n cwd: string,\n options?: DirectUploadOptions,\n): Promise<DirectUploadResult> {\n const { onProgress, force } = options || {};\n\n // Step 1: Collect all files\n onProgress?.(\"Collecting files...\");\n const files = await getAllFiles(cwd);\n\n // Step 2: Compute hashes for all files\n onProgress?.(\"Computing file hashes...\");\n const fileEntries = await collectFileMetadata(cwd, files, onProgress);\n\n // Step 3: Call prepare endpoint\n onProgress?.(\"Preparing upload...\");\n const prepareResult = await prepareStorage({\n storageName,\n storageType,\n files: fileEntries,\n force,\n });\n\n // Step 4: Check if version already exists (deduplication)\n // Skip upload but still call commit to update HEAD (fixes #626)\n if (prepareResult.existing) {\n onProgress?.(\"Version exists, updating HEAD...\");\n\n const commitResult = await commitStorage({\n storageName,\n storageType,\n versionId: prepareResult.versionId,\n files: fileEntries,\n });\n\n return {\n versionId: commitResult.versionId,\n size: commitResult.size,\n fileCount: commitResult.fileCount,\n deduplicated: true,\n empty: commitResult.fileCount === 0,\n };\n }\n\n // Step 5: Create and upload archive (skip for empty artifacts)\n if (files.length > 0) {\n onProgress?.(\"Compressing files...\");\n const archiveBuffer = await createArchive(cwd, files);\n\n onProgress?.(\"Uploading archive to S3...\");\n if (!prepareResult.uploads) {\n throw new Error(\"No upload URLs received from prepare endpoint\");\n }\n\n await uploadToPresignedUrl(\n prepareResult.uploads.archive.presignedUrl,\n archiveBuffer,\n \"application/gzip\",\n );\n }\n\n // Step 6: Create and upload manifest\n onProgress?.(\"Uploading manifest...\");\n if (!prepareResult.uploads) {\n throw new Error(\"No upload URLs received from prepare endpoint\");\n }\n const manifestBuffer = createManifest(fileEntries);\n await uploadToPresignedUrl(\n prepareResult.uploads.manifest.presignedUrl,\n manifestBuffer,\n \"application/json\",\n );\n\n // Step 7: Commit the upload\n onProgress?.(\"Committing...\");\n const commitResult = await commitStorage({\n storageName,\n storageType,\n versionId: prepareResult.versionId,\n files: fileEntries,\n });\n\n return {\n versionId: commitResult.versionId,\n size: commitResult.size,\n fileCount: commitResult.fileCount,\n deduplicated: commitResult.deduplicated || false,\n empty: commitResult.fileCount === 0,\n };\n}\n","import EE from 'events'\nimport fs from 'fs'\nimport { Minipass } from 'minipass'\n\nconst writev = fs.writev\n\nconst _autoClose = Symbol('_autoClose')\nconst _close = Symbol('_close')\nconst _ended = Symbol('_ended')\nconst _fd = Symbol('_fd')\nconst _finished = Symbol('_finished')\nconst _flags = Symbol('_flags')\nconst _flush = Symbol('_flush')\nconst _handleChunk = Symbol('_handleChunk')\nconst _makeBuf = Symbol('_makeBuf')\nconst _mode = Symbol('_mode')\nconst _needDrain = Symbol('_needDrain')\nconst _onerror = Symbol('_onerror')\nconst _onopen = Symbol('_onopen')\nconst _onread = Symbol('_onread')\nconst _onwrite = Symbol('_onwrite')\nconst _open = Symbol('_open')\nconst _path = Symbol('_path')\nconst _pos = Symbol('_pos')\nconst _queue = Symbol('_queue')\nconst _read = Symbol('_read')\nconst _readSize = Symbol('_readSize')\nconst _reading = Symbol('_reading')\nconst _remain = Symbol('_remain')\nconst _size = Symbol('_size')\nconst _write = Symbol('_write')\nconst _writing = Symbol('_writing')\nconst _defaultFlag = Symbol('_defaultFlag')\nconst _errored = Symbol('_errored')\n\nexport type ReadStreamOptions =\n Minipass.Options<Minipass.ContiguousData> & {\n fd?: number\n readSize?: number\n size?: number\n autoClose?: boolean\n }\n\nexport type ReadStreamEvents = Minipass.Events<Minipass.ContiguousData> & {\n open: [fd: number]\n}\n\nexport class ReadStream extends Minipass<\n Minipass.ContiguousData,\n Buffer,\n ReadStreamEvents\n> {\n [_errored]: boolean = false;\n [_fd]?: number;\n [_path]: string;\n [_readSize]: number;\n [_reading]: boolean = false;\n [_size]: number;\n [_remain]: number;\n [_autoClose]: boolean\n\n constructor(path: string, opt: ReadStreamOptions) {\n opt = opt || {}\n super(opt)\n\n this.readable = true\n this.writable = false\n\n if (typeof path !== 'string') {\n throw new TypeError('path must be a string')\n }\n\n this[_errored] = false\n this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined\n this[_path] = path\n this[_readSize] = opt.readSize || 16 * 1024 * 1024\n this[_reading] = false\n this[_size] = typeof opt.size === 'number' ? opt.size : Infinity\n this[_remain] = this[_size]\n this[_autoClose] =\n typeof opt.autoClose === 'boolean' ? opt.autoClose : true\n\n if (typeof this[_fd] === 'number') {\n this[_read]()\n } else {\n this[_open]()\n }\n }\n\n get fd() {\n return this[_fd]\n }\n\n get path() {\n return this[_path]\n }\n\n //@ts-ignore\n write() {\n throw new TypeError('this is a readable stream')\n }\n\n //@ts-ignore\n end() {\n throw new TypeError('this is a readable stream')\n }\n\n [_open]() {\n fs.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd))\n }\n\n [_onopen](er?: NodeJS.ErrnoException | null, fd?: number) {\n if (er) {\n this[_onerror](er)\n } else {\n this[_fd] = fd\n this.emit('open', fd as number)\n this[_read]()\n }\n }\n\n [_makeBuf]() {\n return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain]))\n }\n\n [_read]() {\n if (!this[_reading]) {\n this[_reading] = true\n const buf = this[_makeBuf]()\n /* c8 ignore start */\n if (buf.length === 0) {\n return process.nextTick(() => this[_onread](null, 0, buf))\n }\n /* c8 ignore stop */\n fs.read(this[_fd] as number, buf, 0, buf.length, null, (er, br, b) =>\n this[_onread](er, br, b),\n )\n }\n }\n\n [_onread](er?: NodeJS.ErrnoException | null, br?: number, buf?: Buffer) {\n this[_reading] = false\n if (er) {\n this[_onerror](er)\n } else if (this[_handleChunk](br as number, buf as Buffer)) {\n this[_read]()\n }\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.close(fd, er =>\n er ? this.emit('error', er) : this.emit('close'),\n )\n }\n }\n\n [_onerror](er: NodeJS.ErrnoException) {\n this[_reading] = true\n this[_close]()\n this.emit('error', er)\n }\n\n [_handleChunk](br: number, buf: Buffer) {\n let ret = false\n // no effect if infinite\n this[_remain] -= br\n if (br > 0) {\n ret = super.write(br < buf.length ? buf.subarray(0, br) : buf)\n }\n\n if (br === 0 || this[_remain] <= 0) {\n ret = false\n this[_close]()\n super.end()\n }\n\n return ret\n }\n\n emit<Event extends keyof ReadStreamEvents>(\n ev: Event,\n ...args: ReadStreamEvents[Event]\n ): boolean {\n switch (ev) {\n case 'prefinish':\n case 'finish':\n return false\n\n case 'drain':\n if (typeof this[_fd] === 'number') {\n this[_read]()\n }\n return false\n\n case 'error':\n if (this[_errored]) {\n return false\n }\n this[_errored] = true\n return super.emit(ev, ...args)\n\n default:\n return super.emit(ev, ...args)\n }\n }\n}\n\nexport class ReadStreamSync extends ReadStream {\n [_open]() {\n let threw = true\n try {\n this[_onopen](null, fs.openSync(this[_path], 'r'))\n threw = false\n } finally {\n if (threw) {\n this[_close]()\n }\n }\n }\n\n [_read]() {\n let threw = true\n try {\n if (!this[_reading]) {\n this[_reading] = true\n do {\n const buf = this[_makeBuf]()\n /* c8 ignore start */\n const br =\n buf.length === 0\n ? 0\n : fs.readSync(this[_fd] as number, buf, 0, buf.length, null)\n /* c8 ignore stop */\n if (!this[_handleChunk](br, buf)) {\n break\n }\n } while (true)\n this[_reading] = false\n }\n threw = false\n } finally {\n if (threw) {\n this[_close]()\n }\n }\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.closeSync(fd)\n this.emit('close')\n }\n }\n}\n\nexport type WriteStreamOptions = {\n fd?: number\n autoClose?: boolean\n mode?: number\n captureRejections?: boolean\n start?: number\n flags?: string\n}\n\nexport class WriteStream extends EE {\n readable: false = false\n writable: boolean = true;\n [_errored]: boolean = false;\n [_writing]: boolean = false;\n [_ended]: boolean = false;\n [_queue]: Buffer[] = [];\n [_needDrain]: boolean = false;\n [_path]: string;\n [_mode]: number;\n [_autoClose]: boolean;\n [_fd]?: number;\n [_defaultFlag]: boolean;\n [_flags]: string;\n [_finished]: boolean = false;\n [_pos]?: number\n\n constructor(path: string, opt: WriteStreamOptions) {\n opt = opt || {}\n super(opt)\n this[_path] = path\n this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined\n this[_mode] = opt.mode === undefined ? 0o666 : opt.mode\n this[_pos] = typeof opt.start === 'number' ? opt.start : undefined\n this[_autoClose] =\n typeof opt.autoClose === 'boolean' ? opt.autoClose : true\n\n // truncating makes no sense when writing into the middle\n const defaultFlag = this[_pos] !== undefined ? 'r+' : 'w'\n this[_defaultFlag] = opt.flags === undefined\n this[_flags] = opt.flags === undefined ? defaultFlag : opt.flags\n\n if (this[_fd] === undefined) {\n this[_open]()\n }\n }\n\n emit(ev: string, ...args: any[]) {\n if (ev === 'error') {\n if (this[_errored]) {\n return false\n }\n this[_errored] = true\n }\n return super.emit(ev, ...args)\n }\n\n get fd() {\n return this[_fd]\n }\n\n get path() {\n return this[_path]\n }\n\n [_onerror](er: NodeJS.ErrnoException) {\n this[_close]()\n this[_writing] = true\n this.emit('error', er)\n }\n\n [_open]() {\n fs.open(this[_path], this[_flags], this[_mode], (er, fd) =>\n this[_onopen](er, fd),\n )\n }\n\n [_onopen](er?: null | NodeJS.ErrnoException, fd?: number) {\n if (\n this[_defaultFlag] &&\n this[_flags] === 'r+' &&\n er &&\n er.code === 'ENOENT'\n ) {\n this[_flags] = 'w'\n this[_open]()\n } else if (er) {\n this[_onerror](er)\n } else {\n this[_fd] = fd\n this.emit('open', fd)\n if (!this[_writing]) {\n this[_flush]()\n }\n }\n }\n\n end(buf: string, enc?: BufferEncoding): this\n end(buf?: Buffer, enc?: undefined): this\n end(buf?: Buffer | string, enc?: BufferEncoding): this {\n if (buf) {\n //@ts-ignore\n this.write(buf, enc)\n }\n\n this[_ended] = true\n\n // synthetic after-write logic, where drain/finish live\n if (\n !this[_writing] &&\n !this[_queue].length &&\n typeof this[_fd] === 'number'\n ) {\n this[_onwrite](null, 0)\n }\n return this\n }\n\n write(buf: string, enc?: BufferEncoding): boolean\n write(buf: Buffer, enc?: undefined): boolean\n write(buf: Buffer | string, enc?: BufferEncoding): boolean {\n if (typeof buf === 'string') {\n buf = Buffer.from(buf, enc)\n }\n\n if (this[_ended]) {\n this.emit('error', new Error('write() after end()'))\n return false\n }\n\n if (this[_fd] === undefined || this[_writing] || this[_queue].length) {\n this[_queue].push(buf)\n this[_needDrain] = true\n return false\n }\n\n this[_writing] = true\n this[_write](buf)\n return true\n }\n\n [_write](buf: Buffer) {\n fs.write(\n this[_fd] as number,\n buf,\n 0,\n buf.length,\n this[_pos],\n (er, bw) => this[_onwrite](er, bw),\n )\n }\n\n [_onwrite](er?: null | NodeJS.ErrnoException, bw?: number) {\n if (er) {\n this[_onerror](er)\n } else {\n if (this[_pos] !== undefined && typeof bw === 'number') {\n this[_pos] += bw\n }\n if (this[_queue].length) {\n this[_flush]()\n } else {\n this[_writing] = false\n\n if (this[_ended] && !this[_finished]) {\n this[_finished] = true\n this[_close]()\n this.emit('finish')\n } else if (this[_needDrain]) {\n this[_needDrain] = false\n this.emit('drain')\n }\n }\n }\n }\n\n [_flush]() {\n if (this[_queue].length === 0) {\n if (this[_ended]) {\n this[_onwrite](null, 0)\n }\n } else if (this[_queue].length === 1) {\n this[_write](this[_queue].pop() as Buffer)\n } else {\n const iovec = this[_queue]\n this[_queue] = []\n writev(this[_fd] as number, iovec, this[_pos] as number, (er, bw) =>\n this[_onwrite](er, bw),\n )\n }\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.close(fd, er =>\n er ? this.emit('error', er) : this.emit('close'),\n )\n }\n }\n}\n\nexport class WriteStreamSync extends WriteStream {\n [_open](): void {\n let fd\n // only wrap in a try{} block if we know we'll retry, to avoid\n // the rethrow obscuring the error's source frame in most cases.\n if (this[_defaultFlag] && this[_flags] === 'r+') {\n try {\n fd = fs.openSync(this[_path], this[_flags], this[_mode])\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') {\n this[_flags] = 'w'\n return this[_open]()\n } else {\n throw er\n }\n }\n } else {\n fd = fs.openSync(this[_path], this[_flags], this[_mode])\n }\n\n this[_onopen](null, fd)\n }\n\n [_close]() {\n if (this[_autoClose] && typeof this[_fd] === 'number') {\n const fd = this[_fd]\n this[_fd] = undefined\n fs.closeSync(fd)\n this.emit('close')\n }\n }\n\n [_write](buf: Buffer) {\n // throw the original, but try to close if it fails\n let threw = true\n try {\n this[_onwrite](\n null,\n fs.writeSync(this[_fd] as number, buf, 0, buf.length, this[_pos]),\n )\n threw = false\n } finally {\n if (threw) {\n try {\n this[_close]()\n } catch {\n // ok error\n }\n }\n }\n }\n}\n","const proc =\n typeof process === 'object' && process\n ? process\n : {\n stdout: null,\n stderr: null,\n }\nimport { EventEmitter } from 'node:events'\nimport Stream from 'node:stream'\nimport { StringDecoder } from 'node:string_decoder'\n\n/**\n * Same as StringDecoder, but exposing the `lastNeed` flag on the type\n */\ntype SD = StringDecoder & { lastNeed: boolean }\n\nexport type { SD, Pipe, PipeProxyErrors }\n\n/**\n * Return true if the argument is a Minipass stream, Node stream, or something\n * else that Minipass can interact with.\n */\nexport const isStream = (\n s: any\n): s is Minipass.Readable | Minipass.Writable =>\n !!s &&\n typeof s === 'object' &&\n (s instanceof Minipass ||\n s instanceof Stream ||\n isReadable(s) ||\n isWritable(s))\n\n/**\n * Return true if the argument is a valid {@link Minipass.Readable}\n */\nexport const isReadable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Readable).pipe === 'function' &&\n // node core Writable streams have a pipe() method, but it throws\n (s as Minipass.Readable).pipe !== Stream.Writable.prototype.pipe\n\n/**\n * Return true if the argument is a valid {@link Minipass.Writable}\n */\nexport const isWritable = (s: any): s is Minipass.Readable =>\n !!s &&\n typeof s === 'object' &&\n s instanceof EventEmitter &&\n typeof (s as Minipass.Writable).write === 'function' &&\n typeof (s as Minipass.Writable).end === 'function'\n\nconst EOF = Symbol('EOF')\nconst MAYBE_EMIT_END = Symbol('maybeEmitEnd')\nconst EMITTED_END = Symbol('emittedEnd')\nconst EMITTING_END = Symbol('emittingEnd')\nconst EMITTED_ERROR = Symbol('emittedError')\nconst CLOSED = Symbol('closed')\nconst READ = Symbol('read')\nconst FLUSH = Symbol('flush')\nconst FLUSHCHUNK = Symbol('flushChunk')\nconst ENCODING = Symbol('encoding')\nconst DECODER = Symbol('decoder')\nconst FLOWING = Symbol('flowing')\nconst PAUSED = Symbol('paused')\nconst RESUME = Symbol('resume')\nconst BUFFER = Symbol('buffer')\nconst PIPES = Symbol('pipes')\nconst BUFFERLENGTH = Symbol('bufferLength')\nconst BUFFERPUSH = Symbol('bufferPush')\nconst BUFFERSHIFT = Symbol('bufferShift')\nconst OBJECTMODE = Symbol('objectMode')\n// internal event when stream is destroyed\nconst DESTROYED = Symbol('destroyed')\n// internal event when stream has an error\nconst ERROR = Symbol('error')\nconst EMITDATA = Symbol('emitData')\nconst EMITEND = Symbol('emitEnd')\nconst EMITEND2 = Symbol('emitEnd2')\nconst ASYNC = Symbol('async')\nconst ABORT = Symbol('abort')\nconst ABORTED = Symbol('aborted')\nconst SIGNAL = Symbol('signal')\nconst DATALISTENERS = Symbol('dataListeners')\nconst DISCARDED = Symbol('discarded')\n\nconst defer = (fn: (...a: any[]) => any) => Promise.resolve().then(fn)\nconst nodefer = (fn: (...a: any[]) => any) => fn()\n\n// events that mean 'the stream is over'\n// these are treated specially, and re-emitted\n// if they are listened for after emitting.\ntype EndishEvent = 'end' | 'finish' | 'prefinish'\nconst isEndish = (ev: any): ev is EndishEvent =>\n ev === 'end' || ev === 'finish' || ev === 'prefinish'\n\nconst isArrayBufferLike = (b: any): b is ArrayBufferLike =>\n b instanceof ArrayBuffer ||\n (!!b &&\n typeof b === 'object' &&\n b.constructor &&\n b.constructor.name === 'ArrayBuffer' &&\n b.byteLength >= 0)\n\nconst isArrayBufferView = (b: any): b is ArrayBufferView =>\n !Buffer.isBuffer(b) && ArrayBuffer.isView(b)\n\n/**\n * Options that may be passed to stream.pipe()\n */\nexport interface PipeOptions {\n /**\n * end the destination stream when the source stream ends\n */\n end?: boolean\n /**\n * proxy errors from the source stream to the destination stream\n */\n proxyErrors?: boolean\n}\n\n/**\n * Internal class representing a pipe to a destination stream.\n *\n * @internal\n */\nclass Pipe<T extends unknown> {\n src: Minipass<T>\n dest: Minipass<any, T>\n opts: PipeOptions\n ondrain: () => any\n constructor(\n src: Minipass<T>,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n this.src = src\n this.dest = dest as Minipass<any, T>\n this.opts = opts\n this.ondrain = () => src[RESUME]()\n this.dest.on('drain', this.ondrain)\n }\n unpipe() {\n this.dest.removeListener('drain', this.ondrain)\n }\n // only here for the prototype\n /* c8 ignore start */\n proxyErrors(_er: any) {}\n /* c8 ignore stop */\n end() {\n this.unpipe()\n if (this.opts.end) this.dest.end()\n }\n}\n\n/**\n * Internal class representing a pipe to a destination stream where\n * errors are proxied.\n *\n * @internal\n */\nclass PipeProxyErrors<T> extends Pipe<T> {\n unpipe() {\n this.src.removeListener('error', this.proxyErrors)\n super.unpipe()\n }\n constructor(\n src: Minipass<T>,\n dest: Minipass.Writable,\n opts: PipeOptions\n ) {\n super(src, dest, opts)\n this.proxyErrors = (er: Error) => this.dest.emit('error', er)\n src.on('error', this.proxyErrors)\n }\n}\n\nexport namespace Minipass {\n /**\n * Encoding used to create a stream that outputs strings rather than\n * Buffer objects.\n */\n export type Encoding = BufferEncoding | 'buffer' | null\n\n /**\n * Any stream that Minipass can pipe into\n */\n export type Writable =\n | Minipass<any, any, any>\n | NodeJS.WriteStream\n | (NodeJS.WriteStream & { fd: number })\n | (EventEmitter & {\n end(): any\n write(chunk: any, ...args: any[]): any\n })\n\n /**\n * Any stream that can be read from\n */\n export type Readable =\n | Minipass<any, any, any>\n | NodeJS.ReadStream\n | (NodeJS.ReadStream & { fd: number })\n | (EventEmitter & {\n pause(): any\n resume(): any\n pipe(...destArgs: any[]): any\n })\n\n /**\n * Utility type that can be iterated sync or async\n */\n export type DualIterable<T> = Iterable<T> & AsyncIterable<T>\n\n type EventArguments = Record<string | symbol, unknown[]>\n\n /**\n * The listing of events that a Minipass class can emit.\n * Extend this when extending the Minipass class, and pass as\n * the third template argument. The key is the name of the event,\n * and the value is the argument list.\n *\n * Any undeclared events will still be allowed, but the handler will get\n * arguments as `unknown[]`.\n */\n export interface Events<RType extends any = Buffer>\n extends EventArguments {\n readable: []\n data: [chunk: RType]\n error: [er: unknown]\n abort: [reason: unknown]\n drain: []\n resume: []\n end: []\n finish: []\n prefinish: []\n close: []\n [DESTROYED]: [er?: unknown]\n [ERROR]: [er: unknown]\n }\n\n /**\n * String or buffer-like data that can be joined and sliced\n */\n export type ContiguousData =\n | Buffer\n | ArrayBufferLike\n | ArrayBufferView\n | string\n export type BufferOrString = Buffer | string\n\n /**\n * Options passed to the Minipass constructor.\n */\n export type SharedOptions = {\n /**\n * Defer all data emission and other events until the end of the\n * current tick, similar to Node core streams\n */\n async?: boolean\n /**\n * A signal which will abort the stream\n */\n signal?: AbortSignal\n /**\n * Output string encoding. Set to `null` or `'buffer'` (or omit) to\n * emit Buffer objects rather than strings.\n *\n * Conflicts with `objectMode`\n */\n encoding?: BufferEncoding | null | 'buffer'\n /**\n * Output data exactly as it was written, supporting non-buffer/string\n * data (such as arbitrary objects, falsey values, etc.)\n *\n * Conflicts with `encoding`\n */\n objectMode?: boolean\n }\n\n /**\n * Options for a string encoded output\n */\n export type EncodingOptions = SharedOptions & {\n encoding: BufferEncoding\n objectMode?: false\n }\n\n /**\n * Options for contiguous data buffer output\n */\n export type BufferOptions = SharedOptions & {\n encoding?: null | 'buffer'\n objectMode?: false\n }\n\n /**\n * Options for objectMode arbitrary output\n */\n export type ObjectModeOptions = SharedOptions & {\n objectMode: true\n encoding?: null\n }\n\n /**\n * Utility type to determine allowed options based on read type\n */\n export type Options<T> =\n | ObjectModeOptions\n | (T extends string\n ? EncodingOptions\n : T extends Buffer\n ? BufferOptions\n : SharedOptions)\n}\n\nconst isObjectModeOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.ObjectModeOptions => !!o.objectMode\n\nconst isEncodingOptions = (\n o: Minipass.SharedOptions\n): o is Minipass.EncodingOptions =>\n !o.objectMode && !!o.encoding && o.encoding !== 'buffer'\n\n/**\n * Main export, the Minipass class\n *\n * `RType` is the type of data emitted, defaults to Buffer\n *\n * `WType` is the type of data to be written, if RType is buffer or string,\n * then any {@link Minipass.ContiguousData} is allowed.\n *\n * `Events` is the set of event handler signatures that this object\n * will emit, see {@link Minipass.Events}\n */\nexport class Minipass<\n RType extends unknown = Buffer,\n WType extends unknown = RType extends Minipass.BufferOrString\n ? Minipass.ContiguousData\n : RType,\n Events extends Minipass.Events<RType> = Minipass.Events<RType>\n >\n extends EventEmitter\n implements Minipass.DualIterable<RType>\n{\n [FLOWING]: boolean = false;\n [PAUSED]: boolean = false;\n [PIPES]: Pipe<RType>[] = [];\n [BUFFER]: RType[] = [];\n [OBJECTMODE]: boolean;\n [ENCODING]: BufferEncoding | null;\n [ASYNC]: boolean;\n [DECODER]: SD | null;\n [EOF]: boolean = false;\n [EMITTED_END]: boolean = false;\n [EMITTING_END]: boolean = false;\n [CLOSED]: boolean = false;\n [EMITTED_ERROR]: unknown = null;\n [BUFFERLENGTH]: number = 0;\n [DESTROYED]: boolean = false;\n [SIGNAL]?: AbortSignal;\n [ABORTED]: boolean = false;\n [DATALISTENERS]: number = 0;\n [DISCARDED]: boolean = false\n\n /**\n * true if the stream can be written\n */\n writable: boolean = true\n /**\n * true if the stream can be read\n */\n readable: boolean = true\n\n /**\n * If `RType` is Buffer, then options do not need to be provided.\n * Otherwise, an options object must be provided to specify either\n * {@link Minipass.SharedOptions.objectMode} or\n * {@link Minipass.SharedOptions.encoding}, as appropriate.\n */\n constructor(\n ...args:\n | [Minipass.ObjectModeOptions]\n | (RType extends Buffer\n ? [] | [Minipass.Options<RType>]\n : [Minipass.Options<RType>])\n ) {\n const options: Minipass.Options<RType> = (args[0] ||\n {}) as Minipass.Options<RType>\n super()\n if (options.objectMode && typeof options.encoding === 'string') {\n throw new TypeError(\n 'Encoding and objectMode may not be used together'\n )\n }\n if (isObjectModeOptions(options)) {\n this[OBJECTMODE] = true\n this[ENCODING] = null\n } else if (isEncodingOptions(options)) {\n this[ENCODING] = options.encoding\n this[OBJECTMODE] = false\n } else {\n this[OBJECTMODE] = false\n this[ENCODING] = null\n }\n this[ASYNC] = !!options.async\n this[DECODER] = this[ENCODING]\n ? (new StringDecoder(this[ENCODING]) as SD)\n : null\n\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposeBuffer === true) {\n Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })\n }\n //@ts-ignore - private option for debugging and testing\n if (options && options.debugExposePipes === true) {\n Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })\n }\n\n const { signal } = options\n if (signal) {\n this[SIGNAL] = signal\n if (signal.aborted) {\n this[ABORT]()\n } else {\n signal.addEventListener('abort', () => this[ABORT]())\n }\n }\n }\n\n /**\n * The amount of data stored in the buffer waiting to be read.\n *\n * For Buffer strings, this will be the total byte length.\n * For string encoding streams, this will be the string character length,\n * according to JavaScript's `string.length` logic.\n * For objectMode streams, this is a count of the items waiting to be\n * emitted.\n */\n get bufferLength() {\n return this[BUFFERLENGTH]\n }\n\n /**\n * The `BufferEncoding` currently in use, or `null`\n */\n get encoding() {\n return this[ENCODING]\n }\n\n /**\n * @deprecated - This is a read only property\n */\n set encoding(_enc) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * @deprecated - Encoding may only be set at instantiation time\n */\n setEncoding(_enc: Minipass.Encoding) {\n throw new Error('Encoding must be set at instantiation time')\n }\n\n /**\n * True if this is an objectMode stream\n */\n get objectMode() {\n return this[OBJECTMODE]\n }\n\n /**\n * @deprecated - This is a read-only property\n */\n set objectMode(_om) {\n throw new Error('objectMode must be set at instantiation time')\n }\n\n /**\n * true if this is an async stream\n */\n get ['async'](): boolean {\n return this[ASYNC]\n }\n /**\n * Set to true to make this stream async.\n *\n * Once set, it cannot be unset, as this would potentially cause incorrect\n * behavior. Ie, a sync stream can be made async, but an async stream\n * cannot be safely made sync.\n */\n set ['async'](a: boolean) {\n this[ASYNC] = this[ASYNC] || !!a\n }\n\n // drop everything and get out of the flow completely\n [ABORT]() {\n this[ABORTED] = true\n this.emit('abort', this[SIGNAL]?.reason)\n this.destroy(this[SIGNAL]?.reason)\n }\n\n /**\n * True if the stream has been aborted.\n */\n get aborted() {\n return this[ABORTED]\n }\n /**\n * No-op setter. Stream aborted status is set via the AbortSignal provided\n * in the constructor options.\n */\n set aborted(_) {}\n\n /**\n * Write data into the stream\n *\n * If the chunk written is a string, and encoding is not specified, then\n * `utf8` will be assumed. If the stream encoding matches the encoding of\n * a written string, and the state of the string decoder allows it, then\n * the string will be passed through to either the output or the internal\n * buffer without any processing. Otherwise, it will be turned into a\n * Buffer object for processing into the desired encoding.\n *\n * If provided, `cb` function is called immediately before return for\n * sync streams, or on next tick for async streams, because for this\n * base class, a chunk is considered \"processed\" once it is accepted\n * and either emitted or buffered. That is, the callback does not indicate\n * that the chunk has been eventually emitted, though of course child\n * classes can override this function to do whatever processing is required\n * and call `super.write(...)` only once processing is completed.\n */\n write(chunk: WType, cb?: () => void): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding,\n cb?: () => void\n ): boolean\n write(\n chunk: WType,\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): boolean {\n if (this[ABORTED]) return false\n if (this[EOF]) throw new Error('write after end')\n\n if (this[DESTROYED]) {\n this.emit(\n 'error',\n Object.assign(\n new Error('Cannot call write after a stream was destroyed'),\n { code: 'ERR_STREAM_DESTROYED' }\n )\n )\n return true\n }\n\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n\n if (!encoding) encoding = 'utf8'\n\n const fn = this[ASYNC] ? defer : nodefer\n\n // convert array buffers and typed array views into buffers\n // at some point in the future, we may want to do the opposite!\n // leave strings and buffers as-is\n // anything is only allowed if in object mode, so throw\n if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {\n if (isArrayBufferView(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(\n chunk.buffer,\n chunk.byteOffset,\n chunk.byteLength\n )\n } else if (isArrayBufferLike(chunk)) {\n //@ts-ignore - sinful unsafe type changing\n chunk = Buffer.from(chunk)\n } else if (typeof chunk !== 'string') {\n throw new Error(\n 'Non-contiguous data written to non-objectMode stream'\n )\n }\n }\n\n // handle object mode up front, since it's simpler\n // this yields better performance, fewer checks later.\n if (this[OBJECTMODE]) {\n // maybe impossible?\n /* c8 ignore start */\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n /* c8 ignore stop */\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n // at this point the chunk is a buffer or string\n // don't buffer it up or send it to the decoder\n if (!(chunk as Minipass.BufferOrString).length) {\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n if (cb) fn(cb)\n return this[FLOWING]\n }\n\n // fast-path writing strings of same encoding to a stream with\n // an empty buffer, skipping the buffer/decoder dance\n if (\n typeof chunk === 'string' &&\n // unless it is a string already ready for us to use\n !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)\n ) {\n //@ts-ignore - sinful unsafe type change\n chunk = Buffer.from(chunk, encoding)\n }\n\n if (Buffer.isBuffer(chunk) && this[ENCODING]) {\n //@ts-ignore - sinful unsafe type change\n chunk = this[DECODER].write(chunk)\n }\n\n // Note: flushing CAN potentially switch us into not-flowing mode\n if (this[FLOWING] && this[BUFFERLENGTH] !== 0) this[FLUSH](true)\n\n if (this[FLOWING]) this.emit('data', chunk as unknown as RType)\n else this[BUFFERPUSH](chunk as unknown as RType)\n\n if (this[BUFFERLENGTH] !== 0) this.emit('readable')\n\n if (cb) fn(cb)\n\n return this[FLOWING]\n }\n\n /**\n * Low-level explicit read method.\n *\n * In objectMode, the argument is ignored, and one item is returned if\n * available.\n *\n * `n` is the number of bytes (or in the case of encoding streams,\n * characters) to consume. If `n` is not provided, then the entire buffer\n * is returned, or `null` is returned if no data is available.\n *\n * If `n` is greater that the amount of data in the internal buffer,\n * then `null` is returned.\n */\n read(n?: number | null): RType | null {\n if (this[DESTROYED]) return null\n this[DISCARDED] = false\n\n if (\n this[BUFFERLENGTH] === 0 ||\n n === 0 ||\n (n && n > this[BUFFERLENGTH])\n ) {\n this[MAYBE_EMIT_END]()\n return null\n }\n\n if (this[OBJECTMODE]) n = null\n\n if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {\n // not object mode, so if we have an encoding, then RType is string\n // otherwise, must be Buffer\n this[BUFFER] = [\n (this[ENCODING]\n ? this[BUFFER].join('')\n : Buffer.concat(\n this[BUFFER] as Buffer[],\n this[BUFFERLENGTH]\n )) as RType,\n ]\n }\n\n const ret = this[READ](n || null, this[BUFFER][0] as RType)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [READ](n: number | null, chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERSHIFT]()\n else {\n const c = chunk as Minipass.BufferOrString\n if (n === c.length || n === null) this[BUFFERSHIFT]()\n else if (typeof c === 'string') {\n this[BUFFER][0] = c.slice(n) as RType\n chunk = c.slice(0, n) as RType\n this[BUFFERLENGTH] -= n\n } else {\n this[BUFFER][0] = c.subarray(n) as RType\n chunk = c.subarray(0, n) as RType\n this[BUFFERLENGTH] -= n\n }\n }\n\n this.emit('data', chunk)\n\n if (!this[BUFFER].length && !this[EOF]) this.emit('drain')\n\n return chunk\n }\n\n /**\n * End the stream, optionally providing a final write.\n *\n * See {@link Minipass#write} for argument descriptions\n */\n end(cb?: () => void): this\n end(chunk: WType, cb?: () => void): this\n end(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): this\n end(\n chunk?: WType | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void\n ): this {\n if (typeof chunk === 'function') {\n cb = chunk as () => void\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = 'utf8'\n }\n if (chunk !== undefined) this.write(chunk, encoding)\n if (cb) this.once('end', cb)\n this[EOF] = true\n this.writable = false\n\n // if we haven't written anything, then go ahead and emit,\n // even if we're not reading.\n // we'll re-emit if a new 'end' listener is added anyway.\n // This makes MP more suitable to write-only use cases.\n if (this[FLOWING] || !this[PAUSED]) this[MAYBE_EMIT_END]()\n return this\n }\n\n // don't let the internal resume be overwritten\n [RESUME]() {\n if (this[DESTROYED]) return\n\n if (!this[DATALISTENERS] && !this[PIPES].length) {\n this[DISCARDED] = true\n }\n this[PAUSED] = false\n this[FLOWING] = true\n this.emit('resume')\n if (this[BUFFER].length) this[FLUSH]()\n else if (this[EOF]) this[MAYBE_EMIT_END]()\n else this.emit('drain')\n }\n\n /**\n * Resume the stream if it is currently in a paused state\n *\n * If called when there are no pipe destinations or `data` event listeners,\n * this will place the stream in a \"discarded\" state, where all data will\n * be thrown away. The discarded state is removed if a pipe destination or\n * data handler is added, if pause() is called, or if any synchronous or\n * asynchronous iteration is started.\n */\n resume() {\n return this[RESUME]()\n }\n\n /**\n * Pause the stream\n */\n pause() {\n this[FLOWING] = false\n this[PAUSED] = true\n this[DISCARDED] = false\n }\n\n /**\n * true if the stream has been forcibly destroyed\n */\n get destroyed() {\n return this[DESTROYED]\n }\n\n /**\n * true if the stream is currently in a flowing state, meaning that\n * any writes will be immediately emitted.\n */\n get flowing() {\n return this[FLOWING]\n }\n\n /**\n * true if the stream is currently in a paused state\n */\n get paused() {\n return this[PAUSED]\n }\n\n [BUFFERPUSH](chunk: RType) {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1\n else this[BUFFERLENGTH] += (chunk as Minipass.BufferOrString).length\n this[BUFFER].push(chunk)\n }\n\n [BUFFERSHIFT](): RType {\n if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1\n else\n this[BUFFERLENGTH] -= (\n this[BUFFER][0] as Minipass.BufferOrString\n ).length\n return this[BUFFER].shift() as RType\n }\n\n [FLUSH](noDrain: boolean = false) {\n do {} while (\n this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&\n this[BUFFER].length\n )\n\n if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')\n }\n\n [FLUSHCHUNK](chunk: RType) {\n this.emit('data', chunk)\n return this[FLOWING]\n }\n\n /**\n * Pipe all data emitted by this stream into the destination provided.\n *\n * Triggers the flow of data.\n */\n pipe<W extends Minipass.Writable>(dest: W, opts?: PipeOptions): W {\n if (this[DESTROYED]) return dest\n this[DISCARDED] = false\n\n const ended = this[EMITTED_END]\n opts = opts || {}\n if (dest === proc.stdout || dest === proc.stderr) opts.end = false\n else opts.end = opts.end !== false\n opts.proxyErrors = !!opts.proxyErrors\n\n // piping an ended stream ends immediately\n if (ended) {\n if (opts.end) dest.end()\n } else {\n // \"as\" here just ignores the WType, which pipes don't care about,\n // since they're only consuming from us, and writing to the dest\n this[PIPES].push(\n !opts.proxyErrors\n ? new Pipe<RType>(this as Minipass<RType>, dest, opts)\n : new PipeProxyErrors<RType>(this as Minipass<RType>, dest, opts)\n )\n if (this[ASYNC]) defer(() => this[RESUME]())\n else this[RESUME]()\n }\n\n return dest\n }\n\n /**\n * Fully unhook a piped destination stream.\n *\n * If the destination stream was the only consumer of this stream (ie,\n * there are no other piped destinations or `'data'` event listeners)\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n unpipe<W extends Minipass.Writable>(dest: W) {\n const p = this[PIPES].find(p => p.dest === dest)\n if (p) {\n if (this[PIPES].length === 1) {\n if (this[FLOWING] && this[DATALISTENERS] === 0) {\n this[FLOWING] = false\n }\n this[PIPES] = []\n } else this[PIPES].splice(this[PIPES].indexOf(p), 1)\n p.unpipe()\n }\n }\n\n /**\n * Alias for {@link Minipass#on}\n */\n addListener<Event extends keyof Events>(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n return this.on(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.on`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * - Adding a 'data' event handler will trigger the flow of data\n *\n * - Adding a 'readable' event handler when there is data waiting to be read\n * will cause 'readable' to be emitted immediately.\n *\n * - Adding an 'endish' event handler ('end', 'finish', etc.) which has\n * already passed will cause the event to be emitted immediately and all\n * handlers removed.\n *\n * - Adding an 'error' event handler after an error has been emitted will\n * cause the event to be re-emitted immediately with the error previously\n * raised.\n */\n on<Event extends keyof Events>(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ): this {\n const ret = super.on(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n if (ev === 'data') {\n this[DISCARDED] = false\n this[DATALISTENERS]++\n if (!this[PIPES].length && !this[FLOWING]) {\n this[RESUME]()\n }\n } else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {\n super.emit('readable')\n } else if (isEndish(ev) && this[EMITTED_END]) {\n super.emit(ev)\n this.removeAllListeners(ev)\n } else if (ev === 'error' && this[EMITTED_ERROR]) {\n const h = handler as (...a: Events['error']) => any\n if (this[ASYNC]) defer(() => h.call(this, this[EMITTED_ERROR]))\n else h.call(this, this[EMITTED_ERROR])\n }\n return ret\n }\n\n /**\n * Alias for {@link Minipass#off}\n */\n removeListener<Event extends keyof Events>(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n return this.off(ev, handler)\n }\n\n /**\n * Mostly identical to `EventEmitter.off`\n *\n * If a 'data' event handler is removed, and it was the last consumer\n * (ie, there are no pipe destinations or other 'data' event listeners),\n * then the flow of data will stop until there is another consumer or\n * {@link Minipass#resume} is explicitly called.\n */\n off<Event extends keyof Events>(\n ev: Event,\n handler: (...args: Events[Event]) => any\n ) {\n const ret = super.off(\n ev as string | symbol,\n handler as (...a: any[]) => any\n )\n // if we previously had listeners, and now we don't, and we don't\n // have any pipes, then stop the flow, unless it's been explicitly\n // put in a discarded flowing state via stream.resume().\n if (ev === 'data') {\n this[DATALISTENERS] = this.listeners('data').length\n if (\n this[DATALISTENERS] === 0 &&\n !this[DISCARDED] &&\n !this[PIPES].length\n ) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * Mostly identical to `EventEmitter.removeAllListeners`\n *\n * If all 'data' event handlers are removed, and they were the last consumer\n * (ie, there are no pipe destinations), then the flow of data will stop\n * until there is another consumer or {@link Minipass#resume} is explicitly\n * called.\n */\n removeAllListeners<Event extends keyof Events>(ev?: Event) {\n const ret = super.removeAllListeners(ev as string | symbol | undefined)\n if (ev === 'data' || ev === undefined) {\n this[DATALISTENERS] = 0\n if (!this[DISCARDED] && !this[PIPES].length) {\n this[FLOWING] = false\n }\n }\n return ret\n }\n\n /**\n * true if the 'end' event has been emitted\n */\n get emittedEnd() {\n return this[EMITTED_END]\n }\n\n [MAYBE_EMIT_END]() {\n if (\n !this[EMITTING_END] &&\n !this[EMITTED_END] &&\n !this[DESTROYED] &&\n this[BUFFER].length === 0 &&\n this[EOF]\n ) {\n this[EMITTING_END] = true\n this.emit('end')\n this.emit('prefinish')\n this.emit('finish')\n if (this[CLOSED]) this.emit('close')\n this[EMITTING_END] = false\n }\n }\n\n /**\n * Mostly identical to `EventEmitter.emit`, with the following\n * behavior differences to prevent data loss and unnecessary hangs:\n *\n * If the stream has been destroyed, and the event is something other\n * than 'close' or 'error', then `false` is returned and no handlers\n * are called.\n *\n * If the event is 'end', and has already been emitted, then the event\n * is ignored. If the stream is in a paused or non-flowing state, then\n * the event will be deferred until data flow resumes. If the stream is\n * async, then handlers will be called on the next tick rather than\n * immediately.\n *\n * If the event is 'close', and 'end' has not yet been emitted, then\n * the event will be deferred until after 'end' is emitted.\n *\n * If the event is 'error', and an AbortSignal was provided for the stream,\n * and there are no listeners, then the event is ignored, matching the\n * behavior of node core streams in the presense of an AbortSignal.\n *\n * If the event is 'finish' or 'prefinish', then all listeners will be\n * removed after emitting the event, to prevent double-firing.\n */\n emit<Event extends keyof Events>(\n ev: Event,\n ...args: Events[Event]\n ): boolean {\n const data = args[0]\n // error and close are only events allowed after calling destroy()\n if (\n ev !== 'error' &&\n ev !== 'close' &&\n ev !== DESTROYED &&\n this[DESTROYED]\n ) {\n return false\n } else if (ev === 'data') {\n return !this[OBJECTMODE] && !data\n ? false\n : this[ASYNC]\n ? (defer(() => this[EMITDATA](data as RType)), true)\n : this[EMITDATA](data as RType)\n } else if (ev === 'end') {\n return this[EMITEND]()\n } else if (ev === 'close') {\n this[CLOSED] = true\n // don't emit close before 'end' and 'finish'\n if (!this[EMITTED_END] && !this[DESTROYED]) return false\n const ret = super.emit('close')\n this.removeAllListeners('close')\n return ret\n } else if (ev === 'error') {\n this[EMITTED_ERROR] = data\n super.emit(ERROR, data)\n const ret =\n !this[SIGNAL] || this.listeners('error').length\n ? super.emit('error', data)\n : false\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'resume') {\n const ret = super.emit('resume')\n this[MAYBE_EMIT_END]()\n return ret\n } else if (ev === 'finish' || ev === 'prefinish') {\n const ret = super.emit(ev)\n this.removeAllListeners(ev)\n return ret\n }\n\n // Some other unknown event\n const ret = super.emit(ev as string, ...args)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITDATA](data: RType) {\n for (const p of this[PIPES]) {\n if (p.dest.write(data as RType) === false) this.pause()\n }\n const ret = this[DISCARDED] ? false : super.emit('data', data)\n this[MAYBE_EMIT_END]()\n return ret\n }\n\n [EMITEND]() {\n if (this[EMITTED_END]) return false\n\n this[EMITTED_END] = true\n this.readable = false\n return this[ASYNC]\n ? (defer(() => this[EMITEND2]()), true)\n : this[EMITEND2]()\n }\n\n [EMITEND2]() {\n if (this[DECODER]) {\n const data = this[DECODER].end()\n if (data) {\n for (const p of this[PIPES]) {\n p.dest.write(data as RType)\n }\n if (!this[DISCARDED]) super.emit('data', data)\n }\n }\n\n for (const p of this[PIPES]) {\n p.end()\n }\n const ret = super.emit('end')\n this.removeAllListeners('end')\n return ret\n }\n\n /**\n * Return a Promise that resolves to an array of all emitted data once\n * the stream ends.\n */\n async collect(): Promise<RType[] & { dataLength: number }> {\n const buf: RType[] & { dataLength: number } = Object.assign([], {\n dataLength: 0,\n })\n if (!this[OBJECTMODE]) buf.dataLength = 0\n // set the promise first, in case an error is raised\n // by triggering the flow here.\n const p = this.promise()\n this.on('data', c => {\n buf.push(c)\n if (!this[OBJECTMODE])\n buf.dataLength += (c as Minipass.BufferOrString).length\n })\n await p\n return buf\n }\n\n /**\n * Return a Promise that resolves to the concatenation of all emitted data\n * once the stream ends.\n *\n * Not allowed on objectMode streams.\n */\n async concat(): Promise<RType> {\n if (this[OBJECTMODE]) {\n throw new Error('cannot concat in objectMode')\n }\n const buf = await this.collect()\n return (\n this[ENCODING]\n ? buf.join('')\n : Buffer.concat(buf as Buffer[], buf.dataLength)\n ) as RType\n }\n\n /**\n * Return a void Promise that resolves once the stream ends.\n */\n async promise(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.on(DESTROYED, () => reject(new Error('stream destroyed')))\n this.on('error', er => reject(er))\n this.on('end', () => resolve())\n })\n }\n\n /**\n * Asynchronous `for await of` iteration.\n *\n * This will continue emitting all chunks until the stream terminates.\n */\n [Symbol.asyncIterator](): AsyncGenerator<RType, void, void> {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = async (): Promise<IteratorReturnResult<void>> => {\n this.pause()\n stopped = true\n return { value: undefined, done: true }\n }\n const next = (): Promise<IteratorResult<RType, void>> => {\n if (stopped) return stop()\n const res = this.read()\n if (res !== null) return Promise.resolve({ done: false, value: res })\n\n if (this[EOF]) return stop()\n\n let resolve!: (res: IteratorResult<RType>) => void\n let reject!: (er: unknown) => void\n const onerr = (er: unknown) => {\n this.off('data', ondata)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n stop()\n reject(er)\n }\n const ondata = (value: RType) => {\n this.off('error', onerr)\n this.off('end', onend)\n this.off(DESTROYED, ondestroy)\n this.pause()\n resolve({ value, done: !!this[EOF] })\n }\n const onend = () => {\n this.off('error', onerr)\n this.off('data', ondata)\n this.off(DESTROYED, ondestroy)\n stop()\n resolve({ done: true, value: undefined })\n }\n const ondestroy = () => onerr(new Error('stream destroyed'))\n return new Promise<IteratorResult<RType>>((res, rej) => {\n reject = rej\n resolve = res\n this.once(DESTROYED, ondestroy)\n this.once('error', onerr)\n this.once('end', onend)\n this.once('data', ondata)\n })\n }\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.asyncIterator]() {\n return this\n },\n [Symbol.asyncDispose]: async () => {},\n }\n }\n\n /**\n * Synchronous `for of` iteration.\n *\n * The iteration will terminate when the internal buffer runs out, even\n * if the stream has not yet terminated.\n */\n [Symbol.iterator](): Generator<RType, void, void> {\n // set this up front, in case the consumer doesn't call next()\n // right away.\n this[DISCARDED] = false\n let stopped = false\n const stop = (): IteratorReturnResult<void> => {\n this.pause()\n this.off(ERROR, stop)\n this.off(DESTROYED, stop)\n this.off('end', stop)\n stopped = true\n return { done: true, value: undefined }\n }\n\n const next = (): IteratorResult<RType, void> => {\n if (stopped) return stop()\n const value = this.read()\n return value === null ? stop() : { done: false, value }\n }\n\n this.once('end', stop)\n this.once(ERROR, stop)\n this.once(DESTROYED, stop)\n\n return {\n next,\n throw: stop,\n return: stop,\n [Symbol.iterator]() {\n return this\n },\n [Symbol.dispose]: () => {},\n }\n }\n\n /**\n * Destroy a stream, preventing it from being used for any further purpose.\n *\n * If the stream has a `close()` method, then it will be called on\n * destruction.\n *\n * After destruction, any attempt to write data, read data, or emit most\n * events will be ignored.\n *\n * If an error argument is provided, then it will be emitted in an\n * 'error' event.\n */\n destroy(er?: unknown) {\n if (this[DESTROYED]) {\n if (er) this.emit('error', er)\n else this.emit(DESTROYED)\n return this\n }\n\n this[DESTROYED] = true\n this[DISCARDED] = true\n\n // throw away all buffered data, it's never coming out\n this[BUFFER].length = 0\n this[BUFFERLENGTH] = 0\n\n const wc = this as Minipass<RType, WType, Events> & {\n close?: () => void\n }\n if (typeof wc.close === 'function' && !this[CLOSED]) wc.close()\n\n if (er) this.emit('error', er)\n // if no error to emit, still reject pending promises\n else this.emit(DESTROYED)\n\n return this\n }\n\n /**\n * Alias for {@link isStream}\n *\n * Former export location, maintained for backwards compatibility.\n *\n * @deprecated\n */\n static get isStream() {\n return isStream\n }\n}\n","import { WriteStream, WriteStreamSync } from '@isaacs/fs-minipass'\nimport type { Minipass } from 'minipass'\nimport path from 'node:path'\nimport { list } from './list.js'\nimport { makeCommand } from './make-command.js'\nimport type {\n TarOptions,\n TarOptionsFile,\n TarOptionsSync,\n TarOptionsSyncFile,\n} from './options.js'\nimport { Pack, PackSync } from './pack.js'\n\nconst createFileSync = (opt: TarOptionsSyncFile, files: string[]) => {\n const p = new PackSync(opt)\n const stream = new WriteStreamSync(opt.file, {\n mode: opt.mode || 0o666,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n addFilesSync(p, files)\n}\n\nconst createFile = (opt: TarOptionsFile, files: string[]) => {\n const p = new Pack(opt)\n const stream = new WriteStream(opt.file, {\n mode: opt.mode || 0o666,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n\n const promise = new Promise<void>((res, rej) => {\n stream.on('error', rej)\n stream.on('close', res)\n p.on('error', rej)\n })\n\n addFilesAsync(p, files).catch(er => p.emit('error', er))\n\n return promise\n}\n\nconst addFilesSync = (p: PackSync, files: string[]) => {\n files.forEach(file => {\n if (file.charAt(0) === '@') {\n list({\n file: path.resolve(p.cwd, file.slice(1)),\n sync: true,\n noResume: true,\n onReadEntry: entry => p.add(entry),\n })\n } else {\n p.add(file)\n }\n })\n p.end()\n}\n\nconst addFilesAsync = async (p: Pack, files: string[]): Promise<void> => {\n for (const file of files) {\n if (file.charAt(0) === '@') {\n await list({\n file: path.resolve(String(p.cwd), file.slice(1)),\n noResume: true,\n onReadEntry: entry => {\n p.add(entry)\n },\n })\n } else {\n p.add(file)\n }\n }\n p.end()\n}\n\nconst createSync = (opt: TarOptionsSync, files: string[]) => {\n const p = new PackSync(opt)\n addFilesSync(p, files)\n return p\n}\n\nconst createAsync = (opt: TarOptions, files: string[]) => {\n const p = new Pack(opt)\n addFilesAsync(p, files).catch(er => p.emit('error', er))\n return p\n}\n\nexport const create = makeCommand(\n createFileSync,\n createFile,\n createSync,\n createAsync,\n (_opt, files) => {\n if (!files?.length) {\n throw new TypeError('no paths specified to add to archive')\n }\n },\n)\n","// tar -t\nimport * as fsm from '@isaacs/fs-minipass'\nimport fs from 'node:fs'\nimport { dirname, parse } from 'path'\nimport { makeCommand } from './make-command.js'\nimport type {\n TarOptions,\n TarOptionsFile,\n TarOptionsSyncFile,\n} from './options.js'\nimport { Parser } from './parse.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\n\nconst onReadEntryFunction = (opt: TarOptions) => {\n const onReadEntry = opt.onReadEntry\n opt.onReadEntry =\n onReadEntry ?\n e => {\n onReadEntry(e)\n e.resume()\n }\n : e => e.resume()\n}\n\n// construct a filter that limits the file entries listed\n// include child entries if a dir is included\nexport const filesFilter = (opt: TarOptions, files: string[]) => {\n const map = new Map<string, boolean>(\n files.map(f => [stripTrailingSlashes(f), true]),\n )\n const filter = opt.filter\n\n const mapHas = (file: string, r: string = ''): boolean => {\n const root = r || parse(file).root || '.'\n let ret: boolean\n if (file === root) ret = false\n else {\n const m = map.get(file)\n ret = m !== undefined ? m : mapHas(dirname(file), root)\n }\n\n map.set(file, ret)\n return ret\n }\n\n opt.filter =\n filter ?\n (file, entry) =>\n filter(file, entry) && mapHas(stripTrailingSlashes(file))\n : file => mapHas(stripTrailingSlashes(file))\n}\n\nconst listFileSync = (opt: TarOptionsSyncFile) => {\n const p = new Parser(opt)\n const file = opt.file\n let fd: number | undefined\n try {\n fd = fs.openSync(file, 'r')\n const stat: fs.Stats = fs.fstatSync(fd)\n const readSize: number = opt.maxReadSize || 16 * 1024 * 1024\n if (stat.size < readSize) {\n const buf = Buffer.allocUnsafe(stat.size)\n const read = fs.readSync(fd, buf, 0, stat.size, 0)\n p.end(read === buf.byteLength ? buf : buf.subarray(0, read))\n } else {\n let pos = 0\n const buf = Buffer.allocUnsafe(readSize)\n while (pos < stat.size) {\n const bytesRead = fs.readSync(fd, buf, 0, readSize, pos)\n if (bytesRead === 0) break\n pos += bytesRead\n p.write(buf.subarray(0, bytesRead))\n }\n p.end()\n }\n } finally {\n if (typeof fd === 'number') {\n try {\n fs.closeSync(fd)\n /* c8 ignore next */\n } catch {}\n }\n }\n}\n\nconst listFile = (\n opt: TarOptionsFile,\n _files: string[],\n): Promise<void> => {\n const parse = new Parser(opt)\n const readSize = opt.maxReadSize || 16 * 1024 * 1024\n\n const file = opt.file\n const p = new Promise<void>((resolve, reject) => {\n parse.on('error', reject)\n parse.on('end', resolve)\n\n fs.stat(file, (er, stat) => {\n if (er) {\n reject(er)\n } else {\n const stream = new fsm.ReadStream(file, {\n readSize: readSize,\n size: stat.size,\n })\n stream.on('error', reject)\n stream.pipe(parse)\n }\n })\n })\n return p\n}\n\nexport const list = makeCommand(\n listFileSync,\n listFile,\n opt => new Parser(opt) as Parser & { sync: true },\n opt => new Parser(opt),\n (opt, files) => {\n if (files?.length) filesFilter(opt, files)\n if (!opt.noResume) onReadEntryFunction(opt)\n },\n)\n","// turn tar(1) style args like `C` into the more verbose things like `cwd`\n\nimport { type GzipOptions, type ZlibOptions } from 'minizlib'\nimport { type Stats } from 'node:fs'\nimport { type ReadEntry } from './read-entry.js'\nimport { type WarnData } from './warn-method.js'\nimport type { WriteEntry } from './write-entry.js'\n\nconst argmap = new Map<keyof TarOptionsWithAliases, keyof TarOptions>([\n ['C', 'cwd'],\n ['f', 'file'],\n ['z', 'gzip'],\n ['P', 'preservePaths'],\n ['U', 'unlink'],\n ['strip-components', 'strip'],\n ['stripComponents', 'strip'],\n ['keep-newer', 'newer'],\n ['keepNewer', 'newer'],\n ['keep-newer-files', 'newer'],\n ['keepNewerFiles', 'newer'],\n ['k', 'keep'],\n ['keep-existing', 'keep'],\n ['keepExisting', 'keep'],\n ['m', 'noMtime'],\n ['no-mtime', 'noMtime'],\n ['p', 'preserveOwner'],\n ['L', 'follow'],\n ['h', 'follow'],\n ['onentry', 'onReadEntry'],\n])\n\n/**\n * The options that can be provided to tar commands.\n *\n * Note that some of these are only relevant for certain commands, since\n * they are specific to reading or writing.\n *\n * Aliases are provided in the {@link TarOptionsWithAliases} type.\n */\nexport interface TarOptions {\n //////////////////////////\n // shared options\n\n /**\n * Perform all I/O operations synchronously. If the stream is ended\n * immediately, then it will be processed entirely synchronously.\n */\n sync?: boolean\n\n /**\n * The tar file to be read and/or written. When this is set, a stream\n * is not returned. Asynchronous commands will return a promise indicating\n * when the operation is completed, and synchronous commands will return\n * immediately.\n */\n file?: string\n\n /**\n * Treat warnings as crash-worthy errors. Defaults false.\n */\n strict?: boolean\n\n /**\n * The effective current working directory for this tar command\n */\n cwd?: string\n\n /**\n * When creating a tar archive, this can be used to compress it as well.\n * Set to `true` to use the default gzip options, or customize them as\n * needed.\n *\n * When reading, if this is unset, then the compression status will be\n * inferred from the archive data. This is generally best, unless you are\n * sure of the compression settings in use to create the archive, and want to\n * fail if the archive doesn't match expectations.\n */\n gzip?: boolean | GzipOptions\n\n /**\n * When creating archives, preserve absolute and `..` paths in the archive,\n * rather than sanitizing them under the cwd.\n *\n * When extracting, allow absolute paths, paths containing `..`, and\n * extracting through symbolic links. By default, the root `/` is stripped\n * from absolute paths (eg, turning `/x/y/z` into `x/y/z`), paths containing\n * `..` are not extracted, and any file whose location would be modified by a\n * symbolic link is not extracted.\n *\n * **WARNING** This is almost always unsafe, and must NEVER be used on\n * archives from untrusted sources, such as user input, and every entry must\n * be validated to ensure it is safe to write. Even if the input is not\n * malicious, mistakes can cause a lot of damage!\n */\n preservePaths?: boolean\n\n /**\n * When extracting, do not set the `mtime` value for extracted entries to\n * match the `mtime` in the archive.\n *\n * When creating archives, do not store the `mtime` value in the entry. Note\n * that this prevents properly using other mtime-based features (such as\n * `tar.update` or the `newer` option) with the resulting archive.\n */\n noMtime?: boolean\n\n /**\n * Set to `true` or an object with settings for `zlib.BrotliCompress()` to\n * create a brotli-compressed archive\n *\n * When extracting, this will cause the archive to be treated as a\n * brotli-compressed file if set to `true` or a ZlibOptions object.\n *\n * If set `false`, then brotli options will not be used.\n *\n * If this, the `gzip`, and `zstd` options are left `undefined`, then tar\n * will attempt to infer the brotli compression status, but can only do so\n * based on the filename. If the filename ends in `.tbr` or `.tar.br`, and\n * the first 512 bytes are not a valid tar header, then brotli decompression\n * will be attempted.\n */\n brotli?: boolean | ZlibOptions\n\n /**\n * Set to `true` or an object with settings for `zstd.compress()` to\n * create a zstd-compressed archive\n *\n * When extracting, this will cause the archive to be treated as a\n * zstd-compressed file if set to `true` or a ZlibOptions object.\n *\n * If set `false`, then zstd options will not be used.\n *\n * If this, the `gzip`, and `brotli` options are left `undefined`, then tar\n * will attempt to infer the zstd compression status, but can only do so\n * based on the filename. If the filename ends in `.tzst` or `.tar.zst`, and\n * the first 512 bytes are not a valid tar header, then zstd decompression\n * will be attempted.\n */\n zstd?: boolean | ZlibOptions\n\n /**\n * A function that is called with `(path, stat)` when creating an archive, or\n * `(path, entry)` when extracting. Return true to process the file/entry, or\n * false to exclude it.\n */\n filter?: (path: string, entry: Stats | ReadEntry) => boolean\n\n /**\n * A function that gets called for any warning encountered.\n *\n * Note: if `strict` is set, then the warning will throw, and this method\n * will not be called.\n */\n onwarn?: (code: string, message: string, data: WarnData) => unknown\n\n //////////////////////////\n // extraction options\n\n /**\n * When extracting, unlink files before creating them. Without this option,\n * tar overwrites existing files, which preserves existing hardlinks. With\n * this option, existing hardlinks will be broken, as will any symlink that\n * would affect the location of an extracted file.\n */\n unlink?: boolean\n\n /**\n * When extracting, strip the specified number of path portions from the\n * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be\n * extracted to `{cwd}/c/d`.\n *\n * Any entry whose entire path is stripped will be excluded.\n */\n strip?: number\n\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n newer?: boolean\n\n /**\n * When extracting, do not overwrite existing files at all.\n */\n keep?: boolean\n\n /**\n * When extracting, set the `uid` and `gid` of extracted entries to the `uid`\n * and `gid` fields in the archive. Defaults to true when run as root, and\n * false otherwise.\n *\n * If false, then files and directories will be set with the owner and group\n * of the user running the process. This is similar to `-p` in `tar(1)`, but\n * ACLs and other system-specific data is never unpacked in this\n * implementation, and modes are set by default already.\n */\n preserveOwner?: boolean\n\n /**\n * The maximum depth of subfolders to extract into. This defaults to 1024.\n * Anything deeper than the limit will raise a warning and skip the entry.\n * Set to `Infinity` to remove the limitation.\n */\n maxDepth?: number\n\n /**\n * When extracting, force all created files and directories, and all\n * implicitly created directories, to be owned by the specified user id,\n * regardless of the `uid` field in the archive.\n *\n * Cannot be used along with `preserveOwner`. Requires also setting the `gid`\n * option.\n */\n uid?: number\n\n /**\n * When extracting, force all created files and directories, and all\n * implicitly created directories, to be owned by the specified group id,\n * regardless of the `gid` field in the archive.\n *\n * Cannot be used along with `preserveOwner`. Requires also setting the `uid`\n * option.\n */\n gid?: number\n\n /**\n * When extracting, provide a function that takes an `entry` object, and\n * returns a stream, or any falsey value. If a stream is provided, then that\n * stream's data will be written instead of the contents of the archive\n * entry. If a falsey value is provided, then the entry is written to disk as\n * normal.\n *\n * To exclude items from extraction, use the `filter` option.\n *\n * Note that using an asynchronous stream type with the `transform` option\n * will cause undefined behavior in synchronous extractions.\n * [MiniPass](http://npm.im/minipass)-based streams are designed for this use\n * case.\n */\n transform?: (entry: ReadEntry) => ReadEntry\n\n /**\n * Call `chmod()` to ensure that extracted files match the entry's mode\n * field. Without this field set, all mode fields in archive entries are a\n * best effort attempt only.\n *\n * Setting this necessitates a call to the deprecated `process.umask()`\n * method to determine the default umask value, unless a `processUmask`\n * config is provided as well.\n *\n * If not set, tar will attempt to create file system entries with whatever\n * mode is provided, and let the implicit process `umask` apply normally, but\n * if a file already exists to be written to, then its existing mode will not\n * be modified.\n *\n * When setting `chmod: true`, it is highly recommend to set the\n * {@link TarOptions#processUmask} option as well, to avoid the call to the\n * deprecated (and thread-unsafe) `process.umask()` method.\n */\n chmod?: boolean\n\n /**\n * When setting the {@link TarOptions#chmod} option to `true`, you may\n * provide a value here to avoid having to call the deprecated and\n * thread-unsafe `process.umask()` method.\n *\n * This has no effect with `chmod` is not set to true, as mode values are not\n * set explicitly anyway. If `chmod` is set to `true`, and a value is not\n * provided here, then `process.umask()` must be called, which will result in\n * deprecation warnings.\n *\n * The most common values for this are `0o22` (resulting in directories\n * created with mode `0o755` and files with `0o644` by default) and `0o2`\n * (resulting in directores created with mode `0o775` and files `0o664`, so\n * they are group-writable).\n */\n processUmask?: number\n\n //////////////////////////\n // archive creation options\n\n /**\n * When parsing/listing archives, `entry` streams are by default resumed\n * (set into \"flowing\" mode) immediately after the call to `onReadEntry()`.\n * Set `noResume: true` to suppress this behavior.\n *\n * Note that when this is set, the stream will never complete until the\n * data is consumed somehow.\n *\n * Set automatically in extract operations, since the entry is piped to\n * a file system entry right away. Only relevant when parsing.\n */\n noResume?: boolean\n\n /**\n * When creating, updating, or replacing within archives, this method will\n * be called with each WriteEntry that is created.\n */\n onWriteEntry?: (entry: WriteEntry) => unknown\n\n /**\n * When extracting or listing archives, this method will be called with\n * each entry that is not excluded by a `filter`.\n *\n * Important when listing archives synchronously from a file, because there\n * is otherwise no way to interact with the data!\n */\n onReadEntry?: (entry: ReadEntry) => unknown\n\n /**\n * Pack the targets of symbolic links rather than the link itself.\n */\n follow?: boolean\n\n /**\n * When creating archives, omit any metadata that is system-specific:\n * `ctime`, `atime`, `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and\n * `nlink`. Note that `mtime` is still included, because this is necessary\n * for other time-based operations such as `tar.update`. Additionally, `mode`\n * is set to a \"reasonable default\" for mose unix systems, based on an\n * effective `umask` of `0o22`.\n *\n * This also defaults the `portable` option in the gzip configs when creating\n * a compressed archive, in order to produce deterministic archives that are\n * not operating-system specific.\n */\n portable?: boolean\n\n /**\n * When creating archives, do not recursively archive the contents of\n * directories. By default, archiving a directory archives all of its\n * contents as well.\n */\n noDirRecurse?: boolean\n\n /**\n * Suppress Pax extended headers when creating archives. Note that this means\n * long paths and linkpaths will be truncated, and large or negative numeric\n * values may be interpreted incorrectly.\n */\n noPax?: boolean\n\n /**\n * Set to a `Date` object to force a specific `mtime` value for everything\n * written to an archive.\n *\n * This is useful when creating archives that are intended to be\n * deterministic based on their contents, irrespective of the file's last\n * modification time.\n *\n * Overridden by `noMtime`.\n */\n mtime?: Date\n\n /**\n * A path portion to prefix onto the entries added to an archive.\n */\n prefix?: string\n\n /**\n * The mode to set on any created file archive, defaults to 0o666\n * masked by the process umask, often resulting in 0o644.\n *\n * This does *not* affect the mode fields of individual entries, or the\n * mode status of extracted entries on the filesystem.\n */\n mode?: number\n\n //////////////////////////\n // internal options\n\n /**\n * A cache of mtime values, to avoid having to stat the same file repeatedly.\n *\n * @internal\n */\n mtimeCache?: Map<string, Date>\n\n /**\n * maximum buffer size for `fs.read()` operations.\n *\n * @internal\n */\n maxReadSize?: number\n\n /**\n * Filter modes of entries being unpacked, like `process.umask()`\n *\n * @internal\n */\n umask?: number\n\n /**\n * Default mode for directories. Used for all implicitly created directories,\n * and any directories in the archive that do not have a mode field.\n *\n * @internal\n */\n dmode?: number\n\n /**\n * default mode for files\n *\n * @internal\n */\n fmode?: number\n\n /**\n * Map that tracks which directories already exist, for extraction\n *\n * @internal\n */\n dirCache?: Map<string, boolean>\n /**\n * maximum supported size of meta entries. Defaults to 1MB\n *\n * @internal\n */\n maxMetaEntrySize?: number\n\n /**\n * A Map object containing the device and inode value for any file whose\n * `nlink` value is greater than 1, to identify hard links when creating\n * archives.\n *\n * @internal\n */\n linkCache?: Map<LinkCacheKey, string>\n\n /**\n * A map object containing the results of `fs.readdir()` calls.\n *\n * @internal\n */\n readdirCache?: Map<string, string[]>\n\n /**\n * A cache of all `lstat` results, for use in creating archives.\n *\n * @internal\n */\n statCache?: Map<string, Stats>\n\n /**\n * Number of concurrent jobs to run when creating archives.\n *\n * Defaults to 4.\n *\n * @internal\n */\n jobs?: number\n\n /**\n * Automatically set to true on Windows systems.\n *\n * When extracting, causes behavior where filenames containing `<|>?:`\n * characters are converted to windows-compatible escape sequences in the\n * created filesystem entries.\n *\n * When packing, causes behavior where paths replace `\\` with `/`, and\n * filenames containing the windows-compatible escaped forms of `<|>?:` are\n * converted to actual `<|>?:` characters in the archive.\n *\n * @internal\n */\n win32?: boolean\n\n /**\n * For `WriteEntry` objects, the absolute path to the entry on the\n * filesystem. By default, this is `resolve(cwd, entry.path)`, but it can be\n * overridden explicitly.\n *\n * @internal\n */\n absolute?: string\n\n /**\n * Used with Parser stream interface, to attach and take over when the\n * stream is completely parsed. If this is set, then the prefinish,\n * finish, and end events will not fire, and are the responsibility of\n * the ondone method to emit properly.\n *\n * @internal\n */\n ondone?: () => void\n\n /**\n * Mostly for testing, but potentially useful in some cases.\n * Forcibly trigger a chown on every entry, no matter what.\n */\n forceChown?: boolean\n\n /**\n * ambiguous deprecated name for {@link onReadEntry}\n *\n * @deprecated\n */\n onentry?: (entry: ReadEntry) => unknown\n}\n\nexport type TarOptionsSync = TarOptions & { sync: true }\nexport type TarOptionsAsync = TarOptions & { sync?: false }\nexport type TarOptionsFile = TarOptions & { file: string }\nexport type TarOptionsNoFile = TarOptions & { file?: undefined }\nexport type TarOptionsSyncFile = TarOptionsSync & TarOptionsFile\nexport type TarOptionsAsyncFile = TarOptionsAsync & TarOptionsFile\nexport type TarOptionsSyncNoFile = TarOptionsSync & TarOptionsNoFile\nexport type TarOptionsAsyncNoFile = TarOptionsAsync & TarOptionsNoFile\n\nexport type LinkCacheKey = `${number}:${number}`\n\nexport interface TarOptionsWithAliases extends TarOptions {\n /**\n * The effective current working directory for this tar command\n */\n C?: TarOptions['cwd']\n /**\n * The tar file to be read and/or written. When this is set, a stream\n * is not returned. Asynchronous commands will return a promise indicating\n * when the operation is completed, and synchronous commands will return\n * immediately.\n */\n f?: TarOptions['file']\n /**\n * When creating a tar archive, this can be used to compress it as well.\n * Set to `true` to use the default gzip options, or customize them as\n * needed.\n *\n * When reading, if this is unset, then the compression status will be\n * inferred from the archive data. This is generally best, unless you are\n * sure of the compression settings in use to create the archive, and want to\n * fail if the archive doesn't match expectations.\n */\n z?: TarOptions['gzip']\n /**\n * When creating archives, preserve absolute and `..` paths in the archive,\n * rather than sanitizing them under the cwd.\n *\n * When extracting, allow absolute paths, paths containing `..`, and\n * extracting through symbolic links. By default, the root `/` is stripped\n * from absolute paths (eg, turning `/x/y/z` into `x/y/z`), paths containing\n * `..` are not extracted, and any file whose location would be modified by a\n * symbolic link is not extracted.\n *\n * **WARNING** This is almost always unsafe, and must NEVER be used on\n * archives from untrusted sources, such as user input, and every entry must\n * be validated to ensure it is safe to write. Even if the input is not\n * malicious, mistakes can cause a lot of damage!\n */\n P?: TarOptions['preservePaths']\n /**\n * When extracting, unlink files before creating them. Without this option,\n * tar overwrites existing files, which preserves existing hardlinks. With\n * this option, existing hardlinks will be broken, as will any symlink that\n * would affect the location of an extracted file.\n */\n U?: TarOptions['unlink']\n /**\n * When extracting, strip the specified number of path portions from the\n * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be\n * extracted to `{cwd}/c/d`.\n */\n 'strip-components'?: TarOptions['strip']\n /**\n * When extracting, strip the specified number of path portions from the\n * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be\n * extracted to `{cwd}/c/d`.\n */\n stripComponents?: TarOptions['strip']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n 'keep-newer'?: TarOptions['newer']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n keepNewer?: TarOptions['newer']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n 'keep-newer-files'?: TarOptions['newer']\n /**\n * When extracting, keep the existing file on disk if it's newer than the\n * file in the archive.\n */\n keepNewerFiles?: TarOptions['newer']\n /**\n * When extracting, do not overwrite existing files at all.\n */\n k?: TarOptions['keep']\n /**\n * When extracting, do not overwrite existing files at all.\n */\n 'keep-existing'?: TarOptions['keep']\n /**\n * When extracting, do not overwrite existing files at all.\n */\n keepExisting?: TarOptions['keep']\n /**\n * When extracting, do not set the `mtime` value for extracted entries to\n * match the `mtime` in the archive.\n *\n * When creating archives, do not store the `mtime` value in the entry. Note\n * that this prevents properly using other mtime-based features (such as\n * `tar.update` or the `newer` option) with the resulting archive.\n */\n m?: TarOptions['noMtime']\n /**\n * When extracting, do not set the `mtime` value for extracted entries to\n * match the `mtime` in the archive.\n *\n * When creating archives, do not store the `mtime` value in the entry. Note\n * that this prevents properly using other mtime-based features (such as\n * `tar.update` or the `newer` option) with the resulting archive.\n */\n 'no-mtime'?: TarOptions['noMtime']\n /**\n * When extracting, set the `uid` and `gid` of extracted entries to the `uid`\n * and `gid` fields in the archive. Defaults to true when run as root, and\n * false otherwise.\n *\n * If false, then files and directories will be set with the owner and group\n * of the user running the process. This is similar to `-p` in `tar(1)`, but\n * ACLs and other system-specific data is never unpacked in this\n * implementation, and modes are set by default already.\n */\n p?: TarOptions['preserveOwner']\n /**\n * Pack the targets of symbolic links rather than the link itself.\n */\n L?: TarOptions['follow']\n /**\n * Pack the targets of symbolic links rather than the link itself.\n */\n h?: TarOptions['follow']\n\n /**\n * Deprecated option. Set explicitly false to set `chmod: true`. Ignored\n * if {@link TarOptions#chmod} is set to any boolean value.\n *\n * @deprecated\n */\n noChmod?: boolean\n}\n\nexport type TarOptionsWithAliasesSync = TarOptionsWithAliases & {\n sync: true\n}\nexport type TarOptionsWithAliasesAsync = TarOptionsWithAliases & {\n sync?: false\n}\nexport type TarOptionsWithAliasesFile =\n | (TarOptionsWithAliases & {\n file: string\n })\n | (TarOptionsWithAliases & { f: string })\nexport type TarOptionsWithAliasesSyncFile = TarOptionsWithAliasesSync &\n TarOptionsWithAliasesFile\nexport type TarOptionsWithAliasesAsyncFile = TarOptionsWithAliasesAsync &\n TarOptionsWithAliasesFile\n\nexport type TarOptionsWithAliasesNoFile = TarOptionsWithAliases & {\n f?: undefined\n file?: undefined\n}\n\nexport type TarOptionsWithAliasesSyncNoFile = TarOptionsWithAliasesSync &\n TarOptionsWithAliasesNoFile\nexport type TarOptionsWithAliasesAsyncNoFile = TarOptionsWithAliasesAsync &\n TarOptionsWithAliasesNoFile\n\nexport const isSyncFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsSyncFile => !!o.sync && !!o.file\nexport const isAsyncFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsAsyncFile => !o.sync && !!o.file\nexport const isSyncNoFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsSyncNoFile => !!o.sync && !o.file\nexport const isAsyncNoFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsAsyncNoFile => !o.sync && !o.file\nexport const isSync = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsSync => !!o.sync\nexport const isAsync = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsAsync => !o.sync\nexport const isFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsFile => !!o.file\nexport const isNoFile = <O extends TarOptions>(\n o: O,\n): o is O & TarOptionsNoFile => !o.file\n\nconst dealiasKey = (k: keyof TarOptionsWithAliases): keyof TarOptions => {\n const d = argmap.get(k)\n if (d) return d\n return k as keyof TarOptions\n}\n\nexport const dealias = (opt: TarOptionsWithAliases = {}): TarOptions => {\n if (!opt) return {}\n const result: Record<string, unknown> = {}\n for (const [key, v] of Object.entries(opt) as [\n keyof TarOptionsWithAliases,\n unknown,\n ][]) {\n // TS doesn't know that aliases are going to always be the same type\n const k = dealiasKey(key)\n result[k] = v\n }\n // affordance for deprecated noChmod -> chmod\n if (result.chmod === undefined && result.noChmod === false) {\n result.chmod = true\n }\n delete result.noChmod\n return result as TarOptions\n}\n","import type {\n TarOptions,\n TarOptionsAsyncFile,\n TarOptionsAsyncNoFile,\n TarOptionsSyncFile,\n TarOptionsSyncNoFile,\n TarOptionsWithAliases,\n TarOptionsWithAliasesAsync,\n TarOptionsWithAliasesAsyncFile,\n TarOptionsWithAliasesAsyncNoFile,\n TarOptionsWithAliasesFile,\n TarOptionsWithAliasesNoFile,\n TarOptionsWithAliasesSync,\n TarOptionsWithAliasesSyncFile,\n TarOptionsWithAliasesSyncNoFile,\n} from './options.js'\nimport {\n dealias,\n isAsyncFile,\n isAsyncNoFile,\n isSyncFile,\n isSyncNoFile,\n} from './options.js'\n\nexport type CB = (er?: Error) => unknown\n\nexport type TarCommand<AsyncClass, SyncClass extends { sync: true }> = {\n // async and no file specified\n (): AsyncClass\n (opt: TarOptionsWithAliasesAsyncNoFile): AsyncClass\n (entries: string[]): AsyncClass\n (opt: TarOptionsWithAliasesAsyncNoFile, entries: string[]): AsyncClass\n} & {\n // sync and no file\n (opt: TarOptionsWithAliasesSyncNoFile): SyncClass\n (opt: TarOptionsWithAliasesSyncNoFile, entries: string[]): SyncClass\n} & {\n // async and file\n (opt: TarOptionsWithAliasesAsyncFile): Promise<void>\n (opt: TarOptionsWithAliasesAsyncFile, entries: string[]): Promise<void>\n (opt: TarOptionsWithAliasesAsyncFile, cb: CB): Promise<void>\n (\n opt: TarOptionsWithAliasesAsyncFile,\n entries: string[],\n cb: CB,\n ): Promise<void>\n} & {\n // sync and file\n (opt: TarOptionsWithAliasesSyncFile): void\n (opt: TarOptionsWithAliasesSyncFile, entries: string[]): void\n} & {\n // sync, maybe file\n (opt: TarOptionsWithAliasesSync): typeof opt extends (\n TarOptionsWithAliasesFile\n ) ?\n void\n : typeof opt extends TarOptionsWithAliasesNoFile ? SyncClass\n : void | SyncClass\n (\n opt: TarOptionsWithAliasesSync,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesFile ? void\n : typeof opt extends TarOptionsWithAliasesNoFile ? SyncClass\n : void | SyncClass\n} & {\n // async, maybe file\n (opt: TarOptionsWithAliasesAsync): typeof opt extends (\n TarOptionsWithAliasesFile\n ) ?\n Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ? AsyncClass\n : Promise<void> | AsyncClass\n (\n opt: TarOptionsWithAliasesAsync,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesFile ? Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ? AsyncClass\n : Promise<void> | AsyncClass\n (opt: TarOptionsWithAliasesAsync, cb: CB): Promise<void>\n (\n opt: TarOptionsWithAliasesAsync,\n entries: string[],\n cb: CB,\n ): typeof opt extends TarOptionsWithAliasesFile ? Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ? never\n : Promise<void>\n} & {\n // maybe sync, file\n (opt: TarOptionsWithAliasesFile): Promise<void> | void\n (\n opt: TarOptionsWithAliasesFile,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesSync ? void\n : typeof opt extends TarOptionsWithAliasesAsync ? Promise<void>\n : Promise<void> | void\n (opt: TarOptionsWithAliasesFile, cb: CB): Promise<void>\n (\n opt: TarOptionsWithAliasesFile,\n entries: string[],\n cb: CB,\n ): typeof opt extends TarOptionsWithAliasesSync ? never\n : typeof opt extends TarOptionsWithAliasesAsync ? Promise<void>\n : Promise<void>\n} & {\n // maybe sync, no file\n (opt: TarOptionsWithAliasesNoFile): typeof opt extends (\n TarOptionsWithAliasesSync\n ) ?\n SyncClass\n : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass\n : SyncClass | AsyncClass\n (\n opt: TarOptionsWithAliasesNoFile,\n entries: string[],\n ): typeof opt extends TarOptionsWithAliasesSync ? SyncClass\n : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass\n : SyncClass | AsyncClass\n} & {\n // maybe sync, maybe file\n (opt: TarOptionsWithAliases): typeof opt extends (\n TarOptionsWithAliasesFile\n ) ?\n typeof opt extends TarOptionsWithAliasesSync ? void\n : typeof opt extends TarOptionsWithAliasesAsync ? Promise<void>\n : void | Promise<void>\n : typeof opt extends TarOptionsWithAliasesNoFile ?\n typeof opt extends TarOptionsWithAliasesSync ? SyncClass\n : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass\n : SyncClass | AsyncClass\n : typeof opt extends TarOptionsWithAliasesSync ? SyncClass | void\n : typeof opt extends TarOptionsWithAliasesAsync ?\n AsyncClass | Promise<void>\n : SyncClass | void | AsyncClass | Promise<void>\n} & {\n // extras\n syncFile: (opt: TarOptionsSyncFile, entries: string[]) => void\n asyncFile: (\n opt: TarOptionsAsyncFile,\n entries: string[],\n cb?: CB,\n ) => Promise<void>\n syncNoFile: (opt: TarOptionsSyncNoFile, entries: string[]) => SyncClass\n asyncNoFile: (\n opt: TarOptionsAsyncNoFile,\n entries: string[],\n ) => AsyncClass\n validate?: (opt: TarOptions, entries?: string[]) => void\n}\n\nexport const makeCommand = <AsyncClass, SyncClass extends { sync: true }>(\n syncFile: (opt: TarOptionsSyncFile, entries: string[]) => void,\n asyncFile: (\n opt: TarOptionsAsyncFile,\n entries: string[],\n cb?: CB,\n ) => Promise<void>,\n syncNoFile: (opt: TarOptionsSyncNoFile, entries: string[]) => SyncClass,\n asyncNoFile: (\n opt: TarOptionsAsyncNoFile,\n entries: string[],\n ) => AsyncClass,\n validate?: (opt: TarOptions, entries?: string[]) => void,\n): TarCommand<AsyncClass, SyncClass> => {\n return Object.assign(\n (\n opt_: TarOptionsWithAliases | string[] = [],\n entries?: string[] | CB,\n cb?: CB,\n ) => {\n if (Array.isArray(opt_)) {\n entries = opt_\n opt_ = {}\n }\n\n if (typeof entries === 'function') {\n cb = entries\n entries = undefined\n }\n\n entries = !entries ? [] : Array.from(entries)\n\n const opt = dealias(opt_)\n\n validate?.(opt, entries)\n\n if (isSyncFile(opt)) {\n if (typeof cb === 'function') {\n throw new TypeError(\n 'callback not supported for sync tar functions',\n )\n }\n return syncFile(opt, entries)\n } else if (isAsyncFile(opt)) {\n const p = asyncFile(opt, entries)\n return cb ? p.then(() => cb(), cb) : p\n } else if (isSyncNoFile(opt)) {\n if (typeof cb === 'function') {\n throw new TypeError(\n 'callback not supported for sync tar functions',\n )\n }\n return syncNoFile(opt, entries)\n } else if (isAsyncNoFile(opt)) {\n if (typeof cb === 'function') {\n throw new TypeError('callback only supported with file option')\n }\n return asyncNoFile(opt, entries)\n /* c8 ignore start */\n }\n throw new Error('impossible options??')\n\n /* c8 ignore stop */\n },\n {\n syncFile,\n asyncFile,\n syncNoFile,\n asyncNoFile,\n validate,\n },\n ) as TarCommand<AsyncClass, SyncClass>\n}\n","// this[BUFFER] is the remainder of a chunk if we're waiting for\n// the full 512 bytes of a header to come in. We will Buffer.concat()\n// it to the next write(), which is a mem copy, but a small one.\n//\n// this[QUEUE] is a list of entries that haven't been emitted\n// yet this can only get filled up if the user keeps write()ing after\n// a write() returns false, or does a write() with more than one entry\n//\n// We don't buffer chunks, we always parse them and either create an\n// entry, or push it into the active entry. The ReadEntry class knows\n// to throw data away if .ignore=true\n//\n// Shift entry off the buffer when it emits 'end', and emit 'entry' for\n// the next one in the list.\n//\n// At any time, we're pushing body chunks into the entry at WRITEENTRY,\n// and waiting for 'end' on the entry at READENTRY\n//\n// ignored entries get .resume() called on them straight away\n\nimport { EventEmitter as EE } from 'events'\nimport { BrotliDecompress, Unzip, ZstdDecompress } from 'minizlib'\nimport { Header } from './header.js'\nimport type { TarOptions } from './options.js'\nimport { Pax } from './pax.js'\nimport { ReadEntry } from './read-entry.js'\nimport { warnMethod, type WarnData, type Warner } from './warn-method.js'\n\nconst maxMetaEntrySize = 1024 * 1024\nconst gzipHeader = Buffer.from([0x1f, 0x8b])\nconst zstdHeader = Buffer.from([0x28, 0xb5, 0x2f, 0xfd])\nconst ZIP_HEADER_LEN = Math.max(gzipHeader.length, zstdHeader.length)\n\nconst STATE = Symbol('state')\nconst WRITEENTRY = Symbol('writeEntry')\nconst READENTRY = Symbol('readEntry')\nconst NEXTENTRY = Symbol('nextEntry')\nconst PROCESSENTRY = Symbol('processEntry')\nconst EX = Symbol('extendedHeader')\nconst GEX = Symbol('globalExtendedHeader')\nconst META = Symbol('meta')\nconst EMITMETA = Symbol('emitMeta')\nconst BUFFER = Symbol('buffer')\nconst QUEUE = Symbol('queue')\nconst ENDED = Symbol('ended')\nconst EMITTEDEND = Symbol('emittedEnd')\nconst EMIT = Symbol('emit')\nconst UNZIP = Symbol('unzip')\nconst CONSUMECHUNK = Symbol('consumeChunk')\nconst CONSUMECHUNKSUB = Symbol('consumeChunkSub')\nconst CONSUMEBODY = Symbol('consumeBody')\nconst CONSUMEMETA = Symbol('consumeMeta')\nconst CONSUMEHEADER = Symbol('consumeHeader')\nconst CONSUMING = Symbol('consuming')\nconst BUFFERCONCAT = Symbol('bufferConcat')\nconst MAYBEEND = Symbol('maybeEnd')\nconst WRITING = Symbol('writing')\nconst ABORTED = Symbol('aborted')\nconst DONE = Symbol('onDone')\nconst SAW_VALID_ENTRY = Symbol('sawValidEntry')\nconst SAW_NULL_BLOCK = Symbol('sawNullBlock')\nconst SAW_EOF = Symbol('sawEOF')\nconst CLOSESTREAM = Symbol('closeStream')\n\nconst noop = () => true\n\nexport type State = 'begin' | 'header' | 'ignore' | 'meta' | 'body'\n\nexport class Parser extends EE implements Warner {\n file: string\n strict: boolean\n maxMetaEntrySize: number\n filter: Exclude<TarOptions['filter'], undefined>\n brotli?: TarOptions['brotli']\n zstd?: TarOptions['zstd']\n\n writable: true = true\n readable: false = false;\n\n [QUEUE]: (ReadEntry | [string | symbol, unknown, unknown])[] = [];\n [BUFFER]?: Buffer;\n [READENTRY]?: ReadEntry;\n [WRITEENTRY]?: ReadEntry;\n [STATE]: State = 'begin';\n [META]: string = '';\n [EX]?: Pax;\n [GEX]?: Pax;\n [ENDED]: boolean = false;\n [UNZIP]?: false | Unzip | BrotliDecompress | ZstdDecompress;\n [ABORTED]: boolean = false;\n [SAW_VALID_ENTRY]?: boolean;\n [SAW_NULL_BLOCK]: boolean = false;\n [SAW_EOF]: boolean = false;\n [WRITING]: boolean = false;\n [CONSUMING]: boolean = false;\n [EMITTEDEND]: boolean = false\n\n constructor(opt: TarOptions = {}) {\n super()\n\n this.file = opt.file || ''\n\n // these BADARCHIVE errors can't be detected early. listen on DONE.\n this.on(DONE, () => {\n if (this[STATE] === 'begin' || this[SAW_VALID_ENTRY] === false) {\n // either less than 1 block of data, or all entries were invalid.\n // Either way, probably not even a tarball.\n this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format')\n }\n })\n\n if (opt.ondone) {\n this.on(DONE, opt.ondone)\n } else {\n this.on(DONE, () => {\n this.emit('prefinish')\n this.emit('finish')\n this.emit('end')\n })\n }\n\n this.strict = !!opt.strict\n this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize\n this.filter = typeof opt.filter === 'function' ? opt.filter : noop\n // Unlike gzip, brotli doesn't have any magic bytes to identify it\n // Users need to explicitly tell us they're extracting a brotli file\n // Or we infer from the file extension\n const isTBR =\n opt.file &&\n (opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr'))\n // if it's a tbr file it MIGHT be brotli, but we don't know until\n // we look at it and verify it's not a valid tar file.\n this.brotli =\n !(opt.gzip || opt.zstd) && opt.brotli !== undefined ? opt.brotli\n : isTBR ? undefined\n : false\n\n // zstd has magic bytes to identify it, but we also support explicit options\n // and file extension detection\n const isTZST =\n opt.file &&\n (opt.file.endsWith('.tar.zst') || opt.file.endsWith('.tzst'))\n this.zstd =\n !(opt.gzip || opt.brotli) && opt.zstd !== undefined ? opt.zstd\n : isTZST ? true\n : undefined\n\n // have to set this so that streams are ok piping into it\n this.on('end', () => this[CLOSESTREAM]())\n\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n if (typeof opt.onReadEntry === 'function') {\n this.on('entry', opt.onReadEntry)\n }\n }\n\n warn(code: string, message: string | Error, data: WarnData = {}): void {\n warnMethod(this, code, message, data)\n }\n\n [CONSUMEHEADER](chunk: Buffer, position: number) {\n if (this[SAW_VALID_ENTRY] === undefined) {\n this[SAW_VALID_ENTRY] = false\n }\n let header\n try {\n header = new Header(chunk, position, this[EX], this[GEX])\n } catch (er) {\n return this.warn('TAR_ENTRY_INVALID', er as Error)\n }\n\n if (header.nullBlock) {\n if (this[SAW_NULL_BLOCK]) {\n this[SAW_EOF] = true\n // ending an archive with no entries. pointless, but legal.\n if (this[STATE] === 'begin') {\n this[STATE] = 'header'\n }\n this[EMIT]('eof')\n } else {\n this[SAW_NULL_BLOCK] = true\n this[EMIT]('nullBlock')\n }\n } else {\n this[SAW_NULL_BLOCK] = false\n if (!header.cksumValid) {\n this.warn('TAR_ENTRY_INVALID', 'checksum failure', { header })\n } else if (!header.path) {\n this.warn('TAR_ENTRY_INVALID', 'path is required', { header })\n } else {\n const type = header.type\n if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) {\n this.warn('TAR_ENTRY_INVALID', 'linkpath required', {\n header,\n })\n } else if (\n !/^(Symbolic)?Link$/.test(type) &&\n !/^(Global)?ExtendedHeader$/.test(type) &&\n header.linkpath\n ) {\n this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', {\n header,\n })\n } else {\n const entry = (this[WRITEENTRY] = new ReadEntry(\n header,\n this[EX],\n this[GEX],\n ))\n\n // we do this for meta & ignored entries as well, because they\n // are still valid tar, or else we wouldn't know to ignore them\n if (!this[SAW_VALID_ENTRY]) {\n if (entry.remain) {\n // this might be the one!\n const onend = () => {\n if (!entry.invalid) {\n this[SAW_VALID_ENTRY] = true\n }\n }\n entry.on('end', onend)\n } else {\n this[SAW_VALID_ENTRY] = true\n }\n }\n\n if (entry.meta) {\n if (entry.size > this.maxMetaEntrySize) {\n entry.ignore = true\n this[EMIT]('ignoredEntry', entry)\n this[STATE] = 'ignore'\n entry.resume()\n } else if (entry.size > 0) {\n this[META] = ''\n entry.on('data', c => (this[META] += c))\n this[STATE] = 'meta'\n }\n } else {\n this[EX] = undefined\n entry.ignore = entry.ignore || !this.filter(entry.path, entry)\n\n if (entry.ignore) {\n // probably valid, just not something we care about\n this[EMIT]('ignoredEntry', entry)\n this[STATE] = entry.remain ? 'ignore' : 'header'\n entry.resume()\n } else {\n if (entry.remain) {\n this[STATE] = 'body'\n } else {\n this[STATE] = 'header'\n entry.end()\n }\n\n if (!this[READENTRY]) {\n this[QUEUE].push(entry)\n this[NEXTENTRY]()\n } else {\n this[QUEUE].push(entry)\n }\n }\n }\n }\n }\n }\n }\n\n [CLOSESTREAM]() {\n queueMicrotask(() => this.emit('close'))\n }\n\n [PROCESSENTRY](entry?: ReadEntry | [string | symbol, unknown, unknown]) {\n let go = true\n\n if (!entry) {\n this[READENTRY] = undefined\n go = false\n } else if (Array.isArray(entry)) {\n const [ev, ...args]: [string | symbol, unknown, unknown] = entry\n this.emit(ev, ...args)\n } else {\n this[READENTRY] = entry\n this.emit('entry', entry)\n if (!entry.emittedEnd) {\n entry.on('end', () => this[NEXTENTRY]())\n go = false\n }\n }\n\n return go\n }\n\n [NEXTENTRY]() {\n do {} while (this[PROCESSENTRY](this[QUEUE].shift()))\n\n if (this[QUEUE].length === 0) {\n // At this point, there's nothing in the queue, but we may have an\n // entry which is being consumed (readEntry).\n // If we don't, then we definitely can handle more data.\n // If we do, and either it's flowing, or it has never had any data\n // written to it, then it needs more.\n // The only other possibility is that it has returned false from a\n // write() call, so we wait for the next drain to continue.\n const re = this[READENTRY]\n const drainNow = !re || re.flowing || re.size === re.remain\n if (drainNow) {\n if (!this[WRITING]) {\n this.emit('drain')\n }\n } else {\n re.once('drain', () => this.emit('drain'))\n }\n }\n }\n\n [CONSUMEBODY](chunk: Buffer, position: number) {\n // write up to but no more than writeEntry.blockRemain\n const entry = this[WRITEENTRY]\n /* c8 ignore start */\n if (!entry) {\n throw new Error('attempt to consume body without entry??')\n }\n const br = entry.blockRemain ?? 0\n /* c8 ignore stop */\n const c =\n br >= chunk.length && position === 0 ?\n chunk\n : chunk.subarray(position, position + br)\n\n entry.write(c)\n\n if (!entry.blockRemain) {\n this[STATE] = 'header'\n this[WRITEENTRY] = undefined\n entry.end()\n }\n\n return c.length\n }\n\n [CONSUMEMETA](chunk: Buffer, position: number) {\n const entry = this[WRITEENTRY]\n const ret = this[CONSUMEBODY](chunk, position)\n\n // if we finished, then the entry is reset\n if (!this[WRITEENTRY] && entry) {\n this[EMITMETA](entry)\n }\n\n return ret\n }\n\n [EMIT](ev: string | symbol, data?: unknown, extra?: unknown) {\n if (this[QUEUE].length === 0 && !this[READENTRY]) {\n this.emit(ev, data, extra)\n } else {\n this[QUEUE].push([ev, data, extra])\n }\n }\n\n [EMITMETA](entry: ReadEntry) {\n this[EMIT]('meta', this[META])\n switch (entry.type) {\n case 'ExtendedHeader':\n case 'OldExtendedHeader':\n this[EX] = Pax.parse(this[META], this[EX], false)\n break\n\n case 'GlobalExtendedHeader':\n this[GEX] = Pax.parse(this[META], this[GEX], true)\n break\n\n case 'NextFileHasLongPath':\n case 'OldGnuLongPath': {\n const ex = this[EX] ?? Object.create(null)\n this[EX] = ex\n ex.path = this[META].replace(/\\0.*/, '')\n break\n }\n\n case 'NextFileHasLongLinkpath': {\n const ex = this[EX] || Object.create(null)\n this[EX] = ex\n ex.linkpath = this[META].replace(/\\0.*/, '')\n break\n }\n\n /* c8 ignore start */\n default:\n throw new Error('unknown meta: ' + entry.type)\n /* c8 ignore stop */\n }\n }\n\n abort(error: Error) {\n this[ABORTED] = true\n this.emit('abort', error)\n // always throws, even in non-strict mode\n this.warn('TAR_ABORT', error, { recoverable: false })\n }\n\n write(\n buffer: Uint8Array | string,\n cb?: (err?: Error | null) => void,\n ): boolean\n write(\n str: string,\n encoding?: BufferEncoding,\n cb?: (err?: Error | null) => void,\n ): boolean\n write(\n chunk: Buffer | string,\n encoding?: BufferEncoding | (() => unknown),\n cb?: () => unknown,\n ): boolean {\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(\n chunk,\n /* c8 ignore next */\n typeof encoding === 'string' ? encoding : 'utf8',\n )\n }\n if (this[ABORTED]) {\n /* c8 ignore next */\n cb?.()\n return false\n }\n\n // first write, might be gzipped, zstd, or brotli compressed\n const needSniff =\n this[UNZIP] === undefined ||\n (this.brotli === undefined && this[UNZIP] === false)\n if (needSniff && chunk) {\n if (this[BUFFER]) {\n chunk = Buffer.concat([this[BUFFER], chunk])\n this[BUFFER] = undefined\n }\n if (chunk.length < ZIP_HEADER_LEN) {\n this[BUFFER] = chunk\n /* c8 ignore next */\n cb?.()\n return true\n }\n\n // look for gzip header\n for (\n let i = 0;\n this[UNZIP] === undefined && i < gzipHeader.length;\n i++\n ) {\n if (chunk[i] !== gzipHeader[i]) {\n this[UNZIP] = false\n }\n }\n\n // look for zstd header if gzip header not found\n let isZstd = false\n if (this[UNZIP] === false && this.zstd !== false) {\n isZstd = true\n for (let i = 0; i < zstdHeader.length; i++) {\n if (chunk[i] !== zstdHeader[i]) {\n isZstd = false\n break\n }\n }\n }\n\n const maybeBrotli = this.brotli === undefined && !isZstd\n if (this[UNZIP] === false && maybeBrotli) {\n // read the first header to see if it's a valid tar file. If so,\n // we can safely assume that it's not actually brotli, despite the\n // .tbr or .tar.br file extension.\n // if we ended before getting a full chunk, yes, def brotli\n if (chunk.length < 512) {\n if (this[ENDED]) {\n this.brotli = true\n } else {\n this[BUFFER] = chunk\n /* c8 ignore next */\n cb?.()\n return true\n }\n } else {\n // if it's tar, it's pretty reliably not brotli, chances of\n // that happening are astronomical.\n try {\n new Header(chunk.subarray(0, 512))\n this.brotli = false\n } catch (_) {\n this.brotli = true\n }\n }\n }\n\n if (\n this[UNZIP] === undefined ||\n (this[UNZIP] === false && (this.brotli || isZstd))\n ) {\n const ended = this[ENDED]\n this[ENDED] = false\n this[UNZIP] =\n this[UNZIP] === undefined ? new Unzip({})\n : isZstd ? new ZstdDecompress({})\n : new BrotliDecompress({})\n this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk))\n this[UNZIP].on('error', er => this.abort(er as Error))\n this[UNZIP].on('end', () => {\n this[ENDED] = true\n this[CONSUMECHUNK]()\n })\n this[WRITING] = true\n const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk)\n this[WRITING] = false\n cb?.()\n return ret\n }\n }\n\n this[WRITING] = true\n if (this[UNZIP]) {\n this[UNZIP].write(chunk)\n } else {\n this[CONSUMECHUNK](chunk)\n }\n this[WRITING] = false\n\n // return false if there's a queue, or if the current entry isn't flowing\n const ret =\n this[QUEUE].length > 0 ? false\n : this[READENTRY] ? this[READENTRY].flowing\n : true\n\n // if we have no queue, then that means a clogged READENTRY\n if (!ret && this[QUEUE].length === 0) {\n this[READENTRY]?.once('drain', () => this.emit('drain'))\n }\n\n /* c8 ignore next */\n cb?.()\n return ret\n }\n\n [BUFFERCONCAT](c: Buffer) {\n if (c && !this[ABORTED]) {\n this[BUFFER] = this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c\n }\n }\n\n [MAYBEEND]() {\n if (\n this[ENDED] &&\n !this[EMITTEDEND] &&\n !this[ABORTED] &&\n !this[CONSUMING]\n ) {\n this[EMITTEDEND] = true\n const entry = this[WRITEENTRY]\n if (entry && entry.blockRemain) {\n // truncated, likely a damaged file\n const have = this[BUFFER] ? this[BUFFER].length : 0\n this.warn(\n 'TAR_BAD_ARCHIVE',\n `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`,\n { entry },\n )\n if (this[BUFFER]) {\n entry.write(this[BUFFER])\n }\n entry.end()\n }\n this[EMIT](DONE)\n }\n }\n\n [CONSUMECHUNK](chunk?: Buffer) {\n if (this[CONSUMING] && chunk) {\n this[BUFFERCONCAT](chunk)\n } else if (!chunk && !this[BUFFER]) {\n this[MAYBEEND]()\n } else if (chunk) {\n this[CONSUMING] = true\n if (this[BUFFER]) {\n this[BUFFERCONCAT](chunk)\n const c = this[BUFFER]\n this[BUFFER] = undefined\n this[CONSUMECHUNKSUB](c)\n } else {\n this[CONSUMECHUNKSUB](chunk)\n }\n\n while (\n this[BUFFER] &&\n (this[BUFFER] as Buffer)?.length >= 512 &&\n !this[ABORTED] &&\n !this[SAW_EOF]\n ) {\n const c = this[BUFFER]\n this[BUFFER] = undefined\n this[CONSUMECHUNKSUB](c)\n }\n this[CONSUMING] = false\n }\n\n if (!this[BUFFER] || this[ENDED]) {\n this[MAYBEEND]()\n }\n }\n\n [CONSUMECHUNKSUB](chunk: Buffer) {\n // we know that we are in CONSUMING mode, so anything written goes into\n // the buffer. Advance the position and put any remainder in the buffer.\n let position = 0\n const length = chunk.length\n while (position + 512 <= length && !this[ABORTED] && !this[SAW_EOF]) {\n switch (this[STATE]) {\n case 'begin':\n case 'header':\n this[CONSUMEHEADER](chunk, position)\n position += 512\n break\n\n case 'ignore':\n case 'body':\n position += this[CONSUMEBODY](chunk, position)\n break\n\n case 'meta':\n position += this[CONSUMEMETA](chunk, position)\n break\n\n /* c8 ignore start */\n default:\n throw new Error('invalid state: ' + this[STATE])\n /* c8 ignore stop */\n }\n }\n\n if (position < length) {\n this[BUFFER] =\n this[BUFFER] ?\n Buffer.concat([chunk.subarray(position), this[BUFFER]])\n : chunk.subarray(position)\n }\n }\n\n end(cb?: () => void): this\n end(data: string | Buffer, cb?: () => void): this\n end(str: string, encoding?: BufferEncoding, cb?: () => void): this\n end(\n chunk?: string | Buffer | (() => void),\n encoding?: BufferEncoding | (() => void),\n cb?: () => void,\n ) {\n if (typeof chunk === 'function') {\n cb = chunk\n encoding = undefined\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding)\n }\n if (cb) this.once('finish', cb)\n if (!this[ABORTED]) {\n if (this[UNZIP]) {\n /* c8 ignore start */\n if (chunk) this[UNZIP].write(chunk)\n /* c8 ignore stop */\n this[UNZIP].end()\n } else {\n this[ENDED] = true\n if (this.brotli === undefined || this.zstd === undefined)\n chunk = chunk || Buffer.alloc(0)\n if (chunk) this.write(chunk)\n this[MAYBEEND]()\n }\n }\n return this\n }\n}\n","import assert from 'assert'\nimport { Buffer } from 'buffer'\nimport { Minipass } from 'minipass'\nimport * as realZlib from 'zlib'\nimport { constants } from './constants.js'\nexport { constants } from './constants.js'\n\nconst OriginalBufferConcat = Buffer.concat\nconst desc = Object.getOwnPropertyDescriptor(Buffer, 'concat')\nconst noop = (args: Buffer[]) => args as unknown as Buffer\nconst passthroughBufferConcat =\n desc?.writable === true || desc?.set !== undefined\n ? (makeNoOp: boolean) => {\n Buffer.concat = makeNoOp ? noop : OriginalBufferConcat\n }\n : (_: boolean) => {}\n\nconst _superWrite = Symbol('_superWrite')\n\nexport class ZlibError extends Error {\n code?: string\n errno?: number\n constructor(err: NodeJS.ErrnoException | Error, origin?: Function) {\n super('zlib: ' + err.message, { cause: err })\n this.code = (err as NodeJS.ErrnoException).code\n this.errno = (err as NodeJS.ErrnoException).errno\n /* c8 ignore next */\n if (!this.code) this.code = 'ZLIB_ERROR'\n\n this.message = 'zlib: ' + err.message\n Error.captureStackTrace(this, origin ?? this.constructor)\n }\n\n get name() {\n return 'ZlibError'\n }\n}\n\n// the Zlib class they all inherit from\n// This thing manages the queue of requests, and returns\n// true or false if there is anything in the queue when\n// you call the .write() method.\nconst _flushFlag = Symbol('flushFlag')\n\nexport type ChunkWithFlushFlag = Minipass.ContiguousData & {\n [_flushFlag]?: number\n}\n\nexport type ZlibBaseOptions = Minipass.Options<Minipass.ContiguousData> & {\n flush?: number\n finishFlush?: number\n fullFlushFlag?: number\n}\n\nexport type ZlibHandle =\n | realZlib.Gzip\n | realZlib.Gunzip\n | realZlib.Deflate\n | realZlib.Inflate\n | realZlib.DeflateRaw\n | realZlib.InflateRaw\n | realZlib.BrotliCompress\n | realZlib.BrotliDecompress\n | realZlib.ZstdCompress\n | realZlib.ZstdDecompress\nexport type ZlibMode =\n | 'Gzip'\n | 'Gunzip'\n | 'Deflate'\n | 'Inflate'\n | 'DeflateRaw'\n | 'InflateRaw'\n | 'Unzip'\nexport type BrotliMode = 'BrotliCompress' | 'BrotliDecompress'\nexport type ZstdMode = 'ZstdCompress' | 'ZstdDecompress'\n\nabstract class ZlibBase extends Minipass<Buffer, ChunkWithFlushFlag> {\n #sawError: boolean = false\n #ended: boolean = false\n #flushFlag: number\n #finishFlushFlag: number\n #fullFlushFlag: number\n #handle?: ZlibHandle\n #onError: (err: ZlibError) => any\n\n get sawError() {\n return this.#sawError\n }\n get handle() {\n return this.#handle\n }\n /* c8 ignore start */\n get flushFlag() {\n return this.#flushFlag\n }\n /* c8 ignore stop */\n\n constructor(opts: ZlibBaseOptions, mode: ZlibMode | BrotliMode | ZstdMode) {\n if (!opts || typeof opts !== 'object')\n throw new TypeError('invalid options for ZlibBase constructor')\n\n //@ts-ignore\n super(opts)\n\n /* c8 ignore start */\n this.#flushFlag = opts.flush ?? 0\n this.#finishFlushFlag = opts.finishFlush ?? 0\n this.#fullFlushFlag = opts.fullFlushFlag ?? 0\n /* c8 ignore stop */\n\n //@ts-ignore\n if (typeof realZlib[mode] !== 'function') {\n throw new TypeError('Compression method not supported: ' + mode)\n }\n\n // this will throw if any options are invalid for the class selected\n try {\n // @types/node doesn't know that it exports the classes, but they're there\n //@ts-ignore\n this.#handle = new realZlib[mode](opts)\n } catch (er) {\n // make sure that all errors get decorated properly\n throw new ZlibError(er as NodeJS.ErrnoException, this.constructor)\n }\n\n this.#onError = err => {\n // no sense raising multiple errors, since we abort on the first one.\n if (this.#sawError) return\n\n this.#sawError = true\n\n // there is no way to cleanly recover.\n // continuing only obscures problems.\n this.close()\n this.emit('error', err)\n }\n\n this.#handle?.on('error', er => this.#onError(new ZlibError(er)))\n this.once('end', () => this.close)\n }\n\n close() {\n if (this.#handle) {\n this.#handle.close()\n this.#handle = undefined\n this.emit('close')\n }\n }\n\n reset() {\n if (!this.#sawError) {\n assert(this.#handle, 'zlib binding closed')\n //@ts-ignore\n return this.#handle.reset?.()\n }\n }\n\n flush(flushFlag?: number) {\n if (this.ended) return\n\n if (typeof flushFlag !== 'number') flushFlag = this.#fullFlushFlag\n\n this.write(Object.assign(Buffer.alloc(0), { [_flushFlag]: flushFlag }))\n }\n\n end(cb?: () => void): this\n end(chunk: ChunkWithFlushFlag, cb?: () => void): this\n end(\n chunk: ChunkWithFlushFlag,\n encoding?: Minipass.Encoding,\n cb?: () => void,\n ): this\n end(\n chunk?: ChunkWithFlushFlag | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void,\n ) {\n /* c8 ignore start */\n if (typeof chunk === 'function') {\n cb = chunk\n encoding = undefined\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n /* c8 ignore stop */\n if (chunk) {\n if (encoding) this.write(chunk, encoding)\n else this.write(chunk)\n }\n this.flush(this.#finishFlushFlag)\n this.#ended = true\n return super.end(cb)\n }\n\n get ended() {\n return this.#ended\n }\n\n // overridden in the gzip classes to do portable writes\n [_superWrite](data: Buffer & { [_flushFlag]?: number }) {\n return super.write(data)\n }\n\n write(chunk: ChunkWithFlushFlag, cb?: () => void): boolean\n write(\n chunk: ChunkWithFlushFlag,\n encoding?: Minipass.Encoding,\n cb?: () => void,\n ): boolean\n write(\n chunk: ChunkWithFlushFlag,\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void,\n ) {\n // process the chunk using the sync process\n // then super.write() all the outputted chunks\n if (typeof encoding === 'function')\n (cb = encoding), (encoding = 'utf8')\n\n if (typeof chunk === 'string')\n chunk = Buffer.from(chunk as string, encoding as BufferEncoding)\n\n if (this.#sawError) return\n assert(this.#handle, 'zlib binding closed')\n\n // _processChunk tries to .close() the native handle after it's done, so we\n // intercept that by temporarily making it a no-op.\n // diving into the node:zlib internals a bit here\n const nativeHandle = (this.#handle as unknown as { _handle: any })\n ._handle\n const originalNativeClose = nativeHandle.close\n nativeHandle.close = () => {}\n const originalClose = this.#handle.close\n this.#handle.close = () => {}\n // It also calls `Buffer.concat()` at the end, which may be convenient\n // for some, but which we are not interested in as it slows us down.\n passthroughBufferConcat(true)\n let result: undefined | Buffer | Buffer[] = undefined\n try {\n const flushFlag =\n typeof chunk[_flushFlag] === 'number'\n ? chunk[_flushFlag]\n : this.#flushFlag\n result = (\n this.#handle as unknown as {\n _processChunk: (chunk: Buffer, flushFlag: number) => Buffer[]\n }\n )._processChunk(chunk as Buffer, flushFlag)\n // if we don't throw, reset it back how it was\n passthroughBufferConcat(false)\n } catch (err) {\n // or if we do, put Buffer.concat() back before we emit error\n // Error events call into user code, which may call Buffer.concat()\n passthroughBufferConcat(false)\n this.#onError(new ZlibError(err as NodeJS.ErrnoException, this.write))\n } finally {\n if (this.#handle) {\n // Core zlib resets `_handle` to null after attempting to close the\n // native handle. Our no-op handler prevented actual closure, but we\n // need to restore the `._handle` property.\n ;(this.#handle as unknown as { _handle: any })._handle =\n nativeHandle\n nativeHandle.close = originalNativeClose\n this.#handle.close = originalClose\n // `_processChunk()` adds an 'error' listener. If we don't remove it\n // after each call, these handlers start piling up.\n this.#handle.removeAllListeners('error')\n // make sure OUR error listener is still attached tho\n }\n }\n\n if (this.#handle)\n this.#handle.on('error', er => this.#onError(new ZlibError(er, this.write)))\n\n let writeReturn\n if (result) {\n if (Array.isArray(result) && result.length > 0) {\n const r = result[0]\n // The first buffer is always `handle._outBuffer`, which would be\n // re-used for later invocations; so, we always have to copy that one.\n writeReturn = this[_superWrite](Buffer.from(r as Buffer))\n for (let i = 1; i < result.length; i++) {\n writeReturn = this[_superWrite](result[i] as Buffer)\n }\n } else {\n // either a single Buffer or an empty array\n writeReturn = this[_superWrite](Buffer.from(result as Buffer | []))\n }\n }\n\n if (cb) cb()\n return writeReturn\n }\n}\n\nexport type ZlibOptions = ZlibBaseOptions & {\n level?: number\n strategy?: number\n}\n\nexport class Zlib extends ZlibBase {\n #level?: number\n #strategy?: number\n\n constructor(opts: ZlibOptions, mode: ZlibMode) {\n opts = opts || {}\n\n opts.flush = opts.flush || constants.Z_NO_FLUSH\n opts.finishFlush = opts.finishFlush || constants.Z_FINISH\n opts.fullFlushFlag = constants.Z_FULL_FLUSH\n super(opts, mode)\n\n this.#level = opts.level\n this.#strategy = opts.strategy\n }\n\n params(level: number, strategy: number) {\n if (this.sawError) return\n\n if (!this.handle)\n throw new Error('cannot switch params when binding is closed')\n\n // no way to test this without also not supporting params at all\n /* c8 ignore start */\n if (!(this.handle as { params?: any }).params)\n throw new Error('not supported in this implementation')\n /* c8 ignore stop */\n\n if (this.#level !== level || this.#strategy !== strategy) {\n this.flush(constants.Z_SYNC_FLUSH)\n assert(this.handle, 'zlib binding closed')\n // .params() calls .flush(), but the latter is always async in the\n // core zlib. We override .flush() temporarily to intercept that and\n // flush synchronously.\n const origFlush = this.handle.flush\n this.handle.flush = (\n flushFlag?: (() => void) | number,\n cb?: () => void,\n ) => {\n /* c8 ignore start */\n if (typeof flushFlag === 'function') {\n cb = flushFlag\n flushFlag = this.flushFlag\n }\n /* c8 ignore stop */\n this.flush(flushFlag)\n cb?.()\n }\n try {\n ;(\n this.handle as unknown as {\n params: (level?: number, strategy?: number) => void\n }\n ).params(level, strategy)\n } finally {\n this.handle.flush = origFlush\n }\n /* c8 ignore start */\n if (this.handle) {\n this.#level = level\n this.#strategy = strategy\n }\n /* c8 ignore stop */\n }\n }\n}\n\n// minimal 2-byte header\nexport class Deflate extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Deflate')\n }\n}\n\nexport class Inflate extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Inflate')\n }\n}\n\n// gzip - bigger header, same deflate compression\nexport type GzipOptions = ZlibOptions & { portable?: boolean }\nexport class Gzip extends Zlib {\n #portable: boolean\n constructor(opts: GzipOptions) {\n super(opts, 'Gzip')\n this.#portable = opts && !!opts.portable\n }\n\n [_superWrite](data: Buffer & { [_flushFlag]?: number }) {\n if (!this.#portable) return super[_superWrite](data)\n\n // we'll always get the header emitted in one first chunk\n // overwrite the OS indicator byte with 0xFF\n this.#portable = false\n data[9] = 255\n return super[_superWrite](data)\n }\n}\n\nexport class Gunzip extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Gunzip')\n }\n}\n\n// raw - no header\nexport class DeflateRaw extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'DeflateRaw')\n }\n}\n\nexport class InflateRaw extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'InflateRaw')\n }\n}\n\n// auto-detect header.\nexport class Unzip extends Zlib {\n constructor(opts: ZlibOptions) {\n super(opts, 'Unzip')\n }\n}\n\nclass Brotli extends ZlibBase {\n constructor(opts: ZlibOptions, mode: BrotliMode) {\n opts = opts || {}\n\n opts.flush = opts.flush || constants.BROTLI_OPERATION_PROCESS\n opts.finishFlush =\n opts.finishFlush || constants.BROTLI_OPERATION_FINISH\n opts.fullFlushFlag = constants.BROTLI_OPERATION_FLUSH\n super(opts, mode)\n }\n}\n\nexport class BrotliCompress extends Brotli {\n constructor(opts: ZlibOptions) {\n super(opts, 'BrotliCompress')\n }\n}\n\nexport class BrotliDecompress extends Brotli {\n constructor(opts: ZlibOptions) {\n super(opts, 'BrotliDecompress')\n }\n}\n\nclass Zstd extends ZlibBase {\n constructor(opts: ZlibOptions, mode: ZstdMode) {\n opts = opts || {}\n\n opts.flush = opts.flush || constants.ZSTD_e_continue\n opts.finishFlush = opts.finishFlush || constants.ZSTD_e_end\n opts.fullFlushFlag = constants.ZSTD_e_flush\n super(opts, mode)\n }\n}\n\nexport class ZstdCompress extends Zstd {\n constructor(opts: ZlibOptions) {\n super(opts, 'ZstdCompress')\n }\n}\n\nexport class ZstdDecompress extends Zstd {\n constructor(opts: ZlibOptions) {\n super(opts, 'ZstdDecompress')\n }\n}\n","// Update with any zlib constants that are added or changed in the future.\n// Node v6 didn't export this, so we just hard code the version and rely\n// on all the other hard-coded values from zlib v4736. When node v6\n// support drops, we can just export the realZlibConstants object.\nimport realZlib from 'zlib'\n/* c8 ignore start */\nconst realZlibConstants = realZlib.constants || { ZLIB_VERNUM: 4736 }\n/* c8 ignore stop */\n\nexport const constants = Object.freeze(\n Object.assign(\n Object.create(null),\n {\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n Z_VERSION_ERROR: -6,\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n DEFLATE: 1,\n INFLATE: 2,\n GZIP: 3,\n GUNZIP: 4,\n DEFLATERAW: 5,\n INFLATERAW: 6,\n UNZIP: 7,\n BROTLI_DECODE: 8,\n BROTLI_ENCODE: 9,\n Z_MIN_WINDOWBITS: 8,\n Z_MAX_WINDOWBITS: 15,\n Z_DEFAULT_WINDOWBITS: 15,\n Z_MIN_CHUNK: 64,\n Z_MAX_CHUNK: Infinity,\n Z_DEFAULT_CHUNK: 16384,\n Z_MIN_MEMLEVEL: 1,\n Z_MAX_MEMLEVEL: 9,\n Z_DEFAULT_MEMLEVEL: 8,\n Z_MIN_LEVEL: -1,\n Z_MAX_LEVEL: 9,\n Z_DEFAULT_LEVEL: -1,\n BROTLI_OPERATION_PROCESS: 0,\n BROTLI_OPERATION_FLUSH: 1,\n BROTLI_OPERATION_FINISH: 2,\n BROTLI_OPERATION_EMIT_METADATA: 3,\n BROTLI_MODE_GENERIC: 0,\n BROTLI_MODE_TEXT: 1,\n BROTLI_MODE_FONT: 2,\n BROTLI_DEFAULT_MODE: 0,\n BROTLI_MIN_QUALITY: 0,\n BROTLI_MAX_QUALITY: 11,\n BROTLI_DEFAULT_QUALITY: 11,\n BROTLI_MIN_WINDOW_BITS: 10,\n BROTLI_MAX_WINDOW_BITS: 24,\n BROTLI_LARGE_MAX_WINDOW_BITS: 30,\n BROTLI_DEFAULT_WINDOW: 22,\n BROTLI_MIN_INPUT_BLOCK_BITS: 16,\n BROTLI_MAX_INPUT_BLOCK_BITS: 24,\n BROTLI_PARAM_MODE: 0,\n BROTLI_PARAM_QUALITY: 1,\n BROTLI_PARAM_LGWIN: 2,\n BROTLI_PARAM_LGBLOCK: 3,\n BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: 4,\n BROTLI_PARAM_SIZE_HINT: 5,\n BROTLI_PARAM_LARGE_WINDOW: 6,\n BROTLI_PARAM_NPOSTFIX: 7,\n BROTLI_PARAM_NDIRECT: 8,\n BROTLI_DECODER_RESULT_ERROR: 0,\n BROTLI_DECODER_RESULT_SUCCESS: 1,\n BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: 2,\n BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: 3,\n BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: 0,\n BROTLI_DECODER_PARAM_LARGE_WINDOW: 1,\n BROTLI_DECODER_NO_ERROR: 0,\n BROTLI_DECODER_SUCCESS: 1,\n BROTLI_DECODER_NEEDS_MORE_INPUT: 2,\n BROTLI_DECODER_NEEDS_MORE_OUTPUT: 3,\n BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: -1,\n BROTLI_DECODER_ERROR_FORMAT_RESERVED: -2,\n BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: -3,\n BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: -4,\n BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: -5,\n BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: -6,\n BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: -7,\n BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: -8,\n BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: -9,\n BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: -10,\n BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: -11,\n BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: -12,\n BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: -13,\n BROTLI_DECODER_ERROR_FORMAT_PADDING_1: -14,\n BROTLI_DECODER_ERROR_FORMAT_PADDING_2: -15,\n BROTLI_DECODER_ERROR_FORMAT_DISTANCE: -16,\n BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: -19,\n BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: -20,\n BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: -21,\n BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: -22,\n BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: -25,\n BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: -26,\n BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: -27,\n BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: -30,\n BROTLI_DECODER_ERROR_UNREACHABLE: -31,\n },\n realZlibConstants,\n ),\n)\n","// parse a 512-byte header block to a data object, or vice-versa\n// encode returns `true` if a pax extended header is needed, because\n// the data could not be faithfully encoded in a simple header.\n// (Also, check header.needPax to see if it needs a pax header.)\n\nimport { posix as pathModule } from 'node:path'\nimport * as large from './large-numbers.js'\nimport type { EntryTypeCode, EntryTypeName } from './types.js'\nimport * as types from './types.js'\n\nexport type HeaderData = {\n path?: string\n mode?: number\n uid?: number\n gid?: number\n size?: number\n cksum?: number\n type?: EntryTypeName | 'Unsupported'\n linkpath?: string\n uname?: string\n gname?: string\n devmaj?: number\n devmin?: number\n atime?: Date\n ctime?: Date\n mtime?: Date\n\n // fields that are common in extended PAX headers, but not in the\n // \"standard\" tar header block\n charset?: string\n comment?: string\n dev?: number\n ino?: number\n nlink?: number\n}\n\nexport class Header implements HeaderData {\n cksumValid: boolean = false\n needPax: boolean = false\n nullBlock: boolean = false\n\n block?: Buffer\n path?: string\n mode?: number\n uid?: number\n gid?: number\n size?: number\n cksum?: number\n #type: EntryTypeCode | 'Unsupported' = 'Unsupported'\n linkpath?: string\n uname?: string\n gname?: string\n devmaj: number = 0\n devmin: number = 0\n atime?: Date\n ctime?: Date\n mtime?: Date\n\n charset?: string\n comment?: string\n\n constructor(\n data?: Buffer | HeaderData,\n off: number = 0,\n ex?: HeaderData,\n gex?: HeaderData,\n ) {\n if (Buffer.isBuffer(data)) {\n this.decode(data, off || 0, ex, gex)\n } else if (data) {\n this.#slurp(data)\n }\n }\n\n decode(buf: Buffer, off: number, ex?: HeaderData, gex?: HeaderData) {\n if (!off) {\n off = 0\n }\n\n if (!buf || !(buf.length >= off + 512)) {\n throw new Error('need 512 bytes for header')\n }\n\n this.path = ex?.path ?? decString(buf, off, 100)\n this.mode = ex?.mode ?? gex?.mode ?? decNumber(buf, off + 100, 8)\n this.uid = ex?.uid ?? gex?.uid ?? decNumber(buf, off + 108, 8)\n this.gid = ex?.gid ?? gex?.gid ?? decNumber(buf, off + 116, 8)\n this.size = ex?.size ?? gex?.size ?? decNumber(buf, off + 124, 12)\n this.mtime = ex?.mtime ?? gex?.mtime ?? decDate(buf, off + 136, 12)\n this.cksum = decNumber(buf, off + 148, 12)\n\n // if we have extended or global extended headers, apply them now\n // See https://github.com/npm/node-tar/pull/187\n // Apply global before local, so it overrides\n if (gex) this.#slurp(gex, true)\n if (ex) this.#slurp(ex)\n\n // old tar versions marked dirs as a file with a trailing /\n const t = decString(buf, off + 156, 1)\n if (types.isCode(t)) {\n this.#type = t || '0'\n }\n if (this.#type === '0' && this.path.slice(-1) === '/') {\n this.#type = '5'\n }\n\n // tar implementations sometimes incorrectly put the stat(dir).size\n // as the size in the tarball, even though Directory entries are\n // not able to have any body at all. In the very rare chance that\n // it actually DOES have a body, we weren't going to do anything with\n // it anyway, and it'll just be a warning about an invalid header.\n if (this.#type === '5') {\n this.size = 0\n }\n\n this.linkpath = decString(buf, off + 157, 100)\n if (\n buf.subarray(off + 257, off + 265).toString() === 'ustar\\u000000'\n ) {\n /* c8 ignore start */\n this.uname = ex?.uname ?? gex?.uname ?? decString(buf, off + 265, 32)\n this.gname = ex?.gname ?? gex?.gname ?? decString(buf, off + 297, 32)\n this.devmaj =\n ex?.devmaj ?? gex?.devmaj ?? decNumber(buf, off + 329, 8) ?? 0\n this.devmin =\n ex?.devmin ?? gex?.devmin ?? decNumber(buf, off + 337, 8) ?? 0\n /* c8 ignore stop */\n if (buf[off + 475] !== 0) {\n // definitely a prefix, definitely >130 chars.\n const prefix = decString(buf, off + 345, 155)\n this.path = prefix + '/' + this.path\n } else {\n const prefix = decString(buf, off + 345, 130)\n if (prefix) {\n this.path = prefix + '/' + this.path\n }\n /* c8 ignore start */\n this.atime = ex?.atime ?? gex?.atime ?? decDate(buf, off + 476, 12)\n this.ctime = ex?.ctime ?? gex?.ctime ?? decDate(buf, off + 488, 12)\n /* c8 ignore stop */\n }\n }\n\n let sum = 8 * 0x20\n for (let i = off; i < off + 148; i++) {\n sum += buf[i] as number\n }\n\n for (let i = off + 156; i < off + 512; i++) {\n sum += buf[i] as number\n }\n\n this.cksumValid = sum === this.cksum\n if (this.cksum === undefined && sum === 8 * 0x20) {\n this.nullBlock = true\n }\n }\n\n #slurp(ex: HeaderData, gex: boolean = false) {\n Object.assign(\n this,\n Object.fromEntries(\n Object.entries(ex).filter(([k, v]) => {\n // we slurp in everything except for the path attribute in\n // a global extended header, because that's weird. Also, any\n // null/undefined values are ignored.\n return !(\n v === null ||\n v === undefined ||\n (k === 'path' && gex) ||\n (k === 'linkpath' && gex) ||\n k === 'global'\n )\n }),\n ),\n )\n }\n\n encode(buf?: Buffer, off: number = 0) {\n if (!buf) {\n buf = this.block = Buffer.alloc(512)\n }\n\n if (this.#type === 'Unsupported') {\n this.#type = '0'\n }\n\n if (!(buf.length >= off + 512)) {\n throw new Error('need 512 bytes for header')\n }\n\n const prefixSize = this.ctime || this.atime ? 130 : 155\n const split = splitPrefix(this.path || '', prefixSize)\n const path = split[0]\n const prefix = split[1]\n this.needPax = !!split[2]\n\n this.needPax = encString(buf, off, 100, path) || this.needPax\n this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax\n this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax\n this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax\n this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax\n this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax\n buf[off + 156] = Number(this.#type.codePointAt(0))\n this.needPax =\n encString(buf, off + 157, 100, this.linkpath) || this.needPax\n buf.write('ustar\\u000000', off + 257, 8)\n this.needPax =\n encString(buf, off + 265, 32, this.uname) || this.needPax\n this.needPax =\n encString(buf, off + 297, 32, this.gname) || this.needPax\n this.needPax =\n encNumber(buf, off + 329, 8, this.devmaj) || this.needPax\n this.needPax =\n encNumber(buf, off + 337, 8, this.devmin) || this.needPax\n this.needPax =\n encString(buf, off + 345, prefixSize, prefix) || this.needPax\n if (buf[off + 475] !== 0) {\n this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax\n } else {\n this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax\n this.needPax =\n encDate(buf, off + 476, 12, this.atime) || this.needPax\n this.needPax =\n encDate(buf, off + 488, 12, this.ctime) || this.needPax\n }\n\n let sum = 8 * 0x20\n for (let i = off; i < off + 148; i++) {\n sum += buf[i] as number\n }\n\n for (let i = off + 156; i < off + 512; i++) {\n sum += buf[i] as number\n }\n\n this.cksum = sum\n encNumber(buf, off + 148, 8, this.cksum)\n this.cksumValid = true\n\n return this.needPax\n }\n\n get type(): EntryTypeName {\n return (\n this.#type === 'Unsupported' ?\n this.#type\n : types.name.get(this.#type)) as EntryTypeName\n }\n\n get typeKey(): EntryTypeCode | 'Unsupported' {\n return this.#type\n }\n\n set type(type: EntryTypeCode | EntryTypeName | 'Unsupported') {\n const c = String(types.code.get(type as EntryTypeName))\n if (types.isCode(c) || c === 'Unsupported') {\n this.#type = c\n } else if (types.isCode(type)) {\n this.#type = type\n } else {\n throw new TypeError('invalid entry type: ' + type)\n }\n }\n}\n\nconst splitPrefix = (\n p: string,\n prefixSize: number,\n): [string, string, boolean] => {\n const pathSize = 100\n let pp = p\n let prefix = ''\n let ret: undefined | [string, string, boolean] = undefined\n const root = pathModule.parse(p).root || '.'\n\n if (Buffer.byteLength(pp) < pathSize) {\n ret = [pp, prefix, false]\n } else {\n // first set prefix to the dir, and path to the base\n prefix = pathModule.dirname(pp)\n pp = pathModule.basename(pp)\n\n do {\n if (\n Buffer.byteLength(pp) <= pathSize &&\n Buffer.byteLength(prefix) <= prefixSize\n ) {\n // both fit!\n ret = [pp, prefix, false]\n } else if (\n Buffer.byteLength(pp) > pathSize &&\n Buffer.byteLength(prefix) <= prefixSize\n ) {\n // prefix fits in prefix, but path doesn't fit in path\n ret = [pp.slice(0, pathSize - 1), prefix, true]\n } else {\n // make path take a bit from prefix\n pp = pathModule.join(pathModule.basename(prefix), pp)\n prefix = pathModule.dirname(prefix)\n }\n } while (prefix !== root && ret === undefined)\n\n // at this point, found no resolution, just truncate\n if (!ret) {\n ret = [p.slice(0, pathSize - 1), '', true]\n }\n }\n return ret\n}\n\nconst decString = (buf: Buffer, off: number, size: number) =>\n buf\n .subarray(off, off + size)\n .toString('utf8')\n .replace(/\\0.*/, '')\n\nconst decDate = (buf: Buffer, off: number, size: number) =>\n numToDate(decNumber(buf, off, size))\n\nconst numToDate = (num?: number) =>\n num === undefined ? undefined : new Date(num * 1000)\n\nconst decNumber = (buf: Buffer, off: number, size: number) =>\n Number(buf[off]) & 0x80 ?\n large.parse(buf.subarray(off, off + size))\n : decSmallNumber(buf, off, size)\n\nconst nanUndef = (value: number) => (isNaN(value) ? undefined : value)\n\nconst decSmallNumber = (buf: Buffer, off: number, size: number) =>\n nanUndef(\n parseInt(\n buf\n .subarray(off, off + size)\n .toString('utf8')\n .replace(/\\0.*$/, '')\n .trim(),\n 8,\n ),\n )\n\n// the maximum encodable as a null-terminated octal, by field size\nconst MAXNUM = {\n 12: 0o77777777777,\n 8: 0o7777777,\n}\n\nconst encNumber = (\n buf: Buffer,\n off: number,\n size: 12 | 8,\n num?: number,\n) =>\n num === undefined ? false\n : num > MAXNUM[size] || num < 0 ?\n (large.encode(num, buf.subarray(off, off + size)), true)\n : (encSmallNumber(buf, off, size, num), false)\n\nconst encSmallNumber = (\n buf: Buffer,\n off: number,\n size: number,\n num: number,\n) => buf.write(octalString(num, size), off, size, 'ascii')\n\nconst octalString = (num: number, size: number) =>\n padOctal(Math.floor(num).toString(8), size)\n\nconst padOctal = (str: string, size: number) =>\n (str.length === size - 1 ?\n str\n : new Array(size - str.length - 1).join('0') + str + ' ') + '\\0'\n\nconst encDate = (buf: Buffer, off: number, size: 8 | 12, date?: Date) =>\n date === undefined ? false : (\n encNumber(buf, off, size, date.getTime() / 1000)\n )\n\n// enough to fill the longest string we've got\nconst NULLS = new Array(156).join('\\0')\n// pad with nulls, return true if it's longer or non-ascii\nconst encString = (\n buf: Buffer,\n off: number,\n size: number,\n str?: string,\n) =>\n str === undefined ? false : (\n (buf.write(str + NULLS, off, size, 'utf8'),\n str.length !== Buffer.byteLength(str) || str.length > size)\n )\n","// Tar can encode large and negative numbers using a leading byte of\n// 0xff for negative, and 0x80 for positive.\n\nexport const encode = (num: number, buf: Buffer) => {\n if (!Number.isSafeInteger(num)) {\n // The number is so large that javascript cannot represent it with integer\n // precision.\n throw Error(\n 'cannot encode number outside of javascript safe integer range',\n )\n } else if (num < 0) {\n encodeNegative(num, buf)\n } else {\n encodePositive(num, buf)\n }\n return buf\n}\n\nconst encodePositive = (num: number, buf: Buffer) => {\n buf[0] = 0x80\n\n for (var i = buf.length; i > 1; i--) {\n buf[i - 1] = num & 0xff\n num = Math.floor(num / 0x100)\n }\n}\n\nconst encodeNegative = (num: number, buf: Buffer) => {\n buf[0] = 0xff\n var flipped = false\n num = num * -1\n for (var i = buf.length; i > 1; i--) {\n var byte = num & 0xff\n num = Math.floor(num / 0x100)\n if (flipped) {\n buf[i - 1] = onesComp(byte)\n } else if (byte === 0) {\n buf[i - 1] = 0\n } else {\n flipped = true\n buf[i - 1] = twosComp(byte)\n }\n }\n}\n\nexport const parse = (buf: Buffer) => {\n const pre = buf[0]\n const value =\n pre === 0x80 ? pos(buf.subarray(1, buf.length))\n : pre === 0xff ? twos(buf)\n : null\n if (value === null) {\n throw Error('invalid base256 encoding')\n }\n\n if (!Number.isSafeInteger(value)) {\n // The number is so large that javascript cannot represent it with integer\n // precision.\n throw Error('parsed number outside of javascript safe integer range')\n }\n\n return value\n}\n\nconst twos = (buf: Buffer) => {\n var len = buf.length\n var sum = 0\n var flipped = false\n for (var i = len - 1; i > -1; i--) {\n var byte = Number(buf[i])\n var f\n if (flipped) {\n f = onesComp(byte)\n } else if (byte === 0) {\n f = byte\n } else {\n flipped = true\n f = twosComp(byte)\n }\n if (f !== 0) {\n sum -= f * Math.pow(256, len - i - 1)\n }\n }\n return sum\n}\n\nconst pos = (buf: Buffer) => {\n var len = buf.length\n var sum = 0\n for (var i = len - 1; i > -1; i--) {\n var byte = Number(buf[i])\n if (byte !== 0) {\n sum += byte * Math.pow(256, len - i - 1)\n }\n }\n return sum\n}\n\nconst onesComp = (byte: number) => (0xff ^ byte) & 0xff\n\nconst twosComp = (byte: number) => ((0xff ^ byte) + 1) & 0xff\n","export const isCode = (c: string): c is EntryTypeCode =>\n name.has(c as EntryTypeCode)\n\nexport const isName = (c: string): c is EntryTypeName =>\n code.has(c as EntryTypeName)\n\nexport type EntryTypeCode =\n | '0'\n | ''\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | 'g'\n | 'x'\n | 'A'\n | 'D'\n | 'I'\n | 'K'\n | 'L'\n | 'M'\n | 'N'\n | 'S'\n | 'V'\n | 'X'\n\nexport type EntryTypeName =\n | 'File'\n | 'OldFile'\n | 'Link'\n | 'SymbolicLink'\n | 'CharacterDevice'\n | 'BlockDevice'\n | 'Directory'\n | 'FIFO'\n | 'ContiguousFile'\n | 'GlobalExtendedHeader'\n | 'ExtendedHeader'\n | 'SolarisACL'\n | 'GNUDumpDir'\n | 'Inode'\n | 'NextFileHasLongLinkpath'\n | 'NextFileHasLongPath'\n | 'ContinuationFile'\n | 'OldGnuLongPath'\n | 'SparseFile'\n | 'TapeVolumeHeader'\n | 'OldExtendedHeader'\n | 'Unsupported'\n\n// map types from key to human-friendly name\nexport const name = new Map<EntryTypeCode, EntryTypeName>([\n ['0', 'File'],\n // same as File\n ['', 'OldFile'],\n ['1', 'Link'],\n ['2', 'SymbolicLink'],\n // Devices and FIFOs aren't fully supported\n // they are parsed, but skipped when unpacking\n ['3', 'CharacterDevice'],\n ['4', 'BlockDevice'],\n ['5', 'Directory'],\n ['6', 'FIFO'],\n // same as File\n ['7', 'ContiguousFile'],\n // pax headers\n ['g', 'GlobalExtendedHeader'],\n ['x', 'ExtendedHeader'],\n // vendor-specific stuff\n // skip\n ['A', 'SolarisACL'],\n // like 5, but with data, which should be skipped\n ['D', 'GNUDumpDir'],\n // metadata only, skip\n ['I', 'Inode'],\n // data = link path of next file\n ['K', 'NextFileHasLongLinkpath'],\n // data = path of next file\n ['L', 'NextFileHasLongPath'],\n // skip\n ['M', 'ContinuationFile'],\n // like L\n ['N', 'OldGnuLongPath'],\n // skip\n ['S', 'SparseFile'],\n // skip\n ['V', 'TapeVolumeHeader'],\n // like x\n ['X', 'OldExtendedHeader'],\n])\n\n// map the other direction\nexport const code = new Map<EntryTypeName, EntryTypeCode>(\n Array.from(name).map(kv => [kv[1], kv[0]]),\n)\n","import { basename } from 'node:path'\nimport type { HeaderData } from './header.js'\nimport { Header } from './header.js'\n\nexport class Pax implements HeaderData {\n atime?: Date\n mtime?: Date\n ctime?: Date\n\n charset?: string\n comment?: string\n\n gid?: number\n uid?: number\n\n gname?: string\n uname?: string\n linkpath?: string\n dev?: number\n ino?: number\n nlink?: number\n path?: string\n size?: number\n mode?: number\n\n global: boolean\n\n constructor(obj: HeaderData, global: boolean = false) {\n this.atime = obj.atime\n this.charset = obj.charset\n this.comment = obj.comment\n this.ctime = obj.ctime\n this.dev = obj.dev\n this.gid = obj.gid\n this.global = global\n this.gname = obj.gname\n this.ino = obj.ino\n this.linkpath = obj.linkpath\n this.mtime = obj.mtime\n this.nlink = obj.nlink\n this.path = obj.path\n this.size = obj.size\n this.uid = obj.uid\n this.uname = obj.uname\n }\n\n encode() {\n const body = this.encodeBody()\n if (body === '') {\n return Buffer.allocUnsafe(0)\n }\n\n const bodyLen = Buffer.byteLength(body)\n // round up to 512 bytes\n // add 512 for header\n const bufLen = 512 * Math.ceil(1 + bodyLen / 512)\n const buf = Buffer.allocUnsafe(bufLen)\n\n // 0-fill the header section, it might not hit every field\n for (let i = 0; i < 512; i++) {\n buf[i] = 0\n }\n\n new Header({\n // XXX split the path\n // then the path should be PaxHeader + basename, but less than 99,\n // prepend with the dirname\n /* c8 ignore start */\n path: ('PaxHeader/' + basename(this.path ?? '')).slice(0, 99),\n /* c8 ignore stop */\n mode: this.mode || 0o644,\n uid: this.uid,\n gid: this.gid,\n size: bodyLen,\n mtime: this.mtime,\n type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader',\n linkpath: '',\n uname: this.uname || '',\n gname: this.gname || '',\n devmaj: 0,\n devmin: 0,\n atime: this.atime,\n ctime: this.ctime,\n }).encode(buf)\n\n buf.write(body, 512, bodyLen, 'utf8')\n\n // null pad after the body\n for (let i = bodyLen + 512; i < buf.length; i++) {\n buf[i] = 0\n }\n\n return buf\n }\n\n encodeBody() {\n return (\n this.encodeField('path') +\n this.encodeField('ctime') +\n this.encodeField('atime') +\n this.encodeField('dev') +\n this.encodeField('ino') +\n this.encodeField('nlink') +\n this.encodeField('charset') +\n this.encodeField('comment') +\n this.encodeField('gid') +\n this.encodeField('gname') +\n this.encodeField('linkpath') +\n this.encodeField('mtime') +\n this.encodeField('size') +\n this.encodeField('uid') +\n this.encodeField('uname')\n )\n }\n\n encodeField(field: keyof Pax): string {\n if (this[field] === undefined) {\n return ''\n }\n const r = this[field]\n const v = r instanceof Date ? r.getTime() / 1000 : r\n const s =\n ' ' +\n (field === 'dev' || field === 'ino' || field === 'nlink' ?\n 'SCHILY.'\n : '') +\n field +\n '=' +\n v +\n '\\n'\n const byteLen = Buffer.byteLength(s)\n // the digits includes the length of the digits in ascii base-10\n // so if it's 9 characters, then adding 1 for the 9 makes it 10\n // which makes it 11 chars.\n let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1\n if (byteLen + digits >= Math.pow(10, digits)) {\n digits += 1\n }\n const len = digits + byteLen\n return len + s\n }\n\n static parse(str: string, ex?: HeaderData, g: boolean = false) {\n return new Pax(merge(parseKV(str), ex), g)\n }\n}\n\nconst merge = (a: HeaderData, b?: HeaderData) =>\n b ? Object.assign({}, b, a) : a\n\nconst parseKV = (str: string) =>\n str\n .replace(/\\n$/, '')\n .split('\\n')\n .reduce(parseKVLine, Object.create(null))\n\nconst parseKVLine = (set: Record<string, unknown>, line: string) => {\n const n = parseInt(line, 10)\n\n // XXX Values with \\n in them will fail this.\n // Refactor to not be a naive line-by-line parse.\n if (n !== Buffer.byteLength(line) + 1) {\n return set\n }\n\n line = line.slice((n + ' ').length)\n const kv = line.split('=')\n const r = kv.shift()\n\n if (!r) {\n return set\n }\n\n const k = r.replace(/^SCHILY\\.(dev|ino|nlink)/, '$1')\n\n const v = kv.join('=')\n set[k] =\n /^([A-Z]+\\.)?([mac]|birth|creation)time$/.test(k) ?\n new Date(Number(v) * 1000)\n : /^[0-9]+$/.test(v) ? +v\n : v\n return set\n}\n","// on windows, either \\ or / are valid directory separators.\n// on unix, \\ is a valid character in filenames.\n// so, on windows, and only on windows, we replace all \\ chars with /,\n// so that we can use / as our one and only directory separator char.\n\nconst platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform\n\nexport const normalizeWindowsPath =\n platform !== 'win32' ?\n (p: string) => p\n : (p: string) => p && p.replaceAll(/\\\\/g, '/')\n","import { Minipass } from 'minipass'\nimport type { Header } from './header.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport type { Pax } from './pax.js'\nimport type { EntryTypeName } from './types.js'\n\nexport class ReadEntry extends Minipass<Buffer, Buffer> {\n extended?: Pax\n globalExtended?: Pax\n header: Header\n startBlockSize: number\n blockRemain: number\n remain: number\n type: EntryTypeName\n meta: boolean = false\n ignore: boolean = false\n path: string\n mode?: number\n uid?: number\n gid?: number\n uname?: string\n gname?: string\n size: number = 0\n mtime?: Date\n atime?: Date\n ctime?: Date\n linkpath?: string\n\n dev?: number\n ino?: number\n nlink?: number\n invalid: boolean = false\n absolute?: string\n unsupported: boolean = false\n\n constructor(header: Header, ex?: Pax, gex?: Pax) {\n super({})\n // read entries always start life paused. this is to avoid the\n // situation where Minipass's auto-ending empty streams results\n // in an entry ending before we're ready for it.\n this.pause()\n this.extended = ex\n this.globalExtended = gex\n this.header = header\n /* c8 ignore start */\n this.remain = header.size ?? 0\n /* c8 ignore stop */\n this.startBlockSize = 512 * Math.ceil(this.remain / 512)\n this.blockRemain = this.startBlockSize\n this.type = header.type\n switch (this.type) {\n case 'File':\n case 'OldFile':\n case 'Link':\n case 'SymbolicLink':\n case 'CharacterDevice':\n case 'BlockDevice':\n case 'Directory':\n case 'FIFO':\n case 'ContiguousFile':\n case 'GNUDumpDir':\n break\n\n case 'NextFileHasLongLinkpath':\n case 'NextFileHasLongPath':\n case 'OldGnuLongPath':\n case 'GlobalExtendedHeader':\n case 'ExtendedHeader':\n case 'OldExtendedHeader':\n this.meta = true\n break\n\n // NOTE: gnutar and bsdtar treat unrecognized types as 'File'\n // it may be worth doing the same, but with a warning.\n default:\n this.ignore = true\n }\n\n /* c8 ignore start */\n if (!header.path) {\n throw new Error('no path provided for tar.ReadEntry')\n }\n /* c8 ignore stop */\n\n this.path = normalizeWindowsPath(header.path) as string\n this.mode = header.mode\n if (this.mode) {\n this.mode = this.mode & 0o7777\n }\n this.uid = header.uid\n this.gid = header.gid\n this.uname = header.uname\n this.gname = header.gname\n this.size = this.remain\n this.mtime = header.mtime\n this.atime = header.atime\n this.ctime = header.ctime\n /* c8 ignore start */\n this.linkpath =\n header.linkpath ? normalizeWindowsPath(header.linkpath) : undefined\n /* c8 ignore stop */\n this.uname = header.uname\n this.gname = header.gname\n\n if (ex) {\n this.#slurp(ex)\n }\n if (gex) {\n this.#slurp(gex, true)\n }\n }\n\n write(data: Buffer) {\n const writeLen = data.length\n if (writeLen > this.blockRemain) {\n throw new Error('writing more to entry than is appropriate')\n }\n\n const r = this.remain\n const br = this.blockRemain\n this.remain = Math.max(0, r - writeLen)\n this.blockRemain = Math.max(0, br - writeLen)\n if (this.ignore) {\n return true\n }\n\n if (r >= writeLen) {\n return super.write(data)\n }\n\n // r < writeLen\n return super.write(data.subarray(0, r))\n }\n\n #slurp(ex: Pax, gex: boolean = false) {\n if (ex.path) ex.path = normalizeWindowsPath(ex.path)\n if (ex.linkpath) ex.linkpath = normalizeWindowsPath(ex.linkpath)\n Object.assign(\n this,\n Object.fromEntries(\n Object.entries(ex).filter(([k, v]) => {\n // we slurp in everything except for the path attribute in\n // a global extended header, because that's weird. Also, any\n // null/undefined values are ignored.\n return !(v === null || v === undefined || (k === 'path' && gex))\n }),\n ),\n )\n }\n}\n","import { type Minipass } from 'minipass'\n\n/** has a warn method */\nexport type Warner = {\n warn(code: string, message: string | Error, data: unknown): void\n file?: string\n cwd?: string\n strict?: boolean\n\n emit(event: 'warn', code: string, message: string, data?: WarnData): void\n emit(event: 'error', error: TarError): void\n}\n\nexport type WarnEvent<T = Buffer> = Minipass.Events<T> & {\n warn: [code: string, message: string, data: WarnData]\n}\n\nexport type WarnData = {\n file?: string\n cwd?: string\n code?: string\n tarCode?: string\n recoverable?: boolean\n [k: string]: unknown\n}\n\nexport type TarError = Error & WarnData\n\nexport const warnMethod = (\n self: Warner,\n code: string,\n message: string | Error,\n data: WarnData = {},\n) => {\n if (self.file) {\n data.file = self.file\n }\n if (self.cwd) {\n data.cwd = self.cwd\n }\n data.code =\n (message instanceof Error &&\n (message as NodeJS.ErrnoException).code) ||\n code\n data.tarCode = code\n if (!self.strict && data.recoverable !== false) {\n if (message instanceof Error) {\n data = Object.assign(message, data)\n message = message.message\n }\n self.emit('warn', code, message, data)\n } else if (message instanceof Error) {\n self.emit('error', Object.assign(message, data))\n } else {\n self.emit(\n 'error',\n Object.assign(new Error(`${code}: ${message}`), data),\n )\n }\n}\n","// warning: extremely hot code path.\n// This has been meticulously optimized for use\n// within npm install on large package trees.\n// Do not edit without careful benchmarking.\nexport const stripTrailingSlashes = (str: string) => {\n let i = str.length - 1\n let slashesStart = -1\n while (i > -1 && str.charAt(i) === '/') {\n slashesStart = i\n i--\n }\n return slashesStart === -1 ? str : str.slice(0, slashesStart)\n}\n","// A readable tar stream creator\n// Technically, this is a transform stream that you write paths into,\n// and tar format comes out of.\n// The `add()` method is like `write()` but returns this,\n// and end() return `this` as well, so you can\n// do `new Pack(opt).add('files').add('dir').end().pipe(output)\n// You could also do something like:\n// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar'))\n\nimport fs, { type Stats } from 'fs'\nimport {\n WriteEntry,\n WriteEntrySync,\n WriteEntryTar,\n} from './write-entry.js'\n\nexport class PackJob {\n path: string\n absolute: string\n entry?: WriteEntry | WriteEntryTar\n stat?: Stats\n readdir?: string[]\n pending: boolean = false\n ignore: boolean = false\n piped: boolean = false\n constructor(path: string, absolute: string) {\n this.path = path || './'\n this.absolute = absolute\n }\n}\n\nimport { Minipass } from 'minipass'\nimport * as zlib from 'minizlib'\nimport { Yallist } from 'yallist'\nimport { ReadEntry } from './read-entry.js'\nimport type { WarnEvent } from './warn-method.js'\nimport { warnMethod, type WarnData, type Warner } from './warn-method.js'\n\nconst EOF = Buffer.alloc(1024)\nconst ONSTAT = Symbol('onStat')\nconst ENDED = Symbol('ended')\nconst QUEUE = Symbol('queue')\nconst CURRENT = Symbol('current')\nconst PROCESS = Symbol('process')\nconst PROCESSING = Symbol('processing')\nconst PROCESSJOB = Symbol('processJob')\nconst JOBS = Symbol('jobs')\nconst JOBDONE = Symbol('jobDone')\nconst ADDFSENTRY = Symbol('addFSEntry')\nconst ADDTARENTRY = Symbol('addTarEntry')\nconst STAT = Symbol('stat')\nconst READDIR = Symbol('readdir')\nconst ONREADDIR = Symbol('onreaddir')\nconst PIPE = Symbol('pipe')\nconst ENTRY = Symbol('entry')\nconst ENTRYOPT = Symbol('entryOpt')\nconst WRITEENTRYCLASS = Symbol('writeEntryClass')\nconst WRITE = Symbol('write')\nconst ONDRAIN = Symbol('ondrain')\n\nimport path from 'path'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport type { TarOptions } from './options.js'\n\nexport class Pack\n extends Minipass<Buffer, ReadEntry | string, WarnEvent<Buffer>>\n implements Warner\n{\n sync: boolean = false\n opt: TarOptions\n cwd: string\n maxReadSize?: number\n preservePaths: boolean\n strict: boolean\n noPax: boolean\n prefix: string\n linkCache: Exclude<TarOptions['linkCache'], undefined>\n statCache: Exclude<TarOptions['statCache'], undefined>\n file: string\n portable: boolean\n zip?: zlib.BrotliCompress | zlib.Gzip | zlib.ZstdCompress\n readdirCache: Exclude<TarOptions['readdirCache'], undefined>\n noDirRecurse: boolean\n follow: boolean\n noMtime: boolean\n mtime?: Date\n filter: Exclude<TarOptions['filter'], undefined>\n jobs: number;\n\n [WRITEENTRYCLASS]: typeof WriteEntry | typeof WriteEntrySync\n onWriteEntry?: (entry: WriteEntry) => void;\n // Note: we actually DO need a linked list here, because we\n // shift() to update the head of the list where we start, but still\n // while that happens, need to know what the next item in the queue\n // will be. Since we do multiple jobs in parallel, it's not as simple\n // as just an Array.shift(), since that would lose the information about\n // the next job in the list. We could add a .next field on the PackJob\n // class, but then we'd have to be tracking the tail of the queue the\n // whole time, and Yallist just does that for us anyway.\n [QUEUE]: Yallist<PackJob>;\n [JOBS]: number = 0;\n [PROCESSING]: boolean = false;\n [ENDED]: boolean = false\n\n constructor(opt: TarOptions = {}) {\n super()\n this.opt = opt\n this.file = opt.file || ''\n this.cwd = opt.cwd || process.cwd()\n this.maxReadSize = opt.maxReadSize\n this.preservePaths = !!opt.preservePaths\n this.strict = !!opt.strict\n this.noPax = !!opt.noPax\n this.prefix = normalizeWindowsPath(opt.prefix || '')\n this.linkCache = opt.linkCache || new Map()\n this.statCache = opt.statCache || new Map()\n this.readdirCache = opt.readdirCache || new Map()\n this.onWriteEntry = opt.onWriteEntry\n\n this[WRITEENTRYCLASS] = WriteEntry\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n\n this.portable = !!opt.portable\n\n if (opt.gzip || opt.brotli || opt.zstd) {\n if (\n (opt.gzip ? 1 : 0) + (opt.brotli ? 1 : 0) + (opt.zstd ? 1 : 0) >\n 1\n ) {\n throw new TypeError('gzip, brotli, zstd are mutually exclusive')\n }\n if (opt.gzip) {\n if (typeof opt.gzip !== 'object') {\n opt.gzip = {}\n }\n if (this.portable) {\n opt.gzip.portable = true\n }\n this.zip = new zlib.Gzip(opt.gzip)\n }\n if (opt.brotli) {\n if (typeof opt.brotli !== 'object') {\n opt.brotli = {}\n }\n this.zip = new zlib.BrotliCompress(opt.brotli)\n }\n if (opt.zstd) {\n if (typeof opt.zstd !== 'object') {\n opt.zstd = {}\n }\n this.zip = new zlib.ZstdCompress(opt.zstd)\n }\n /* c8 ignore next */\n if (!this.zip) throw new Error('impossible')\n const zip = this.zip\n zip.on('data', chunk => super.write(chunk as unknown as string))\n zip.on('end', () => super.end())\n zip.on('drain', () => this[ONDRAIN]())\n this.on('resume', () => zip.resume())\n } else {\n this.on('drain', this[ONDRAIN])\n }\n\n this.noDirRecurse = !!opt.noDirRecurse\n this.follow = !!opt.follow\n this.noMtime = !!opt.noMtime\n if (opt.mtime) this.mtime = opt.mtime\n\n this.filter =\n typeof opt.filter === 'function' ? opt.filter : () => true\n\n this[QUEUE] = new Yallist<PackJob>()\n this[JOBS] = 0\n this.jobs = Number(opt.jobs) || 4\n this[PROCESSING] = false\n this[ENDED] = false\n }\n\n [WRITE](chunk: Buffer) {\n return super.write(chunk as unknown as string)\n }\n\n add(path: string | ReadEntry) {\n this.write(path)\n return this\n }\n\n end(cb?: () => void): this\n end(path: string | ReadEntry, cb?: () => void): this\n end(\n path: string | ReadEntry,\n encoding?: Minipass.Encoding,\n cb?: () => void,\n ): this\n end(\n path?: string | ReadEntry | (() => void),\n encoding?: Minipass.Encoding | (() => void),\n cb?: () => void,\n ) {\n /* c8 ignore start */\n if (typeof path === 'function') {\n cb = path\n path = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n /* c8 ignore stop */\n if (path) {\n this.add(path)\n }\n this[ENDED] = true\n this[PROCESS]()\n /* c8 ignore next */\n if (cb) cb()\n return this\n }\n\n write(path: string | ReadEntry) {\n if (this[ENDED]) {\n throw new Error('write after end')\n }\n\n if (path instanceof ReadEntry) {\n this[ADDTARENTRY](path)\n } else {\n this[ADDFSENTRY](path)\n }\n return this.flowing\n }\n\n [ADDTARENTRY](p: ReadEntry) {\n const absolute = normalizeWindowsPath(path.resolve(this.cwd, p.path))\n // in this case, we don't have to wait for the stat\n if (!this.filter(p.path, p)) {\n p.resume()\n } else {\n const job = new PackJob(p.path, absolute)\n job.entry = new WriteEntryTar(p, this[ENTRYOPT](job))\n job.entry.on('end', () => this[JOBDONE](job))\n this[JOBS] += 1\n this[QUEUE].push(job)\n }\n\n this[PROCESS]()\n }\n\n [ADDFSENTRY](p: string) {\n const absolute = normalizeWindowsPath(path.resolve(this.cwd, p))\n this[QUEUE].push(new PackJob(p, absolute))\n this[PROCESS]()\n }\n\n [STAT](job: PackJob) {\n job.pending = true\n this[JOBS] += 1\n const stat = this.follow ? 'stat' : 'lstat'\n fs[stat](job.absolute, (er, stat) => {\n job.pending = false\n this[JOBS] -= 1\n if (er) {\n this.emit('error', er)\n } else {\n this[ONSTAT](job, stat)\n }\n })\n }\n\n [ONSTAT](job: PackJob, stat: Stats) {\n this.statCache.set(job.absolute, stat)\n job.stat = stat\n\n // now we have the stat, we can filter it.\n if (!this.filter(job.path, stat)) {\n job.ignore = true\n } else if (\n stat.isFile() &&\n stat.nlink > 1 &&\n job === this[CURRENT] &&\n !this.linkCache.get(`${stat.dev}:${stat.ino}`) &&\n !this.sync\n ) {\n // if it's not filtered, and it's a new File entry,\n // jump the queue in case any pending Link entries are about\n // to try to link to it. This prevents a hardlink from coming ahead\n // of its target in the archive.\n this[PROCESSJOB](job)\n }\n\n this[PROCESS]()\n }\n\n [READDIR](job: PackJob) {\n job.pending = true\n this[JOBS] += 1\n fs.readdir(job.absolute, (er, entries) => {\n job.pending = false\n this[JOBS] -= 1\n if (er) {\n return this.emit('error', er)\n }\n this[ONREADDIR](job, entries)\n })\n }\n\n [ONREADDIR](job: PackJob, entries: string[]) {\n this.readdirCache.set(job.absolute, entries)\n job.readdir = entries\n this[PROCESS]()\n }\n\n [PROCESS]() {\n if (this[PROCESSING]) {\n return\n }\n\n this[PROCESSING] = true\n for (\n let w = this[QUEUE].head;\n !!w && this[JOBS] < this.jobs;\n w = w.next\n ) {\n this[PROCESSJOB](w.value)\n if (w.value.ignore) {\n const p = w.next\n this[QUEUE].removeNode(w)\n w.next = p\n }\n }\n\n this[PROCESSING] = false\n\n if (this[ENDED] && this[QUEUE].length === 0 && this[JOBS] === 0) {\n if (this.zip) {\n this.zip.end(EOF)\n } else {\n super.write(EOF as unknown as string)\n super.end()\n }\n }\n }\n\n get [CURRENT]() {\n return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value\n }\n\n [JOBDONE](_job: PackJob) {\n this[QUEUE].shift()\n this[JOBS] -= 1\n this[PROCESS]()\n }\n\n [PROCESSJOB](job: PackJob) {\n if (job.pending) {\n return\n }\n\n if (job.entry) {\n if (job === this[CURRENT] && !job.piped) {\n this[PIPE](job)\n }\n return\n }\n\n if (!job.stat) {\n const sc = this.statCache.get(job.absolute)\n if (sc) {\n this[ONSTAT](job, sc)\n } else {\n this[STAT](job)\n }\n }\n if (!job.stat) {\n return\n }\n\n // filtered out!\n if (job.ignore) {\n return\n }\n\n if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) {\n const rc = this.readdirCache.get(job.absolute)\n if (rc) {\n this[ONREADDIR](job, rc)\n } else {\n this[READDIR](job)\n }\n if (!job.readdir) {\n return\n }\n }\n\n // we know it doesn't have an entry, because that got checked above\n job.entry = this[ENTRY](job)\n if (!job.entry) {\n job.ignore = true\n return\n }\n\n if (job === this[CURRENT] && !job.piped) {\n this[PIPE](job)\n }\n }\n\n [ENTRYOPT](job: PackJob): TarOptions {\n return {\n onwarn: (code, msg, data) => this.warn(code, msg, data),\n noPax: this.noPax,\n cwd: this.cwd,\n absolute: job.absolute,\n preservePaths: this.preservePaths,\n maxReadSize: this.maxReadSize,\n strict: this.strict,\n portable: this.portable,\n linkCache: this.linkCache,\n statCache: this.statCache,\n noMtime: this.noMtime,\n mtime: this.mtime,\n prefix: this.prefix,\n onWriteEntry: this.onWriteEntry,\n }\n }\n\n [ENTRY](job: PackJob) {\n this[JOBS] += 1\n try {\n const e = new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job))\n return e\n .on('end', () => this[JOBDONE](job))\n .on('error', er => this.emit('error', er))\n } catch (er) {\n this.emit('error', er)\n }\n }\n\n [ONDRAIN]() {\n if (this[CURRENT] && this[CURRENT].entry) {\n this[CURRENT].entry.resume()\n }\n }\n\n // like .pipe() but using super, because our write() is special\n [PIPE](job: PackJob) {\n job.piped = true\n\n if (job.readdir) {\n job.readdir.forEach(entry => {\n const p = job.path\n const base = p === './' ? '' : p.replace(/\\/*$/, '/')\n this[ADDFSENTRY](base + entry)\n })\n }\n\n const source = job.entry\n const zip = this.zip\n /* c8 ignore start */\n if (!source) throw new Error('cannot pipe without source')\n /* c8 ignore stop */\n\n if (zip) {\n source.on('data', chunk => {\n if (!zip.write(chunk)) {\n source.pause()\n }\n })\n } else {\n source.on('data', chunk => {\n if (!super.write(chunk as unknown as string)) {\n source.pause()\n }\n })\n }\n }\n\n pause() {\n if (this.zip) {\n this.zip.pause()\n }\n return super.pause()\n }\n warn(code: string, message: string | Error, data: WarnData = {}): void {\n warnMethod(this, code, message, data)\n }\n}\n\nexport class PackSync extends Pack {\n sync: true = true\n constructor(opt: TarOptions) {\n super(opt)\n this[WRITEENTRYCLASS] = WriteEntrySync\n }\n\n // pause/resume are no-ops in sync streams.\n pause() {}\n resume() {}\n\n [STAT](job: PackJob) {\n const stat = this.follow ? 'statSync' : 'lstatSync'\n this[ONSTAT](job, fs[stat](job.absolute))\n }\n\n [READDIR](job: PackJob) {\n this[ONREADDIR](job, fs.readdirSync(job.absolute))\n }\n\n // gotta get it all in this tick\n [PIPE](job: PackJob) {\n const source = job.entry\n const zip = this.zip\n\n if (job.readdir) {\n job.readdir.forEach(entry => {\n const p = job.path\n const base = p === './' ? '' : p.replace(/\\/*$/, '/')\n this[ADDFSENTRY](base + entry)\n })\n }\n\n /* c8 ignore start */\n if (!source) throw new Error('Cannot pipe without source')\n /* c8 ignore stop */\n\n if (zip) {\n source.on('data', chunk => {\n zip.write(chunk)\n })\n } else {\n source.on('data', chunk => {\n super[WRITE](chunk)\n })\n }\n }\n}\n","import fs, { type Stats } from 'fs'\nimport { Minipass } from 'minipass'\nimport path from 'path'\nimport { Header } from './header.js'\nimport { modeFix } from './mode-fix.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport type {\n LinkCacheKey,\n TarOptions,\n TarOptionsWithAliases,\n} from './options.js'\nimport { dealias } from './options.js'\nimport { Pax } from './pax.js'\nimport type { ReadEntry } from './read-entry.js'\nimport { stripAbsolutePath } from './strip-absolute-path.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\nimport type { EntryTypeName } from './types.js'\nimport type { WarnData, Warner, WarnEvent } from './warn-method.js'\nimport { warnMethod } from './warn-method.js'\nimport * as winchars from './winchars.js'\n\nconst prefixPath = (path: string, prefix?: string) => {\n if (!prefix) {\n return normalizeWindowsPath(path)\n }\n path = normalizeWindowsPath(path).replace(/^\\.(\\/|$)/, '')\n return stripTrailingSlashes(prefix) + '/' + path\n}\n\nconst maxReadSize = 16 * 1024 * 1024\n\nconst PROCESS = Symbol('process')\nconst FILE = Symbol('file')\nconst DIRECTORY = Symbol('directory')\nconst SYMLINK = Symbol('symlink')\nconst HARDLINK = Symbol('hardlink')\nconst HEADER = Symbol('header')\nconst READ = Symbol('read')\nconst LSTAT = Symbol('lstat')\nconst ONLSTAT = Symbol('onlstat')\nconst ONREAD = Symbol('onread')\nconst ONREADLINK = Symbol('onreadlink')\nconst OPENFILE = Symbol('openfile')\nconst ONOPENFILE = Symbol('onopenfile')\nconst CLOSE = Symbol('close')\nconst MODE = Symbol('mode')\nconst AWAITDRAIN = Symbol('awaitDrain')\nconst ONDRAIN = Symbol('ondrain')\nconst PREFIX = Symbol('prefix')\n\nexport class WriteEntry\n extends Minipass<Buffer, Minipass.ContiguousData, WarnEvent>\n implements Warner\n{\n path: string\n portable: boolean\n myuid: number = (process.getuid && process.getuid()) || 0\n // until node has builtin pwnam functions, this'll have to do\n myuser: string = process.env.USER || ''\n maxReadSize: number\n linkCache: Exclude<TarOptions['linkCache'], undefined>\n statCache: Exclude<TarOptions['statCache'], undefined>\n preservePaths: boolean\n cwd: string\n strict: boolean\n mtime?: Date\n noPax: boolean\n noMtime: boolean\n prefix?: string\n fd?: number\n\n blockLen: number = 0\n blockRemain: number = 0\n buf?: Buffer\n pos: number = 0\n remain: number = 0\n length: number = 0\n offset: number = 0\n\n win32: boolean\n absolute: string\n\n header?: Header\n type?: EntryTypeName | 'Unsupported'\n linkpath?: string\n stat?: Stats\n onWriteEntry?: (entry: WriteEntry) => unknown\n\n #hadError: boolean = false\n\n constructor(p: string, opt_: TarOptionsWithAliases = {}) {\n const opt = dealias(opt_)\n super()\n this.path = normalizeWindowsPath(p)\n // suppress atime, ctime, uid, gid, uname, gname\n this.portable = !!opt.portable\n this.maxReadSize = opt.maxReadSize || maxReadSize\n this.linkCache = opt.linkCache || new Map()\n this.statCache = opt.statCache || new Map()\n this.preservePaths = !!opt.preservePaths\n this.cwd = normalizeWindowsPath(opt.cwd || process.cwd())\n this.strict = !!opt.strict\n this.noPax = !!opt.noPax\n this.noMtime = !!opt.noMtime\n this.mtime = opt.mtime\n this.prefix = opt.prefix ? normalizeWindowsPath(opt.prefix) : undefined\n this.onWriteEntry = opt.onWriteEntry\n\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n\n let pathWarn: string | boolean = false\n if (!this.preservePaths) {\n const [root, stripped] = stripAbsolutePath(this.path)\n if (root && typeof stripped === 'string') {\n this.path = stripped\n pathWarn = root\n }\n }\n\n this.win32 = !!opt.win32 || process.platform === 'win32'\n if (this.win32) {\n // force the \\ to / normalization, since we might not *actually*\n // be on windows, but want \\ to be considered a path separator.\n this.path = winchars.decode(this.path.replaceAll(/\\\\/g, '/'))\n p = p.replaceAll(/\\\\/g, '/')\n }\n\n this.absolute = normalizeWindowsPath(\n opt.absolute || path.resolve(this.cwd, p),\n )\n\n if (this.path === '') {\n this.path = './'\n }\n\n if (pathWarn) {\n this.warn(\n 'TAR_ENTRY_INFO',\n `stripping ${pathWarn} from absolute path`,\n {\n entry: this,\n path: pathWarn + this.path,\n },\n )\n }\n\n const cs = this.statCache.get(this.absolute)\n if (cs) {\n this[ONLSTAT](cs)\n } else {\n this[LSTAT]()\n }\n }\n\n warn(code: string, message: string | Error, data: WarnData = {}) {\n return warnMethod(this, code, message, data)\n }\n\n emit(ev: keyof WarnEvent, ...data: unknown[]) {\n if (ev === 'error') {\n this.#hadError = true\n }\n return super.emit(ev, ...data)\n }\n\n [LSTAT]() {\n fs.lstat(this.absolute, (er, stat) => {\n if (er) {\n return this.emit('error', er)\n }\n this[ONLSTAT](stat)\n })\n }\n\n [ONLSTAT](stat: Stats) {\n this.statCache.set(this.absolute, stat)\n this.stat = stat\n if (!stat.isFile()) {\n stat.size = 0\n }\n this.type = getType(stat)\n this.emit('stat', stat)\n this[PROCESS]()\n }\n\n [PROCESS]() {\n switch (this.type) {\n case 'File':\n return this[FILE]()\n case 'Directory':\n return this[DIRECTORY]()\n case 'SymbolicLink':\n return this[SYMLINK]()\n // unsupported types are ignored.\n default:\n return this.end()\n }\n }\n\n [MODE](mode: number) {\n return modeFix(mode, this.type === 'Directory', this.portable)\n }\n\n [PREFIX](path: string) {\n return prefixPath(path, this.prefix)\n }\n\n [HEADER]() {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot write header before stat')\n }\n /* c8 ignore stop */\n\n if (this.type === 'Directory' && this.portable) {\n this.noMtime = true\n }\n\n this.onWriteEntry?.(this)\n this.header = new Header({\n path: this[PREFIX](this.path),\n // only apply the prefix to hard links.\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n // only the permissions and setuid/setgid/sticky bitflags\n // not the higher-order bits that specify file type\n mode: this[MODE](this.stat.mode),\n uid: this.portable ? undefined : this.stat.uid,\n gid: this.portable ? undefined : this.stat.gid,\n size: this.stat.size,\n mtime: this.noMtime ? undefined : this.mtime || this.stat.mtime,\n /* c8 ignore next */\n type: this.type === 'Unsupported' ? undefined : this.type,\n uname:\n this.portable ? undefined\n : this.stat.uid === this.myuid ? this.myuser\n : '',\n atime: this.portable ? undefined : this.stat.atime,\n ctime: this.portable ? undefined : this.stat.ctime,\n })\n\n if (this.header.encode() && !this.noPax) {\n super.write(\n new Pax({\n atime: this.portable ? undefined : this.header.atime,\n ctime: this.portable ? undefined : this.header.ctime,\n gid: this.portable ? undefined : this.header.gid,\n mtime:\n this.noMtime ? undefined : this.mtime || this.header.mtime,\n path: this[PREFIX](this.path),\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n size: this.header.size,\n uid: this.portable ? undefined : this.header.uid,\n uname: this.portable ? undefined : this.header.uname,\n dev: this.portable ? undefined : this.stat.dev,\n ino: this.portable ? undefined : this.stat.ino,\n nlink: this.portable ? undefined : this.stat.nlink,\n }).encode(),\n )\n }\n const block = this.header?.block\n /* c8 ignore start */\n if (!block) {\n throw new Error('failed to encode header')\n }\n /* c8 ignore stop */\n super.write(block)\n }\n\n [DIRECTORY]() {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot create directory entry without stat')\n }\n /* c8 ignore stop */\n if (this.path.slice(-1) !== '/') {\n this.path += '/'\n }\n this.stat.size = 0\n this[HEADER]()\n this.end()\n }\n\n [SYMLINK]() {\n fs.readlink(this.absolute, (er, linkpath) => {\n if (er) {\n return this.emit('error', er)\n }\n this[ONREADLINK](linkpath)\n })\n }\n\n [ONREADLINK](linkpath: string) {\n this.linkpath = normalizeWindowsPath(linkpath)\n this[HEADER]()\n this.end()\n }\n\n [HARDLINK](linkpath: string) {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot create link entry without stat')\n }\n /* c8 ignore stop */\n this.type = 'Link'\n this.linkpath = normalizeWindowsPath(path.relative(this.cwd, linkpath))\n this.stat.size = 0\n this[HEADER]()\n this.end()\n }\n\n [FILE]() {\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('cannot create file entry without stat')\n }\n /* c8 ignore stop */\n if (this.stat.nlink > 1) {\n const linkKey = `${this.stat.dev}:${this.stat.ino}` as LinkCacheKey\n const linkpath = this.linkCache.get(linkKey)\n if (linkpath?.indexOf(this.cwd) === 0) {\n return this[HARDLINK](linkpath)\n }\n this.linkCache.set(linkKey, this.absolute)\n }\n\n this[HEADER]()\n if (this.stat.size === 0) {\n return this.end()\n }\n\n this[OPENFILE]()\n }\n\n [OPENFILE]() {\n fs.open(this.absolute, 'r', (er, fd) => {\n if (er) {\n return this.emit('error', er)\n }\n this[ONOPENFILE](fd)\n })\n }\n\n [ONOPENFILE](fd: number) {\n this.fd = fd\n if (this.#hadError) {\n return this[CLOSE]()\n }\n /* c8 ignore start */\n if (!this.stat) {\n throw new Error('should stat before calling onopenfile')\n }\n /* c8 ignore start */\n\n this.blockLen = 512 * Math.ceil(this.stat.size / 512)\n this.blockRemain = this.blockLen\n const bufLen = Math.min(this.blockLen, this.maxReadSize)\n this.buf = Buffer.allocUnsafe(bufLen)\n this.offset = 0\n this.pos = 0\n this.remain = this.stat.size\n this.length = this.buf.length\n this[READ]()\n }\n\n [READ]() {\n const { fd, buf, offset, length, pos } = this\n if (fd === undefined || buf === undefined) {\n throw new Error('cannot read file without first opening')\n }\n fs.read(fd, buf, offset, length, pos, (er, bytesRead) => {\n if (er) {\n // ignoring the error from close(2) is a bad practice, but at\n // this point we already have an error, don't need another one\n return this[CLOSE](() => this.emit('error', er))\n }\n this[ONREAD](bytesRead)\n })\n }\n\n /* c8 ignore start */\n [CLOSE](\n cb: (er?: null | Error | NodeJS.ErrnoException) => unknown = () => {},\n ) {\n /* c8 ignore stop */\n if (this.fd !== undefined) fs.close(this.fd, cb)\n }\n\n [ONREAD](bytesRead: number) {\n if (bytesRead <= 0 && this.remain > 0) {\n const er = Object.assign(new Error('encountered unexpected EOF'), {\n path: this.absolute,\n syscall: 'read',\n code: 'EOF',\n })\n return this[CLOSE](() => this.emit('error', er))\n }\n\n if (bytesRead > this.remain) {\n const er = Object.assign(\n new Error('did not encounter expected EOF'),\n {\n path: this.absolute,\n syscall: 'read',\n code: 'EOF',\n },\n )\n return this[CLOSE](() => this.emit('error', er))\n }\n\n /* c8 ignore start */\n if (!this.buf) {\n throw new Error('should have created buffer prior to reading')\n }\n /* c8 ignore stop */\n\n // null out the rest of the buffer, if we could fit the block padding\n // at the end of this loop, we've incremented bytesRead and this.remain\n // to be incremented up to the blockRemain level, as if we had expected\n // to get a null-padded file, and read it until the end. then we will\n // decrement both remain and blockRemain by bytesRead, and know that we\n // reached the expected EOF, without any null buffer to append.\n if (bytesRead === this.remain) {\n for (\n let i = bytesRead;\n i < this.length && bytesRead < this.blockRemain;\n i++\n ) {\n this.buf[i + this.offset] = 0\n bytesRead++\n this.remain++\n }\n }\n\n const chunk =\n this.offset === 0 && bytesRead === this.buf.length ?\n this.buf\n : this.buf.subarray(this.offset, this.offset + bytesRead)\n\n const flushed = this.write(chunk)\n if (!flushed) {\n this[AWAITDRAIN](() => this[ONDRAIN]())\n } else {\n this[ONDRAIN]()\n }\n }\n\n [AWAITDRAIN](cb: () => unknown) {\n this.once('drain', cb)\n }\n\n write(buffer: Buffer | string, cb?: () => void): boolean\n write(\n str: Buffer | string,\n encoding?: BufferEncoding | null,\n cb?: () => void,\n ): boolean\n write(\n chunk: Buffer | string,\n encoding?: BufferEncoding | (() => unknown) | null,\n cb?: () => unknown,\n ): boolean {\n /* c8 ignore start - just junk to comply with NodeJS.WritableStream */\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(\n chunk,\n typeof encoding === 'string' ? encoding : 'utf8',\n )\n }\n /* c8 ignore stop */\n\n if (this.blockRemain < chunk.length) {\n const er = Object.assign(\n new Error('writing more data than expected'),\n {\n path: this.absolute,\n },\n )\n return this.emit('error', er)\n }\n this.remain -= chunk.length\n this.blockRemain -= chunk.length\n this.pos += chunk.length\n this.offset += chunk.length\n return super.write(chunk, null, cb)\n }\n\n [ONDRAIN]() {\n if (!this.remain) {\n if (this.blockRemain) {\n super.write(Buffer.alloc(this.blockRemain))\n }\n return this[CLOSE](er => (er ? this.emit('error', er) : this.end()))\n }\n\n /* c8 ignore start */\n if (!this.buf) {\n throw new Error('buffer lost somehow in ONDRAIN')\n }\n /* c8 ignore stop */\n\n if (this.offset >= this.length) {\n // if we only have a smaller bit left to read, alloc a smaller buffer\n // otherwise, keep it the same length it was before.\n this.buf = Buffer.allocUnsafe(\n Math.min(this.blockRemain, this.buf.length),\n )\n this.offset = 0\n }\n this.length = this.buf.length - this.offset\n this[READ]()\n }\n}\n\nexport class WriteEntrySync extends WriteEntry implements Warner {\n sync: true = true;\n\n [LSTAT]() {\n this[ONLSTAT](fs.lstatSync(this.absolute))\n }\n\n [SYMLINK]() {\n this[ONREADLINK](fs.readlinkSync(this.absolute))\n }\n\n [OPENFILE]() {\n this[ONOPENFILE](fs.openSync(this.absolute, 'r'))\n }\n\n [READ]() {\n let threw = true\n try {\n const { fd, buf, offset, length, pos } = this\n /* c8 ignore start */\n if (fd === undefined || buf === undefined) {\n throw new Error('fd and buf must be set in READ method')\n }\n /* c8 ignore stop */\n const bytesRead = fs.readSync(fd, buf, offset, length, pos)\n this[ONREAD](bytesRead)\n threw = false\n } finally {\n // ignoring the error from close(2) is a bad practice, but at\n // this point we already have an error, don't need another one\n if (threw) {\n try {\n this[CLOSE](() => {})\n } catch {}\n }\n }\n }\n\n [AWAITDRAIN](cb: () => unknown) {\n cb()\n }\n\n /* c8 ignore start */\n [CLOSE](\n cb: (er?: null | Error | NodeJS.ErrnoException) => unknown = () => {},\n ) {\n /* c8 ignore stop */\n if (this.fd !== undefined) fs.closeSync(this.fd)\n cb()\n }\n}\n\nexport class WriteEntryTar\n extends Minipass<Buffer, Buffer | string, WarnEvent>\n implements Warner\n{\n blockLen: number = 0\n blockRemain: number = 0\n buf: number = 0\n pos: number = 0\n remain: number = 0\n length: number = 0\n preservePaths: boolean\n portable: boolean\n strict: boolean\n noPax: boolean\n noMtime: boolean\n readEntry: ReadEntry\n type: EntryTypeName\n prefix?: string\n path: string\n mode?: number\n uid?: number\n gid?: number\n uname?: string\n gname?: string\n header?: Header\n mtime?: Date\n atime?: Date\n ctime?: Date\n linkpath?: string\n size: number\n onWriteEntry?: (entry: WriteEntry) => unknown\n\n warn(code: string, message: string | Error, data: WarnData = {}) {\n return warnMethod(this, code, message, data)\n }\n\n constructor(readEntry: ReadEntry, opt_: TarOptionsWithAliases = {}) {\n const opt = dealias(opt_)\n super()\n this.preservePaths = !!opt.preservePaths\n this.portable = !!opt.portable\n this.strict = !!opt.strict\n this.noPax = !!opt.noPax\n this.noMtime = !!opt.noMtime\n this.onWriteEntry = opt.onWriteEntry\n\n this.readEntry = readEntry\n const { type } = readEntry\n /* c8 ignore start */\n if (type === 'Unsupported') {\n throw new Error('writing entry that should be ignored')\n }\n /* c8 ignore stop */\n this.type = type\n if (this.type === 'Directory' && this.portable) {\n this.noMtime = true\n }\n\n this.prefix = opt.prefix\n\n this.path = normalizeWindowsPath(readEntry.path)\n this.mode =\n readEntry.mode !== undefined ? this[MODE](readEntry.mode) : undefined\n this.uid = this.portable ? undefined : readEntry.uid\n this.gid = this.portable ? undefined : readEntry.gid\n this.uname = this.portable ? undefined : readEntry.uname\n this.gname = this.portable ? undefined : readEntry.gname\n this.size = readEntry.size\n this.mtime = this.noMtime ? undefined : opt.mtime || readEntry.mtime\n this.atime = this.portable ? undefined : readEntry.atime\n this.ctime = this.portable ? undefined : readEntry.ctime\n this.linkpath =\n readEntry.linkpath !== undefined ?\n normalizeWindowsPath(readEntry.linkpath)\n : undefined\n\n if (typeof opt.onwarn === 'function') {\n this.on('warn', opt.onwarn)\n }\n\n let pathWarn: false | string = false\n if (!this.preservePaths) {\n const [root, stripped] = stripAbsolutePath(this.path)\n if (root && typeof stripped === 'string') {\n this.path = stripped\n pathWarn = root\n }\n }\n\n this.remain = readEntry.size\n this.blockRemain = readEntry.startBlockSize\n\n this.onWriteEntry?.(this as unknown as WriteEntry)\n this.header = new Header({\n path: this[PREFIX](this.path),\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n // only the permissions and setuid/setgid/sticky bitflags\n // not the higher-order bits that specify file type\n mode: this.mode,\n uid: this.portable ? undefined : this.uid,\n gid: this.portable ? undefined : this.gid,\n size: this.size,\n mtime: this.noMtime ? undefined : this.mtime,\n type: this.type,\n uname: this.portable ? undefined : this.uname,\n atime: this.portable ? undefined : this.atime,\n ctime: this.portable ? undefined : this.ctime,\n })\n\n if (pathWarn) {\n this.warn(\n 'TAR_ENTRY_INFO',\n `stripping ${pathWarn} from absolute path`,\n {\n entry: this,\n path: pathWarn + this.path,\n },\n )\n }\n\n if (this.header.encode() && !this.noPax) {\n super.write(\n new Pax({\n atime: this.portable ? undefined : this.atime,\n ctime: this.portable ? undefined : this.ctime,\n gid: this.portable ? undefined : this.gid,\n mtime: this.noMtime ? undefined : this.mtime,\n path: this[PREFIX](this.path),\n linkpath:\n this.type === 'Link' && this.linkpath !== undefined ?\n this[PREFIX](this.linkpath)\n : this.linkpath,\n size: this.size,\n uid: this.portable ? undefined : this.uid,\n uname: this.portable ? undefined : this.uname,\n dev: this.portable ? undefined : this.readEntry.dev,\n ino: this.portable ? undefined : this.readEntry.ino,\n nlink: this.portable ? undefined : this.readEntry.nlink,\n }).encode(),\n )\n }\n\n const b = this.header?.block\n /* c8 ignore start */\n if (!b) throw new Error('failed to encode header')\n /* c8 ignore stop */\n super.write(b)\n readEntry.pipe(this)\n }\n\n [PREFIX](path: string) {\n return prefixPath(path, this.prefix)\n }\n\n [MODE](mode: number) {\n return modeFix(mode, this.type === 'Directory', this.portable)\n }\n\n write(buffer: Buffer | string, cb?: () => void): boolean\n write(\n str: Buffer | string,\n encoding?: BufferEncoding | null,\n cb?: () => void,\n ): boolean\n write(\n chunk: Buffer | string,\n encoding?: BufferEncoding | (() => unknown) | null,\n cb?: () => unknown,\n ): boolean {\n /* c8 ignore start - just junk to comply with NodeJS.WritableStream */\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(\n chunk,\n typeof encoding === 'string' ? encoding : 'utf8',\n )\n }\n /* c8 ignore stop */\n const writeLen = chunk.length\n if (writeLen > this.blockRemain) {\n throw new Error('writing more to entry than is appropriate')\n }\n this.blockRemain -= writeLen\n return super.write(chunk, cb)\n }\n\n end(cb?: () => void): this\n end(chunk: Buffer | string, cb?: () => void): this\n end(\n chunk: Buffer | string,\n encoding?: BufferEncoding,\n cb?: () => void,\n ): this\n end(\n chunk?: Buffer | string | (() => void),\n encoding?: BufferEncoding | (() => void),\n cb?: () => void,\n ): this {\n if (this.blockRemain) {\n super.write(Buffer.alloc(this.blockRemain))\n }\n /* c8 ignore start - just junk to comply with NodeJS.WritableStream */\n if (typeof chunk === 'function') {\n cb = chunk\n encoding = undefined\n chunk = undefined\n }\n if (typeof encoding === 'function') {\n cb = encoding\n encoding = undefined\n }\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding ?? 'utf8')\n }\n if (cb) this.once('finish', cb)\n if (chunk) super.end(chunk, cb)\n else super.end(cb)\n /* c8 ignore stop */\n return this\n }\n}\n\nconst getType = (stat: Stats): EntryTypeName | 'Unsupported' =>\n stat.isFile() ? 'File'\n : stat.isDirectory() ? 'Directory'\n : stat.isSymbolicLink() ? 'SymbolicLink'\n : 'Unsupported'\n","export const modeFix = (\n mode: number,\n isDir: boolean,\n portable: boolean,\n) => {\n mode &= 0o7777\n\n // in portable mode, use the minimum reasonable umask\n // if this system creates files with 0o664 by default\n // (as some linux distros do), then we'll write the\n // archive with 0o644 instead. Also, don't ever create\n // a file that is not readable/writable by the owner.\n if (portable) {\n mode = (mode | 0o600) & ~0o22\n }\n\n // if dirs are readable, then they should be listable\n if (isDir) {\n if (mode & 0o400) {\n mode |= 0o100\n }\n if (mode & 0o40) {\n mode |= 0o10\n }\n if (mode & 0o4) {\n mode |= 0o1\n }\n }\n return mode\n}\n","// unix absolute paths are also absolute on win32, so we use this for both\nimport { win32 } from 'node:path'\nconst { isAbsolute, parse } = win32\n\n// returns [root, stripped]\n// Note that windows will think that //x/y/z/a has a \"root\" of //x/y, and in\n// those cases, we want to sanitize it to x/y/z/a, not z/a, so we strip /\n// explicitly if it's the first character.\n// drive-specific relative paths on Windows get their root stripped off even\n// though they are not absolute, so `c:../foo` becomes ['c:', '../foo']\nexport const stripAbsolutePath = (path: string): [string, string] => {\n let r = ''\n\n let parsed = parse(path)\n while (isAbsolute(path) || parsed.root) {\n // windows will think that //x/y/z has a \"root\" of //x/y/\n // but strip the //?/C:/ off of //?/C:/path\n const root =\n path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ?\n '/'\n : parsed.root\n path = path.slice(root.length)\n r += root\n parsed = parse(path)\n }\n return [r, path]\n}\n","// When writing files on Windows, translate the characters to their\n// 0xf000 higher-encoded versions.\n\nconst raw = ['|', '<', '>', '?', ':']\n\nconst win = raw.map(char =>\n String.fromCodePoint(0xf000 + Number(char.codePointAt(0))),\n)\n\nconst toWin = new Map(raw.map((char, i) => [char, win[i]]))\nconst toRaw = new Map(win.map((char, i) => [char, raw[i]]))\n\nexport const encode = (s: string) =>\n raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s)\nexport const decode = (s: string) =>\n win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s)\n","export class Yallist<T = unknown> {\n tail?: Node<T>\n head?: Node<T>\n length: number = 0\n\n static create<T = unknown>(list: Iterable<T> = []) {\n return new Yallist(list)\n }\n\n constructor(list: Iterable<T> = []) {\n for (const item of list) {\n this.push(item)\n }\n }\n\n *[Symbol.iterator]() {\n for (let walker = this.head; walker; walker = walker.next) {\n yield walker.value\n }\n }\n\n removeNode(node: Node<T>) {\n if (node.list !== this) {\n throw new Error(\n 'removing node which does not belong to this list',\n )\n }\n\n const next = node.next\n const prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n this.length--\n node.next = undefined\n node.prev = undefined\n node.list = undefined\n\n return next\n }\n\n unshiftNode(node: Node<T>) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n const head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length++\n }\n\n pushNode(node: Node<T>) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n const tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length++\n }\n\n push(...args: T[]) {\n for (let i = 0, l = args.length; i < l; i++) {\n push(this, args[i])\n }\n return this.length\n }\n\n unshift(...args: T[]) {\n for (var i = 0, l = args.length; i < l; i++) {\n unshift(this, args[i])\n }\n return this.length\n }\n\n pop() {\n if (!this.tail) {\n return undefined\n }\n\n const res = this.tail.value\n const t = this.tail\n this.tail = this.tail.prev\n if (this.tail) {\n this.tail.next = undefined\n } else {\n this.head = undefined\n }\n t.list = undefined\n this.length--\n return res\n }\n\n shift() {\n if (!this.head) {\n return undefined\n }\n\n const res = this.head.value\n const h = this.head\n this.head = this.head.next\n if (this.head) {\n this.head.prev = undefined\n } else {\n this.tail = undefined\n }\n h.list = undefined\n this.length--\n return res\n }\n\n forEach(\n fn: (value: T, i: number, list: Yallist<T>) => any,\n thisp?: any,\n ) {\n thisp = thisp || this\n for (let walker = this.head, i = 0; !!walker; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n }\n\n forEachReverse(\n fn: (value: T, i: number, list: Yallist<T>) => any,\n thisp?: any,\n ) {\n thisp = thisp || this\n for (let walker = this.tail, i = this.length - 1; !!walker; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n }\n\n get(n: number) {\n let i = 0\n let walker = this.head\n for (; !!walker && i < n; i++) {\n walker = walker.next\n }\n if (i === n && !!walker) {\n return walker.value\n }\n }\n\n getReverse(n: number) {\n let i = 0\n let walker = this.tail\n for (; !!walker && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && !!walker) {\n return walker.value\n }\n }\n\n map<R = any>(\n fn: (value: T, list: Yallist<T>) => R,\n thisp?: any,\n ): Yallist<R> {\n thisp = thisp || this\n const res = new Yallist<R>()\n for (let walker = this.head; !!walker; ) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n }\n\n mapReverse<R = any>(\n fn: (value: T, list: Yallist<T>) => R,\n thisp?: any,\n ): Yallist<R> {\n thisp = thisp || this\n var res = new Yallist<R>()\n for (let walker = this.tail; !!walker; ) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n }\n\n reduce(fn: (left: T, right: T, i: number) => T): T\n reduce<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial: R,\n ): R\n reduce<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial?: R,\n ): R {\n let acc: R | T\n let walker = this.head\n if (arguments.length > 1) {\n acc = initial as R\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError(\n 'Reduce of empty list with no initial value',\n )\n }\n\n for (var i = 0; !!walker; i++) {\n acc = fn(acc as R, walker.value, i)\n walker = walker.next\n }\n\n return acc as R\n }\n\n reduceReverse(fn: (left: T, right: T, i: number) => T): T\n reduceReverse<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial: R,\n ): R\n reduceReverse<R = any>(\n fn: (acc: R, next: T, i: number) => R,\n initial?: R,\n ): R {\n let acc: R | T\n let walker = this.tail\n if (arguments.length > 1) {\n acc = initial as R\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError(\n 'Reduce of empty list with no initial value',\n )\n }\n\n for (let i = this.length - 1; !!walker; i--) {\n acc = fn(acc as R, walker.value, i)\n walker = walker.prev\n }\n\n return acc as R\n }\n\n toArray() {\n const arr = new Array(this.length)\n for (let i = 0, walker = this.head; !!walker; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n }\n\n toArrayReverse() {\n const arr = new Array(this.length)\n for (let i = 0, walker = this.tail; !!walker; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n }\n\n slice(from: number = 0, to: number = this.length) {\n if (to < 0) {\n to += this.length\n }\n if (from < 0) {\n from += this.length\n }\n const ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n let walker = this.head\n let i = 0\n for (i = 0; !!walker && i < from; i++) {\n walker = walker.next\n }\n for (; !!walker && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n }\n\n sliceReverse(from: number = 0, to: number = this.length) {\n if (to < 0) {\n to += this.length\n }\n if (from < 0) {\n from += this.length\n }\n const ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n let i = this.length\n let walker = this.tail\n for (; !!walker && i > to; i--) {\n walker = walker.prev\n }\n for (; !!walker && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n }\n\n splice(start: number, deleteCount: number = 0, ...nodes: T[]) {\n if (start > this.length) {\n start = this.length - 1\n }\n if (start < 0) {\n start = this.length + start\n }\n\n let walker = this.head\n\n for (let i = 0; !!walker && i < start; i++) {\n walker = walker.next\n }\n\n const ret: T[] = []\n for (let i = 0; !!walker && i < deleteCount; i++) {\n ret.push(walker.value)\n walker = this.removeNode(walker)\n }\n if (!walker) {\n walker = this.tail\n } else if (walker !== this.tail) {\n walker = walker.prev\n }\n\n for (const v of nodes) {\n walker = insertAfter<T>(this, walker, v)\n }\n\n return ret\n }\n\n reverse() {\n const head = this.head\n const tail = this.tail\n for (let walker = head; !!walker; walker = walker.prev) {\n const p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n }\n}\n\n// insertAfter undefined means \"make the node the new head of list\"\nfunction insertAfter<T>(\n self: Yallist<T>,\n node: Node<T> | undefined,\n value: T,\n) {\n const prev = node\n const next = node ? node.next : self.head\n const inserted = new Node<T>(value, prev, next, self)\n\n if (inserted.next === undefined) {\n self.tail = inserted\n }\n if (inserted.prev === undefined) {\n self.head = inserted\n }\n\n self.length++\n\n return inserted\n}\n\nfunction push<T>(self: Yallist<T>, item: T) {\n self.tail = new Node<T>(item, self.tail, undefined, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length++\n}\n\nfunction unshift<T>(self: Yallist<T>, item: T) {\n self.head = new Node<T>(item, undefined, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length++\n}\n\nexport class Node<T = unknown> {\n list?: Yallist<T>\n next?: Node<T>\n prev?: Node<T>\n value: T\n\n constructor(\n value: T,\n prev?: Node<T> | undefined,\n next?: Node<T> | undefined,\n list?: Yallist<T> | undefined,\n ) {\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = undefined\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = undefined\n }\n }\n}\n","// tar -x\nimport * as fsm from '@isaacs/fs-minipass'\nimport fs from 'node:fs'\nimport { filesFilter } from './list.js'\nimport { makeCommand } from './make-command.js'\nimport type { TarOptionsFile, TarOptionsSyncFile } from './options.js'\nimport { Unpack, UnpackSync } from './unpack.js'\n\nconst extractFileSync = (opt: TarOptionsSyncFile) => {\n const u = new UnpackSync(opt)\n const file = opt.file\n const stat = fs.statSync(file)\n // This trades a zero-byte read() syscall for a stat\n // However, it will usually result in less memory allocation\n const readSize = opt.maxReadSize || 16 * 1024 * 1024\n const stream = new fsm.ReadStreamSync(file, {\n readSize: readSize,\n size: stat.size,\n })\n stream.pipe(u)\n}\n\nconst extractFile = (opt: TarOptionsFile, _?: string[]) => {\n const u = new Unpack(opt)\n const readSize = opt.maxReadSize || 16 * 1024 * 1024\n\n const file = opt.file\n const p = new Promise<void>((resolve, reject) => {\n u.on('error', reject)\n u.on('close', resolve)\n\n // This trades a zero-byte read() syscall for a stat\n // However, it will usually result in less memory allocation\n fs.stat(file, (er, stat) => {\n if (er) {\n reject(er)\n } else {\n const stream = new fsm.ReadStream(file, {\n readSize: readSize,\n size: stat.size,\n })\n stream.on('error', reject)\n stream.pipe(u)\n }\n })\n })\n return p\n}\n\nexport const extract = makeCommand<Unpack, UnpackSync>(\n extractFileSync,\n extractFile,\n opt => new UnpackSync(opt),\n opt => new Unpack(opt),\n (opt, files) => {\n if (files?.length) filesFilter(opt, files)\n },\n)\n","// the PEND/UNPEND stuff tracks whether we're ready to emit end/close yet.\n// but the path reservations are required to avoid race conditions where\n// parallelized unpack ops may mess with one another, due to dependencies\n// (like a Link depending on its target) or destructive operations (like\n// clobbering an fs object to create one of a different type.)\n\nimport * as fsm from '@isaacs/fs-minipass'\nimport assert from 'node:assert'\nimport { randomBytes } from 'node:crypto'\nimport fs, { type Stats } from 'node:fs'\nimport path from 'node:path'\nimport { getWriteFlag } from './get-write-flag.js'\nimport type { MkdirError } from './mkdir.js'\nimport { mkdir, mkdirSync } from './mkdir.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport { Parser } from './parse.js'\nimport { stripAbsolutePath } from './strip-absolute-path.js'\nimport * as wc from './winchars.js'\n\nimport type { TarOptions } from './options.js'\nimport { PathReservations } from './path-reservations.js'\nimport type { ReadEntry } from './read-entry.js'\nimport type { WarnData } from './warn-method.js'\nimport { SymlinkError } from './symlink-error.js'\nimport { umask } from './process-umask.js'\n\nconst ONENTRY = Symbol('onEntry')\nconst CHECKFS = Symbol('checkFs')\nconst CHECKFS2 = Symbol('checkFs2')\nconst ISREUSABLE = Symbol('isReusable')\nconst MAKEFS = Symbol('makeFs')\nconst FILE = Symbol('file')\nconst DIRECTORY = Symbol('directory')\nconst LINK = Symbol('link')\nconst SYMLINK = Symbol('symlink')\nconst HARDLINK = Symbol('hardlink')\nconst ENSURE_NO_SYMLINK = Symbol('ensureNoSymlink')\nconst UNSUPPORTED = Symbol('unsupported')\nconst CHECKPATH = Symbol('checkPath')\nconst STRIPABSOLUTEPATH = Symbol('stripAbsolutePath')\nconst MKDIR = Symbol('mkdir')\nconst ONERROR = Symbol('onError')\nconst PENDING = Symbol('pending')\nconst PEND = Symbol('pend')\nconst UNPEND = Symbol('unpend')\nconst ENDED = Symbol('ended')\nconst MAYBECLOSE = Symbol('maybeClose')\nconst SKIP = Symbol('skip')\nconst DOCHOWN = Symbol('doChown')\nconst UID = Symbol('uid')\nconst GID = Symbol('gid')\nconst CHECKED_CWD = Symbol('checkedCwd')\nconst platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform\nconst isWindows = platform === 'win32'\nconst DEFAULT_MAX_DEPTH = 1024\n\n// Unlinks on Windows are not atomic.\n//\n// This means that if you have a file entry, followed by another\n// file entry with an identical name, and you cannot re-use the file\n// (because it's a hardlink, or because unlink:true is set, or it's\n// Windows, which does not have useful nlink values), then the unlink\n// will be committed to the disk AFTER the new file has been written\n// over the old one, deleting the new file.\n//\n// To work around this, on Windows systems, we rename the file and then\n// delete the renamed file. It's a sloppy kludge, but frankly, I do not\n// know of a better way to do this, given windows' non-atomic unlink\n// semantics.\n//\n// See: https://github.com/npm/node-tar/issues/183\n/* c8 ignore start */\nconst unlinkFile = (path: string, cb: (er?: Error | null) => void) => {\n if (!isWindows) {\n return fs.unlink(path, cb)\n }\n\n const name = path + '.DELETE.' + randomBytes(16).toString('hex')\n fs.rename(path, name, er => {\n if (er) {\n return cb(er)\n }\n fs.unlink(name, cb)\n })\n}\n/* c8 ignore stop */\n\n/* c8 ignore start */\nconst unlinkFileSync = (path: string) => {\n if (!isWindows) {\n return fs.unlinkSync(path)\n }\n\n const name = path + '.DELETE.' + randomBytes(16).toString('hex')\n fs.renameSync(path, name)\n fs.unlinkSync(name)\n}\n/* c8 ignore stop */\n\n// this.gid, entry.gid, this.processUid\nconst uint32 = (\n a: number | undefined,\n b: number | undefined,\n c: number | undefined,\n) =>\n a !== undefined && a === a >>> 0 ? a\n : b !== undefined && b === b >>> 0 ? b\n : c\n\nexport class Unpack extends Parser {\n [ENDED]: boolean = false;\n [CHECKED_CWD]: boolean = false;\n [PENDING]: number = 0\n\n reservations: PathReservations = new PathReservations()\n transform?: TarOptions['transform']\n writable: true = true\n readable: false = false\n uid?: number\n gid?: number\n setOwner: boolean\n preserveOwner: boolean\n processGid?: number\n processUid?: number\n maxDepth: number\n forceChown: boolean\n win32: boolean\n newer: boolean\n keep: boolean\n noMtime: boolean\n preservePaths: boolean\n unlink: boolean\n cwd: string\n strip: number\n processUmask: number\n umask: number\n dmode: number\n fmode: number\n chmod: boolean\n\n constructor(opt: TarOptions = {}) {\n opt.ondone = () => {\n this[ENDED] = true\n this[MAYBECLOSE]()\n }\n\n super(opt)\n\n this.transform = opt.transform\n\n this.chmod = !!opt.chmod\n\n if (typeof opt.uid === 'number' || typeof opt.gid === 'number') {\n // need both or neither\n if (typeof opt.uid !== 'number' || typeof opt.gid !== 'number') {\n throw new TypeError('cannot set owner without number uid and gid')\n }\n if (opt.preserveOwner) {\n throw new TypeError(\n 'cannot preserve owner in archive and also set owner explicitly',\n )\n }\n this.uid = opt.uid\n this.gid = opt.gid\n this.setOwner = true\n } else {\n this.uid = undefined\n this.gid = undefined\n this.setOwner = false\n }\n\n // default true for root\n this.preserveOwner =\n opt.preserveOwner === undefined && typeof opt.uid !== 'number' ?\n !!(process.getuid && process.getuid() === 0)\n : !!opt.preserveOwner\n\n this.processUid =\n (this.preserveOwner || this.setOwner) && process.getuid ?\n process.getuid()\n : undefined\n this.processGid =\n (this.preserveOwner || this.setOwner) && process.getgid ?\n process.getgid()\n : undefined\n\n // prevent excessively deep nesting of subfolders\n // set to `Infinity` to remove this restriction\n this.maxDepth =\n typeof opt.maxDepth === 'number' ? opt.maxDepth : DEFAULT_MAX_DEPTH\n\n // mostly just for testing, but useful in some cases.\n // Forcibly trigger a chown on every entry, no matter what\n this.forceChown = opt.forceChown === true\n\n // turn ><?| in filenames into 0xf000-higher encoded forms\n this.win32 = !!opt.win32 || isWindows\n\n // do not unpack over files that are newer than what's in the archive\n this.newer = !!opt.newer\n\n // do not unpack over ANY files\n this.keep = !!opt.keep\n\n // do not set mtime/atime of extracted entries\n this.noMtime = !!opt.noMtime\n\n // allow .., absolute path entries, and unpacking through symlinks\n // without this, warn and skip .., relativize absolutes, and error\n // on symlinks in extraction path\n this.preservePaths = !!opt.preservePaths\n\n // unlink files and links before writing. This breaks existing hard\n // links, and removes symlink directories rather than erroring\n this.unlink = !!opt.unlink\n\n this.cwd = normalizeWindowsPath(path.resolve(opt.cwd || process.cwd()))\n this.strip = Number(opt.strip) || 0\n // if we're not chmodding, then we don't need the process umask\n this.processUmask =\n !this.chmod ? 0\n : typeof opt.processUmask === 'number' ? opt.processUmask\n : umask()\n this.umask =\n typeof opt.umask === 'number' ? opt.umask : this.processUmask\n\n // default mode for dirs created as parents\n this.dmode = opt.dmode || 0o0777 & ~this.umask\n this.fmode = opt.fmode || 0o0666 & ~this.umask\n\n this.on('entry', entry => this[ONENTRY](entry))\n }\n\n // a bad or damaged archive is a warning for Parser, but an error\n // when extracting. Mark those errors as unrecoverable, because\n // the Unpack contract cannot be met.\n warn(code: string, msg: string | Error, data: WarnData = {}) {\n if (code === 'TAR_BAD_ARCHIVE' || code === 'TAR_ABORT') {\n data.recoverable = false\n }\n return super.warn(code, msg, data)\n }\n\n [MAYBECLOSE]() {\n if (this[ENDED] && this[PENDING] === 0) {\n this.emit('prefinish')\n this.emit('finish')\n this.emit('end')\n }\n }\n\n // return false if we need to skip this file\n // return true if the field was successfully sanitized\n [STRIPABSOLUTEPATH](\n entry: ReadEntry,\n field: 'path' | 'linkpath',\n ): boolean {\n const p = entry[field]\n const { type } = entry\n if (!p || this.preservePaths) return true\n\n // strip off the root\n const [root, stripped] = stripAbsolutePath(p)\n const parts = stripped.replaceAll(/\\\\/g, '/').split('/')\n\n if (\n parts.includes('..') ||\n /* c8 ignore next */\n (isWindows && /^[a-z]:\\.\\.$/i.test(parts[0] ?? ''))\n ) {\n // For linkpath, check if the resolved path escapes cwd rather than\n // just rejecting any path with '..' - relative symlinks like\n // '../sibling/file' are valid if they resolve within the cwd.\n // For paths, they just simply may not ever use .. at all.\n if (field === 'path' || type === 'Link') {\n this.warn('TAR_ENTRY_ERROR', `${field} contains '..'`, {\n entry,\n [field]: p,\n })\n // not ok!\n return false\n }\n // Resolve linkpath relative to the entry's directory.\n // `path.posix` is safe to use because we're operating on\n // tar paths, not a filesystem.\n const entryDir = path.posix.dirname(entry.path)\n const resolved = path.posix.normalize(\n path.posix.join(entryDir, parts.join('/')),\n )\n // If the resolved path escapes (starts with ..), reject it\n if (resolved.startsWith('../') || resolved === '..') {\n this.warn(\n 'TAR_ENTRY_ERROR',\n `${field} escapes extraction directory`,\n {\n entry,\n [field]: p,\n },\n )\n return false\n }\n }\n\n if (root) {\n // ok, but triggers warning about stripping root\n entry[field] = String(stripped)\n this.warn(\n 'TAR_ENTRY_INFO',\n `stripping ${root} from absolute ${field}`,\n {\n entry,\n [field]: p,\n },\n )\n }\n return true\n }\n\n // no IO, just string checking for absolute indicators\n [CHECKPATH](entry: ReadEntry) {\n const p = normalizeWindowsPath(entry.path)\n const parts = p.split('/')\n\n if (this.strip) {\n if (parts.length < this.strip) {\n return false\n }\n if (entry.type === 'Link') {\n const linkparts = normalizeWindowsPath(\n String(entry.linkpath),\n ).split('/')\n if (linkparts.length >= this.strip) {\n entry.linkpath = linkparts.slice(this.strip).join('/')\n } else {\n return false\n }\n }\n parts.splice(0, this.strip)\n entry.path = parts.join('/')\n }\n\n if (isFinite(this.maxDepth) && parts.length > this.maxDepth) {\n this.warn('TAR_ENTRY_ERROR', 'path excessively deep', {\n entry,\n path: p,\n depth: parts.length,\n maxDepth: this.maxDepth,\n })\n return false\n }\n\n if (\n !this[STRIPABSOLUTEPATH](entry, 'path') ||\n !this[STRIPABSOLUTEPATH](entry, 'linkpath')\n ) {\n return false\n }\n\n entry.absolute =\n path.isAbsolute(entry.path) ?\n normalizeWindowsPath(path.resolve(entry.path))\n : normalizeWindowsPath(path.resolve(this.cwd, entry.path))\n\n // if we somehow ended up with a path that escapes the cwd, and we are\n // not in preservePaths mode, then something is fishy! This should have\n // been prevented above, so ignore this for coverage.\n /* c8 ignore start - defense in depth */\n if (\n !this.preservePaths &&\n typeof entry.absolute === 'string' &&\n entry.absolute.indexOf(this.cwd + '/') !== 0 &&\n entry.absolute !== this.cwd\n ) {\n this.warn('TAR_ENTRY_ERROR', 'path escaped extraction target', {\n entry,\n path: normalizeWindowsPath(entry.path),\n resolvedPath: entry.absolute,\n cwd: this.cwd,\n })\n return false\n }\n /* c8 ignore stop */\n\n // an archive can set properties on the extraction directory, but it\n // may not replace the cwd with a different kind of thing entirely.\n if (\n entry.absolute === this.cwd &&\n entry.type !== 'Directory' &&\n entry.type !== 'GNUDumpDir'\n ) {\n return false\n }\n\n // only encode : chars that aren't drive letter indicators\n if (this.win32) {\n const { root: aRoot } = path.win32.parse(String(entry.absolute))\n entry.absolute =\n aRoot + wc.encode(String(entry.absolute).slice(aRoot.length))\n const { root: pRoot } = path.win32.parse(entry.path)\n entry.path = pRoot + wc.encode(entry.path.slice(pRoot.length))\n }\n\n return true\n }\n\n [ONENTRY](entry: ReadEntry) {\n if (!this[CHECKPATH](entry)) {\n return entry.resume()\n }\n\n assert.equal(typeof entry.absolute, 'string')\n\n switch (entry.type) {\n case 'Directory':\n case 'GNUDumpDir':\n if (entry.mode) {\n entry.mode = entry.mode | 0o700\n }\n\n // eslint-disable-next-line no-fallthrough\n case 'File':\n case 'OldFile':\n case 'ContiguousFile':\n case 'Link':\n case 'SymbolicLink':\n return this[CHECKFS](entry)\n\n case 'CharacterDevice':\n case 'BlockDevice':\n case 'FIFO':\n default:\n return this[UNSUPPORTED](entry)\n }\n }\n\n [ONERROR](er: Error, entry: ReadEntry) {\n // Cwd has to exist, or else nothing works. That's serious.\n // Other errors are warnings, which raise the error in strict\n // mode, but otherwise continue on.\n if (er.name === 'CwdError') {\n this.emit('error', er)\n } else {\n this.warn('TAR_ENTRY_ERROR', er, { entry })\n this[UNPEND]()\n entry.resume()\n }\n }\n\n [MKDIR](\n dir: string,\n mode: number,\n cb: (er?: null | MkdirError, made?: string) => void,\n ) {\n mkdir(\n normalizeWindowsPath(dir),\n {\n uid: this.uid,\n gid: this.gid,\n processUid: this.processUid,\n processGid: this.processGid,\n umask: this.processUmask,\n preserve: this.preservePaths,\n unlink: this.unlink,\n cwd: this.cwd,\n mode: mode,\n },\n cb,\n )\n }\n\n [DOCHOWN](entry: ReadEntry) {\n // in preserve owner mode, chown if the entry doesn't match process\n // in set owner mode, chown if setting doesn't match process\n return (\n this.forceChown ||\n (this.preserveOwner &&\n ((typeof entry.uid === 'number' &&\n entry.uid !== this.processUid) ||\n (typeof entry.gid === 'number' &&\n entry.gid !== this.processGid))) ||\n (typeof this.uid === 'number' && this.uid !== this.processUid) ||\n (typeof this.gid === 'number' && this.gid !== this.processGid)\n )\n }\n\n [UID](entry: ReadEntry) {\n return uint32(this.uid, entry.uid, this.processUid)\n }\n\n [GID](entry: ReadEntry) {\n return uint32(this.gid, entry.gid, this.processGid)\n }\n\n [FILE](entry: ReadEntry, fullyDone: () => void) {\n const mode =\n typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.fmode\n const stream = new fsm.WriteStream(String(entry.absolute), {\n // slight lie, but it can be numeric flags\n flags: getWriteFlag(entry.size) as string,\n mode: mode,\n autoClose: false,\n })\n stream.on('error', (er: Error) => {\n if (stream.fd) {\n fs.close(stream.fd, () => {})\n }\n\n // flush all the data out so that we aren't left hanging\n // if the error wasn't actually fatal. otherwise the parse\n // is blocked, and we never proceed.\n stream.write = () => true\n this[ONERROR](er, entry)\n fullyDone()\n })\n\n let actions = 1\n const done = (er?: null | Error) => {\n if (er) {\n /* c8 ignore start - we should always have a fd by now */\n if (stream.fd) {\n fs.close(stream.fd, () => {})\n }\n /* c8 ignore stop */\n\n this[ONERROR](er, entry)\n fullyDone()\n return\n }\n\n if (--actions === 0) {\n if (stream.fd !== undefined) {\n fs.close(stream.fd, er => {\n if (er) {\n this[ONERROR](er, entry)\n } else {\n this[UNPEND]()\n }\n fullyDone()\n })\n }\n }\n }\n\n stream.on('finish', () => {\n // if futimes fails, try utimes\n // if utimes fails, fail with the original error\n // same for fchown/chown\n const abs = String(entry.absolute)\n const fd = stream.fd\n\n if (typeof fd === 'number' && entry.mtime && !this.noMtime) {\n actions++\n const atime = entry.atime || new Date()\n const mtime = entry.mtime\n fs.futimes(fd, atime, mtime, er =>\n er ?\n fs.utimes(abs, atime, mtime, er2 => done(er2 && er))\n : done(),\n )\n }\n\n if (typeof fd === 'number' && this[DOCHOWN](entry)) {\n actions++\n const uid = this[UID](entry)\n const gid = this[GID](entry)\n if (typeof uid === 'number' && typeof gid === 'number') {\n fs.fchown(fd, uid, gid, er =>\n er ? fs.chown(abs, uid, gid, er2 => done(er2 && er)) : done(),\n )\n }\n }\n\n done()\n })\n\n const tx = this.transform ? this.transform(entry) || entry : entry\n if (tx !== entry) {\n tx.on('error', er => {\n this[ONERROR](er as Error, entry)\n fullyDone()\n })\n entry.pipe(tx)\n }\n tx.pipe(stream)\n }\n\n [DIRECTORY](entry: ReadEntry, fullyDone: () => void) {\n const mode =\n typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.dmode\n this[MKDIR](String(entry.absolute), mode, er => {\n if (er) {\n this[ONERROR](er, entry)\n fullyDone()\n return\n }\n\n let actions = 1\n const done = () => {\n if (--actions === 0) {\n fullyDone()\n this[UNPEND]()\n entry.resume()\n }\n }\n\n if (entry.mtime && !this.noMtime) {\n actions++\n fs.utimes(\n String(entry.absolute),\n entry.atime || new Date(),\n entry.mtime,\n done,\n )\n }\n\n if (this[DOCHOWN](entry)) {\n actions++\n fs.chown(\n String(entry.absolute),\n Number(this[UID](entry)),\n Number(this[GID](entry)),\n done,\n )\n }\n\n done()\n })\n }\n\n [UNSUPPORTED](entry: ReadEntry) {\n entry.unsupported = true\n this.warn(\n 'TAR_ENTRY_UNSUPPORTED',\n `unsupported entry type: ${entry.type}`,\n { entry },\n )\n entry.resume()\n }\n\n [SYMLINK](entry: ReadEntry, done: () => void) {\n const parts = normalizeWindowsPath(\n path.relative(\n this.cwd,\n path.resolve(\n path.dirname(String(entry.absolute)),\n String(entry.linkpath),\n ),\n ),\n ).split('/')\n this[ENSURE_NO_SYMLINK](\n entry,\n this.cwd,\n parts,\n () => this[LINK](entry, String(entry.linkpath), 'symlink', done),\n er => {\n this[ONERROR](er, entry)\n done()\n },\n )\n }\n\n [HARDLINK](entry: ReadEntry, done: () => void) {\n const linkpath = normalizeWindowsPath(\n path.resolve(this.cwd, String(entry.linkpath)),\n )\n const parts = normalizeWindowsPath(String(entry.linkpath)).split('/')\n this[ENSURE_NO_SYMLINK](\n entry,\n this.cwd,\n parts,\n () => this[LINK](entry, linkpath, 'link', done),\n er => {\n this[ONERROR](er, entry)\n done()\n },\n )\n }\n\n [ENSURE_NO_SYMLINK](\n entry: ReadEntry,\n cwd: string,\n parts: string[],\n done: () => void,\n onError: (er: SymlinkError) => void,\n ) {\n const p = parts.shift()\n if (this.preservePaths || p === undefined) return done()\n const t = path.resolve(cwd, p)\n fs.lstat(t, (er, st) => {\n if (er) return done()\n if (st?.isSymbolicLink()) {\n return onError(\n new SymlinkError(t, path.resolve(t, parts.join('/'))),\n )\n }\n this[ENSURE_NO_SYMLINK](entry, t, parts, done, onError)\n })\n }\n\n [PEND]() {\n this[PENDING]++\n }\n\n [UNPEND]() {\n this[PENDING]--\n this[MAYBECLOSE]()\n }\n\n [SKIP](entry: ReadEntry) {\n this[UNPEND]()\n entry.resume()\n }\n\n // Check if we can reuse an existing filesystem entry safely and\n // overwrite it, rather than unlinking and recreating\n // Windows doesn't report a useful nlink, so we just never reuse entries\n [ISREUSABLE](entry: ReadEntry, st: Stats) {\n return (\n entry.type === 'File' &&\n !this.unlink &&\n st.isFile() &&\n st.nlink <= 1 &&\n !isWindows\n )\n }\n\n // check if a thing is there, and if so, try to clobber it\n [CHECKFS](entry: ReadEntry) {\n this[PEND]()\n const paths = [entry.path]\n if (entry.linkpath) {\n paths.push(entry.linkpath)\n }\n this.reservations.reserve(paths, done => this[CHECKFS2](entry, done))\n }\n\n [CHECKFS2](entry: ReadEntry, fullyDone: (er?: Error) => void) {\n const done = (er?: Error) => {\n fullyDone(er)\n }\n\n const checkCwd = () => {\n this[MKDIR](this.cwd, this.dmode, er => {\n if (er) {\n this[ONERROR](er, entry)\n done()\n return\n }\n this[CHECKED_CWD] = true\n start()\n })\n }\n\n const start = () => {\n if (entry.absolute !== this.cwd) {\n const parent = normalizeWindowsPath(\n path.dirname(String(entry.absolute)),\n )\n if (parent !== this.cwd) {\n return this[MKDIR](parent, this.dmode, er => {\n if (er) {\n this[ONERROR](er, entry)\n done()\n return\n }\n afterMakeParent()\n })\n }\n }\n afterMakeParent()\n }\n\n const afterMakeParent = () => {\n fs.lstat(String(entry.absolute), (lstatEr, st) => {\n if (\n st &&\n (this.keep ||\n /* c8 ignore next */\n (this.newer && st.mtime > (entry.mtime ?? st.mtime)))\n ) {\n this[SKIP](entry)\n done()\n return\n }\n if (lstatEr || this[ISREUSABLE](entry, st)) {\n return this[MAKEFS](null, entry, done)\n }\n\n if (st.isDirectory()) {\n if (entry.type === 'Directory') {\n const needChmod =\n this.chmod && entry.mode && (st.mode & 0o7777) !== entry.mode\n const afterChmod = (er?: Error | null | undefined) =>\n this[MAKEFS](er ?? null, entry, done)\n if (!needChmod) {\n return afterChmod()\n }\n return fs.chmod(\n String(entry.absolute),\n Number(entry.mode),\n afterChmod,\n )\n }\n // Not a dir entry, have to remove it.\n // NB: the only way to end up with an entry that is the cwd\n // itself, in such a way that == does not detect, is a\n // tricky windows absolute path with UNC or 8.3 parts (and\n // preservePaths:true, or else it will have been stripped).\n // In that case, the user has opted out of path protections\n // explicitly, so if they blow away the cwd, c'est la vie.\n if (entry.absolute !== this.cwd) {\n return fs.rmdir(String(entry.absolute), (er?: null | Error) =>\n this[MAKEFS](er ?? null, entry, done),\n )\n }\n }\n\n // not a dir, and not reusable\n // don't remove if the cwd, we want that error\n if (entry.absolute === this.cwd) {\n return this[MAKEFS](null, entry, done)\n }\n\n unlinkFile(String(entry.absolute), er =>\n this[MAKEFS](er ?? null, entry, done),\n )\n })\n }\n\n if (this[CHECKED_CWD]) {\n start()\n } else {\n checkCwd()\n }\n }\n\n [MAKEFS](\n er: null | undefined | Error,\n entry: ReadEntry,\n done: () => void,\n ) {\n if (er) {\n this[ONERROR](er, entry)\n done()\n return\n }\n\n switch (entry.type) {\n case 'File':\n case 'OldFile':\n case 'ContiguousFile':\n return this[FILE](entry, done)\n\n case 'Link':\n return this[HARDLINK](entry, done)\n\n case 'SymbolicLink':\n return this[SYMLINK](entry, done)\n\n case 'Directory':\n case 'GNUDumpDir':\n return this[DIRECTORY](entry, done)\n }\n }\n\n [LINK](\n entry: ReadEntry,\n linkpath: string,\n link: 'link' | 'symlink',\n done: () => void,\n ) {\n fs[link](linkpath, String(entry.absolute), er => {\n if (er) {\n this[ONERROR](er, entry)\n } else {\n this[UNPEND]()\n entry.resume()\n }\n done()\n })\n }\n}\n\nconst callSync = <T>(\n fn: () => T,\n): [null, T] | [NodeJS.ErrnoException, null] => {\n try {\n return [null, fn()]\n } catch (er) {\n return [er as NodeJS.ErrnoException, null]\n }\n}\n\nexport class UnpackSync extends Unpack {\n sync: true = true;\n\n [MAKEFS](er: null | Error | undefined, entry: ReadEntry) {\n return super[MAKEFS](er, entry, () => {})\n }\n\n [CHECKFS](entry: ReadEntry) {\n if (!this[CHECKED_CWD]) {\n const er = this[MKDIR](this.cwd, this.dmode)\n if (er) {\n return this[ONERROR](er as Error, entry)\n }\n this[CHECKED_CWD] = true\n }\n\n // don't bother to make the parent if the current entry is the cwd,\n // we've already checked it.\n if (entry.absolute !== this.cwd) {\n const parent = normalizeWindowsPath(\n path.dirname(String(entry.absolute)),\n )\n if (parent !== this.cwd) {\n const mkParent = this[MKDIR](parent, this.dmode)\n if (mkParent) {\n return this[ONERROR](mkParent as Error, entry)\n }\n }\n }\n\n const [lstatEr, st] = callSync(() =>\n fs.lstatSync(String(entry.absolute)),\n )\n if (\n st &&\n (this.keep ||\n /* c8 ignore next */\n (this.newer && st.mtime > (entry.mtime ?? st.mtime)))\n ) {\n return this[SKIP](entry)\n }\n\n if (lstatEr || this[ISREUSABLE](entry, st)) {\n return this[MAKEFS](null, entry)\n }\n\n if (st.isDirectory()) {\n if (entry.type === 'Directory') {\n const needChmod =\n this.chmod && entry.mode && (st.mode & 0o7777) !== entry.mode\n const [er] =\n needChmod ?\n callSync(() => {\n fs.chmodSync(String(entry.absolute), Number(entry.mode))\n })\n : []\n return this[MAKEFS](er, entry)\n }\n // not a dir entry, have to remove it\n const [er] = callSync(() => fs.rmdirSync(String(entry.absolute)))\n this[MAKEFS](er, entry)\n }\n\n // not a dir, and not reusable.\n // don't remove if it's the cwd, since we want that error.\n const [er] =\n entry.absolute === this.cwd ?\n []\n : callSync(() => unlinkFileSync(String(entry.absolute)))\n this[MAKEFS](er, entry)\n }\n\n [FILE](entry: ReadEntry, done: () => void) {\n const mode =\n typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.fmode\n\n const oner = (er?: null | Error | undefined) => {\n let closeError\n try {\n fs.closeSync(fd)\n } catch (e) {\n closeError = e\n }\n if (er || closeError) {\n this[ONERROR]((er as Error) || closeError, entry)\n }\n done()\n }\n\n let fd: number\n try {\n fd = fs.openSync(\n String(entry.absolute),\n getWriteFlag(entry.size),\n mode,\n )\n /* c8 ignore start - This is only a problem if the file was successfully\n * statted, BUT failed to open. Testing this is annoying, and we\n * already have ample testint for other uses of oner() methods.\n */\n } catch (er) {\n return oner(er as Error)\n }\n /* c8 ignore stop */\n const tx = this.transform ? this.transform(entry) || entry : entry\n if (tx !== entry) {\n tx.on('error', er => this[ONERROR](er as Error, entry))\n entry.pipe(tx)\n }\n\n tx.on('data', (chunk: Buffer) => {\n try {\n fs.writeSync(fd, chunk, 0, chunk.length)\n } catch (er) {\n oner(er as Error)\n }\n })\n\n tx.on('end', () => {\n let er = null\n // try both, falling futimes back to utimes\n // if either fails, handle the first error\n if (entry.mtime && !this.noMtime) {\n const atime = entry.atime || new Date()\n const mtime = entry.mtime\n try {\n fs.futimesSync(fd, atime, mtime)\n } catch (futimeser) {\n try {\n fs.utimesSync(String(entry.absolute), atime, mtime)\n } catch {\n er = futimeser\n }\n }\n }\n\n if (this[DOCHOWN](entry)) {\n const uid = this[UID](entry)\n const gid = this[GID](entry)\n\n try {\n fs.fchownSync(fd, Number(uid), Number(gid))\n } catch (fchowner) {\n try {\n fs.chownSync(String(entry.absolute), Number(uid), Number(gid))\n } catch {\n er = er || fchowner\n }\n }\n }\n\n oner(er as Error)\n })\n }\n\n [DIRECTORY](entry: ReadEntry, done: () => void) {\n const mode =\n typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.dmode\n const er = this[MKDIR](String(entry.absolute), mode)\n if (er) {\n this[ONERROR](er as Error, entry)\n done()\n return\n }\n if (entry.mtime && !this.noMtime) {\n try {\n fs.utimesSync(\n String(entry.absolute),\n entry.atime || new Date(),\n entry.mtime,\n )\n /* c8 ignore next */\n } catch {}\n }\n if (this[DOCHOWN](entry)) {\n try {\n fs.chownSync(\n String(entry.absolute),\n Number(this[UID](entry)),\n Number(this[GID](entry)),\n )\n } catch {}\n }\n done()\n entry.resume()\n }\n\n [MKDIR](dir: string, mode: number) {\n try {\n return mkdirSync(normalizeWindowsPath(dir), {\n uid: this.uid,\n gid: this.gid,\n processUid: this.processUid,\n processGid: this.processGid,\n umask: this.processUmask,\n preserve: this.preservePaths,\n unlink: this.unlink,\n cwd: this.cwd,\n mode: mode,\n })\n } catch (er) {\n return er\n }\n }\n\n [ENSURE_NO_SYMLINK](\n _entry: ReadEntry,\n cwd: string,\n parts: string[],\n done: () => void,\n onError: (er: SymlinkError) => void,\n ) {\n if (this.preservePaths || parts.length === 0) return done()\n let t = cwd\n for (const p of parts) {\n t = path.resolve(t, p)\n const [er, st] = callSync(() => fs.lstatSync(t))\n if (er) return done()\n if (st.isSymbolicLink()) {\n return onError(\n new SymlinkError(t, path.resolve(cwd, parts.join('/'))),\n )\n }\n }\n done()\n }\n\n [LINK](\n entry: ReadEntry,\n linkpath: string,\n link: 'link' | 'symlink',\n done: () => void,\n ) {\n const linkSync: `${typeof link}Sync` = `${link}Sync`\n try {\n fs[linkSync](linkpath, String(entry.absolute))\n done()\n entry.resume()\n } catch (er) {\n return this[ONERROR](er as Error, entry)\n }\n }\n}\n","// Get the appropriate flag to use for creating files\n// We use fmap on Windows platforms for files less than\n// 512kb. This is a fairly low limit, but avoids making\n// things slower in some cases. Since most of what this\n// library is used for is extracting tarballs of many\n// relatively small files in npm packages and the like,\n// it can be a big boost on Windows platforms.\n\nimport fs from 'fs'\n\nconst platform = process.env.__FAKE_PLATFORM__ || process.platform\nconst isWindows = platform === 'win32'\n\n/* c8 ignore start */\nconst { O_CREAT, O_NOFOLLOW, O_TRUNC, O_WRONLY } = fs.constants\nconst UV_FS_O_FILEMAP =\n Number(process.env.__FAKE_FS_O_FILENAME__) ||\n fs.constants.UV_FS_O_FILEMAP ||\n 0\n/* c8 ignore stop */\n\nconst fMapEnabled = isWindows && !!UV_FS_O_FILEMAP\nconst fMapLimit = 512 * 1024\nconst fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY\nconst noFollowFlag =\n !isWindows && typeof O_NOFOLLOW === 'number' ?\n O_NOFOLLOW | O_TRUNC | O_CREAT | O_WRONLY\n : null\nexport const getWriteFlag =\n noFollowFlag !== null ? () => noFollowFlag\n : !fMapEnabled ? () => 'w'\n : (size: number) => (size < fMapLimit ? fMapFlag : 'w')\n","import fs, { type Dirent } from 'node:fs'\nimport path from 'node:path'\n\nconst lchownSync = (path: string, uid: number, gid: number) => {\n try {\n return fs.lchownSync(path, uid, gid)\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code !== 'ENOENT') throw er\n }\n}\n\nconst chown = (\n cpath: string,\n uid: number,\n gid: number,\n cb: (er?: unknown) => any,\n) => {\n fs.lchown(cpath, uid, gid, er => {\n // Skip ENOENT error\n cb(er && (er as NodeJS.ErrnoException)?.code !== 'ENOENT' ? er : null)\n })\n}\n\nconst chownrKid = (\n p: string,\n child: Dirent,\n uid: number,\n gid: number,\n cb: (er?: unknown) => any,\n) => {\n if (child.isDirectory()) {\n chownr(path.resolve(p, child.name), uid, gid, (er: unknown) => {\n if (er) return cb(er)\n const cpath = path.resolve(p, child.name)\n chown(cpath, uid, gid, cb)\n })\n } else {\n const cpath = path.resolve(p, child.name)\n chown(cpath, uid, gid, cb)\n }\n}\n\nexport const chownr = (\n p: string,\n uid: number,\n gid: number,\n cb: (er?: unknown) => any,\n) => {\n fs.readdir(p, { withFileTypes: true }, (er, children) => {\n // any error other than ENOTDIR or ENOTSUP means it's not readable,\n // or doesn't exist. give up.\n if (er) {\n if (er.code === 'ENOENT') return cb()\n else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP')\n return cb(er)\n }\n if (er || !children.length) return chown(p, uid, gid, cb)\n\n let len = children.length\n let errState: null | NodeJS.ErrnoException = null\n const then = (er?: unknown) => {\n /* c8 ignore start */\n if (errState) return\n /* c8 ignore stop */\n if (er) return cb((errState = er as NodeJS.ErrnoException))\n if (--len === 0) return chown(p, uid, gid, cb)\n }\n\n for (const child of children) {\n chownrKid(p, child, uid, gid, then)\n }\n })\n}\n\nconst chownrKidSync = (\n p: string,\n child: Dirent,\n uid: number,\n gid: number,\n) => {\n if (child.isDirectory())\n chownrSync(path.resolve(p, child.name), uid, gid)\n\n lchownSync(path.resolve(p, child.name), uid, gid)\n}\n\nexport const chownrSync = (p: string, uid: number, gid: number) => {\n let children: Dirent[]\n try {\n children = fs.readdirSync(p, { withFileTypes: true })\n } catch (er) {\n const e = er as NodeJS.ErrnoException\n if (e?.code === 'ENOENT') return\n else if (e?.code === 'ENOTDIR' || e?.code === 'ENOTSUP')\n return lchownSync(p, uid, gid)\n else throw e\n }\n\n for (const child of children) {\n chownrKidSync(p, child, uid, gid)\n }\n\n return lchownSync(p, uid, gid)\n}\n","import { chownr, chownrSync } from 'chownr'\nimport fs from 'node:fs'\nimport fsp from 'node:fs/promises'\nimport path from 'node:path'\nimport { CwdError } from './cwd-error.js'\nimport { normalizeWindowsPath } from './normalize-windows-path.js'\nimport { SymlinkError } from './symlink-error.js'\n\nexport type MkdirOptions = {\n uid?: number\n gid?: number\n processUid?: number\n processGid?: number\n umask?: number\n preserve: boolean\n unlink: boolean\n cwd: string\n mode: number\n}\n\nexport type MkdirError = NodeJS.ErrnoException | CwdError | SymlinkError\n\nconst checkCwd = (\n dir: string,\n cb: (er?: null | MkdirError) => unknown,\n) => {\n fs.stat(dir, (er, st) => {\n if (er || !st.isDirectory()) {\n er = new CwdError(\n dir,\n (er as NodeJS.ErrnoException)?.code || 'ENOTDIR',\n )\n }\n cb(er)\n })\n}\n\n/**\n * Wrapper around fs/promises.mkdir for tar's needs.\n *\n * The main purpose is to avoid creating directories if we know that\n * they already exist (and track which ones exist for this purpose),\n * and prevent entries from being extracted into symlinked folders,\n * if `preservePaths` is not set.\n */\nexport const mkdir = (\n dir: string,\n opt: MkdirOptions,\n cb: (er?: null | MkdirError, made?: string) => void,\n) => {\n dir = normalizeWindowsPath(dir)\n\n // if there's any overlap between mask and mode,\n // then we'll need an explicit chmod\n /* c8 ignore next */\n const umask = opt.umask ?? 0o22\n const mode = opt.mode | 0o0700\n const needChmod = (mode & umask) !== 0\n\n const uid = opt.uid\n const gid = opt.gid\n const doChown =\n typeof uid === 'number' &&\n typeof gid === 'number' &&\n (uid !== opt.processUid || gid !== opt.processGid)\n\n const preserve = opt.preserve\n const unlink = opt.unlink\n const cwd = normalizeWindowsPath(opt.cwd)\n\n const done = (er?: null | MkdirError, created?: string) => {\n if (er) {\n cb(er)\n } else {\n if (created && doChown) {\n chownr(created, uid, gid, er => done(er as NodeJS.ErrnoException))\n } else if (needChmod) {\n fs.chmod(dir, mode, cb)\n } else {\n cb()\n }\n }\n }\n\n if (dir === cwd) {\n return checkCwd(dir, done)\n }\n\n if (preserve) {\n return fsp.mkdir(dir, { mode, recursive: true }).then(\n made => done(null, made ?? undefined), // oh, ts\n done,\n )\n }\n\n const sub = normalizeWindowsPath(path.relative(cwd, dir))\n const parts = sub.split('/')\n mkdir_(cwd, parts, mode, unlink, cwd, undefined, done)\n}\n\nconst mkdir_ = (\n base: string,\n parts: string[],\n mode: number,\n unlink: boolean,\n cwd: string,\n created: string | undefined,\n cb: (er?: null | MkdirError, made?: string) => void,\n): void => {\n if (parts.length === 0) {\n return cb(null, created)\n }\n const p = parts.shift()\n const part = normalizeWindowsPath(path.resolve(base + '/' + p))\n fs.mkdir(\n part,\n mode,\n onmkdir(part, parts, mode, unlink, cwd, created, cb),\n )\n}\n\nconst onmkdir =\n (\n part: string,\n parts: string[],\n mode: number,\n unlink: boolean,\n cwd: string,\n created: string | undefined,\n cb: (er?: null | MkdirError, made?: string) => void,\n ) =>\n (er?: null | NodeJS.ErrnoException) => {\n if (er) {\n fs.lstat(part, (statEr, st) => {\n if (statEr) {\n statEr.path = statEr.path && normalizeWindowsPath(statEr.path)\n cb(statEr)\n } else if (st.isDirectory()) {\n mkdir_(part, parts, mode, unlink, cwd, created, cb)\n } else if (unlink) {\n fs.unlink(part, er => {\n if (er) {\n return cb(er)\n }\n fs.mkdir(\n part,\n mode,\n onmkdir(part, parts, mode, unlink, cwd, created, cb),\n )\n })\n } else if (st.isSymbolicLink()) {\n return cb(new SymlinkError(part, part + '/' + parts.join('/')))\n } else {\n cb(er)\n }\n })\n } else {\n created = created || part\n mkdir_(part, parts, mode, unlink, cwd, created, cb)\n }\n }\n\nconst checkCwdSync = (dir: string) => {\n let ok = false\n let code\n try {\n ok = fs.statSync(dir).isDirectory()\n } catch (er) {\n code = (er as NodeJS.ErrnoException)?.code\n } finally {\n if (!ok) {\n throw new CwdError(dir, code ?? 'ENOTDIR')\n }\n }\n}\n\nexport const mkdirSync = (dir: string, opt: MkdirOptions) => {\n dir = normalizeWindowsPath(dir)\n // if there's any overlap between mask and mode,\n // then we'll need an explicit chmod\n /* c8 ignore next */\n const umask = opt.umask ?? 0o22\n const mode = opt.mode | 0o700\n const needChmod = (mode & umask) !== 0\n\n const uid = opt.uid\n const gid = opt.gid\n const doChown =\n typeof uid === 'number' &&\n typeof gid === 'number' &&\n (uid !== opt.processUid || gid !== opt.processGid)\n\n const preserve = opt.preserve\n const unlink = opt.unlink\n const cwd = normalizeWindowsPath(opt.cwd)\n\n const done = (created?: string | undefined) => {\n if (created && doChown) {\n chownrSync(created, uid, gid)\n }\n if (needChmod) {\n fs.chmodSync(dir, mode)\n }\n }\n\n if (dir === cwd) {\n checkCwdSync(cwd)\n return done()\n }\n\n if (preserve) {\n return done(fs.mkdirSync(dir, { mode, recursive: true }) ?? undefined)\n }\n\n const sub = normalizeWindowsPath(path.relative(cwd, dir))\n const parts = sub.split('/')\n let created\n for (\n let p = parts.shift(), part = cwd;\n p && (part += '/' + p);\n p = parts.shift()\n ) {\n part = normalizeWindowsPath(path.resolve(part))\n\n try {\n fs.mkdirSync(part, mode)\n created = created || part\n } catch {\n const st = fs.lstatSync(part)\n if (st.isDirectory()) {\n continue\n } else if (unlink) {\n fs.unlinkSync(part)\n fs.mkdirSync(part, mode)\n created = created || part\n continue\n } else if (st.isSymbolicLink()) {\n return new SymlinkError(part, part + '/' + parts.join('/'))\n }\n }\n }\n\n return done(created)\n}\n","export class CwdError extends Error {\n path: string\n code: string\n syscall = 'chdir' as const\n\n constructor(path: string, code: string) {\n super(`${code}: Cannot cd into '${path}'`)\n this.path = path\n this.code = code\n }\n\n get name() {\n return 'CwdError'\n }\n}\n","export class SymlinkError extends Error {\n path: string\n symlink: string\n syscall = 'symlink' as const\n code = 'TAR_SYMLINK_ERROR' as const\n constructor(symlink: string, path: string) {\n super('TAR_SYMLINK_ERROR: Cannot extract through symbolic link')\n this.symlink = symlink\n this.path = path\n }\n get name() {\n return 'SymlinkError'\n }\n}\n","// A path exclusive reservation system\n// reserve([list, of, paths], fn)\n// When the fn is first in line for all its paths, it\n// is called with a cb that clears the reservation.\n//\n// Used by async unpack to avoid clobbering paths in use,\n// while still allowing maximal safe parallelization.\n\nimport { join } from 'node:path'\nimport { normalizeUnicode } from './normalize-unicode.js'\nimport { stripTrailingSlashes } from './strip-trailing-slashes.js'\n\nconst platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform\nconst isWindows = platform === 'win32'\n\nexport type Reservation = {\n paths: string[]\n dirs: Set<string>\n}\n\nexport type Handler = (clear: () => void) => void\n\n// return a set of parent dirs for a given path\n// '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d']\nconst getDirs = (path: string) => {\n const dirs = path\n .split('/')\n .slice(0, -1)\n .reduce((set: string[], path) => {\n const s = set.at(-1)\n if (s !== undefined) {\n path = join(s, path)\n }\n set.push(path || '/')\n return set\n }, [])\n return dirs\n}\n\nexport class PathReservations {\n // path => [function or Set]\n // A Set object means a directory reservation\n // A fn is a direct reservation on that path\n #queues = new Map<string, (Handler | Set<Handler>)[]>()\n\n // fn => {paths:[path,...], dirs:[path, ...]}\n #reservations = new Map<Handler, Reservation>()\n\n // functions currently running\n #running = new Set<Handler>()\n\n reserve(paths: string[], fn: Handler) {\n paths =\n isWindows ?\n ['win32 parallelization disabled']\n : paths.map(p => {\n // don't need normPath, because we skip this entirely for windows\n return stripTrailingSlashes(join(normalizeUnicode(p)))\n })\n\n const dirs = new Set<string>(\n paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b)),\n )\n this.#reservations.set(fn, { dirs, paths })\n for (const p of paths) {\n const q = this.#queues.get(p)\n if (!q) {\n this.#queues.set(p, [fn])\n } else {\n q.push(fn)\n }\n }\n for (const dir of dirs) {\n const q = this.#queues.get(dir)\n if (!q) {\n this.#queues.set(dir, [new Set([fn])])\n } else {\n const l = q.at(-1)\n if (l instanceof Set) {\n l.add(fn)\n } else {\n q.push(new Set([fn]))\n }\n }\n }\n return this.#run(fn)\n }\n\n // return the queues for each path the function cares about\n // fn => {paths, dirs}\n #getQueues(fn: Handler): {\n paths: Handler[][]\n dirs: (Handler | Set<Handler>)[][]\n } {\n const res = this.#reservations.get(fn)\n /* c8 ignore start */\n if (!res) {\n throw new Error('function does not have any path reservations')\n }\n /* c8 ignore stop */\n return {\n paths: res.paths.map((path: string) =>\n this.#queues.get(path),\n ) as Handler[][],\n dirs: [...res.dirs].map(path => this.#queues.get(path)) as (\n | Handler\n | Set<Handler>\n )[][],\n }\n }\n\n // check if fn is first in line for all its paths, and is\n // included in the first set for all its dir queues\n check(fn: Handler) {\n const { paths, dirs } = this.#getQueues(fn)\n return (\n paths.every(q => q && q[0] === fn) &&\n dirs.every(q => q && q[0] instanceof Set && q[0].has(fn))\n )\n }\n\n // run the function if it's first in line and not already running\n #run(fn: Handler) {\n if (this.#running.has(fn) || !this.check(fn)) {\n return false\n }\n this.#running.add(fn)\n fn(() => this.#clear(fn))\n return true\n }\n\n #clear(fn: Handler) {\n if (!this.#running.has(fn)) {\n return false\n }\n const res = this.#reservations.get(fn)\n /* c8 ignore start */\n if (!res) {\n throw new Error('invalid reservation')\n }\n /* c8 ignore stop */\n const { paths, dirs } = res\n\n const next = new Set<Handler>()\n for (const path of paths) {\n const q = this.#queues.get(path)\n /* c8 ignore start */\n if (!q || q?.[0] !== fn) {\n continue\n }\n /* c8 ignore stop */\n const q0 = q[1]\n if (!q0) {\n this.#queues.delete(path)\n continue\n }\n q.shift()\n if (typeof q0 === 'function') {\n next.add(q0)\n } else {\n for (const f of q0) {\n next.add(f)\n }\n }\n }\n\n for (const dir of dirs) {\n const q = this.#queues.get(dir)\n const q0 = q?.[0]\n /* c8 ignore next - type safety only */\n if (!q || !(q0 instanceof Set)) continue\n if (q0.size === 1 && q.length === 1) {\n this.#queues.delete(dir)\n continue\n } else if (q0.size === 1) {\n q.shift()\n // next one must be a function,\n // or else the Set would've been reused\n const n = q[0]\n if (typeof n === 'function') {\n next.add(n)\n }\n } else {\n q0.delete(fn)\n }\n }\n\n this.#running.delete(fn)\n next.forEach(fn => this.#run(fn))\n return true\n }\n}\n","// warning: extremely hot code path.\n// This has been meticulously optimized for use\n// within npm install on large package trees.\n// Do not edit without careful benchmarking.\nconst normalizeCache: Record<string, string> = Object.create(null)\n\n// Limit the size of this. Very low-sophistication LRU cache\nconst MAX = 10000\nconst cache = new Set<string>()\nexport const normalizeUnicode = (s: string): string => {\n if (!cache.has(s)) {\n // shake out identical accents and ligatures\n normalizeCache[s] = s\n .normalize('NFD')\n .toLocaleLowerCase('en')\n .toLocaleUpperCase('en')\n } else {\n cache.delete(s)\n }\n cache.add(s)\n\n const ret = normalizeCache[s] as string\n\n let i = cache.size - MAX\n // only prune when we're 10% over the max\n if (i > MAX / 10) {\n for (const s of cache) {\n cache.delete(s)\n delete normalizeCache[s]\n if (--i <= 0) break\n }\n }\n\n return ret\n}\n","// separate file so I stop getting nagged in vim about deprecated API.\nexport const umask = () => process.umask()\n","// tar -r\nimport { WriteStream, WriteStreamSync } from '@isaacs/fs-minipass'\nimport type { Minipass } from 'minipass'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { Header } from './header.js'\nimport { list } from './list.js'\nimport { makeCommand } from './make-command.js'\nimport type { TarOptionsFile, TarOptionsSyncFile } from './options.js'\nimport { isFile } from './options.js'\nimport { Pack, PackSync } from './pack.js'\n\n// starting at the head of the file, read a Header\n// If the checksum is invalid, that's our position to start writing\n// If it is, jump forward by the specified size (round up to 512)\n// and try again.\n// Write the new Pack stream starting there.\n\nconst replaceSync = (opt: TarOptionsSyncFile, files: string[]) => {\n const p = new PackSync(opt)\n\n let threw = true\n let fd\n let position\n\n try {\n try {\n fd = fs.openSync(opt.file, 'r+')\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') {\n fd = fs.openSync(opt.file, 'w+')\n } else {\n throw er\n }\n }\n\n const st = fs.fstatSync(fd)\n const headBuf = Buffer.alloc(512)\n\n POSITION: for (position = 0; position < st.size; position += 512) {\n for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) {\n bytes = fs.readSync(\n fd,\n headBuf,\n bufPos,\n headBuf.length - bufPos,\n position + bufPos,\n )\n\n if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) {\n throw new Error('cannot append to compressed archives')\n }\n\n if (!bytes) {\n break POSITION\n }\n }\n\n const h = new Header(headBuf)\n if (!h.cksumValid) {\n break\n }\n const entryBlockSize = 512 * Math.ceil((h.size || 0) / 512)\n if (position + entryBlockSize + 512 > st.size) {\n break\n }\n // the 512 for the header we just parsed will be added as well\n // also jump ahead all the blocks for the body\n position += entryBlockSize\n if (opt.mtimeCache && h.mtime) {\n opt.mtimeCache.set(String(h.path), h.mtime)\n }\n }\n threw = false\n\n streamSync(opt, p, position, fd, files)\n } finally {\n if (threw) {\n try {\n fs.closeSync(fd as number)\n } catch {}\n }\n }\n}\n\nconst streamSync = (\n opt: TarOptionsSyncFile,\n p: Pack,\n position: number,\n fd: number,\n files: string[],\n) => {\n const stream = new WriteStreamSync(opt.file, {\n fd: fd,\n start: position,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n addFilesSync(p, files)\n}\n\nconst replaceAsync = (\n opt: TarOptionsFile,\n files: string[],\n): Promise<void> => {\n files = Array.from(files)\n const p = new Pack(opt)\n\n const getPos = (\n fd: number,\n size: number,\n cb_: (er?: null | Error, pos?: number) => void,\n ) => {\n const cb = (er?: Error | null, pos?: number) => {\n if (er) {\n fs.close(fd, _ => cb_(er))\n } else {\n cb_(null, pos)\n }\n }\n\n let position = 0\n if (size === 0) {\n return cb(null, 0)\n }\n\n let bufPos = 0\n const headBuf = Buffer.alloc(512)\n const onread = (er?: null | Error, bytes?: number): void => {\n if (er || bytes === undefined) {\n return cb(er)\n }\n bufPos += bytes\n if (bufPos < 512 && bytes) {\n return fs.read(\n fd,\n headBuf,\n bufPos,\n headBuf.length - bufPos,\n position + bufPos,\n onread,\n )\n }\n\n if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) {\n return cb(new Error('cannot append to compressed archives'))\n }\n\n // truncated header\n if (bufPos < 512) {\n return cb(null, position)\n }\n\n const h = new Header(headBuf)\n if (!h.cksumValid) {\n return cb(null, position)\n }\n\n /* c8 ignore next */\n const entryBlockSize = 512 * Math.ceil((h.size ?? 0) / 512)\n if (position + entryBlockSize + 512 > size) {\n return cb(null, position)\n }\n\n position += entryBlockSize + 512\n if (position >= size) {\n return cb(null, position)\n }\n\n if (opt.mtimeCache && h.mtime) {\n opt.mtimeCache.set(String(h.path), h.mtime)\n }\n bufPos = 0\n fs.read(fd, headBuf, 0, 512, position, onread)\n }\n fs.read(fd, headBuf, 0, 512, position, onread)\n }\n\n const promise = new Promise<void>((resolve, reject) => {\n p.on('error', reject)\n let flag = 'r+'\n const onopen = (er?: NodeJS.ErrnoException | null, fd?: number) => {\n if (er && er.code === 'ENOENT' && flag === 'r+') {\n flag = 'w+'\n return fs.open(opt.file, flag, onopen)\n }\n\n if (er || !fd) {\n return reject(er)\n }\n\n fs.fstat(fd, (er, st) => {\n if (er) {\n return fs.close(fd, () => reject(er))\n }\n\n getPos(fd, st.size, (er, position) => {\n if (er) {\n return reject(er)\n }\n const stream = new WriteStream(opt.file, {\n fd: fd,\n start: position,\n })\n p.pipe(stream as unknown as Minipass.Writable)\n stream.on('error', reject)\n stream.on('close', resolve)\n addFilesAsync(p, files)\n })\n })\n }\n fs.open(opt.file, flag, onopen)\n })\n\n return promise\n}\n\nconst addFilesSync = (p: Pack, files: string[]) => {\n files.forEach(file => {\n if (file.charAt(0) === '@') {\n list({\n file: path.resolve(p.cwd, file.slice(1)),\n sync: true,\n noResume: true,\n onReadEntry: entry => p.add(entry),\n })\n } else {\n p.add(file)\n }\n })\n p.end()\n}\n\nconst addFilesAsync = async (p: Pack, files: string[]): Promise<void> => {\n for (const file of files) {\n if (file.charAt(0) === '@') {\n await list({\n file: path.resolve(String(p.cwd), file.slice(1)),\n noResume: true,\n onReadEntry: entry => p.add(entry),\n })\n } else {\n p.add(file)\n }\n }\n p.end()\n}\n\nexport const replace = makeCommand(\n replaceSync,\n replaceAsync,\n /* c8 ignore start */\n (): never => {\n throw new TypeError('file is required')\n },\n (): never => {\n throw new TypeError('file is required')\n },\n /* c8 ignore stop */\n (opt, entries) => {\n if (!isFile(opt)) {\n throw new TypeError('file is required')\n }\n\n if (\n opt.gzip ||\n opt.brotli ||\n opt.zstd ||\n opt.file.endsWith('.br') ||\n opt.file.endsWith('.tbr')\n ) {\n throw new TypeError('cannot append to compressed archives')\n }\n\n if (!entries?.length) {\n throw new TypeError('no paths specified to add/replace')\n }\n },\n)\n","// tar -u\n\nimport { makeCommand } from './make-command.js'\nimport { type TarOptionsWithAliases } from './options.js'\n\nimport { replace as r } from './replace.js'\n\n// just call tar.r with the filter and mtimeCache\nexport const update = makeCommand(\n r.syncFile,\n r.asyncFile,\n r.syncNoFile,\n r.asyncNoFile,\n (opt, entries = []) => {\n r.validate?.(opt, entries)\n mtimeFilter(opt)\n },\n)\n\nconst mtimeFilter = (opt: TarOptionsWithAliases) => {\n const filter = opt.filter\n\n if (!opt.mtimeCache) {\n opt.mtimeCache = new Map()\n }\n\n opt.filter =\n filter ?\n (path, stat) =>\n filter(path, stat) &&\n !(\n /* c8 ignore start */\n (\n (opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) >\n (stat.mtime ?? 0)\n )\n /* c8 ignore stop */\n )\n : (path, stat) =>\n !(\n /* c8 ignore start */\n (\n (opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) >\n (stat.mtime ?? 0)\n )\n /* c8 ignore stop */\n )\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as tar from \"tar\";\n\n/**\n * Check if a directory exists and is empty (contains no files or subdirectories).\n * Returns: { exists: boolean, empty: boolean }\n * - Non-existent path: { exists: false, empty: true }\n * - Existing empty directory: { exists: true, empty: true }\n * - Existing non-empty directory: { exists: true, empty: false }\n * - Existing file (not directory): { exists: true, empty: false }\n */\nexport function checkDirectoryStatus(dirPath: string): {\n exists: boolean;\n empty: boolean;\n} {\n if (!fs.existsSync(dirPath)) {\n return { exists: false, empty: true };\n }\n\n const stat = fs.statSync(dirPath);\n if (!stat.isDirectory()) {\n // Path exists but is a file, not a directory\n return { exists: true, empty: false };\n }\n\n const entries = fs.readdirSync(dirPath);\n return { exists: true, empty: entries.length === 0 };\n}\n\n/**\n * Format bytes to human-readable format\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n}\n\n/**\n * Format relative time from ISO date string\n */\nexport function formatRelativeTime(isoDate: string): string {\n const date = new Date(isoDate);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n const diffWeek = Math.floor(diffDay / 7);\n\n if (diffSec < 60) return \"just now\";\n if (diffMin < 60) return `${diffMin} minute${diffMin === 1 ? \"\" : \"s\"} ago`;\n if (diffHour < 24) return `${diffHour} hour${diffHour === 1 ? \"\" : \"s\"} ago`;\n if (diffDay < 7) return `${diffDay} day${diffDay === 1 ? \"\" : \"s\"} ago`;\n return `${diffWeek} week${diffWeek === 1 ? \"\" : \"s\"} ago`;\n}\n\n/**\n * Filter function for tar.create to exclude .vm0 directory.\n * Paths come as \"./.vm0\" or \".vm0\" depending on tar version.\n */\nexport function excludeVm0Filter(filePath: string): boolean {\n const shouldExclude =\n filePath === \".vm0\" ||\n filePath.startsWith(\".vm0/\") ||\n filePath.startsWith(\"./.vm0\");\n return !shouldExclude;\n}\n\n/**\n * List files in tar.gz buffer using streaming parser.\n */\nexport function listTarFiles(tarPath: string): Promise<string[]> {\n return new Promise((resolve, reject) => {\n const files: string[] = [];\n\n tar\n .list({\n file: tarPath,\n onReadEntry: (entry) => {\n if (entry.type === \"File\") {\n files.push(entry.path);\n }\n },\n })\n .then(() => {\n return resolve(files);\n })\n .catch(reject);\n });\n}\n\n/**\n * Recursively list all files in a directory, excluding specified directories.\n * Returns relative paths from the base directory.\n */\nasync function listLocalFiles(\n dir: string,\n excludeDirs: string[] = [\".vm0\"],\n): Promise<string[]> {\n const files: string[] = [];\n\n async function walkDir(currentDir: string, relativePath: string = \"\") {\n const entries = await fs.promises.readdir(currentDir, {\n withFileTypes: true,\n });\n\n for (const entry of entries) {\n const entryRelativePath = relativePath\n ? path.join(relativePath, entry.name)\n : entry.name;\n\n if (entry.isDirectory()) {\n if (!excludeDirs.includes(entry.name)) {\n await walkDir(path.join(currentDir, entry.name), entryRelativePath);\n }\n } else {\n files.push(entryRelativePath);\n }\n }\n }\n\n await walkDir(dir);\n return files;\n}\n\n/**\n * Remove files that exist locally but not in remote.\n * Returns the number of files removed.\n */\nexport async function removeExtraFiles(\n dir: string,\n remoteFiles: Set<string>,\n excludeDirs: string[] = [\".vm0\"],\n): Promise<number> {\n const localFiles = await listLocalFiles(dir, excludeDirs);\n let removedCount = 0;\n\n for (const localFile of localFiles) {\n // Normalize path separators for comparison\n const normalizedPath = localFile.replace(/\\\\/g, \"/\");\n if (!remoteFiles.has(normalizedPath)) {\n const fullPath = path.join(dir, localFile);\n await fs.promises.unlink(fullPath);\n removedCount++;\n }\n }\n\n // Clean up empty directories\n await removeEmptyDirs(dir, excludeDirs);\n\n return removedCount;\n}\n\n/**\n * Recursively remove empty directories, excluding specified directories.\n */\nasync function removeEmptyDirs(\n dir: string,\n excludeDirs: string[] = [\".vm0\"],\n): Promise<boolean> {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n let isEmpty = true;\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (excludeDirs.includes(entry.name)) {\n isEmpty = false;\n } else {\n const subDirEmpty = await removeEmptyDirs(fullPath, excludeDirs);\n if (subDirEmpty) {\n await fs.promises.rmdir(fullPath);\n } else {\n isEmpty = false;\n }\n }\n } else {\n isEmpty = false;\n }\n }\n\n return isEmpty;\n}\n","import { mainRunCommand } from \"./run\";\nimport { resumeCommand } from \"./resume\";\nimport { continueCommand } from \"./continue\";\nimport { listCommand } from \"./list\";\nimport { killCommand } from \"./kill\";\nimport { queueCommand } from \"./queue\";\n\n// Add subcommands to the main run command\nmainRunCommand.addCommand(resumeCommand);\nmainRunCommand.addCommand(continueCommand);\nmainRunCommand.addCommand(listCommand);\nmainRunCommand.addCommand(killCommand);\nmainRunCommand.addCommand(queueCommand);\n\nexport const runCommand = mainRunCommand;\n","import { Command, Option } from \"commander\";\nimport {\n getComposeById,\n getComposeByName,\n getComposeVersion,\n createRun,\n} from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectVolumeVersions,\n isUUID,\n extractVarNames,\n extractSecretNames,\n loadValues,\n parsePermissionPolicies,\n parseIdentifier,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport {\n startSilentUpgrade,\n waitForSilentUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nexport const mainRunCommand = new Command()\n .name(\"run\")\n .description(\"Run an agent\")\n .argument(\n \"<agent-name>\",\n \"Agent reference: name[:version] (e.g., 'my-agent', 'my-agent:abc123', 'my-agent:latest')\",\n )\n .argument(\"<prompt>\", \"Prompt for the agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\"--artifact-name <name>\", \"Artifact storage name (required for run)\")\n .option(\n \"--artifact-version <hash>\",\n \"Artifact version hash (defaults to latest)\",\n )\n .option(\n \"--volume-version <name=version>\",\n \"Volume version override (repeatable, format: volumeName=version)\",\n collectVolumeVersions,\n {},\n )\n .option(\"--memory <name>\", \"Memory storage name\")\n .option(\n \"--conversation <id>\",\n \"Resume from conversation ID (for fine-grained control)\",\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .option(\n \"--capture-network-bodies\",\n \"Capture HTTP request headers, request bodies, and response bodies in network logs\",\n )\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--no-auto-update\").hideHelp())\n .action(\n withErrorHandler(\n async (\n identifier: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n artifactName?: string;\n artifactVersion?: string;\n memory?: string;\n volumeVersion: Record<string, string>;\n conversation?: string;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n captureNetworkBodies?: boolean;\n debugNoMockClaude?: boolean;\n autoUpdate?: boolean;\n },\n ) => {\n // Start upgrade in background at command start (runs in parallel)\n if (options.autoUpdate !== false) {\n await startSilentUpgrade(__CLI_VERSION__);\n }\n\n // 1. Parse identifier for optional version specifier\n const { name, version } = parseIdentifier(identifier);\n\n // 2. Resolve name to composeId and get compose content\n let composeId: string;\n let composeContent: unknown;\n\n if (isUUID(name)) {\n // It's a UUID compose ID - fetch compose to get content\n const compose = await getComposeById(name);\n composeId = compose.id;\n composeContent = compose.content;\n } else {\n // It's an agent name - resolve to compose ID\n const compose = await getComposeByName(name);\n if (!compose) {\n throw new Error(`Agent not found: ${identifier}`, {\n cause: new Error(\n \"Make sure you've composed the agent with: vm0 compose\",\n ),\n });\n }\n\n composeId = compose.id;\n composeContent = compose.content;\n }\n\n // 3. Resolve version if specified\n let agentComposeVersionId: string | undefined;\n\n if (version && version !== \"latest\") {\n // Resolve version hash to full version ID\n try {\n const versionInfo = await getComposeVersion(composeId, version);\n agentComposeVersionId = versionInfo.versionId;\n } catch (error) {\n throw new Error(`Version not found: ${version}`, {\n cause: error instanceof Error ? error : undefined,\n });\n }\n }\n // Note: \"latest\" version uses agentComposeId which resolves to HEAD\n\n // 4. Load vars and secrets with priority: CLI args > --env-file > env vars\n const varNames = extractVarNames(composeContent);\n const vars = loadValues(options.vars, varNames, options.envFile);\n\n const secretNames = extractSecretNames(composeContent);\n const secrets = loadValues(\n options.secrets,\n secretNames,\n options.envFile,\n );\n\n // 5. Call unified API (server handles all variable expansion)\n const response = await createRun({\n // Use agentComposeVersionId if resolved, otherwise use agentComposeId (resolves to HEAD)\n ...(agentComposeVersionId\n ? { agentComposeVersionId }\n : { agentComposeId: composeId }),\n prompt,\n vars,\n secrets,\n artifactName: options.artifactName,\n artifactVersion: options.artifactVersion,\n memoryName: options.memory,\n volumeVersions:\n Object.keys(options.volumeVersion).length > 0\n ? options.volumeVersion\n : undefined,\n conversationId: options.conversation,\n appendSystemPrompt: options.appendSystemPrompt,\n disallowedTools: options.disallowedTools,\n tools: options.tools,\n settings: options.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies,\n ),\n captureNetworkBodies: options.captureNetworkBodies || undefined,\n debugNoMockClaude: options.debugNoMockClaude || undefined,\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const result = await pollEvents(response.runId, {\n verbose: options.verbose,\n });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n\n // Wait for upgrade at command end (shows warning if failed)\n if (options.autoUpdate !== false) {\n await waitForSilentUpgrade();\n }\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { getCheckpoint, createRun } from \"../../lib/api\";\nimport {\n collectKeyValue,\n collectVolumeVersions,\n isUUID,\n loadValues,\n parsePermissionPolicies,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const resumeCommand = new Command()\n .name(\"resume\")\n .description(\"Resume an agent run from a checkpoint (uses all snapshot data)\")\n .argument(\"<checkpointId>\", \"Checkpoint ID to resume from\")\n .argument(\"<prompt>\", \"Prompt for the resumed agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--volume-version <name=version>\",\n \"Volume version override (repeatable)\",\n collectVolumeVersions,\n {},\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .action(\n withErrorHandler(\n async (\n checkpointId: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n },\n command: { optsWithGlobals: () => Record<string, unknown> },\n ) => {\n // Commander.js quirk: when parent command has same option name,\n // the option value goes to parent. Use optsWithGlobals() to get all options.\n const allOpts = command.optsWithGlobals() as {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n volumeVersion: Record<string, string>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n };\n\n // Merge vars and secrets from command options\n const vars = { ...allOpts.vars, ...options.vars };\n const secrets = { ...allOpts.secrets, ...options.secrets };\n\n // 1. Validate checkpoint ID format\n if (!isUUID(checkpointId)) {\n throw new Error(`Invalid checkpoint ID format: ${checkpointId}`, {\n cause: new Error(\"Checkpoint ID must be a valid UUID\"),\n });\n }\n\n // 2. Fetch checkpoint info to get required secret names\n // This allows loading secrets from environment variables\n const checkpointInfo = await getCheckpoint(checkpointId);\n const requiredSecretNames =\n checkpointInfo.agentComposeSnapshot.secretNames || [];\n\n // 3. Load secrets from CLI options + --env-file + environment variables\n // Priority: CLI flags > --env-file > env vars\n const envFile = options.envFile || allOpts.envFile;\n const loadedSecrets = loadValues(secrets, requiredSecretNames, envFile);\n\n // 4. Call unified API with checkpointId\n const response = await createRun({\n checkpointId,\n prompt,\n vars: Object.keys(vars).length > 0 ? vars : undefined,\n secrets: loadedSecrets,\n volumeVersions:\n Object.keys(allOpts.volumeVersion).length > 0\n ? allOpts.volumeVersion\n : undefined,\n appendSystemPrompt:\n options.appendSystemPrompt || allOpts.appendSystemPrompt,\n disallowedTools: options.disallowedTools || allOpts.disallowedTools,\n tools: options.tools || allOpts.tools,\n settings: options.settings || allOpts.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies || allOpts.permissionPolicies,\n ),\n debugNoMockClaude:\n options.debugNoMockClaude || allOpts.debugNoMockClaude || undefined,\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const verbose = options.verbose || allOpts.verbose;\n const result = await pollEvents(response.runId, { verbose });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport { getSession, createRun } from \"../../lib/api\";\nimport {\n collectKeyValue,\n isUUID,\n loadValues,\n parsePermissionPolicies,\n pollEvents,\n showNextSteps,\n renderRunCreated,\n} from \"./shared\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const continueCommand = new Command()\n .name(\"continue\")\n .description(\n \"Continue an agent run from a session (uses latest artifact version)\",\n )\n .argument(\"<agentSessionId>\", \"Agent session ID to continue from\")\n .argument(\"<prompt>\", \"Prompt for the continued agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\n \"--vars <KEY=value>\",\n \"Variables for ${{ vars.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--secrets <KEY=value>\",\n \"Secrets for ${{ secrets.xxx }} (repeatable, falls back to --env-file or env vars)\",\n collectKeyValue,\n {},\n )\n .option(\n \"--append-system-prompt <text>\",\n \"Append text to the agent's system prompt\",\n )\n .option(\n \"--disallowed-tools <tools...>\",\n \"Tools to disable in Claude CLI (e.g., CronCreate WebSearch)\",\n )\n .option(\n \"--tools <tools...>\",\n \"Built-in tools to make available in Claude CLI (e.g., Bash Edit Read)\",\n )\n .option(\n \"--settings <json>\",\n \"Settings JSON to pass to Claude CLI (e.g., hooks, permissions)\",\n )\n .option(\n \"--permission-policies <json>\",\n 'Permission policies JSON (e.g., \\'{\"github\": {\"actions:read\": \"allow\"}}\\')',\n )\n .option(\"--verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .action(\n withErrorHandler(\n async (\n agentSessionId: string,\n prompt: string,\n options: {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n },\n command: { optsWithGlobals: () => Record<string, unknown> },\n ) => {\n // Commander.js quirk: when parent command has same option name,\n // the option value goes to parent. Use optsWithGlobals() to get all options.\n const allOpts = command.optsWithGlobals() as {\n envFile?: string;\n vars: Record<string, string>;\n secrets: Record<string, string>;\n appendSystemPrompt?: string;\n disallowedTools?: string[];\n tools?: string[];\n settings?: string;\n permissionPolicies?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n };\n\n // Merge vars and secrets from command options\n const vars = { ...allOpts.vars, ...options.vars };\n const secrets = { ...allOpts.secrets, ...options.secrets };\n\n // 1. Validate session ID format\n if (!isUUID(agentSessionId)) {\n throw new Error(\n `Invalid agent session ID format: ${agentSessionId}`,\n { cause: new Error(\"Agent session ID must be a valid UUID\") },\n );\n }\n\n // 2. Fetch session info to get required secret names\n // This allows loading secrets from environment variables\n const sessionInfo = await getSession(agentSessionId);\n const requiredSecretNames = sessionInfo.secretNames || [];\n\n // 3. Load secrets from CLI options + --env-file + environment variables\n // Priority: CLI flags > --env-file > env vars\n const envFile = options.envFile || allOpts.envFile;\n const loadedSecrets = loadValues(secrets, requiredSecretNames, envFile);\n\n // 4. Call unified API with sessionId\n const response = await createRun({\n sessionId: agentSessionId,\n prompt,\n vars: Object.keys(vars).length > 0 ? vars : undefined,\n secrets: loadedSecrets,\n appendSystemPrompt:\n options.appendSystemPrompt || allOpts.appendSystemPrompt,\n disallowedTools: options.disallowedTools || allOpts.disallowedTools,\n tools: options.tools || allOpts.tools,\n settings: options.settings || allOpts.settings,\n permissionPolicies: parsePermissionPolicies(\n options.permissionPolicies || allOpts.permissionPolicies,\n ),\n debugNoMockClaude:\n options.debugNoMockClaude || allOpts.debugNoMockClaude || undefined,\n });\n\n // 4. Check for immediate failure (e.g., missing secrets)\n if (response.status === \"failed\") {\n throw new Error(\n \"Run preparation failed\",\n response.error ? { cause: new Error(response.error) } : undefined,\n );\n }\n\n // 5. Display run started/queued info\n renderRunCreated(response);\n\n // 6. Poll for events and exit with appropriate code\n const verbose = options.verbose || allOpts.verbose;\n const result = await pollEvents(response.runId, { verbose });\n if (!result.succeeded) {\n throw new Error(\"Run failed\");\n }\n showNextSteps(result);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listRuns } from \"../../lib/api\";\nimport { formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport { ALL_RUN_STATUSES, type RunStatus, type RunListItem } from \"@vm0/core\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/** Standard UUID string length (with hyphens) */\nconst UUID_LENGTH = 36;\n\n/** All valid status values as a string for help text */\nconst VALID_STATUSES = ALL_RUN_STATUSES.join(\",\");\n\n/**\n * Command options type\n */\ninterface ListOptions {\n status?: string;\n all?: boolean;\n agent?: string;\n since?: string;\n until?: string;\n limit?: string;\n}\n\n/**\n * Format run status with color and optional padding\n */\nfunction formatRunStatus(status: RunStatus, width?: number): string {\n const paddedStatus = width ? status.padEnd(width) : status;\n switch (status) {\n case \"queued\":\n return chalk.blue(paddedStatus);\n case \"running\":\n return chalk.green(paddedStatus);\n case \"pending\":\n return chalk.yellow(paddedStatus);\n case \"completed\":\n return chalk.dim(paddedStatus);\n case \"failed\":\n case \"timeout\":\n return chalk.red(paddedStatus);\n default:\n return paddedStatus;\n }\n}\n\n/**\n * Validate and parse status filter from options\n */\nfunction parseStatusFilter(options: ListOptions): string | undefined {\n if (options.all) {\n return VALID_STATUSES;\n }\n\n if (options.status) {\n const values = options.status.split(\",\").map((s) => {\n return s.trim();\n });\n for (const v of values) {\n if (!ALL_RUN_STATUSES.includes(v as RunStatus)) {\n throw new Error(`Invalid status \"${v}\"`, {\n cause: new Error(`Valid values: ${VALID_STATUSES}`),\n });\n }\n }\n return values.join(\",\");\n }\n\n if (options.since) {\n // Implicit all when --since is used\n return VALID_STATUSES;\n }\n\n // undefined = backend default (pending,running)\n return undefined;\n}\n\n/**\n * Parse time option to ISO string\n */\nfunction parseTimeOption(value: string, optionName: string): string {\n try {\n return new Date(parseTime(value)).toISOString();\n } catch {\n throw new Error(\n `Invalid ${optionName} format. Use ISO (2026-01-01) or relative (1h, 7d, 30d)`,\n );\n }\n}\n\n/**\n * Parse and validate limit option\n */\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 100) {\n throw new Error(\"--limit must be between 1 and 100\");\n }\n return limit;\n}\n\n/**\n * Display runs in table format\n */\nfunction displayRuns(runs: RunListItem[]): void {\n // Calculate column widths\n const agentWidth = Math.max(\n 5,\n ...runs.map((r) => {\n return r.agentName.length;\n }),\n );\n const statusWidth = Math.max(\n 6,\n ...runs.map((r) => {\n return r.status.length;\n }),\n );\n\n // Print header\n const header = [\n \"ID\".padEnd(UUID_LENGTH),\n \"AGENT\".padEnd(agentWidth),\n \"STATUS\".padEnd(statusWidth),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const run of runs) {\n const row = [\n run.id.padEnd(UUID_LENGTH),\n run.agentName.padEnd(agentWidth),\n formatRunStatus(run.status, statusWidth),\n formatRelativeTime(run.createdAt),\n ].join(\" \");\n console.log(row);\n }\n}\n\n/**\n * Display empty state message\n */\nfunction displayEmptyState(hasFilters: boolean): void {\n if (hasFilters) {\n console.log(chalk.dim(\"No runs found matching filters\"));\n } else {\n console.log(chalk.dim(\"No active runs\"));\n console.log(chalk.dim(' Run: vm0 run <agent> \"<prompt>\"'));\n }\n}\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List runs\")\n .option(\n \"--status <status,...>\",\n `Filter by status: ${VALID_STATUSES} (default: pending,running)`,\n )\n .option(\"--all\", \"Show all statuses (mutually exclusive with --status)\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--since <date>\", \"Start time (ISO format or relative: 1h, 7d, 30d)\")\n .option(\"--until <date>\", \"End time (defaults to now)\")\n .option(\"--limit <n>\", \"Maximum number of results (default: 50, max: 100)\")\n .action(\n withErrorHandler(async (options: ListOptions) => {\n // Validate mutual exclusion\n if (options.all && options.status) {\n throw new Error(\"--all and --status are mutually exclusive\");\n }\n\n // Parse options\n const statusFilter = parseStatusFilter(options);\n const since = options.since\n ? parseTimeOption(options.since, \"--since\")\n : undefined;\n const until = options.until\n ? parseTimeOption(options.until, \"--until\")\n : undefined;\n const limit = parseLimit(options.limit);\n\n // Validate since < until\n if (since && until && new Date(since) >= new Date(until)) {\n throw new Error(\"--since must be before --until\");\n }\n\n // Fetch runs with filters\n const response = await listRuns({\n status: statusFilter,\n agent: options.agent,\n since,\n until,\n limit,\n });\n\n const runs = response.runs;\n\n if (runs.length === 0) {\n const hasFilters = !!(\n options.status ||\n options.all ||\n options.agent ||\n options.since\n );\n displayEmptyState(hasFilters);\n return;\n }\n\n displayRuns(runs);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cancelRun } from \"../../lib/api\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const killCommand = new Command()\n .name(\"kill\")\n .description(\"Kill (cancel) a pending or running run\")\n .argument(\"<run-id>\", \"Run ID to kill\")\n .action(\n withErrorHandler(async (runId: string) => {\n await cancelRun(runId);\n console.log(chalk.green(`✓ Run ${runId} cancelled`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getRunQueue } from \"../../lib/api\";\nimport { formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const queueCommand = new Command()\n .name(\"queue\")\n .description(\"Show org run queue status\")\n .action(\n withErrorHandler(async () => {\n const data = await getRunQueue();\n const { concurrency, queue } = data;\n\n // Concurrency header\n const limitDisplay =\n concurrency.limit === 0\n ? \"unlimited\"\n : `${concurrency.active}/${concurrency.limit} slots used`;\n console.log(`Concurrency: ${limitDisplay} (${concurrency.tier} tier)`);\n\n // Queue status\n if (queue.length === 0) {\n console.log(chalk.dim(\"Queue: empty — all slots available\"));\n return;\n }\n\n console.log(\n `Queue: ${queue.length} run${queue.length > 1 ? \"s\" : \"\"} waiting`,\n );\n console.log();\n\n // Dynamic column widths\n const posWidth = Math.max(1, String(queue.length).length);\n const agentWidth = Math.max(\n 5,\n ...queue.map((e) => {\n return (e.agentName ?? \"-\").length;\n }),\n );\n const emailWidth = Math.max(\n 4,\n ...queue.map((e) => {\n return (e.userEmail ?? \"-\").length;\n }),\n );\n\n // Header\n const header = [\n \"#\".padEnd(posWidth),\n \"AGENT\".padEnd(agentWidth),\n \"USER\".padEnd(emailWidth),\n \"CREATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Rows\n for (const entry of queue) {\n const marker = entry.runId !== null ? chalk.cyan(\" ← you\") : \"\";\n const row = [\n String(entry.position).padEnd(posWidth),\n (entry.agentName ?? \"-\").padEnd(agentWidth),\n (entry.userEmail ?? \"-\").padEnd(emailWidth),\n formatRelativeTime(entry.createdAt),\n ].join(\" \");\n console.log(row + marker);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init\";\nimport { pushCommand } from \"./push\";\nimport { pullCommand } from \"./pull\";\nimport { statusCommand } from \"./status\";\nimport { listCommand } from \"./list\";\nimport { cloneCommand } from \"./clone\";\n\nexport const volumeCommand = new Command()\n .name(\"volume\")\n .description(\"Manage volumes (defined in compose, not versioned after run)\")\n .addCommand(initCommand)\n .addCommand(pushCommand)\n .addCommand(pullCommand)\n .addCommand(statusCommand)\n .addCommand(listCommand)\n .addCommand(cloneCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport {\n isValidStorageName,\n writeStorageConfig,\n readStorageConfig,\n} from \"../../lib/storage/storage-utils\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize a volume in the current directory\")\n .option(\"-n, --name <name>\", \"Volume name (required in non-interactive mode)\")\n .action(\n withErrorHandler(async (options: { name?: string }) => {\n const cwd = process.cwd();\n const dirName = path.basename(cwd);\n\n // Check if storage config already exists\n const existingConfig = await readStorageConfig(cwd);\n if (existingConfig) {\n console.log(\n chalk.yellow(`Volume already initialized: ${existingConfig.name}`),\n );\n console.log(\n chalk.dim(`Config file: ${path.join(cwd, \".vm0\", \"storage.yaml\")}`),\n );\n return;\n }\n\n // Determine volume name\n let volumeName: string;\n\n if (options.name) {\n // Use provided name (non-interactive mode)\n volumeName = options.name;\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 volume init --name <volume-name>\"),\n });\n } else {\n // Interactive prompt with directory name as default\n const defaultName = isValidStorageName(dirName) ? dirName : undefined;\n const name = await promptText(\n \"Enter volume name\",\n defaultName,\n (value: string) => {\n if (!isValidStorageName(value)) {\n return \"Must be 3-64 characters, lowercase alphanumeric with hyphens\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n volumeName = name;\n }\n\n // Validate volume name\n if (!isValidStorageName(volumeName)) {\n throw new Error(`Invalid volume name: \"${volumeName}\"`, {\n cause: new Error(\n \"Volume names must be 3-64 characters, lowercase alphanumeric with hyphens\",\n ),\n });\n }\n\n // Write config file\n await writeStorageConfig(volumeName, cwd);\n\n console.log(chalk.green(`✓ Initialized volume: ${volumeName}`));\n console.log(\n chalk.dim(\n ` Config saved to ${path.join(cwd, \".vm0\", \"storage.yaml\")}`,\n ),\n );\n }),\n );\n","import { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport path from \"path\";\n\n/**\n * Storage type\n * - \"volume\": Static storage that doesn't auto-version after runs\n * - \"artifact\": Work products that auto-version after runs\n */\nexport type StorageType = \"volume\" | \"artifact\" | \"memory\";\n\ninterface StorageConfig {\n name: string;\n type: StorageType;\n}\n\nconst CONFIG_DIR = \".vm0\";\nconst CONFIG_FILE = \"storage.yaml\";\n\n/**\n * Validate storage name format\n * Length: 3-64 characters\n * Characters: lowercase letters, numbers, hyphens\n * Must start and end with alphanumeric\n * No consecutive hyphens\n */\nexport function isValidStorageName(name: string): boolean {\n if (name.length < 3 || name.length > 64) {\n return false;\n }\n const pattern = /^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/;\n return pattern.test(name) && !name.includes(\"--\");\n}\n\n/**\n * Read storage config from .vm0/storage.yaml\n * Also supports legacy .vm0/volume.yaml for backward compatibility\n */\nexport async function readStorageConfig(\n basePath: string = process.cwd(),\n): Promise<StorageConfig | null> {\n const configPath = path.join(basePath, CONFIG_DIR, CONFIG_FILE);\n const legacyConfigPath = path.join(basePath, CONFIG_DIR, \"volume.yaml\");\n\n // Check for new config file first, then legacy\n let actualPath: string | null = null;\n if (existsSync(configPath)) {\n actualPath = configPath;\n } else if (existsSync(legacyConfigPath)) {\n actualPath = legacyConfigPath;\n }\n\n if (!actualPath) {\n return null;\n }\n\n const content = await readFile(actualPath, \"utf8\");\n const config = parseYaml(content) as StorageConfig;\n\n // Default to \"volume\" type for backward compatibility\n if (!config.type) {\n config.type = \"volume\";\n }\n\n return config;\n}\n\n/**\n * Write storage config to .vm0/storage.yaml\n */\nexport async function writeStorageConfig(\n storageName: string,\n basePath: string = process.cwd(),\n type: StorageType = \"volume\",\n): Promise<void> {\n const configDir = path.join(basePath, CONFIG_DIR);\n const configPath = path.join(configDir, CONFIG_FILE);\n\n // Create .vm0 directory if it doesn't exist\n if (!existsSync(configDir)) {\n await mkdir(configDir, { recursive: true });\n }\n\n const config: StorageConfig = {\n name: storageName,\n type,\n };\n\n const yamlContent = stringifyYaml(config);\n await writeFile(configPath, yamlContent, \"utf8\");\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { directUpload } from \"../../lib/storage/direct-upload\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pushCommand = new Command()\n .name(\"push\")\n .description(\"Push local files to cloud volume\")\n .option(\n \"-f, --force\",\n \"Force upload even if content unchanged (recreate archive)\",\n )\n .action(\n withErrorHandler(async (options: { force?: boolean }) => {\n const cwd = process.cwd();\n\n // Read storage config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n console.log(`Pushing volume: ${config.name}`);\n\n // Perform direct S3 upload\n const result = await directUpload(config.name, \"volume\", cwd, {\n onProgress: (message) => {\n console.log(chalk.dim(message));\n },\n force: options.force,\n });\n\n // Display short version (8 characters) by default\n const shortVersion = result.versionId.slice(0, 8);\n\n if (result.empty) {\n console.log(chalk.dim(\"No files found (empty volume)\"));\n } else if (result.deduplicated) {\n console.log(chalk.green(\"✓ Content unchanged (deduplicated)\"));\n } else {\n console.log(chalk.green(\"✓ Upload complete\"));\n }\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${result.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(result.size)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload } from \"../../lib/api\";\nimport {\n formatBytes,\n listTarFiles,\n removeExtraFiles,\n} from \"../../lib/utils/file-utils\";\nimport { handleEmptyStorageResponse } from \"../../lib/storage/pull-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pullCommand = new Command()\n .name(\"pull\")\n .description(\"Pull cloud files to local directory\")\n .argument(\"[versionId]\", \"Version ID to pull (default: latest)\")\n .action(\n withErrorHandler(async (versionId?: string) => {\n const cwd = process.cwd();\n\n // Read storage config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n if (versionId) {\n console.log(`Pulling volume: ${config.name} (version: ${versionId})`);\n } else {\n console.log(`Pulling volume: ${config.name}`);\n }\n\n // Get download URL from API\n console.log(chalk.dim(\"Getting download URL...\"));\n\n const downloadInfo = await getStorageDownload({\n name: config.name,\n type: \"volume\",\n version: versionId,\n });\n\n // Handle empty volume\n if (\"empty\" in downloadInfo) {\n await handleEmptyStorageResponse(cwd);\n return;\n }\n\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download directly from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"volume.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get remote files list for sync\n console.log(chalk.dim(\"Syncing local files...\"));\n const remoteFiles = await listTarFiles(tarPath);\n const remoteFilesSet = new Set(\n remoteFiles.map((f) => {\n return f.replace(/\\\\/g, \"/\");\n }),\n );\n\n // Remove local files not in remote\n const removedCount = await removeExtraFiles(cwd, remoteFilesSet);\n if (removedCount > 0) {\n console.log(\n chalk.green(`✓ Removed ${removedCount} files not in remote`),\n );\n }\n\n // Extract tar.gz\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: cwd,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${remoteFiles.length} files`));\n }),\n );\n","import chalk from \"chalk\";\nimport { removeExtraFiles } from \"../utils/file-utils\";\n\n/**\n * Result of handling an empty storage response (HTTP 204).\n */\ninterface EmptyStorageResult {\n removedCount: number;\n}\n\n/**\n * Handle empty storage response (HTTP 204 No Content).\n * Syncs local directory to empty state by removing all tracked files.\n *\n * @param cwd - Current working directory\n * @returns Result with count of removed files\n */\nexport async function handleEmptyStorageResponse(\n cwd: string,\n): Promise<EmptyStorageResult> {\n console.log(chalk.dim(\"Syncing local files...\"));\n\n // Sync to empty state - remove all local files\n const removedCount = await removeExtraFiles(cwd, new Set());\n\n if (removedCount > 0) {\n console.log(chalk.green(`✓ Removed ${removedCount} files not in remote`));\n }\n\n console.log(chalk.green(\"✓ Synced (0 files)\"));\n\n return { removedCount };\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload, ApiRequestError } from \"../../lib/api\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show status of cloud volume\")\n .action(\n withErrorHandler(async () => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No volume initialized in this directory\", {\n cause: new Error(\"Run: vm0 volume init\"),\n });\n }\n\n if (config.type !== \"volume\") {\n throw new Error(\n \"This directory is initialized as an artifact, not a volume\",\n { cause: new Error(\"Use: vm0 artifact status\") },\n );\n }\n\n // Start message\n console.log(`Checking volume: ${config.name}`);\n\n // Call API\n try {\n const info = await getStorageDownload({\n name: config.name,\n type: \"volume\",\n });\n const shortVersion = info.versionId.slice(0, 8);\n\n if (\"empty\" in info) {\n console.log(chalk.green(\"✓ Found (empty)\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n } else {\n console.log(chalk.green(\"✓ Found\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${info.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(info.size)}`));\n }\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"Not found on remote\", {\n cause: new Error(\"Run: vm0 volume push\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listStorages } from \"../../lib/api\";\nimport { formatBytes, formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all remote volumes\")\n .action(\n withErrorHandler(async () => {\n // Call API\n const items = await listStorages({ type: \"volume\" });\n\n if (items.length === 0) {\n console.log(chalk.dim(\"No volumes found\"));\n console.log(\n chalk.dim(\" Create one with: vm0 volume init && vm0 volume push\"),\n );\n return;\n }\n\n // Calculate column widths\n const nameWidth = Math.max(\n 4,\n ...items.map((i) => {\n return i.name.length;\n }),\n );\n const sizeWidth = Math.max(\n 4,\n ...items.map((i) => {\n return formatBytes(i.size).length;\n }),\n );\n const filesWidth = Math.max(\n 5,\n ...items.map((i) => {\n return i.fileCount.toString().length;\n }),\n );\n\n // Print header\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"SIZE\".padStart(sizeWidth),\n \"FILES\".padStart(filesWidth),\n \"UPDATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const item of items) {\n const row = [\n item.name.padEnd(nameWidth),\n formatBytes(item.size).padStart(sizeWidth),\n item.fileCount.toString().padStart(filesWidth),\n formatRelativeTime(item.updatedAt),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const cloneCommand = new Command()\n .name(\"clone\")\n .description(\"Clone a remote volume to local directory (latest version)\")\n .argument(\"<name>\", \"Volume name to clone\")\n .argument(\"[destination]\", \"Destination directory (default: volume name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n // Use volume name as destination if not specified\n const targetDir = destination || name;\n\n console.log(`Cloning volume: ${name}`);\n\n const result = await cloneStorage(name, \"volume\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully cloned volume: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { writeStorageConfig, type StorageType } from \"./storage-utils\";\nimport { getStorageDownload } from \"../api\";\nimport {\n listTarFiles,\n formatBytes,\n checkDirectoryStatus,\n} from \"../utils/file-utils\";\n\ninterface CloneOptions {\n version?: string;\n}\n\ninterface CloneResult {\n success: boolean;\n fileCount: number;\n size: number;\n versionId: string;\n}\n\n/**\n * Clone a remote storage to a local directory\n * Creates the directory, downloads contents, and initializes .vm0 config\n */\nexport async function cloneStorage(\n name: string,\n type: StorageType,\n destination: string,\n options: CloneOptions = {},\n): Promise<CloneResult> {\n const typeLabel = type;\n\n // Check if destination already exists and is non-empty\n const dirStatus = checkDirectoryStatus(destination);\n if (dirStatus.exists && !dirStatus.empty) {\n throw new Error(`Directory \"${destination}\" is not empty`);\n }\n\n // Check if storage exists on remote\n console.log(chalk.dim(`Checking remote ${typeLabel}...`));\n\n const downloadInfo = await getStorageDownload({\n name,\n type,\n version: options.version,\n });\n\n // Create destination directory\n console.log(chalk.dim(`Creating directory: ${destination}/`));\n await fs.promises.mkdir(destination, { recursive: true });\n\n // Handle empty storage (type guard)\n if (\"empty\" in downloadInfo) {\n // Create .vm0 directory and config\n await writeStorageConfig(name, destination, type);\n\n console.log(chalk.green(`✓ Cloned empty ${typeLabel}: ${name}`));\n console.log(chalk.dim(`✓ Initialized .vm0/storage.yaml`));\n\n return {\n success: true,\n fileCount: 0,\n size: 0,\n versionId: downloadInfo.versionId,\n };\n }\n\n // TypeScript now knows downloadInfo has url property\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n // Clean up directory on failure\n await fs.promises.rm(destination, { recursive: true, force: true });\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-clone-\"));\n const tarPath = path.join(tmpDir, \"archive.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get file list from tar\n const files = await listTarFiles(tarPath);\n\n // Extract tar.gz to destination\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: destination,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${files.length} files`));\n\n // Create .vm0 directory and config\n await writeStorageConfig(name, destination, type);\n console.log(chalk.green(`✓ Initialized .vm0/storage.yaml`));\n\n return {\n success: true,\n fileCount: downloadInfo.fileCount,\n size: downloadInfo.size,\n versionId: downloadInfo.versionId,\n };\n}\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init\";\nimport { pushCommand } from \"./push\";\nimport { pullCommand } from \"./pull\";\nimport { statusCommand } from \"./status\";\nimport { listCommand } from \"./list\";\nimport { cloneCommand } from \"./clone\";\n\nexport const artifactCommand = new Command()\n .name(\"artifact\")\n .description(\"Manage artifacts (specified at run, versioned after run)\")\n .addCommand(initCommand)\n .addCommand(pushCommand)\n .addCommand(pullCommand)\n .addCommand(statusCommand)\n .addCommand(listCommand)\n .addCommand(cloneCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport {\n isValidStorageName,\n writeStorageConfig,\n readStorageConfig,\n} from \"../../lib/storage/storage-utils\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize an artifact in the current directory\")\n .option(\n \"-n, --name <name>\",\n \"Artifact name (required in non-interactive mode)\",\n )\n .action(\n withErrorHandler(async (options: { name?: string }) => {\n const cwd = process.cwd();\n const dirName = path.basename(cwd);\n\n // Check if config already exists\n const existingConfig = await readStorageConfig(cwd);\n if (existingConfig) {\n if (existingConfig.type === \"artifact\") {\n console.log(\n chalk.yellow(\n `Artifact already initialized: ${existingConfig.name}`,\n ),\n );\n } else {\n console.log(\n chalk.yellow(\n `Directory already initialized as volume: ${existingConfig.name}`,\n ),\n );\n console.log(\n chalk.dim(\n \" To change type, delete .vm0/storage.yaml and reinitialize\",\n ),\n );\n }\n console.log(\n chalk.dim(`Config file: ${path.join(cwd, \".vm0\", \"storage.yaml\")}`),\n );\n return;\n }\n\n // Determine artifact name\n let artifactName: string;\n\n if (options.name) {\n // Use provided name (non-interactive mode)\n artifactName = options.name;\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 artifact init --name <artifact-name>\"),\n });\n } else {\n // Interactive prompt with directory name as default\n const defaultName = isValidStorageName(dirName) ? dirName : undefined;\n const name = await promptText(\n \"Enter artifact name\",\n defaultName,\n (value: string) => {\n if (!isValidStorageName(value)) {\n return \"Must be 3-64 characters, lowercase alphanumeric with hyphens\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n artifactName = name;\n }\n\n // Validate name\n if (!isValidStorageName(artifactName)) {\n throw new Error(`Invalid artifact name: \"${artifactName}\"`, {\n cause: new Error(\n \"Artifact names must be 3-64 characters, lowercase alphanumeric with hyphens\",\n ),\n });\n }\n\n // Write config file with type: artifact\n await writeStorageConfig(artifactName, cwd, \"artifact\");\n\n console.log(chalk.green(`✓ Initialized artifact: ${artifactName}`));\n console.log(\n chalk.dim(\n ` Config saved to ${path.join(cwd, \".vm0\", \"storage.yaml\")}`,\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { directUpload } from \"../../lib/storage/direct-upload\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pushCommand = new Command()\n .name(\"push\")\n .description(\"Push local files to cloud artifact\")\n .option(\n \"-f, --force\",\n \"Force upload even if content unchanged (recreate archive)\",\n )\n .action(\n withErrorHandler(async (options: { force?: boolean }) => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume push\") },\n );\n }\n\n console.log(`Pushing artifact: ${config.name}`);\n\n // Perform direct S3 upload\n const result = await directUpload(config.name, \"artifact\", cwd, {\n onProgress: (message) => {\n console.log(chalk.dim(message));\n },\n force: options.force,\n });\n\n // Display short version (8 characters) by default\n const shortVersion = result.versionId.slice(0, 8);\n\n if (result.empty) {\n console.log(chalk.dim(\"No files found (empty artifact)\"));\n } else if (result.deduplicated) {\n console.log(chalk.green(\"✓ Content unchanged (deduplicated)\"));\n } else {\n console.log(chalk.green(\"✓ Upload complete\"));\n }\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${result.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(result.size)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as tar from \"tar\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload } from \"../../lib/api\";\nimport {\n formatBytes,\n listTarFiles,\n removeExtraFiles,\n} from \"../../lib/utils/file-utils\";\nimport { handleEmptyStorageResponse } from \"../../lib/storage/pull-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pullCommand = new Command()\n .name(\"pull\")\n .description(\"Pull cloud artifact to local directory\")\n .argument(\"[versionId]\", \"Version ID to pull (default: latest)\")\n .action(\n withErrorHandler(async (versionId?: string) => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume pull\") },\n );\n }\n\n if (versionId) {\n console.log(`Pulling artifact: ${config.name} (version: ${versionId})`);\n } else {\n console.log(`Pulling artifact: ${config.name}`);\n }\n\n // Get download URL from API\n console.log(chalk.dim(\"Getting download URL...\"));\n\n const downloadInfo = await getStorageDownload({\n name: config.name,\n type: \"artifact\",\n version: versionId,\n });\n\n // Handle empty artifact\n if (\"empty\" in downloadInfo) {\n await handleEmptyStorageResponse(cwd);\n return;\n }\n\n const downloadUrl = downloadInfo.url;\n if (!downloadUrl) {\n throw new Error(\"No download URL returned\");\n }\n\n // Download directly from S3\n console.log(chalk.dim(\"Downloading from S3...\"));\n const s3Response = await fetch(downloadUrl);\n\n if (!s3Response.ok) {\n throw new Error(`S3 download failed: ${s3Response.status}`);\n }\n\n // Get tar.gz buffer\n const arrayBuffer = await s3Response.arrayBuffer();\n const tarBuffer = Buffer.from(arrayBuffer);\n\n console.log(chalk.green(`✓ Downloaded ${formatBytes(tarBuffer.length)}`));\n\n // Save tar.gz to temp file for processing\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"vm0-\"));\n const tarPath = path.join(tmpDir, \"artifact.tar.gz\");\n await fs.promises.writeFile(tarPath, tarBuffer);\n\n // Get remote files list for sync\n console.log(chalk.dim(\"Syncing local files...\"));\n const remoteFiles = await listTarFiles(tarPath);\n const remoteFilesSet = new Set(\n remoteFiles.map((f) => {\n return f.replace(/\\\\/g, \"/\");\n }),\n );\n\n // Remove local files not in remote\n const removedCount = await removeExtraFiles(cwd, remoteFilesSet);\n if (removedCount > 0) {\n console.log(\n chalk.green(`✓ Removed ${removedCount} files not in remote`),\n );\n }\n\n // Extract tar.gz\n console.log(chalk.dim(\"Extracting files...\"));\n await tar.extract({\n file: tarPath,\n cwd: cwd,\n gzip: true,\n });\n\n // Clean up temp files\n await fs.promises.unlink(tarPath);\n await fs.promises.rmdir(tmpDir);\n\n console.log(chalk.green(`✓ Extracted ${remoteFiles.length} files`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload, ApiRequestError } from \"../../lib/api\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show status of cloud artifact\")\n .action(\n withErrorHandler(async () => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No artifact initialized in this directory\", {\n cause: new Error(\"Run: vm0 artifact init\"),\n });\n }\n\n if (config.type !== \"artifact\") {\n throw new Error(\n \"This directory is initialized as a volume, not an artifact\",\n { cause: new Error(\"Use: vm0 volume status\") },\n );\n }\n\n // Start message\n console.log(`Checking artifact: ${config.name}`);\n\n // Call API\n try {\n const info = await getStorageDownload({\n name: config.name,\n type: \"artifact\",\n });\n const shortVersion = info.versionId.slice(0, 8);\n\n if (\"empty\" in info) {\n console.log(chalk.green(\"✓ Found (empty)\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n } else {\n console.log(chalk.green(\"✓ Found\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${info.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(info.size)}`));\n }\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"Not found on remote\", {\n cause: new Error(\"Run: vm0 artifact push\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listStorages } from \"../../lib/api\";\nimport { formatBytes, formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all remote artifacts\")\n .action(\n withErrorHandler(async () => {\n // Call API\n const items = await listStorages({ type: \"artifact\" });\n\n if (items.length === 0) {\n console.log(chalk.dim(\"No artifacts found\"));\n console.log(\n chalk.dim(\n \" Create one with: vm0 artifact init && vm0 artifact push\",\n ),\n );\n return;\n }\n\n // Calculate column widths\n const nameWidth = Math.max(\n 4,\n ...items.map((i) => {\n return i.name.length;\n }),\n );\n const sizeWidth = Math.max(\n 4,\n ...items.map((i) => {\n return formatBytes(i.size).length;\n }),\n );\n const filesWidth = Math.max(\n 5,\n ...items.map((i) => {\n return i.fileCount.toString().length;\n }),\n );\n\n // Print header\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"SIZE\".padStart(sizeWidth),\n \"FILES\".padStart(filesWidth),\n \"UPDATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const item of items) {\n const row = [\n item.name.padEnd(nameWidth),\n formatBytes(item.size).padStart(sizeWidth),\n item.fileCount.toString().padStart(filesWidth),\n formatRelativeTime(item.updatedAt),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const cloneCommand = new Command()\n .name(\"clone\")\n .description(\"Clone a remote artifact to local directory (latest version)\")\n .argument(\"<name>\", \"Artifact name to clone\")\n .argument(\"[destination]\", \"Destination directory (default: artifact name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n // Use artifact name as destination if not specified\n const targetDir = destination || name;\n\n console.log(`Cloning artifact: ${name}`);\n\n const result = await cloneStorage(name, \"artifact\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully cloned artifact: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init\";\nimport { pushCommand } from \"./push\";\nimport { pullCommand } from \"./pull\";\nimport { statusCommand } from \"./status\";\nimport { listCommand } from \"./list\";\nimport { cloneCommand } from \"./clone\";\n\nexport const memoryCommand = new Command()\n .name(\"memory\")\n .description(\"Manage agent long-term memory\")\n .addCommand(initCommand)\n .addCommand(pushCommand)\n .addCommand(pullCommand)\n .addCommand(statusCommand)\n .addCommand(listCommand)\n .addCommand(cloneCommand);\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport {\n isValidStorageName,\n writeStorageConfig,\n readStorageConfig,\n} from \"../../lib/storage/storage-utils\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize a memory in the current directory\")\n .option(\"-n, --name <name>\", \"Memory name (required in non-interactive mode)\")\n .action(\n withErrorHandler(async (options: { name?: string }) => {\n const cwd = process.cwd();\n const dirName = path.basename(cwd);\n\n // Check if config already exists\n const existingConfig = await readStorageConfig(cwd);\n if (existingConfig) {\n if (existingConfig.type === \"memory\") {\n console.log(\n chalk.yellow(`Memory already initialized: ${existingConfig.name}`),\n );\n } else {\n console.log(\n chalk.yellow(\n `Directory already initialized as ${existingConfig.type}: ${existingConfig.name}`,\n ),\n );\n console.log(\n chalk.dim(\n \" To change type, delete .vm0/storage.yaml and reinitialize\",\n ),\n );\n }\n console.log(\n chalk.dim(`Config file: ${path.join(cwd, \".vm0\", \"storage.yaml\")}`),\n );\n return;\n }\n\n // Determine memory name\n let memoryName: string;\n\n if (options.name) {\n memoryName = options.name;\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 memory init --name <memory-name>\"),\n });\n } else {\n // Interactive prompt with directory name as default\n const defaultName = isValidStorageName(dirName) ? dirName : undefined;\n const name = await promptText(\n \"Enter memory name\",\n defaultName,\n (value: string) => {\n if (!isValidStorageName(value)) {\n return \"Must be 3-64 characters, lowercase alphanumeric with hyphens\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n memoryName = name;\n }\n\n // Validate name\n if (!isValidStorageName(memoryName)) {\n throw new Error(`Invalid memory name: \"${memoryName}\"`, {\n cause: new Error(\n \"Memory names must be 3-64 characters, lowercase alphanumeric with hyphens\",\n ),\n });\n }\n\n // Write config file with type: memory\n await writeStorageConfig(memoryName, cwd, \"memory\");\n\n console.log(chalk.green(`✓ Initialized memory: ${memoryName}`));\n console.log(\n chalk.dim(\n ` Config saved to ${path.join(cwd, \".vm0\", \"storage.yaml\")}`,\n ),\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { directUpload } from \"../../lib/storage/direct-upload\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pushCommand = new Command()\n .name(\"push\")\n .description(\"Push local files to cloud memory\")\n .option(\n \"-f, --force\",\n \"Force upload even if content unchanged (recreate archive)\",\n )\n .action(\n withErrorHandler(async (options: { force?: boolean }) => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No memory initialized in this directory\", {\n cause: new Error(\"Run: vm0 memory init\"),\n });\n }\n\n if (config.type !== \"memory\") {\n throw new Error(\n `This directory is initialized as ${config.type === \"artifact\" ? \"an artifact\" : \"a volume\"}, not a memory`,\n { cause: new Error(`Use: vm0 ${config.type} push`) },\n );\n }\n\n console.log(`Pushing memory: ${config.name}`);\n\n // Perform direct S3 upload\n const result = await directUpload(config.name, \"memory\", cwd, {\n onProgress: (message) => {\n console.log(chalk.dim(message));\n },\n force: options.force,\n });\n\n // Display short version (8 characters) by default\n const shortVersion = result.versionId.slice(0, 8);\n\n if (result.empty) {\n console.log(chalk.dim(\"No files found (empty memory)\"));\n } else if (result.deduplicated) {\n console.log(chalk.green(\"✓ Content unchanged (deduplicated)\"));\n } else {\n console.log(chalk.green(\"✓ Upload complete\"));\n }\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${result.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(result.size)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const pullCommand = new Command()\n .name(\"pull\")\n .description(\"Pull remote memory to local directory (latest version)\")\n .argument(\"[name]\", \"Memory name to pull\", \"memory\")\n .argument(\"[destination]\", \"Destination directory (default: memory name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n const targetDir = destination || name;\n\n console.log(`Pulling memory: ${name}`);\n\n const result = await cloneStorage(name, \"memory\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully pulled memory: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { getStorageDownload, ApiRequestError } from \"../../lib/api\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const statusCommand = new Command()\n .name(\"status\")\n .description(\"Show status of cloud memory\")\n .action(\n withErrorHandler(async () => {\n const cwd = process.cwd();\n\n // Read config\n const config = await readStorageConfig(cwd);\n if (!config) {\n throw new Error(\"No memory initialized in this directory\", {\n cause: new Error(\"Run: vm0 memory init\"),\n });\n }\n\n if (config.type !== \"memory\") {\n throw new Error(\n `This directory is initialized as ${config.type === \"artifact\" ? \"an artifact\" : \"a volume\"}, not a memory`,\n { cause: new Error(`Use: vm0 ${config.type} status`) },\n );\n }\n\n // Start message\n console.log(`Checking memory: ${config.name}`);\n\n // Call API\n try {\n const info = await getStorageDownload({\n name: config.name,\n type: \"memory\",\n });\n const shortVersion = info.versionId.slice(0, 8);\n\n if (\"empty\" in info) {\n console.log(chalk.green(\"✓ Found (empty)\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n } else {\n console.log(chalk.green(\"✓ Found\"));\n console.log(chalk.dim(` Version: ${shortVersion}`));\n console.log(chalk.dim(` Files: ${info.fileCount.toLocaleString()}`));\n console.log(chalk.dim(` Size: ${formatBytes(info.size)}`));\n }\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 404) {\n throw new Error(\"Not found on remote\", {\n cause: new Error(\"Run: vm0 memory push\"),\n });\n }\n throw error;\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { listStorages } from \"../../lib/api\";\nimport { formatBytes, formatRelativeTime } from \"../../lib/utils/file-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const listCommand = new Command()\n .name(\"list\")\n .alias(\"ls\")\n .description(\"List all remote memory storages\")\n .action(\n withErrorHandler(async () => {\n const items = await listStorages({ type: \"memory\" });\n\n if (items.length === 0) {\n console.log(chalk.dim(\"No memory storages found\"));\n console.log(\n chalk.dim(\" Memory is created automatically on first agent run\"),\n );\n return;\n }\n\n // Calculate column widths\n const nameWidth = Math.max(\n 4,\n ...items.map((i) => {\n return i.name.length;\n }),\n );\n const sizeWidth = Math.max(\n 4,\n ...items.map((i) => {\n return formatBytes(i.size).length;\n }),\n );\n const filesWidth = Math.max(\n 5,\n ...items.map((i) => {\n return i.fileCount.toString().length;\n }),\n );\n\n // Print header\n const header = [\n \"NAME\".padEnd(nameWidth),\n \"SIZE\".padStart(sizeWidth),\n \"FILES\".padStart(filesWidth),\n \"UPDATED\",\n ].join(\" \");\n console.log(chalk.dim(header));\n\n // Print rows\n for (const item of items) {\n const row = [\n item.name.padEnd(nameWidth),\n formatBytes(item.size).padStart(sizeWidth),\n item.fileCount.toString().padStart(filesWidth),\n formatRelativeTime(item.updatedAt),\n ].join(\" \");\n console.log(row);\n }\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { cloneStorage } from \"../../lib/storage/clone-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nexport const cloneCommand = new Command()\n .name(\"clone\")\n .description(\"Clone a remote memory to local directory (latest version)\")\n .argument(\"<name>\", \"Memory name to clone\")\n .argument(\"[destination]\", \"Destination directory (default: memory name)\")\n .action(\n withErrorHandler(async (name: string, destination: string | undefined) => {\n // Use memory name as destination if not specified\n const targetDir = destination || name;\n\n console.log(`Cloning memory: ${name}`);\n\n const result = await cloneStorage(name, \"memory\", targetDir);\n\n console.log(chalk.green(`\\n✓ Successfully cloned memory: ${name}`));\n console.log(chalk.dim(` Location: ${targetDir}/`));\n console.log(chalk.dim(` Version: ${result.versionId.slice(0, 8)}`));\n }),\n );\n","import { cookAction } from \"./cook\";\nimport { logsCommand } from \"./logs\";\nimport { continueCommand } from \"./continue\";\nimport { resumeCommand } from \"./resume\";\n\n// Add subcommands to the cook command\ncookAction.addCommand(logsCommand);\ncookAction.addCommand(continueCommand);\ncookAction.addCommand(resumeCommand);\n\nexport const cookCommand = cookAction;\n","import { Command, Option } from \"commander\";\nimport chalk from \"chalk\";\nimport { readFile, mkdir } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport path from \"path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { validateAgentCompose } from \"../../lib/domain/yaml-validator\";\nimport { readStorageConfig } from \"../../lib/storage/storage-utils\";\nimport { checkAndUpgrade } from \"../../lib/utils/update-checker\";\nimport { saveCookState } from \"../../lib/domain/cook-state\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n CONFIG_FILE,\n ARTIFACT_DIR,\n printCommand,\n execVm0Command,\n execVm0RunWithCapture,\n parseRunIdsFromOutput,\n autoPullArtifact,\n} from \"./utils\";\n\ndeclare const __CLI_VERSION__: string;\n\ninterface VolumeConfig {\n name: string;\n version: string;\n}\n\ninterface AgentConfig {\n description?: string;\n framework: string;\n volumes?: string[];\n environment?: Record<string, string>;\n}\n\ninterface AgentComposeConfig {\n version: string;\n agents: Record<string, AgentConfig>;\n volumes?: Record<string, VolumeConfig>;\n}\n\ninterface LoadedConfig {\n config: AgentComposeConfig;\n agentName: string;\n volumeCount: number;\n}\n\n/**\n * Load and validate the compose config file.\n * Returns parsed config or exits on error.\n */\nasync function loadAndValidateConfig(): Promise<LoadedConfig> {\n console.log(chalk.bold(`Reading config: ${CONFIG_FILE}`));\n\n if (!existsSync(CONFIG_FILE)) {\n throw new Error(`Config file not found: ${CONFIG_FILE}`);\n }\n\n let config: AgentComposeConfig;\n try {\n const content = await readFile(CONFIG_FILE, \"utf8\");\n config = parseYaml(content) as AgentComposeConfig;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\"Invalid YAML format\", { cause: error });\n }\n throw new Error(\"Invalid YAML format\");\n }\n\n const validation = validateAgentCompose(config);\n if (!validation.valid) {\n throw new Error(validation.error);\n }\n\n const agentNames = Object.keys(config.agents);\n const agentName = agentNames[0]!;\n const volumeCount = config.volumes ? Object.keys(config.volumes).length : 0;\n\n console.log(\n chalk.green(`✓ Config validated: 1 agent, ${volumeCount} volume(s)`),\n );\n\n return { config, agentName, volumeCount };\n}\n\n/**\n * Process and push all volumes defined in config.\n */\nasync function processVolumes(\n config: AgentComposeConfig,\n cwd: string,\n): Promise<void> {\n if (!config.volumes || Object.keys(config.volumes).length === 0) {\n return;\n }\n\n console.log();\n console.log(chalk.bold(\"Processing volumes:\"));\n\n for (const volumeConfig of Object.values(config.volumes)) {\n const volumeDir = path.join(cwd, volumeConfig.name);\n\n if (!existsSync(volumeDir)) {\n throw new Error(`Directory not found: ${volumeConfig.name}`, {\n cause: new Error(\"Create the directory and add files first\"),\n });\n }\n\n try {\n printCommand(`cd ${volumeConfig.name}`);\n\n // Check if already initialized\n const existingConfig = await readStorageConfig(volumeDir);\n if (!existingConfig) {\n printCommand(`vm0 volume init --name ${volumeConfig.name}`);\n await execVm0Command([\"volume\", \"init\", \"--name\", volumeConfig.name], {\n cwd: volumeDir,\n silent: true,\n });\n }\n\n // Push volume\n printCommand(\"vm0 volume push\");\n await execVm0Command([\"volume\", \"push\"], {\n cwd: volumeDir,\n silent: true,\n });\n\n printCommand(\"cd ..\");\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\"Volume processing failed\", { cause: error });\n }\n throw error;\n }\n }\n}\n\n/**\n * Initialize and push artifact directory.\n */\nasync function processArtifact(cwd: string): Promise<string> {\n console.log();\n console.log(chalk.bold(\"Processing artifact:\"));\n\n const artifactDir = path.join(cwd, ARTIFACT_DIR);\n\n try {\n // Create directory if not exists\n if (!existsSync(artifactDir)) {\n printCommand(`mkdir ${ARTIFACT_DIR}`);\n await mkdir(artifactDir, { recursive: true });\n }\n\n printCommand(`cd ${ARTIFACT_DIR}`);\n\n // Check if already initialized\n const existingConfig = await readStorageConfig(artifactDir);\n if (!existingConfig) {\n printCommand(`vm0 artifact init --name ${ARTIFACT_DIR}`);\n await execVm0Command([\"artifact\", \"init\", \"--name\", ARTIFACT_DIR], {\n cwd: artifactDir,\n silent: true,\n });\n }\n\n // Push artifact\n printCommand(\"vm0 artifact push\");\n await execVm0Command([\"artifact\", \"push\"], {\n cwd: artifactDir,\n silent: true,\n });\n\n printCommand(\"cd ..\");\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\"Artifact processing failed\", { cause: error });\n }\n throw error;\n }\n\n return artifactDir;\n}\n\n/**\n * Compose the agent using vm0 compose command.\n */\nasync function composeAgent(cwd: string, skipConfirm: boolean): Promise<void> {\n console.log();\n console.log(chalk.bold(\"Composing agent:\"));\n const composeArgs = skipConfirm\n ? [\"compose\", \"--yes\", CONFIG_FILE]\n : [\"compose\", CONFIG_FILE];\n printCommand(`vm0 ${composeArgs.join(\" \")}`);\n\n try {\n await execVm0Command(composeArgs, { cwd });\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\"Compose failed\", { cause: error });\n }\n throw error;\n }\n}\n\n/**\n * Run the agent with the given prompt.\n */\nasync function runAgent(\n agentName: string,\n artifactDir: string,\n prompt: string,\n cwd: string,\n options: {\n envFile?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n },\n): Promise<void> {\n console.log();\n console.log(chalk.bold(\"Running agent:\"));\n printCommand(\n `vm0 run ${agentName} --artifact-name ${ARTIFACT_DIR} \"${prompt}\"`,\n );\n console.log();\n\n const runArgs = [\n \"run\",\n agentName,\n \"--artifact-name\",\n ARTIFACT_DIR,\n ...(options.envFile ? [\"--env-file\", options.envFile] : []),\n ...(options.verbose ? [\"--verbose\"] : []),\n ...(options.debugNoMockClaude ? [\"--debug-no-mock-claude\"] : []),\n prompt,\n ];\n const runOutput = await execVm0RunWithCapture(runArgs, { cwd });\n\n // Save session state for continue/resume commands\n const runIds = parseRunIdsFromOutput(runOutput);\n if (runIds.runId || runIds.sessionId || runIds.checkpointId) {\n await saveCookState({\n lastRunId: runIds.runId,\n lastSessionId: runIds.sessionId,\n lastCheckpointId: runIds.checkpointId,\n });\n }\n\n // Auto-pull artifact if run completed with artifact changes\n await autoPullArtifact(runOutput, artifactDir);\n}\n\nexport const cookAction = new Command()\n .name(\"cook\")\n .description(\"Quick start: prepare, compose and run agent from vm0.yaml\")\n .argument(\"[prompt]\", \"Prompt for the agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-v, --verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .addOption(new Option(\"--no-auto-update\").hideHelp())\n .action(\n withErrorHandler(\n async (\n prompt: string | undefined,\n options: {\n envFile?: string;\n yes?: boolean;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n autoUpdate?: boolean;\n },\n ) => {\n // Step 0: Check for updates and auto-upgrade if needed\n // Note: --no-auto-update sets autoUpdate to false\n if (options.autoUpdate !== false) {\n const shouldExit = await checkAndUpgrade(__CLI_VERSION__, prompt);\n if (shouldExit) {\n process.exit(0);\n }\n }\n\n const cwd = process.cwd();\n\n // Step 1: Load and validate config\n const { config, agentName } = await loadAndValidateConfig();\n\n // Step 2: Process volumes\n await processVolumes(config, cwd);\n\n // Step 3: Process artifact\n const artifactDir = await processArtifact(cwd);\n\n // Step 4: Compose agent\n await composeAgent(cwd, options.yes ?? false);\n\n // Step 5: Run agent (if prompt provided)\n if (prompt) {\n await runAgent(agentName, artifactDir, prompt, cwd, {\n envFile: options.envFile,\n verbose: options.verbose,\n debugNoMockClaude: options.debugNoMockClaude,\n });\n } else {\n console.log();\n console.log(\"To run your agent:\");\n printCommand(\n `vm0 run ${agentName} --artifact-name ${ARTIFACT_DIR} \"your prompt\"`,\n );\n }\n },\n ),\n );\n","import { homedir } from \"os\";\nimport { join } from \"path\";\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { existsSync } from \"fs\";\n\nconst CONFIG_DIR = join(homedir(), \".vm0\");\nconst COOK_STATE_FILE = join(CONFIG_DIR, \"cook.json\");\nconst STALE_THRESHOLD_MS = 48 * 60 * 60 * 1000; // 48 hours\n\n// Public API interface (unchanged for backward compatibility)\ninterface CookState {\n lastRunId?: string;\n lastSessionId?: string;\n lastCheckpointId?: string;\n}\n\n// Internal storage structure\ninterface CookStateEntry {\n lastRunId?: string;\n lastSessionId?: string;\n lastCheckpointId?: string;\n lastActiveAt: number;\n}\n\ninterface CookStateFile {\n ppid: Record<string, CookStateEntry>;\n}\n\n/**\n * Load cook state file with automatic migration from old format\n */\nasync function loadCookStateFile(): Promise<CookStateFile> {\n if (!existsSync(COOK_STATE_FILE)) {\n return { ppid: {} };\n }\n\n try {\n const content = await readFile(COOK_STATE_FILE, \"utf8\");\n const data = JSON.parse(content) as Record<string, unknown>;\n\n // Detect old format (no ppid field)\n if (!data.ppid) {\n // Migrate old data to current PPID\n const oldState = data as CookState;\n return {\n ppid: {\n [String(process.ppid)]: {\n lastRunId: oldState.lastRunId,\n lastSessionId: oldState.lastSessionId,\n lastCheckpointId: oldState.lastCheckpointId,\n lastActiveAt: Date.now(),\n },\n },\n };\n }\n\n return data as unknown as CookStateFile;\n } catch {\n // If file is corrupted, return empty state\n return { ppid: {} };\n }\n}\n\nexport async function loadCookState(): Promise<CookState> {\n const file = await loadCookStateFile();\n const ppid = String(process.ppid);\n const entry = file.ppid[ppid];\n\n if (!entry) return {};\n\n return {\n lastRunId: entry.lastRunId,\n lastSessionId: entry.lastSessionId,\n lastCheckpointId: entry.lastCheckpointId,\n };\n}\n\nexport async function saveCookState(state: CookState): Promise<void> {\n // Ensure config directory exists\n await mkdir(CONFIG_DIR, { recursive: true });\n\n const file = await loadCookStateFile();\n const ppid = String(process.ppid);\n const now = Date.now();\n\n // Clean up stale entries (older than 48 hours)\n for (const key of Object.keys(file.ppid)) {\n const entry = file.ppid[key];\n if (entry && now - entry.lastActiveAt > STALE_THRESHOLD_MS) {\n delete file.ppid[key];\n }\n }\n\n // Merge with existing entry for this PPID\n const existing = file.ppid[ppid];\n file.ppid[ppid] = {\n lastRunId: state.lastRunId ?? existing?.lastRunId,\n lastSessionId: state.lastSessionId ?? existing?.lastSessionId,\n lastCheckpointId: state.lastCheckpointId ?? existing?.lastCheckpointId,\n lastActiveAt: now,\n };\n\n // Write state file\n await writeFile(COOK_STATE_FILE, JSON.stringify(file, null, 2), \"utf8\");\n}\n","import chalk from \"chalk\";\nimport { existsSync } from \"fs\";\nimport { safeSpawn } from \"../../lib/utils/spawn\";\n\nexport const CONFIG_FILE = \"vm0.yaml\";\nexport const ARTIFACT_DIR = \"artifact\";\n\n/**\n * Print a command hint for tutorial output\n */\nexport function printCommand(cmd: string): void {\n console.log(chalk.dim(`> ${cmd}`));\n}\n\n/**\n * Execute a vm0 command in a subprocess\n * Returns stdout on success, throws on failure with stderr\n *\n * @param options.silent - If true, capture stdout/stderr (no output to terminal)\n */\nexport function execVm0Command(\n args: string[],\n options: { cwd?: string; silent?: boolean } = {},\n): Promise<string> {\n return new Promise((resolve, reject) => {\n // Determine stdio configuration:\n // - silent: pipe all (capture output, no terminal interaction)\n // - default: inherit all (full terminal passthrough, allows prompts)\n const stdio: \"pipe\" | \"inherit\" = options.silent ? \"pipe\" : \"inherit\";\n\n const proc = safeSpawn(\"vm0\", args, {\n cwd: options.cwd,\n stdio,\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n if (options.silent) {\n proc.stdout?.on(\"data\", (data: Buffer) => {\n stdout += data.toString();\n });\n proc.stderr?.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n }\n\n proc.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(stderr || `Command failed with exit code ${code}`));\n }\n });\n\n proc.on(\"error\", (err) => {\n reject(err);\n });\n });\n}\n\n/**\n * Execute vm0 run command while capturing output for artifact version parsing\n * Streams output to console while also capturing it\n * Returns the captured stdout\n */\nexport function execVm0RunWithCapture(\n args: string[],\n options: { cwd?: string } = {},\n): Promise<string> {\n return new Promise((resolve, reject) => {\n // Force color output when parent is a TTY, since piped stdio disables TTY detection\n const env = process.stdout.isTTY\n ? { ...process.env, FORCE_COLOR: \"1\" }\n : process.env;\n\n const proc = safeSpawn(\"vm0\", args, {\n cwd: options.cwd,\n env,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n proc.stdout?.on(\"data\", (data: Buffer) => {\n const chunk = data.toString();\n stdout += chunk;\n process.stdout.write(chunk);\n });\n\n proc.stderr?.on(\"data\", (data: Buffer) => {\n const chunk = data.toString();\n stderr += chunk;\n process.stderr.write(chunk);\n });\n\n proc.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(stderr || `Command failed with exit code ${code}`));\n }\n });\n\n proc.on(\"error\", (err) => {\n reject(err);\n });\n });\n}\n\n/**\n * Parse artifact version from vm0 run completion output\n * Looks for pattern like:\n * ✓ Run completed successfully\n * ...\n * Artifact:\n * artifactName: abc12345\n * Returns the version string (8 char truncated hash)\n */\nfunction parseArtifactVersionFromCompletion(\n output: string,\n artifactName: string,\n): string | null {\n // Find the completion section marker\n const completionMarker = \"Run completed successfully\";\n const completionIndex = output.indexOf(completionMarker);\n if (completionIndex === -1) return null;\n\n // Get the completion section\n const section = output.slice(completionIndex);\n\n // Look for Artifact section and extract version\n // Pattern: \" artifactName: version\" (with ANSI codes possibly)\n const artifactPattern = new RegExp(\n `^\\\\s*${escapeRegExp(artifactName)}:\\\\s*(?:\\\\x1b\\\\[[0-9;]*m)?([a-f0-9]+)`,\n \"m\",\n );\n const match = section.match(artifactPattern);\n return match ? match[1]! : null;\n}\n\n/**\n * Escape special regex characters in a string\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Parse run IDs from vm0 run completion output\n * Extracts runId, sessionId, and checkpointId from the \"Next steps\" section\n */\ninterface ParsedRunIds {\n runId?: string;\n sessionId?: string;\n checkpointId?: string;\n}\n\nexport function parseRunIdsFromOutput(output: string): ParsedRunIds {\n const completionMarker = \"Run completed successfully\";\n const completionIndex = output.indexOf(completionMarker);\n if (completionIndex === -1) return {};\n\n const section = output.slice(completionIndex);\n\n // Strip ANSI codes for reliable matching\n // ESC character (0x1B) followed by [ and ANSI sequence\n const ESC = String.fromCharCode(0x1b);\n const ansiPattern = new RegExp(`${ESC}\\\\[[0-9;]*m`, \"g\");\n const stripped = section.replace(ansiPattern, \"\");\n\n return {\n runId: stripped.match(/vm0 logs ([0-9a-f-]{36})/)?.[1],\n sessionId: stripped.match(/vm0 run continue ([0-9a-f-]{36})/)?.[1],\n checkpointId: stripped.match(/vm0 run resume ([0-9a-f-]{36})/)?.[1],\n };\n}\n\n/**\n * Auto-pull artifact after a successful run\n */\nexport async function autoPullArtifact(\n runOutput: string,\n artifactDir: string,\n): Promise<void> {\n const serverVersion = parseArtifactVersionFromCompletion(\n runOutput,\n ARTIFACT_DIR,\n );\n\n if (serverVersion && existsSync(artifactDir)) {\n console.log();\n console.log(chalk.bold(\"Pulling updated artifact:\"));\n printCommand(`cd ${ARTIFACT_DIR}`);\n printCommand(`vm0 artifact pull ${serverVersion}`);\n\n try {\n await execVm0Command([\"artifact\", \"pull\", serverVersion], {\n cwd: artifactDir,\n silent: true,\n });\n printCommand(\"cd ..\");\n } catch (error) {\n console.error(chalk.red(`✗ Artifact pull failed`));\n if (error instanceof Error) {\n console.error(chalk.dim(` ${error.message}`));\n }\n // Don't exit - the run succeeded, pull is optional\n }\n }\n}\n","import { Command } from \"commander\";\nimport { loadCookState } from \"../../lib/domain/cook-state\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport { printCommand, execVm0Command } from \"./utils\";\n\nexport const logsCommand = new Command()\n .name(\"logs\")\n .description(\"View logs from the last cook run\")\n .option(\"-a, --agent\", \"Show agent events (default)\")\n .option(\"-s, --system\", \"Show system log\")\n .option(\"-m, --metrics\", \"Show metrics\")\n .option(\"-n, --network\", \"Show network logs (proxy traffic)\")\n .option(\n \"--since <time>\",\n \"Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z)\",\n )\n .option(\"--tail <n>\", \"Show last N entries (default: 5, max: 100)\")\n .option(\"--head <n>\", \"Show first N entries (max: 100)\")\n .action(\n withErrorHandler(\n async (options: {\n agent?: boolean;\n system?: boolean;\n metrics?: boolean;\n network?: boolean;\n since?: string;\n tail?: string;\n head?: string;\n }) => {\n const state = await loadCookState();\n if (!state.lastRunId) {\n throw new Error(\"No previous run found\", {\n cause: new Error(\"Run 'vm0 cook <prompt>' first\"),\n });\n }\n\n // Build command args\n const args = [\"logs\", state.lastRunId];\n const displayArgs = [`vm0 logs ${state.lastRunId}`];\n\n if (options.agent) {\n args.push(\"--agent\");\n displayArgs.push(\"--agent\");\n }\n if (options.system) {\n args.push(\"--system\");\n displayArgs.push(\"--system\");\n }\n if (options.metrics) {\n args.push(\"--metrics\");\n displayArgs.push(\"--metrics\");\n }\n if (options.network) {\n args.push(\"--network\");\n displayArgs.push(\"--network\");\n }\n if (options.since) {\n args.push(\"--since\", options.since);\n displayArgs.push(`--since ${options.since}`);\n }\n if (options.tail) {\n args.push(\"--tail\", options.tail);\n displayArgs.push(`--tail ${options.tail}`);\n }\n if (options.head) {\n args.push(\"--head\", options.head);\n displayArgs.push(`--head ${options.head}`);\n }\n\n printCommand(displayArgs.join(\" \"));\n await execVm0Command(args);\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport path from \"path\";\nimport { loadCookState, saveCookState } from \"../../lib/domain/cook-state\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n ARTIFACT_DIR,\n printCommand,\n execVm0RunWithCapture,\n parseRunIdsFromOutput,\n autoPullArtifact,\n} from \"./utils\";\n\nexport const continueCommand = new Command()\n .name(\"continue\")\n .description(\n \"Continue from the last session (latest conversation and artifact)\",\n )\n .argument(\"<prompt>\", \"Prompt for the continued agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\"-v, --verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .action(\n withErrorHandler(\n async (\n prompt: string,\n options: {\n envFile?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n },\n ) => {\n const state = await loadCookState();\n if (!state.lastSessionId) {\n throw new Error(\"No previous session found\", {\n cause: new Error(\"Run 'vm0 cook <prompt>' first\"),\n });\n }\n\n const cwd = process.cwd();\n const artifactDir = path.join(cwd, ARTIFACT_DIR);\n\n const envFileArg = options.envFile\n ? ` --env-file ${options.envFile}`\n : \"\";\n printCommand(\n `vm0 run continue${envFileArg} ${state.lastSessionId} \"${prompt}\"`,\n );\n console.log();\n\n const runOutput = await execVm0RunWithCapture(\n [\n \"run\",\n \"continue\",\n ...(options.envFile ? [\"--env-file\", options.envFile] : []),\n ...(options.verbose ? [\"--verbose\"] : []),\n state.lastSessionId,\n ...(options.debugNoMockClaude ? [\"--debug-no-mock-claude\"] : []),\n prompt,\n ],\n { cwd },\n );\n\n // Update state with new IDs\n const newIds = parseRunIdsFromOutput(runOutput);\n if (newIds.runId || newIds.sessionId || newIds.checkpointId) {\n await saveCookState({\n lastRunId: newIds.runId,\n lastSessionId: newIds.sessionId,\n lastCheckpointId: newIds.checkpointId,\n });\n }\n\n // Auto-pull artifact\n await autoPullArtifact(runOutput, artifactDir);\n },\n ),\n );\n","import { Command, Option } from \"commander\";\nimport path from \"path\";\nimport { loadCookState, saveCookState } from \"../../lib/domain/cook-state\";\nimport { withErrorHandler } from \"../../lib/command\";\nimport {\n ARTIFACT_DIR,\n printCommand,\n execVm0RunWithCapture,\n parseRunIdsFromOutput,\n autoPullArtifact,\n} from \"./utils\";\n\nexport const resumeCommand = new Command()\n .name(\"resume\")\n .description(\n \"Resume from the last checkpoint (snapshotted conversation and artifact)\",\n )\n .argument(\"<prompt>\", \"Prompt for the resumed agent\")\n .option(\n \"--env-file <path>\",\n \"Load environment variables from file (priority: CLI flags > file > env vars)\",\n )\n .option(\"-v, --verbose\", \"Show full tool inputs and outputs\")\n .addOption(new Option(\"--debug-no-mock-claude\").hideHelp())\n .action(\n withErrorHandler(\n async (\n prompt: string,\n options: {\n envFile?: string;\n verbose?: boolean;\n debugNoMockClaude?: boolean;\n },\n ) => {\n const state = await loadCookState();\n if (!state.lastCheckpointId) {\n throw new Error(\"No previous checkpoint found\", {\n cause: new Error(\"Run 'vm0 cook <prompt>' first\"),\n });\n }\n\n const cwd = process.cwd();\n const artifactDir = path.join(cwd, ARTIFACT_DIR);\n\n const envFileArg = options.envFile\n ? ` --env-file ${options.envFile}`\n : \"\";\n printCommand(\n `vm0 run resume${envFileArg} ${state.lastCheckpointId} \"${prompt}\"`,\n );\n console.log();\n\n const runOutput = await execVm0RunWithCapture(\n [\n \"run\",\n \"resume\",\n ...(options.envFile ? [\"--env-file\", options.envFile] : []),\n ...(options.verbose ? [\"--verbose\"] : []),\n state.lastCheckpointId,\n ...(options.debugNoMockClaude ? [\"--debug-no-mock-claude\"] : []),\n prompt,\n ],\n { cwd },\n );\n\n // Update state with new IDs\n const newIds = parseRunIdsFromOutput(runOutput);\n if (newIds.runId || newIds.sessionId || newIds.checkpointId) {\n await saveCookState({\n lastRunId: newIds.runId,\n lastSessionId: newIds.sessionId,\n lastCheckpointId: newIds.checkpointId,\n });\n }\n\n // Auto-pull artifact\n await autoPullArtifact(runOutput, artifactDir);\n },\n ),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n getAgentEvents,\n getSystemLog,\n getMetrics,\n getNetworkLogs,\n type TelemetryMetric,\n type RunEvent,\n type NetworkLogEntry,\n} from \"../../lib/api\";\nimport { getApiUrl } from \"../../lib/api/config\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport { formatBytes } from \"../../lib/utils/file-utils\";\nimport { ClaudeEventParser } from \"../../lib/events/claude-event-parser\";\nimport { EventRenderer } from \"../../lib/events/event-renderer\";\nimport { paginate } from \"../../lib/utils/paginate\";\nimport { searchCommand } from \"./search\";\nimport { withErrorHandler } from \"../../lib/command\";\n\n/**\n * Maximum entries per API request\n */\nconst PAGE_LIMIT = 100;\n\n/**\n * Build platform URL for logs viewer\n * Transforms API URL to platform URL and appends logs path\n */\nfunction buildPlatformLogsUrl(apiUrl: string, runId: string): string {\n const url = new URL(apiUrl);\n const hostname = url.hostname;\n\n // Handle localhost\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `http://${hostname}:3001/logs/${runId}`;\n }\n\n // Transform: www.vm0.ai → app.vm0.ai\n // vm0.ai → app.vm0.ai\n const parts = hostname.split(\".\");\n if (parts[0] === \"www\" || parts[0] === \"app\" || parts[0] === \"platform\") {\n parts[0] = \"app\";\n } else {\n parts.unshift(\"app\");\n }\n\n const platformHost = parts.join(\".\");\n const port = url.port ? `:${url.port}` : \"\";\n return `https://${platformHost}${port}/logs/${runId}`;\n}\n\n/**\n * Log type for mutually exclusive options\n */\ntype LogType = \"agent\" | \"system\" | \"metrics\" | \"network\";\n\n/**\n * Format a single metric line\n */\nfunction formatMetric(metric: TelemetryMetric): string {\n const memPercent = ((metric.mem_used / metric.mem_total) * 100).toFixed(1);\n const diskPercent = ((metric.disk_used / metric.disk_total) * 100).toFixed(1);\n\n return `[${metric.ts}] CPU: ${metric.cpu.toFixed(1)}% | Mem: ${formatBytes(metric.mem_used)}/${formatBytes(metric.mem_total)} (${memPercent}%) | Disk: ${formatBytes(metric.disk_used)}/${formatBytes(metric.disk_total)} (${diskPercent}%)`;\n}\n\n/**\n * Format a denied network request (filtered by permission rule)\n */\nfunction formatNetworkDeny(entry: NetworkLogEntry): string {\n const method = entry.method || \"???\";\n const url = entry.url || entry.host || \"unknown\";\n const firewall = entry.firewall_name\n ? ` ${chalk.cyan(`[${entry.firewall_name}]`)}`\n : \"\";\n return `[${entry.timestamp}] ${method.padEnd(6)} ${chalk.red.bold(\"DENY\")} ${chalk.dim(url)}${firewall}`;\n}\n\n/**\n * Format auth resolution info (resolved secrets, refresh/cache status, URL rewrite)\n */\nfunction formatAuthInfo(entry: NetworkLogEntry): string {\n const tags: string[] = [];\n if (entry.auth_url_rewrite) {\n tags.push(\"url-rewrite\");\n }\n if (entry.auth_resolved_secrets && entry.auth_resolved_secrets.length > 0) {\n const refreshedSet = new Set(entry.auth_refreshed_secrets ?? []);\n for (const name of entry.auth_resolved_secrets) {\n if (refreshedSet.has(name)) {\n tags.push(`${name} (refreshed)`);\n } else if (entry.auth_cache_hit) {\n tags.push(`${name} (cached)`);\n } else {\n tags.push(name);\n }\n }\n }\n if (tags.length === 0) return \"\";\n return ` ${chalk.yellow(`\\u2194 ${tags.join(\", \")}`)}`;\n}\n\n/**\n * Format an ALLOW or ERROR network request with full HTTP details\n */\nfunction formatNetworkRequest(entry: NetworkLogEntry): string {\n let statusColor: typeof chalk.green;\n const status = entry.status || 0;\n if (status >= 200 && status < 300) {\n statusColor = chalk.green;\n } else if (status >= 300 && status < 400) {\n statusColor = chalk.yellow;\n } else if (status >= 400) {\n statusColor = chalk.red;\n } else {\n statusColor = chalk.gray;\n }\n\n let latencyColor: typeof chalk.green;\n const latencyMs = entry.latency_ms || 0;\n if (latencyMs < 500) {\n latencyColor = chalk.green;\n } else if (latencyMs < 2000) {\n latencyColor = chalk.yellow;\n } else {\n latencyColor = chalk.red;\n }\n\n const method = entry.method || \"???\";\n const requestSize = entry.request_size || 0;\n const responseSize = entry.response_size || 0;\n const url = entry.url || entry.host || \"unknown\";\n const firewall = entry.firewall_name\n ? ` ${chalk.cyan(`[${entry.firewall_name}]`)}`\n : \"\";\n const error = entry.firewall_error\n ? ` ${chalk.red(entry.firewall_error)}`\n : \"\";\n\n let line = `[${entry.timestamp}] ${method.padEnd(6)} ${statusColor(status)} ${latencyColor(latencyMs + \"ms\")} ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${chalk.dim(url)}${firewall}${error}${formatAuthInfo(entry)}`;\n\n line += formatCaptureFields(entry);\n\n return line;\n}\n\n/**\n * Maximum characters of body content shown in CLI log output.\n */\nconst BODY_PREVIEW_LENGTH = 200;\n\n/**\n * Format captured body fields (request headers, request body, response body)\n * when present from --capture-network-bodies runs.\n */\nfunction formatCaptureFields(entry: NetworkLogEntry): string {\n let result = \"\";\n if (entry.request_headers) {\n const hdrs = Object.entries(entry.request_headers)\n .map(([k, v]) => {\n return `${k}: ${v}`;\n })\n .join(\", \");\n result += `\\n ${chalk.gray(\"request_headers:\")} ${hdrs}`;\n }\n if (entry.request_body) {\n const truncated = entry.request_body_truncated ? \" (truncated)\" : \"\";\n const preview = entry.request_body.slice(0, BODY_PREVIEW_LENGTH);\n const ellipsis =\n entry.request_body.length > BODY_PREVIEW_LENGTH ? \"...\" : \"\";\n result += `\\n ${chalk.gray(\"request_body:\")} ${preview}${ellipsis}${truncated}`;\n }\n if (entry.response_body) {\n const truncated = entry.response_body_truncated ? \" (truncated)\" : \"\";\n const preview = entry.response_body.slice(0, BODY_PREVIEW_LENGTH);\n const ellipsis =\n entry.response_body.length > BODY_PREVIEW_LENGTH ? \"...\" : \"\";\n result += `\\n ${chalk.gray(\"response_body:\")} ${preview}${ellipsis}${truncated}`;\n }\n return result;\n}\n\n/**\n * Format a TCP connection log entry\n */\nfunction formatNetworkTcp(entry: NetworkLogEntry): string {\n const host = entry.host || \"unknown\";\n const port = entry.port || 0;\n const requestSize = entry.request_size || 0;\n const responseSize = entry.response_size || 0;\n const latencyMs = entry.latency_ms || 0;\n const error = entry.error ? ` ${chalk.red(entry.error)}` : \"\";\n\n return `[${entry.timestamp}] ${chalk.blue(\"TCP\")} ${latencyMs}ms ${formatBytes(requestSize)}/${formatBytes(responseSize)} ${chalk.dim(`${host}:${port}`)}${error}`;\n}\n\n/**\n * Format a non-TCP/non-HTTP log entry (UDP, ICMP, DNS, etc).\n * These come from iptables LOG via /dev/kmsg or dnsmasq query log.\n */\nfunction formatNetworkOther(entry: NetworkLogEntry): string {\n const proto = (entry.type || \"???\").toUpperCase();\n const host = entry.host || \"unknown\";\n const port = entry.port || 0;\n const size = entry.request_size ? ` ${formatBytes(entry.request_size)}` : \"\";\n\n return `[${entry.timestamp}] ${chalk.magenta(proto.padEnd(5))}${size} ${chalk.dim(`${host}:${port}`)}`;\n}\n\n/**\n * Format a network log entry\n */\nfunction formatNetworkLog(entry: NetworkLogEntry): string {\n if (entry.type === \"tcp\") return formatNetworkTcp(entry);\n if (entry.type && entry.type !== \"http\") return formatNetworkOther(entry);\n if (entry.action === \"DENY\") return formatNetworkDeny(entry);\n return formatNetworkRequest(entry);\n}\n\n/**\n * Create an EventRenderer for log viewing (with timestamps)\n * Uses buffered mode to group tool_use/tool_result together for consistent\n * rendering with vm0 run output\n */\nfunction createLogRenderer(verbose: boolean): EventRenderer {\n return new EventRenderer({\n showTimestamp: true,\n verbose,\n });\n}\n\n/**\n * Render an agent event with timestamp for historical log viewing\n */\nfunction renderAgentEvent(event: RunEvent, renderer: EventRenderer): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = ClaudeEventParser.parse(eventData);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\n/**\n * Validate mutually exclusive options and return the log type\n */\nfunction getLogType(options: {\n agent?: boolean;\n system?: boolean;\n metrics?: boolean;\n network?: boolean;\n}): LogType {\n const selected = [\n options.agent,\n options.system,\n options.metrics,\n options.network,\n ].filter(Boolean).length;\n\n if (selected > 1) {\n throw new Error(\n \"Options --agent, --system, --metrics, and --network are mutually exclusive\",\n );\n }\n\n if (options.system) return \"system\";\n if (options.metrics) return \"metrics\";\n if (options.network) return \"network\";\n return \"agent\"; // Default\n}\n\nexport const logsCommand = new Command()\n .name(\"logs\")\n .description(\"View and search agent run logs\")\n .argument(\"[runId]\", \"Run ID to fetch logs for\")\n .addCommand(searchCommand)\n .option(\"-a, --agent\", \"Show agent events (default)\")\n .option(\"-s, --system\", \"Show system log\")\n .option(\"-m, --metrics\", \"Show metrics\")\n .option(\"-n, --network\", \"Show network logs (proxy traffic)\")\n .option(\n \"--since <time>\",\n \"Show logs since timestamp (e.g., 5m, 2h, 1d, 2024-01-15T10:30:00Z, 1705312200)\",\n )\n .option(\"--tail <n>\", \"Show last N entries (default: 5)\")\n .option(\"--head <n>\", \"Show first N entries\")\n .option(\"--all\", \"Fetch all log entries\")\n .action(\n withErrorHandler(\n async (\n runId: string | undefined,\n options: {\n agent?: boolean;\n system?: boolean;\n metrics?: boolean;\n network?: boolean;\n since?: string;\n tail?: string;\n head?: string;\n all?: boolean;\n },\n ) => {\n if (!runId) {\n logsCommand.help();\n return;\n }\n\n const logType = getLogType(options);\n\n // Validate --tail, --head, and --all are mutually exclusive\n const countModes = [\n options.tail !== undefined,\n options.head !== undefined,\n options.all === true,\n ].filter(Boolean).length;\n if (countModes > 1) {\n throw new Error(\n \"Options --tail, --head, and --all are mutually exclusive\",\n );\n }\n\n // Parse since option\n let since: number | undefined;\n if (options.since) {\n since = parseTime(options.since);\n }\n\n // Determine pagination mode and order based on flags\n const isAll = options.all === true;\n const isHead = options.head !== undefined;\n const isTail = options.tail !== undefined;\n\n // targetCount: number for --head/--tail, \"all\" for --all, default 5 for no flag\n let targetCount: number | \"all\";\n if (isAll) {\n targetCount = \"all\";\n } else if (isHead) {\n targetCount = Math.max(1, parseInt(options.head!, 10));\n } else if (isTail) {\n targetCount = Math.max(1, parseInt(options.tail!, 10));\n } else {\n // Default: show last 5 entries\n targetCount = 5;\n }\n\n // Order: asc for --head, desc for --tail/--all/default\n const order: \"asc\" | \"desc\" = isHead ? \"asc\" : \"desc\";\n\n // Build platform URL for agent logs\n const apiUrl = await getApiUrl();\n const platformUrl = buildPlatformLogsUrl(apiUrl, runId);\n\n switch (logType) {\n case \"agent\":\n await showAgentEvents(\n runId,\n { since, targetCount, order },\n platformUrl,\n );\n break;\n case \"system\":\n await showSystemLog(runId, { since, targetCount, order });\n break;\n case \"metrics\":\n await showMetrics(runId, { since, targetCount, order });\n break;\n case \"network\":\n await showNetworkLogs(runId, { since, targetCount, order });\n break;\n }\n },\n ),\n );\n\n/**\n * Show agent events with pagination support\n */\nasync function showAgentEvents(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n platformUrl: string,\n): Promise<void> {\n // Fetch first page to get framework info\n const firstResponse = await getAgentEvents(runId, {\n since: options.since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n\n if (firstResponse.events.length === 0) {\n console.log(chalk.yellow(\"No agent events found for this run\"));\n return;\n }\n\n // Use pagination to collect all needed events\n let allEvents: RunEvent[];\n\n if (\n !firstResponse.hasMore ||\n (options.targetCount !== \"all\" &&\n firstResponse.events.length >= options.targetCount)\n ) {\n // Single page is enough\n allEvents =\n options.targetCount === \"all\"\n ? firstResponse.events\n : firstResponse.events.slice(0, options.targetCount);\n } else {\n // Need to paginate\n const lastEvent = firstResponse.events[firstResponse.events.length - 1];\n const firstPageTimestamp = lastEvent\n ? new Date(lastEvent.createdAt).getTime()\n : undefined;\n\n const remainingEvents = await paginate<RunEvent>({\n fetchPage: async (since) => {\n const response = await getAgentEvents(runId, {\n since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n return { items: response.events, hasMore: response.hasMore };\n },\n getTimestamp: (event) => {\n return new Date(event.createdAt).getTime();\n },\n targetCount:\n options.targetCount === \"all\"\n ? \"all\"\n : options.targetCount - firstResponse.events.length,\n initialSince: firstPageTimestamp,\n });\n\n allEvents = [...firstResponse.events, ...remainingEvents];\n\n // Trim to target count if needed\n if (\n options.targetCount !== \"all\" &&\n allEvents.length > options.targetCount\n ) {\n allEvents = allEvents.slice(0, options.targetCount);\n }\n }\n\n // Reverse for chronological display when using desc order (--tail)\n const events =\n options.order === \"desc\" ? [...allEvents].reverse() : allEvents;\n\n // Create renderer for log viewing (with timestamps, always verbose)\n const renderer = createLogRenderer(true);\n\n for (const event of events) {\n renderAgentEvent(event, renderer);\n }\n\n console.log(chalk.dim(`View on platform: ${platformUrl}`));\n}\n\n/**\n * Show system log with pagination support\n * Note: System log pagination is limited because the API returns aggregated strings\n * without individual timestamps. The --tail/--head/--all options work on batch count,\n * not line count.\n */\nasync function showSystemLog(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n // For system log, we fetch with a high limit to get more batches\n // The API aggregates batches into a single string\n const limit =\n options.targetCount === \"all\"\n ? PAGE_LIMIT\n : Math.min(options.targetCount, PAGE_LIMIT);\n\n const response = await getSystemLog(runId, {\n since: options.since,\n limit,\n order: options.order,\n });\n\n if (!response.systemLog) {\n console.log(chalk.yellow(\"No system log found for this run\"));\n return;\n }\n\n console.log(response.systemLog);\n}\n\n/**\n * Show metrics with pagination support\n */\nasync function showMetrics(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n // Fetch first page\n const firstResponse = await getMetrics(runId, {\n since: options.since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n\n if (firstResponse.metrics.length === 0) {\n console.log(chalk.yellow(\"No metrics found for this run\"));\n return;\n }\n\n // Use pagination to collect all needed metrics\n let allMetrics: TelemetryMetric[];\n\n if (\n !firstResponse.hasMore ||\n (options.targetCount !== \"all\" &&\n firstResponse.metrics.length >= options.targetCount)\n ) {\n // Single page is enough\n allMetrics =\n options.targetCount === \"all\"\n ? firstResponse.metrics\n : firstResponse.metrics.slice(0, options.targetCount);\n } else {\n // Need to paginate\n const lastMetric = firstResponse.metrics[firstResponse.metrics.length - 1];\n const firstPageTimestamp = lastMetric\n ? new Date(lastMetric.ts).getTime()\n : undefined;\n\n const remainingMetrics = await paginate<TelemetryMetric>({\n fetchPage: async (since) => {\n const response = await getMetrics(runId, {\n since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n return { items: response.metrics, hasMore: response.hasMore };\n },\n getTimestamp: (metric) => {\n return new Date(metric.ts).getTime();\n },\n targetCount:\n options.targetCount === \"all\"\n ? \"all\"\n : options.targetCount - firstResponse.metrics.length,\n initialSince: firstPageTimestamp,\n });\n\n allMetrics = [...firstResponse.metrics, ...remainingMetrics];\n\n // Trim to target count if needed\n if (\n options.targetCount !== \"all\" &&\n allMetrics.length > options.targetCount\n ) {\n allMetrics = allMetrics.slice(0, options.targetCount);\n }\n }\n\n // Reverse for chronological display when using desc order (--tail)\n const metrics =\n options.order === \"desc\" ? [...allMetrics].reverse() : allMetrics;\n\n for (const metric of metrics) {\n console.log(formatMetric(metric));\n }\n}\n\n/**\n * Show network logs with pagination support\n */\nasync function showNetworkLogs(\n runId: string,\n options: {\n since?: number;\n targetCount: number | \"all\";\n order: \"asc\" | \"desc\";\n },\n): Promise<void> {\n // Fetch first page\n const firstResponse = await getNetworkLogs(runId, {\n since: options.since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n\n if (firstResponse.networkLogs.length === 0) {\n console.log(\n chalk.yellow(\n \"No network logs found for this run. Network logs are only captured when using a runner with proxy enabled\",\n ),\n );\n return;\n }\n\n // Use pagination to collect all needed network logs\n let allNetworkLogs: NetworkLogEntry[];\n\n if (\n !firstResponse.hasMore ||\n (options.targetCount !== \"all\" &&\n firstResponse.networkLogs.length >= options.targetCount)\n ) {\n // Single page is enough\n allNetworkLogs =\n options.targetCount === \"all\"\n ? firstResponse.networkLogs\n : firstResponse.networkLogs.slice(0, options.targetCount);\n } else {\n // Need to paginate\n const lastLog =\n firstResponse.networkLogs[firstResponse.networkLogs.length - 1];\n const firstPageTimestamp = lastLog\n ? new Date(lastLog.timestamp).getTime()\n : undefined;\n\n const remainingLogs = await paginate<NetworkLogEntry>({\n fetchPage: async (since) => {\n const response = await getNetworkLogs(runId, {\n since,\n limit: PAGE_LIMIT,\n order: options.order,\n });\n return { items: response.networkLogs, hasMore: response.hasMore };\n },\n getTimestamp: (entry) => {\n return new Date(entry.timestamp).getTime();\n },\n targetCount:\n options.targetCount === \"all\"\n ? \"all\"\n : options.targetCount - firstResponse.networkLogs.length,\n initialSince: firstPageTimestamp,\n });\n\n allNetworkLogs = [...firstResponse.networkLogs, ...remainingLogs];\n\n // Trim to target count if needed\n if (\n options.targetCount !== \"all\" &&\n allNetworkLogs.length > options.targetCount\n ) {\n allNetworkLogs = allNetworkLogs.slice(0, options.targetCount);\n }\n }\n\n // Reverse for chronological display when using desc order (--tail)\n const networkLogs =\n options.order === \"desc\" ? [...allNetworkLogs].reverse() : allNetworkLogs;\n\n for (const entry of networkLogs) {\n console.log(formatNetworkLog(entry));\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n searchLogs,\n type RunEvent,\n type LogsSearchResponse,\n} from \"../../lib/api\";\nimport { parseTime } from \"../../lib/utils/time-parser\";\nimport { ClaudeEventParser } from \"../../lib/events/claude-event-parser\";\nimport { EventRenderer } from \"../../lib/events/event-renderer\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface SearchOptions {\n afterContext?: string;\n beforeContext?: string;\n context?: string;\n agent?: string;\n run?: string;\n since?: string;\n limit?: string;\n}\n\n/**\n * Render a single agent event using EventRenderer\n */\nfunction renderEvent(event: RunEvent, renderer: EventRenderer): void {\n const eventData = event.eventData as Record<string, unknown>;\n const parsed = ClaudeEventParser.parse(eventData);\n if (parsed) {\n parsed.timestamp = new Date(event.createdAt);\n renderer.render(parsed);\n }\n}\n\n/**\n * Format a run header line\n */\nfunction formatRunHeader(\n runId: string,\n agentName: string,\n timestamp: string,\n): string {\n const shortId = runId.slice(0, 8);\n const time = new Date(timestamp).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n return `── Run ${shortId} (${agentName}, ${time}) ──────────`;\n}\n\n/**\n * Parse and validate context options (-A, -B, -C)\n */\nfunction parseContextOptions(options: SearchOptions): {\n before: number;\n after: number;\n} {\n const contextN = options.context ? parseInt(options.context, 10) : 0;\n const before = options.beforeContext\n ? parseInt(options.beforeContext, 10)\n : contextN;\n const after = options.afterContext\n ? parseInt(options.afterContext, 10)\n : contextN;\n\n if (isNaN(before) || before < 0 || before > 10) {\n throw new Error(\"--before-context must be between 0 and 10\");\n }\n if (isNaN(after) || after < 0 || after > 10) {\n throw new Error(\"--after-context must be between 0 and 10\");\n }\n\n return { before, after };\n}\n\n/**\n * Parse --limit option with validation\n */\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const limit = parseInt(value, 10);\n if (isNaN(limit) || limit < 1 || limit > 50) {\n throw new Error(\"--limit must be between 1 and 50\");\n }\n return limit;\n}\n\n/**\n * Render search results grouped by run\n */\nfunction renderResults(response: LogsSearchResponse): void {\n // Group results by run\n const grouped = new Map<\n string,\n { agentName: string; results: LogsSearchResponse[\"results\"] }\n >();\n for (const result of response.results) {\n const existing = grouped.get(result.runId);\n if (existing) {\n existing.results.push(result);\n } else {\n grouped.set(result.runId, {\n agentName: result.agentName,\n results: [result],\n });\n }\n }\n\n // Render each group\n let isFirstGroup = true;\n for (const [runId, group] of grouped) {\n if (!isFirstGroup) {\n console.log(); // Separator between runs\n }\n isFirstGroup = false;\n\n const firstTimestamp = group.results[0]!.matchedEvent.createdAt;\n console.log(\n chalk.bold(formatRunHeader(runId, group.agentName, firstTimestamp)),\n );\n\n for (const result of group.results) {\n const renderer = new EventRenderer({\n showTimestamp: true,\n verbose: false,\n buffered: false,\n });\n\n for (const event of result.contextBefore) {\n renderEvent(event, renderer);\n }\n renderEvent(result.matchedEvent, renderer);\n for (const event of result.contextAfter) {\n renderEvent(event, renderer);\n }\n }\n }\n\n if (response.hasMore) {\n console.log();\n console.log(\n chalk.dim(\n ` Showing first ${response.results.length} matches. Use --limit to see more.`,\n ),\n );\n }\n}\n\nexport const searchCommand = new Command()\n .name(\"search\")\n .description(\"Search agent events across runs\")\n .argument(\"<keyword>\", \"Search keyword\")\n .option(\"-A, --after-context <n>\", \"Show n events after each match\")\n .option(\"-B, --before-context <n>\", \"Show n events before each match\")\n .option(\"-C, --context <n>\", \"Show n events before and after each match\")\n .option(\"--agent <name>\", \"Filter by agent name\")\n .option(\"--run <id>\", \"Filter by specific run ID\")\n .option(\"--since <time>\", \"Search logs since (default: 7d)\")\n .option(\"--limit <n>\", \"Maximum number of matches (default: 20)\")\n .action(\n withErrorHandler(async (keyword: string, options: SearchOptions) => {\n const { before, after } = parseContextOptions(options);\n const since = options.since\n ? parseTime(options.since)\n : Date.now() - SEVEN_DAYS_MS;\n const limit = parseLimit(options.limit);\n\n const response = await searchLogs({\n keyword,\n agent: options.agent,\n runId: options.run,\n since,\n limit,\n before,\n after,\n });\n\n if (response.results.length === 0) {\n console.log(chalk.dim(\"No matches found\"));\n console.log(\n chalk.dim(\n \" Try a broader search with --since 30d or a different keyword\",\n ),\n );\n return;\n }\n\n renderResults(response);\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport { existsSync } from \"fs\";\nimport { writeFile } from \"fs/promises\";\nimport { validateAgentName } from \"../../lib/domain/yaml-validator\";\nimport { promptText, isInteractive } from \"../../lib/utils/prompt-utils\";\nimport { withErrorHandler } from \"../../lib/command\";\n\nconst VM0_YAML_FILE = \"vm0.yaml\";\nconst AGENTS_MD_FILE = \"AGENTS.md\";\n\nfunction generateVm0Yaml(agentName: string): string {\n return `version: \"1.0\"\n\nagents:\n ${agentName}:\n framework: claude-code\n # Build agentic workflow using natural language\n instructions: AGENTS.md\n # Agent skills - see https://github.com/vm0-ai/vm0-skills for available skills\n # skills:\n # - https://github.com/vm0-ai/vm0-skills/tree/main/github\n`;\n}\n\nfunction generateAgentsMd(): string {\n return `# Agent Instructions\n\nYou are a HackerNews AI content curator.\n\n## Workflow\n\n1. Go to HackerNews and read the top 10 articles\n2. Find and extract AI-related content from these articles\n3. Summarize the findings into a X (Twitter) post format\n4. Write the summary to content.md\n`;\n}\n\nfunction checkExistingFiles(): string[] {\n const existingFiles: string[] = [];\n if (existsSync(VM0_YAML_FILE)) existingFiles.push(VM0_YAML_FILE);\n if (existsSync(AGENTS_MD_FILE)) existingFiles.push(AGENTS_MD_FILE);\n return existingFiles;\n}\n\nexport const initCommand = new Command()\n .name(\"init\")\n .description(\"Initialize a new VM0 project in the current directory\")\n .option(\"-f, --force\", \"Overwrite existing files\")\n .option(\"-n, --name <name>\", \"Agent name (required in non-interactive mode)\")\n .action(\n withErrorHandler(async (options: { force?: boolean; name?: string }) => {\n // Check existing files\n const existingFiles = checkExistingFiles();\n if (existingFiles.length > 0 && !options.force) {\n throw new Error(`${existingFiles.join(\", \")} already exists`, {\n cause: new Error(\"To overwrite: vm0 init --force\"),\n });\n }\n\n // Get agent name from option or prompt\n let agentName: string;\n if (options.name) {\n agentName = options.name.trim();\n } else if (!isInteractive()) {\n throw new Error(\"--name flag is required in non-interactive mode\", {\n cause: new Error(\"Usage: vm0 init --name <agent-name>\"),\n });\n } else {\n // Use directory name as default suggestion\n const dirName = path.basename(process.cwd());\n const defaultName = validateAgentName(dirName) ? dirName : undefined;\n\n const name = await promptText(\n \"Enter agent name\",\n defaultName,\n (value: string) => {\n if (!validateAgentName(value)) {\n return \"Must be 3-64 characters, alphanumeric and hyphens, start/end with letter or number\";\n }\n return true;\n },\n );\n\n if (name === undefined) {\n // User cancelled\n console.log(chalk.dim(\"Cancelled\"));\n return;\n }\n\n agentName = name;\n }\n\n // Validate agent name\n if (!agentName || !validateAgentName(agentName)) {\n throw new Error(\"Invalid agent name\", {\n cause: new Error(\n \"Must be 3-64 characters, alphanumeric and hyphens only, start and end with letter or number\",\n ),\n });\n }\n\n // Write vm0.yaml\n await writeFile(VM0_YAML_FILE, generateVm0Yaml(agentName));\n const vm0Status = existingFiles.includes(VM0_YAML_FILE)\n ? \" (overwritten)\"\n : \"\";\n console.log(chalk.green(`✓ Created ${VM0_YAML_FILE}${vm0Status}`));\n\n // Write AGENTS.md\n await writeFile(AGENTS_MD_FILE, generateAgentsMd());\n const agentsStatus = existingFiles.includes(AGENTS_MD_FILE)\n ? \" (overwritten)\"\n : \"\";\n console.log(chalk.green(`✓ Created ${AGENTS_MD_FILE}${agentsStatus}`));\n\n // Print next steps\n console.log();\n console.log(\"Next steps:\");\n console.log(\n ` 1. Set up model provider (one-time): ${chalk.cyan(\"zero org model-provider setup\")}`,\n );\n console.log(\n ` 2. Edit ${chalk.cyan(\"AGENTS.md\")} to customize your agent's workflow`,\n );\n console.log(\n ` 3. Run your agent: ${chalk.cyan('vm0 cook \"let\\'s start working\"')}`,\n );\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n detectPackageManager,\n getLatestVersion,\n getManualUpgradeCommand,\n isAutoUpgradeSupported,\n performUpgrade,\n} from \"../../lib/utils/update-checker\";\nimport { withErrorHandler } from \"../../lib/command\";\n\ndeclare const __CLI_VERSION__: string;\n\nexport const upgradeCommand = new Command()\n .name(\"upgrade\")\n .description(\"Upgrade vm0 CLI to the latest version\")\n .action(\n withErrorHandler(async () => {\n console.log(\"Checking for updates...\");\n\n const latestVersion = await getLatestVersion();\n\n if (latestVersion === null) {\n throw new Error(\"Could not check for updates. Please try again later.\");\n }\n\n if (latestVersion === __CLI_VERSION__) {\n console.log(chalk.green(`✓ Already up to date (${__CLI_VERSION__})`));\n return;\n }\n\n console.log(\n chalk.yellow(\n `Current version: ${__CLI_VERSION__} -> Latest version: ${latestVersion}`,\n ),\n );\n console.log();\n\n const packageManager = detectPackageManager();\n\n if (!isAutoUpgradeSupported(packageManager)) {\n if (packageManager === \"unknown\") {\n console.log(\n chalk.yellow(\n \"Could not detect your package manager for auto-upgrade.\",\n ),\n );\n } else {\n console.log(\n chalk.yellow(\n `Auto-upgrade is not supported for ${packageManager}.`,\n ),\n );\n }\n console.log(chalk.yellow(\"Please upgrade manually:\"));\n console.log(chalk.cyan(` ${getManualUpgradeCommand(packageManager)}`));\n return;\n }\n\n console.log(`Upgrading via ${packageManager}...`);\n const success = await performUpgrade(packageManager);\n\n if (success) {\n console.log(\n chalk.green(`✓ Upgraded from ${__CLI_VERSION__} to ${latestVersion}`),\n );\n return;\n }\n\n throw new Error(\"Upgrade failed\", {\n cause: new Error(\n `Please run manually: ${getManualUpgradeCommand(packageManager)}`,\n ),\n });\n }),\n );\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getApiUrl, getActiveOrg, getToken } from \"../lib/api/config\";\nimport { withErrorHandler } from \"../lib/command\";\n\n/**\n * Detect if running inside a VM0 sandbox (agent runtime).\n * Presence of VM0_RUN_ID indicates sandbox execution.\n */\nfunction isInsideSandbox(): boolean {\n return !!process.env.VM0_RUN_ID;\n}\n\n/**\n * Display agent identity and run information when inside a sandbox.\n */\nasync function showSandboxInfo(): Promise<void> {\n const agentId = process.env.ZERO_AGENT_ID;\n const cliAgentType = process.env.CLI_AGENT_TYPE;\n\n const runId = process.env.VM0_RUN_ID;\n const activeOrg = await getActiveOrg();\n const apiUrl = process.env.VM0_API_URL;\n\n // Agent section\n const hasAgentInfo = agentId || cliAgentType;\n if (hasAgentInfo) {\n console.log(chalk.bold(\"Agent:\"));\n if (agentId) console.log(` ID: ${agentId}`);\n if (cliAgentType) console.log(` Framework: ${cliAgentType}`);\n console.log();\n }\n\n // Run section\n console.log(chalk.bold(\"Run:\"));\n if (runId) console.log(` ID: ${runId}`);\n if (activeOrg) console.log(` Org: ${activeOrg}`);\n if (apiUrl) console.log(` API: ${apiUrl}`);\n}\n\n/**\n * Display authentication and org information when running outside a sandbox.\n */\nasync function showLocalInfo(): Promise<void> {\n const token = await getToken();\n const apiUrl = await getApiUrl();\n const activeOrg = await getActiveOrg();\n\n // Auth section\n console.log(chalk.bold(\"Auth:\"));\n if (token) {\n const tokenSource = process.env.VM0_TOKEN\n ? \"VM0_TOKEN env var\"\n : \"config file\";\n console.log(\n ` Status: ${chalk.green(\"Authenticated\")} (via ${tokenSource})`,\n );\n } else {\n console.log(` Status: ${chalk.dim(\"Not authenticated\")}`);\n }\n console.log(` API: ${apiUrl}`);\n console.log();\n\n // Org section\n if (activeOrg) {\n console.log(chalk.bold(\"Org:\"));\n console.log(` Active: ${activeOrg}`);\n }\n}\n\nexport const whoamiCommand = new Command()\n .name(\"whoami\")\n .description(\"Show current identity and environment information\")\n .action(\n withErrorHandler(async () => {\n if (isInsideSandbox()) {\n await showSandboxInfo();\n } else {\n await showLocalInfo();\n }\n }),\n );\n"],"mappings":"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","names":["ms","readFile","rm","existsSync","dirname","join","path","b","_","j","fs","path","parseGitHubTreeUrl","getSkillStorageName","fs","path","os","fs","path","os","EE","fs","EventEmitter","Stream","StringDecoder","path","dirname","parse","assert","Buffer","realZlib","pathModule","basename","win32","randomBytes","fsp","join","proc","isStream","s","Minipass","isReadable","isWritable","EOF","MAYBE_EMIT_END","EMITTED_END","EMITTING_END","EMITTED_ERROR","CLOSED","READ","FLUSH","FLUSHCHUNK","ENCODING","DECODER","FLOWING","PAUSED","RESUME","BUFFER","PIPES","BUFFERLENGTH","BUFFERPUSH","BUFFERSHIFT","OBJECTMODE","DESTROYED","ERROR","EMITDATA","EMITEND","EMITEND2","ASYNC","ABORT","ABORTED","SIGNAL","DATALISTENERS","DISCARDED","defer","fn","nodefer","isEndish","ev","isArrayBufferLike","b","isArrayBufferView","Pipe","src","dest","opts","_er","PipeProxyErrors","er","isObjectModeOptions","o","isEncodingOptions","args","options","signal","_enc","_om","a","_","chunk","encoding","cb","n","ret","c","noDrain","ended","p","handler","h","data","buf","resolve","reject","stopped","stop","res","onerr","ondata","onend","ondestroy","value","rej","next","wc","writev","_autoClose","_close","_ended","_fd","_finished","_flags","_flush","_handleChunk","_makeBuf","_mode","_needDrain","_onerror","_onopen","_onread","_onwrite","_open","_path","_pos","_queue","_read","_readSize","_reading","_remain","_size","_write","_writing","_defaultFlag","_errored","ReadStream","opt","fd","br","ReadStreamSync","threw","WriteStream","defaultFlag","enc","bw","iovec","WriteStreamSync","argmap","isSyncFile","isAsyncFile","isSyncNoFile","isAsyncNoFile","isFile","dealiasKey","k","d","dealias","result","key","v","makeCommand","syncFile","asyncFile","syncNoFile","asyncNoFile","validate","opt_","entries","realZlibConstants","constants","OriginalBufferConcat","desc","noop","passthroughBufferConcat","makeNoOp","_superWrite","ZlibError","err","origin","_flushFlag","ZlibBase","#sawError","#ended","#flushFlag","#finishFlushFlag","#fullFlushFlag","#handle","#onError","mode","flushFlag","nativeHandle","originalNativeClose","originalClose","writeReturn","r","i","Zlib","#level","#strategy","level","strategy","origFlush","Gzip","#portable","Unzip","Brotli","BrotliCompress","BrotliDecompress","Zstd","ZstdCompress","ZstdDecompress","encode","num","encodeNegative","encodePositive","flipped","byte","onesComp","twosComp","pre","pos","twos","len","sum","f","types_exports","__export","code","isCode","isName","name","kv","Header","#type","off","ex","gex","#slurp","decString","decNumber","decDate","t","prefix","prefixSize","split","splitPrefix","encString","encNumber","encDate","type","pp","root","size","numToDate","decSmallNumber","nanUndef","MAXNUM","encSmallNumber","octalString","padOctal","str","date","NULLS","Pax","_Pax","obj","global","body","bodyLen","bufLen","field","byteLen","digits","g","merge","parseKV","parseKVLine","set","line","platform","normalizeWindowsPath","ReadEntry","header","writeLen","warnMethod","self","message","maxMetaEntrySize","gzipHeader","zstdHeader","ZIP_HEADER_LEN","STATE","WRITEENTRY","READENTRY","NEXTENTRY","PROCESSENTRY","EX","GEX","META","EMITMETA","QUEUE","ENDED","EMITTEDEND","EMIT","UNZIP","CONSUMECHUNK","CONSUMECHUNKSUB","CONSUMEBODY","CONSUMEMETA","CONSUMEHEADER","CONSUMING","BUFFERCONCAT","MAYBEEND","WRITING","DONE","SAW_VALID_ENTRY","SAW_NULL_BLOCK","SAW_EOF","CLOSESTREAM","Parser","isTBR","isTZST","position","entry","go","re","extra","error","isZstd","maybeBrotli","have","length","stripTrailingSlashes","slashesStart","onReadEntryFunction","onReadEntry","filesFilter","files","map","filter","mapHas","file","m","listFileSync","stat","readSize","read","bytesRead","listFile","_files","stream","list","modeFix","isDir","portable","isAbsolute","stripAbsolutePath","parsed","raw","win","char","toWin","toRaw","decode","prefixPath","maxReadSize","PROCESS","FILE","DIRECTORY","SYMLINK","HARDLINK","HEADER","LSTAT","ONLSTAT","ONREAD","ONREADLINK","OPENFILE","ONOPENFILE","CLOSE","MODE","AWAITDRAIN","ONDRAIN","PREFIX","WriteEntry","#hadError","pathWarn","stripped","cs","getType","block","linkpath","linkKey","offset","WriteEntrySync","WriteEntryTar","readEntry","Yallist","_Yallist","item","walker","node","prev","head","tail","l","push","unshift","thisp","initial","acc","arr","from","to","start","deleteCount","nodes","insertAfter","inserted","Node","PackJob","absolute","ONSTAT","CURRENT","PROCESSING","PROCESSJOB","JOBS","JOBDONE","ADDFSENTRY","ADDTARENTRY","STAT","READDIR","ONREADDIR","PIPE","ENTRY","ENTRYOPT","WRITEENTRYCLASS","WRITE","Pack","zip","job","w","_job","sc","rc","msg","base","source","PackSync","createFileSync","addFilesSync","createFile","promise","addFilesAsync","createSync","createAsync","create","_opt","isWindows","O_CREAT","O_NOFOLLOW","O_TRUNC","O_WRONLY","UV_FS_O_FILEMAP","fMapEnabled","fMapLimit","fMapFlag","noFollowFlag","getWriteFlag","lchownSync","uid","gid","chown","cpath","chownrKid","child","chownr","children","errState","then","chownrKidSync","chownrSync","e","CwdError","SymlinkError","symlink","checkCwd","dir","st","mkdir","umask","needChmod","doChown","preserve","unlink","cwd","done","created","made","parts","mkdir_","part","onmkdir","statEr","checkCwdSync","ok","mkdirSync","normalizeCache","MAX","cache","normalizeUnicode","getDirs","PathReservations","#queues","#reservations","#running","paths","dirs","q","#run","#getQueues","#clear","q0","ONENTRY","CHECKFS","CHECKFS2","ISREUSABLE","MAKEFS","LINK","ENSURE_NO_SYMLINK","UNSUPPORTED","CHECKPATH","STRIPABSOLUTEPATH","MKDIR","ONERROR","PENDING","PEND","UNPEND","MAYBECLOSE","SKIP","DOCHOWN","UID","GID","CHECKED_CWD","DEFAULT_MAX_DEPTH","unlinkFile","unlinkFileSync","uint32","Unpack","entryDir","resolved","linkparts","aRoot","pRoot","fullyDone","actions","abs","atime","mtime","er2","tx","onError","parent","afterMakeParent","lstatEr","afterChmod","link","callSync","UnpackSync","mkParent","oner","closeError","futimeser","fchowner","_entry","linkSync","extractFileSync","u","extractFile","extract","replaceSync","headBuf","POSITION","bufPos","bytes","entryBlockSize","streamSync","replaceAsync","getPos","cb_","onread","flag","onopen","replace","update","mtimeFilter","fs","path","k","ms","text","commitResult","parseGitHubTreeUrl","getSkillStorageName","existsSync","readFile","parseYaml","dirname","parseGitHubTreeUrl","s","v","join","rm","s","v","path","import_yaml","readFile","writeFile","mkdir","existsSync","path","parseYaml","type","stringifyYaml","path","path","fs","os","path","f","statusCommand","listCommand","path","fs","os","type","path","statusCommand","listCommand","path","initCommand","path","pushCommand","path","fs","os","pullCommand","path","f","statusCommand","listCommand","cloneCommand","initCommand","pushCommand","pullCommand","statusCommand","listCommand","cloneCommand","path","initCommand","path","pushCommand","pullCommand","statusCommand","listCommand","cloneCommand","initCommand","pushCommand","pullCommand","statusCommand","listCommand","cloneCommand","import_yaml","readFile","mkdir","existsSync","path","homedir","join","readFile","writeFile","mkdir","existsSync","CONFIG_DIR","existsSync","CONFIG_FILE","existsSync","loadAndValidateConfig","CONFIG_FILE","existsSync","readFile","parseYaml","path","mkdir","path","continueCommand","path","path","resumeCommand","path","continueCommand","resumeCommand","parseLimit","k","v","logsCommand","path","existsSync","writeFile","existsSync","initCommand","path","writeFile","logsCommand","initCommand"]}