pyfig 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +47 -34
  2. package/SECURITY.md +1 -1
  3. package/dist/cjs/index.js +409 -261
  4. package/dist/cjs/index.js.map +10 -9
  5. package/dist/cjs/sync-resolver.js +369 -236
  6. package/dist/cjs/sync-resolver.js.map +9 -8
  7. package/dist/cli.js +12 -3
  8. package/dist/cli.js.map +1 -1
  9. package/dist/client.d.ts +6 -6
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +31 -21
  12. package/dist/client.js.map +1 -1
  13. package/dist/config.d.ts +9 -2
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +48 -1
  16. package/dist/config.js.map +1 -1
  17. package/dist/index.d.ts +3 -4
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +2 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/package-target.d.ts +3 -3
  22. package/dist/package-target.d.ts.map +1 -1
  23. package/dist/package-target.js +6 -6
  24. package/dist/package-target.js.map +1 -1
  25. package/dist/provision.d.ts +8 -12
  26. package/dist/provision.d.ts.map +1 -1
  27. package/dist/provision.js +156 -158
  28. package/dist/provision.js.map +1 -1
  29. package/dist/python-venv.d.ts +12 -0
  30. package/dist/python-venv.d.ts.map +1 -0
  31. package/dist/{virtual-environment.js → python-venv.js} +12 -9
  32. package/dist/python-venv.js.map +1 -0
  33. package/dist/runners.js +12 -12
  34. package/dist/runners.js.map +1 -1
  35. package/dist/sync-resolver.js +2 -2
  36. package/dist/sync-resolver.js.map +1 -1
  37. package/dist/venv-identity.d.ts +36 -0
  38. package/dist/venv-identity.d.ts.map +1 -0
  39. package/dist/venv-identity.js +80 -0
  40. package/dist/venv-identity.js.map +1 -0
  41. package/package.json +2 -2
  42. package/dist/virtual-environment.d.ts +0 -11
  43. package/dist/virtual-environment.d.ts.map +0 -1
  44. package/dist/virtual-environment.js.map +0 -1
