{"version":3,"sources":["../src/index.ts","../node_modules/yocto-queue/index.js","../node_modules/p-limit/index.js"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * © Copyright Outburn Ltd. 2022-2025 All Rights Reserved\n *   Project name: FHIR-Package-Installer\n */\n\nimport https from 'https';\nimport http from 'http';\nimport fs from 'fs-extra';\nimport pLimit from 'p-limit';\nimport path from 'path';\nimport { Readable } from 'stream';\nimport { finished, pipeline } from 'stream/promises';\nimport * as tar from 'tar-stream';\nimport * as zlib from 'zlib';\nimport os from 'os';\nimport semver from 'semver';\nimport crypto from 'crypto';\n \n\nimport type {\n  FileInPackageIndex,\n  PackageIndex,\n  PackageManifest\n} from '@outburn/types';\n\nimport type {\n  FpiConfig,\n  PackageResource,\n  DownloadPackageOptions,\n  InstallPackageOptions\n} from './types';\nimport { Logger, FhirPackageIdentifier } from '@outburn/types';\n\nconst tempDirs = new Set<string>();\nlet tempCleanupRegistered = false;\n\nconst registerTempCleanup = (): void => {\n  if (tempCleanupRegistered) return;\n  tempCleanupRegistered = true;\n  process.once('exit', () => {\n    for (const dir of tempDirs) {\n      try {\n        fs.removeSync(dir);\n      } catch {\n        // best-effort cleanup\n      }\n    }\n    tempDirs.clear();\n  });\n};\n\nconst createTempDir = (baseDir?: string): string => {\n  registerTempCleanup();\n  const parentDir = baseDir ?? os.tmpdir();\n  fs.ensureDirSync(parentDir);\n  const dir = fs.mkdtempSync(path.join(parentDir, 'fhir-package-installer-'));\n  tempDirs.add(dir);\n  return dir;\n};\n\n// NOTE: This is injected at build time via tsup `define` (see tsup.config.ts).\n// It must NOT be read from package.json at runtime (supports SEA/bundling scenarios).\ndeclare const __FPI_VERSION__: string | undefined;\nconst FPI_VERSION = typeof __FPI_VERSION__ === 'string' && __FPI_VERSION__.trim().length > 0\n  ? __FPI_VERSION__\n  : '0.0.0';\nconst FPI_INDEX_CACHE_VERSION = (() => {\n  const v = semver.parse(FPI_VERSION);\n  if (!v) return '0.0';\n  return `${v.major}.${v.minor}`;\n})();\nconst FPI_STAGING_MAX_AGE_MS = 24 * 60 * 60 * 1000;\nconst FPI_MATERIALIZATION_MARKER = '.fpi.materialized';\nconst DEPENDENCY_CLAIM_WAIT_MS = 1000;\nconst DEPENDENCY_POST_CLAIM_YIELD_MS = 500;\nconst DEPENDENCY_WAIT_LOG_INTERVAL_MS = 5000;\nconst PACKAGE_INSTALL_WAIT_LOG_INTERVAL_MS = 5000;\nconst DEPENDENCY_PEER_HANDOFF_WAIT_MS = 3000;\nconst DEPENDENCY_PEER_DISCOVERY_GRACE_MS = 300;\n\n/**\n * Mapping from core FHIR packages to their implicit dependencies\n * Based on https://chat.fhir.org/#narrow/stream/179239-tooling/topic/New.20Implicit.20Package/near/325318949\n */\nconst IMPLICIT_DEPENDENCIES_MAP: Record<string, string[]> = {\n  'hl7.fhir.r3.core': [\n    'hl7.terminology.r3', \n    'hl7.fhir.uv.extensions.r3'\n  ],\n  'hl7.fhir.r4.core': [\n    'hl7.terminology.r4',\n    'hl7.fhir.uv.extensions.r4'\n  ],\n  'hl7.fhir.r5.core': [\n    'hl7.terminology.r5',\n    'hl7.fhir.uv.extensions.r5'\n  ]\n};\n\nconst IMPLICIT_PACKAGE_IDS = (() => {\n  const s = new Set<string>();\n  for (const ids of Object.values(IMPLICIT_DEPENDENCIES_MAP)) {\n    for (const id of ids) s.add(id);\n  }\n  return s;\n})();\n\n// TTL for cached registry lookups (stored under `cachePath`)\nconst DEFAULT_REGISTRY_TTL_MS = 30 * 60 * 1000; // 30 minutes\n\n// Process-wide in-memory cache sizing\nconst MEM_CACHE_MAX_ENTRIES = 500;\n\ntype BoundedTtlEntry<V> = {\n  value: V;\n  expiresAt: number;\n};\n\ntype GetDependenciesOptions = {\n  rootPackage?: string | FhirPackageIdentifier;\n  explicitImplicitVersions?: ReadonlyMap<string, string>;\n  includePlanningFallbacks?: boolean;\n};\n\n// Lightweight bounded TTL cache with LRU-ish behavior via Map insertion order.\nclass BoundedTtlCache<K, V> {\n  private readonly maxEntries: number;\n  private readonly map = new Map<K, BoundedTtlEntry<V>>();\n\n  constructor(maxEntries: number) {\n    this.maxEntries = maxEntries;\n  }\n\n  get(key: K): V | undefined {\n    const entry = this.map.get(key);\n    if (!entry) return undefined;\n    if (Date.now() >= entry.expiresAt) {\n      this.map.delete(key);\n      return undefined;\n    }\n    // Touch for LRU-ish behavior.\n    this.map.delete(key);\n    this.map.set(key, entry);\n    return entry.value;\n  }\n\n  set(key: K, value: V, ttlMs: number): void {\n    const expiresAt = Date.now() + ttlMs;\n    const entry: BoundedTtlEntry<V> = { value, expiresAt };\n\n    // Touch for LRU-ish behavior.\n    this.map.delete(key);\n    this.map.set(key, entry);\n\n    while (this.map.size > this.maxEntries) {\n      const firstKey = this.map.keys().next().value as K | undefined;\n      if (firstKey === undefined) break;\n      this.map.delete(firstKey);\n    }\n  }\n\n  delete(key: K): boolean {\n    return this.map.delete(key);\n  }\n}\n\n// ---- Module-level (process-wide) single-flight maps ----\n// These are intentionally module-scoped so multiple FhirPackageInstaller instances within\n// the same Node process coordinate and don't duplicate work.\nconst inFlightJson = new Map<string, Promise<any>>();\nconst inFlightTarball = new Map<string, Promise<string>>();\nconst inFlightIndex = new Map<string, Promise<PackageIndex>>();\nconst inFlightImplicitEffectiveVersion = new Map<string, Promise<string>>();\n\n// Process-wide cache for implicit package effective versions.\n// Keyed by {registryUrl, cachePath, packageId} so different installer configs don't bleed into each other.\nconst implicitEffectiveVersionCache = new BoundedTtlCache<string, string>(MEM_CACHE_MAX_ENTRIES);\n\n// Process-wide cache for implicit package resolution failures.\n// Keyed the same way as the winner cache so repeated downstream calls can surface a stable error.\nconst implicitResolutionFailureCache = new BoundedTtlCache<string, Error>(MEM_CACHE_MAX_ENTRIES);\n\nclass ImplicitPackageResolutionError extends Error {\n  public readonly packageId: string;\n  public readonly attemptedVersions: string[];\n  public readonly registryUrl: string;\n  public readonly cachePath: string;\n  public readonly causes: string[];\n\n  constructor(args: {\n    packageId: string;\n    attemptedVersions: string[];\n    registryUrl: string;\n    cachePath: string;\n    causes?: string[];\n  }) {\n    const attempted = args.attemptedVersions.length > 0 ? args.attemptedVersions.join(', ') : '(none)';\n    const prefix = `Failed to resolve implicit package ${args.packageId}`;\n    const meta = `attemptedVersions=[${attempted}] registryUrl=${args.registryUrl} cachePath=${args.cachePath}`;\n    const causeText = (args.causes && args.causes.length > 0)\n      ? ` causes=[${args.causes.join(' | ')}]`\n      : '';\n    super(`${prefix}. ${meta}.${causeText}`);\n    this.name = 'ImplicitPackageResolutionError';\n    this.packageId = args.packageId;\n    this.attemptedVersions = args.attemptedVersions;\n    this.registryUrl = args.registryUrl;\n    this.cachePath = args.cachePath;\n    this.causes = args.causes ?? [];\n  }\n}\n\ntype FhirPackageInstallStep =\n  | 'download-tarball'\n  | 'extract-tarball'\n  | 'cache-package'\n  | 'generate-index';\n\nclass FhirPackageInstallError extends Error {\n  public readonly packageId: string;\n  public readonly version: string;\n  public readonly registryUrl: string;\n  public readonly cachePath: string;\n  public readonly step: FhirPackageInstallStep;\n  public readonly tarballUrl?: string;\n\n  constructor(args: {\n    packageId: string;\n    version: string;\n    registryUrl: string;\n    cachePath: string;\n    step: FhirPackageInstallStep;\n    tarballUrl?: string;\n    cause?: unknown;\n  }) {\n    const safe = (v: unknown): string => {\n      if (v == null) return '';\n      if (typeof v === 'string') return v;\n      if (v instanceof Error) return v.message;\n      try {\n        return JSON.stringify(v);\n      } catch {\n        return String(v);\n      }\n    };\n\n    const pkg = `${args.packageId}@${args.version}`;\n    const meta = `step=${args.step} registryUrl=${args.registryUrl} cachePath=${args.cachePath}`;\n    const tarball = args.tarballUrl ? ` tarballUrl=${args.tarballUrl}` : '';\n    const causeText = args.cause ? ` Cause: ${safe(args.cause)}` : '';\n    super(`Failed to install ${pkg}. ${meta}.${tarball}${causeText}`, { cause: args.cause });\n    this.name = 'FhirPackageInstallError';\n    this.packageId = args.packageId;\n    this.version = args.version;\n    this.registryUrl = args.registryUrl;\n    this.cachePath = args.cachePath;\n    this.step = args.step;\n    this.tarballUrl = args.tarballUrl;\n  }\n}\n\nconst withSingleFlight = async <T>(\n  map: Map<string, Promise<T>>,\n  key: string,\n  fn: () => Promise<T>\n): Promise<T> => {\n  const existing = map.get(key);\n  if (existing) return existing;\n\n  const p = (async () => {\n    try {\n      return await fn();\n    } finally {\n      map.delete(key);\n    }\n  })();\n\n  map.set(key, p);\n  return p;\n};\n\nconst sha256Hex = (value: string): string => crypto.createHash('sha256').update(value).digest('hex');\n\ntype DiskCacheEnvelope<T> = {\n  expiresAt: number;\n  data: T;\n};\n\ntype MemCacheEnvelope<T> = {\n  expiresAt?: number;\n  value: T;\n};\n\n// ---- Module-level (process-wide) TTL memory cache ----\n// Shared across all FhirPackageInstaller instances in the same Node process.\nconst memCache = new Map<string, MemCacheEnvelope<any>>();\n\nconst memGet = <T>(key: string): T | null => {\n  const e = memCache.get(key);\n  if (!e) return null;\n  if (typeof e.expiresAt === 'number') {\n    if (Date.now() >= e.expiresAt) {\n      memCache.delete(key);\n      return null;\n    }\n  }\n  return e.value as T;\n};\n\nconst memSet = <T>(key: string, value: T, ttlMs: number): void => {\n  const expiresAt = Date.now() + ttlMs;\n  // Update insertion order for LRU-ish behavior.\n  memCache.delete(key);\n  memCache.set(key, { expiresAt, value });\n  while (memCache.size > MEM_CACHE_MAX_ENTRIES) {\n    const firstKey = memCache.keys().next().value as string | undefined;\n    if (!firstKey) break;\n    memCache.delete(firstKey);\n  }\n};\n\nconst memSetNoTtl = <T>(key: string, value: T): void => {\n  // Update insertion order for LRU-ish behavior.\n  memCache.delete(key);\n  memCache.set(key, { value });\n  while (memCache.size > MEM_CACHE_MAX_ENTRIES) {\n    const firstKey = memCache.keys().next().value as string | undefined;\n    if (!firstKey) break;\n    memCache.delete(firstKey);\n  }\n};\n\n/**\n * Default logger is a no-op.\n *\n * This is a library module: it should not write to stdout/stderr unless the caller\n * explicitly provides a logger (e.g. a console-mapped logger in CLI apps).\n */\nconst defaultLogger: Logger = {\n  info: () => undefined,\n  warn: () => undefined,\n  error: () => undefined\n};\n\n/**\n * Max number of concurrent file operations (read / write))\n */\n// Cap concurrency to reduce risk of EMFILE/too-many-open-files on Windows.\nconst limit = pLimit(Math.max(4, Math.min(32, os.cpus().length)));\n\n/**\n * Generates an index entry for the package resource\n * @param filename resource filename\n * @param content resource content\n * @returns FileInPackageIndex object \n */\nconst extractResourceIndexEntry = (filename: string, content: PackageResource): FileInPackageIndex => {\n  const evalAttribute = (att: any | any[]) => (typeof att === 'string' ? att : undefined);\n  const indexEntry: FileInPackageIndex = {\n    filename,\n    resourceType: content.resourceType,\n    id: content.id,\n    url: evalAttribute(content.url),\n    name: evalAttribute(content.name),\n    version: evalAttribute(content.version),\n    kind: evalAttribute(content.kind),\n    type: evalAttribute(content.type),\n    supplements: evalAttribute(content.supplements),\n    content: evalAttribute(content.content),\n    baseDefinition: evalAttribute(content.baseDefinition),\n    derivation: evalAttribute(content.derivation),\n    date: evalAttribute(content.date)\n  };\n  return indexEntry;\n};\n\nexport class FhirPackageInstaller {\n  private logger: Logger = defaultLogger;\n  private registryUrl = 'https://packages.fhir.org';\n  private registryDisabled = false;\n  private registryToken?: string; // optional token for private registries\n  private requestTimeoutMs = 90000; // 90 seconds\n  private extractTimeoutMs = 60000; // 60 seconds\n  private registryTtlMs = DEFAULT_REGISTRY_TTL_MS;\n  /**\n   * Path to the FHIR package cache directory.\n   * This directory is used to store downloaded and extracted FHIR packages.\n   * If the directory does not exist, it will be created.\n   * Default location follows FHIR spec:\n   * - User apps: ~/.fhir/packages (Windows: C:\\Users\\<user>\\.fhir\\packages)\n   * - System services: /var/lib/.fhir/packages (Windows: %ProgramData%\\.fhir\\packages)\n   */\n  private cachePath!: string;\n  private skipExamples = false; // skip dependency installation of example packages\n  private allowHttp = false; // allow HTTP URLs for testing\n  private resolvingImplicitDeps = new Set<string>();\n  private installingPackages = new Set<string>();\n\n  private formatPackageForDebug(packageObject: FhirPackageIdentifier): string {\n    return `${packageObject.id}@${packageObject.version}`;\n  }\n\n  private formatMaterializationStatusForDebug(status: {\n    complete: boolean;\n    reason: string;\n    missingFiles: string[];\n  }): string {\n    const missingPreview = status.missingFiles.length > 0\n      ? ` missingFiles=${status.missingFiles.slice(0, 3).join(',')}${status.missingFiles.length > 3 ? ',...' : ''}`\n      : '';\n    return `materialization=${status.complete ? 'complete' : 'incomplete'} reason=${status.reason}${missingPreview}`;\n  }\n\n  private async describePackageInstallWaitState(packageObject: FhirPackageIdentifier): Promise<string> {\n    try {\n      const status = await this.getPackageMaterializationStatus(packageObject, { emitTiming: true });\n      return this.formatMaterializationStatusForDebug(status);\n    } catch (error) {\n      return `materialization-check-error=${error instanceof Error ? error.message : String(error)}`;\n    }\n  }\n\n  private formatElapsedMs(startedAtNs: bigint): string {\n    return (Number(process.hrtime.bigint() - startedAtNs) / 1_000_000).toFixed(1);\n  }\n\n  private async withDebugTiming<T>(\n    label: string,\n    action: () => Promise<T>,\n    describeResult?: (result: T) => string\n  ): Promise<T> {\n    if (!this.logger.debug || typeof this.logger.debug !== 'function') {\n      return await action();\n    }\n\n    const startedAtNs = process.hrtime.bigint();\n    try {\n      const result = await action();\n      const resultText = describeResult ? ` ${describeResult(result)}` : '';\n      this.logger.debug(`[timing] ${label} completed in ${this.formatElapsedMs(startedAtNs)}ms.${resultText}`);\n      return result;\n    } catch (error) {\n      this.logger.debug(\n        `[timing] ${label} failed in ${this.formatElapsedMs(startedAtNs)}ms: ${error instanceof Error ? error.message : String(error)}`\n      );\n      throw error;\n    }\n  }\n\n  private getPackageKey(packageObject: FhirPackageIdentifier): string {\n    return `${packageObject.id}#${packageObject.version}`;\n  }\n\n  private normalizeDependencies(dependencies: Record<string, string>): Record<string, string> {\n    if (dependencies['hl7.fhir.r4.core'] === '4.0.0') {\n      return {\n        ...dependencies,\n        'hl7.fhir.r4.core': '4.0.1',\n      };\n    }\n    return dependencies;\n  }\n  \n  constructor(config?: FpiConfig) {\n    const {\n      logger,\n      registryUrl,\n      registryToken,\n      cachePath,\n      skipExamples,\n      allowHttp,\n      requestTimeoutMs,\n      extractTimeoutMs,\n      registryTtlMs\n    } = config || {} as FpiConfig;\n\n    // Set logger first so getDefaultCachePath() can use it for warnings\n    if (logger) {\n      this.logger = logger;\n    }\n\n    const normalizedCachePath = ((): string | undefined => {\n      if (cachePath == null) {\n        return undefined;\n      }\n      if (typeof cachePath !== 'string') {\n        this.logger.warn?.(\n          `Non-string cachePath provided (${typeof cachePath}); falling back to FHIR spec default cache path.`\n        );\n        return undefined;\n      }\n      const trimmed = cachePath.trim();\n      if (trimmed === '' || trimmed.toLowerCase() === 'n/a') {\n        this.logger.warn?.(\n          'Non-usable cachePath provided (empty/whitespace or \"n/a\"); falling back to FHIR spec default cache path.'\n        );\n        return undefined;\n      }\n      return trimmed;\n    })();\n\n    this.cachePath = normalizedCachePath ?? this.getDefaultCachePath();\n\n    if (registryUrl) {\n      const normalized = registryUrl.trim();\n      this.registryUrl = registryUrl;\n      if (normalized.toLowerCase() === 'n/a') {\n        this.registryUrl = 'n/a';\n        this.registryDisabled = true;\n      }\n    }\n    if (registryToken) {\n      this.registryToken = registryToken;\n    }\n    if (allowHttp) {\n      this.allowHttp = allowHttp;\n    }\n\n    if (typeof requestTimeoutMs === 'number' && Number.isFinite(requestTimeoutMs) && requestTimeoutMs > 0) {\n      this.requestTimeoutMs = requestTimeoutMs;\n    }\n    if (typeof extractTimeoutMs === 'number' && Number.isFinite(extractTimeoutMs) && extractTimeoutMs > 0) {\n      this.extractTimeoutMs = extractTimeoutMs;\n    }\n    // Unify registry TTL config.\n    const effectiveRegistryTtlMs =\n      (typeof registryTtlMs === 'number' && Number.isFinite(registryTtlMs) && registryTtlMs > 0)\n        ? registryTtlMs\n        : undefined;\n    if (typeof effectiveRegistryTtlMs === 'number') {\n      this.registryTtlMs = effectiveRegistryTtlMs;\n    }\n    if (skipExamples) {\n      this.skipExamples = skipExamples;\n    }\n  }\n\n  /**\n   * Determines the default FHIR package cache path based on FHIR specifications:\n   * https://confluence.hl7.org/display/FHIR/FHIR+Package+Cache\n   * \n   * For user applications:\n   * - Windows: C:\\Users\\<username>\\.fhir\\packages\n   * - Unix/Linux: ~/.fhir/packages\n   * \n   * For system services (daemons):\n   * - Windows: %ProgramData%\\.fhir\\packages (typically C:\\ProgramData\\.fhir\\packages)\n   * - Unix/Linux: /var/lib/.fhir/packages\n   * \n   * Behavior can be overridden via the FHIR_PACKAGE_CACHE_MODE environment variable:\n   * - FHIR_PACKAGE_CACHE_MODE=system -> always use system service paths\n   * - FHIR_PACKAGE_CACHE_MODE=user   -> always use user paths\n   */\n  private getDefaultCachePath(): string {\n    const isWindows = process.platform === 'win32';\n    const homeDir = os.homedir();\n\n    // Allow explicit override of cache mode via environment variable\n    const cacheMode = process.env.FHIR_PACKAGE_CACHE_MODE?.toLowerCase();\n    let isSystemService: boolean;\n\n    if (cacheMode === 'system') {\n      isSystemService = true;\n    } else if (cacheMode === 'user') {\n      isSystemService = false;\n    } else {\n      // Detect if running as a system service/daemon\n      // On Windows: Check if homedir ends with the SYSTEM profile path (no real user home)\n      // Using path.normalize() handles mixed separators and ensures consistent comparison\n      // On Unix: Prefer a \"daemon-like\" heuristic rather than only checking for root:\n      //   - running as root (uid 0)\n      //   - not invoked via sudo (no SUDO_USER)\n      //   - missing common interactive-session variables (DISPLAY, SSH_CONNECTION, TERM)\n      if (isWindows) {\n        const normalizedHome = path.normalize(homeDir).toLowerCase();\n        const systemProfileSuffix = path\n          .normalize(path.join('Windows', 'System32', 'config', 'systemprofile'))\n          .toLowerCase();\n        isSystemService = normalizedHome.endsWith(systemProfileSuffix);\n      } else {\n        const isRoot = process.getuid?.() === 0;\n        const isSudo = !!process.env.SUDO_USER;\n        const hasDisplay = !!process.env.DISPLAY;\n        const hasSshConnection = !!process.env.SSH_CONNECTION;\n        const hasTerm = !!process.env.TERM;\n\n        isSystemService = Boolean(\n          isRoot &&\n          !isSudo &&\n          !hasDisplay &&\n          !hasSshConnection &&\n          !hasTerm\n        );\n      }\n    }\n\n    if (isSystemService) {\n      if (isWindows) {\n        // Use ProgramData environment variable as per FHIR spec.\n        // If ProgramData is not set, fall back to \"C:\\\\ProgramData\" if it exists and is writable;\n        // otherwise fall back to user home directory.\n        let programData = process.env.ProgramData;\n\n        if (!programData || programData.trim() === '') {\n          const fallbackProgramData = 'C:\\\\ProgramData';\n          try {\n            if (fs.pathExistsSync(fallbackProgramData)) {\n              fs.accessSync(fallbackProgramData, fs.constants.W_OK);\n              this.logger.warn(\n                'ProgramData environment variable is not set; ' +\n                'using fallback \"C:\\\\ProgramData\" for system service cache directory.'\n              );\n              programData = fallbackProgramData;\n            } else {\n              this.logger.warn(\n                'ProgramData environment variable is not set and ' +\n                'fallback \"C:\\\\ProgramData\" does not exist. Falling back to user cache directory.'\n              );\n            }\n          } catch {\n            this.logger.warn(\n              'ProgramData environment variable is not set and ' +\n              'fallback \"C:\\\\ProgramData\" is not writable. Falling back to user cache directory.'\n            );\n          }\n        }\n\n        if (programData) {\n          return path.join(programData, '.fhir', 'packages');\n        }\n        // ProgramData unavailable or not writable - use user home\n        return path.join(homeDir, '.fhir', 'packages');\n      } else {\n        // Unix/Linux daemon location\n        return '/var/lib/.fhir/packages';\n      }\n    }\n\n    // Standard user location\n    return path.join(homeDir, '.fhir', 'packages');\n  }\n\n  private async withDiskLock<T>(\n    lockKey: string,\n    fn: () => Promise<T>,\n    options?: {\n      debugLabel?: string;\n      describeWaitState?: () => Promise<string>;\n      waitLogIntervalMs?: number;\n      proceedWithoutLockAfterTimeout?: boolean;\n    }\n  ): Promise<T> {\n    // Lock files live under cachePath so we never write outside user-controlled boundaries.\n    const locksDir = await this.ensureDiskCacheSubdir('locks');\n    const lockPath = path.join(locksDir, `${sha256Hex(lockKey)}.lock`);\n\n    const start = Date.now();\n    const maxWaitMs = Math.max(1000, this.requestTimeoutMs);\n    const staleMs = Math.max(2 * 60 * 1000, maxWaitMs * 2);\n    const debugLabel = options?.debugLabel?.trim();\n    const debugEnabled = Boolean(debugLabel) && typeof this.logger.debug === 'function';\n    const waitLogIntervalMs = Math.max(250, options?.waitLogIntervalMs ?? PACKAGE_INSTALL_WAIT_LOG_INTERVAL_MS);\n    const proceedWithoutLockAfterTimeout = options?.proceedWithoutLockAfterTimeout ?? true;\n    let contentionObserved = false;\n    let lastWaitLogAt = 0;\n\n    const readWaitState = async (): Promise<string | null> => {\n      if (!debugEnabled || !options?.describeWaitState) {\n        return null;\n      }\n      try {\n        return await options.describeWaitState();\n      } catch (error) {\n        return `wait-state-error=${error instanceof Error ? error.message : String(error)}`;\n      }\n    };\n\n    while (true) {\n      try {\n        await fs.ensureDir(path.dirname(lockPath));\n        await fs.writeFile(lockPath, `${process.pid}\\n${Date.now()}\\n`, { flag: 'wx' });\n        if (debugEnabled) {\n          const waitedMs = Date.now() - start;\n          this.logger.debug?.(\n            contentionObserved\n              ? `Claimed ${debugLabel} after waiting ${waitedMs}ms.`\n              : `Claimed ${debugLabel}.`\n          );\n        }\n        const heartbeat = setInterval(() => {\n          // Keep mtime fresh so waiters can distinguish live vs stale locks.\n          fs.utimes(lockPath, new Date(), new Date()).catch(() => undefined);\n        }, 1000);\n        (heartbeat as any).unref?.();\n        try {\n          return await fn();\n        } finally {\n          clearInterval(heartbeat);\n          await fs.remove(lockPath).catch(() => undefined);\n          if (debugEnabled) {\n            this.logger.debug?.(`Released ${debugLabel}.`);\n          }\n        }\n      } catch (e: any) {\n        if (e?.code !== 'EEXIST') {\n          // If locking fails for other reasons, don't break functionality.\n          if (debugEnabled) {\n            this.logger.debug?.(\n              `Skipping ${debugLabel} because the lock could not be created (${e?.code || e?.message || String(e)}); proceeding without the lock.`\n            );\n          }\n          return await fn();\n        }\n\n        const elapsedMs = Date.now() - start;\n        let lockAgeMs: number | null = null;\n        let waitState: string | null = null;\n\n        if (!contentionObserved && debugEnabled) {\n          waitState = await readWaitState();\n          this.logger.debug?.(\n            `Another process holds ${debugLabel}; entering wait loop.` +\n            `${waitState ? ` Current materialization state: ${waitState}.` : ''}`\n          );\n        }\n        contentionObserved = true;\n\n        // If the lock looks stale, attempt to break it.\n        try {\n          const stat = await fs.stat(lockPath);\n          lockAgeMs = Date.now() - stat.mtimeMs;\n          if (lockAgeMs > staleMs) {\n            if (debugEnabled) {\n              waitState ??= await readWaitState();\n              this.logger.debug?.(\n                `Breaking stale ${debugLabel} after waiting ${elapsedMs}ms (lockAgeMs=${Math.round(lockAgeMs)}).` +\n                `${waitState ? ` Current materialization state: ${waitState}.` : ''}`\n              );\n            }\n            await fs.remove(lockPath).catch(() => undefined);\n            continue;\n          }\n        } catch {\n          // ignore\n        }\n\n        if (Date.now() - start > maxWaitMs) {\n          if (proceedWithoutLockAfterTimeout) {\n            // Avoid deadlocks: proceed without the lock after waiting.\n            if (debugEnabled) {\n              waitState ??= await readWaitState();\n              this.logger.debug?.(\n                `Waited ${elapsedMs}ms for ${debugLabel}, exceeding maxWaitMs=${maxWaitMs}; proceeding without the lock.` +\n                `${waitState ? ` Current materialization state: ${waitState}.` : ''}`\n              );\n            }\n            return await fn();\n          }\n\n          if (debugEnabled && (Date.now() - lastWaitLogAt >= waitLogIntervalMs)) {\n            waitState ??= await readWaitState();\n            this.logger.debug?.(\n              `Waited ${elapsedMs}ms for ${debugLabel}, exceeding maxWaitMs=${maxWaitMs}; continuing to wait for the live lock holder.` +\n              `${waitState ? ` Current materialization state: ${waitState}.` : ''}`\n            );\n            lastWaitLogAt = Date.now();\n          }\n        }\n\n        if (debugEnabled && (Date.now() - lastWaitLogAt >= waitLogIntervalMs)) {\n          waitState ??= await readWaitState();\n          const lockAgeText = typeof lockAgeMs === 'number' ? ` lockAgeMs=${Math.round(lockAgeMs)}.` : '';\n          this.logger.debug?.(\n            `Still waiting for ${debugLabel} after ${elapsedMs}ms.${lockAgeText}` +\n            `${waitState ? ` Current materialization state: ${waitState}.` : ''}`\n          );\n          lastWaitLogAt = Date.now();\n        }\n\n        await new Promise((r) => setTimeout(r, 50 + Math.floor(Math.random() * 100)));\n      }\n    }\n  }\n\n  private async tryWithDiskLock<T>(\n    lockKey: string,\n    fn: () => Promise<T>,\n    options?: {\n      debugLabel?: string;\n    }\n  ): Promise<{ acquired: true; result: T } | { acquired: false }> {\n    const locksDir = await this.ensureDiskCacheSubdir('locks');\n    const lockPath = path.join(locksDir, `${sha256Hex(lockKey)}.lock`);\n    const debugLabel = options?.debugLabel?.trim();\n    const debugEnabled = Boolean(debugLabel) && typeof this.logger.debug === 'function';\n\n    try {\n      await fs.ensureDir(path.dirname(lockPath));\n      await fs.writeFile(lockPath, `${process.pid}\\n${Date.now()}\\n`, { flag: 'wx' });\n      if (debugEnabled) {\n        this.logger.debug?.(`Claimed ${debugLabel}.`);\n      }\n      const heartbeat = setInterval(() => {\n        fs.utimes(lockPath, new Date(), new Date()).catch(() => undefined);\n      }, 1000);\n      (heartbeat as any).unref?.();\n      try {\n        return { acquired: true, result: await fn() };\n      } finally {\n        clearInterval(heartbeat);\n        await fs.remove(lockPath).catch(() => undefined);\n        if (debugEnabled) {\n          this.logger.debug?.(`Released ${debugLabel}.`);\n        }\n      }\n    } catch (e: any) {\n      if (e?.code === 'EEXIST') {\n        return { acquired: false };\n      }\n      if (debugEnabled) {\n        this.logger.debug?.(\n          `Skipping ${debugLabel} because the lock could not be created (${e?.code || e?.message || String(e)}); proceeding without the lock.`\n        );\n      }\n      return { acquired: true, result: await fn() };\n    }\n  }\n\n  // ---- Per-cachePath persistent cache helpers ----\n  private async ensureDiskCacheSubdir(name: string): Promise<string> {\n    const dir = path.join(this.cachePath, '.fpi.cache', name);\n    await fs.ensureDir(dir);\n    return dir;\n  }\n\n  private async createWorkingTempDir(options?: { preferCache?: boolean }): Promise<string> {\n    if (options?.preferCache !== false) {\n      try {\n        const cacheTempRoot = await this.ensureDiskCacheSubdir('tmp');\n        return createTempDir(cacheTempRoot);\n      } catch {\n        // Fall back to the process temp directory if the cache-local temp root is unavailable.\n      }\n    }\n\n    return createTempDir();\n  }\n\n  private getPackageInstallLockKey(packageObject: FhirPackageIdentifier): string {\n    return `package-install|${packageObject.id}#${packageObject.version}`;\n  }\n\n  private async getInstallParticipantDir(packageObject: FhirPackageIdentifier): Promise<string> {\n    const participantsRoot = await this.ensureDiskCacheSubdir('installers');\n    return path.join(participantsRoot, sha256Hex(`install-participants|${this.getPackageKey(packageObject)}`));\n  }\n\n  private async withInstallParticipant<T>(packageObject: FhirPackageIdentifier, fn: () => Promise<T>): Promise<T> {\n    const participantsDir = await this.getInstallParticipantDir(packageObject);\n    const participantPath = path.join(\n      participantsDir,\n      `${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}.participant`\n    );\n\n    await fs.ensureDir(participantsDir);\n    await fs.writeFile(participantPath, `${process.pid}\\n${Date.now()}\\n`, 'utf8');\n\n    const heartbeat = setInterval(() => {\n      fs.utimes(participantPath, new Date(), new Date()).catch(() => undefined);\n    }, 1000);\n    (heartbeat as any).unref?.();\n\n    try {\n      return await fn();\n    } finally {\n      clearInterval(heartbeat);\n      await fs.remove(participantPath).catch(() => undefined);\n    }\n  }\n\n  private async countActiveInstallParticipants(packageObject: FhirPackageIdentifier): Promise<number> {\n    const participantsDir = await this.getInstallParticipantDir(packageObject);\n    if (!await fs.exists(participantsDir)) {\n      return 0;\n    }\n\n    const staleMs = Math.max(2 * 60 * 1000, this.requestTimeoutMs * 2);\n    const now = Date.now();\n    const entries = await fs.readdir(participantsDir);\n    let activeCount = 0;\n\n    for (const entry of entries) {\n      const entryPath = path.join(participantsDir, entry);\n      try {\n        const stat = await fs.stat(entryPath);\n        if (now - stat.mtimeMs <= staleMs) {\n          activeCount += 1;\n        } else {\n          await fs.remove(entryPath).catch(() => undefined);\n        }\n      } catch {\n        // Ignore disappearing or unreadable participant entries.\n      }\n    }\n\n    return activeCount;\n  }\n\n  private async isPackageInstallLockHeld(packageObject: FhirPackageIdentifier): Promise<boolean> {\n    const locksDir = await this.ensureDiskCacheSubdir('locks');\n    const lockPath = path.join(locksDir, `${sha256Hex(this.getPackageInstallLockKey(packageObject))}.lock`);\n    return await fs.exists(lockPath);\n  }\n\n  private async waitForPeerDependencyHandoff(\n    rootPackage: FhirPackageIdentifier,\n    pendingDependencies: FhirPackageIdentifier[]\n  ): Promise<void> {\n    if (pendingDependencies.length === 0) {\n      return;\n    }\n\n    const startedAt = Date.now();\n    let peerDiscoveryGraceApplied = false;\n    while (Date.now() - startedAt < DEPENDENCY_PEER_HANDOFF_WAIT_MS) {\n      for (const dependency of pendingDependencies) {\n        if (await this.isStrictlyMaterialized(dependency) || await this.isPackageInstallLockHeld(dependency)) {\n          return;\n        }\n      }\n\n      if (await this.countActiveInstallParticipants(rootPackage) <= 1) {\n        if (!peerDiscoveryGraceApplied) {\n          peerDiscoveryGraceApplied = true;\n          await new Promise((resolve) => setTimeout(resolve, DEPENDENCY_PEER_DISCOVERY_GRACE_MS));\n          continue;\n        }\n        return;\n      }\n\n      await new Promise((resolve) => setTimeout(resolve, 50));\n    }\n  }\n\n  private async withPackageInstallLock<T>(\n    packageObject: FhirPackageIdentifier,\n    fn: () => Promise<T>\n  ): Promise<T> {\n    const lockKey = this.getPackageInstallLockKey(packageObject);\n    return await this.withDiskLock(lockKey, async () => {\n      return await fn();\n    }, {\n      debugLabel: `package install ${this.formatPackageForDebug(packageObject)}`,\n      describeWaitState: async () => await this.describePackageInstallWaitState(packageObject),\n      proceedWithoutLockAfterTimeout: false,\n    });\n  }\n\n  private async tryWithPackageInstallLock<T>(\n    packageObject: FhirPackageIdentifier,\n    fn: () => Promise<T>\n  ): Promise<{ acquired: true; result: T } | { acquired: false }> {\n    return await this.tryWithDiskLock(this.getPackageInstallLockKey(packageObject), fn, {\n      debugLabel: `package install ${this.formatPackageForDebug(packageObject)}`,\n    });\n  }\n\n  private async getStagingPath(): Promise<string> {\n    return await this.ensureDiskCacheSubdir('staging');\n  }\n\n  private async cleanupStaleStagingDirectories(maxAgeMs: number = FPI_STAGING_MAX_AGE_MS): Promise<void> {\n    try {\n      const stagingPath = await this.getStagingPath();\n      const entries = await fs.readdir(stagingPath);\n      const now = Date.now();\n      for (const entry of entries) {\n        const entryPath = path.join(stagingPath, entry);\n        try {\n          const stats = await fs.stat(entryPath);\n          if (now - stats.mtimeMs > maxAgeMs) {\n            await fs.remove(entryPath);\n          }\n        } catch {\n          // best-effort cleanup\n        }\n      }\n    } catch {\n      // best-effort cleanup\n    }\n  }\n\n  private async createStagingDirectory(packageObject: FhirPackageIdentifier): Promise<string> {\n    await this.cleanupStaleStagingDirectories();\n    const stagingPath = await this.getStagingPath();\n    const dirName = `${await this.toDirName(packageObject)}.${process.pid}.${Date.now()}.${crypto.randomBytes(4).toString('hex')}`;\n    const fullPath = path.join(stagingPath, dirName);\n    await fs.ensureDir(fullPath);\n    return fullPath;\n  }\n\n  private async buildPackageIndexFromPackageDir(packageDir: string): Promise<PackageIndex> {\n    return await this.withDebugTiming(\n      `build-package-index packageDir=${packageDir}`,\n      async () => {\n        const discoverStartedAtNs = process.hrtime.bigint();\n        const fileList = await fs.readdir(packageDir);\n        const candidateFiles = fileList.filter(\n          file => file.endsWith('.json') && file !== 'package.json' && !file.endsWith('.index.json')\n        );\n        this.logger.debug?.(\n          `[index] Discovered ${candidateFiles.length} candidate JSON resources in ${packageDir} ` +\n          `in ${this.formatElapsedMs(discoverStartedAtNs)}ms.`\n        );\n\n        const parseStartedAtNs = process.hrtime.bigint();\n        const files = await Promise.all(\n          candidateFiles.map(\n            file => limit(\n              async () => {\n                const contentText = await fs.readFile(path.join(packageDir, file), { encoding: 'utf8' });\n                const content = JSON.parse(contentText) as PackageResource;\n                return extractResourceIndexEntry(file, content);\n              }\n            )\n          )\n        );\n\n        this.logger.debug?.(\n          `[index] Parsed ${files.length} resource entries from ${packageDir} ` +\n          `in ${this.formatElapsedMs(parseStartedAtNs)}ms.`\n        );\n\n        return {\n          'index-version': 2,\n          files,\n        };\n      },\n      (indexJson) => `fileCount=${indexJson.files.length}`\n    );\n  }\n\n  private normalizeIndexEntry(entry: Record<string, unknown>): FileInPackageIndex | null {\n    const filename = typeof entry.filename === 'string' ? entry.filename : null;\n    const resourceType = typeof entry.resourceType === 'string' ? entry.resourceType : null;\n    const id = typeof entry.id === 'string' ? entry.id : null;\n    if (!filename) {\n      return null;\n    }\n    if (!resourceType || !id) {\n      return null;\n    }\n\n    const readOptionalString = (key: keyof FileInPackageIndex): string | undefined => {\n      const value = entry[key as string];\n      return typeof value === 'string' ? value : undefined;\n    };\n\n    return {\n      filename,\n      resourceType,\n      id,\n      url: readOptionalString('url'),\n      name: readOptionalString('name'),\n      version: readOptionalString('version'),\n      kind: readOptionalString('kind'),\n      type: readOptionalString('type'),\n      supplements: readOptionalString('supplements'),\n      content: readOptionalString('content'),\n      baseDefinition: readOptionalString('baseDefinition'),\n      derivation: readOptionalString('derivation'),\n      date: readOptionalString('date'),\n    };\n  }\n\n  private normalizePackageIndex(raw: unknown): PackageIndex | null {\n    if (!raw || typeof raw !== 'object') {\n      return null;\n    }\n\n    const candidate = raw as { files?: unknown };\n    if (!Array.isArray(candidate.files)) {\n      return null;\n    }\n\n    const files: FileInPackageIndex[] = [];\n    for (const file of candidate.files) {\n      if (!file || typeof file !== 'object') {\n        return null;\n      }\n      const normalized = this.normalizeIndexEntry(file as Record<string, unknown>);\n      if (!normalized) {\n        return null;\n      }\n      files.push(normalized);\n    }\n\n    return {\n      'index-version': 2,\n      files,\n    };\n  }\n\n  private async persistMaterializedPackageIndex(\n    packageObject: FhirPackageIdentifier,\n    packageDir: string,\n    indexJson: PackageIndex\n  ): Promise<PackageIndex> {\n    const indexPath = path.join(packageDir, '.fpi.index.json');\n    await fs.writeJSON(indexPath, indexJson);\n\n    const memKey = this.getIndexMemKey(packageObject);\n    memSetNoTtl(memKey, indexJson);\n    try {\n      const diskPath = this.getDiskIndexCachePath(packageObject);\n      await this.ensureDiskCacheSubdir('indexes');\n      await this.writeDiskCacheJsonNoTtl(diskPath, indexJson);\n    } catch {\n      // ignore\n    }\n\n    return indexJson;\n  }\n\n  private async tryMaterializeLegacyPackageIndex(\n    packageObject: FhirPackageIdentifier,\n    packageDir: string\n  ): Promise<PackageIndex | null> {\n    const legacyIndexPath = path.join(packageDir, '.index.json');\n    if (!await fs.exists(legacyIndexPath)) {\n      return null;\n    }\n\n    return await this.withDiskLock(this.getIndexDiskLockKey(packageObject), async () => {\n      const fpiIndexPath = path.join(packageDir, '.fpi.index.json');\n      if (await fs.exists(fpiIndexPath)) {\n        const current = await fs.readJSON(fpiIndexPath, { encoding: 'utf8' }) as unknown;\n        return this.normalizePackageIndex(current);\n      }\n\n      const legacyRaw = await fs.readJSON(legacyIndexPath, { encoding: 'utf8' }) as unknown;\n      const legacyIndex = this.normalizePackageIndex(legacyRaw);\n      if (!legacyIndex) {\n        return null;\n      }\n\n      for (const file of legacyIndex.files) {\n        if (!await fs.exists(path.join(packageDir, file.filename))) {\n          return null;\n        }\n      }\n\n      return await this.persistMaterializedPackageIndex(packageObject, packageDir, legacyIndex);\n    }, {\n      proceedWithoutLockAfterTimeout: false,\n    });\n  }\n\n  private async materializePackageIndex(\n    packageObject: FhirPackageIdentifier,\n    packageDir: string\n  ): Promise<PackageIndex> {\n    return await this.withDebugTiming(\n      `materialize-package-index ${this.formatPackageForDebug(packageObject)}`,\n      async () => {\n        const memKey = this.getIndexMemKey(packageObject);\n        const memHit = memGet<PackageIndex>(memKey);\n        if (memHit) {\n          return await this.persistMaterializedPackageIndex(packageObject, packageDir, memHit);\n        }\n\n        return await this.withDiskLock(this.getIndexDiskLockKey(packageObject), async () => {\n          const memHit2 = memGet<PackageIndex>(memKey);\n          if (memHit2) {\n            return await this.persistMaterializedPackageIndex(packageObject, packageDir, memHit2);\n          }\n\n          const diskPath = this.getDiskIndexCachePath(packageObject);\n          const diskHit = await withSingleFlight(inFlightIndex, `disk-${memKey}`, async () => {\n            await this.ensureDiskCacheSubdir('indexes');\n            return await this.readDiskCacheJson<PackageIndex>(diskPath);\n          });\n          if (diskHit) {\n            return await this.persistMaterializedPackageIndex(packageObject, packageDir, diskHit);\n          }\n\n          const indexJson = await this.buildPackageIndexFromPackageDir(packageDir);\n          return await this.persistMaterializedPackageIndex(packageObject, packageDir, indexJson);\n        }, {\n          proceedWithoutLockAfterTimeout: false,\n        });\n      },\n      (indexJson) => `fileCount=${indexJson.files.length}`\n    );\n  }\n\n  private async getPackageMaterializationStatus(\n    packageObject: FhirPackageIdentifier,\n    options?: { emitTiming?: boolean }\n  ): Promise<{\n    complete: boolean;\n    reason:\n      | 'package-root-missing'\n      | 'package-dir-missing'\n      | 'manifest-missing'\n      | 'manifest-invalid'\n      | 'index-missing'\n      | 'index-invalid'\n      | 'complete'\n      | 'indexed-files-missing';\n    missingFiles: string[];\n  }> {\n    const computeStatus = async (): Promise<{\n      complete: boolean;\n      reason:\n        | 'package-root-missing'\n        | 'package-dir-missing'\n        | 'manifest-missing'\n        | 'manifest-invalid'\n        | 'index-missing'\n        | 'index-invalid'\n        | 'complete'\n        | 'indexed-files-missing';\n      missingFiles: string[];\n    }> => {\n        const packageRoot = await this.getPackageDirPath(packageObject);\n        if (!await fs.exists(packageRoot)) {\n          return { complete: false, reason: 'package-root-missing', missingFiles: [] };\n        }\n\n        const packageDir = path.join(packageRoot, 'package');\n        if (!await fs.exists(packageDir)) {\n          return { complete: false, reason: 'package-dir-missing', missingFiles: [] };\n        }\n\n        const manifestPath = path.join(packageDir, 'package.json');\n        if (!await fs.exists(manifestPath)) {\n          return { complete: false, reason: 'manifest-missing', missingFiles: [] };\n        }\n\n        try {\n          await fs.readJSON(manifestPath, { encoding: 'utf8' });\n        } catch {\n          return { complete: false, reason: 'manifest-invalid', missingFiles: [] };\n        }\n\n        const indexPath = path.join(packageDir, '.fpi.index.json');\n        if (!await fs.exists(indexPath)) {\n          const legacyMaterializedIndex = await this.tryMaterializeLegacyPackageIndex(packageObject, packageDir);\n          if (!legacyMaterializedIndex) {\n            try {\n              await this.materializePackageIndex(packageObject, packageDir);\n            } catch {\n              return { complete: false, reason: 'index-missing', missingFiles: [] };\n            }\n            if (!await fs.exists(indexPath)) {\n              return { complete: false, reason: 'index-missing', missingFiles: [] };\n            }\n          }\n        }\n\n        if (await this.hasFreshMaterializationMarker(packageRoot, packageDir, manifestPath, indexPath)) {\n          return { complete: true, reason: 'complete', missingFiles: [] };\n        }\n\n        let indexJson: Partial<PackageIndex>;\n        try {\n          indexJson = await fs.readJSON(indexPath, { encoding: 'utf8' }) as Partial<PackageIndex>;\n        } catch {\n          return { complete: false, reason: 'index-invalid', missingFiles: [] };\n        }\n\n        if (!Array.isArray(indexJson.files)) {\n          return { complete: false, reason: 'index-invalid', missingFiles: [] };\n        }\n\n        const packageDirEntries = new Set(await fs.readdir(packageDir));\n        const missingFiles: string[] = [];\n        for (const file of indexJson.files) {\n          const filename = typeof file?.filename === 'string' ? file.filename : null;\n          if (!filename) {\n            return { complete: false, reason: 'index-invalid', missingFiles: [] };\n          }\n          const canUseDirectoryListing = !filename.includes('/') && !filename.includes('\\\\');\n          if (canUseDirectoryListing ? !packageDirEntries.has(filename) : !await fs.exists(path.join(packageDir, filename))) {\n            missingFiles.push(filename);\n          }\n        }\n\n        if (missingFiles.length > 0) {\n          return { complete: false, reason: 'indexed-files-missing', missingFiles };\n        }\n\n        await this.writeMaterializationMarker(packageRoot, packageDir, manifestPath, indexPath);\n\n        return { complete: true, reason: 'complete', missingFiles: [] };\n    };\n\n    if (!options?.emitTiming) {\n      return await computeStatus();\n    }\n\n    return await this.withDebugTiming(\n      `materialization-status ${this.formatPackageForDebug(packageObject)}`,\n      computeStatus,\n      (status) => this.formatMaterializationStatusForDebug(status)\n    );\n  }\n\n  private async stagePackageForPublish(\n    packageObject: FhirPackageIdentifier,\n    src: string,\n    move: boolean\n  ): Promise<string> {\n    return await this.withDebugTiming(\n      `stage-package-for-publish ${this.formatPackageForDebug(packageObject)}`,\n      async () => {\n        const stagingRoot = await this.createStagingDirectory(packageObject);\n        const sourcePackageDir = await fs.exists(path.join(src, 'package')) ? path.join(src, 'package') : src;\n        const stagingPackageDir = path.join(stagingRoot, 'package');\n        const packageLabel = this.formatPackageForDebug(packageObject);\n\n        try {\n          const action = move ? fs.move : fs.copy;\n          const copyOrMoveStartedAtNs = process.hrtime.bigint();\n          await action(sourcePackageDir, stagingPackageDir, { overwrite: false });\n          this.logger.debug?.(\n            `[publish] ${move ? 'Moved' : 'Copied'} staged contents for ${packageLabel} ` +\n            `from ${sourcePackageDir} to ${stagingPackageDir} in ${this.formatElapsedMs(copyOrMoveStartedAtNs)}ms.`\n          );\n          if (move && sourcePackageDir !== src) {\n            const cleanupStartedAtNs = process.hrtime.bigint();\n            await fs.remove(src).catch(() => undefined);\n            this.logger.debug?.(\n              `[publish] Removed extraction root ${src} after staging ${packageLabel} ` +\n              `in ${this.formatElapsedMs(cleanupStartedAtNs)}ms.`\n            );\n          }\n          const materializeIndexStartedAtNs = process.hrtime.bigint();\n          const materializedIndex = await this.materializePackageIndex(packageObject, stagingPackageDir);\n          this.logger.debug?.(\n            `[publish] Materialized package index for ${packageLabel} in staging ` +\n            `in ${this.formatElapsedMs(materializeIndexStartedAtNs)}ms (fileCount=${materializedIndex.files.length}).`\n          );\n          const markerStartedAtNs = process.hrtime.bigint();\n          await this.writeMaterializationMarker(\n            stagingRoot,\n            stagingPackageDir,\n            path.join(stagingPackageDir, 'package.json'),\n            path.join(stagingPackageDir, '.fpi.index.json')\n          );\n          this.logger.debug?.(\n            `[publish] Wrote materialization marker for ${packageLabel} ` +\n            `in ${this.formatElapsedMs(markerStartedAtNs)}ms.`\n          );\n          return stagingRoot;\n        } catch (error) {\n          await fs.remove(stagingRoot).catch(() => undefined);\n          throw error;\n        }\n      }\n    );\n  }\n\n  private isAlreadyExistsError(error: unknown): boolean {\n    if (!error || typeof error !== 'object') {\n      return false;\n    }\n\n    const candidate = error as { code?: string; message?: string };\n    return candidate.code === 'EEXIST'\n      || candidate.code === 'ENOTEMPTY'\n      || /dest already exists/i.test(candidate.message ?? '');\n  }\n\n  private isRetryableStagePublishError(error: unknown): boolean {\n    if (!error || typeof error !== 'object') {\n      return false;\n    }\n\n    const candidate = error as { code?: string };\n    return candidate.code === 'EACCES'\n      || candidate.code === 'EPERM'\n      || candidate.code === 'EBUSY';\n  }\n\n  private getDiskCacheKeyPrefix(): string {\n    // Avoid accidental cross-registry pollution for metadata/tarballs.\n    return `${this.registryUrl}`;\n  }\n\n  private async readDiskCacheJson<T>(filePath: string): Promise<T | null> {\n    try {\n      if (!await fs.exists(filePath)) return null;\n      const raw = await fs.readJSON(filePath, { encoding: 'utf8' }) as any;\n      if (!raw || typeof raw !== 'object') return null;\n\n      // TTL envelope format: { expiresAt: number, data: T }\n      if (typeof raw.expiresAt === 'number' && 'data' in raw) {\n        if (Date.now() >= raw.expiresAt) {\n          // Lazy eviction\n          await fs.remove(filePath).catch(() => undefined);\n          return null;\n        }\n        return raw.data as T;\n      }\n\n      // Non-TTL format: just the raw data.\n      return raw as T;\n    } catch {\n      return null;\n    }\n  }\n\n  private async writeDiskCacheJson<T>(filePath: string, data: T, ttlMs: number): Promise<void> {\n    try {\n      await fs.ensureDir(path.dirname(filePath));\n      const expiresAt = Date.now() + ttlMs;\n      const tmp = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n      await fs.writeJSON(tmp, { expiresAt, data } satisfies DiskCacheEnvelope<T>);\n      await fs.move(tmp, filePath, { overwrite: true });\n    } catch {\n      // best-effort\n    }\n  }\n\n  private async writeDiskCacheJsonNoTtl<T>(filePath: string, data: T): Promise<void> {\n    try {\n      await fs.ensureDir(path.dirname(filePath));\n      const tmp = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n      await fs.writeJSON(tmp, data);\n      await fs.move(tmp, filePath, { overwrite: true });\n    } catch {\n      // best-effort\n    }\n  }\n\n  private getDiskRegistryMetadataCachePath(packageName: string): string {\n    const key = `registry-meta|${this.getDiskCacheKeyPrefix()}|${packageName}`;\n    return path.join(this.cachePath, '.fpi.cache', 'metadata', `${sha256Hex(key)}.json`);\n  }\n\n  private getDiskIndexCachePath(packageObject: FhirPackageIdentifier): string {\n    const key = `index|${FPI_INDEX_CACHE_VERSION}|${packageObject.id}#${packageObject.version}`;\n    return path.join(this.cachePath, '.fpi.cache', 'indexes', `${sha256Hex(key)}.json`);\n  }\n\n  private getDiskTarballCacheKey(packageObject: FhirPackageIdentifier): string {\n    return `tarball|${this.getDiskCacheKeyPrefix()}|${packageObject.id}#${packageObject.version}`;\n  }\n\n  private async getDiskTarballCachePaths(packageObject: FhirPackageIdentifier): Promise<{ tgzPath: string; donePath: string }> {\n    const tarDir = await this.ensureDiskCacheSubdir('tarballs');\n    const tgzPath = path.join(tarDir, `${sha256Hex(this.getDiskTarballCacheKey(packageObject))}.tgz`);\n    const donePath = `${tgzPath}.done`;\n    return { tgzPath, donePath };\n  }\n\n  private async readDiskTarballCache(packageObject: FhirPackageIdentifier): Promise<string | null> {\n    try {\n      const { tgzPath, donePath } = await this.getDiskTarballCachePaths(packageObject);\n      if (!await fs.exists(tgzPath)) return null;\n\n      // We treat tarballs as immutable when keyed by id+version.\n      // Use a done marker to avoid using a partially-written tgz after a crash.\n      if (!await fs.exists(donePath)) {\n        await fs.remove(tgzPath).catch(() => undefined);\n        return null;\n      }\n      return tgzPath;\n    } catch {\n      return null;\n    }\n  }\n\n  private async writeDiskTarballDoneMarker(donePath: string): Promise<void> {\n    try {\n      const tmp = `${donePath}.${process.pid}.${Date.now()}.tmp`;\n      await fs.writeFile(tmp, 'ok');\n      await fs.move(tmp, donePath, { overwrite: true });\n    } catch {\n      // best-effort\n    }\n  }\n\n  private getIndexMemKey(packageObject: FhirPackageIdentifier): string {\n    // Indexes are keyed only by immutable identity (package id+version) plus FPI minor version.\n    // Do not include cachePath here: different installer instances in the same process should share.\n    return `index|${FPI_INDEX_CACHE_VERSION}|${packageObject.id}#${packageObject.version}`;\n  }\n\n  private getIndexDiskLockKey(packageObject: FhirPackageIdentifier): string {\n    return `index-cache|${FPI_INDEX_CACHE_VERSION}|${packageObject.id}#${packageObject.version}`;\n  }\n\n  private getMaterializationMarkerPath(packageRoot: string): string {\n    return path.join(packageRoot, FPI_MATERIALIZATION_MARKER);\n  }\n\n  private async writeMaterializationMarker(\n    packageRoot: string,\n    packageDir: string,\n    manifestPath: string,\n    indexPath: string\n  ): Promise<void> {\n    const markerPath = this.getMaterializationMarkerPath(packageRoot);\n    const tmpPath = `${markerPath}.${process.pid}.${Date.now()}.tmp`;\n    try {\n      const [packageDirStat, manifestStat, indexStat] = await Promise.all([\n        fs.stat(packageDir),\n        fs.stat(manifestPath),\n        fs.stat(indexPath),\n      ]);\n      await fs.writeJSON(tmpPath, {\n        packageDirMtimeMs: packageDirStat.mtimeMs,\n        packageDirCtimeMs: packageDirStat.ctimeMs,\n        manifestMtimeMs: manifestStat.mtimeMs,\n        manifestCtimeMs: manifestStat.ctimeMs,\n        indexMtimeMs: indexStat.mtimeMs,\n        indexCtimeMs: indexStat.ctimeMs,\n      });\n      await fs.move(tmpPath, markerPath, { overwrite: true });\n    } catch {\n      // best-effort cache hint\n    } finally {\n      await fs.remove(tmpPath).catch(() => undefined);\n    }\n  }\n\n  private async hasFreshMaterializationMarker(\n    packageRoot: string,\n    packageDir: string,\n    manifestPath: string,\n    indexPath: string\n  ): Promise<boolean> {\n    const markerPath = this.getMaterializationMarkerPath(packageRoot);\n    try {\n      const [marker, packageDirStat, manifestStat, indexStat] = await Promise.all([\n        fs.readJSON(markerPath, { encoding: 'utf8' }) as Promise<{\n          packageDirMtimeMs: number;\n          packageDirCtimeMs: number;\n          manifestMtimeMs: number;\n          manifestCtimeMs: number;\n          indexMtimeMs: number;\n          indexCtimeMs: number;\n        }>,\n        fs.stat(packageDir),\n        fs.stat(manifestPath),\n        fs.stat(indexPath),\n      ]);\n      return marker.packageDirMtimeMs === packageDirStat.mtimeMs\n        && marker.packageDirCtimeMs === packageDirStat.ctimeMs\n        && marker.manifestMtimeMs === manifestStat.mtimeMs\n        && marker.manifestCtimeMs === manifestStat.ctimeMs\n        && marker.indexMtimeMs === indexStat.mtimeMs\n        && marker.indexCtimeMs === indexStat.ctimeMs;\n    } catch {\n      return false;\n    }\n  }\n\n  private isRegistryDisabled(): boolean {\n    return this.registryDisabled;\n  }\n\n  private formatRegistryDisabledMessage(detail: string): string {\n    return `FHIR package registry is disabled (registryUrl=n/a). ${detail}`;\n  }\n\n  private async hasShallowInstalledPackage(packageObject: FhirPackageIdentifier): Promise<boolean> {\n    const packageRoot = await this.getPackageDirPath(packageObject);\n    if (!await fs.exists(packageRoot)) {\n      return false;\n    }\n\n    const packageDir = path.join(packageRoot, 'package');\n    if (!await fs.exists(packageDir)) {\n      return false;\n    }\n\n    const manifestPath = path.join(packageDir, 'package.json');\n    if (!await fs.exists(manifestPath)) {\n      return false;\n    }\n\n    const indexPath = path.join(packageDir, '.fpi.index.json');\n    if (await fs.exists(indexPath)) {\n      return await this.isStrictlyMaterialized(packageObject);\n    }\n\n    const legacyIndexPath = path.join(packageDir, '.index.json');\n    if (await fs.exists(legacyIndexPath)) {\n      return (await this.tryMaterializeLegacyPackageIndex(packageObject, packageDir)) !== null;\n    }\n\n    return true;\n  }\n\n  private async isStrictlyMaterialized(packageObject: FhirPackageIdentifier): Promise<boolean> {\n    const materialization = await this.getPackageMaterializationStatus(packageObject);\n    return materialization.complete;\n  }\n\n  private async hasReadableManifest(packageObject: FhirPackageIdentifier): Promise<boolean> {\n    try {\n      await this.getManifest(packageObject);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  private async collectMissingPackages(\n    root: FhirPackageIdentifier,\n    options?: { requireStrictMaterialization?: boolean }\n  ): Promise<string[]> {\n    const missing: string[] = [];\n    const visited = new Set<string>();\n    const { explicitImplicitVersions } = await this.collectExplicitDependencyClosure(root);\n    const requireStrictMaterialization = options?.requireStrictMaterialization === true;\n\n    const visit = async (pkg: FhirPackageIdentifier) => {\n      const key = `${pkg.id}#${pkg.version}`;\n      if (visited.has(key)) return;\n      visited.add(key);\n\n      const isInstalled = requireStrictMaterialization\n        ? await this.isStrictlyMaterialized(pkg)\n        : await this.isInstalled(pkg, { deep: false });\n      if (!isInstalled) {\n        missing.push(key);\n        return;\n      }\n\n      const deps = await this.getDependencies(pkg, { explicitImplicitVersions });\n      for (const [depId, depVersion] of Object.entries(deps || {})) {\n        if (this.skipExamples && depId.includes('examples')) continue;\n        await visit({ id: depId, version: depVersion });\n      }\n    };\n\n    await visit(root);\n    return missing;\n  }\n\n  private async collectPlannedDependencyClosure(\n    root: FhirPackageIdentifier,\n    seedExplicitImplicitVersions?: ReadonlyMap<string, string>\n  ): Promise<Map<string, FhirPackageIdentifier>> {\n    return await this.withDebugTiming(\n      `collect-planned-dependency-closure ${this.formatPackageForDebug(root)}`,\n      async () => {\n        const { closure, explicitImplicitVersions: localExplicitImplicitVersions } = await this.collectExplicitDependencyClosure(root);\n        const explicitImplicitVersions = new Map(seedExplicitImplicitVersions ?? []);\n        for (const [packageId, version] of localExplicitImplicitVersions.entries()) {\n          if (!explicitImplicitVersions.has(packageId)) {\n            explicitImplicitVersions.set(packageId, version);\n          }\n        }\n        const expanded = new Set<string>();\n        const queue: FhirPackageIdentifier[] = [root, ...Array.from(closure.values())];\n\n        while (queue.length > 0) {\n          const current = queue.shift() as FhirPackageIdentifier;\n          const currentKey = this.getPackageKey(current);\n          if (expanded.has(currentKey)) {\n            continue;\n          }\n          expanded.add(currentKey);\n\n          const dependencies = await this.getDependenciesForPlanning(current, explicitImplicitVersions);\n          for (const [depId, depVersion] of Object.entries(dependencies)) {\n            if (this.skipExamples && depId.includes('examples')) {\n              continue;\n            }\n\n            const dependency = { id: depId, version: depVersion };\n            const dependencyKey = this.getPackageKey(dependency);\n            if (!closure.has(dependencyKey)) {\n              closure.set(dependencyKey, dependency);\n            }\n            if (!expanded.has(dependencyKey)) {\n              queue.push(dependency);\n            }\n          }\n        }\n\n        return closure;\n      },\n      (closure) => `plannedPackages=${closure.size}`\n    );\n  }\n\n  private async withRetries<T>(\n    fn: () => Promise<T>,\n    retries = 3,\n    delayMs = 5000\n  ): Promise<T> {\n    let lastError: any;\n    for (let attempt = 1; attempt <= retries; attempt++) {\n      try {\n        return await fn();\n      } catch (err: any) {\n        lastError = err;\n        const isTemporary =\n          err.code === 'EAI_AGAIN' ||\n          err.code === 'ENOTFOUND' ||\n          err.code === 'ECONNRESET' ||\n          err.code === 'ETIMEDOUT' ||\n          err.code === 'ECONNABORTED' ||\n          err.message === 'aborted';\n  \n        if (!isTemporary || attempt === retries) {\n          throw err;\n        }\n  \n        this.logger.warn(\n          `⚠️ Attempt ${attempt} failed (${err.code || err.message}), retrying in ${delayMs}ms...`\n        );\n        await new Promise((resolve) => setTimeout(resolve, delayMs));\n      }\n    }\n    throw lastError;\n  }\n\n  /**\n   * Takes a FhirPackageIdentifier Object and returns the corresponding directory name of the package\n   * @param packageObject A PackageObject with both name and version keys\n   * @returns (string) Directory name in the standard format `name#version`\n   */\n  private async toDirName(packageId: FhirPackageIdentifier | string): Promise<string> {\n    const packageObj = typeof packageId === 'string' ? await this.toPackageObject(packageId) : packageId;\n    return packageObj.id + '#' + packageObj.version;\n  }\n\n  /**\n   * Takes a FhirPackageIdentifier Object and returns the path to the package folder in the cache\n   * @param packageObject A FhirPackageIdentifier Object with both name and version keys\n   * @returns The full path to the package directory\n   */\n  public async getPackageDirPath(packageId: FhirPackageIdentifier | string): Promise<string> {\n    return path.join(this.cachePath, await this.toDirName(packageId));\n  }\n\n  /**\n   * Get the full path to the .fpi.index.json file in the package folder\n   * @param packageObject A FhirPackageIdentifier Object with both name and version keys\n   * @returns (string) The path to the package index file\n   */\n  private async getPackageIndexPath(packageId: FhirPackageIdentifier | string): Promise<string> {\n    return path.join(await this.getPackageDirPath(packageId), 'package', '.fpi.index.json');\n  }\n\n\n  /**\n   * Scans a package folder and generates a new `.fpi.index.json` file\n   * @param packageObject The package identifier object\n   * @returns PackageIndex\n   */\n  private async generatePackageIndex(packageId: FhirPackageIdentifier | string): Promise<PackageIndex> {\n    const pckIdObj = typeof packageId === 'string' ? await this.toPackageObject(packageId) : packageId;\n    return await this.withDebugTiming(\n      `generate-package-index ${this.formatPackageForDebug(pckIdObj)}`,\n      async () => {\n        this.logger.debug?.(`Generating new .fpi.index.json file for package ${pckIdObj.id}@${pckIdObj.version}...`);\n        const packagePath = await this.getPackageDirPath(pckIdObj);\n        return await this.materializePackageIndex(pckIdObj, path.join(packagePath, 'package'));\n      },\n      (indexJson) => `fileCount=${indexJson.files.length}`\n    );\n  }\n\n  /**\n   * Generates HTTP options including authorization header for registry requests\n   * @param url The URL being requested\n   * @returns HTTP options object with headers if needed\n   */\n  private getHttpOptions(url: string): https.RequestOptions {\n    const options: https.RequestOptions = {};\n    \n    // Add authorization header for requests to the configured registry\n    // or any URL that contains the same hostname (to handle redirects within the same registry)\n    if (this.registryToken && !this.isRegistryDisabled()) {\n      try {\n        const registryHostname = new URL(this.registryUrl).hostname;\n        const urlHostname = new URL(url).hostname;\n        if (url.startsWith(this.registryUrl) || urlHostname === registryHostname) {\n          options.headers = {\n            'Authorization': `Bearer ${this.registryToken}`\n          };\n        }\n      } catch (err: any) {\n        // If registryUrl isn't a valid URL, skip auth headers.\n        // However, log a warning so misconfiguration is visible.\n        const normalizedRegistryUrl = (this.registryUrl || '').trim().toLowerCase();\n        if (normalizedRegistryUrl !== 'n/a') {\n          const displayUrl = url.length > 128 ? `${url.substring(0, 128)}...` : url;\n          this.logger.warn(\n            `Failed to parse URL(s) for auth header (registryUrl='${this.registryUrl}', url='${displayUrl}'); proceeding without auth header. ` +\n            `Error: ${err?.message || String(err)}`\n          );\n        }\n      }\n    }\n    \n    return options;\n  }\n\n  private fetchJson(url: string, redirectCount = 0): Promise<any> {\n    const maxRedirects = 5;\n    \n    return this.withRetries(() => new Promise((resolve, reject) => {\n      const options = this.getHttpOptions(url);\n      const isHttps = url.startsWith('https:');\n      const isHttp = url.startsWith('http:');\n      \n      // Check if HTTP is allowed for testing\n      if (isHttp && !this.allowHttp) {\n        reject(new Error('HTTP URLs not allowed. Use HTTPS or enable allowHttp for testing.'));\n        return;\n      }\n      \n      const client = isHttps ? https : http;\n      const req = client.get(url, options, (res) => {\n        // Handle redirects (301, 302, 303, 307, 308)\n        if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {\n          if (redirectCount >= maxRedirects) {\n            reject(new Error(`Too many redirects (${maxRedirects}) when fetching ${url}`));\n            return;\n          }\n          \n          const redirectTarget = res.headers.location;\n          const displayUrl = redirectTarget.length > 64 \n            ? `${redirectTarget.substring(0, 64)}...` \n            : redirectTarget;\n          this.logger.debug?.(`Following redirect from ${url} to ${displayUrl}`);\n          // Recursively follow the redirect\n          this.fetchJson(res.headers.location, redirectCount + 1)\n            .then(resolve)\n            .catch(reject);\n          return;\n        }\n        \n        // Apply a per-request inactivity timeout while reading the response\n        res.setTimeout(this.requestTimeoutMs, () => {\n          const timeoutErr: any = new Error(`Request timed out after ${this.requestTimeoutMs}ms while fetching ${url}`);\n          timeoutErr.code = 'ETIMEDOUT';\n          res.destroy(timeoutErr);\n        });\n\n        let data = '';\n        res.on('data', (chunk) => (data += chunk));\n        res.on('end', () => {\n          // Check for HTTP error status codes\n          if (res.statusCode && res.statusCode >= 400) {\n            try {\n              const errorData = JSON.parse(data);\n              const errorMsg = errorData.error || errorData.message || data;\n              \n              // Convert authentication/authorization errors to \"not found\" for consistency\n              if (res.statusCode === 403 || res.statusCode === 401) {\n                reject(new Error('Package not found in the registry (authentication failed)'));\n              } else {\n                reject(new Error(`HTTP ${res.statusCode}: ${errorMsg}`));\n              }\n            } catch {\n              if (res.statusCode === 403 || res.statusCode === 401) {\n                reject(new Error('Package not found in the registry (authentication failed)'));\n              } else {\n                reject(new Error(`HTTP ${res.statusCode}: ${data || 'Unknown error'}`));\n              }\n            }\n            return;\n          }\n          \n          try {\n            resolve(JSON.parse(data));\n          } catch (e) {\n            reject(new Error(`Failed to parse JSON from ${url}: ${e}`));\n          }\n        });\n      });\n\n      req.setTimeout(this.requestTimeoutMs, () => {\n        const timeoutErr: any = new Error(`Request timed out after ${this.requestTimeoutMs}ms while fetching ${url}`);\n        timeoutErr.code = 'ETIMEDOUT';\n        req.destroy(timeoutErr);\n      });\n\n      req.on('error', reject);\n    }));\n  }  \n\n  private fetchStream(url: string, redirectCount = 0): Promise<Readable> {\n    const maxRedirects = 5;\n    \n    return this.withRetries(() => new Promise((resolve, reject) => {\n      const options = this.getHttpOptions(url);\n      const isHttps = url.startsWith('https:');\n      const isHttp = url.startsWith('http:');\n      \n      // Check if HTTP is allowed for testing\n      if (isHttp && !this.allowHttp) {\n        reject(new Error('HTTP URLs not allowed. Use HTTPS or enable allowHttp for testing.'));\n        return;\n      }\n      \n      const client = isHttps ? https : http;\n      const req = client.get(url, options, (res) => {\n        // Handle redirects (301, 302, 303, 307, 308)\n        if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {\n          if (redirectCount >= maxRedirects) {\n            reject(new Error(`Too many redirects (${maxRedirects}) when fetching ${url}`));\n            return;\n          }\n          \n          const redirectTarget = res.headers.location;\n          const displayUrl = redirectTarget.length > 64 \n            ? `${redirectTarget.substring(0, 64)}...` \n            : redirectTarget;\n          this.logger.debug?.(`Following redirect from ${url} to ${displayUrl}`);\n          // Recursively follow the redirect\n          this.fetchStream(res.headers.location, redirectCount + 1)\n            .then(resolve)\n            .catch(reject);\n          return;\n        }\n        \n        if (res.statusCode === 200) {\n          res.setTimeout(this.requestTimeoutMs, () => {\n            const timeoutErr: any = new Error(`Request timed out after ${this.requestTimeoutMs}ms while fetching ${url}`);\n            timeoutErr.code = 'ETIMEDOUT';\n            res.destroy(timeoutErr);\n          });\n          resolve(res);\n        } else {\n          const code = res.statusCode ?? 0;\n          if (code === 404) {\n            reject(new Error(`Failed to fetch ${url} (status 404): not found`));\n          } else {\n            reject(new Error(`Failed to fetch ${url} (status ${code})`));\n          }\n        }\n      });\n\n      req.setTimeout(this.requestTimeoutMs, () => {\n        const timeoutErr: any = new Error(`Request timed out after ${this.requestTimeoutMs}ms while fetching ${url}`);\n        timeoutErr.code = 'ETIMEDOUT';\n        req.destroy(timeoutErr);\n      });\n\n      req.on('error', reject);\n    }));\n  }  \n\n  private async getPackageDataFromRegistry(packageName: string): Promise<Record<string, any>> {\n    if (this.isRegistryDisabled()) {\n      throw new Error(this.formatRegistryDisabledMessage(`Cannot query registry for package metadata (${packageName}).`));\n    }\n\n    const url = `${this.registryUrl}/${packageName}/`;\n    const cacheKey = `fetch-json|${url}`;\n\n    // Layer 1: memory\n    const memKey = `registry-meta|${this.registryUrl}|${packageName}`;\n    const memHit = memGet<Record<string, any>>(memKey);\n    if (memHit) return memHit;\n\n    // Layer 2: per-cachePath disk\n    const diskPath = this.getDiskRegistryMetadataCachePath(packageName);\n\n    return await withSingleFlight(inFlightJson, cacheKey, async () => {\n      const memHit2 = memGet<Record<string, any>>(memKey);\n      if (memHit2) return memHit2;\n\n      return await this.withDiskLock(`registry-meta|${this.getDiskCacheKeyPrefix()}|${packageName}`, async () => {\n        const memHit3 = memGet<Record<string, any>>(memKey);\n        if (memHit3) return memHit3;\n\n        try {\n          await this.ensureDiskCacheSubdir('metadata');\n          const diskHit = await this.readDiskCacheJson<Record<string, any>>(diskPath);\n          if (diskHit) {\n            memSet(memKey, diskHit, this.registryTtlMs);\n            return diskHit;\n          }\n        } catch {\n          // ignore disk cache read errors\n        }\n\n        // Only log when we are about to perform a real registry request.\n        // Cache hits (memory/disk) should remain silent to avoid console clutter.\n        this.logger.debug?.(`Fetching registry metadata for FHIR package ${packageName} from ${this.registryUrl}`);\n        const data = await this.fetchJson(url);\n        memSet(memKey, data, this.registryTtlMs);\n        await this.writeDiskCacheJson(diskPath, data, this.registryTtlMs);\n        return data;\n      });\n    });\n  }\n\n  private async getTarballUrl(packageObject: FhirPackageIdentifier): Promise<string> {\n    if (this.isRegistryDisabled()) {\n      throw new Error(this.formatRegistryDisabledMessage(\n        `Cannot download ${packageObject.id}@${packageObject.version}. Required packages must already exist in the package cache (${this.cachePath}).`\n      ));\n    }\n\n    if (!packageObject.version || packageObject.version.trim().length === 0) {\n      throw new Error(`Invalid package version for ${packageObject.id}`);\n    }\n\n    // A specific package version is immutable. Prefer a deterministic tarball URL.\n    // This avoids extra registry metadata calls, reducing rate-limit pressure.\n    const isPrivateRegistry = this.registryUrl !== 'https://packages.fhir.org';\n    \n    // For private registries, construct the URL using the registry base (don't trust provided tarball URLs)\n    if (isPrivateRegistry) {\n      return `${this.registryUrl}/${packageObject.id}/-/${packageObject.id}-${packageObject.version}.tgz`;\n    }\n\n    // Default registry (packages.fhir.org) also supports the standard npm-style tarball URL format.\n    return `${this.registryUrl}/${packageObject.id}/-/${packageObject.id}-${packageObject.version}.tgz`;\n  }\n\n  private async downloadFile(url: string, destination: string): Promise<void> {\n    const tarballStream = await this.fetchStream(url);\n    const fileStream = fs.createWriteStream(destination);\n    await finished(tarballStream.pipe(fileStream));\n  }\n\n  private async downloadTarball(packageObject: FhirPackageIdentifier): Promise<string> {\n    const tempDirectory = createTempDir();\n    const tarballPath = path.join(tempDirectory, `${packageObject.id}-${packageObject.version}.tgz`);\n\n    const cached = await this.getOrDownloadDiskCachedTarball(packageObject);\n    await fs.copy(cached, tarballPath, { overwrite: true });\n    return tarballPath;\n  }\n\n  private async getOrDownloadDiskCachedTarball(packageObject: FhirPackageIdentifier): Promise<string> {\n    const key = this.getDiskTarballCacheKey(packageObject);\n    const memKey = `tarball|${this.cachePath}|${key}`;\n\n    const memHit = memGet<string>(memKey);\n    if (memHit && await fs.exists(memHit)) return memHit;\n\n    return await withSingleFlight(inFlightTarball, memKey, async () => {\n      const memHit2 = memGet<string>(memKey);\n      if (memHit2 && await fs.exists(memHit2)) return memHit2;\n\n      return await this.withDiskLock(this.getDiskTarballCacheKey(packageObject), async () => {\n        const diskHit = await this.readDiskTarballCache(packageObject);\n        if (diskHit) {\n          memSetNoTtl(memKey, diskHit);\n          return diskHit;\n        }\n\n        const { tgzPath, donePath } = await this.getDiskTarballCachePaths(packageObject);\n        const tarballUrl = await this.getTarballUrl(packageObject);\n        this.logger.debug?.(`Downloading ${packageObject.id}@${packageObject.version} from ${tarballUrl}`);\n\n        const tmp = `${tgzPath}.${process.pid}.${Date.now()}.tmp`;\n        try {\n          await this.downloadFile(tarballUrl, tmp);\n        } catch (e: any) {\n          await fs.remove(tmp).catch(() => undefined);\n          if (e instanceof FhirPackageInstallError) throw e;\n          throw new FhirPackageInstallError({\n            packageId: packageObject.id,\n            version: packageObject.version ?? 'unknown',\n            registryUrl: this.registryUrl,\n            cachePath: this.cachePath,\n            step: 'download-tarball',\n            tarballUrl,\n            cause: e,\n          });\n        }\n\n        try {\n          await fs.move(tmp, tgzPath, { overwrite: false });\n        } catch (e: any) {\n          // Another process may have won the race. Prefer the existing file.\n          if (e?.code !== 'EEXIST') {\n            await fs.remove(tmp).catch(() => undefined);\n            throw e;\n          }\n          await fs.remove(tmp).catch(() => undefined);\n        }\n\n        // Mark completion so crashes don't leave a half-written cache entry.\n        await this.writeDiskTarballDoneMarker(donePath);\n\n        memSetNoTtl(memKey, tgzPath);\n        return tgzPath;\n      });\n    });\n  }\n\n  /**\n   * Extracts a tarball to a temporary directory and generates a new `.fpi.index.json` file.\n   * The tarball can be a file path or a stream.\n   * @param src The source tarball, either a file path or a Readable stream.\n   * @returns The path to the temporary directory where the package was extracted.\n   */\n  private async extractTarball(\n    src: string | Readable,\n    options?: { packageObject?: FhirPackageIdentifier; packageLabel?: string }\n  ): Promise<string> {\n    const tarballStream: Readable = typeof src === 'string' ? fs.createReadStream(src) : src;\n\n    const pkgObj = options?.packageObject;\n    const packageLabel = pkgObj\n      ? this.formatPackageForDebug(pkgObj)\n      : options?.packageLabel?.trim() || 'unknown package';\n    const extractionStartedAtNs = process.hrtime.bigint();\n    let cachedIndex: PackageIndex | null = null;\n    if (pkgObj?.id && pkgObj?.version) {\n      try {\n        const memKey = this.getIndexMemKey(pkgObj);\n        cachedIndex = memGet<PackageIndex>(memKey);\n        if (!cachedIndex) {\n          const diskPath = this.getDiskIndexCachePath(pkgObj);\n          await this.ensureDiskCacheSubdir('indexes');\n          cachedIndex = await this.readDiskCacheJson<PackageIndex>(diskPath);\n          if (cachedIndex) {\n            memSetNoTtl(memKey, cachedIndex);\n          }\n        }\n      } catch {\n        cachedIndex = null;\n      }\n    }\n    const shouldParseForIndex = !cachedIndex;\n\n    const indexEntries: FileInPackageIndex[] = [];\n    const handleEntryPromises: Promise<void>[] = [];\n\n    const tempDirectory = await this.createWorkingTempDir({ preferCache: Boolean(pkgObj) });\n    this.logger.debug?.(`Extracting package ${packageLabel} to ${tempDirectory}`);\n    const extract = tar.extract();\n\n    // Inactivity timeout: reset whenever we see extraction progress (data or entry completion).\n    // This avoids timing out on very large packages (e.g., *examples*) that can legitimately take a long time.\n    let timeoutHandle: NodeJS.Timeout | undefined;\n    let rejectTimeout: ((err: any) => void) | undefined;\n    const armInactivityTimeout = () => {\n      if (!Number.isFinite(this.extractTimeoutMs) || this.extractTimeoutMs <= 0) {\n        return;\n      }\n      if (timeoutHandle) {\n        clearTimeout(timeoutHandle);\n      }\n      timeoutHandle = setTimeout(() => {\n        try {\n          try {\n            tarballStream.destroy(new Error('Tarball extraction timeout'));\n          } catch {\n            // ignore\n          }\n          try {\n            extract.destroy(new Error('Tarball extraction timeout'));\n          } catch {\n            // ignore\n          }\n        } finally {\n          const err: any = new Error(`Tarball extraction made no progress for ${this.extractTimeoutMs}ms`);\n          err.code = 'ETIMEDOUT';\n          rejectTimeout?.(err);\n        }\n      }, this.extractTimeoutMs);\n    };\n    const touchProgress = () => armInactivityTimeout();\n\n    // Start the inactivity timer immediately and keep it alive while bytes flow.\n    armInactivityTimeout();\n    tarballStream.on('data', touchProgress);\n    tarballStream.on('error', touchProgress);\n\n    // Progress logs for very large packages (e.g., *examples*)\n    let completedEntries = 0;\n    const progressLogIntervalMs = 30000;\n    const progressLogHandle = setInterval(() => {\n      this.logger.debug?.(`Extracting package ${packageLabel}... completed ${completedEntries} entries so far`);\n    }, progressLogIntervalMs);\n    // Don't keep the process alive only for progress logging\n    (progressLogHandle as any).unref?.();\n  \n    extract.on('entry', (header, stream, next) => {\n      const fullPath = path.join(tempDirectory, header.name);\n      const folderInTarball = path.dirname(header.name);\n      const fileName = path.basename(header.name);\n\n      touchProgress();\n  \n      try {\n        if (header.type === 'directory') {\n          fs.ensureDirSync(fullPath);\n          touchProgress();\n          stream.resume();\n          stream.on('end', () => {\n            completedEntries++;\n            touchProgress();\n            next();\n          });\n          stream.on('error', (err) => {\n            extract.emit('error', err);\n            next();\n          });\n          return;\n        }\n\n        if (header.type !== 'file') {\n          // Drain unknown entry types to avoid stalling extraction\n          touchProgress();\n          stream.resume();\n          stream.on('end', () => {\n            completedEntries++;\n            touchProgress();\n            next();\n          });\n          stream.on('error', (err) => {\n            extract.emit('error', err);\n            next();\n          });\n          return;\n        }\n\n        // Always ensure directory exists\n        fs.ensureDirSync(path.dirname(fullPath));\n\n        // IMPORTANT: tar-stream requires us to fully consume the entry stream\n        // before calling next(), otherwise extraction can hang.\n        stream.on('data', touchProgress);\n        const writePromise = pipeline(stream, fs.createWriteStream(fullPath));\n\n        writePromise\n          .then(() => {\n            // Only rate-limit/parallelize the *parsing*, not the draining.\n            if (\n              shouldParseForIndex &&\n              folderInTarball === 'package' &&\n              fileName.endsWith('.json') &&\n              fileName !== 'package.json' &&\n              !fileName.endsWith('.index.json')\n            ) {\n              handleEntryPromises.push(\n                limit(async () => {\n                  const contentBuffer = await fs.readFile(fullPath, 'utf8');\n                  try {\n                    const content = JSON.parse(contentBuffer) as PackageResource;\n                    const indexEntry = extractResourceIndexEntry(fileName, content);\n                    indexEntries.push(indexEntry);\n                  } catch (err) {\n                    let errText = String(err);\n                    if (!(err instanceof Error) && typeof err !== 'string') {\n                      try {\n                        errText = JSON.stringify(err);\n                      } catch {\n                        // fallback to String(err)\n                      }\n                    }\n                    this.logger.warn(`Failed to parse ${fileName}: ${err instanceof Error ? err.message : errText}`);\n                  }\n                  touchProgress();\n                })\n              );\n            }\n          })\n          .catch((err) => {\n            extract.emit('error', err);\n          })\n          .finally(() => {\n            completedEntries++;\n            touchProgress();\n            next();\n          });\n      } catch (err) {\n        // Ensure we don't stall extraction if something throws synchronously\n        try {\n          stream.resume();\n        } catch {\n          // ignore\n        }\n        extract.emit('error', err);\n        next();\n      }\n    });\n\n    const extractionPromise = (async () => {\n      const archiveExtractionStartedAtNs = process.hrtime.bigint();\n      await pipeline(\n        tarballStream,\n        zlib.createGunzip(),\n        extract\n      );\n      this.logger.debug?.(\n        `[extract] Finished unpacking archive for ${packageLabel} into ${tempDirectory} ` +\n        `in ${this.formatElapsedMs(archiveExtractionStartedAtNs)}ms (entries=${completedEntries}).`\n      );\n\n      const indexBuildStartedAtNs = process.hrtime.bigint();\n      await Promise.all(handleEntryPromises);\n      if (shouldParseForIndex) {\n        this.logger.debug?.(\n          `[extract] Built in-memory index candidates for ${packageLabel} ` +\n          `in ${this.formatElapsedMs(indexBuildStartedAtNs)}ms (fileCount=${indexEntries.length}).`\n        );\n      } else {\n        this.logger.debug?.(\n          `[extract] Reused cached index for ${packageLabel} ` +\n          `in ${this.formatElapsedMs(indexBuildStartedAtNs)}ms (fileCount=${cachedIndex?.files.length ?? 0}).`\n        );\n      }\n    })();\n\n    const inactivityTimeoutPromise = new Promise<void>((_, reject) => {\n      rejectTimeout = reject;\n    });\n\n    try {\n      await Promise.race([extractionPromise, inactivityTimeoutPromise]);\n    } finally {\n      if (timeoutHandle) {\n        clearTimeout(timeoutHandle);\n      }\n      tarballStream.off('data', touchProgress);\n      tarballStream.off('error', touchProgress);\n      clearInterval(progressLogHandle);\n    }\n  \n    const indexJson: PackageIndex = {\n      'index-version': 2,\n      files: shouldParseForIndex ? indexEntries : (cachedIndex?.files || [])\n    };\n    const extractedIndexWriteStartedAtNs = process.hrtime.bigint();\n    await fs.writeJSON(path.join(tempDirectory, 'package', '.fpi.index.json'), indexJson);\n    this.logger.debug?.(\n      `[extract] Wrote extracted package index for ${packageLabel} ` +\n      `in ${this.formatElapsedMs(extractedIndexWriteStartedAtNs)}ms (fileCount=${indexJson.files.length}).`\n    );\n\n    // If we computed an index for a known package version, persist to memory + per-cachePath disk (best-effort)\n    if (shouldParseForIndex && pkgObj?.id && pkgObj?.version) {\n      const extractedIndexCachePersistStartedAtNs = process.hrtime.bigint();\n      try {\n        const memKey = this.getIndexMemKey(pkgObj);\n        memSetNoTtl(memKey, indexJson);\n        const diskPath = this.getDiskIndexCachePath(pkgObj);\n        await this.ensureDiskCacheSubdir('indexes');\n        await this.writeDiskCacheJsonNoTtl(diskPath, indexJson);\n        this.logger.debug?.(\n          `[extract] Persisted extracted index cache for ${packageLabel} ` +\n          `in ${this.formatElapsedMs(extractedIndexCachePersistStartedAtNs)}ms.`\n        );\n      } catch {\n        // ignore\n      }\n    }\n  \n    this.logger.debug?.(\n      `Extracted ${packageLabel} to temporary directory ${tempDirectory} ` +\n      `in ${this.formatElapsedMs(extractionStartedAtNs)}ms.`\n    );\n    return tempDirectory;\n  }\n\n  private async downloadAndExtractTarball(packageObject: FhirPackageIdentifier): Promise<string> {\n    return await this.withDebugTiming(\n      `download-and-extract-tarball ${this.formatPackageForDebug(packageObject)}`,\n      async () => {\n        const cachedTgzPath = await this.getOrDownloadDiskCachedTarball(packageObject);\n        try {\n          return await this.extractTarball(cachedTgzPath, { packageObject });\n        } catch (e: any) {\n          if (e instanceof FhirPackageInstallError) throw e;\n          let tarballUrl: string | undefined;\n          try {\n            tarballUrl = await this.getTarballUrl(packageObject);\n          } catch {\n            tarballUrl = undefined;\n          }\n          throw new FhirPackageInstallError({\n            packageId: packageObject.id,\n            version: packageObject.version ?? 'unknown',\n            registryUrl: this.registryUrl,\n            cachePath: this.cachePath,\n            step: 'extract-tarball',\n            tarballUrl,\n            cause: e,\n          });\n        }\n      }\n    );\n  }\n\n  /**\n   * Caches the package in the FHIR package cache directory.\n   * If the package is already installed, it will not be reinstalled.\n   * @param packageObject The package identifier object\n   * @param src The source path of the package to be cached\n   * @param move Whether to move the package to the cache or copy it. Defaults to **true**.\n   * @returns The path to the cached package directory\n   */\n  private async cachePackage(packageObject: FhirPackageIdentifier, src: string, move: boolean = true): Promise<string> {\n    return await this.withDebugTiming(\n      `cache-package ${this.formatPackageForDebug(packageObject)}`,\n      async () => {\n        const finalPath = await this.getPackageDirPath(packageObject);\n        const isInstalled = await this.isStrictlyMaterialized(packageObject);\n        if (isInstalled) {\n          return finalPath;\n        }\n\n        let stagingPath: string | null = null;\n        for (let attempt = 1; attempt <= 2; attempt += 1) {\n          try {\n            stagingPath = await this.stagePackageForPublish(packageObject, src, move);\n            break;\n          } catch (e: any) {\n            if (await this.isStrictlyMaterialized(packageObject)) {\n              return finalPath;\n            }\n\n            const canRetry = this.isRetryableStagePublishError(e) && attempt < 2;\n            if (!canRetry) {\n              throw e;\n            }\n\n            this.logger.warn?.(\n              `Retrying publish staging for ${packageObject.id}@${packageObject.version} after ${e?.code || e?.message || String(e)}.`\n            );\n          }\n        }\n\n        if (!stagingPath) {\n          return finalPath;\n        }\n\n        try {\n          const existingState = await this.getPackageMaterializationStatus(packageObject);\n          if (!existingState.complete && await fs.exists(finalPath)) {\n            await fs.remove(finalPath);\n          }\n\n          try {\n            await fs.move(stagingPath, finalPath, { overwrite: false });\n          } catch (e: any) {\n            if (this.isAlreadyExistsError(e)) {\n              const stateAfterCollision = await this.getPackageMaterializationStatus(packageObject);\n              if (stateAfterCollision.complete) {\n                this.logger.warn(`Package ${packageObject.id}@${packageObject.version} already installed by another process`);\n                return finalPath;\n              }\n\n              await fs.remove(finalPath).catch(() => undefined);\n              await fs.move(stagingPath, finalPath, { overwrite: false });\n            } else {\n              throw e;\n            }\n          }\n\n          this.logger.info(`Installed ${packageObject.id}@${packageObject.version} in the FHIR package cache: ${finalPath}`);\n          return finalPath;\n        } catch (e: any) {\n          if (e instanceof FhirPackageInstallError) throw e;\n          throw new FhirPackageInstallError({\n            packageId: packageObject.id,\n            version: packageObject.version ?? 'unknown',\n            registryUrl: this.registryUrl,\n            cachePath: this.cachePath,\n            step: 'cache-package',\n            cause: e,\n          });\n        } finally {\n          await fs.remove(stagingPath).catch(() => undefined);\n        }\n      }\n    );\n  }\n\n  /**\n   * Extracts the version of the package from a raw package identifier string.\n   * Supported formats: `name@version`, `name#version`, or just `name`\n   * @param packageId Raw package identifier string\n   * @returns The version part or 'latest' if not supplied\n   */\n  private getVersionFromPackageString(packageId: string): string {\n    const byPound = packageId.split('#');\n    const byAt = packageId.split('@');\n    if (byPound.length === 2) return byPound[1];\n    if (byAt.length === 2) return byAt[1];\n    return 'latest';\n  }\n\n  public async isInstalled(\n    packageId: FhirPackageIdentifier | string,\n    options?: { deep?: boolean }\n  ): Promise<boolean> {\n    const deep = options?.deep !== false;\n\n    // Avoid resolving \"latest\" via registry for unversioned string checks.\n    if (typeof packageId === 'string') {\n      const packageIdStr = packageId.trim();\n      if (packageIdStr.length === 0) {\n        return false;\n      }\n      const hasExplicitVersion = packageIdStr.includes('#') || packageIdStr.includes('@');\n      if (!hasExplicitVersion) {\n        const installedVersions = await this.getInstalledVersions(packageIdStr);\n        if (installedVersions.length === 0) return false;\n        const latestInstalled = installedVersions[0];\n        return await this.isInstalled({ id: packageIdStr, version: latestInstalled }, { deep });\n      }\n    }\n\n    const packageObject = typeof packageId === 'string' ? await this.toPackageObject(packageId) : packageId;\n    const shallowInstalled = await this.hasShallowInstalledPackage(packageObject);\n    if (!shallowInstalled) {\n      return false;\n    }\n    if (!deep) {\n      return true;\n    }\n\n    try {\n      const missing = await this.collectMissingPackages(packageObject);\n      return missing.length === 0;\n    } catch (err: any) {\n      // Deep validation errors should not be silently swallowed.\n      // If we can't reliably validate dependencies due to infra / IO / parsing errors,\n      // surface the failure to the caller.\n      const code = err?.code;\n      if (code === 'ENOENT' || code === 'ENOTDIR') {\n        // Treat common filesystem race conditions as \"not installed\".\n        return false;\n      }\n      throw err;\n    }\n  }\n\n  public async getPackageIndexFile(packageId: FhirPackageIdentifier | string): Promise<PackageIndex> {\n    const packageObject = typeof packageId === 'string' ? await this.toPackageObject(packageId) : packageId;\n    return await this.withDebugTiming(\n      `get-package-index-file ${this.formatPackageForDebug(packageObject)}`,\n      async () => {\n        const indexPath = await this.getPackageIndexPath(packageObject);\n        if (await fs.exists(indexPath)) {\n          return await fs.readJSON(indexPath, { encoding: 'utf8' });\n        }\n        return await this.generatePackageIndex(packageObject);\n      },\n      (indexJson) => `fileCount=${indexJson.files.length}`\n    );\n  }\n\n  public async checkLatestPackageDist(packageName: string): Promise<string> {\n    if (this.isRegistryDisabled()) {\n      throw new Error(this.formatRegistryDisabledMessage(\n        `Cannot resolve latest version for ${packageName}. Pin an explicit version in configuration.`\n      ));\n    }\n\n    // Latest is derived from the cached unversioned registry metadata (package document).\n    // This keeps caching policy consistent and avoids maintaining a second, redundant cache.\n    try {\n      const packageData = await this.getPackageDataFromRegistry(packageName);\n      const latest = packageData['dist-tags']?.latest;\n      if (!latest) {\n        throw new Error(`Package ${packageName} not found or has no latest version tag`);\n      }\n      return latest;\n    } catch (onlineError: any) {\n      this.logger.warn(\n        `Failed to fetch latest version for ${packageName} from registry: ${onlineError?.message || onlineError}`\n      );\n\n      const installedVersions = await this.getInstalledVersions(packageName);\n      if (installedVersions.length === 0) {\n        throw new Error(\n          `Failed to resolve latest version for ${packageName} from registry (${onlineError?.message || onlineError}). ` +\n          `No installed versions found in cache (${this.cachePath}).`\n        );\n      }\n\n      const latestInstalled = installedVersions[0];\n      this.logger.warn(`Using latest installed version for ${packageName}: ${latestInstalled}`);\n      return latestInstalled;\n    }\n  }\n\n  public async toPackageObject(packageId: string | FhirPackageIdentifier): Promise<FhirPackageIdentifier> {\n    let packageVersion: string;\n    let packageName: string;\n    if (typeof packageId === 'string') {\n      const packageIdStr = packageId.trim();\n      if (packageIdStr.length === 0) {\n        throw new Error('Invalid package identifier: empty string');\n      }\n      packageName = packageIdStr.split('#')[0].split('@')[0];\n      packageVersion = this.getVersionFromPackageString(packageIdStr);\n    } else {\n      packageName = packageId.id;\n      packageVersion = packageId.version || 'latest';\n    }\n    if (packageVersion === 'latest') {\n      if (this.isRegistryDisabled()) {\n        throw new Error(this.formatRegistryDisabledMessage(\n          `Cannot use the \"latest\" version feature for ${packageName}. Pin an explicit version (e.g., ${packageName}@x.y.z).`\n        ));\n      }\n      packageVersion = await this.checkLatestPackageDist(packageName);\n    }\n    return { id: packageName, version: packageVersion };\n  }\n\n  private getImplicitEffectiveCacheKey(packageId: string): string {\n    return `implicit-effective|${this.registryUrl}|${this.cachePath}|${packageId}`;\n  }\n\n  private getImplicitPlanningCacheKeys(packageId: string): string[] {\n    return [\n      this.getImplicitEffectiveCacheKey(packageId),\n      this.getImplicitEffectiveCacheKey(`${packageId}|planning`),\n    ];\n  }\n\n  private async readManifestFile(packageFolder: string): Promise<PackageManifest> {\n    const manifestPath = path.join(packageFolder, 'package.json');\n    return await fs.readJSON(manifestPath, { encoding: 'utf8' });\n  }\n\n  private async waitForManifestDuringActiveInstall(\n    packageObject: FhirPackageIdentifier,\n    packageFolder: string\n  ): Promise<PackageManifest | null> {\n    const deadline = Date.now() + Math.max(this.requestTimeoutMs, 250);\n\n    while (Date.now() < deadline) {\n      try {\n        return await this.readManifestFile(packageFolder);\n      } catch (err: any) {\n        const code = err?.code;\n        if (code !== 'ENOENT' && code !== 'ENOTDIR') {\n          throw err;\n        }\n      }\n\n      if (!await this.isPackageInstallLockHeld(packageObject)) {\n        break;\n      }\n\n      await new Promise((resolve) => setTimeout(resolve, 50));\n    }\n\n    try {\n      return await this.readManifestFile(packageFolder);\n    } catch (err: any) {\n      const code = err?.code;\n      if (code === 'ENOENT' || code === 'ENOTDIR') {\n        return null;\n      }\n      throw err;\n    }\n  }\n\n  public async getManifest(packageId: string | FhirPackageIdentifier): Promise<PackageManifest> {\n    const packageObj = typeof packageId === 'string' \n      ? await this.toPackageObject(packageId)\n      : packageId;\n\n    const packageDir = await this.getPackageDirPath(packageObj);\n    const packageFolder = path.join(packageDir, 'package');\n    try {\n      return await this.readManifestFile(packageFolder);\n    } catch (err: any) {\n      const code = err?.code;\n      if (code === 'ENOENT' || code === 'ENOTDIR') {\n        if (await this.isPackageInstallLockHeld(packageObj)) {\n          const manifest = await this.waitForManifestDuringActiveInstall(packageObj, packageFolder);\n          if (manifest) {\n            return manifest;\n          }\n        }\n\n        if (IMPLICIT_PACKAGE_IDS.has(packageObj.id)) {\n          for (const cacheKey of this.getImplicitPlanningCacheKeys(packageObj.id)) {\n            const implicitFailure = implicitResolutionFailureCache.get(cacheKey);\n            if (implicitFailure) throw implicitFailure;\n          }\n        }\n\n        const expected = path.join(packageFolder, 'package.json');\n        throw new Error(\n          `Could not find package manifest for ${packageObj.id}@${packageObj.version} in cachePath=${this.cachePath} ` +\n          `(expected ${expected}).`\n        );\n      }\n      throw err;\n    }\n  }\n\n  /**\n   * Get the path to the FHIR package cache directory.\n   * This directory is used to store downloaded and extracted FHIR packages.\n   * If the directory does not exist, it will be created.\n   * @returns {string} The path to the FHIR package cache directory\n   */\n  public getCachePath(): string {\n    return this.cachePath;\n  }\n\n  /**\n   * Get the logger instance used by this FhirPackageInstaller.\n  */\n\n  public getLogger(): Logger {\n    return this.logger;\n  }\n\n  /**\n   * Scan cache directory for installed versions of a package\n   * @param packageName Package name to search for\n   * @returns Array of installed versions sorted in descending order (latest first)\n   */\n  private async getInstalledVersions(packageName: string): Promise<string[]> {\n    try {\n      const cacheDirs = await fs.readdir(this.cachePath);\n      const versions: string[] = [];\n      \n      for (const dirName of cacheDirs) {\n        if (dirName.startsWith(`${packageName}#`)) {\n          const version = dirName.substring(packageName.length + 1);\n          versions.push(version);\n        }\n      }\n      \n      // Sort versions in descending order (latest first) using semver\n      return versions.sort((a, b) => semver.rcompare(a, b));\n    } catch (e) {\n      this.logger.warn(`Failed to scan cache for package ${packageName}: ${e}`);\n      return [];\n    }\n  }\n\n  /**\n   * Resolve an implicit package dependency to an effective version that is installed and manifest-valid.\n   *\n   * This is the materializing resolver used by code paths that need a real readable package entry,\n   * not just a plannable version candidate.\n   */\n  protected async resolveImplicitPackageVersionWithFallbacks(packageName: string): Promise<string> {\n    const cacheKey = this.getImplicitEffectiveCacheKey(packageName);\n    const cachedFailure = implicitResolutionFailureCache.get(cacheKey);\n    if (cachedFailure) throw cachedFailure;\n\n    const cached = implicitEffectiveVersionCache.get(cacheKey);\n    if (cached) {\n      const ok = await this.hasReadableManifest({ id: packageName, version: cached });\n      if (ok) return cached;\n      implicitEffectiveVersionCache.delete(cacheKey);\n    }\n\n    return await withSingleFlight(inFlightImplicitEffectiveVersion, cacheKey, async () => {\n      const cachedFailure2 = implicitResolutionFailureCache.get(cacheKey);\n      if (cachedFailure2) throw cachedFailure2;\n\n      const cached2 = implicitEffectiveVersionCache.get(cacheKey);\n      if (cached2) {\n        const ok = await this.hasReadableManifest({ id: packageName, version: cached2 });\n        if (ok) return cached2;\n        implicitEffectiveVersionCache.delete(cacheKey);\n      }\n\n      try {\n        const resolveFromInstalled = async (\n          detail: string,\n          previousAttempts?: { attemptedVersions: string[]; causes: string[] }\n        ): Promise<string> => {\n          this.logger.warn?.(detail);\n          const installedVersions = await this.getInstalledVersions(packageName);\n          const attempted = [...(previousAttempts?.attemptedVersions ?? [])];\n          const causes = [...(previousAttempts?.causes ?? [])];\n          for (const version of installedVersions) {\n            if (!attempted.includes(version)) {\n              attempted.push(version);\n            }\n            try {\n              const ok = await this.hasReadableManifest({ id: packageName, version });\n              if (ok) {\n                implicitResolutionFailureCache.delete(cacheKey);\n                implicitEffectiveVersionCache.set(cacheKey, version, this.registryTtlMs);\n                return version;\n              }\n            } catch (error: any) {\n              causes.push(`${version}: ${error?.message || String(error)}`);\n            }\n          }\n\n          if (installedVersions.length === 0) {\n            causes.push('No installed versions available for fallback.');\n          }\n\n          throw new ImplicitPackageResolutionError({\n            packageId: packageName,\n            attemptedVersions: attempted,\n            registryUrl: this.registryUrl,\n            cachePath: this.cachePath,\n            causes,\n          });\n        };\n\n        if (this.isRegistryDisabled()) {\n          return await resolveFromInstalled(\n            `Registry disabled; using latest installed version for implicit package ${packageName} (if available)`\n          );\n        }\n\n        let candidates: string[] = [];\n        try {\n          const packageData = await this.getPackageDataFromRegistry(packageName);\n          const latest = packageData['dist-tags']?.latest as string | undefined;\n          const versionsObj = (packageData.versions || {}) as Record<string, any>;\n          const allVersions = Object.keys(versionsObj)\n            .filter((version) => typeof version === 'string' && semver.valid(version))\n            .sort((a, b) => semver.rcompare(a, b));\n\n          const unique: string[] = [];\n          const pushUnique = (version: string | undefined) => {\n            if (!version || typeof version !== 'string') return;\n            if (!unique.includes(version)) unique.push(version);\n          };\n\n          pushUnique(latest);\n          for (const version of allVersions) {\n            pushUnique(version);\n            if (unique.length >= 3) break;\n          }\n          candidates = unique;\n        } catch (error: any) {\n          return await resolveFromInstalled(\n            `Failed to fetch registry metadata for implicit package ${packageName}: ${error?.message || String(error)}. ` +\n            'Falling back to latest installed version (if available).'\n          );\n        }\n\n        const attemptedVersions: string[] = [];\n        const causes: string[] = [];\n\n        for (const version of candidates) {\n          attemptedVersions.push(version);\n          const packageObject = { id: packageName, version };\n\n          try {\n            const alreadyOk = await this.hasReadableManifest(packageObject);\n            if (alreadyOk) {\n              implicitResolutionFailureCache.delete(cacheKey);\n              implicitEffectiveVersionCache.set(cacheKey, version, this.registryTtlMs);\n              return version;\n            }\n\n            await this.install(packageObject);\n            const okAfterInstall = await this.isStrictlyMaterialized(packageObject);\n            if (okAfterInstall) {\n              implicitResolutionFailureCache.delete(cacheKey);\n              implicitEffectiveVersionCache.set(cacheKey, version, this.registryTtlMs);\n              return version;\n            }\n            causes.push(`${version}: install completed but manifest missing`);\n          } catch (error: any) {\n            try {\n              const materializedAfterFailure = await this.isStrictlyMaterialized(packageObject);\n              if (materializedAfterFailure) {\n                implicitResolutionFailureCache.delete(cacheKey);\n                implicitEffectiveVersionCache.set(cacheKey, version, this.registryTtlMs);\n                return version;\n              }\n            } catch {\n              // Fall through and record the original failure.\n            }\n            causes.push(`${version}: ${error?.message || String(error)}`);\n          }\n        }\n\n        return await resolveFromInstalled(\n          `Failed to materialize implicit package ${packageName} from registry candidates. ` +\n          'Falling back to latest installed version (if available).',\n          { attemptedVersions, causes }\n        );\n      } catch (error: any) {\n        if (error instanceof ImplicitPackageResolutionError) {\n          implicitResolutionFailureCache.set(cacheKey, error, this.registryTtlMs);\n        }\n        throw error;\n      }\n    });\n  }\n\n  private async resolveImplicitPackageVersionForPlanning(packageName: string): Promise<string> {\n    const cacheKey = this.getImplicitEffectiveCacheKey(`${packageName}|planning`);\n    const cachedFailure = implicitResolutionFailureCache.get(cacheKey);\n    if (cachedFailure) throw cachedFailure;\n\n    const hasUsablePlanningVersion = async (version: string): Promise<boolean> => {\n      const packageObject = { id: packageName, version };\n      if (await this.hasReadableManifest(packageObject)) {\n        return true;\n      }\n      if (this.isRegistryDisabled()) {\n        return false;\n      }\n      try {\n        await this.getOrDownloadDiskCachedTarball(packageObject);\n        return true;\n      } catch {\n        return false;\n      }\n    };\n\n    const cached = implicitEffectiveVersionCache.get(cacheKey);\n    if (cached) {\n      if (await hasUsablePlanningVersion(cached)) {\n        return cached;\n      }\n      implicitEffectiveVersionCache.delete(cacheKey);\n    }\n\n    return await withSingleFlight(inFlightImplicitEffectiveVersion, cacheKey, async () => {\n      const cachedFailure2 = implicitResolutionFailureCache.get(cacheKey);\n      if (cachedFailure2) throw cachedFailure2;\n\n      const cached2 = implicitEffectiveVersionCache.get(cacheKey);\n      if (cached2) {\n        if (await hasUsablePlanningVersion(cached2)) {\n          return cached2;\n        }\n        implicitEffectiveVersionCache.delete(cacheKey);\n      }\n\n      const resolveFromInstalled = async (\n        detail: string,\n        previousAttempts?: { attemptedVersions: string[]; causes: string[] }\n      ): Promise<string> => {\n        this.logger.warn?.(detail);\n        const installedVersions = await this.getInstalledVersions(packageName);\n        const attempted = [...(previousAttempts?.attemptedVersions ?? [])];\n        const causes = [...(previousAttempts?.causes ?? [])];\n\n        for (const version of installedVersions) {\n          if (!attempted.includes(version)) {\n            attempted.push(version);\n          }\n\n          try {\n            if (await this.hasReadableManifest({ id: packageName, version })) {\n              implicitResolutionFailureCache.delete(cacheKey);\n              implicitEffectiveVersionCache.set(cacheKey, version, this.registryTtlMs);\n              return version;\n            }\n            causes.push(`${version}: installed manifest missing`);\n          } catch (error: any) {\n            causes.push(`${version}: ${error?.message || String(error)}`);\n          }\n        }\n\n        const failure = new ImplicitPackageResolutionError({\n          packageId: packageName,\n          attemptedVersions: attempted,\n          registryUrl: this.registryUrl,\n          cachePath: this.cachePath,\n          causes: causes.length > 0\n            ? causes\n            : ['No installed versions available for planning fallback.']\n        });\n        implicitResolutionFailureCache.set(cacheKey, failure, this.registryTtlMs);\n        throw failure;\n      };\n\n      if (this.isRegistryDisabled()) {\n        return await resolveFromInstalled(\n          `Registry disabled; using latest installed version for implicit package ${packageName} during dependency planning (if available)`\n        );\n      }\n\n      let candidates: string[] = [];\n      try {\n        const packageData = await this.getPackageDataFromRegistry(packageName);\n        const latest = packageData['dist-tags']?.latest as string | undefined;\n        const versionsObj = (packageData.versions || {}) as Record<string, any>;\n        const allVersions = Object.keys(versionsObj)\n          .filter((v) => typeof v === 'string' && semver.valid(v))\n          .sort((a, b) => semver.rcompare(a, b));\n\n        const unique: string[] = [];\n        const pushUnique = (v: string | undefined) => {\n          if (!v || typeof v !== 'string') return;\n          if (!unique.includes(v)) unique.push(v);\n        };\n\n        pushUnique(latest);\n        for (const v of allVersions) {\n          pushUnique(v);\n          if (unique.length >= 3) break;\n        }\n        candidates = unique;\n      } catch (e: any) {\n        return await resolveFromInstalled(\n          `Failed to fetch registry metadata for implicit package ${packageName} during dependency planning: ${e?.message || String(e)}. ` +\n          'Falling back to latest installed version (if available).'\n        );\n      }\n\n      const attemptedVersions: string[] = [];\n      const causes: string[] = [];\n\n      for (const version of candidates) {\n        attemptedVersions.push(version);\n        const pkgObj = { id: packageName, version };\n\n        try {\n          const alreadyOk = await this.hasReadableManifest(pkgObj);\n          if (alreadyOk) {\n            implicitResolutionFailureCache.delete(cacheKey);\n            implicitEffectiveVersionCache.set(cacheKey, version, this.registryTtlMs);\n            return version;\n          }\n\n          await this.getOrDownloadDiskCachedTarball(pkgObj);\n          implicitResolutionFailureCache.delete(cacheKey);\n          implicitEffectiveVersionCache.set(cacheKey, version, this.registryTtlMs);\n          return version;\n        } catch (e: any) {\n          causes.push(`${version}: ${e?.message || String(e)}`);\n        }\n      }\n\n      return await resolveFromInstalled(\n        `Failed to resolve planning candidates for implicit package ${packageName}. ` +\n        'Falling back to latest installed version (if available).',\n        { attemptedVersions, causes }\n      );\n    });\n  }\n\n  /**\n   * Get implicit dependencies for a given package\n   * @param packageObject The package to check for implicit dependencies\n   * @returns Promise resolving to record of implicit dependencies\n   */\n  private async getImplicitDependencies(\n    packageObject: FhirPackageIdentifier,\n    explicitImplicitVersions?: ReadonlyMap<string, string>\n  ): Promise<Record<string, string>> {\n    const implicitDeps: Record<string, string> = {};\n    \n    // Prevent recursion - if we're already resolving implicit deps for this package, return empty\n    const packageKey = `${packageObject.id}@${packageObject.version}`;\n    if (this.resolvingImplicitDeps.has(packageKey)) {\n      return implicitDeps;\n    }\n    \n    // Check if this package triggers implicit dependencies\n    const implicitPackageIds = IMPLICIT_DEPENDENCIES_MAP[packageObject.id];\n    if (!implicitPackageIds || implicitPackageIds.length === 0) {\n      return implicitDeps;\n    }\n    \n    // Mark this package as being resolved to prevent recursion\n    this.resolvingImplicitDeps.add(packageKey);\n    \n    try {\n      // Resolve versions for each implicit dependency without side-effectful installs.\n      // When the surrounding graph already selected explicit versions for implicit packages,\n      // those pins win over the implicit latest-version fallback.\n      for (const implicitPackageId of implicitPackageIds) {\n        const explicitVersion = explicitImplicitVersions?.get(implicitPackageId);\n        implicitDeps[implicitPackageId] = explicitVersion\n          ?? await this.resolveImplicitPackageVersionForPlanning(implicitPackageId);\n      }\n    } finally {\n      // Always remove from tracking set\n      this.resolvingImplicitDeps.delete(packageKey);\n    }\n    \n    return implicitDeps;\n  }\n\n  /**\n   * Get explicit dependencies from package.json only (internal use)\n   * @param packageObject The package to get explicit dependencies for\n   * @returns Promise resolving to record of explicit dependencies only\n   */\n  private async getExplicitDependencies(packageObject: FhirPackageIdentifier): Promise<Record<string, string>> {\n    const deps = (await this.getManifest(packageObject))?.dependencies || {};\n    return this.normalizeDependencies(deps);\n  }\n\n  private async getExplicitDependenciesFromTarballManifest(packageObject: FhirPackageIdentifier): Promise<Record<string, string>> {\n    if (this.isRegistryDisabled()) {\n      return {};\n    }\n\n    try {\n      const tgzPath = await this.getOrDownloadDiskCachedTarball(packageObject);\n      const extract = tar.extract();\n      let manifest: PackageManifest | null = null;\n\n      extract.on('entry', (header, stream, next) => {\n        const entryName = header.name.replace(/\\\\/g, '/');\n        const isManifest = entryName === 'package/package.json' || entryName === 'package.json';\n        if (!isManifest || manifest) {\n          stream.on('end', next);\n          stream.resume();\n          return;\n        }\n\n        const chunks: Buffer[] = [];\n        stream.on('data', (chunk) => {\n          chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n        });\n        stream.on('end', () => {\n          try {\n            manifest = JSON.parse(Buffer.concat(chunks).toString('utf8')) as PackageManifest;\n            next();\n          } catch (error) {\n            extract.destroy(error as Error);\n          }\n        });\n        stream.resume();\n      });\n\n      await pipeline(fs.createReadStream(tgzPath), zlib.createGunzip(), extract);\n\n      const deps = (manifest as PackageManifest | null)?.dependencies;\n      if (!deps || typeof deps !== 'object') {\n        return {};\n      }\n\n      return this.normalizeDependencies(deps as Record<string, string>);\n    } catch (error) {\n      this.logger.debug?.(\n        `Failed to plan explicit dependencies for ${this.formatPackageForDebug(packageObject)} from tarball manifest: ${error instanceof Error ? error.message : String(error)}`\n      );\n      return {};\n    }\n  }\n\n  private async getExplicitDependenciesFromRegistryMetadata(packageObject: FhirPackageIdentifier): Promise<Record<string, string>> {\n    if (this.isRegistryDisabled()) {\n      return {};\n    }\n\n    const version = packageObject.version;\n    if (!version) {\n      return {};\n    }\n\n    try {\n      const packageData = await this.getPackageDataFromRegistry(packageObject.id);\n      const versionData = packageData?.versions?.[version];\n      const rawDeps = versionData?.dependencies;\n      if (!rawDeps || typeof rawDeps !== 'object') {\n        return {};\n      }\n\n      const deps = Object.fromEntries(\n        Object.entries(rawDeps).filter(([, version]) => typeof version === 'string')\n      ) as Record<string, string>;\n      return this.normalizeDependencies(deps);\n    } catch (error) {\n      this.logger.debug?.(\n        `Failed to plan explicit dependencies for ${this.formatPackageForDebug(packageObject)} from registry metadata: ${error instanceof Error ? error.message : String(error)}`\n      );\n      return {};\n    }\n  }\n\n  private async getExplicitDependenciesForPlanning(packageObject: FhirPackageIdentifier): Promise<Record<string, string>> {\n    const hasManifest = await this.hasReadableManifest(packageObject).catch(() => false);\n    if (hasManifest) {\n      return await this.getExplicitDependencies(packageObject);\n    }\n\n    const registryDeps = await this.getExplicitDependenciesFromRegistryMetadata(packageObject);\n    if (Object.keys(registryDeps).length > 0) {\n      return registryDeps;\n    }\n\n    return await this.getExplicitDependenciesFromTarballManifest(packageObject);\n  }\n\n  private async getDependenciesForPlanning(\n    packageObject: FhirPackageIdentifier,\n    explicitImplicitVersions?: ReadonlyMap<string, string>\n  ): Promise<Record<string, string>> {\n    return await this.getDependencies(packageObject, {\n      explicitImplicitVersions,\n      includePlanningFallbacks: true,\n    });\n  }\n\n  private async collectExplicitDependencyClosure(root: FhirPackageIdentifier): Promise<{\n    closure: Map<string, FhirPackageIdentifier>;\n    explicitImplicitVersions: Map<string, string>;\n  }> {\n    const closure = new Map<string, FhirPackageIdentifier>();\n    const explicitImplicitVersions = new Map<string, string>();\n    const expanded = new Set<string>();\n    const queue: FhirPackageIdentifier[] = [root];\n\n    if (IMPLICIT_PACKAGE_IDS.has(root.id) && root.version) {\n      explicitImplicitVersions.set(root.id, root.version);\n    }\n\n    while (queue.length > 0) {\n      const current = queue.shift() as FhirPackageIdentifier;\n      const currentKey = this.getPackageKey(current);\n      if (expanded.has(currentKey)) {\n        continue;\n      }\n      expanded.add(currentKey);\n\n      const explicitDeps = await this.getExplicitDependenciesForPlanning(current);\n\n      for (const [depId, rawDepVersion] of Object.entries(explicitDeps)) {\n        if (this.skipExamples && depId.includes('examples')) {\n          continue;\n        }\n\n        let depVersion = rawDepVersion;\n        if (IMPLICIT_PACKAGE_IDS.has(depId)) {\n          const selectedVersion = explicitImplicitVersions.get(depId);\n          if (selectedVersion) {\n            depVersion = selectedVersion;\n          } else {\n            explicitImplicitVersions.set(depId, depVersion);\n          }\n        }\n\n        const dependency = { id: depId, version: depVersion };\n        const dependencyKey = this.getPackageKey(dependency);\n        if (!closure.has(dependencyKey)) {\n          closure.set(dependencyKey, dependency);\n        }\n        if (!expanded.has(dependencyKey)) {\n          queue.push(dependency);\n        }\n      }\n    }\n\n    return { closure, explicitImplicitVersions };\n  }\n\n  /**\n   * Get all dependencies for a package, including both explicit dependencies from package.json \n   * and automatic implicit dependencies for core FHIR packages.\n   * \n   * For core FHIR packages (hl7.fhir.r3.core, hl7.fhir.r4.core, hl7.fhir.r5.core), \n   * this automatically includes essential terminology and extension packages.\n   * \n   * @param packageObject The package to get dependencies for\n   * @param options Optional root/context information for graph-aware implicit package version selection\n   * @returns Promise resolving to record of all dependencies (explicit + implicit)\n   */\n  public async getDependencies(\n    packageObject: FhirPackageIdentifier,\n    options?: GetDependenciesOptions\n  ): Promise<Record<string, string>> {\n    const includePlanningFallbacks = options?.includePlanningFallbacks\n      ?? Boolean(options?.rootPackage);\n\n    let explicitImplicitVersions = options?.explicitImplicitVersions;\n    if (!explicitImplicitVersions && options?.rootPackage) {\n      const rootPackage = typeof options.rootPackage === 'string'\n        ? await this.toPackageObject(options.rootPackage)\n        : options.rootPackage;\n      const context = await this.collectExplicitDependencyClosure(rootPackage);\n      explicitImplicitVersions = context.explicitImplicitVersions;\n    }\n\n    const explicitDeps = includePlanningFallbacks\n      ? await this.getExplicitDependenciesForPlanning(packageObject)\n      : await this.getExplicitDependencies(packageObject);\n\n    const normalizedExplicitDeps = Object.fromEntries(\n      Object.entries(explicitDeps).map(([depId, depVersion]) => {\n        const selectedVersion = explicitImplicitVersions?.get(depId);\n        return [depId, selectedVersion ?? depVersion];\n      })\n    ) as Record<string, string>;\n\n    const implicitDeps = await this.getImplicitDependencies(packageObject, explicitImplicitVersions);\n\n    return { ...implicitDeps, ...normalizedExplicitDeps };\n  }\n\n  public async install(packageId: string | FhirPackageIdentifier): Promise<boolean> {\n    let packageObject: FhirPackageIdentifier;\n    if (typeof packageId === 'string') {\n      packageId = packageId.trim();\n      if (packageId.length === 0) {\n        throw new Error('Invalid package identifier: empty string');\n      }\n      packageObject = await this.toPackageObject(packageId);\n    } else {\n      packageObject = packageId;\n    }\n\n    // Registry disabled mode: never attempt downloads.\n    // All required packages (including transitive + implicit deps) must already exist.\n    if (this.isRegistryDisabled()) {\n      const missing = await this.collectMissingPackages(packageObject, { requireStrictMaterialization: true });\n      if (missing.length > 0) {\n        const preview = missing.slice(0, 10).join(', ');\n        const suffix = missing.length > 10 ? ` (and ${missing.length - 10} more)` : '';\n        throw new Error(this.formatRegistryDisabledMessage(\n          `Required packages are missing or incomplete in cache (${this.cachePath}). Missing: ${preview}${suffix}`\n        ));\n      }\n      return true;\n    }\n    \n    // Prevent circular installations\n    const packageKey = `${packageObject.id}@${packageObject.version}`;\n    if (this.installingPackages.has(packageKey)) {\n      return true;\n    }\n\n    return await this.withInstallParticipant(packageObject, async () => {\n      return await this.withDebugTiming(\n        `install ${this.formatPackageForDebug(packageObject)}`,\n        async () => {\n          await this.withPackageInstallLock(packageObject, async () => {\n            return await this.materializePackageWithoutDependencies(packageObject);\n          });\n\n          this.installingPackages.add(packageKey);\n          try {\n            await this.installPackageDependencies(packageObject);\n            return true;\n          } finally {\n            this.installingPackages.delete(packageKey);\n          }\n        }\n      );\n    });\n  }\n\n  private async materializePackageWithoutDependencies(packageObject: FhirPackageIdentifier): Promise<boolean> {\n    return await this.withDebugTiming(\n      `materialize-package-without-dependencies ${this.formatPackageForDebug(packageObject)}`,\n      async () => {\n        const installedShallow = await this.isStrictlyMaterialized(packageObject);\n        if (installedShallow) {\n          this.logger.debug?.(\n            `Package ${this.formatPackageForDebug(packageObject)} was materialized while waiting for the package install lock; skipping download and using the shared cache entry.`\n          );\n          return false;\n        }\n\n        const dirPath = await this.getPackageDirPath(packageObject);\n        if (await fs.exists(dirPath)) {\n          await fs.remove(dirPath);\n        }\n\n        const tempPath = await this.downloadAndExtractTarball(packageObject);\n        await this.cachePackage(packageObject, tempPath);\n        return true;\n      },\n      (downloaded) => `downloaded=${downloaded}`\n    );\n  }\n\n  private async installPackageDependencies(packageObject: FhirPackageIdentifier): Promise<void>{\n    await this.withDebugTiming(\n      `install-package-dependencies ${this.formatPackageForDebug(packageObject)}`,\n      async () => {\n        try {\n          await this.getPackageIndexFile(packageObject);\n        } catch (e: any) {\n          if (e instanceof FhirPackageInstallError) throw e;\n          throw new FhirPackageInstallError({\n            packageId: packageObject.id,\n            version: packageObject.version ?? 'unknown',\n            registryUrl: this.registryUrl,\n            cachePath: this.cachePath,\n            step: 'generate-index',\n            cause: e,\n          });\n        }\n\n        const { explicitImplicitVersions } = await this.collectExplicitDependencyClosure(packageObject);\n        const dependencyQueue = await this.collectPlannedDependencyClosure(packageObject, explicitImplicitVersions);\n        if (dependencyQueue.size === 0) {\n          return;\n        }\n\n        this.logger.debug?.(\n          `Planned dependency closure for ${this.formatPackageForDebug(packageObject)} with ${dependencyQueue.size} package(s).`\n        );\n\n        const completedLocally = new Set<string>();\n        const claimedElsewhere = new Set<string>();\n        let lastWaitLogAt = 0;\n\n        while (true) {\n          const pending: FhirPackageIdentifier[] = [];\n\n          for (const [dependencyKey, dependency] of dependencyQueue) {\n            const installed = completedLocally.has(dependencyKey)\n              || await this.isStrictlyMaterialized(dependency)\n              || (claimedElsewhere.has(dependencyKey) && await this.isStrictlyMaterialized(dependency));\n            if (installed) {\n              continue;\n            }\n\n            pending.push(dependency);\n          }\n\n          if (pending.length === 0) {\n            return;\n          }\n\n          let claimedWork = false;\n          let claimedDependencyKey: string | null = null;\n          for (const dependency of pending) {\n            const dependencyKey = this.getPackageKey(dependency);\n\n            if (await this.isStrictlyMaterialized(dependency)) {\n              claimedElsewhere.delete(dependencyKey);\n              completedLocally.add(dependencyKey);\n              continue;\n            }\n\n            const claim = await this.tryWithPackageInstallLock(dependency, async () => {\n              return await this.materializePackageWithoutDependencies(dependency);\n            });\n\n            if (!claim.acquired) {\n              claimedElsewhere.add(dependencyKey);\n              continue;\n            }\n\n            claimedElsewhere.delete(dependencyKey);\n\n            if (!claim.result) {\n              completedLocally.add(dependencyKey);\n              continue;\n            }\n\n            completedLocally.add(dependencyKey);\n            this.logger.debug?.(\n              `Claimed dependency work item ${this.formatPackageForDebug(dependency)} while installing ${this.formatPackageForDebug(packageObject)}.`\n            );\n            claimedDependencyKey = dependencyKey;\n            claimedWork = true;\n            break;\n          }\n\n          if (claimedWork) {\n            if (pending.length > 1 && claimedDependencyKey) {\n              const remainingPending = pending.filter(\n                (dependency) => this.getPackageKey(dependency) !== claimedDependencyKey\n              );\n              await this.waitForPeerDependencyHandoff(packageObject, remainingPending);\n            }\n            if (pending.length > 1) {\n              await new Promise((resolve) => setTimeout(resolve, DEPENDENCY_POST_CLAIM_YIELD_MS));\n            }\n            continue;\n          }\n\n          const now = Date.now();\n          if (now - lastWaitLogAt >= DEPENDENCY_WAIT_LOG_INTERVAL_MS) {\n            const preview = pending.slice(0, 5).map((dependency) => this.formatPackageForDebug(dependency)).join(', ');\n            const suffix = pending.length > 5 ? `, ... (${pending.length - 5} more)` : '';\n            this.logger.debug?.(\n              `No immediately claimable dependency work items for ${this.formatPackageForDebug(packageObject)}; waiting ${DEPENDENCY_CLAIM_WAIT_MS}ms before retrying. Pending: ${preview}${suffix}`\n            );\n            lastWaitLogAt = now;\n          }\n\n          await new Promise((resolve) => setTimeout(resolve, DEPENDENCY_CLAIM_WAIT_MS));\n        }\n      }\n    );\n  }\n\n  /**\n   * Installs a package from a local file or directory.\n   * The package can be a tarball file or a directory containing the package files.\n   * @param src The path to the local package file or directory.\n   * @param options Options for installing the package.\n   * @returns A promise that resolves to true if the package was installed successfully,\n   * or false if it was already installed.\n   */\n  public async installLocalPackage(src: string, options?: InstallPackageOptions): Promise<boolean> {\n    src = src.trim();\n    if (src.length === 0) {\n      throw new Error('Invalid path: empty string');\n    }\n    if (!await fs.exists(src)) {\n      throw new Error(`Invalid path: ${src} does not exist`);\n    }\n\n    const fullPath = path.isAbsolute(src) ? src : path.resolve(src);\n    const isDirectory = (await fs.lstat(fullPath)).isDirectory();\n    let finalPath: string;\n\n    if (isDirectory) {\n      this.logger.info(`Installing package from directory: ${fullPath}`);\n      finalPath = fullPath;\n    } else {\n      this.logger.info(`Installing package from file: ${fullPath}`);\n      finalPath = await this.extractTarball(fullPath, { packageLabel: path.basename(fullPath) });\n    }\n  \n    let packageObject: FhirPackageIdentifier;\n    if (options?.packageId) {\n      packageObject = await this.toPackageObject(options.packageId);\n    } else {\n      const potentialPackagePath = path.join(finalPath, 'package');\n      const manifestFilePath = await fs.exists(potentialPackagePath) ? potentialPackagePath : finalPath;\n      const manifest = await this.readManifestFile(manifestFilePath);\n      packageObject = { id: manifest.name, version: manifest.version };\n    }\n\n    return await this.withPackageInstallLock(packageObject, async () => {\n      const alreadyInstalled = await this.isStrictlyMaterialized(packageObject);\n      if (alreadyInstalled && !options?.override) {\n        this.logger.info(`Package ${packageObject.id}@${packageObject.version} is already installed`);\n        return false;\n      }\n\n      await fs.remove(await this.getPackageDirPath(packageObject));\n\n      await this.cachePackage(packageObject, finalPath, !isDirectory); // if the source is a file, we can move the temp dir to the cache\n\n      if (options?.installDependencies) {\n        await this.installPackageDependencies(packageObject);\n      }\n\n      return true;\n    });\n  }\n\n  /**\n   * Downloads a package tarball and optionally extracts it to a destination directory.\n   * \n   * Behavior:\n   * - If `extract` is false or omitted: downloads the tarball as a .tgz file to the destination directory.\n   * - If `extract` is true: downloads and extracts the package into a subdirectory of the destination path.\n   *\n   * @param packageId A package identifier string or a FhirPackageIdentifier object.\n   * @param options Options controlling the download and extraction behavior.\n   * @returns \n   * - If `extract` is false: the full path to the downloaded tarball file.\n   * - If `extract` is true: the full path to the extracted package directory.\n   */\n  public async downloadPackage(\n    packageId: string | FhirPackageIdentifier,\n    options?: DownloadPackageOptions): Promise<string> \n  {\n    const { destination = '.', overwrite = false, extract = false } = options || {} as DownloadPackageOptions;\n\n    const packageObject = await this.toPackageObject(packageId);\n    const packageName = `${packageObject.id}@${packageObject.version}`;\n    \n    let finalPath = destination && path.isAbsolute(destination)\n      ? destination\n      : path.join(path.resolve(destination ||'.'));\n    if (extract) {\n      finalPath = path.join(finalPath, await this.toDirName(packageObject));\n    } else {\n      finalPath = path.join(finalPath, `${packageObject.id}-${packageObject.version}.tgz`);\n    }\n    this.logger.info(`Downloading ${(extract ? 'and extracting ' : '')}${packageName} to: ${finalPath}`);\n\n    if (extract) {\n      const tempDirectory = await this.downloadAndExtractTarball(packageObject);\n      await fs.move(tempDirectory, finalPath, { overwrite });\n    } else {\n      const tempDirectory = await this.downloadTarball(packageObject);\n      await fs.move(tempDirectory, finalPath, { overwrite });\n    }\n    this.logger.info(`Downloaded ${packageName} to: ${finalPath}`);\n    return finalPath;\n  }\n}\n\n/**\n * Default instance export for convenience\n */\nconst fpi = new FhirPackageInstaller();\nexport default fpi;\n\nexport type {\n  PackageResource,\n  DownloadPackageOptions,\n  InstallPackageOptions,\n  FpiConfig\n} from './types';\n\nexport type {\n  PackageIndex,\n  PackageManifest,\n  FileInPackageIndex\n} from '@outburn/types';\n\n","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\n\t\t// Clean up tail reference when queue becomes empty\n\t\tif (!this.#head) {\n\t\t\tthis.#tail = undefined;\n\t\t}\n\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tlet rejectOnClear = false;\n\n\tif (typeof concurrency === 'object') {\n\t\t({concurrency, rejectOnClear = false} = concurrency);\n\t}\n\n\tvalidateConcurrency(concurrency);\n\n\tif (typeof rejectOnClear !== 'boolean') {\n\t\tthrow new TypeError('Expected `rejectOnClear` to be a boolean');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\t// Process the next queued function if we're under the concurrency limit\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tactiveCount++;\n\t\t\tqueue.dequeue().run();\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\t// Execute the function and capture the result promise\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\t// Resolve immediately with the promise (don't wait for completion)\n\t\tresolve(result);\n\n\t\t// Wait for the function to complete (success or failure)\n\t\t// We catch errors here to prevent unhandled rejections,\n\t\t// but the original promise rejection is preserved for the caller\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\t// Decrement active count and process next queued function\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, reject, arguments_) => {\n\t\tconst queueItem = {reject};\n\n\t\t// Queue the internal resolve function instead of the run function\n\t\t// to preserve the asynchronous execution context.\n\t\tnew Promise(internalResolve => { // eslint-disable-line promise/param-names\n\t\t\tqueueItem.run = internalResolve;\n\t\t\tqueue.enqueue(queueItem);\n\t\t}).then(run.bind(undefined, function_, resolve, arguments_)); // eslint-disable-line promise/prefer-await-to-then\n\n\t\t// Start processing immediately if we haven't reached the concurrency limit\n\t\tif (activeCount < concurrency) {\n\t\t\tresumeNext();\n\t\t}\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise((resolve, reject) => {\n\t\tenqueue(function_, resolve, reject, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tif (!rejectOnClear) {\n\t\t\t\t\tqueue.clear();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst abortError = AbortSignal.abort().reason;\n\n\t\t\t\twhile (queue.size > 0) {\n\t\t\t\t\tqueue.dequeue().reject(abortError);\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\tmap: {\n\t\t\tasync value(iterable, function_) {\n\t\t\t\tconst promises = Array.from(iterable, (value, index) => this(function_, value, index));\n\t\t\t\treturn Promise.all(promises);\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, options) {\n\tconst limit = pLimit(options);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n"],"mappings":"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","names":["fs","os","path","semver","crypto","https","http","extract","causes","version"]}