{"version":3,"sources":["../node_modules/yocto-queue/index.js","../node_modules/p-limit/index.js","../src/index.ts"],"names":["fs","path","os","semver","crypto","https","http","finished","extract","tar","pipeline","zlib","causes"],"mappings":"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","file":"index.cjs","sourcesContent":["/*\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","/* 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 = (): string => {\n  registerTempCleanup();\n  const dir = fs.mkdtempSync(path.join(os.tmpdir(), '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})();\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\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  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>(lockKey: string, fn: () => Promise<T>): 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\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        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        }\n      } catch (e: any) {\n        if (e?.code !== 'EEXIST') {\n          // If locking fails for other reasons, don't break functionality.\n          return await fn();\n        }\n\n        // If the lock looks stale, attempt to break it.\n        try {\n          const stat = await fs.stat(lockPath);\n          if (Date.now() - stat.mtimeMs > staleMs) {\n            await fs.remove(lockPath).catch(() => undefined);\n            continue;\n          }\n        } catch {\n          // ignore\n        }\n\n        if (Date.now() - start > maxWaitMs) {\n          // Avoid deadlocks: proceed without the lock after waiting.\n          return await fn();\n        }\n\n        await new Promise((r) => setTimeout(r, 50 + Math.floor(Math.random() * 100)));\n      }\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 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 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 packageManifestExists(packageObject: FhirPackageIdentifier): Promise<boolean> {\n    const packageDir = await this.getPackageDirPath(packageObject);\n    return await fs.exists(path.join(packageDir, 'package', 'package.json'));\n  }\n\n  private async collectMissingPackages(root: FhirPackageIdentifier): Promise<string[]> {\n    const missing: string[] = [];\n    const visited = new Set<string>();\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 hasManifest = await this.packageManifestExists(pkg);\n      if (!hasManifest) {\n        missing.push(key);\n        return;\n      }\n\n      const deps = await this.getDependencies(pkg);\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 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    this.logger.debug?.(`Generating new .fpi.index.json file for package ${pckIdObj.id}@${pckIdObj.version}...`);\n    const packagePath = await this.getPackageDirPath(pckIdObj);\n    const indexPath = await this.getPackageIndexPath(pckIdObj);\n\n    // Layer 1: memory\n    const memKey = this.getIndexMemKey(pckIdObj);\n    const memHit = memGet<PackageIndex>(memKey);\n    if (memHit) {\n      await fs.writeJSON(indexPath, memHit);\n      return memHit;\n    }\n\n    // Cross-process: ensure only one process does the expensive scan per package version.\n    return await this.withDiskLock(this.getIndexDiskLockKey(pckIdObj), async () => {\n      // Re-check memory after acquiring the lock.\n      const memHit2 = memGet<PackageIndex>(memKey);\n      if (memHit2) {\n        await fs.writeJSON(indexPath, memHit2);\n        return memHit2;\n      }\n\n      // Layer 2: per-cachePath disk\n      const diskPath = this.getDiskIndexCachePath(pckIdObj);\n      const diskHit = await withSingleFlight(inFlightIndex, `disk-${memKey}`, async () => {\n        // Ensure parent exists lazily\n        await this.ensureDiskCacheSubdir('indexes');\n        return await this.readDiskCacheJson<PackageIndex>(diskPath);\n      });\n      if (diskHit) {\n        memSetNoTtl(memKey, diskHit);\n        await fs.writeJSON(indexPath, diskHit);\n        return diskHit;\n      }\n\n      const fileList = await fs.readdir(path.join(packagePath, 'package'));\n      const files = await Promise.all(\n        fileList.filter(\n          file => file.endsWith('.json') && file !== 'package.json' && !file.endsWith('.index.json')\n        ).map(\n          file => limit(\n            async () => {\n              const contentText = await fs.readFile(path.join(packagePath, 'package', file), { encoding: 'utf8' });\n              const content = JSON.parse(contentText) as PackageResource;\n              const indexEntry = extractResourceIndexEntry(file, content);\n              return indexEntry;\n            }\n          )\n        )\n      );\n      const indexJson: PackageIndex = {\n        'index-version': 2,\n        files\n      };\n      await fs.writeJSON(indexPath, indexJson);\n\n      // Persist to memory + per-cachePath disk (best-effort)\n      memSetNoTtl(memKey, indexJson);\n      try {\n        await this.ensureDiskCacheSubdir('indexes');\n        await this.writeDiskCacheJsonNoTtl(diskPath, indexJson);\n      } catch {\n        // ignore\n      }\n\n      return indexJson;\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(src: string | Readable, options?: { packageObject?: FhirPackageIdentifier }): Promise<string> {\n    const tarballStream: Readable = typeof src === 'string' ? fs.createReadStream(src) : src;\n\n    const pkgObj = options?.packageObject;\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 = createTempDir();\n    this.logger.debug?.(`Extracting package 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... 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      await pipeline(\n        tarballStream,\n        zlib.createGunzip(),\n        extract\n      );\n\n      await Promise.all(handleEntryPromises);\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    await fs.writeJSON(path.join(tempDirectory, 'package', '.fpi.index.json'), indexJson);\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      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      } catch {\n        // ignore\n      }\n    }\n  \n    this.logger.debug?.('Extracted to a temporary directory');\n    return tempDirectory;\n  }\n\n  private async downloadAndExtractTarball(packageObject: FhirPackageIdentifier): Promise<string> {\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   * 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    let finalPath = await this.getPackageDirPath(packageObject);\n    if (!await fs.exists(path.join(src, 'package'))) {\n      finalPath = path.join(finalPath, 'package');\n    }\n    const isInstalled = await this.isInstalled(packageObject, { deep: false });\n    if (!isInstalled) {\n      // try to move the temp dir to the cache, this will fail if pkg was already installed by a parallel process\n      try {\n        const action = move ? fs.move : fs.copy;\n        await action(src, finalPath, { overwrite: false });\n        this.logger.info(`Installed ${packageObject.id}@${packageObject.version} in the FHIR package cache: ${finalPath}`);\n      }\n      catch (e: any) {\n        // Another process may have installed the package concurrently.\n        if (e?.code === 'EEXIST') {\n          this.logger.warn(`Package ${packageObject.id}@${packageObject.version} already installed by another process`);\n          return finalPath;\n        }\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      }\n    }\n    return finalPath;\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 dirPath = await this.getPackageDirPath(packageObject);\n    if (!await fs.exists(dirPath)) {\n      return false;\n    }\n    if (!await this.packageManifestExists(packageObject)) {\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 indexPath = await this.getPackageIndexPath(packageId);\n    if (await fs.exists(indexPath)) {\n      return await fs.readJSON(indexPath, { encoding: 'utf8' });\n    }\n    return await this.generatePackageIndex(packageId);\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 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  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 (IMPLICIT_PACKAGE_IDS.has(packageObj.id)) {\n          const cacheKey = this.getImplicitEffectiveCacheKey(packageObj.id);\n          const implicitFailure = implicitResolutionFailureCache.get(cacheKey);\n          if (implicitFailure) throw implicitFailure;\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   * Candidate selection (online):\n   *  1) dist-tags.latest\n   *  2) next 2 most recent registry versions (semver desc)\n   *\n   * If the registry is disabled/unavailable, fall back to the latest installed, manifest-valid version.\n   */\n  private async resolveImplicitPackageVersionWithFallbacks(packageName: string): Promise<string> {\n    const cacheKey = this.getImplicitEffectiveCacheKey(packageName);\n    const cachedFailure = implicitResolutionFailureCache.get(cacheKey);\n    if (cachedFailure) throw cachedFailure;\n    const cached = implicitEffectiveVersionCache.get(cacheKey);\n    if (cached) {\n      const ok = await this.packageManifestExists({ 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      const cached2 = implicitEffectiveVersionCache.get(cacheKey);\n      if (cached2) {\n        const ok = await this.packageManifestExists({ id: packageName, version: cached2 });\n        if (ok) return cached2;\n        implicitEffectiveVersionCache.delete(cacheKey);\n      }\n\n      try {\n        const resolveFromInstalled = async (detail: string): Promise<string> => {\n          this.logger.warn?.(detail);\n          const installedVersions = await this.getInstalledVersions(packageName);\n          const attempted: string[] = [];\n          const causes: string[] = [];\n          for (const v of installedVersions) {\n            attempted.push(v);\n            try {\n              const ok = await this.isInstalled({ id: packageName, version: v }, { deep: false });\n              if (ok) {\n                implicitResolutionFailureCache.delete(cacheKey);\n                implicitEffectiveVersionCache.set(cacheKey, v, this.registryTtlMs);\n                return v;\n              }\n            } catch (e: any) {\n              causes.push(`${v}: ${e?.message || String(e)}`);\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        // Registry disabled mode: never attempt downloads.\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        // Online-first candidate gathering (using the existing cached registry metadata).\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          // Registry unavailable: use latest installed that is manifest-valid.\n          return await resolveFromInstalled(\n            `Failed to fetch registry metadata for implicit package ${packageName}: ${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        for (const version of candidates) {\n          attemptedVersions.push(version);\n          const pkgObj = { id: packageName, version };\n          try {\n            const alreadyOk = await this.isInstalled(pkgObj, { deep: false });\n            if (alreadyOk) {\n              implicitResolutionFailureCache.delete(cacheKey);\n              implicitEffectiveVersionCache.set(cacheKey, version, this.registryTtlMs);\n              return version;\n            }\n\n            await this.install(pkgObj);\n            const okAfterInstall = await this.isInstalled(pkgObj, { deep: false });\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 (e: any) {\n            causes.push(`${version}: ${e?.message || String(e)}`);\n          }\n        }\n\n        throw new ImplicitPackageResolutionError({\n          packageId: packageName,\n          attemptedVersions,\n          registryUrl: this.registryUrl,\n          cachePath: this.cachePath,\n          causes\n        });\n      } catch (e: any) {\n        if (e instanceof ImplicitPackageResolutionError) {\n          implicitResolutionFailureCache.set(cacheKey, e, this.registryTtlMs);\n        }\n        throw e;\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(packageObject: FhirPackageIdentifier): 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.\n      // If any implicit package can't be resolved (and isn't installed), we must fail startup.\n      for (const implicitPackageId of implicitPackageIds) {\n        const version = await this.resolveImplicitPackageVersionWithFallbacks(implicitPackageId);\n        implicitDeps[implicitPackageId] = version;\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    // special case: some packages refer to hl7.fhir.r4.core as version 4.0.0 instead of 4.0.1\n    if (deps && deps['hl7.fhir.r4.core'] === '4.0.0') {\n      deps['hl7.fhir.r4.core'] = '4.0.1';\n    }\n    return deps;\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   * @returns Promise resolving to record of all dependencies (explicit + implicit)\n   */\n  public async getDependencies(packageObject: FhirPackageIdentifier): Promise<Record<string, string>> {\n    // Get explicit dependencies from package.json\n    const explicitDeps = await this.getExplicitDependencies(packageObject);\n    \n    // Get implicit dependencies if this is a core package  \n    const implicitDeps = await this.getImplicitDependencies(packageObject);\n    \n    // Merge dependencies, with explicit taking precedence over implicit\n    return { ...implicitDeps, ...explicitDeps };\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);\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    // Only check that *this package* is present/complete.\n    // Transitive dependency installation is handled by installPackageDependencies().\n    const installedShallow = await this.isInstalled(packageObject, { deep: false });\n    if (!installedShallow) {\n      const dirPath = await this.getPackageDirPath(packageObject);\n      if (await fs.exists(dirPath)) {\n        // Clean up partial/corrupt installs so we can reinstall cleanly.\n        await fs.remove(dirPath);\n      }\n      const tempPath = await this.downloadAndExtractTarball(packageObject);\n      await this.cachePackage(packageObject, tempPath);\n    }\n    \n    // Mark as installing before dependency installation\n    this.installingPackages.add(packageKey);\n    try {\n      await this.installPackageDependencies(packageObject);\n      return true;\n    } finally {\n      // Always remove from installing set\n      this.installingPackages.delete(packageKey);\n    }\n  }\n\n  private async installPackageDependencies(packageObject: FhirPackageIdentifier): Promise<void>{\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    // Get all dependencies (explicit + implicit) using the updated getDependencies method\n    const allDeps = await this.getDependencies(packageObject);\n    \n    for (const dep in allDeps) {\n      if (this.skipExamples && dep.includes('examples')) {\n        continue;\n      } else {\n        await this.install(`${dep}@${allDeps[dep]}`);\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);\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    const alreadyInstalled = await this.isInstalled(packageObject, { deep: false });\n    if (alreadyInstalled && !options?.override) {\n      this.logger.info(`Package ${packageObject.id}@${packageObject.version} is already installed`);\n      return false;\n    } else {\n      await fs.remove(await this.getPackageDirPath(packageObject));\n    }\n\n    const installedPath = await this.cachePackage(packageObject, finalPath, !isDirectory); // if the source is a file, we can move the temp dir to the cache\n    await this.generatePackageIndex(packageObject);\n    this.logger.info(`Installed ${packageObject.id}@${packageObject.version} in the FHIR package cache: ${installedPath}`);\n  \n    if (options?.installDependencies) {\n      await this.installPackageDependencies(packageObject);\n    }\n\n    return true;\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"]}