@@ -1,19 +1,20 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/sync-resolver.ts", "../../src/provision.ts", "../../src/config.ts", "../../src/pep440.ts", "../../src/project-root.ts", "../../src/provision-lock.ts", "../../src/virtual-environment.ts", "../../src/package-target.ts", "../../src/process.ts", "../../src/probes.ts"],
3
+ "sources": ["../../src/sync-resolver.ts", "../../src/provision.ts", "../../src/config.ts", "../../src/pep440.ts", "../../src/project-root.ts", "../../src/venv-identity.ts", "../../src/python-venv.ts", "../../src/provision-lock.ts", "../../src/package-target.ts", "../../src/process.ts", "../../src/probes.ts"],
4
4
  "sourcesContent": [
5
- "import { readFileSync } from 'node:fs';\nimport type { ResolvedPyfigOptions } from './config.js';\nimport { ensureEnvironment, ensureUv } from './provision.js';\n\ninterface SyncResolutionRequest {\n target: 'environment' | 'uv';\n options: ResolvedPyfigOptions;\n}\n\nasync function main(): Promise<void> {\n const request = JSON.parse(readFileSync(0, 'utf8')) as SyncResolutionRequest;\n const result = request.target === 'uv'\n ? await ensureUv(request.options)\n : await ensureEnvironment(request.options);\n process.stdout.write(JSON.stringify(result));\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(message);\n process.exitCode = 1;\n});\n",
6
- "import { createHash, randomUUID } from 'node:crypto';\nimport { createReadStream, createWriteStream } from 'node:fs';\nimport {\n chmod,\n copyFile,\n mkdir,\n mkdtemp,\n readFile,\n readdir,\n rename,\n rm,\n writeFile,\n} from 'node:fs/promises';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport { unzipSync } from 'fflate';\nimport * as tar from 'tar';\nimport { EnvHttpProxyAgent, fetch } from 'undici';\nimport {\n resolveOptions,\n uvEnvironment,\n type PyfigOptions,\n type ResolvedPyfigOptions,\n} from './config.js';\nimport { withProvisioningLock } from './provision-lock.js';\nimport { sanitizeUvEnvironment, uvCommandEnvironment } from './package-target.js';\nimport {\n maxPep440Version,\n normalizePep440Version,\n} from './pep440.js';\nimport {\n findUv,\n probePython,\n probeUv,\n pythonSatisfiesPolicy,\n type PythonInfo,\n type UvInfo,\n} from './probes.js';\nimport { runAsync } from './process.js';\nimport {\n canonicalPath,\n externalVirtualEnvironmentDirectories,\n pathsEqual,\n virtualEnvironmentDirectory,\n virtualEnvironmentPythonExecutable,\n} from './virtual-environment.js';\n\nexport interface PythonEnvironment {\n python: PythonInfo;\n uv: UvInfo;\n /** True when the environment lives in node_modules/.pyfig/venv. */\n managed: boolean;\n}\n\nexport interface RuntimeDependencyOptions {\n /** Optional-dependency extras read from an existing pyproject.toml. */\n extras?: readonly string[];\n /** Include every optional-dependency extra from an existing pyproject.toml. */\n allExtras?: boolean;\n /** Dependency groups read from an existing pyproject.toml. */\n groups?: readonly string[];\n}\n\n/** Ensure a compatible uv executable, preferring an existing installation. */\nexport async function ensureUv(options: PyfigOptions = {}): Promise<UvInfo> {\n return ensureUvResolved(resolveOptions(options));\n}\n\n/**\n * Select a compatible environment and optionally add runtime dependencies.\n * Project dependency files are inputs only and are never changed.\n */\nexport async function ensureEnvironment(\n options: PyfigOptions = {},\n dependencies: readonly string[] = [],\n dependencyOptions: RuntimeDependencyOptions = {},\n): Promise<PythonEnvironment> {\n const resolved = resolveOptions(options);\n const normalized = normalizeDependencies(dependencies);\n const selections = normalizeDependencyOptions(dependencyOptions);\n const uv = await ensureUvResolved(resolved);\n const python = await ensureVirtualEnvironmentResolved(resolved, uv);\n if (normalized.length > 0 || selections.extras.length > 0 ||\n selections.groups.length > 0 || selections.allExtras) {\n await installRuntimeDependencies(uv, python, normalized, selections, resolved);\n }\n return {\n python,\n uv,\n managed: isManagedEnvironment(python, resolved),\n };\n}\n\nasync function ensureVirtualEnvironmentResolved(\n options: ResolvedPyfigOptions,\n uv: UvInfo,\n): Promise<PythonInfo> {\n const existing = await findReusableEnvironment(options);\n if (existing) return existing;\n\n const directory = virtualEnvironmentDirectory(options.projectRoot);\n const check = async (): Promise<PythonInfo | null> => {\n const candidate = await inspectVirtualEnvironment(directory, options);\n return candidate && pythonSatisfiesPolicy(candidate, options) &&\n await virtualEnvironmentMatchesConfiguredPython(candidate, options)\n ? candidate\n : null;\n };\n if (!options.createVirtualEnvironment) {\n throw new Error(\n `No compatible environment is available and creation is disabled. ` +\n `Pyfig would create ${directory}.`,\n );\n }\n\n const basePython = await ensureBasePythonResolved(uv, options);\n return withProvisioningLock({\n key: `venv:${canonicalPath(directory)}`,\n timeoutMs: options.coordinationTimeoutMs,\n check,\n mutate: async () => {\n // Only Pyfig's private path is replaceable. Active and repository-root\n // environments are preserved when incompatible.\n await rm(directory, { recursive: true, force: true });\n await mkdir(path.dirname(directory), { recursive: true });\n await runAsync(\n uv.executable,\n [\n 'venv',\n '--no-project',\n '--no-config',\n '--no-python-downloads',\n '--python',\n basePython.executable,\n directory,\n ],\n isolatedUvEnvironment(options),\n options.installTimeoutMs,\n );\n const installed = await check();\n if (!installed) {\n throw new Error(\n `uv created ${directory}, but its Python does not satisfy the requested capabilities.`,\n );\n }\n return installed;\n },\n });\n}\n\nasync function findReusableEnvironment(\n options: ResolvedPyfigOptions,\n): Promise<PythonInfo | null> {\n if (options.python) {\n const configured = await probePython({ executable: options.python, args: [] }, options);\n if (!configured || !pythonSatisfiesPolicy(configured, options)) {\n throw incompatibleConfiguredPython(options);\n }\n if (configured.virtualEnvironment) return configured;\n }\n\n for (const directory of [\n ...externalVirtualEnvironmentDirectories(options.projectRoot, options.env),\n virtualEnvironmentDirectory(options.projectRoot),\n ]) {\n const info = await inspectVirtualEnvironment(directory, options);\n if (info && pythonSatisfiesPolicy(info, options) &&\n await virtualEnvironmentMatchesConfiguredPython(info, options)) {\n return info;\n }\n }\n return null;\n}\n\nasync function ensureBasePythonResolved(\n uv: UvInfo,\n options: ResolvedPyfigOptions,\n): Promise<PythonInfo> {\n if (options.python) {\n const configured = await probePython({ executable: options.python, args: [] }, options);\n if (!configured || !pythonSatisfiesPolicy(configured, options)) {\n throw incompatibleConfiguredPython(options);\n }\n if (!configured.virtualEnvironment) return configured;\n const base = await probePython({ executable: configured.baseExecutable, args: [] }, options);\n if (base && pythonSatisfiesPolicy(base, options)) return base;\n throw incompatibleConfiguredPython(options);\n }\n\n // Corporate and offline hosts get a strict system-only pass before Pyfig\n // considers any already-managed interpreter or network installation.\n const system = await findPythonWithUv(uv, options, 'system');\n if (system) return system;\n const cachedManaged = await findPythonWithUv(uv, options, 'managed');\n if (cachedManaged) return cachedManaged;\n if (!options.installPython) {\n throw new Error(missingPythonMessage(options, 'managed Python installation is disabled'));\n }\n\n return withProvisioningLock({\n key: `python:${canonicalPath(path.join(options.cacheDir, 'python'))}`,\n timeoutMs: options.coordinationTimeoutMs,\n check: () => findPythonWithUv(uv, options, 'managed'),\n mutate: async () => {\n await runAsync(\n uv.executable,\n ['python', 'install', '--no-config', options.managedPython],\n isolatedUvEnvironment(options),\n options.installTimeoutMs,\n );\n const installed = await findPythonWithUv(uv, options, 'managed');\n if (!installed) {\n throw new Error(missingPythonMessage(\n options,\n `uv installed ${options.managedPython}, but it remains incompatible`,\n ));\n }\n return installed;\n },\n });\n}\n\nasync function findPythonWithUv(\n uv: UvInfo,\n options: ResolvedPyfigOptions,\n source: 'system' | 'managed',\n): Promise<PythonInfo | null> {\n for (const request of ['', options.managedPython]) {\n const args = [\n 'python',\n 'find',\n '--no-project',\n '--no-config',\n '--no-python-downloads',\n source === 'system' ? '--system' : '--managed-python',\n ];\n if (request) args.push(request);\n try {\n const { stdout } = await runAsync(\n uv.executable,\n args,\n explicitPythonSourceEnvironment(options),\n options.probeTimeoutMs,\n );\n const info = await probePython({ executable: stdout.trim(), args: [] }, options);\n if (info && pythonSatisfiesPolicy(info, options)) return info;\n } catch {\n // Continue through the generic and configured version requests.\n }\n }\n\n // `uv python find` returns one match. That match can lack development\n // headers even when another installed interpreter satisfies every requested\n // capability, so inspect uv's complete installed-only inventory before\n // moving from system Python to managed Python or from cache to download.\n try {\n const { stdout } = await runAsync(\n uv.executable,\n [\n 'python',\n 'list',\n '--no-config',\n '--no-python-downloads',\n '--only-installed',\n '--output-format',\n 'json',\n source === 'system' ? '--no-managed-python' : '--managed-python',\n ],\n explicitPythonSourceEnvironment(options),\n options.probeTimeoutMs,\n );\n const candidates = installedPythonPaths(stdout);\n for (const executable of candidates) {\n const info = await probePython({ executable, args: [] }, options);\n if (info && !info.virtualEnvironment && pythonSatisfiesPolicy(info, options)) {\n return info;\n }\n }\n } catch {\n // Older compatible uv releases can still use the find-based fallback.\n }\n return null;\n}\n\nfunction installedPythonPaths(output: string): string[] {\n const parsed = JSON.parse(output) as unknown;\n if (!Array.isArray(parsed)) return [];\n const paths = parsed.flatMap((entry) => {\n if (!entry || typeof entry !== 'object' || !('path' in entry)) return [];\n const candidate = (entry as { path?: unknown }).path;\n return typeof candidate === 'string' && candidate ? [candidate] : [];\n });\n return [...new Map(paths.map((candidate) => [canonicalPath(candidate), candidate])).values()];\n}\n\nasync function inspectVirtualEnvironment(\n directory: string,\n options: ResolvedPyfigOptions,\n): Promise<PythonInfo | null> {\n const executable = virtualEnvironmentPythonExecutable(directory);\n const info = await probePython({ executable, args: [] }, options);\n return info?.virtualEnvironment && pathsEqual(info.virtualEnvironment, directory) ? info : null;\n}\n\nasync function installRuntimeDependencies(\n uv: UvInfo,\n python: PythonInfo,\n dependencies: readonly string[],\n dependencyOptions: Required<RuntimeDependencyOptions>,\n options: ResolvedPyfigOptions,\n): Promise<void> {\n if (!python.virtualEnvironment) {\n throw new Error('Runtime dependency installation requires a virtual environment.');\n }\n await withProvisioningLock({\n key: `dependencies:${canonicalPath(python.virtualEnvironment)}`,\n timeoutMs: options.coordinationTimeoutMs,\n check: async () => null,\n mutate: async () => {\n const temporary = await mkdtemp(path.join(os.tmpdir(), 'pyfig-dependencies-'));\n try {\n const additions = path.join(temporary, 'runtime-dependencies.txt');\n const resolved = path.join(temporary, 'resolved-dependencies.txt');\n const pyproject = path.join(options.projectRoot, 'pyproject.toml');\n const hasPyproject = fs.existsSync(pyproject);\n if (!hasPyproject && (\n dependencyOptions.extras.length > 0 ||\n dependencyOptions.groups.length > 0 ||\n dependencyOptions.allExtras\n )) {\n throw new Error('Runtime extras and groups require an existing pyproject.toml.');\n }\n const sources = hasPyproject ? [pyproject] : [];\n if (dependencies.length > 0) {\n await writeFile(additions, `${dependencies.join('\\n')}\\n`, 'utf8');\n sources.push(additions);\n }\n const selectionArgs = [\n ...dependencyOptions.extras.flatMap((extra) => ['--extra', extra]),\n ...dependencyOptions.groups.flatMap((group) => ['--group', group]),\n ...(dependencyOptions.allExtras ? ['--all-extras'] : []),\n ];\n await runAsync(\n uv.executable,\n [\n 'pip', 'compile', '--no-config', '--python', python.executable, ...selectionArgs,\n ...sources, '--output-file', resolved,\n ],\n targetUvEnvironment(options, python),\n options.installTimeoutMs,\n undefined,\n options.projectRoot,\n );\n // install preserves unrelated packages; sync would remove anything not\n // represented in this temporary resolution.\n await runAsync(\n uv.executable,\n ['pip', 'install', '--no-config', '--python', python.executable, '-r', resolved],\n targetUvEnvironment(options, python),\n options.installTimeoutMs,\n undefined,\n options.projectRoot,\n );\n } finally {\n await rm(temporary, { recursive: true, force: true });\n }\n return true;\n },\n });\n}\n\nasync function ensureUvResolved(options: ResolvedPyfigOptions): Promise<UvInfo> {\n const existing = await findAvailableUv(options);\n if (existing) return existing;\n if (!options.installUv) {\n throw new Error(\n `Compatible uv is unavailable (requires-uv ${options.requiresUv}), and uv installation is disabled.`,\n );\n }\n\n const policyKey = createHash('sha256').update(options.requiresUv).digest('hex');\n return withProvisioningLock({\n key: `uv-policy:${canonicalPath(uvInstallRoot(options))}:${policyKey}`,\n timeoutMs: options.coordinationTimeoutMs,\n check: () => findAvailableUv(options),\n mutate: async () => {\n const release = await resolveUvRelease(options);\n const installDir = uvInstallDirectory(options, release.version);\n const executable = uvExecutable(options, release.version);\n return withProvisioningLock({\n key: `uv-release:${canonicalPath(installDir)}`,\n timeoutMs: options.coordinationTimeoutMs,\n check: () => findAvailableUv(options),\n mutate: async () => {\n await installUv(installDir, release, options);\n const result = probeUv(executable, options);\n if (!result || result.version !== release.version) {\n throw new Error(\n `Expected managed uv ${release.version}, but the installed executable did not match.`,\n );\n }\n return result;\n },\n });\n },\n });\n}\n\nasync function findAvailableUv(options: ResolvedPyfigOptions): Promise<UvInfo | null> {\n const external = await findUv(options);\n if (external) return external;\n return findManagedUv(options);\n}\n\nasync function findManagedUv(options: ResolvedPyfigOptions): Promise<UvInfo | null> {\n const entries = await readdir(uvInstallRoot(options), { withFileTypes: true }).catch(() => []);\n let versions = entries\n .filter(entry => entry.isDirectory() && normalizePep440Version(entry.name) === entry.name)\n .map(entry => entry.name);\n while (versions.length > 0) {\n const selected = maxPep440Version(versions, options.requiresUv);\n if (!selected) return null;\n const candidate = probeUv(uvExecutable(options, selected), options);\n if (candidate?.version === selected) return candidate;\n versions = versions.filter(version => version !== selected);\n }\n return null;\n}\n\nfunction normalizeDependencies(dependencies: readonly string[]): string[] {\n const normalized = dependencies.map((dependency) => dependency.trim());\n for (const dependency of normalized) {\n if (!dependency || /[\\0\\r\\n]/u.test(dependency)) {\n throw new TypeError(`Invalid runtime dependency: ${JSON.stringify(dependency)}`);\n }\n }\n return [...new Set(normalized)];\n}\n\nfunction normalizeDependencyOptions(\n options: RuntimeDependencyOptions,\n): Required<RuntimeDependencyOptions> {\n const extras = normalizeNames('extra', options.extras ?? []);\n const groups = normalizeNames('dependency group', options.groups ?? []);\n if (options.allExtras && extras.length > 0) {\n throw new TypeError('allExtras cannot be combined with explicit extras.');\n }\n return { extras, groups, allExtras: options.allExtras ?? false };\n}\n\nfunction normalizeNames(kind: string, names: readonly string[]): string[] {\n const normalized = names.map((name) => name.trim());\n for (const name of normalized) {\n if (!name || !/^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(name)) {\n throw new TypeError(`Invalid ${kind}: ${JSON.stringify(name)}`);\n }\n }\n return [...new Set(normalized)];\n}\n\nfunction isManagedEnvironment(\n python: PythonInfo,\n options: ResolvedPyfigOptions,\n): boolean {\n return Boolean(python.virtualEnvironment) && pathsEqual(\n python.virtualEnvironment as string,\n virtualEnvironmentDirectory(options.projectRoot),\n );\n}\n\nfunction isolatedUvEnvironment(options: ResolvedPyfigOptions): NodeJS.ProcessEnv {\n return sanitizeUvEnvironment(uvEnvironment(options));\n}\n\n/** Explicit --system/--managed-python selectors cannot be combined with uv's preference setting. */\nfunction explicitPythonSourceEnvironment(\n options: ResolvedPyfigOptions,\n): NodeJS.ProcessEnv {\n const env = isolatedUvEnvironment(options);\n delete env['UV_PYTHON_PREFERENCE'];\n return env;\n}\n\nfunction targetUvEnvironment(\n options: ResolvedPyfigOptions,\n python: PythonInfo,\n): NodeJS.ProcessEnv {\n return uvCommandEnvironment(uvEnvironment(options), python);\n}\n\nfunction incompatibleConfiguredPython(options: ResolvedPyfigOptions): Error {\n return new Error(\n `Configured Python ${options.python} is unavailable or does not satisfy ` +\n `requires-python ${options.requiresPython}` +\n `${options.requireEmbedding ? ' with CPython embedding files' : ''}.`,\n );\n}\n\nfunction missingPythonMessage(options: ResolvedPyfigOptions, reason: string): string {\n const embedding = options.requireEmbedding\n ? ' with compatible CPython headers, library, architecture, and GIL ABI'\n : '';\n return `No Python satisfies requires-python ${options.requiresPython}${embedding}; ${reason}.`;\n}\n\nasync function virtualEnvironmentMatchesConfiguredPython(\n virtualEnvironment: PythonInfo,\n options: ResolvedPyfigOptions,\n): Promise<boolean> {\n if (!options.python) return true;\n const configured = await probePython({ executable: options.python, args: [] }, options);\n if (!configured || !pythonSatisfiesPolicy(configured, options)) return false;\n if (configured.virtualEnvironment && pathsEqual(configured.executable, virtualEnvironment.executable)) {\n return true;\n }\n const configuredBase = configured.virtualEnvironment\n ? configured.baseExecutable\n : configured.executable;\n return pathsEqual(configuredBase, virtualEnvironment.baseExecutable);\n}\n\ninterface UvRelease {\n assets: string[];\n tag: string;\n version: string;\n}\n\ninterface UvReleaseCatalog {\n fetchedAt: number;\n releases: UvRelease[];\n}\n\nconst UV_RELEASE_PAGE_SIZE = 100;\nconst UV_RELEASE_MAX_PAGES = 20;\nconst UV_RELEASE_METADATA_TTL_MS = 24 * 60 * 60_000;\n\nasync function resolveUvRelease(options: ResolvedPyfigOptions): Promise<UvRelease> {\n const catalog = await ensureUvReleaseCatalog(options);\n const asset = uvAsset();\n const releases = catalog.releases.filter(release =>\n release.assets.includes(asset) && release.assets.includes(`${asset}.sha256`)\n );\n const version = maxPep440Version(\n releases.map(release => release.version),\n options.requiresUv,\n );\n const release = releases.find(candidate => candidate.version === version);\n if (!release) {\n throw new Error(`No published uv release satisfies requires-uv ${options.requiresUv}.`);\n }\n return release;\n}\n\nasync function ensureUvReleaseCatalog(\n options: ResolvedPyfigOptions,\n): Promise<UvReleaseCatalog> {\n const file = uvReleaseMetadataFile(options);\n const stale = await readUvReleaseCatalog(file);\n try {\n return await withProvisioningLock({\n key: `uv-metadata:${canonicalPath(file)}`,\n timeoutMs: options.coordinationTimeoutMs,\n check: () => readFreshUvReleaseCatalog(file),\n mutate: async () => {\n const catalog = await fetchUvReleaseCatalog(options);\n await writeUvReleaseCatalog(file, catalog);\n return catalog;\n },\n });\n } catch (error) {\n const fallback = await readUvReleaseCatalog(file) ?? stale;\n if (fallback) return fallback;\n throw error;\n }\n}\n\nasync function fetchUvReleaseCatalog(\n options: ResolvedPyfigOptions,\n): Promise<UvReleaseCatalog> {\n const dispatcher = proxyDispatcher(options.env);\n const releases = new Map<string, UvRelease>();\n let exhausted = false;\n try {\n for (let page = 1; page <= UV_RELEASE_MAX_PAGES; page += 1) {\n const text = await downloadText(\n `https://api.github.com/repos/astral-sh/uv/releases?per_page=${UV_RELEASE_PAGE_SIZE}&page=${page}`,\n options.downloadTimeoutMs,\n dispatcher,\n {\n Accept: 'application/vnd.github+json',\n 'User-Agent': 'pyfig',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n );\n const payload = JSON.parse(text) as unknown;\n if (!Array.isArray(payload)) {\n throw new Error('GitHub returned invalid uv release metadata.');\n }\n for (const candidate of payload) {\n if (!candidate || typeof candidate !== 'object') continue;\n const release = candidate as { assets?: unknown; draft?: unknown; tag_name?: unknown };\n if (release.draft === true || typeof release.tag_name !== 'string') continue;\n const assetNames = releaseAssetNames(release.assets);\n const version = normalizePep440Version(release.tag_name);\n if (version) {\n releases.set(version, { assets: assetNames, tag: release.tag_name, version });\n }\n }\n if (payload.length < UV_RELEASE_PAGE_SIZE) {\n exhausted = true;\n break;\n }\n }\n } finally {\n await dispatcher?.close();\n }\n\n if (!exhausted) {\n throw new Error(`uv release catalog exceeded ${UV_RELEASE_MAX_PAGES} pages.`);\n }\n if (releases.size === 0) {\n throw new Error('GitHub returned no usable uv releases.');\n }\n return { fetchedAt: Date.now(), releases: [...releases.values()] };\n}\n\nasync function readFreshUvReleaseCatalog(file: string): Promise<UvReleaseCatalog | null> {\n const catalog = await readUvReleaseCatalog(file);\n if (!catalog) return null;\n const age = Date.now() - catalog.fetchedAt;\n return age >= 0 && age < UV_RELEASE_METADATA_TTL_MS ? catalog : null;\n}\n\nasync function readUvReleaseCatalog(file: string): Promise<UvReleaseCatalog | null> {\n try {\n return parseUvReleaseCatalog(JSON.parse(await readFile(file, 'utf8')) as unknown);\n } catch {\n return null;\n }\n}\n\nfunction parseUvReleaseCatalog(value: unknown): UvReleaseCatalog | null {\n if (!value || typeof value !== 'object') return null;\n const catalog = value as { fetchedAt?: unknown; releases?: unknown };\n if (!Number.isSafeInteger(catalog.fetchedAt) || (catalog.fetchedAt as number) < 0 ||\n !Array.isArray(catalog.releases)) {\n return null;\n }\n const releases: UvRelease[] = [];\n for (const value of catalog.releases) {\n if (!value || typeof value !== 'object') return null;\n const release = value as { assets?: unknown; tag?: unknown; version?: unknown };\n if (!Array.isArray(release.assets) ||\n !release.assets.every(asset => typeof asset === 'string') ||\n typeof release.tag !== 'string' ||\n !/^[A-Za-z0-9][A-Za-z0-9._+-]*$/u.test(release.tag) ||\n typeof release.version !== 'string' ||\n normalizePep440Version(release.version) !== release.version) {\n return null;\n }\n releases.push({\n assets: release.assets as string[],\n tag: release.tag,\n version: release.version,\n });\n }\n return { fetchedAt: catalog.fetchedAt as number, releases };\n}\n\nasync function writeUvReleaseCatalog(file: string, catalog: UvReleaseCatalog): Promise<void> {\n await mkdir(path.dirname(file), { recursive: true });\n const staged = path.join(\n path.dirname(file),\n `.${path.basename(file)}.${process.pid}.${randomUUID()}.tmp`,\n );\n try {\n await writeFile(staged, `${JSON.stringify(catalog)}\\n`, { encoding: 'utf8', flag: 'wx' });\n if (process.platform === 'win32') await rm(file, { force: true });\n await rename(staged, file);\n } finally {\n await rm(staged, { force: true });\n }\n}\n\nfunction uvReleaseMetadataFile(options: ResolvedPyfigOptions): string {\n return path.join(options.cacheDir, 'metadata', 'uv-releases.json');\n}\n\nfunction releaseAssetNames(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap(entry => {\n if (!entry || typeof entry !== 'object') return [];\n const name = (entry as { name?: unknown }).name;\n return typeof name === 'string' ? [name] : [];\n });\n}\n\nfunction uvInstallRoot(options: ResolvedPyfigOptions): string {\n return path.join(options.cacheDir, 'tools', 'uv');\n}\n\nfunction uvInstallDirectory(options: ResolvedPyfigOptions, version: string): string {\n return path.join(uvInstallRoot(options), version);\n}\n\nfunction uvExecutable(options: ResolvedPyfigOptions, version: string): string {\n return path.join(\n uvInstallDirectory(options, version),\n process.platform === 'win32' ? 'uv.exe' : 'uv',\n );\n}\n\nasync function installUv(\n installDir: string,\n release: UvRelease,\n options: ResolvedPyfigOptions,\n): Promise<void> {\n const asset = uvAsset();\n const baseUrl = `https://github.com/astral-sh/uv/releases/download/${release.tag}`;\n const temporary = await mkdtemp(path.join(os.tmpdir(), 'pyfig-uv-'));\n const dispatcher = proxyDispatcher(options.env);\n try {\n const archive = path.join(temporary, asset);\n await download(`${baseUrl}/${asset}`, archive, options.downloadTimeoutMs, dispatcher);\n const expected = (await downloadText(\n `${baseUrl}/${asset}.sha256`,\n options.downloadTimeoutMs,\n dispatcher,\n )).trim().split(/\\s+/u)[0];\n const actual = await sha256File(archive);\n if (!expected || expected.toLowerCase() !== actual.toLowerCase()) {\n throw new Error(`uv archive checksum mismatch for ${asset}`);\n }\n\n const extracted = path.join(temporary, 'extracted');\n await mkdir(extracted, { recursive: true });\n const source = await extractUvExecutable(archive, asset, extracted);\n if (!source) throw new Error(`uv archive did not contain the expected executable: ${asset}`);\n await publishUvAtomically(source, installDir, release.version, options);\n } finally {\n await dispatcher?.close();\n await rm(temporary, { recursive: true, force: true });\n }\n}\n\nasync function extractUvExecutable(\n archive: string,\n asset: string,\n destination: string,\n): Promise<string | null> {\n const executableName = process.platform === 'win32' ? 'uv.exe' : 'uv';\n if (!asset.endsWith('.zip')) {\n await tar.x({ file: archive, cwd: destination, strict: true });\n return findFile(destination, executableName);\n }\n\n // ZIP entry paths are never written to disk. Extract only uv's bytes and\n // publish them at a path controlled by Pyfig, which prevents Zip Slip and\n // symlink entries from redirecting writes outside the temporary directory.\n const entries = unzipSync(await readFile(archive), {\n filter: ({ name }) => path.posix.basename(name.replaceAll('\\\\', '/')) === executableName,\n });\n const matches = Object.entries(entries)\n .filter(([name]) => path.posix.basename(name.replaceAll('\\\\', '/')) === executableName);\n if (matches.length !== 1 || !matches[0]) return null;\n const source = path.join(destination, executableName);\n await writeFile(source, matches[0][1], { flag: 'wx' });\n return source;\n}\n\nasync function publishUvAtomically(\n source: string,\n installDir: string,\n version: string,\n options: ResolvedPyfigOptions,\n): Promise<void> {\n await mkdir(installDir, { recursive: true });\n const executable = uvExecutable(options, version);\n const staged = path.join(\n installDir,\n `.${path.basename(executable)}.${process.pid}.${randomUUID()}.tmp`,\n );\n try {\n await copyFile(source, staged);\n if (process.platform !== 'win32') await chmod(staged, 0o755);\n const stagedUv = probeUv(staged, options);\n if (!stagedUv || stagedUv.version !== version) {\n throw new Error(`Downloaded uv executable is not version ${version}.`);\n }\n if (process.platform === 'win32') await rm(executable, { force: true });\n await rename(staged, executable);\n } finally {\n await rm(staged, { force: true });\n }\n}\n\nfunction uvAsset(): string {\n const architecture = process.arch === 'x64'\n ? 'x86_64'\n : process.arch === 'arm64'\n ? 'aarch64'\n : null;\n if (!architecture) throw new Error(`uv bootstrap does not support architecture ${process.arch}.`);\n if (process.platform === 'win32') return `uv-${architecture}-pc-windows-msvc.zip`;\n if (process.platform === 'darwin') return `uv-${architecture}-apple-darwin.tar.gz`;\n if (process.platform === 'linux') return `uv-${architecture}-unknown-linux-musl.tar.gz`;\n throw new Error(`uv bootstrap does not support platform ${process.platform}.`);\n}\n\nasync function download(\n url: string,\n destination: string,\n timeoutMs: number,\n dispatcher: EnvHttpProxyAgent | undefined,\n): Promise<void> {\n const response = await fetch(url, {\n dispatcher,\n redirect: 'follow',\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!response.ok || !response.body) {\n await response.body?.cancel();\n throw new Error(`Could not download ${url}: HTTP ${response.status}`);\n }\n await pipeline(\n Readable.fromWeb(response.body),\n createWriteStream(destination, { flags: 'wx' }),\n );\n}\n\nasync function downloadText(\n url: string,\n timeoutMs: number,\n dispatcher: EnvHttpProxyAgent | undefined,\n headers?: Record<string, string>,\n): Promise<string> {\n const response = await fetch(url, {\n dispatcher,\n headers,\n redirect: 'follow',\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!response.ok) {\n await response.body?.cancel();\n throw new Error(`Could not download ${url}: HTTP ${response.status}`);\n }\n return response.text();\n}\n\nfunction proxyDispatcher(env: NodeJS.ProcessEnv): EnvHttpProxyAgent | undefined {\n const httpProxy = environmentValue(env, 'http_proxy', 'HTTP_PROXY');\n const httpsProxy = environmentValue(env, 'https_proxy', 'HTTPS_PROXY');\n if (!httpProxy && !httpsProxy) return undefined;\n return new EnvHttpProxyAgent({\n httpProxy,\n httpsProxy,\n noProxy: environmentValue(env, 'no_proxy', 'NO_PROXY'),\n });\n}\n\nfunction environmentValue(\n env: NodeJS.ProcessEnv,\n lowercase: string,\n uppercase: string,\n): string | undefined {\n return env[lowercase] ?? env[uppercase];\n}\n\nasync function sha256File(file: string): Promise<string> {\n const hash = createHash('sha256');\n for await (const chunk of createReadStream(file)) hash.update(chunk);\n return hash.digest('hex');\n}\n\nasync function findFile(directory: string, name: string): Promise<string | null> {\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const target = path.join(directory, entry.name);\n if (entry.isFile() && entry.name === name) return target;\n if (entry.isDirectory()) {\n const nested = await findFile(target, name);\n if (nested) return nested;\n }\n }\n return null;\n}\n",
7
- "import path from 'node:path';\nimport * as envPaths from 'env-paths';\nimport {\n isValidPep440Specifier,\n pep440VersionSatisfies,\n} from './pep440.js';\nimport { resolveProjectRoot } from './project-root.js';\n\nexport const DEFAULT_REQUIRES_PYTHON = '>=3.10,<4';\nexport const DEFAULT_MANAGED_PYTHON = '3.12';\n// External uv only needs to support the command and isolation flags Pyfig uses.\n// The installer resolves the greatest published release allowed by this policy.\nexport const DEFAULT_REQUIRES_UV = '>=0.10,<1';\n\nconst DEFAULT_PROBE_TIMEOUT_MS = 10_000;\nconst DEFAULT_INSTALL_TIMEOUT_MS = 10 * 60_000;\nconst DEFAULT_DOWNLOAD_TIMEOUT_MS = 5 * 60_000;\n\n// Bun's CommonJS bundler wraps an external ESM default one level deeper than\n// Node.js. Normalize that boundary once instead of leaking runtime checks into\n// configuration resolution.\nconst envPathsFunction = (() => {\n const imported = envPaths.default as typeof envPaths.default | {\n default?: typeof envPaths.default;\n };\n const implementation = typeof imported === 'function' ? imported : imported.default;\n if (!implementation) throw new TypeError('env-paths did not expose its default function.');\n return implementation;\n})();\n\nexport interface PyfigOptions {\n /** Exact interpreter path that an existing or newly created venv must derive from. */\n python?: string;\n /** PEP 440 Python version specifier, matching pyproject.toml requires-python. */\n requiresPython?: string;\n /** uv Python request used only when no compatible interpreter exists. */\n managedPython?: string;\n /** PEP 440 version specifier accepted for an existing or managed uv executable. */\n requiresUv?: string;\n /** Require Python development headers and a linkable CPython library. */\n requireEmbedding?: boolean;\n /** Reject free-threaded CPython builds when the consumer requires the GIL ABI. */\n requireGil?: boolean;\n /** Shared default for the three specific setup policies. */\n autoInstall?: boolean;\n /** Allow uv to install a managed Python when no compatible interpreter exists. */\n installPython?: boolean;\n /** Allow Pyfig to install a compatible, checksum-verified uv executable. */\n installUv?: boolean;\n /** Allow creation of Pyfig's private environment under node_modules. */\n createVirtualEnvironment?: boolean;\n /** Private cache root for uv, managed Python, downloads, and coordination. */\n cacheDir?: string;\n /** Repository root that owns node_modules/.pyfig. */\n projectRoot?: string;\n /** Maximum duration of one executable capability probe. */\n probeTimeoutMs?: number;\n /** Maximum duration of a Python, uv, or venv installation subprocess. */\n installTimeoutMs?: number;\n /** Maximum duration of one uv archive or checksum request. */\n downloadTimeoutMs?: number;\n /** Maximum wait for another worker or process provisioning the same resource. */\n coordinationTimeoutMs?: number;\n /** Complete child environment and configuration source for this invocation. */\n env?: NodeJS.ProcessEnv;\n}\n\nexport interface ResolvedPyfigOptions {\n python: string;\n requiresPython: string;\n managedPython: string;\n requiresUv: string;\n requireEmbedding: boolean;\n requireGil: boolean;\n autoInstall: boolean;\n installPython: boolean;\n installUv: boolean;\n createVirtualEnvironment: boolean;\n cacheDir: string;\n projectRoot: string;\n probeTimeoutMs: number;\n installTimeoutMs: number;\n downloadTimeoutMs: number;\n coordinationTimeoutMs: number;\n env: NodeJS.ProcessEnv;\n}\n\nexport function resolveOptions(options: PyfigOptions = {}): ResolvedPyfigOptions {\n // Snapshot the environment so callers cannot change an in-flight policy by\n // mutating process.env or a reused options object after resolution.\n const env = { ...(options.env ?? process.env) };\n const requiresPython = options.requiresPython ??\n env['PYFIG_REQUIRES_PYTHON'] ?? DEFAULT_REQUIRES_PYTHON;\n const requiresUv = options.requiresUv ?? env['PYFIG_REQUIRES_UV'] ?? DEFAULT_REQUIRES_UV;\n assertPep440Specifier('requires-python', requiresPython);\n assertPep440Specifier('requires-uv', requiresUv);\n\n const managedPython = options.managedPython ??\n env['PYFIG_MANAGED_PYTHON'] ?? DEFAULT_MANAGED_PYTHON;\n assertManagedPythonRequest(managedPython, requiresPython);\n\n const probeTimeoutMs = resolveDuration(\n 'probeTimeoutMs',\n options.probeTimeoutMs,\n env['PYFIG_PROBE_TIMEOUT_MS'],\n DEFAULT_PROBE_TIMEOUT_MS,\n );\n const installTimeoutMs = resolveDuration(\n 'installTimeoutMs',\n options.installTimeoutMs,\n env['PYFIG_INSTALL_TIMEOUT_MS'],\n DEFAULT_INSTALL_TIMEOUT_MS,\n );\n const downloadTimeoutMs = resolveDuration(\n 'downloadTimeoutMs',\n options.downloadTimeoutMs,\n env['PYFIG_DOWNLOAD_TIMEOUT_MS'],\n DEFAULT_DOWNLOAD_TIMEOUT_MS,\n );\n const coordinationTimeoutMs = resolveDuration(\n 'coordinationTimeoutMs',\n options.coordinationTimeoutMs,\n env['PYFIG_COORDINATION_TIMEOUT_MS'],\n installTimeoutMs + downloadTimeoutMs + 60_000,\n );\n const configuredHome = options.cacheDir ?? env['PYFIG_HOME'];\n const cacheDir = configuredHome\n ? path.resolve(configuredHome)\n : envPathsFunction('pyfig', { suffix: '' }).cache;\n const configuredProjectRoot = options.projectRoot ?? env['PYFIG_PROJECT_ROOT'];\n const projectRoot = configuredProjectRoot\n ? path.resolve(configuredProjectRoot)\n : resolveProjectRoot(env['INIT_CWD'] ?? process.cwd());\n const autoInstall = options.autoInstall ?? parseBoolean(env['PYFIG_AUTO_INSTALL'], true);\n\n return {\n python: options.python ?? env['PYFIG_PYTHON'] ?? '',\n requiresPython,\n managedPython,\n requiresUv,\n requireEmbedding: options.requireEmbedding ?? parseBoolean(env['PYFIG_REQUIRE_EMBEDDING'], false),\n requireGil: options.requireGil ?? parseBoolean(env['PYFIG_REQUIRE_GIL'], false),\n autoInstall,\n installPython: options.installPython ?? parseBoolean(env['PYFIG_INSTALL_PYTHON'], autoInstall),\n installUv: options.installUv ?? parseBoolean(env['PYFIG_INSTALL_UV'], autoInstall),\n createVirtualEnvironment: options.createVirtualEnvironment ??\n parseBoolean(env['PYFIG_CREATE_VIRTUAL_ENVIRONMENT'], autoInstall),\n cacheDir,\n projectRoot,\n probeTimeoutMs,\n installTimeoutMs,\n downloadTimeoutMs,\n coordinationTimeoutMs,\n env,\n };\n}\n\n/** Keep uv data private while preferring a compatible system interpreter. */\nexport function uvEnvironment(options: ResolvedPyfigOptions): NodeJS.ProcessEnv {\n return {\n ...options.env,\n UV_PYTHON_INSTALL_DIR: path.join(options.cacheDir, 'python'),\n UV_CACHE_DIR: path.join(options.cacheDir, 'uv-cache'),\n UV_PYTHON_PREFERENCE: 'system',\n UV_NO_CONFIG: '1',\n };\n}\n\nfunction assertPep440Specifier(name: string, specifier: string): void {\n if (!isValidPep440Specifier(specifier)) {\n throw new TypeError(`Invalid ${name} PEP 440 specifier: ${specifier}`);\n }\n}\n\nfunction assertManagedPythonRequest(request: string, requiresPython: string): void {\n if (!request || /[\\\\/\\0\\r\\n]/u.test(request) || request.includes('..')) {\n throw new TypeError(`Invalid managed Python request: ${request}`);\n }\n if (/^\\d+\\.\\d+(?:\\.\\d+)?$/u.test(request)) {\n const normalized = request.split('.').length === 2 ? `${request}.0` : request;\n if (!pep440VersionSatisfies(normalized, requiresPython)) {\n throw new TypeError(\n `Managed Python ${request} cannot satisfy requires-python ${requiresPython}.`,\n );\n }\n }\n}\n\nfunction resolveDuration(\n name: string,\n explicit: number | undefined,\n environment: string | undefined,\n fallback: number,\n allowZero = false,\n): number {\n const value = explicit ?? (environment === undefined ? fallback : Number(environment));\n const minimum = allowZero ? 0 : 1;\n if (!Number.isSafeInteger(value) || value < minimum) {\n throw new TypeError(`${name} must be ${allowZero ? 'a non-negative' : 'a positive'} integer.`);\n }\n return value;\n}\n\nfunction parseBoolean(value: string | undefined, fallback: boolean): boolean {\n if (value === undefined) return fallback;\n if (/^(1|true|yes|on)$/iu.test(value)) return true;\n if (/^(0|false|no|off)$/iu.test(value)) return false;\n throw new TypeError(`Invalid boolean value: ${value}`);\n}\n",
5
+ "import { readFileSync } from 'node:fs';\nimport type { ResolvedPyfigOptions } from './config.js';\nimport { ensurePython, ensureUv } from './provision.js';\n\ninterface SyncResolutionRequest {\n target: 'python' | 'uv';\n options: ResolvedPyfigOptions;\n}\n\nasync function main(): Promise<void> {\n const request = JSON.parse(readFileSync(0, 'utf8')) as SyncResolutionRequest;\n const result = request.target === 'uv'\n ? await ensureUv(request.options)\n : await ensurePython(request.options);\n process.stdout.write(JSON.stringify(result));\n}\n\nmain().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(message);\n process.exitCode = 1;\n});\n",
6
+ "import { createHash, randomUUID } from 'node:crypto';\nimport { createReadStream, createWriteStream } from 'node:fs';\nimport {\n chmod,\n copyFile,\n mkdir,\n mkdtemp,\n readFile,\n readdir,\n rename,\n rm,\n stat,\n writeFile,\n} from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport { unzipSync } from 'fflate';\nimport * as tar from 'tar';\nimport { EnvHttpProxyAgent, fetch } from 'undici';\nimport {\n hasRuntimeRequirements,\n resolveOptions,\n uvProcessEnvironment,\n type PyfigOptions,\n type ResolvedPyfigOptions,\n} from './config.js';\nimport {\n createVenvIdentity,\n requirementsDigest,\n venvMatches,\n writeVenvMetadata,\n type VenvIdentity,\n} from './venv-identity.js';\nimport { withProvisioningLock } from './provision-lock.js';\nimport {\n sanitizeUvProcessEnvironment,\n uvCommandProcessEnvironment,\n} from './package-target.js';\nimport {\n maxPep440Version,\n normalizePep440Version,\n} from './pep440.js';\nimport {\n findUv,\n probePython,\n probeUv,\n pythonSatisfiesPolicy,\n type PythonInfo,\n type UvInfo,\n} from './probes.js';\nimport { runAsync } from './process.js';\nimport {\n canonicalPath,\n externalPythonVenvDirectories,\n pathsEqual,\n pythonVenvDirectory,\n pythonVenvExecutable,\n} from './python-venv.js';\n\nexport interface PythonEnvironment {\n python: PythonInfo;\n uv: UvInfo;\n /** True when the venv lives below node_modules/.pyfig/venvs. */\n managed: boolean;\n /** Full content identity for managed venvs; null for an externally owned venv. */\n venvId: string | null;\n}\n\ninterface RuntimeResolution {\n content: string;\n sha256: string;\n}\n\n/** Ensure a compatible uv executable, preferring an existing installation. */\nexport async function ensureUv(options: PyfigOptions = {}): Promise<UvInfo> {\n return ensureUvResolved(resolveOptions(options));\n}\n\n/**\n * Select an external dependency-free venv or a private content-addressed venv.\n * Only caller-provided dependency specifiers and requirements files are resolved.\n */\nexport async function ensurePython(\n options: PyfigOptions = {},\n): Promise<PythonEnvironment> {\n const resolved = resolveOptions(options);\n await validateRequirementsFiles(resolved.requirements);\n const uv = await ensureUvResolved(resolved);\n if (!hasRuntimeRequirements(resolved)) {\n const external = await findReusableExternalPythonVenv(resolved);\n if (external) {\n return { managed: false, python: external, uv, venvId: null };\n }\n }\n const basePython = await ensureBasePythonResolved(uv, resolved);\n const resolution = await resolveRuntimeDependencies(uv, basePython, resolved);\n const venv = createVenvIdentity(basePython, resolution.sha256);\n const python = await ensureManagedPythonVenv(uv, basePython, venv, resolution, resolved);\n return { managed: true, python, uv, venvId: venv.id };\n}\n\nasync function ensureManagedPythonVenv(\n uv: UvInfo,\n basePython: PythonInfo,\n venv: VenvIdentity,\n resolution: RuntimeResolution,\n options: ResolvedPyfigOptions,\n): Promise<PythonInfo> {\n const directory = pythonVenvDirectory(options.projectRoot, venv.directoryName);\n const check = async (): Promise<PythonInfo | null> => {\n if (!await venvMatches(directory, venv)) return null;\n const candidate = await inspectPythonVenv(directory, options);\n return candidate && pythonSatisfiesPolicy(candidate, options) ? candidate : null;\n };\n const existing = await check();\n if (existing) return existing;\n if (!options.createVirtualEnvironment) {\n throw new Error(\n `No compatible environment is available and creation is disabled. ` +\n `Pyfig would create ${directory}.`,\n );\n }\n\n return withProvisioningLock({\n key: `venv:${canonicalPath(directory)}`,\n timeoutMs: options.coordinationTimeoutMs,\n check,\n mutate: async () => {\n await rm(directory, { recursive: true, force: true });\n await mkdir(path.dirname(directory), { recursive: true });\n try {\n await runAsync(\n uv.executable,\n [\n 'venv',\n '--no-project',\n '--no-config',\n '--no-python-downloads',\n '--python',\n basePython.executable,\n directory,\n ],\n isolatedUvProcessEnvironment(options),\n options.installTimeoutMs,\n );\n const created = await inspectPythonVenv(directory, options);\n if (!created || !pythonSatisfiesPolicy(created, options)) {\n throw new Error(\n `uv created ${directory}, but its Python does not satisfy the requested capabilities.`,\n );\n }\n await installResolvedDependencies(uv, created, resolution, options);\n await writeVenvMetadata(directory, venv);\n const installed = await check();\n if (!installed) throw new Error(`Pyfig could not validate environment ${directory}.`);\n return installed;\n } catch (error) {\n await rm(directory, { recursive: true, force: true });\n throw error;\n }\n },\n });\n}\n\nasync function findReusableExternalPythonVenv(\n options: ResolvedPyfigOptions,\n): Promise<PythonInfo | null> {\n if (options.python) {\n const configured = await probePython({ executable: options.python, args: [] }, options);\n if (!configured || !pythonSatisfiesPolicy(configured, options)) {\n throw incompatibleConfiguredPython(options);\n }\n if (configured.virtualEnvironment) return configured;\n }\n\n for (const directory of externalPythonVenvDirectories(options.projectRoot, options.env)) {\n const info = await inspectPythonVenv(directory, options);\n if (info && pythonSatisfiesPolicy(info, options)) return info;\n }\n return null;\n}\n\nasync function ensureBasePythonResolved(\n uv: UvInfo,\n options: ResolvedPyfigOptions,\n): Promise<PythonInfo> {\n if (options.python) {\n const configured = await probePython({ executable: options.python, args: [] }, options);\n if (!configured || !pythonSatisfiesPolicy(configured, options)) {\n throw incompatibleConfiguredPython(options);\n }\n if (!configured.virtualEnvironment) return configured;\n const base = await probePython({ executable: configured.baseExecutable, args: [] }, options);\n if (base && pythonSatisfiesPolicy(base, options)) return base;\n throw incompatibleConfiguredPython(options);\n }\n\n const externalBase = await findExternalBasePython(options);\n if (externalBase) return externalBase;\n\n // Corporate and offline hosts get a strict system-only pass before Pyfig\n // considers any already-managed interpreter or network installation.\n const system = await findPythonWithUv(uv, options, 'system');\n if (system) return system;\n const cachedManaged = await findPythonWithUv(uv, options, 'managed');\n if (cachedManaged) return cachedManaged;\n if (!options.installPython) {\n throw new Error(missingPythonMessage(options, 'managed Python installation is disabled'));\n }\n\n return withProvisioningLock({\n key: `python:${canonicalPath(path.join(options.cacheDir, 'python'))}`,\n timeoutMs: options.coordinationTimeoutMs,\n check: () => findPythonWithUv(uv, options, 'managed'),\n mutate: async () => {\n await runAsync(\n uv.executable,\n ['python', 'install', '--no-config', options.managedPython],\n isolatedUvProcessEnvironment(options),\n options.installTimeoutMs,\n );\n const installed = await findPythonWithUv(uv, options, 'managed');\n if (!installed) {\n throw new Error(missingPythonMessage(\n options,\n `uv installed ${options.managedPython}, but it remains incompatible`,\n ));\n }\n return installed;\n },\n });\n}\n\nasync function findExternalBasePython(\n options: ResolvedPyfigOptions,\n): Promise<PythonInfo | null> {\n for (const directory of externalPythonVenvDirectories(options.projectRoot, options.env)) {\n const environment = await inspectPythonVenv(directory, options);\n if (!environment || !pythonSatisfiesPolicy(environment, options)) continue;\n const base = await probePython({ executable: environment.baseExecutable, args: [] }, options);\n if (base && !base.virtualEnvironment && pythonSatisfiesPolicy(base, options)) return base;\n }\n return null;\n}\n\nasync function findPythonWithUv(\n uv: UvInfo,\n options: ResolvedPyfigOptions,\n source: 'system' | 'managed',\n): Promise<PythonInfo | null> {\n for (const request of ['', options.managedPython]) {\n const args = [\n 'python',\n 'find',\n '--no-project',\n '--no-config',\n '--no-python-downloads',\n source === 'system' ? '--system' : '--managed-python',\n ];\n if (request) args.push(request);\n try {\n const { stdout } = await runAsync(\n uv.executable,\n args,\n explicitPythonSourceProcessEnvironment(options),\n options.probeTimeoutMs,\n );\n const info = await probePython({ executable: stdout.trim(), args: [] }, options);\n if (info && pythonSatisfiesPolicy(info, options)) return info;\n } catch {\n // Continue through the generic and configured version requests.\n }\n }\n\n // `uv python find` returns one match. That match can lack development\n // headers even when another installed interpreter satisfies every requested\n // capability, so inspect uv's complete installed-only inventory before\n // moving from system Python to managed Python or from cache to download.\n try {\n const { stdout } = await runAsync(\n uv.executable,\n [\n 'python',\n 'list',\n '--no-config',\n '--no-python-downloads',\n '--only-installed',\n '--output-format',\n 'json',\n source === 'system' ? '--no-managed-python' : '--managed-python',\n ],\n explicitPythonSourceProcessEnvironment(options),\n options.probeTimeoutMs,\n );\n const candidates = installedPythonPaths(stdout);\n for (const executable of candidates) {\n const info = await probePython({ executable, args: [] }, options);\n if (info && !info.virtualEnvironment && pythonSatisfiesPolicy(info, options)) {\n return info;\n }\n }\n } catch {\n // Older compatible uv releases can still use the find-based fallback.\n }\n return null;\n}\n\nfunction installedPythonPaths(output: string): string[] {\n const parsed = JSON.parse(output) as unknown;\n if (!Array.isArray(parsed)) return [];\n const paths = parsed.flatMap((entry) => {\n if (!entry || typeof entry !== 'object' || !('path' in entry)) return [];\n const candidate = (entry as { path?: unknown }).path;\n return typeof candidate === 'string' && candidate ? [candidate] : [];\n });\n return [...new Map(paths.map((candidate) => [canonicalPath(candidate), candidate])).values()];\n}\n\nasync function inspectPythonVenv(\n directory: string,\n options: ResolvedPyfigOptions,\n): Promise<PythonInfo | null> {\n const executable = pythonVenvExecutable(directory);\n const info = await probePython({ executable, args: [] }, options);\n return info?.virtualEnvironment && pathsEqual(info.virtualEnvironment, directory) ? info : null;\n}\n\nasync function resolveRuntimeDependencies(\n uv: UvInfo,\n python: PythonInfo,\n options: ResolvedPyfigOptions,\n): Promise<RuntimeResolution> {\n if (!hasRuntimeRequirements(options)) {\n return { content: '', sha256: requirementsDigest('') };\n }\n const temporary = await mkdtemp(path.join(os.tmpdir(), 'pyfig-resolution-'));\n try {\n const additions = path.join(temporary, 'runtime-dependencies.txt');\n const output = path.join(temporary, 'resolved-dependencies.txt');\n const sources = [...options.requirements];\n if (options.dependencies.length > 0) {\n await writeFile(additions, `${options.dependencies.join('\\n')}\\n`, 'utf8');\n sources.push(additions);\n }\n await runAsync(\n uv.executable,\n [\n 'pip', 'compile', '--no-config', '--no-header', '--no-annotate',\n '--generate-hashes', '--python', python.executable,\n ...sources, '--output-file', output,\n ],\n isolatedUvProcessEnvironment(options),\n options.installTimeoutMs,\n undefined,\n options.projectRoot,\n );\n const content = normalizeResolution(await readFile(output, 'utf8'));\n return { content, sha256: requirementsDigest(content) };\n } finally {\n await rm(temporary, { recursive: true, force: true });\n }\n}\n\nasync function validateRequirementsFiles(requirements: readonly string[]): Promise<void> {\n for (const requirement of requirements) {\n let information;\n try {\n information = await stat(requirement);\n } catch (error) {\n throw new Error(`Requirements file is unavailable: ${requirement}`, { cause: error });\n }\n if (!information.isFile()) {\n throw new Error(`Requirements path is not a file: ${requirement}`);\n }\n }\n}\n\nasync function installResolvedDependencies(\n uv: UvInfo,\n python: PythonInfo,\n resolution: RuntimeResolution,\n options: ResolvedPyfigOptions,\n): Promise<void> {\n if (!resolution.content) return;\n if (!python.virtualEnvironment) {\n throw new Error('Runtime dependency installation requires a virtual environment.');\n }\n const temporary = await mkdtemp(path.join(os.tmpdir(), 'pyfig-install-'));\n try {\n const requirements = path.join(temporary, 'resolved-dependencies.txt');\n await writeFile(requirements, resolution.content, { encoding: 'utf8', flag: 'wx' });\n await runAsync(\n uv.executable,\n ['pip', 'install', '--no-config', '--python', python.executable, '-r', requirements],\n targetUvProcessEnvironment(options, python),\n options.installTimeoutMs,\n undefined,\n options.projectRoot,\n );\n await runAsync(\n uv.executable,\n ['pip', 'check', '--no-config', '--python', python.executable],\n targetUvProcessEnvironment(options, python),\n options.installTimeoutMs,\n undefined,\n options.projectRoot,\n );\n } finally {\n await rm(temporary, { recursive: true, force: true });\n }\n}\n\nfunction normalizeResolution(content: string): string {\n const normalized = content.replace(/\\r\\n/gu, '\\n').trimEnd();\n return normalized ? `${normalized}\\n` : '';\n}\n\nasync function ensureUvResolved(options: ResolvedPyfigOptions): Promise<UvInfo> {\n const existing = await findAvailableUv(options);\n if (existing) return existing;\n if (!options.installUv) {\n throw new Error(\n `Compatible uv is unavailable (requires-uv ${options.requiresUv}), and uv installation is disabled.`,\n );\n }\n\n const policyKey = createHash('sha256').update(options.requiresUv).digest('hex');\n return withProvisioningLock({\n key: `uv-policy:${canonicalPath(uvInstallRoot(options))}:${policyKey}`,\n timeoutMs: options.coordinationTimeoutMs,\n check: () => findAvailableUv(options),\n mutate: async () => {\n const release = await resolveUvRelease(options);\n const installDir = uvInstallDirectory(options, release.version);\n const executable = uvExecutable(options, release.version);\n return withProvisioningLock({\n key: `uv-release:${canonicalPath(installDir)}`,\n timeoutMs: options.coordinationTimeoutMs,\n check: () => findAvailableUv(options),\n mutate: async () => {\n await installUv(installDir, release, options);\n const result = probeUv(executable, options);\n if (!result || result.version !== release.version) {\n throw new Error(\n `Expected managed uv ${release.version}, but the installed executable did not match.`,\n );\n }\n return result;\n },\n });\n },\n });\n}\n\nasync function findAvailableUv(options: ResolvedPyfigOptions): Promise<UvInfo | null> {\n const external = await findUv(options);\n if (external) return external;\n return findManagedUv(options);\n}\n\nasync function findManagedUv(options: ResolvedPyfigOptions): Promise<UvInfo | null> {\n const entries = await readdir(uvInstallRoot(options), { withFileTypes: true }).catch(() => []);\n let versions = entries\n .filter(entry => entry.isDirectory() && normalizePep440Version(entry.name) === entry.name)\n .map(entry => entry.name);\n while (versions.length > 0) {\n const selected = maxPep440Version(versions, options.requiresUv);\n if (!selected) return null;\n const candidate = probeUv(uvExecutable(options, selected), options);\n if (candidate?.version === selected) return candidate;\n versions = versions.filter(version => version !== selected);\n }\n return null;\n}\n\nfunction isolatedUvProcessEnvironment(options: ResolvedPyfigOptions): NodeJS.ProcessEnv {\n return sanitizeUvProcessEnvironment(uvProcessEnvironment(options));\n}\n\n/** Explicit --system/--managed-python selectors cannot be combined with uv's preference setting. */\nfunction explicitPythonSourceProcessEnvironment(\n options: ResolvedPyfigOptions,\n): NodeJS.ProcessEnv {\n const env = isolatedUvProcessEnvironment(options);\n delete env['UV_PYTHON_PREFERENCE'];\n return env;\n}\n\nfunction targetUvProcessEnvironment(\n options: ResolvedPyfigOptions,\n python: PythonInfo,\n): NodeJS.ProcessEnv {\n return uvCommandProcessEnvironment(uvProcessEnvironment(options), python);\n}\n\nfunction incompatibleConfiguredPython(options: ResolvedPyfigOptions): Error {\n return new Error(\n `Configured Python ${options.python} is unavailable or does not satisfy ` +\n `requires-python ${options.requiresPython}` +\n `${options.requireEmbedding ? ' with CPython embedding files' : ''}.`,\n );\n}\n\nfunction missingPythonMessage(options: ResolvedPyfigOptions, reason: string): string {\n const embedding = options.requireEmbedding\n ? ' with compatible CPython headers, library, architecture, and GIL ABI'\n : '';\n return `No Python satisfies requires-python ${options.requiresPython}${embedding}; ${reason}.`;\n}\n\ninterface UvRelease {\n assets: string[];\n tag: string;\n version: string;\n}\n\ninterface UvReleaseCatalog {\n fetchedAt: number;\n releases: UvRelease[];\n}\n\nconst UV_RELEASE_PAGE_SIZE = 100;\nconst UV_RELEASE_MAX_PAGES = 20;\nconst UV_RELEASE_METADATA_TTL_MS = 24 * 60 * 60_000;\n\nasync function resolveUvRelease(options: ResolvedPyfigOptions): Promise<UvRelease> {\n const catalog = await ensureUvReleaseCatalog(options);\n const asset = uvAsset();\n const releases = catalog.releases.filter(release =>\n release.assets.includes(asset) && release.assets.includes(`${asset}.sha256`)\n );\n const version = maxPep440Version(\n releases.map(release => release.version),\n options.requiresUv,\n );\n const release = releases.find(candidate => candidate.version === version);\n if (!release) {\n throw new Error(`No published uv release satisfies requires-uv ${options.requiresUv}.`);\n }\n return release;\n}\n\nasync function ensureUvReleaseCatalog(\n options: ResolvedPyfigOptions,\n): Promise<UvReleaseCatalog> {\n const file = uvReleaseMetadataFile(options);\n const stale = await readUvReleaseCatalog(file);\n try {\n return await withProvisioningLock({\n key: `uv-metadata:${canonicalPath(file)}`,\n timeoutMs: options.coordinationTimeoutMs,\n check: () => readFreshUvReleaseCatalog(file),\n mutate: async () => {\n const catalog = await fetchUvReleaseCatalog(options);\n await writeUvReleaseCatalog(file, catalog);\n return catalog;\n },\n });\n } catch (error) {\n const fallback = await readUvReleaseCatalog(file) ?? stale;\n if (fallback) return fallback;\n throw error;\n }\n}\n\nasync function fetchUvReleaseCatalog(\n options: ResolvedPyfigOptions,\n): Promise<UvReleaseCatalog> {\n const dispatcher = proxyDispatcher(options.env);\n const releases = new Map<string, UvRelease>();\n let exhausted = false;\n try {\n for (let page = 1; page <= UV_RELEASE_MAX_PAGES; page += 1) {\n const text = await downloadText(\n `https://api.github.com/repos/astral-sh/uv/releases?per_page=${UV_RELEASE_PAGE_SIZE}&page=${page}`,\n options.downloadTimeoutMs,\n dispatcher,\n githubApiHeaders(options.env),\n );\n const payload = JSON.parse(text) as unknown;\n if (!Array.isArray(payload)) {\n throw new Error('GitHub returned invalid uv release metadata.');\n }\n for (const candidate of payload) {\n if (!candidate || typeof candidate !== 'object') continue;\n const release = candidate as { assets?: unknown; draft?: unknown; tag_name?: unknown };\n if (release.draft === true || typeof release.tag_name !== 'string') continue;\n const assetNames = releaseAssetNames(release.assets);\n const version = normalizePep440Version(release.tag_name);\n if (version) {\n releases.set(version, { assets: assetNames, tag: release.tag_name, version });\n }\n }\n if (payload.length < UV_RELEASE_PAGE_SIZE) {\n exhausted = true;\n break;\n }\n }\n } finally {\n await dispatcher?.close();\n }\n\n if (!exhausted) {\n throw new Error(`uv release catalog exceeded ${UV_RELEASE_MAX_PAGES} pages.`);\n }\n if (releases.size === 0) {\n throw new Error('GitHub returned no usable uv releases.');\n }\n return { fetchedAt: Date.now(), releases: [...releases.values()] };\n}\n\n/** Build GitHub API headers without exposing credentials outside the request. */\nexport function githubApiHeaders(env: NodeJS.ProcessEnv): Record<string, string> {\n const token = [env['GITHUB_TOKEN'], env['GH_TOKEN']]\n .find(value => typeof value === 'string' && value.trim().length > 0);\n if (token && /[\\r\\n]/u.test(token)) {\n throw new TypeError('GitHub API token must not contain line breaks.');\n }\n return {\n Accept: 'application/vnd.github+json',\n 'User-Agent': 'pyfig',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n };\n}\n\nasync function readFreshUvReleaseCatalog(file: string): Promise<UvReleaseCatalog | null> {\n const catalog = await readUvReleaseCatalog(file);\n if (!catalog) return null;\n const age = Date.now() - catalog.fetchedAt;\n return age >= 0 && age < UV_RELEASE_METADATA_TTL_MS ? catalog : null;\n}\n\nasync function readUvReleaseCatalog(file: string): Promise<UvReleaseCatalog | null> {\n try {\n return parseUvReleaseCatalog(JSON.parse(await readFile(file, 'utf8')) as unknown);\n } catch {\n return null;\n }\n}\n\nfunction parseUvReleaseCatalog(value: unknown): UvReleaseCatalog | null {\n if (!value || typeof value !== 'object') return null;\n const catalog = value as { fetchedAt?: unknown; releases?: unknown };\n if (!Number.isSafeInteger(catalog.fetchedAt) || (catalog.fetchedAt as number) < 0 ||\n !Array.isArray(catalog.releases)) {\n return null;\n }\n const releases: UvRelease[] = [];\n for (const value of catalog.releases) {\n if (!value || typeof value !== 'object') return null;\n const release = value as { assets?: unknown; tag?: unknown; version?: unknown };\n if (!Array.isArray(release.assets) ||\n !release.assets.every(asset => typeof asset === 'string') ||\n typeof release.tag !== 'string' ||\n !/^[A-Za-z0-9][A-Za-z0-9._+-]*$/u.test(release.tag) ||\n typeof release.version !== 'string' ||\n normalizePep440Version(release.version) !== release.version) {\n return null;\n }\n releases.push({\n assets: release.assets as string[],\n tag: release.tag,\n version: release.version,\n });\n }\n return { fetchedAt: catalog.fetchedAt as number, releases };\n}\n\nasync function writeUvReleaseCatalog(file: string, catalog: UvReleaseCatalog): Promise<void> {\n await mkdir(path.dirname(file), { recursive: true });\n const staged = path.join(\n path.dirname(file),\n `.${path.basename(file)}.${process.pid}.${randomUUID()}.tmp`,\n );\n try {\n await writeFile(staged, `${JSON.stringify(catalog)}\\n`, { encoding: 'utf8', flag: 'wx' });\n if (process.platform === 'win32') await rm(file, { force: true });\n await rename(staged, file);\n } finally {\n await rm(staged, { force: true });\n }\n}\n\nfunction uvReleaseMetadataFile(options: ResolvedPyfigOptions): string {\n return path.join(options.cacheDir, 'metadata', 'uv-releases.json');\n}\n\nfunction releaseAssetNames(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap(entry => {\n if (!entry || typeof entry !== 'object') return [];\n const name = (entry as { name?: unknown }).name;\n return typeof name === 'string' ? [name] : [];\n });\n}\n\nfunction uvInstallRoot(options: ResolvedPyfigOptions): string {\n return path.join(options.cacheDir, 'tools', 'uv');\n}\n\nfunction uvInstallDirectory(options: ResolvedPyfigOptions, version: string): string {\n return path.join(uvInstallRoot(options), version);\n}\n\nfunction uvExecutable(options: ResolvedPyfigOptions, version: string): string {\n return path.join(\n uvInstallDirectory(options, version),\n process.platform === 'win32' ? 'uv.exe' : 'uv',\n );\n}\n\nasync function installUv(\n installDir: string,\n release: UvRelease,\n options: ResolvedPyfigOptions,\n): Promise<void> {\n const asset = uvAsset();\n const baseUrl = `https://github.com/astral-sh/uv/releases/download/${release.tag}`;\n const temporary = await mkdtemp(path.join(os.tmpdir(), 'pyfig-uv-'));\n const dispatcher = proxyDispatcher(options.env);\n try {\n const archive = path.join(temporary, asset);\n await download(`${baseUrl}/${asset}`, archive, options.downloadTimeoutMs, dispatcher);\n const expected = (await downloadText(\n `${baseUrl}/${asset}.sha256`,\n options.downloadTimeoutMs,\n dispatcher,\n )).trim().split(/\\s+/u)[0];\n const actual = await sha256File(archive);\n if (!expected || expected.toLowerCase() !== actual.toLowerCase()) {\n throw new Error(`uv archive checksum mismatch for ${asset}`);\n }\n\n const extracted = path.join(temporary, 'extracted');\n await mkdir(extracted, { recursive: true });\n const source = await extractUvExecutable(archive, asset, extracted);\n if (!source) throw new Error(`uv archive did not contain the expected executable: ${asset}`);\n await publishUvAtomically(source, installDir, release.version, options);\n } finally {\n await dispatcher?.close();\n await rm(temporary, { recursive: true, force: true });\n }\n}\n\nasync function extractUvExecutable(\n archive: string,\n asset: string,\n destination: string,\n): Promise<string | null> {\n const executableName = process.platform === 'win32' ? 'uv.exe' : 'uv';\n if (!asset.endsWith('.zip')) {\n await tar.x({ file: archive, cwd: destination, strict: true });\n return findFile(destination, executableName);\n }\n\n // ZIP entry paths are never written to disk. Extract only uv's bytes and\n // publish them at a path controlled by Pyfig, which prevents Zip Slip and\n // symlink entries from redirecting writes outside the temporary directory.\n const entries = unzipSync(await readFile(archive), {\n filter: ({ name }) => path.posix.basename(name.replaceAll('\\\\', '/')) === executableName,\n });\n const matches = Object.entries(entries)\n .filter(([name]) => path.posix.basename(name.replaceAll('\\\\', '/')) === executableName);\n if (matches.length !== 1 || !matches[0]) return null;\n const source = path.join(destination, executableName);\n await writeFile(source, matches[0][1], { flag: 'wx' });\n return source;\n}\n\nasync function publishUvAtomically(\n source: string,\n installDir: string,\n version: string,\n options: ResolvedPyfigOptions,\n): Promise<void> {\n await mkdir(installDir, { recursive: true });\n const executable = uvExecutable(options, version);\n const staged = path.join(\n installDir,\n `.${path.basename(executable)}.${process.pid}.${randomUUID()}.tmp`,\n );\n try {\n await copyFile(source, staged);\n if (process.platform !== 'win32') await chmod(staged, 0o755);\n const stagedUv = probeUv(staged, options);\n if (!stagedUv || stagedUv.version !== version) {\n throw new Error(`Downloaded uv executable is not version ${version}.`);\n }\n if (process.platform === 'win32') await rm(executable, { force: true });\n await rename(staged, executable);\n } finally {\n await rm(staged, { force: true });\n }\n}\n\nfunction uvAsset(): string {\n const architecture = process.arch === 'x64'\n ? 'x86_64'\n : process.arch === 'arm64'\n ? 'aarch64'\n : null;\n if (!architecture) throw new Error(`uv bootstrap does not support architecture ${process.arch}.`);\n if (process.platform === 'win32') return `uv-${architecture}-pc-windows-msvc.zip`;\n if (process.platform === 'darwin') return `uv-${architecture}-apple-darwin.tar.gz`;\n if (process.platform === 'linux') return `uv-${architecture}-unknown-linux-musl.tar.gz`;\n throw new Error(`uv bootstrap does not support platform ${process.platform}.`);\n}\n\nasync function download(\n url: string,\n destination: string,\n timeoutMs: number,\n dispatcher: EnvHttpProxyAgent | undefined,\n): Promise<void> {\n const response = await fetch(url, {\n dispatcher,\n redirect: 'follow',\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!response.ok || !response.body) {\n await response.body?.cancel();\n throw new Error(`Could not download ${url}: HTTP ${response.status}`);\n }\n await pipeline(\n Readable.fromWeb(response.body),\n createWriteStream(destination, { flags: 'wx' }),\n );\n}\n\nasync function downloadText(\n url: string,\n timeoutMs: number,\n dispatcher: EnvHttpProxyAgent | undefined,\n headers?: Record<string, string>,\n): Promise<string> {\n const response = await fetch(url, {\n dispatcher,\n headers,\n redirect: 'follow',\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!response.ok) {\n await response.body?.cancel();\n throw new Error(`Could not download ${url}: HTTP ${response.status}`);\n }\n return response.text();\n}\n\nfunction proxyDispatcher(env: NodeJS.ProcessEnv): EnvHttpProxyAgent | undefined {\n const httpProxy = processEnvironmentValue(env, 'http_proxy', 'HTTP_PROXY');\n const httpsProxy = processEnvironmentValue(env, 'https_proxy', 'HTTPS_PROXY');\n if (!httpProxy && !httpsProxy) return undefined;\n return new EnvHttpProxyAgent({\n httpProxy,\n httpsProxy,\n noProxy: processEnvironmentValue(env, 'no_proxy', 'NO_PROXY'),\n });\n}\n\nfunction processEnvironmentValue(\n env: NodeJS.ProcessEnv,\n lowercase: string,\n uppercase: string,\n): string | undefined {\n return env[lowercase] ?? env[uppercase];\n}\n\nasync function sha256File(file: string): Promise<string> {\n const hash = createHash('sha256');\n for await (const chunk of createReadStream(file)) hash.update(chunk);\n return hash.digest('hex');\n}\n\nasync function findFile(directory: string, name: string): Promise<string | null> {\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const target = path.join(directory, entry.name);\n if (entry.isFile() && entry.name === name) return target;\n if (entry.isDirectory()) {\n const nested = await findFile(target, name);\n if (nested) return nested;\n }\n }\n return null;\n}\n",
7
+ "import path from 'node:path';\nimport * as envPaths from 'env-paths';\nimport {\n isValidPep440Specifier,\n pep440VersionSatisfies,\n} from './pep440.js';\nimport { resolveProjectRoot } from './project-root.js';\n\nexport const DEFAULT_REQUIRES_PYTHON = '>=3.10,<4';\nexport const DEFAULT_MANAGED_PYTHON = '3.12';\n// External uv only needs to support the command and isolation flags Pyfig uses.\n// The installer resolves the greatest published release allowed by this policy.\nexport const DEFAULT_REQUIRES_UV = '>=0.10,<1';\n\nconst DEFAULT_PROBE_TIMEOUT_MS = 10_000;\nconst DEFAULT_INSTALL_TIMEOUT_MS = 10 * 60_000;\nconst DEFAULT_DOWNLOAD_TIMEOUT_MS = 5 * 60_000;\n\n// Bun's CommonJS bundler wraps an external ESM default one level deeper than\n// Node.js. Normalize that boundary once instead of leaking runtime checks into\n// configuration resolution.\nconst envPathsFunction = (() => {\n const imported = envPaths.default as typeof envPaths.default | {\n default?: typeof envPaths.default;\n };\n const implementation = typeof imported === 'function' ? imported : imported.default;\n if (!implementation) throw new TypeError('env-paths did not expose its default function.');\n return implementation;\n})();\n\nexport interface PyfigOptions {\n /** PEP 508 runtime dependencies resolved into this environment's private venv. */\n dependencies?: readonly string[];\n /** Explicit requirements files resolved into this environment's private venv. */\n requirements?: readonly string[];\n /** Exact interpreter path that an existing or newly created venv must derive from. */\n python?: string;\n /** PEP 440 Python version specifier accepted for the selected interpreter. */\n requiresPython?: string;\n /** uv Python request used only when no compatible interpreter exists. */\n managedPython?: string;\n /** PEP 440 version specifier accepted for an existing or managed uv executable. */\n requiresUv?: string;\n /** Require Python development headers and a linkable CPython library. */\n requireEmbedding?: boolean;\n /** Reject free-threaded CPython builds when the consumer requires the GIL ABI. */\n requireGil?: boolean;\n /** Shared default for the three specific setup policies. */\n autoInstall?: boolean;\n /** Allow uv to install a managed Python when no compatible interpreter exists. */\n installPython?: boolean;\n /** Allow Pyfig to install a compatible, checksum-verified uv executable. */\n installUv?: boolean;\n /** Allow creation of Pyfig's private environment under node_modules. */\n createVirtualEnvironment?: boolean;\n /** Private cache root for uv, managed Python, downloads, and coordination. */\n cacheDir?: string;\n /** Repository root that owns node_modules/.pyfig. */\n projectRoot?: string;\n /** Maximum duration of one executable capability probe. */\n probeTimeoutMs?: number;\n /** Maximum duration of a Python, uv, or venv installation subprocess. */\n installTimeoutMs?: number;\n /** Maximum duration of one uv archive or checksum request. */\n downloadTimeoutMs?: number;\n /** Maximum wait for another worker or process provisioning the same resource. */\n coordinationTimeoutMs?: number;\n /** Complete child environment and configuration source for this invocation. */\n env?: NodeJS.ProcessEnv;\n}\n\nexport interface ResolvedPyfigOptions {\n dependencies: readonly string[];\n requirements: readonly string[];\n python: string;\n requiresPython: string;\n managedPython: string;\n requiresUv: string;\n requireEmbedding: boolean;\n requireGil: boolean;\n autoInstall: boolean;\n installPython: boolean;\n installUv: boolean;\n createVirtualEnvironment: boolean;\n cacheDir: string;\n projectRoot: string;\n probeTimeoutMs: number;\n installTimeoutMs: number;\n downloadTimeoutMs: number;\n coordinationTimeoutMs: number;\n env: NodeJS.ProcessEnv;\n}\n\nexport function resolveOptions(options: PyfigOptions = {}): ResolvedPyfigOptions {\n // Snapshot the environment so callers cannot change an in-flight policy by\n // mutating process.env or a reused options object after resolution.\n const env = { ...(options.env ?? process.env) };\n const requiresPython = options.requiresPython ??\n env['PYFIG_REQUIRES_PYTHON'] ?? DEFAULT_REQUIRES_PYTHON;\n const requiresUv = options.requiresUv ?? env['PYFIG_REQUIRES_UV'] ?? DEFAULT_REQUIRES_UV;\n assertPep440Specifier('requires-python', requiresPython);\n assertPep440Specifier('requires-uv', requiresUv);\n\n const managedPython = options.managedPython ??\n env['PYFIG_MANAGED_PYTHON'] ?? DEFAULT_MANAGED_PYTHON;\n assertManagedPythonRequest(managedPython, requiresPython);\n\n const probeTimeoutMs = resolveDuration(\n 'probeTimeoutMs',\n options.probeTimeoutMs,\n env['PYFIG_PROBE_TIMEOUT_MS'],\n DEFAULT_PROBE_TIMEOUT_MS,\n );\n const installTimeoutMs = resolveDuration(\n 'installTimeoutMs',\n options.installTimeoutMs,\n env['PYFIG_INSTALL_TIMEOUT_MS'],\n DEFAULT_INSTALL_TIMEOUT_MS,\n );\n const downloadTimeoutMs = resolveDuration(\n 'downloadTimeoutMs',\n options.downloadTimeoutMs,\n env['PYFIG_DOWNLOAD_TIMEOUT_MS'],\n DEFAULT_DOWNLOAD_TIMEOUT_MS,\n );\n const coordinationTimeoutMs = resolveDuration(\n 'coordinationTimeoutMs',\n options.coordinationTimeoutMs,\n env['PYFIG_COORDINATION_TIMEOUT_MS'],\n installTimeoutMs + downloadTimeoutMs + 60_000,\n );\n const configuredHome = options.cacheDir ?? env['PYFIG_HOME'];\n const cacheDir = configuredHome\n ? path.resolve(configuredHome)\n : envPathsFunction('pyfig', { suffix: '' }).cache;\n const configuredProjectRoot = options.projectRoot ?? env['PYFIG_PROJECT_ROOT'];\n const projectRoot = configuredProjectRoot\n ? path.resolve(configuredProjectRoot)\n : resolveProjectRoot(env['INIT_CWD'] ?? process.cwd());\n const autoInstall = options.autoInstall ?? parseBoolean(env['PYFIG_AUTO_INSTALL'], true);\n const dependencies = normalizeDependencies(options.dependencies ?? []);\n const requirements = normalizeRequirements(options.requirements ?? [], projectRoot);\n\n return {\n dependencies,\n requirements,\n python: options.python ?? env['PYFIG_PYTHON'] ?? '',\n requiresPython,\n managedPython,\n requiresUv,\n requireEmbedding: options.requireEmbedding ?? parseBoolean(env['PYFIG_REQUIRE_EMBEDDING'], false),\n requireGil: options.requireGil ?? parseBoolean(env['PYFIG_REQUIRE_GIL'], false),\n autoInstall,\n installPython: options.installPython ?? parseBoolean(env['PYFIG_INSTALL_PYTHON'], autoInstall),\n installUv: options.installUv ?? parseBoolean(env['PYFIG_INSTALL_UV'], autoInstall),\n createVirtualEnvironment: options.createVirtualEnvironment ??\n parseBoolean(env['PYFIG_CREATE_VIRTUAL_ENVIRONMENT'], autoInstall),\n cacheDir,\n projectRoot,\n probeTimeoutMs,\n installTimeoutMs,\n downloadTimeoutMs,\n coordinationTimeoutMs,\n env,\n };\n}\n\nexport function hasRuntimeRequirements(\n options: Pick<ResolvedPyfigOptions, 'dependencies' | 'requirements'>,\n): boolean {\n return options.dependencies.length > 0 || options.requirements.length > 0;\n}\n\n/** Keep uv data private while preferring a compatible system interpreter. */\nexport function uvProcessEnvironment(options: ResolvedPyfigOptions): NodeJS.ProcessEnv {\n return {\n ...options.env,\n UV_PYTHON_INSTALL_DIR: path.join(options.cacheDir, 'python'),\n UV_CACHE_DIR: path.join(options.cacheDir, 'uv-cache'),\n UV_PYTHON_PREFERENCE: 'system',\n UV_NO_CONFIG: '1',\n };\n}\n\nfunction assertPep440Specifier(name: string, specifier: string): void {\n if (!isValidPep440Specifier(specifier)) {\n throw new TypeError(`Invalid ${name} PEP 440 specifier: ${specifier}`);\n }\n}\n\nfunction assertManagedPythonRequest(request: string, requiresPython: string): void {\n if (!request || /[\\\\/\\0\\r\\n]/u.test(request) || request.includes('..')) {\n throw new TypeError(`Invalid managed Python request: ${request}`);\n }\n if (/^\\d+\\.\\d+(?:\\.\\d+)?$/u.test(request)) {\n const normalized = request.split('.').length === 2 ? `${request}.0` : request;\n if (!pep440VersionSatisfies(normalized, requiresPython)) {\n throw new TypeError(\n `Managed Python ${request} cannot satisfy requires-python ${requiresPython}.`,\n );\n }\n }\n}\n\nfunction resolveDuration(\n name: string,\n explicit: number | undefined,\n environment: string | undefined,\n fallback: number,\n allowZero = false,\n): number {\n const value = explicit ?? (environment === undefined ? fallback : Number(environment));\n const minimum = allowZero ? 0 : 1;\n if (!Number.isSafeInteger(value) || value < minimum) {\n throw new TypeError(`${name} must be ${allowZero ? 'a non-negative' : 'a positive'} integer.`);\n }\n return value;\n}\n\nfunction parseBoolean(value: string | undefined, fallback: boolean): boolean {\n if (value === undefined) return fallback;\n if (/^(1|true|yes|on)$/iu.test(value)) return true;\n if (/^(0|false|no|off)$/iu.test(value)) return false;\n throw new TypeError(`Invalid boolean value: ${value}`);\n}\n\nfunction normalizeDependencies(dependencies: readonly string[]): string[] {\n const normalized = dependencies.map((dependency) => dependency.trim());\n for (const dependency of normalized) {\n if (!dependency || /[\\0\\r\\n]/u.test(dependency)) {\n throw new TypeError(`Invalid runtime dependency: ${JSON.stringify(dependency)}`);\n }\n }\n // uv owns requirement parsing and source priority. Preserve caller order so\n // direct URLs, Git references, local files, and index directives retain uv's semantics.\n return normalized;\n}\n\nfunction normalizeRequirements(requirements: readonly string[], projectRoot: string): string[] {\n const normalized: string[] = [];\n for (const requirement of requirements) {\n const candidate = requirement.trim();\n if (!candidate || /[\\0\\r\\n]/u.test(candidate)) {\n throw new TypeError(`Invalid requirements file path: ${JSON.stringify(candidate)}`);\n }\n const absolute = path.resolve(projectRoot, candidate);\n const basename = path.basename(absolute).toLowerCase();\n if (isPythonProjectFile(basename)) {\n throw new TypeError(\n `Expected a requirements file, not Python project metadata: ${absolute}`,\n );\n }\n normalized.push(absolute);\n }\n return normalized;\n}\n\nconst PYTHON_PROJECT_FILES = new Set([\n 'pdm.lock',\n 'pipfile',\n 'pipfile.lock',\n 'poetry.lock',\n 'pyproject.toml',\n 'setup.cfg',\n 'setup.py',\n 'uv.lock',\n]);\n\nfunction isPythonProjectFile(basename: string): boolean {\n return PYTHON_PROJECT_FILES.has(basename) || /^pylock(?:\\.[^.]+)?\\.toml$/u.test(basename);\n}\n",
8
8
  "import {\n filter,\n maxSatisfying,\n valid as validPep440Version,\n validRange as validPep440Specifier,\n} from '@renovatebot/pep440';\n\n/** Validate a PEP 440 version specifier used by a runtime policy. */\nexport function isValidPep440Specifier(specifier: string): boolean {\n return validPep440Specifier(specifier);\n}\n\n/** Normalize a PEP 440 version, or reject invalid input. */\nexport function normalizePep440Version(version: string): string | null {\n return validPep440Version(version);\n}\n\n/**\n * Match a version using PEP 440 specifier-set behavior, including its\n * pre-release fallback when the candidate set has no matching final release.\n */\nexport function pep440VersionSatisfies(version: string, specifier: string): boolean {\n return filter([version], specifier).length === 1;\n}\n\n/** Select the greatest PEP 440 version allowed by a specifier. */\nexport function maxPep440Version(\n versions: readonly string[],\n specifier: string,\n): string | null {\n return maxSatisfying([...versions], specifier);\n}\n",
9
9
  "import fs from 'node:fs';\nimport path from 'node:path';\n\n/** Resolve the nearest Git worktree without interpreting project manifests. */\nexport function resolveProjectRoot(startDirectory: string = process.cwd()): string {\n const start = path.resolve(startDirectory);\n for (const directory of ancestors(start)) {\n if (fs.existsSync(path.join(directory, '.git'))) return directory;\n }\n return start;\n}\n\nfunction* ancestors(startDirectory: string): Generator<string> {\n let directory = startDirectory;\n while (true) {\n yield directory;\n const parent = path.dirname(directory);\n if (parent === directory) return;\n directory = parent;\n }\n}\n",
10
+ "import { createHash, randomUUID } from 'node:crypto';\nimport { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { PythonInfo } from './probes.js';\nimport { canonicalPath } from './python-venv.js';\n\nexport const VENV_SCHEMA = 1;\nexport const VENV_METADATA = '.pyfig-venv.json';\n\nexport interface VenvContract {\n schema: typeof VENV_SCHEMA;\n runtime: {\n architecture: string;\n platform: NodeJS.Platform;\n };\n python: {\n architecture: string;\n baseExecutable: string;\n basePrefix: string;\n embeddingHeader: string | null;\n embeddingLibrary: string | null;\n gilDisabled: boolean;\n implementation: string;\n pointerBits: number;\n version: string;\n };\n requirementsSha256: string;\n}\n\nexport interface VenvIdentity {\n contract: VenvContract;\n directoryName: string;\n id: string;\n}\n\ninterface VenvMetadata {\n contract: VenvContract;\n venvId: string;\n}\n\n/** Derive one stable venv identity from its interpreter and exact resolution. */\nexport function createVenvIdentity(\n python: PythonInfo,\n requirementsSha256: string,\n): VenvIdentity {\n const contract: VenvContract = {\n schema: VENV_SCHEMA,\n runtime: {\n architecture: process.arch,\n platform: process.platform,\n },\n python: {\n architecture: python.architecture,\n baseExecutable: canonicalPath(python.executable),\n basePrefix: canonicalPath(python.basePrefix),\n embeddingHeader: python.embedding ? canonicalPath(python.embedding.headerPath) : null,\n embeddingLibrary: python.embedding ? canonicalPath(python.embedding.libraryPath) : null,\n gilDisabled: python.gilDisabled,\n implementation: python.implementation,\n pointerBits: python.pointerBits,\n version: python.version,\n },\n requirementsSha256,\n };\n const id = sha256(JSON.stringify(contract));\n const implementation = safePathSegment(python.implementation);\n const version = safePathSegment(python.version);\n return {\n contract,\n directoryName: `${implementation}-${version}-${id.slice(0, 20)}`,\n id,\n };\n}\n\nexport function requirementsDigest(content: string): string {\n return sha256(content);\n}\n\nexport function venvMetadataFile(directory: string): string {\n return path.join(directory, VENV_METADATA);\n}\n\n/** Metadata is the publication marker; an environment without it is incomplete. */\nexport async function venvMatches(\n directory: string,\n venv: VenvIdentity,\n): Promise<boolean> {\n try {\n const parsed = JSON.parse(\n await readFile(venvMetadataFile(directory), 'utf8'),\n ) as VenvMetadata;\n return parsed.venvId === venv.id &&\n JSON.stringify(parsed.contract) === JSON.stringify(venv.contract);\n } catch {\n return false;\n }\n}\n\n/** Publish the venv marker atomically after creation and installation succeed. */\nexport async function writeVenvMetadata(\n directory: string,\n venv: VenvIdentity,\n): Promise<void> {\n await mkdir(directory, { recursive: true });\n const file = venvMetadataFile(directory);\n const staged = `${file}.${process.pid}.${randomUUID()}.tmp`;\n const metadata: VenvMetadata = {\n contract: venv.contract,\n venvId: venv.id,\n };\n try {\n await writeFile(staged, `${JSON.stringify(metadata, null, 2)}\\n`, {\n encoding: 'utf8',\n flag: 'wx',\n });\n await rename(staged, file);\n } finally {\n await rm(staged, { force: true });\n }\n}\n\nfunction safePathSegment(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9.-]+/gu, '-').replace(/^-+|-+$/gu, '') || 'python';\n}\n\nfunction sha256(value: string): string {\n return createHash('sha256').update(value).digest('hex');\n}\n",
11
+ "import fs from 'node:fs';\nimport path from 'node:path';\n\nexport const VIRTUAL_ENV_ROOT_NAME = path.join('node_modules', '.pyfig', 'venvs');\n\nexport function pythonVenvRoot(projectRoot: string): string {\n return path.join(projectRoot, VIRTUAL_ENV_ROOT_NAME);\n}\n\nexport function pythonVenvDirectory(projectRoot: string, venvDirectory: string): string {\n return path.join(pythonVenvRoot(projectRoot), venvDirectory);\n}\n\n/** Existing application environments are eligible for read-only reuse. */\nexport function externalPythonVenvDirectories(\n projectRoot: string,\n env: NodeJS.ProcessEnv,\n): string[] {\n const candidates = [env['VIRTUAL_ENV'], path.join(projectRoot, '.venv')]\n .filter((value): value is string => Boolean(value))\n .map((value) => path.resolve(value));\n return [...new Map(candidates.map((value) => [canonicalPath(value), value])).values()];\n}\n\nexport function pythonVenvExecutable(pythonVenv: string): string {\n return path.join(\n pythonVenv,\n process.platform === 'win32' ? 'Scripts' : 'bin',\n process.platform === 'win32' ? 'python.exe' : 'python',\n );\n}\n\n/** Apply the environment changes that shell activation scripts make for child processes. */\nexport function activatePythonVenv(\n env: NodeJS.ProcessEnv,\n pythonVenv: string,\n pythonExecutable: string,\n): NodeJS.ProcessEnv {\n const activated = { ...env };\n const pathEntry = Object.keys(activated).find((key) => key.toUpperCase() === 'PATH');\n const existingPath = pathEntry ? activated[pathEntry] : undefined;\n for (const key of Object.keys(activated)) {\n const normalized = key.toUpperCase();\n if (normalized === 'PATH' || normalized === 'PYTHONHOME' || normalized === 'VIRTUAL_ENV') {\n delete activated[key];\n }\n }\n activated['PATH'] = [path.dirname(pythonExecutable), existingPath]\n .filter((value): value is string => Boolean(value))\n .join(path.delimiter);\n activated['VIRTUAL_ENV'] = pythonVenv;\n return activated;\n}\n\nexport function pathsEqual(left: string, right: string): boolean {\n return canonicalPath(left) === canonicalPath(right);\n}\n\n/** Canonicalize existing paths so symlink, junction, and filesystem casing aliases compare equally. */\nexport function canonicalPath(value: string): string {\n const resolved = path.resolve(value);\n let canonical = resolved;\n try {\n canonical = fs.realpathSync.native(resolved);\n } catch {\n // Paths being provisioned do not exist yet; the absolute spelling is the best stable key.\n }\n return process.platform === 'win32' ? canonical.toLowerCase() : canonical;\n}\n",
10
12
  "import { withLock } from 'loqkit';\n\nexport interface ProvisioningLockOptions<T> {\n /** Stable logical identity shared by every caller of the protected resource. */\n key: string;\n timeoutMs: number;\n check: () => Promise<T | null>;\n mutate: () => Promise<T>;\n}\n\n/** Use Loqkit's layered lock and predicate checks for one idempotent mutation. */\nexport async function withProvisioningLock<T>(\n options: ProvisioningLockOptions<T>,\n): Promise<T> {\n let existing: { value: T } | undefined;\n const result = await withLock(\n { resource: options.key },\n options.mutate,\n {\n key: options.key,\n name: 'Pyfig provisioning',\n namespace: 'pyfig',\n timeout: options.timeoutMs,\n predicate: async () => {\n const value = await options.check();\n if (value === null) return true;\n existing = { value };\n return false;\n },\n },\n );\n\n if (result.context.state === 'executed') return result.value as T;\n if (existing) return existing.value;\n throw new Error(`Provisioning check for ${options.key} did not produce a resource.`);\n}\n",
11
- "import fs from 'node:fs';\nimport path from 'node:path';\n\nexport const VIRTUAL_ENV_DIRECTORY_NAME = path.join('node_modules', '.pyfig', 'venv');\n\nexport function virtualEnvironmentDirectory(projectRoot: string): string {\n return path.join(projectRoot, VIRTUAL_ENV_DIRECTORY_NAME);\n}\n\n/** Existing application environments are eligible for read-only reuse. */\nexport function externalVirtualEnvironmentDirectories(\n projectRoot: string,\n env: NodeJS.ProcessEnv,\n): string[] {\n const candidates = [env['VIRTUAL_ENV'], path.join(projectRoot, '.venv')]\n .filter((value): value is string => Boolean(value))\n .map((value) => path.resolve(value));\n return [...new Map(candidates.map((value) => [canonicalPath(value), value])).values()];\n}\n\nexport function virtualEnvironmentPythonExecutable(virtualEnvironment: string): string {\n return path.join(\n virtualEnvironment,\n process.platform === 'win32' ? 'Scripts' : 'bin',\n process.platform === 'win32' ? 'python.exe' : 'python',\n );\n}\n\n/** Apply the environment changes that shell activation scripts make for child processes. */\nexport function activateVirtualEnvironment(\n env: NodeJS.ProcessEnv,\n virtualEnvironment: string,\n pythonExecutable: string,\n): NodeJS.ProcessEnv {\n const activated = { ...env };\n const pathEntry = Object.keys(activated).find((key) => key.toUpperCase() === 'PATH');\n const existingPath = pathEntry ? activated[pathEntry] : undefined;\n for (const key of Object.keys(activated)) {\n const normalized = key.toUpperCase();\n if (normalized === 'PATH' || normalized === 'PYTHONHOME' || normalized === 'VIRTUAL_ENV') {\n delete activated[key];\n }\n }\n activated['PATH'] = [path.dirname(pythonExecutable), existingPath]\n .filter((value): value is string => Boolean(value))\n .join(path.delimiter);\n activated['VIRTUAL_ENV'] = virtualEnvironment;\n return activated;\n}\n\nexport function pathsEqual(left: string, right: string): boolean {\n return canonicalPath(left) === canonicalPath(right);\n}\n\n/** Canonicalize existing paths so symlink, junction, and filesystem casing aliases compare equally. */\nexport function canonicalPath(value: string): string {\n const resolved = path.resolve(value);\n let canonical = resolved;\n try {\n canonical = fs.realpathSync.native(resolved);\n } catch {\n // Paths being provisioned do not exist yet; the absolute spelling is the best stable key.\n }\n return process.platform === 'win32' ? canonical.toLowerCase() : canonical;\n}\n",
12
- "import type { PythonInfo } from './probes.js';\nimport { activateVirtualEnvironment } from './virtual-environment.js';\n\nconst TARGET_OPTIONS = new Set([\n '--active',\n '--config-file',\n '--directory',\n '--isolated',\n '--prefix',\n '--project',\n '--python',\n '--root',\n '--system',\n '--target',\n '--user',\n]);\n\nconst TARGET_ENVIRONMENT_VARIABLES = new Set([\n 'CONDA_PREFIX',\n 'PIP_PREFIX',\n 'PIP_PYTHON',\n 'PIP_ROOT',\n 'PIP_TARGET',\n 'PIP_USER',\n 'PYTHONHOME',\n 'PYTHONUSERBASE',\n 'UV_CONFIG_FILE',\n 'UV_PROJECT',\n 'UV_PROJECT_ENVIRONMENT',\n 'UV_PYTHON',\n 'UV_PREFIX',\n 'UV_ROOT',\n 'UV_SYSTEM_PYTHON',\n 'UV_TARGET',\n]);\n\nexport function uvCommandNeedsEnvironment(args: readonly string[]): boolean {\n return args[0] === 'pip' || args[0] === 'run';\n}\n\n/** Pin uv pip and uv run to the environment selected by Pyfig. */\nexport function targetUvArguments(\n args: readonly string[],\n python: PythonInfo,\n): string[] {\n if (!python.virtualEnvironment) {\n throw new Error('Targeted uv commands require a virtual environment.');\n }\n assertNoTargetOverride(args);\n if (args[0] === 'run') {\n return ['run', '--no-project', '--python', python.executable, ...args.slice(1)];\n }\n if (args[0] === 'pip' && args[1]) {\n return ['pip', args[1], '--python', python.executable, ...args.slice(2)];\n }\n return [...args];\n}\n\nexport function uvCommandEnvironment(\n env: NodeJS.ProcessEnv,\n python?: PythonInfo,\n): NodeJS.ProcessEnv {\n const sanitized = sanitizeUvEnvironment(env);\n if (!python?.virtualEnvironment) return sanitized;\n return {\n ...activateVirtualEnvironment(\n sanitized,\n python.virtualEnvironment,\n python.executable,\n ),\n UV_PYTHON: python.executable,\n };\n}\n\n/** Remove inherited values that could redirect uv away from an explicit target. */\nexport function sanitizeUvEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const sanitized = { ...env };\n for (const key of Object.keys(sanitized)) {\n if (TARGET_ENVIRONMENT_VARIABLES.has(key.toUpperCase())) delete sanitized[key];\n }\n return sanitized;\n}\n\nfunction assertNoTargetOverride(args: readonly string[]): void {\n for (const argument of args.slice(1)) {\n if (argument === '--') return;\n const [name] = argument.split('=', 1);\n if (name && TARGET_OPTIONS.has(name)) {\n throw new Error(`${name} cannot override the environment selected by Pyfig.`);\n }\n if (argument === '-p' || argument.startsWith('-p=') || /^-p[^-]/u.test(argument)) {\n throw new Error('-p cannot override the environment selected by Pyfig.');\n }\n }\n}\n",
13
+ "import type { PythonInfo } from './probes.js';\nimport { activatePythonVenv } from './python-venv.js';\n\nconst TARGET_OPTIONS = new Set([\n '--active',\n '--config-file',\n '--directory',\n '--isolated',\n '--prefix',\n '--project',\n '--python',\n '--root',\n '--system',\n '--target',\n '--user',\n]);\n\nconst TARGET_ENVIRONMENT_VARIABLES = new Set([\n 'CONDA_PREFIX',\n 'PIP_PREFIX',\n 'PIP_PYTHON',\n 'PIP_ROOT',\n 'PIP_TARGET',\n 'PIP_USER',\n 'PYTHONHOME',\n 'PYTHONUSERBASE',\n 'UV_CONFIG_FILE',\n 'UV_PROJECT',\n 'UV_PROJECT_ENVIRONMENT',\n 'UV_PYTHON',\n 'UV_PREFIX',\n 'UV_ROOT',\n 'UV_SYSTEM_PYTHON',\n 'UV_TARGET',\n]);\n\nexport function uvCommandNeedsPython(args: readonly string[]): boolean {\n return args[0] === 'pip' || args[0] === 'run';\n}\n\n/** Pin uv pip and uv run to the environment selected by Pyfig. */\nexport function targetUvArguments(\n args: readonly string[],\n python: PythonInfo,\n): string[] {\n if (!python.virtualEnvironment) {\n throw new Error('Targeted uv commands require a virtual environment.');\n }\n assertNoTargetOverride(args);\n if (args[0] === 'run') {\n return ['run', '--no-project', '--python', python.executable, ...args.slice(1)];\n }\n if (args[0] === 'pip' && args[1]) {\n return ['pip', args[1], '--python', python.executable, ...args.slice(2)];\n }\n return [...args];\n}\n\nexport function uvCommandProcessEnvironment(\n env: NodeJS.ProcessEnv,\n python?: PythonInfo,\n): NodeJS.ProcessEnv {\n const sanitized = sanitizeUvProcessEnvironment(env);\n if (!python?.virtualEnvironment) return sanitized;\n return {\n ...activatePythonVenv(\n sanitized,\n python.virtualEnvironment,\n python.executable,\n ),\n UV_PYTHON: python.executable,\n };\n}\n\n/** Remove inherited values that could redirect uv away from an explicit target. */\nexport function sanitizeUvProcessEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const sanitized = { ...env };\n for (const key of Object.keys(sanitized)) {\n if (TARGET_ENVIRONMENT_VARIABLES.has(key.toUpperCase())) delete sanitized[key];\n }\n return sanitized;\n}\n\nfunction assertNoTargetOverride(args: readonly string[]): void {\n for (const argument of args.slice(1)) {\n if (argument === '--') return;\n const [name] = argument.split('=', 1);\n if (name && TARGET_OPTIONS.has(name)) {\n throw new Error(`${name} cannot override the environment selected by Pyfig.`);\n }\n if (argument === '-p' || argument.startsWith('-p=') || /^-p[^-]/u.test(argument)) {\n throw new Error('-p cannot override the environment selected by Pyfig.');\n }\n }\n}\n",
13
14
  "import { spawn, spawnSync } from 'node:child_process';\nimport path from 'node:path';\nimport which from 'which';\n\nexport interface CommandSpec {\n executable: string;\n args: string[];\n}\n\nexport interface RunResult {\n stdout: string;\n stderr: string;\n}\n\nexport async function resolveExecutable(\n value: string,\n env: NodeJS.ProcessEnv,\n): Promise<string | null> {\n if (!value) return null;\n if (path.isAbsolute(value)) {\n return await which(value, { nothrow: true, path: env['PATH'], pathExt: env['PATHEXT'] });\n }\n if (!/^[A-Za-z0-9_.-]+$/u.test(value)) return null;\n return await which(value, { nothrow: true, path: env['PATH'], pathExt: env['PATHEXT'] });\n}\n\nexport function run(\n executable: string,\n args: string[],\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n): RunResult {\n const result = spawnSync(executable, args, {\n encoding: 'utf8',\n env,\n timeout: timeoutMs,\n maxBuffer: 4 * 1024 * 1024,\n windowsHide: true,\n });\n if (result.status !== 0 || result.error) {\n const detail = result.stderr?.trim() || result.error?.message || `exit ${result.status}`;\n throw new Error(`${path.basename(executable)} ${args.slice(0, 3).join(' ')} failed: ${detail}`);\n }\n return { stdout: result.stdout, stderr: result.stderr };\n}\n\n/** Run a child without blocking lock heartbeats or other coordination timers. */\nexport async function runAsync(\n executable: string,\n args: string[],\n env: NodeJS.ProcessEnv,\n timeoutMs: number,\n signal?: AbortSignal,\n cwd?: string,\n): Promise<RunResult> {\n return new Promise<RunResult>((resolve, reject) => {\n const child = spawn(executable, args, {\n env,\n cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n });\n let stdout = '';\n let stderr = '';\n let settled = false;\n const finish = (error?: Error, result?: RunResult): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', abort);\n if (error) reject(error);\n else if (result) resolve(result);\n };\n const abort = (): void => {\n child.kill();\n const reason = signal?.reason;\n finish(reason instanceof Error ? reason : new Error(`${path.basename(executable)} was aborted.`));\n };\n const timer = setTimeout(() => {\n child.kill();\n finish(new Error(`${path.basename(executable)} timed out after ${timeoutMs}ms.`));\n }, timeoutMs);\n\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n child.stdout.on('data', (chunk: string) => {\n stdout += chunk;\n if (stdout.length > 4 * 1024 * 1024) {\n child.kill();\n finish(new Error(`${path.basename(executable)} exceeded the output limit.`));\n }\n });\n child.stderr.on('data', (chunk: string) => {\n stderr += chunk;\n if (stderr.length > 4 * 1024 * 1024) {\n child.kill();\n finish(new Error(`${path.basename(executable)} exceeded the error-output limit.`));\n }\n });\n child.once('error', (error) => finish(error));\n child.once('close', (code, childSignal) => {\n if (code !== 0) {\n const detail = stderr.trim() || (childSignal ? `signal ${childSignal}` : `exit ${code}`);\n finish(new Error(`${path.basename(executable)} ${args.slice(0, 3).join(' ')} failed: ${detail}`));\n return;\n }\n finish(undefined, { stdout, stderr });\n });\n\n if (signal?.aborted) abort();\n else signal?.addEventListener('abort', abort, { once: true });\n });\n}\n",
14
15
  "import type { ResolvedPyfigOptions } from './config.js';\nimport { normalizePep440Version, pep440VersionSatisfies } from './pep440.js';\nimport { resolveExecutable, run, type CommandSpec } from './process.js';\n\nexport interface PythonInfo {\n executable: string;\n baseExecutable: string;\n version: string;\n major: number;\n minor: number;\n patch: number;\n releaseLevel: string;\n implementation: string;\n architecture: string;\n pointerBits: number;\n prefix: string;\n basePrefix: string;\n virtualEnvironment: string | null;\n gilDisabled: boolean;\n embedding: PythonEmbeddingInfo | null;\n}\n\nexport interface PythonEmbeddingInfo {\n includeDirectory: string;\n headerPath: string;\n libraryPath: string;\n libraryDirectory: string;\n libraryName: string;\n libraryKind: 'import' | 'shared' | 'static';\n stableAbiLibraryPath: string | null;\n}\n\nexport interface UvInfo {\n executable: string;\n version: string;\n}\n\nconst PYTHON_PROBE = `\nimport json\nimport os\nimport platform\nimport struct\nimport sys\nimport sysconfig\n\nbase_prefix = getattr(sys, \"base_prefix\", sys.prefix)\ninclude_directory = sysconfig.get_path(\"include\") or \"\"\nheader_path = os.path.join(include_directory, \"Python.h\") if include_directory else \"\"\nlibrary_candidates = []\nstable_abi_library_candidates = []\nif os.name == \"nt\":\n library_directory = sysconfig.get_config_var(\"LIBDIR\") or os.path.join(base_prefix, \"libs\")\n configured_library = sysconfig.get_config_var(\"LDLIBRARY\") or \"\"\n if configured_library:\n library_candidates.append(os.path.join(library_directory, os.path.splitext(configured_library)[0] + \".lib\"))\n library_candidates.append(os.path.join(library_directory, f\"python{sys.version_info.major}{sys.version_info.minor}.lib\"))\n stable_abi_library_candidates.append(os.path.join(library_directory, \"python3.lib\"))\nelse:\n library_directories = [\n sysconfig.get_config_var(\"LIBDIR\"),\n sysconfig.get_config_var(\"LIBPL\"),\n os.path.join(base_prefix, \"lib\"),\n ]\n library_names = [\n sysconfig.get_config_var(\"LDLIBRARY\"),\n sysconfig.get_config_var(\"LIBRARY\"),\n ]\n for directory in library_directories:\n for name in library_names:\n if directory and name:\n library_candidates.append(os.path.join(directory, name))\n if directory:\n stable_abi_library_candidates.extend([\n os.path.join(directory, \"libpython3.so\"),\n os.path.join(directory, \"libpython3.dylib\"),\n ])\n\nlibrary_path = next((candidate for candidate in library_candidates if os.path.isfile(candidate)), \"\")\nstable_abi_library_path = next(\n (candidate for candidate in stable_abi_library_candidates if os.path.isfile(candidate)),\n None,\n)\nembedding = None\nif os.path.isfile(header_path) and library_path:\n library_name = os.path.basename(library_path)\n library_kind = \"import\" if os.name == \"nt\" else (\"static\" if library_name.endswith(\".a\") else \"shared\")\n embedding = {\n \"includeDirectory\": include_directory,\n \"headerPath\": header_path,\n \"libraryPath\": library_path,\n \"libraryDirectory\": os.path.dirname(library_path),\n \"libraryName\": library_name,\n \"libraryKind\": library_kind,\n \"stableAbiLibraryPath\": stable_abi_library_path,\n }\n\nrelease_level = sys.version_info.releaselevel\nrelease_suffixes = {\n \"alpha\": \"a\",\n \"beta\": \"b\",\n \"candidate\": \"rc\",\n \"final\": \"\",\n}\nrelease_suffix = release_suffixes[release_level]\nif release_suffix:\n release_suffix += str(sys.version_info.serial)\n\nprint(json.dumps({\n \"executable\": sys.executable,\n \"baseExecutable\": getattr(sys, \"_base_executable\", sys.executable),\n \"version\": \".\".join(map(str, sys.version_info[:3])) + release_suffix,\n \"major\": sys.version_info.major,\n \"minor\": sys.version_info.minor,\n \"patch\": sys.version_info.micro,\n \"releaseLevel\": release_level,\n \"implementation\": sys.implementation.name,\n \"architecture\": platform.machine().lower(),\n \"pointerBits\": struct.calcsize(\"P\") * 8,\n \"prefix\": sys.prefix,\n \"basePrefix\": base_prefix,\n \"virtualEnvironment\": sys.prefix if sys.prefix != base_prefix else None,\n \"gilDisabled\": bool(sysconfig.get_config_var(\"Py_GIL_DISABLED\")),\n \"embedding\": embedding,\n}))\n`;\n\nexport function pythonSatisfiesPolicy(\n python: PythonInfo,\n options: Pick<ResolvedPyfigOptions, 'requiresPython' | 'requireEmbedding' | 'requireGil'>,\n): boolean {\n return pep440VersionSatisfies(python.version, options.requiresPython) &&\n (!options.requireEmbedding || (\n python.implementation === 'cpython' &&\n python.embedding !== null &&\n pythonArchitectureMatchesRuntime(python)\n )) &&\n (!options.requireGil || !python.gilDisabled);\n}\n\nexport async function probePython(\n candidate: CommandSpec,\n options: ResolvedPyfigOptions,\n): Promise<PythonInfo | null> {\n const executable = await resolveExecutable(candidate.executable, options.env);\n if (!executable) return null;\n try {\n const { stdout } = run(\n executable,\n [...candidate.args, '-c', PYTHON_PROBE],\n options.env,\n options.probeTimeoutMs,\n );\n const info = JSON.parse(stdout.trim()) as PythonInfo;\n return normalizePep440Version(info.version) ? info : null;\n } catch {\n return null;\n }\n}\n\nexport async function findUv(options: ResolvedPyfigOptions): Promise<UvInfo | null> {\n const configured = options.env['PYFIG_UV'] ?? 'uv';\n const executable = await resolveExecutable(configured, options.env);\n const uv = executable ? probeUv(executable, options) : null;\n return uv && pep440VersionSatisfies(uv.version, options.requiresUv) ? uv : null;\n}\n\nexport function probeUv(\n executable: string,\n options: ResolvedPyfigOptions,\n): UvInfo | null {\n try {\n const { stdout } = run(executable, ['--version'], options.env, options.probeTimeoutMs);\n const version = normalizeVersion(stdout.match(/^uv\\s+(\\S+)/iu)?.[1]);\n return version ? { executable, version } : null;\n } catch {\n return null;\n }\n}\n\nfunction normalizeVersion(value: string | undefined): string | null {\n if (!value) return null;\n return normalizePep440Version(value);\n}\n\nfunction pythonArchitectureMatchesRuntime(python: PythonInfo): boolean {\n const architecture = python.architecture.toLowerCase();\n if (python.pointerBits !== (process.arch === 'ia32' ? 32 : 64)) return false;\n if (process.arch === 'x64') return architecture === 'x86_64' || architecture === 'amd64';\n if (process.arch === 'arm64') return architecture === 'aarch64' || architecture === 'arm64';\n if (process.arch === 'ia32') {\n return architecture === 'x86' || architecture === 'i386' || architecture === 'i686';\n }\n return architecture === process.arch;\n}\n"
15
16
  ],
16
- "mappings": "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",
17
- "debugId": "DD5BE52110A7FDFA64756E2164756E21",
17
+ "mappings": "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",
18
+ "debugId": "0726BCDBF58AF5C064756E2164756E21",
18
19
  "names": []
19
20
  }
package/dist/cli.js CHANGED
@@ -1,12 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import { readFileSync } from 'node:fs';
3
3
  import { Command } from 'commander';
4
- import { ensureEnvironment } from './provision.js';
4
+ import { ensurePython } from './provision.js';
5
5
  const packageVersion = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
6
6
  const program = new Command()
7
7
  .name('pyfig')
8
- .description('Prepare uv and a compatible Python environment for runtime dependencies.')
8
+ .description('Prepare uv and an isolated Python venv.')
9
9
  .version(packageVersion)
10
+ .option('--dependency <specifier>', 'PEP 508 runtime dependency; repeatable', collect, [])
11
+ .option('--requirement <path>', 'requirements file; repeatable', collect, [])
10
12
  .option('--python <path>', 'Python executable to check first')
11
13
  .option('--requires-python <specifier>', 'accepted Python PEP 440 specifier')
12
14
  .option('--managed-python <request>', 'Python version request passed to uv')
@@ -18,7 +20,9 @@ const program = new Command()
18
20
  .option('--check', 'check only; do not create an environment or install Python or uv', false)
19
21
  .option('--json', 'print machine-readable JSON', false)
20
22
  .action(async (cli) => {
21
- const environment = await ensureEnvironment({
23
+ const environment = await ensurePython({
24
+ dependencies: cli.dependency,
25
+ requirements: cli.requirement,
22
26
  python: cli.python,
23
27
  requiresPython: cli.requiresPython,
24
28
  managedPython: cli.managedPython,
@@ -39,10 +43,15 @@ const program = new Command()
39
43
  console.log(`Python ${environment.python.version}: ${environment.python.executable}`);
40
44
  console.log(`uv ${environment.uv.version}: ${environment.uv.executable}`);
41
45
  console.log(`Environment: ${environment.managed ? 'Pyfig-managed' : 'existing'}`);
46
+ if (environment.venvId)
47
+ console.log(`Venv: ${environment.venvId}`);
42
48
  });
43
49
  program.parseAsync().catch((error) => {
44
50
  const message = error instanceof Error ? error.message : String(error);
45
51
  console.error(`pyfig: ${message}`);
46
52
  process.exitCode = 1;
47
53
  });
54
+ function collect(value, previous) {
55
+ return [...previous, value];
56
+ }
48
57
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -1,15 +1,15 @@
1
1
  import type { ChildProcess, SpawnOptions, SpawnSyncOptions, spawnSync } from 'node:child_process';
2
2
  import type { PyfigOptions } from './config.js';
3
3
  import type { PythonInfo, UvInfo } from './probes.js';
4
- import { type PythonEnvironment, type RuntimeDependencyOptions } from './provision.js';
5
- /** A scoped uv-first API with one consistent environment policy. */
6
- export interface PyfigClient {
7
- prepare(dependencies?: readonly string[], options?: RuntimeDependencyOptions): Promise<PythonEnvironment>;
4
+ import { type PythonEnvironment } from './provision.js';
5
+ /** A scoped uv-first Python runtime with one consistent environment policy. */
6
+ export declare class Python {
7
+ #private;
8
+ constructor(options?: PyfigOptions);
9
+ prepare(): Promise<PythonEnvironment>;
8
10
  pythonInfo(): Promise<PythonInfo>;
9
11
  uvInfo(): Promise<UvInfo>;
10
12
  uv(args?: readonly string[], options?: SpawnOptions): Promise<ChildProcess>;
11
13
  uvSync(args?: readonly string[], options?: SpawnSyncOptions): ReturnType<typeof spawnSync>;
12
14
  }
13
- /** Bind configuration once so consumers cannot accidentally diverge between calls. */
14
- export declare function createPyfig(options?: PyfigOptions): PyfigClient;
15
15
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC9B,MAAM,gBAAgB,CAAC;AAGxB,oEAAoE;AACpE,MAAM,WAAW,WAAW;IAC1B,OAAO,CACL,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,EAChC,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5E,MAAM,CACJ,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE,gBAAgB,GACzB,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;CACjC;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,OAAO,GAAE,YAAiB,GAAG,WAAW,CAmBnE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAGxB,+EAA+E;AAC/E,qBAAa,MAAM;;IAKjB,YAAY,OAAO,GAAE,YAAiB,EASrC;IAED,OAAO,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAEpC;IAEK,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAEtC;IAED,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAExB;IAED,EAAE,CAAC,IAAI,GAAE,SAAS,MAAM,EAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAElF;IAED,MAAM,CACJ,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE,gBAAgB,GACzB,UAAU,CAAC,OAAO,SAAS,CAAC,CAE9B;CACF"}