{"version":3,"file":"vite.cjs","names":[],"sources":["../src/capability.ts","../src/plugin-access.ts","../src/plugin-inspector.ts","../src/vite.ts"],"sourcesContent":["// muon - Multi-platform GUI application framework that uses CEF as its backend\n// Copyright (c) Kouji Matsui. (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/muon\n\nimport { randomBytes } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\n\n/**\n * Import-side capability rule for muon plugin virtual modules.\n */\nexport interface MuonCapabilityImportOptions {\n  /**\n   * Importer path globs relative to the bundler project root.\n   */\n  sources?: readonly string[];\n  /**\n   * NPM package names allowed to import the virtual module.\n   */\n  packages?: readonly string[];\n  /**\n   * Plugin function path globs allowed for matching importers.\n   */\n  allow: readonly string[];\n  /**\n   * Plugin entry name that supplied this rule.\n   *\n   * @internal\n   */\n  pluginName?: string;\n}\n\n/**\n * Capability import configuration shared by bundler integrations.\n */\nexport interface MuonCapabilityOptions {\n  /**\n   * Capability imports allowed by importer path.\n   */\n  imports?: readonly MuonCapabilityImportOptions[];\n  /**\n   * Known public plugin function paths available for wildcard export expansion.\n   *\n   * @remarks Exact `imports[].allow` entries do not require this catalog.\n   * Wildcard entries are expanded against these paths only when generating\n   * virtual module named exports; runtime permission policies keep the original\n   * wildcard patterns.\n   */\n  functionPaths?: readonly string[];\n}\n\n/**\n * Runtime capability policy generated for muon-core.\n */\nexport interface MuonCapabilityRuntimeEntry {\n  /**\n   * Opaque capability id embedded into generated virtual modules.\n   */\n  id: string;\n  /**\n   * Plugin function path globs allowed for this capability.\n   */\n  allow: readonly string[];\n}\n\n/**\n * Runtime plugin entry generated for muon-core config overlays.\n */\nexport interface MuonRuntimePluginEntryConfig {\n  /**\n   * Plugin entry name.\n   */\n  name: string;\n  /**\n   * Optional 64-character hexadecimal SHA-256 digest of the final external\n   * `.so` or `.dll` file bytes followed by the decoded `salt` bytes.\n   *\n   * @remarks Calculate this after all library post-processing, including\n   * stripping and code signing. It is not supported for `internal`.\n   */\n  signature?: string;\n  /**\n   * Optional hex-encoded salt whose decoded bytes are appended when checking\n   * the plugin signature.\n   *\n   * @remarks Required when `signature` is specified. It is not supported for\n   * `internal`.\n   */\n  salt?: string;\n  /**\n   * Plugin-defined string key-value configuration entries.\n   */\n  config?: Readonly<Record<string, string>>;\n  /**\n   * Plugin function path globs allowed for this plugin entry.\n   */\n  allow: readonly string[];\n}\n\n/**\n * Runtime plugin configuration generated for validate mode.\n */\nexport interface MuonCapabilityRuntimePluginConfig {\n  /**\n   * Plugin exposure mode.\n   */\n  mode: \"validate\";\n  /**\n   * Plugin bridge page URL allowlist.\n   */\n  pages?: readonly string[];\n  /**\n   * External plugin path override.\n   */\n  path?: string;\n  /**\n   * Plugin loading allowlist override.\n   */\n  plugins?: readonly MuonRuntimePluginEntryConfig[];\n  /**\n   * Capability policies consumed by muon-core.\n   */\n  capabilities: readonly MuonCapabilityRuntimeEntry[];\n}\n\n/**\n * Runtime plugin configuration for simple window-global exposure.\n */\nexport interface MuonSimpleRuntimePluginConfig {\n  /**\n   * Plugin exposure mode.\n   */\n  mode: \"simple\";\n  /**\n   * Plugin bridge page URL allowlist.\n   */\n  pages?: readonly string[];\n  /**\n   * External plugin path override.\n   */\n  path?: string;\n  /**\n   * Plugin loading allowlist override.\n   */\n  plugins?: readonly MuonRuntimePluginEntryConfig[];\n}\n\n/**\n * Runtime plugin configuration generated by a build integration.\n */\nexport type MuonRuntimePluginConfig =\n  | MuonCapabilityRuntimePluginConfig\n  | MuonSimpleRuntimePluginConfig;\n\n/**\n * Resolved virtual module.\n */\nexport interface MuonResolvedCapabilityModule {\n  /**\n   * Bundler-internal virtual id.\n   */\n  id: string;\n}\n\n/**\n * Bundler-independent virtual module resolver.\n */\nexport interface MuonCapabilityModuleResolver {\n  /**\n   * Resolves a muon virtual module specifier for one importer.\n   */\n  resolveId: (\n    source: string,\n    importer: string | undefined,\n  ) => MuonResolvedCapabilityModule | undefined;\n  /**\n   * Loads the generated source for a resolved virtual module id.\n   */\n  load: (id: string) => string | undefined;\n  /**\n   * Returns runtime plugin config generated from all capability rules.\n   */\n  getRuntimePluginConfig: () => MuonCapabilityRuntimePluginConfig;\n}\n\ninterface ParsedCapabilitySpecifier {\n  moduleName: string;\n  namespace: string;\n}\n\ninterface ResolvedRule {\n  index: number;\n  id: string;\n  rule: MuonCapabilityImportOptions;\n  namespace: string;\n  moduleName: string;\n  functionPaths: readonly string[];\n}\n\nconst virtualModulePrefix = \"\\0muon-capability:\";\nconst capabilityIdByteLength = 16;\nconst moduleNamePattern =\n  /^[A-Za-z_$][A-Za-z0-9_$]*:[A-Za-z_$][A-Za-z0-9_$]*(?:\\.[A-Za-z_$][A-Za-z0-9_$]*)*$/u;\nconst jsIdentifierPattern = /^[A-Za-z_$][A-Za-z0-9_$]*$/u;\nconst defaultMuonCapabilityFunctionPaths = [\n  \"muon.browser.reload\",\n  \"muon.browser.hardReload\",\n  \"muon.browser.toggleFullscreen\",\n  \"muon.browser.enterFullscreen\",\n  \"muon.browser.exitFullscreen\",\n  \"muon.browser.zoomIn\",\n  \"muon.browser.zoomOut\",\n  \"muon.browser.resetZoom\",\n  \"muon.browser.show\",\n  \"muon.browser.hide\",\n  \"muon.browser.focus\",\n  \"muon.browser.blur\",\n  \"muon.browser.minimize\",\n  \"muon.browser.maximize\",\n  \"muon.browser.restore\",\n  \"muon.browser.setTitleBarVisibility\",\n  \"muon.browser.setTitleBarIcon\",\n  \"muon.browser.getWindowBounds\",\n  \"muon.browser.setWindowBounds\",\n  \"muon.browser.setContextMenuItems\",\n  \"muon.browser.clearContextMenuItems\",\n  \"muon.browser.createTray\",\n  \"muon.browser.setTrayMenu\",\n  \"muon.browser.setTrayIcon\",\n  \"muon.browser.setTrayTooltip\",\n  \"muon.browser.removeTray\",\n  \"muon.browser.close\",\n  \"muon.browser.shutdown\",\n  \"muon.browser.recycle\",\n  \"muon.environments.getVariables\",\n  \"muon.environments.getCommandLine\",\n  \"muon.environments.getProcessId\",\n  \"muon.environments.getRuntimeInfo\",\n  \"muon.environments.getAutostart\",\n  \"muon.environments.setAutostart\",\n  \"muon.executor.spawn\",\n  \"muon.executor.loadLibrary\",\n  \"muon.fs.readFile\",\n  \"muon.fs.writeFile\",\n  \"muon.fs.readTextFile\",\n  \"muon.fs.writeTextFile\",\n  \"muon.fs.stat\",\n  \"muon.fs.lstat\",\n  \"muon.fs.exists\",\n  \"muon.fs.access\",\n  \"muon.fs.readdir\",\n  \"muon.fs.mkdir\",\n  \"muon.fs.rm\",\n  \"muon.fs.unlink\",\n  \"muon.fs.rmdir\",\n  \"muon.fs.rename\",\n  \"muon.fs.copyFile\",\n  \"muon.fs.appendFile\",\n  \"muon.fs.appendTextFile\",\n  \"muon.fs.truncate\",\n  \"muon.fs.realpath\",\n  \"muon.fs.readlink\",\n  \"muon.fs.symlink\",\n  \"muon.fs.watch\",\n  \"muon.fs.dialogs.selectFile\",\n  \"muon.fs.dialogs.selectFiles\",\n  \"muon.fs.dialogs.selectDirectory\",\n  \"muon.fs.dialogs.selectDirectories\",\n  \"muon.fs.dialogs.selectSaveFile\",\n  \"muon.launcher.getSettings\",\n  \"muon.launcher.setSettings\",\n  \"muon.launcher.triggerUpdate\",\n] as const;\n\nconst normalizePath = (path: string): string =>\n  (path.split(\"?\")[0] ?? \"\").replaceAll(\"\\\\\", \"/\");\n\nconst createCapabilityId = (usedIds: Set<string>): string => {\n  for (;;) {\n    const id = `cap-${randomBytes(capabilityIdByteLength).toString(\"hex\")}`;\n    if (!usedIds.has(id)) {\n      usedIds.add(id);\n      return id;\n    }\n  }\n};\n\nconst parseCapabilitySpecifier = (\n  source: string,\n): ParsedCapabilitySpecifier | undefined => {\n  if (!moduleNamePattern.test(source)) {\n    return undefined;\n  }\n  const separator = source.indexOf(\":\");\n  const namespace = `${source.slice(0, separator)}.${source.slice(separator + 1)}`;\n  return {\n    moduleName: source,\n    namespace,\n  };\n};\n\nconst escapeRegExp = (source: string): string =>\n  source.replace(/[\\\\^$+?.()|[\\]{}]/gu, \"\\\\$&\");\n\nconst globToRegExp = (glob: string, separator: string): RegExp => {\n  let source = \"^\";\n  for (let index = 0; index < glob.length; index += 1) {\n    const current = glob[index] ?? \"\";\n    const next = glob[index + 1];\n    if (current === \"*\" && next === \"*\") {\n      source += \".*\";\n      index += 1;\n      continue;\n    }\n    if (current === \"*\") {\n      source += `[^${escapeRegExp(separator)}]*`;\n      continue;\n    }\n    source += escapeRegExp(current);\n  }\n  source += \"$\";\n  return new RegExp(source, \"u\");\n};\n\nconst isGlobMatch = (glob: string, value: string, separator: string): boolean =>\n  globToRegExp(glob, separator).test(value);\n\nconst containsGlob = (value: string): boolean => value.includes(\"*\");\n\nconst toRootRelativeImporter = (root: string, importer: string): string =>\n  normalizePath(relative(root, importer));\n\nconst readPackageName = (packageJsonPath: string): string | undefined => {\n  try {\n    const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as unknown;\n    return typeof parsed === \"object\" &&\n      parsed !== null &&\n      !Array.isArray(parsed) &&\n      typeof (parsed as { name?: unknown }).name === \"string\"\n      ? (parsed as { name: string }).name\n      : undefined;\n  } catch {\n    return undefined;\n  }\n};\n\nconst getImporterPackageName = (\n  root: string,\n  importer: string,\n): string | undefined => {\n  const normalizedRoot = normalizePath(root);\n  const rootPackageJsonPath = join(root, \"package.json\");\n  let directory = dirname(normalizePath(importer));\n  for (;;) {\n    const packageJsonPath = join(directory, \"package.json\");\n    if (\n      packageJsonPath !== rootPackageJsonPath &&\n      existsSync(packageJsonPath)\n    ) {\n      return readPackageName(packageJsonPath);\n    }\n    if (normalizePath(directory) === normalizedRoot) {\n      return undefined;\n    }\n    const parent = dirname(directory);\n    if (parent === directory) {\n      return undefined;\n    }\n    directory = parent;\n  }\n};\n\nconst matchesCapabilityRuleImporter = (\n  rule: MuonCapabilityImportOptions,\n  root: string,\n  importer: string,\n): boolean => {\n  const relativeImporter = toRootRelativeImporter(root, importer);\n  const sourceMatched =\n    rule.sources?.some((pattern) =>\n      isGlobMatch(normalizePath(pattern), relativeImporter, \"/\"),\n    ) ?? false;\n  if (sourceMatched) {\n    return true;\n  }\n\n  const packageName = getImporterPackageName(root, importer);\n  return packageName === undefined\n    ? false\n    : (rule.packages?.includes(packageName) ?? false);\n};\n\nconst hasNamespaceFunctionAllow = (\n  namespace: string,\n  allow: readonly string[],\n): boolean =>\n  allow.some((entry) => {\n    if (entry.startsWith(`${namespace}.`)) {\n      return true;\n    }\n    return isGlobMatch(entry, `${namespace}.placeholder`, \".\");\n  });\n\nconst getExactExportName = (\n  namespace: string,\n  functionPath: string,\n): string | undefined => {\n  const prefix = `${namespace}.`;\n  if (!functionPath.startsWith(prefix)) {\n    return undefined;\n  }\n  const name = functionPath.slice(prefix.length);\n  if (!jsIdentifierPattern.test(name)) {\n    return undefined;\n  }\n  return name;\n};\n\nconst getExportedFunctions = (\n  namespace: string,\n  allow: readonly string[],\n  functionPaths: readonly string[],\n): [string, string][] => {\n  const exportedFunctions = new Map<string, string>();\n  const addExport = (functionPath: string): void => {\n    const exportName = getExactExportName(namespace, functionPath);\n    if (exportName !== undefined && !exportedFunctions.has(exportName)) {\n      exportedFunctions.set(exportName, functionPath);\n    }\n  };\n\n  for (const entry of allow) {\n    if (!containsGlob(entry)) {\n      addExport(entry);\n      continue;\n    }\n    for (const functionPath of functionPaths) {\n      if (isGlobMatch(entry, functionPath, \".\")) {\n        addExport(functionPath);\n      }\n    }\n  }\n  return Array.from(exportedFunctions.entries());\n};\n\nconst createFunctionPathCatalog = (\n  functionPaths: readonly string[] | undefined,\n): readonly string[] => {\n  const catalog: string[] = [];\n  const seen = new Set<string>();\n  for (const functionPath of [\n    ...defaultMuonCapabilityFunctionPaths,\n    ...(functionPaths ?? []),\n  ]) {\n    if (!seen.has(functionPath)) {\n      seen.add(functionPath);\n      catalog.push(functionPath);\n    }\n  }\n  return catalog;\n};\n\nconst createRuleRuntimeEntry = (\n  rule: MuonCapabilityImportOptions,\n  id: string,\n): MuonCapabilityRuntimeEntry => ({\n  id,\n  allow: [...rule.allow],\n});\n\nconst validateCapabilityRule = (rule: MuonCapabilityImportOptions): void => {\n  if (\n    (rule.sources === undefined || rule.sources.length === 0) &&\n    (rule.packages === undefined || rule.packages.length === 0)\n  ) {\n    throw new Error(\n      \"muon capability import rule requires sources or packages.\",\n    );\n  }\n};\n\nconst createModuleVirtualId = (rule: ResolvedRule): string =>\n  `${virtualModulePrefix}${rule.index}:${rule.moduleName}`;\n\nconst parseModuleVirtualId = (\n  id: string,\n): { index: number; moduleName: string } | undefined => {\n  if (!id.startsWith(virtualModulePrefix)) {\n    return undefined;\n  }\n  const payload = id.slice(virtualModulePrefix.length);\n  const separator = payload.indexOf(\":\");\n  if (separator <= 0) {\n    return undefined;\n  }\n  const index = Number.parseInt(payload.slice(0, separator), 10);\n  if (!Number.isInteger(index) || index < 0) {\n    return undefined;\n  }\n  return {\n    index,\n    moduleName: payload.slice(separator + 1),\n  };\n};\n\nconst createExecutorSpawnExport = (\n  capabilityId: string,\n  functionPath: string,\n): string => `const __muonExecutorActiveProcesses = new Set();\nconst __muonExecutorEmptyBytes = new Uint8Array(0);\nconst __muonExecutorOwnerCallback = () => {};\nconst __muonExecutorAsyncDispose =\n  typeof Symbol === \"function\" && typeof Symbol.asyncDispose === \"symbol\"\n    ? Symbol.asyncDispose\n    : null;\nconst __muonExecutorToBytes = (data) => {\n  if (typeof data === \"string\") {\n    return new TextEncoder().encode(data);\n  }\n  if (data instanceof ArrayBuffer) {\n    return new Uint8Array(data);\n  }\n  if (ArrayBuffer.isView(data)) {\n    return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n  }\n  throw new TypeError(\"stdin data must be a string or BufferSource\");\n};\nconst __muonExecutorFromBase64 = (source) => {\n  const text = atob(source ?? \"\");\n  const bytes = new Uint8Array(text.length);\n  for (let index = 0; index < text.length; index += 1) {\n    bytes[index] = text.charCodeAt(index);\n  }\n  return bytes;\n};\nconst __muonExecutorRpc = async (\n  request,\n  data = __muonExecutorEmptyBytes,\n  onStdout = null,\n  onStderr = null,\n) =>\n  JSON.parse(\n    await __muonCall(${JSON.stringify(capabilityId)}, ${JSON.stringify(functionPath)}, [\n      JSON.stringify(request),\n      data,\n      0,\n      __muonExecutorOwnerCallback,\n      onStdout,\n      onStderr,\n    ]),\n  );\nconst __muonExecutorDecodeWaitResult = (raw) => {\n  const result = {\n    processId: raw.processId,\n    exitCode: raw.exitCode,\n  };\n  if (Object.prototype.hasOwnProperty.call(raw, \"stdoutBase64\")) {\n    result.stdout = __muonExecutorFromBase64(raw.stdoutBase64);\n  }\n  if (Object.prototype.hasOwnProperty.call(raw, \"stderrBase64\")) {\n    result.stderr = __muonExecutorFromBase64(raw.stderrBase64);\n  }\n  return result;\n};\nconst __muonExecutorReleaseActiveProcesses = async () => {\n  if (__muonExecutorActiveProcesses.size === 0) {\n    return;\n  }\n  for (const handle of Array.from(__muonExecutorActiveProcesses)) {\n    try {\n      await handle.release();\n    } catch {}\n  }\n};\nif (typeof globalThis.addEventListener === \"function\") {\n  for (const eventName of [\"beforeunload\", \"pagehide\", \"unload\"]) {\n    globalThis.addEventListener(eventName, __muonExecutorReleaseActiveProcesses);\n  }\n}\nexport const spawn = async (options = {}) => {\n  const stdoutCallback =\n    typeof options.onStdout === \"function\"\n      ? (chunk) => options.onStdout(new Uint8Array(chunk))\n      : null;\n  const stderrCallback =\n    typeof options.onStderr === \"function\"\n      ? (chunk) => options.onStderr(new Uint8Array(chunk))\n      : null;\n  const start = await __muonExecutorRpc(\n    {\n      op: \"start\",\n      options: {\n        command: options.command,\n        args: options.args,\n        cwd: options.cwd,\n        env: options.env,\n      },\n      captureStdout: stdoutCallback === null,\n      captureStderr: stderrCallback === null,\n    },\n    __muonExecutorEmptyBytes,\n    stdoutCallback,\n    stderrCallback,\n  );\n  const handleId = start.handleId;\n  let released = false;\n  let stdinClosing = false;\n  let waitPromise = null;\n  const release = async () => {\n    if (released) {\n      return;\n    }\n    released = true;\n    __muonExecutorActiveProcesses.delete(handle);\n    await __muonExecutorRpc({ op: \"dispose\", handleId });\n  };\n  const handle = {\n    processId: start.processId,\n    writeStdin: async (data) => {\n      if (released) {\n        throw new Error(\"executor process is released\");\n      }\n      if (stdinClosing) {\n        throw new Error(\"stdin is closed\");\n      }\n      await __muonExecutorRpc(\n        { op: \"writeStdin\", handleId },\n        __muonExecutorToBytes(data),\n      );\n    },\n    closeStdin: async () => {\n      if (released) {\n        throw new Error(\"executor process is released\");\n      }\n      stdinClosing = true;\n      await __muonExecutorRpc({ op: \"closeStdin\", handleId });\n    },\n    wait: () => {\n      if (waitPromise !== null) {\n        return waitPromise;\n      }\n      waitPromise = (async () => {\n        const result = __muonExecutorDecodeWaitResult(\n          await __muonExecutorRpc({ op: \"wait\", handleId }),\n        );\n        if (!released) {\n          released = true;\n          __muonExecutorActiveProcesses.delete(handle);\n          try {\n            await __muonExecutorRpc({ op: \"dispose\", handleId });\n          } catch {}\n        }\n        return result;\n      })();\n      return waitPromise;\n    },\n    kill: async () => {\n      if (released) {\n        throw new Error(\"executor process is released\");\n      }\n      await __muonExecutorRpc({ op: \"kill\", handleId });\n    },\n    release,\n  };\n  if (__muonExecutorAsyncDispose !== null) {\n    Object.defineProperty(handle, __muonExecutorAsyncDispose, {\n      configurable: false,\n      enumerable: false,\n      value: release,\n      writable: false,\n    });\n  }\n  Object.freeze(handle);\n  __muonExecutorActiveProcesses.add(handle);\n  return handle;\n};`;\n\nconst createExecutorLoadLibraryExport = (\n  capabilityId: string,\n  functionPath: string,\n): string => `const __muonAdhocActiveLibraries = new Set();\nconst __muonAdhocEmptyBytes = new Uint8Array(0);\nconst __muonAdhocAsyncDispose =\n  typeof Symbol === \"function\" && typeof Symbol.asyncDispose === \"symbol\"\n    ? Symbol.asyncDispose\n    : null;\nconst __muonAdhocPointerBrand =\n  typeof Symbol === \"function\" ? Symbol.for(\"muon.nativePointer\") : \"__muonNativePointer\";\nconst __muonAdhocType = (name) => Object.freeze({ name });\nconst __muonAdhocTypes = Object.freeze({\n  voidType: __muonAdhocType(\"void\"),\n  boolType: __muonAdhocType(\"bool\"),\n  int8Type: __muonAdhocType(\"int8\"),\n  uint8Type: __muonAdhocType(\"uint8\"),\n  int16Type: __muonAdhocType(\"int16\"),\n  uint16Type: __muonAdhocType(\"uint16\"),\n  int32Type: __muonAdhocType(\"int32\"),\n  uint32Type: __muonAdhocType(\"uint32\"),\n  int64Type: __muonAdhocType(\"int64\"),\n  uint64Type: __muonAdhocType(\"uint64\"),\n  float32Type: __muonAdhocType(\"float32\"),\n  float64Type: __muonAdhocType(\"float64\"),\n  stringType: __muonAdhocType(\"string\"),\n  pointerType: __muonAdhocType(\"pointer\"),\n  bufferViewType: __muonAdhocType(\"bufferView\"),\n  usizeType: __muonAdhocType(\"usize\"),\n});\nconst __muonAdhocToBytes = (data) => {\n  if (typeof data === \"string\") {\n    return new TextEncoder().encode(data);\n  }\n  if (data instanceof ArrayBuffer) {\n    return new Uint8Array(data);\n  }\n  if (ArrayBuffer.isView(data)) {\n    return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n  }\n  throw new TypeError(\"bufferView argument must be a string or BufferSource\");\n};\nconst __muonAdhocFromBase64 = (source) => {\n  const text = atob(source ?? \"\");\n  const bytes = new Uint8Array(text.length);\n  for (let index = 0; index < text.length; index += 1) {\n    bytes[index] = text.charCodeAt(index);\n  }\n  return bytes;\n};\nconst __muonAdhocCreatePointer = (value) => {\n  const text = String(value ?? \"0\");\n  const pointer = {\n    [__muonAdhocPointerBrand]: true,\n    value: text,\n    toString: () => text,\n    toJSON: () => text,\n  };\n  return Object.freeze(pointer);\n};\nconst __muonAdhocNormalizeType = (type) => {\n  if (typeof type === \"string\") {\n    return { name: type };\n  }\n  if (type && typeof type.name === \"string\") {\n    return { name: type.name };\n  }\n  throw new TypeError(\"adhoc type descriptor is invalid\");\n};\nconst __muonAdhocNormalizeSignature = (signature) => {\n  if (!signature || !Array.isArray(signature.argTypes)) {\n    throw new TypeError(\"adhoc signature is invalid\");\n  }\n  return {\n    argTypes: signature.argTypes.map(__muonAdhocNormalizeType),\n    returnType: __muonAdhocNormalizeType(signature.returnType),\n  };\n};\nconst __muonAdhocEncodeInteger = (value) => {\n  if (typeof value === \"bigint\") {\n    return value.toString();\n  }\n  if (typeof value === \"number\") {\n    if (!Number.isFinite(value) || Math.trunc(value) !== value) {\n      throw new TypeError(\"integer argument must be finite\");\n    }\n    return String(value);\n  }\n  if (typeof value === \"string\") {\n    return value;\n  }\n  throw new TypeError(\"integer argument must be a number, bigint, or string\");\n};\nconst __muonAdhocEncodePointer = (value) => {\n  if (value === null || value === undefined) {\n    return \"0\";\n  }\n  if (typeof value === \"object\" && value[__muonAdhocPointerBrand]) {\n    return value.value;\n  }\n  return __muonAdhocEncodeInteger(value);\n};\nconst __muonAdhocEncodeCall = (signature, args) => {\n  if (args.length !== signature.argTypes.length) {\n    throw new TypeError(\"Invalid adhoc argument count\");\n  }\n  const encoded = [];\n  const chunks = [];\n  const bufferViews = [];\n  let offset = 0;\n  for (let index = 0; index < args.length; index += 1) {\n    const name = signature.argTypes[index].name;\n    const value = args[index];\n    if (name === \"int64\" || name === \"uint64\" || name === \"usize\") {\n      encoded.push(__muonAdhocEncodeInteger(value));\n    } else if (name === \"pointer\") {\n      encoded.push(__muonAdhocEncodePointer(value));\n    } else if (name === \"bufferView\") {\n      const bytes = __muonAdhocToBytes(value);\n      chunks.push(bytes);\n      bufferViews.push({ argIndex: index, offset, size: bytes.byteLength });\n      offset += bytes.byteLength;\n      encoded.push(null);\n    } else {\n      encoded.push(value);\n    }\n  }\n  const data = new Uint8Array(offset);\n  let writeOffset = 0;\n  for (const chunk of chunks) {\n    data.set(chunk, writeOffset);\n    writeOffset += chunk.byteLength;\n  }\n  return { args: encoded, bufferViews, data };\n};\nconst __muonAdhocDecodeResult = (signature, raw) => {\n  const name = signature.returnType.name;\n  if (name === \"void\") {\n    return undefined;\n  }\n  if (name === \"pointer\") {\n    return __muonAdhocCreatePointer(raw.pointer);\n  }\n  if (name === \"int64\" || name === \"uint64\" || name === \"usize\") {\n    return BigInt(raw.value);\n  }\n  if (name === \"bufferView\") {\n    return __muonAdhocFromBase64(raw.base64);\n  }\n  return raw.value;\n};\nconst __muonAdhocRpc = async (request, data = __muonAdhocEmptyBytes) =>\n  JSON.parse(\n    await __muonCall(${JSON.stringify(capabilityId)}, ${JSON.stringify(functionPath)}, [\n      JSON.stringify(request),\n      data,\n      0,\n    ]),\n  );\nconst __muonAdhocReleaseActiveLibraries = async () => {\n  if (__muonAdhocActiveLibraries.size === 0) {\n    return;\n  }\n  for (const handle of Array.from(__muonAdhocActiveLibraries)) {\n    try {\n      await handle.release();\n    } catch {}\n  }\n};\nif (typeof globalThis.addEventListener === \"function\") {\n  for (const eventName of [\"beforeunload\", \"pagehide\", \"unload\"]) {\n    globalThis.addEventListener(eventName, __muonAdhocReleaseActiveLibraries);\n  }\n}\nexport const voidType = __muonAdhocTypes.voidType;\nexport const boolType = __muonAdhocTypes.boolType;\nexport const int8Type = __muonAdhocTypes.int8Type;\nexport const uint8Type = __muonAdhocTypes.uint8Type;\nexport const int16Type = __muonAdhocTypes.int16Type;\nexport const uint16Type = __muonAdhocTypes.uint16Type;\nexport const int32Type = __muonAdhocTypes.int32Type;\nexport const uint32Type = __muonAdhocTypes.uint32Type;\nexport const int64Type = __muonAdhocTypes.int64Type;\nexport const uint64Type = __muonAdhocTypes.uint64Type;\nexport const float32Type = __muonAdhocTypes.float32Type;\nexport const float64Type = __muonAdhocTypes.float64Type;\nexport const stringType = __muonAdhocTypes.stringType;\nexport const pointerType = __muonAdhocTypes.pointerType;\nexport const bufferViewType = __muonAdhocTypes.bufferViewType;\nexport const usizeType = __muonAdhocTypes.usizeType;\nexport const loadLibrary = async (path) => {\n  const start = await __muonAdhocRpc({ op: \"load\", path });\n  const libraryId = start.libraryId;\n  let released = false;\n  const release = async () => {\n    if (released) {\n      return;\n    }\n    released = true;\n    __muonAdhocActiveLibraries.delete(handle);\n    await __muonAdhocRpc({ op: \"release\", libraryId });\n  };\n  const handle = {\n    getFunction: async (name, signature) => {\n      if (released) {\n        throw new Error(\"adhoc library is released\");\n      }\n      const normalizedSignature = __muonAdhocNormalizeSignature(signature);\n      const loaded = await __muonAdhocRpc({\n        op: \"getFunction\",\n        libraryId,\n        name,\n        signature: normalizedSignature,\n      });\n      const functionId = loaded.functionId;\n      return async (...args) => {\n        if (released) {\n          throw new Error(\"adhoc library is released\");\n        }\n        const encoded = __muonAdhocEncodeCall(normalizedSignature, args);\n        const raw = await __muonAdhocRpc(\n          {\n            op: \"call\",\n            libraryId,\n            functionId,\n            args: encoded.args,\n            bufferViews: encoded.bufferViews,\n          },\n          encoded.data,\n        );\n        return __muonAdhocDecodeResult(normalizedSignature, raw);\n      };\n    },\n    release,\n  };\n  if (__muonAdhocAsyncDispose !== null) {\n    Object.defineProperty(handle, __muonAdhocAsyncDispose, {\n      configurable: false,\n      enumerable: false,\n      value: release,\n      writable: false,\n    });\n  }\n  Object.freeze(handle);\n  __muonAdhocActiveLibraries.add(handle);\n  return handle;\n};`;\n\nconst createBrowserContextMenuHelpers =\n  (): string => `const __muonBrowserContextMenuEventName = \"muon-browser-context-menu-command\";\nconst __muonBrowserContextMenuWhenKeys = [\n  \"editable\",\n  \"selection\",\n  \"link\",\n  \"image\",\n  \"canCopy\",\n  \"canPaste\",\n];\nlet __muonBrowserContextMenuToken = \"\";\nlet __muonBrowserContextMenuHandler = undefined;\nlet __muonBrowserContextMenuListening = false;\nconst __muonCreateBrowserContextMenuToken = () => {\n  const crypto = globalThis.crypto;\n  if (\n    crypto &&\n    typeof crypto.getRandomValues === \"function\" &&\n    typeof globalThis.Uint32Array === \"function\"\n  ) {\n    const values = new globalThis.Uint32Array(4);\n    crypto.getRandomValues(values);\n    return Array.from(values, (value) => value.toString(16).padStart(8, \"0\")).join(\"\");\n  }\n  return \\`\\${Date.now().toString(36)}-\\${Math.random().toString(36).slice(2)}\\`;\n};\nconst __muonEnsureBrowserContextMenuListener = () => {\n  if (\n    __muonBrowserContextMenuListening ||\n    typeof globalThis.addEventListener !== \"function\"\n  ) {\n    return;\n  }\n  globalThis.addEventListener(__muonBrowserContextMenuEventName, (event) => {\n    const detail = event && event.detail;\n    if (\n      typeof detail !== \"object\" ||\n      detail === null ||\n      detail.token !== __muonBrowserContextMenuToken ||\n      typeof __muonBrowserContextMenuHandler !== \"function\"\n    ) {\n      return;\n    }\n    __muonBrowserContextMenuHandler(detail);\n  });\n  __muonBrowserContextMenuListening = true;\n};\nconst __muonNormalizeBrowserContextMenuPlacement = (placement) => {\n  if (placement === undefined) {\n    return undefined;\n  }\n  if (placement === \"start\" || placement === \"afterEdit\" || placement === \"end\") {\n    return placement;\n  }\n  throw new TypeError(\"Invalid context menu placement\");\n};\nconst __muonNormalizeBrowserContextMenuWhen = (when) => {\n  if (when === undefined) {\n    return undefined;\n  }\n  if (typeof when !== \"object\" || when === null || Array.isArray(when)) {\n    throw new TypeError(\"Invalid context menu condition\");\n  }\n  const normalized = {};\n  for (const key of __muonBrowserContextMenuWhenKeys) {\n    const value = when[key];\n    if (value === undefined) {\n      continue;\n    }\n    if (typeof value !== \"boolean\") {\n      throw new TypeError(\"Invalid context menu condition\");\n    }\n    normalized[key] = value;\n  }\n  return normalized;\n};\nconst __muonNormalizeBrowserContextMenuCommandId = (id) => {\n  if (\n    typeof id !== \"string\" ||\n    id === \"\" ||\n    /[\\\\u0000-\\\\u001f]/u.test(id) ||\n    id.startsWith(\"muon.\") ||\n    id.startsWith(\"standard.\")\n  ) {\n    throw new TypeError(\"Invalid context menu item id\");\n  }\n  return id;\n};\nconst __muonNormalizeBrowserContextMenuItem = (item) => {\n  if (typeof item !== \"object\" || item === null || Array.isArray(item)) {\n    throw new TypeError(\"Invalid context menu item\");\n  }\n  const placement = __muonNormalizeBrowserContextMenuPlacement(item.placement);\n  const when = __muonNormalizeBrowserContextMenuWhen(item.when);\n  if (item.type === \"separator\") {\n    return {\n      type: \"separator\",\n      ...(placement === undefined ? {} : { placement }),\n      ...(when === undefined ? {} : { when }),\n    };\n  }\n  if (item.type !== undefined && item.type !== \"item\") {\n    throw new TypeError(\"Invalid context menu item type\");\n  }\n  if (typeof item.label !== \"string\" || item.label === \"\") {\n    throw new TypeError(\"Invalid context menu item label\");\n  }\n  if (item.enabled !== undefined && typeof item.enabled !== \"boolean\") {\n    throw new TypeError(\"Invalid context menu item enabled state\");\n  }\n  return {\n    id: __muonNormalizeBrowserContextMenuCommandId(item.id),\n    label: item.label,\n    enabled: item.enabled === undefined ? true : item.enabled,\n    ...(placement === undefined ? {} : { placement }),\n    ...(when === undefined ? {} : { when }),\n  };\n};\nconst __muonNormalizeBrowserContextMenuItems = (items) => {\n  if (!Array.isArray(items)) {\n    throw new TypeError(\"Invalid context menu items\");\n  }\n  return items.map(__muonNormalizeBrowserContextMenuItem);\n};`;\n\nconst createBrowserSetContextMenuItemsExport = (\n  capabilityId: string,\n  functionPath: string,\n): string => `export const setContextMenuItems = async (items, handler = undefined) => {\n  if (handler !== undefined && typeof handler !== \"function\") {\n    throw new TypeError(\"Invalid context menu handler\");\n  }\n  const normalized = __muonNormalizeBrowserContextMenuItems(items);\n  const token = __muonCreateBrowserContextMenuToken();\n  await __muonCall(${JSON.stringify(capabilityId)}, ${JSON.stringify(functionPath)}, [JSON.stringify(normalized), token]);\n  __muonBrowserContextMenuToken = token;\n  __muonBrowserContextMenuHandler = handler;\n  __muonEnsureBrowserContextMenuListener();\n};`;\n\nconst createBrowserClearContextMenuItemsExport = (\n  capabilityId: string,\n  functionPath: string,\n): string => `export const clearContextMenuItems = async () => {\n  __muonBrowserContextMenuToken = \"\";\n  __muonBrowserContextMenuHandler = undefined;\n  await __muonCall(${JSON.stringify(capabilityId)}, ${JSON.stringify(functionPath)}, []);\n};`;\n\nconst createBrowserTrayHelpers =\n  (): string => `const __muonBrowserTrayEventName = \"muon-browser-tray-event\";\nconst __muonBrowserTrayHandlers = new Map();\nlet __muonBrowserTrayListening = false;\nconst __muonCreateBrowserTrayToken = () => {\n  const crypto = globalThis.crypto;\n  if (\n    crypto &&\n    typeof crypto.getRandomValues === \"function\" &&\n    typeof globalThis.Uint32Array === \"function\"\n  ) {\n    const values = new globalThis.Uint32Array(4);\n    crypto.getRandomValues(values);\n    return Array.from(values, (value) => value.toString(16).padStart(8, \"0\")).join(\"\");\n  }\n  return \\`\\${Date.now().toString(36)}-\\${Math.random().toString(36).slice(2)}\\`;\n};\nconst __muonEnsureBrowserTrayListener = () => {\n  if (\n    __muonBrowserTrayListening ||\n    typeof globalThis.addEventListener !== \"function\"\n  ) {\n    return;\n  }\n  globalThis.addEventListener(__muonBrowserTrayEventName, (event) => {\n    const detail = event && event.detail;\n    if (\n      typeof detail !== \"object\" ||\n      detail === null ||\n      typeof detail.trayId !== \"string\"\n    ) {\n      return;\n    }\n    const entry = __muonBrowserTrayHandlers.get(detail.trayId);\n    if (\n      entry === undefined ||\n      detail.token !== entry.token ||\n      typeof entry.handler !== \"function\"\n    ) {\n      return;\n    }\n    entry.handler(detail);\n  });\n  __muonBrowserTrayListening = true;\n};\nconst __muonNormalizeBrowserTrayId = (id) => {\n  if (\n    typeof id !== \"string\" ||\n    id === \"\" ||\n    /[\\\\u0000-\\\\u001f]/u.test(id) ||\n    id.startsWith(\"muon.\") ||\n    id.startsWith(\"standard.\")\n  ) {\n    throw new TypeError(\"Invalid tray id\");\n  }\n  return id;\n};\nconst __muonNormalizeBrowserTrayMenuItem = (item) => {\n  if (typeof item !== \"object\" || item === null || Array.isArray(item)) {\n    throw new TypeError(\"Invalid tray menu item\");\n  }\n  if (item.type === \"separator\") {\n    return { type: \"separator\" };\n  }\n  const type = item.type === undefined ? \"item\" : item.type;\n  if (type !== \"item\" && type !== \"checkbox\" && type !== \"radio\") {\n    throw new TypeError(\"Invalid tray menu item type\");\n  }\n  if (typeof item.label !== \"string\" || item.label === \"\") {\n    throw new TypeError(\"Invalid tray menu item label\");\n  }\n  if (item.enabled !== undefined && typeof item.enabled !== \"boolean\") {\n    throw new TypeError(\"Invalid tray menu item enabled state\");\n  }\n  if (item.checked !== undefined && typeof item.checked !== \"boolean\") {\n    throw new TypeError(\"Invalid tray menu item checked state\");\n  }\n  if (type === \"item\" && item.checked !== undefined) {\n    throw new TypeError(\"Invalid tray menu item checked state\");\n  }\n  return {\n    ...(type === \"item\" ? {} : { type }),\n    id: __muonNormalizeBrowserTrayId(item.id),\n    label: item.label,\n    enabled: item.enabled === undefined ? true : item.enabled,\n    ...(item.checked === undefined ? {} : { checked: item.checked }),\n  };\n};\nconst __muonNormalizeBrowserTrayMenuItems = (items) => {\n  if (!Array.isArray(items)) {\n    throw new TypeError(\"Invalid tray menu items\");\n  }\n  return items.map(__muonNormalizeBrowserTrayMenuItem);\n};\nconst __muonNormalizeBrowserTrayOptions = (options) => {\n  if (typeof options !== \"object\" || options === null || Array.isArray(options)) {\n    throw new TypeError(\"Invalid tray options\");\n  }\n  const hasIcon = options.icon !== undefined;\n  if (hasIcon && (typeof options.icon !== \"string\" || options.icon === \"\")) {\n    throw new TypeError(\"Invalid tray icon\");\n  }\n  if (options.tooltip !== undefined && options.tooltip !== null && typeof options.tooltip !== \"string\") {\n    throw new TypeError(\"Invalid tray tooltip\");\n  }\n  return {\n    ...(options.id === undefined ? {} : { id: __muonNormalizeBrowserTrayId(options.id) }),\n    ...(hasIcon ? { icon: options.icon } : {}),\n    ...(options.tooltip === undefined || options.tooltip === null ? {} : { tooltip: options.tooltip }),\n    ...(options.menu === undefined ? {} : { menu: __muonNormalizeBrowserTrayMenuItems(options.menu) }),\n  };\n};`;\n\nconst createBrowserCreateTrayExport = (\n  capabilityId: string,\n  functionPath: string,\n): string => `export const createTray = async (options, handler = undefined) => {\n  if (handler !== undefined && typeof handler !== \"function\") {\n    throw new TypeError(\"Invalid tray handler\");\n  }\n  const normalized = __muonNormalizeBrowserTrayOptions(options);\n  const token = __muonCreateBrowserTrayToken();\n  const trayId = await __muonCall(${JSON.stringify(capabilityId)}, ${JSON.stringify(functionPath)}, [JSON.stringify(normalized), token]);\n  __muonBrowserTrayHandlers.set(trayId, { token, handler });\n  __muonEnsureBrowserTrayListener();\n  return trayId;\n};`;\n\nconst createBrowserSetTrayMenuExport = (\n  capabilityId: string,\n  functionPath: string,\n): string => `export const setTrayMenu = async (id, items, handler = undefined) => {\n  if (handler !== undefined && typeof handler !== \"function\") {\n    throw new TypeError(\"Invalid tray handler\");\n  }\n  const trayId = __muonNormalizeBrowserTrayId(id);\n  const normalized = __muonNormalizeBrowserTrayMenuItems(items);\n  const token = __muonCreateBrowserTrayToken();\n  await __muonCall(${JSON.stringify(capabilityId)}, ${JSON.stringify(functionPath)}, [trayId, JSON.stringify(normalized), token]);\n  __muonBrowserTrayHandlers.set(trayId, { token, handler });\n  __muonEnsureBrowserTrayListener();\n};`;\n\nconst createBrowserSetTrayIconExport = (\n  capabilityId: string,\n  functionPath: string,\n): string => `export const setTrayIcon = async (id, iconPath) => {\n  const trayId = __muonNormalizeBrowserTrayId(id);\n  if (typeof iconPath !== \"string\" || iconPath === \"\") {\n    throw new TypeError(\"Invalid tray icon\");\n  }\n  await __muonCall(${JSON.stringify(capabilityId)}, ${JSON.stringify(functionPath)}, [trayId, iconPath]);\n};`;\n\nconst createBrowserSetTrayTooltipExport = (\n  capabilityId: string,\n  functionPath: string,\n): string => `export const setTrayTooltip = async (id, tooltip) => {\n  const trayId = __muonNormalizeBrowserTrayId(id);\n  if (tooltip !== null && typeof tooltip !== \"string\") {\n    throw new TypeError(\"Invalid tray tooltip\");\n  }\n  await __muonCall(${JSON.stringify(capabilityId)}, ${JSON.stringify(functionPath)}, [trayId, tooltip === null ? \"\" : tooltip]);\n};`;\n\nconst createBrowserRemoveTrayExport = (\n  capabilityId: string,\n  functionPath: string,\n): string => `export const removeTray = async (id) => {\n  const trayId = __muonNormalizeBrowserTrayId(id);\n  await __muonCall(${JSON.stringify(capabilityId)}, ${JSON.stringify(functionPath)}, [trayId]);\n  __muonBrowserTrayHandlers.delete(trayId);\n};`;\n\nconst createGenericFunctionExport = (\n  exportName: string,\n  capabilityId: string,\n  functionPath: string,\n): string => `export const ${exportName} = async (...args) =>\n  await __muonCall(${JSON.stringify(capabilityId)}, ${JSON.stringify(functionPath)}, args);`;\n\nconst createModuleSource = (rule: ResolvedRule): string => {\n  const exportedFunctions = getExportedFunctions(\n    rule.namespace,\n    rule.rule.allow,\n    rule.functionPaths,\n  );\n  if (exportedFunctions.length === 0) {\n    const hasWildcardAllow = rule.rule.allow.some(containsGlob);\n    throw new Error(\n      hasWildcardAllow\n        ? `muon capability import has no matching function exports: ${rule.moduleName}`\n        : `muon capability import has no exact function exports: ${rule.moduleName}`,\n    );\n  }\n\n  const usesBrowserContextMenuHelpers = exportedFunctions.some(\n    ([exportName]) =>\n      rule.namespace === \"muon.browser\" &&\n      (exportName === \"setContextMenuItems\" ||\n        exportName === \"clearContextMenuItems\"),\n  );\n  const usesBrowserTrayHelpers = exportedFunctions.some(\n    ([exportName]) =>\n      rule.namespace === \"muon.browser\" &&\n      (exportName === \"createTray\" ||\n        exportName === \"setTrayMenu\" ||\n        exportName === \"setTrayIcon\" ||\n        exportName === \"setTrayTooltip\" ||\n        exportName === \"removeTray\"),\n  );\n  const exports = exportedFunctions.map(([exportName, functionPath]) => {\n    if (rule.namespace === \"muon.executor\" && exportName === \"spawn\") {\n      return createExecutorSpawnExport(rule.id, functionPath);\n    }\n    if (rule.namespace === \"muon.executor\" && exportName === \"loadLibrary\") {\n      return createExecutorLoadLibraryExport(rule.id, functionPath);\n    }\n    if (\n      rule.namespace === \"muon.browser\" &&\n      exportName === \"setContextMenuItems\"\n    ) {\n      return createBrowserSetContextMenuItemsExport(rule.id, functionPath);\n    }\n    if (\n      rule.namespace === \"muon.browser\" &&\n      exportName === \"clearContextMenuItems\"\n    ) {\n      return createBrowserClearContextMenuItemsExport(rule.id, functionPath);\n    }\n    if (rule.namespace === \"muon.browser\" && exportName === \"createTray\") {\n      return createBrowserCreateTrayExport(rule.id, functionPath);\n    }\n    if (rule.namespace === \"muon.browser\" && exportName === \"setTrayMenu\") {\n      return createBrowserSetTrayMenuExport(rule.id, functionPath);\n    }\n    if (rule.namespace === \"muon.browser\" && exportName === \"setTrayIcon\") {\n      return createBrowserSetTrayIconExport(rule.id, functionPath);\n    }\n    if (rule.namespace === \"muon.browser\" && exportName === \"setTrayTooltip\") {\n      return createBrowserSetTrayTooltipExport(rule.id, functionPath);\n    }\n    if (rule.namespace === \"muon.browser\" && exportName === \"removeTray\") {\n      return createBrowserRemoveTrayExport(rule.id, functionPath);\n    }\n    return createGenericFunctionExport(exportName, rule.id, functionPath);\n  });\n  return `const __muonCall = globalThis.__muon_plugin_call;\nif (typeof __muonCall !== \"function\") {\n  throw new Error(\"muon plugin capability bridge is not available.\");\n}\n\n${usesBrowserContextMenuHelpers ? `${createBrowserContextMenuHelpers()}\\n\\n` : \"\"}\n${usesBrowserTrayHelpers ? `${createBrowserTrayHelpers()}\\n\\n` : \"\"}\n${exports.join(\"\\n\\n\")}\n`;\n};\n\n/**\n * Creates a capability virtual module resolver for a bundler adapter.\n *\n * @param root Bundler project root.\n * @param options Capability import options.\n */\nexport const createMuonCapabilityModuleResolver = (\n  root: string,\n  options: MuonCapabilityOptions | undefined,\n): MuonCapabilityModuleResolver => {\n  const rules = [...(options?.imports ?? [])];\n  const functionPaths = createFunctionPathCatalog(options?.functionPaths);\n  for (const rule of rules) {\n    validateCapabilityRule(rule);\n  }\n  const usedCapabilityIds = new Set<string>();\n  const runtimeEntries = rules.map((rule) =>\n    createRuleRuntimeEntry(rule, createCapabilityId(usedCapabilityIds)),\n  );\n\n  const resolveRule = (\n    source: string,\n    importer: string | undefined,\n  ): ResolvedRule | undefined => {\n    const parsed = parseCapabilitySpecifier(source);\n    if (parsed === undefined) {\n      return undefined;\n    }\n    const namespaceConfigured = rules.some((rule) =>\n      hasNamespaceFunctionAllow(parsed.namespace, rule.allow),\n    );\n    if (!namespaceConfigured) {\n      return undefined;\n    }\n    if (importer === undefined) {\n      throw new Error(\n        `muon capability import is not allowed without an importer: ${source}`,\n      );\n    }\n\n    const relativeImporter = toRootRelativeImporter(root, importer);\n    for (let index = 0; index < rules.length; index += 1) {\n      const rule = rules[index];\n      const runtimeEntry = runtimeEntries[index];\n      if (\n        rule === undefined ||\n        runtimeEntry === undefined ||\n        !matchesCapabilityRuleImporter(rule, root, importer) ||\n        !hasNamespaceFunctionAllow(parsed.namespace, rule.allow)\n      ) {\n        continue;\n      }\n      return {\n        index,\n        id: runtimeEntry.id,\n        rule,\n        namespace: parsed.namespace,\n        moduleName: parsed.moduleName,\n        functionPaths,\n      };\n    }\n\n    throw new Error(\n      `muon capability import is not allowed: ${source} from ${relativeImporter}`,\n    );\n  };\n\n  return {\n    resolveId: (source, importer) => {\n      const rule = resolveRule(source, importer);\n      return rule === undefined\n        ? undefined\n        : {\n            id: createModuleVirtualId(rule),\n          };\n    },\n    load: (id) => {\n      const parsed = parseModuleVirtualId(id);\n      if (parsed === undefined) {\n        return undefined;\n      }\n      const source = parseCapabilitySpecifier(parsed.moduleName);\n      const rule = rules[parsed.index];\n      const runtimeEntry = runtimeEntries[parsed.index];\n      if (\n        source === undefined ||\n        rule === undefined ||\n        runtimeEntry === undefined\n      ) {\n        return undefined;\n      }\n      return createModuleSource({\n        index: parsed.index,\n        id: runtimeEntry.id,\n        rule,\n        namespace: source.namespace,\n        moduleName: source.moduleName,\n        functionPaths,\n      });\n    },\n    getRuntimePluginConfig: () => ({\n      mode: \"validate\",\n      capabilities: runtimeEntries,\n    }),\n  };\n};\n","// muon - Multi-platform GUI application framework that uses CEF as its backend\n// Copyright (c) Kouji Matsui. (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/muon\n\nimport { constants } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\n\nimport { parse } from \"json5\";\n\nimport type {\n  MuonCapabilityImportOptions,\n  MuonCapabilityOptions,\n  MuonRuntimePluginEntryConfig,\n} from \"./capability.js\";\n\n/**\n * Plugin JavaScript exposure mode.\n */\nexport type MuonPluginAccessMode = \"simple\" | \"validate\";\n\n/**\n * Import-side capability rule from public muon plugin access config.\n */\nexport interface MuonPluginAccessImportOptions {\n  /**\n   * Importer source globs relative to the bundler project root.\n   */\n  sources?: readonly string[];\n  /**\n   * NPM package names allowed to import the virtual module.\n   */\n  packages?: readonly string[];\n  /**\n   * Plugin function paths allowed for this import rule.\n   *\n   * @remarks Required in validate mode. Simple mode does not use import rules.\n   */\n  allow?: readonly string[];\n}\n\n/**\n * Plugin entry from public muon plugin access config.\n */\nexport interface MuonPluginAccessEntryOptions {\n  /**\n   * Plugin entry name.\n   */\n  name: string;\n  /**\n   * Optional 64-character hexadecimal SHA-256 digest of the final external\n   * `.so` or `.dll` file bytes followed by the decoded `salt` bytes.\n   *\n   * @remarks Calculate this after all library post-processing, including\n   * stripping and code signing. It is not supported for `internal`.\n   */\n  signature?: string;\n  /**\n   * Optional hex-encoded salt whose decoded bytes are appended when checking\n   * the plugin signature.\n   *\n   * @remarks Required when `signature` is specified. It is not supported for\n   * `internal`.\n   */\n  salt?: string;\n  /**\n   * Plugin-defined string key-value configuration entries.\n   */\n  config?: Readonly<Record<string, string>>;\n  /**\n   * Plugin function path globs allowed by the runtime plugin policy.\n   *\n   * @remarks Required in simple mode. Validate mode derives the runtime\n   * allowlist from `imports[].allow` and rejects this field in public config.\n   */\n  allow?: readonly string[];\n  /**\n   * Validate-mode import rules for this plugin entry.\n   */\n  imports?: readonly MuonPluginAccessImportOptions[];\n}\n\n/**\n * Public plugin access config shared by muon.json and the Vite option.\n */\nexport interface MuonPluginAccessOptions {\n  /**\n   * External plugin directory override.\n   */\n  path?: string;\n  /**\n   * Plugin exposure mode.\n   */\n  mode?: MuonPluginAccessMode;\n  /**\n   * Page URL patterns where the plugin bridge is exposed.\n   */\n  pages?: readonly string[];\n  /**\n   * Runtime plugin entries and validate-mode import rules.\n   */\n  plugins?: readonly MuonPluginAccessEntryOptions[];\n}\n\n/**\n * Resolved plugin access config used by bundler integrations.\n */\nexport interface MuonResolvedPluginAccessOptions {\n  /**\n   * Effective plugin exposure mode.\n   */\n  mode: MuonPluginAccessMode;\n  /**\n   * Effective page URL allowlist.\n   */\n  pages: readonly string[];\n  /**\n   * Capability resolver inputs generated from plugin imports.\n   */\n  capabilityOptions: MuonCapabilityOptions;\n  /**\n   * Runtime config fields added around generated capability policies.\n   */\n  runtimeOverlay: MuonPluginAccessRuntimeOverlay;\n  /**\n   * Resolved external plugin directory used by build-time inspectors.\n   */\n  pluginPath: string;\n  /**\n   * Effective plugin entries from muon.json and Vite options.\n   */\n  plugins: readonly MuonPluginAccessEntryOptions[];\n}\n\n/**\n * Runtime plugin config fields that are not derived from capability IDs.\n */\nexport interface MuonPluginAccessRuntimeOverlay {\n  /**\n   * Page URL allowlist to write into generated runtime config.\n   */\n  pages?: readonly string[];\n  /**\n   * External plugin path override.\n   */\n  path?: string;\n  /**\n   * Plugin loading allowlist override.\n   */\n  plugins?: readonly MuonRuntimePluginEntryConfig[];\n}\n\nexport interface ResolveMuonPluginAccessOptionsInput {\n  /**\n   * Bundler project root.\n   */\n  root: string;\n  /**\n   * Optional muon.json path relative to root.\n   */\n  configPath: string | undefined;\n  /**\n   * Vite plugin access override.\n   */\n  pluginAccess: false | MuonPluginAccessOptions | undefined;\n  /**\n   * Handles project config read failures. When omitted, read failures are\n   * reported as errors.\n   */\n  onConfigReadError?: (error: unknown) => void;\n}\n\ntype JsonObject = Record<string, unknown>;\n\nconst defaultConfigFileNames = [\"muon.json5\", \"muon.jsonc\", \"muon.json\"];\nconst defaultPluginPages = [\"asset://main/**\"];\n\nconst isJsonObject = (value: unknown): value is JsonObject =>\n  typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isStringArray = (value: unknown): value is readonly string[] =>\n  Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n\nconst isSha256HexString = (value: string): boolean =>\n  value.length === 64 && /^[0-9a-fA-F]+$/.test(value);\n\nconst isHexByteString = (value: string): boolean =>\n  value.length % 2 === 0 && /^[0-9a-fA-F]*$/.test(value);\n\nconst containsNul = (value: string): boolean => value.includes(\"\\0\");\n\nconst getErrorMessage = (error: unknown): string =>\n  error instanceof Error ? error.message : String(error);\n\nconst fileExists = async (path: string): Promise<boolean> => {\n  try {\n    await access(path, constants.F_OK);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\nconst resolveMuonConfigPath = async (\n  root: string,\n  configPath: string | undefined,\n): Promise<string | undefined> => {\n  if (configPath !== undefined) {\n    const resolvedPath = resolve(root, configPath);\n    if (await fileExists(resolvedPath)) {\n      return resolvedPath;\n    }\n    throw new Error(`muon config file does not exist: ${resolvedPath}`);\n  }\n\n  for (const fileName of defaultConfigFileNames) {\n    const candidatePath = join(root, fileName);\n    if (await fileExists(candidatePath)) {\n      return candidatePath;\n    }\n  }\n  return undefined;\n};\n\nconst readJsonObjectFile = async (\n  path: string,\n  label: string,\n): Promise<JsonObject> => {\n  let content: string;\n  try {\n    content = await readFile(path, \"utf8\");\n  } catch (error) {\n    throw new Error(\n      `${label} could not be read: ${path}: ${getErrorMessage(error)}`,\n    );\n  }\n\n  let parsed: unknown;\n  try {\n    parsed = parse(content);\n  } catch (error) {\n    throw new Error(\n      `${label} could not be parsed: ${path}: ${getErrorMessage(error)}`,\n    );\n  }\n\n  if (!isJsonObject(parsed)) {\n    throw new Error(`${label} must contain a JSON object: ${path}`);\n  }\n  return parsed;\n};\n\nconst readOptionalStringArray = (\n  object: JsonObject,\n  key: string,\n  configPath: string,\n): readonly string[] | undefined => {\n  const value = object[key];\n  if (value === undefined) {\n    return undefined;\n  }\n  if (!isStringArray(value)) {\n    throw new Error(`muon.json ${configPath} must be an array of strings.`);\n  }\n  return value;\n};\n\nconst readPluginAccessImportOptions = (\n  value: unknown,\n  configPath: string,\n): MuonPluginAccessImportOptions => {\n  if (!isJsonObject(value)) {\n    throw new Error(`muon.json ${configPath} must be an object.`);\n  }\n\n  const sources = readOptionalStringArray(\n    value,\n    \"sources\",\n    `${configPath}.sources`,\n  );\n  const packages = readOptionalStringArray(\n    value,\n    \"packages\",\n    `${configPath}.packages`,\n  );\n  const allow = readOptionalStringArray(value, \"allow\", `${configPath}.allow`);\n  const options: MuonPluginAccessImportOptions = {};\n  if (sources !== undefined) {\n    options.sources = sources;\n  }\n  if (packages !== undefined) {\n    options.packages = packages;\n  }\n  if (allow !== undefined) {\n    options.allow = allow;\n  }\n  return options;\n};\n\nconst readOptionalStringRecord = (\n  object: JsonObject,\n  key: string,\n  configPath: string,\n): Readonly<Record<string, string>> | undefined => {\n  const value = object[key];\n  if (value === undefined) {\n    return undefined;\n  }\n  if (!isJsonObject(value)) {\n    throw new Error(`muon.json ${configPath} must be an object.`);\n  }\n  const config: Record<string, string> = {};\n  for (const [entryKey, entryValue] of Object.entries(value)) {\n    if (entryKey.length === 0) {\n      throw new Error(`muon.json ${configPath} key must not be empty.`);\n    }\n    if (containsNul(entryKey)) {\n      throw new Error(`muon.json ${configPath} key must not contain NUL.`);\n    }\n    const valuePath = `${configPath}.${entryKey}`;\n    if (typeof entryValue !== \"string\") {\n      throw new Error(`muon.json ${valuePath} must be a string.`);\n    }\n    if (containsNul(entryValue)) {\n      throw new Error(`muon.json ${valuePath} must not contain NUL.`);\n    }\n    config[entryKey] = entryValue;\n  }\n  return config;\n};\n\nconst readPluginAccessEntryOptions = (\n  value: unknown,\n  index: number,\n): MuonPluginAccessEntryOptions => {\n  const configPath = `plugin.plugins[${index}]`;\n  if (!isJsonObject(value)) {\n    throw new Error(`muon.json ${configPath} must be an object.`);\n  }\n  if (typeof value.name !== \"string\") {\n    throw new Error(`muon.json ${configPath}.name must be a string.`);\n  }\n  if (value.signature !== undefined) {\n    if (typeof value.signature !== \"string\") {\n      throw new Error(`muon.json ${configPath}.signature must be a string.`);\n    }\n    if (!isSha256HexString(value.signature)) {\n      throw new Error(\n        `muon.json ${configPath}.signature must be a 64-character SHA-256 hex string.`,\n      );\n    }\n  }\n  if (value.salt !== undefined) {\n    if (typeof value.salt !== \"string\") {\n      throw new Error(`muon.json ${configPath}.salt must be a string.`);\n    }\n    if (!isHexByteString(value.salt)) {\n      throw new Error(\n        `muon.json ${configPath}.salt must be a hexadecimal byte string.`,\n      );\n    }\n  }\n  const allow = readOptionalStringArray(value, \"allow\", `${configPath}.allow`);\n  const config = readOptionalStringRecord(\n    value,\n    \"config\",\n    `${configPath}.config`,\n  );\n\n  const rawImports = value.imports;\n  if (rawImports !== undefined && !Array.isArray(rawImports)) {\n    throw new Error(`muon.json ${configPath}.imports must be an array.`);\n  }\n  const imports =\n    rawImports === undefined\n      ? undefined\n      : rawImports.map((entry, importIndex) =>\n          readPluginAccessImportOptions(\n            entry,\n            `${configPath}.imports[${importIndex}]`,\n          ),\n        );\n  const options: MuonPluginAccessEntryOptions = {\n    name: value.name,\n  };\n  if (value.signature !== undefined) {\n    options.signature = value.signature;\n  }\n  if (value.salt !== undefined) {\n    options.salt = value.salt;\n  }\n  if (config !== undefined) {\n    options.config = config;\n  }\n  if (allow !== undefined) {\n    options.allow = allow;\n  }\n  if (imports !== undefined) {\n    options.imports = imports;\n  }\n  return options;\n};\n\nconst readPluginAccessOptions = (\n  config: JsonObject,\n): MuonPluginAccessOptions => {\n  const browser = config.browser;\n  if (isJsonObject(browser) && browser.plugin !== undefined) {\n    throw new Error(\n      \"muon.json browser.plugin is no longer supported; use plugin.mode and plugin.pages instead.\",\n    );\n  }\n\n  const plugin = config.plugin;\n  if (plugin === undefined) {\n    return {};\n  }\n  if (!isJsonObject(plugin)) {\n    throw new Error(\"muon.json plugin must be an object.\");\n  }\n\n  const options: MuonPluginAccessOptions = {};\n  if (plugin.path !== undefined) {\n    if (typeof plugin.path !== \"string\") {\n      throw new Error(\"muon.json plugin.path must be a string.\");\n    }\n    if (plugin.path.length === 0) {\n      throw new Error(\"muon.json plugin.path must not be empty.\");\n    }\n    options.path = plugin.path;\n  }\n  if (plugin.mode !== undefined) {\n    if (typeof plugin.mode !== \"string\") {\n      throw new Error(\"muon.json plugin.mode must be a string.\");\n    }\n    if (plugin.mode.length === 0) {\n      throw new Error(\"muon.json plugin.mode must not be empty.\");\n    }\n    if (plugin.mode !== \"simple\" && plugin.mode !== \"validate\") {\n      throw new Error(\"muon.json plugin.mode has unknown value.\");\n    }\n    options.mode = plugin.mode;\n  }\n  const pages = readOptionalStringArray(plugin, \"pages\", \"plugin.pages\");\n  if (pages !== undefined) {\n    options.pages = pages;\n  }\n\n  const rawPlugins = plugin.plugins;\n  if (rawPlugins !== undefined) {\n    if (!Array.isArray(rawPlugins)) {\n      throw new Error(\"muon.json plugin.plugins must be an array.\");\n    }\n    options.plugins = rawPlugins.map((entry, index) =>\n      readPluginAccessEntryOptions(entry, index),\n    );\n  }\n  return options;\n};\n\ntype EffectivePluginAccessOptions = Required<\n  Pick<MuonPluginAccessOptions, \"mode\" | \"pages\" | \"plugins\">\n> &\n  Pick<MuonPluginAccessOptions, \"path\">;\n\nconst hasImportSourceSelector = (\n  entry: MuonPluginAccessImportOptions,\n): boolean =>\n  (entry.sources !== undefined && entry.sources.length > 0) ||\n  (entry.packages !== undefined && entry.packages.length > 0);\n\nconst validatePluginConfig = (rawConfig: unknown, configPath: string): void => {\n  if (rawConfig === undefined) {\n    return;\n  }\n  if (!isJsonObject(rawConfig)) {\n    throw new Error(`muon.json ${configPath} must be an object.`);\n  }\n  for (const [entryKey, entryValue] of Object.entries(rawConfig)) {\n    if (entryKey.length === 0) {\n      throw new Error(`muon.json ${configPath} key must not be empty.`);\n    }\n    if (containsNul(entryKey)) {\n      throw new Error(`muon.json ${configPath} key must not contain NUL.`);\n    }\n    const valuePath = `${configPath}.${entryKey}`;\n    if (typeof entryValue !== \"string\") {\n      throw new Error(`muon.json ${valuePath} must be a string.`);\n    }\n    if (containsNul(entryValue)) {\n      throw new Error(`muon.json ${valuePath} must not contain NUL.`);\n    }\n  }\n};\n\nconst validatePluginAccessOptions = (\n  resolved: EffectivePluginAccessOptions,\n): EffectivePluginAccessOptions => {\n  for (const [pluginIndex, plugin] of resolved.plugins.entries()) {\n    const pluginPath = `plugin.plugins[${pluginIndex}]`;\n    const signature: unknown = plugin.signature;\n    if (signature !== undefined) {\n      if (typeof signature !== \"string\") {\n        throw new Error(`muon.json ${pluginPath}.signature must be a string.`);\n      }\n      if (!isSha256HexString(signature)) {\n        throw new Error(\n          `muon.json ${pluginPath}.signature must be a 64-character SHA-256 hex string.`,\n        );\n      }\n    }\n    const salt: unknown = plugin.salt;\n    if (salt !== undefined) {\n      if (typeof salt !== \"string\") {\n        throw new Error(`muon.json ${pluginPath}.salt must be a string.`);\n      }\n      if (!isHexByteString(salt)) {\n        throw new Error(\n          `muon.json ${pluginPath}.salt must be a hexadecimal byte string.`,\n        );\n      }\n    }\n    validatePluginConfig(\n      (plugin as { config?: unknown }).config,\n      `${pluginPath}.config`,\n    );\n    if (plugin.name === \"internal\" && plugin.signature !== undefined) {\n      throw new Error(\n        `muon.json ${pluginPath}.signature is not supported for internal plugins.`,\n      );\n    }\n    if (plugin.name === \"internal\" && plugin.salt !== undefined) {\n      throw new Error(\n        `muon.json ${pluginPath}.salt is not supported for internal plugins.`,\n      );\n    }\n    if (plugin.signature !== undefined && plugin.salt === undefined) {\n      throw new Error(\n        `muon.json ${pluginPath}.signature requires ${pluginPath}.salt.`,\n      );\n    }\n    if (resolved.mode === \"validate\") {\n      if (plugin.allow !== undefined) {\n        throw new Error(\n          `muon.json ${pluginPath}.allow is only supported in simple mode; use ${pluginPath}.imports[].allow in validate mode.`,\n        );\n      }\n      if (plugin.imports === undefined) {\n        throw new Error(\n          `muon.json ${pluginPath}.imports is required in validate mode.`,\n        );\n      }\n      if (plugin.imports.length === 0) {\n        throw new Error(\n          `muon.json ${pluginPath}.imports must not be empty in validate mode.`,\n        );\n      }\n\n      for (const [importIndex, entry] of plugin.imports.entries()) {\n        const importPath = `${pluginPath}.imports[${importIndex}]`;\n        if (!hasImportSourceSelector(entry)) {\n          throw new Error(\n            `muon.json ${importPath} requires sources or packages.`,\n          );\n        }\n        if (entry.allow === undefined) {\n          throw new Error(\n            `muon.json ${importPath}.allow is required in validate mode.`,\n          );\n        }\n        if (entry.allow.length === 0) {\n          throw new Error(\n            `muon.json ${importPath}.allow must not be empty in validate mode.`,\n          );\n        }\n      }\n      continue;\n    }\n\n    if (plugin.allow === undefined) {\n      throw new Error(\n        `muon.json ${pluginPath}.allow is required in simple mode.`,\n      );\n    }\n    if (plugin.imports !== undefined) {\n      throw new Error(\n        `muon.json ${pluginPath}.imports is only supported in validate mode.`,\n      );\n    }\n  }\n  return resolved;\n};\n\nconst getValidateImportAllow = (\n  entry: MuonPluginAccessImportOptions,\n  pluginIndex: number,\n  importIndex: number,\n): readonly string[] => {\n  if (entry.allow === undefined || entry.allow.length === 0) {\n    throw new Error(\n      `muon.json plugin.plugins[${pluginIndex}].imports[${importIndex}].allow is required in validate mode.`,\n    );\n  }\n  return entry.allow;\n};\n\nconst getSimplePluginAllow = (\n  plugin: MuonPluginAccessEntryOptions,\n  pluginIndex: number,\n): readonly string[] => {\n  if (plugin.allow === undefined) {\n    throw new Error(\n      `muon.json plugin.plugins[${pluginIndex}].allow is required in simple mode.`,\n    );\n  }\n  return plugin.allow;\n};\n\nconst toCapabilityImports = (\n  plugins: readonly MuonPluginAccessEntryOptions[],\n): readonly MuonCapabilityImportOptions[] =>\n  plugins.flatMap((plugin, pluginIndex) =>\n    (plugin.imports ?? []).map((entry, importIndex) => {\n      if (!hasImportSourceSelector(entry)) {\n        throw new Error(\n          `muon.json plugin.plugins[${pluginIndex}].imports[${importIndex}] requires sources or packages.`,\n        );\n      }\n\n      const rule: MuonCapabilityImportOptions = {\n        allow: getValidateImportAllow(entry, pluginIndex, importIndex),\n        pluginName: plugin.name,\n      };\n      if (entry.sources !== undefined) {\n        rule.sources = entry.sources;\n      }\n      if (entry.packages !== undefined) {\n        rule.packages = entry.packages;\n      }\n      return rule;\n    }),\n  );\n\nconst toValidateRuntimePluginEntries = (\n  plugins: readonly MuonPluginAccessEntryOptions[],\n): readonly MuonRuntimePluginEntryConfig[] =>\n  plugins.map((plugin, pluginIndex) => {\n    const allow: string[] = [];\n    const seenAllow = new Set<string>();\n    for (const [importIndex, entry] of (plugin.imports ?? []).entries()) {\n      for (const functionPath of getValidateImportAllow(\n        entry,\n        pluginIndex,\n        importIndex,\n      )) {\n        if (!seenAllow.has(functionPath)) {\n          seenAllow.add(functionPath);\n          allow.push(functionPath);\n        }\n      }\n    }\n    return {\n      name: plugin.name,\n      ...(plugin.signature === undefined\n        ? {}\n        : { signature: plugin.signature }),\n      ...(plugin.salt === undefined ? {} : { salt: plugin.salt }),\n      ...(plugin.config === undefined ? {} : { config: plugin.config }),\n      allow,\n    };\n  });\n\nconst toSimpleRuntimePluginEntries = (\n  plugins: readonly MuonPluginAccessEntryOptions[],\n): readonly MuonRuntimePluginEntryConfig[] =>\n  plugins.map((plugin, pluginIndex) => ({\n    name: plugin.name,\n    ...(plugin.signature === undefined ? {} : { signature: plugin.signature }),\n    ...(plugin.salt === undefined ? {} : { salt: plugin.salt }),\n    ...(plugin.config === undefined ? {} : { config: plugin.config }),\n    allow: [...getSimplePluginAllow(plugin, pluginIndex)],\n  }));\n\nconst shouldOverlayRuntimePlugins = (\n  resolved: EffectivePluginAccessOptions,\n  override: false | MuonPluginAccessOptions | undefined,\n): boolean =>\n  override !== false &&\n  (override?.plugins !== undefined ||\n    (resolved.mode === \"validate\" && resolved.plugins.length > 0));\n\nconst toRuntimePluginEntries = (\n  resolved: EffectivePluginAccessOptions,\n): readonly MuonRuntimePluginEntryConfig[] =>\n  resolved.mode === \"validate\"\n    ? toValidateRuntimePluginEntries(resolved.plugins)\n    : toSimpleRuntimePluginEntries(resolved.plugins);\n\nconst mergePluginAccessOptions = (\n  base: MuonPluginAccessOptions,\n  override: MuonPluginAccessOptions | undefined,\n): EffectivePluginAccessOptions => ({\n  ...((override?.path ?? base.path) === undefined\n    ? {}\n    : { path: override?.path ?? base.path }),\n  mode: override?.mode ?? base.mode ?? \"validate\",\n  pages: override?.pages ?? base.pages ?? defaultPluginPages,\n  plugins: override?.plugins ?? base.plugins ?? [],\n});\n\nconst createRuntimeOverlay = (\n  root: string,\n  resolved: EffectivePluginAccessOptions,\n  override: false | MuonPluginAccessOptions | undefined,\n): MuonPluginAccessRuntimeOverlay => {\n  if (override === false) {\n    return {};\n  }\n\n  const path =\n    override?.path !== undefined ? resolve(root, override.path) : undefined;\n  const plugins = shouldOverlayRuntimePlugins(resolved, override)\n    ? toRuntimePluginEntries(resolved)\n    : undefined;\n\n  return {\n    pages: resolved.pages,\n    ...(path === undefined ? {} : { path }),\n    ...(plugins === undefined ? {} : { plugins }),\n  };\n};\n\nconst resolveInspectorPluginPath = (\n  root: string,\n  configPath: string | undefined,\n  resolved: EffectivePluginAccessOptions,\n  override: false | MuonPluginAccessOptions | undefined,\n): string => {\n  if (override !== false && override?.path !== undefined) {\n    return resolve(root, override.path);\n  }\n  const basePath = configPath === undefined ? root : resolve(configPath, \"..\");\n  return resolve(basePath, resolved.path ?? \"./plugins\");\n};\n\n/**\n * Resolves public plugin access config from muon.json and Vite overrides.\n *\n * @param input Resolution inputs.\n * @returns Effective plugin access config for bundler integrations.\n */\nexport const resolveMuonPluginAccessOptions = async ({\n  root,\n  configPath,\n  pluginAccess,\n  onConfigReadError,\n}: ResolveMuonPluginAccessOptionsInput): Promise<MuonResolvedPluginAccessOptions> => {\n  const resolvedConfigPath = await resolveMuonConfigPath(root, configPath);\n  let base: MuonPluginAccessOptions = {};\n  if (resolvedConfigPath !== undefined) {\n    try {\n      base = readPluginAccessOptions(\n        await readJsonObjectFile(resolvedConfigPath, \"muon config file\"),\n      );\n    } catch (error) {\n      if (onConfigReadError === undefined) {\n        throw error;\n      }\n      onConfigReadError(error);\n    }\n  }\n\n  if (pluginAccess === false) {\n    const resolved = validatePluginAccessOptions(\n      mergePluginAccessOptions(base, { mode: \"simple\" }),\n    );\n    return {\n      mode: \"simple\",\n      pages: resolved.pages,\n      capabilityOptions: { imports: [] },\n      runtimeOverlay: createRuntimeOverlay(root, resolved, pluginAccess),\n      pluginPath: resolveInspectorPluginPath(\n        root,\n        resolvedConfigPath,\n        resolved,\n        pluginAccess,\n      ),\n      plugins: resolved.plugins,\n    };\n  }\n\n  const resolved = validatePluginAccessOptions(\n    mergePluginAccessOptions(base, pluginAccess),\n  );\n  const capabilityOptions: MuonCapabilityOptions = {\n    imports:\n      resolved.mode === \"validate\" ? toCapabilityImports(resolved.plugins) : [],\n  };\n  return {\n    mode: resolved.mode,\n    pages: resolved.pages,\n    capabilityOptions,\n    runtimeOverlay: createRuntimeOverlay(root, resolved, pluginAccess),\n    pluginPath: resolveInspectorPluginPath(\n      root,\n      resolvedConfigPath,\n      resolved,\n      pluginAccess,\n    ),\n    plugins: resolved.plugins,\n  };\n};\n","// muon - Multi-platform GUI application framework that uses CEF as its backend\n// Copyright (c) Kouji Matsui. (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/muon\n\nimport { execFile } from \"node:child_process\";\nimport { constants } from \"node:fs\";\nimport { access, mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { promisify } from \"node:util\";\n\nimport { getDefaultMuonPrepareTarget } from \"./prepare.js\";\nimport type { MuonCapabilityImportOptions } from \"./capability.js\";\nimport type {\n  MuonPluginAccessEntryOptions,\n  MuonResolvedPluginAccessOptions,\n} from \"./plugin-access.js\";\n\n/**\n * Inputs for collecting external plugin function metadata.\n */\nexport interface MuonPluginFunctionCatalogOptions {\n  /**\n   * Absolute external plugin directory.\n   */\n  pluginPath: string;\n  /**\n   * Effective external plugin entries to inspect.\n   */\n  plugins: readonly MuonPluginAccessEntryOptions[];\n  /**\n   * Process environment used to locate and run the inspector.\n   */\n  environment?: NodeJS.ProcessEnv;\n}\n\ninterface InspectorInputPlugin {\n  name: string;\n  signature?: string;\n  salt?: string;\n  config?: Readonly<Record<string, string>>;\n}\n\ninterface InspectorOutputPlugin {\n  name: string;\n  functions: readonly string[];\n}\n\nconst execFileAsync = promisify(execFile);\nconst moduleDirectory =\n  typeof __dirname === \"string\"\n    ? __dirname\n    : dirname(fileURLToPath(import.meta.url));\n\nconst getInspectorExecutableName = (platform: NodeJS.Platform): string =>\n  platform === \"win32\" ? \"muon-plugin-inspector.exe\" : \"muon-plugin-inspector\";\n\nconst canExecute = async (path: string): Promise<boolean> => {\n  try {\n    await access(path, constants.X_OK);\n    return true;\n  } catch {\n    return false;\n  }\n};\n\nconst resolveMuonPluginInspectorExecutable = async (\n  environment: NodeJS.ProcessEnv,\n): Promise<string> => {\n  const explicit = environment.MUON_PLUGIN_INSPECTOR_PATH;\n  if (explicit !== undefined && explicit !== \"\") {\n    return explicit;\n  }\n\n  const executableName = getInspectorExecutableName(process.platform);\n  const target = getDefaultMuonPrepareTarget(process.platform, process.arch);\n  const builderPath = environment.MUON_BUILDER_PATH;\n  const candidates = [\n    ...(builderPath === undefined || builderPath === \"\"\n      ? []\n      : [join(dirname(builderPath), executableName)]),\n    join(moduleDirectory, \"native\", target, executableName),\n    join(moduleDirectory, \"..\", \"dist\", \"native\", target, executableName),\n  ];\n  for (const candidate of candidates) {\n    if (await canExecute(candidate)) {\n      return candidate;\n    }\n  }\n  return candidates[0] ?? executableName;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n  typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst readInspectorOutput = (source: string): readonly string[] => {\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(source);\n  } catch (error) {\n    const message = error instanceof Error ? error.message : String(error);\n    throw new Error(`muon plugin inspector returned invalid JSON: ${message}`);\n  }\n  if (!isRecord(parsed) || !Array.isArray(parsed.plugins)) {\n    throw new Error(\"muon plugin inspector returned an invalid catalog.\");\n  }\n\n  const functionPaths: string[] = [];\n  for (const plugin of parsed.plugins) {\n    if (\n      !isRecord(plugin) ||\n      typeof plugin.name !== \"string\" ||\n      !Array.isArray(plugin.functions) ||\n      !plugin.functions.every((entry) => typeof entry === \"string\")\n    ) {\n      throw new Error(\n        \"muon plugin inspector returned an invalid plugin entry.\",\n      );\n    }\n    functionPaths.push(\n      ...(plugin as unknown as InspectorOutputPlugin).functions,\n    );\n  }\n  return functionPaths;\n};\n\nconst createInspectorInputPlugin = (\n  plugin: MuonPluginAccessEntryOptions,\n): InspectorInputPlugin => ({\n  name: plugin.name,\n  ...(plugin.signature === undefined ? {} : { signature: plugin.signature }),\n  ...(plugin.salt === undefined ? {} : { salt: plugin.salt }),\n  ...(plugin.config === undefined ? {} : { config: plugin.config }),\n});\n\n/**\n * Collects external plugin public function paths through the native inspector.\n *\n * @param options Inspector invocation options.\n * @returns Public function paths reported by inspected plugins.\n */\nexport const collectMuonPluginFunctionPaths = async ({\n  pluginPath,\n  plugins,\n  environment = process.env,\n}: MuonPluginFunctionCatalogOptions): Promise<readonly string[]> => {\n  if (plugins.length === 0) {\n    return [];\n  }\n\n  const temporaryDirectory = await mkdtemp(join(tmpdir(), \"muon-inspector-\"));\n  const inputPath = join(temporaryDirectory, \"input.json\");\n  try {\n    await writeFile(\n      inputPath,\n      `${JSON.stringify(\n        {\n          path: pluginPath,\n          plugins: plugins.map(createInspectorInputPlugin),\n        },\n        null,\n        2,\n      )}\\n`,\n    );\n    const executablePath =\n      await resolveMuonPluginInspectorExecutable(environment);\n    let stdout: string;\n    try {\n      const result = await execFileAsync(executablePath, [inputPath], {\n        encoding: \"utf8\",\n        env: environment,\n        maxBuffer: 1024 * 1024,\n      });\n      stdout = result.stdout;\n    } catch (error) {\n      const details =\n        isRecord(error) && typeof error.stderr === \"string\"\n          ? error.stderr.trim()\n          : \"\";\n      const message = error instanceof Error ? error.message : String(error);\n      throw new Error(\n        details === \"\"\n          ? `muon plugin inspector failed: ${message}`\n          : `muon plugin inspector failed: ${message}: ${details}`,\n      );\n    }\n    return readInspectorOutput(stdout);\n  } finally {\n    await rm(temporaryDirectory, { recursive: true, force: true });\n  }\n};\n\nconst hasWildcardAllow = (rule: MuonCapabilityImportOptions): boolean =>\n  rule.allow.some((entry) => entry.includes(\"*\"));\n\n/**\n * Collects function paths needed for wildcard validate-mode imports.\n *\n * @param pluginAccess Resolved plugin access configuration.\n * @param environment Process environment used to run the inspector.\n * @returns External plugin public function paths, or an empty catalog.\n */\nexport const collectMuonPluginFunctionPathsForAccess = async (\n  pluginAccess: MuonResolvedPluginAccessOptions,\n  environment: NodeJS.ProcessEnv = process.env,\n): Promise<readonly string[]> => {\n  if (pluginAccess.mode !== \"validate\") {\n    return [];\n  }\n\n  const wildcardPluginNames = new Set(\n    (pluginAccess.capabilityOptions.imports ?? [])\n      .filter(\n        (rule) =>\n          rule.pluginName !== undefined &&\n          rule.pluginName !== \"internal\" &&\n          hasWildcardAllow(rule),\n      )\n      .map((rule) => rule.pluginName),\n  );\n  if (wildcardPluginNames.size === 0) {\n    return [];\n  }\n\n  const plugins = pluginAccess.plugins.filter((plugin) =>\n    wildcardPluginNames.has(plugin.name),\n  );\n  return await collectMuonPluginFunctionPaths({\n    pluginPath: pluginAccess.pluginPath,\n    plugins,\n    environment,\n  });\n};\n","// muon - Multi-platform GUI application framework that uses CEF as its backend\n// Copyright (c) Kouji Matsui. (@kekyo@mi.kekyo.net)\n// Under MIT.\n// https://github.com/kekyo/muon\n\nimport type { Plugin, ResolvedConfig, UserConfig, WatchOptions } from \"vite\";\nimport { isAbsolute, resolve } from \"node:path\";\n\nimport { buildMuonApp, type MuonBuildOptions } from \"./build.js\";\nimport {\n  createMuonCapabilityModuleResolver,\n  type MuonCapabilityModuleResolver,\n  type MuonRuntimePluginConfig,\n} from \"./capability.js\";\nimport {\n  resolveMuonPluginAccessOptions,\n  type MuonPluginAccessEntryOptions,\n  type MuonPluginAccessImportOptions,\n  type MuonPluginAccessOptions,\n  type MuonResolvedPluginAccessOptions,\n} from \"./plugin-access.js\";\nimport { collectMuonPluginFunctionPathsForAccess } from \"./plugin-inspector.js\";\nimport { startMuonViteBrowserBridge } from \"./vite-internals.js\";\nimport {\n  attachMuonVitePluginOptions,\n  attachMuonVitePluginRuntimeState,\n} from \"./vite-options.js\";\nimport { muonBuildSequenceSuppressViteBuildEnvironmentKey } from \"./build-sequence.js\";\nimport { createVitePackagedAssetOptions } from \"./vite-assets.js\";\nimport {\n  createMuonProgressRenderer,\n  type MuonProgressCallback,\n} from \"./progress.js\";\nimport type { MuonWindowsCodeSigningOptions } from \"./windows-code-signing.js\";\n\nexport type {\n  MuonWindowsCodeSigningOptions,\n  MuonWindowsCodeSigningTarget,\n} from \"./windows-code-signing.js\";\n\ntype MuonWatchIgnored = NonNullable<WatchOptions[\"ignored\"]>;\n\ninterface InternalMuonBuildOptions extends MuonBuildOptions {\n  progress?: MuonProgressCallback;\n}\n\nconst getErrorMessage = (error: unknown): string =>\n  error instanceof Error ? error.message : String(error);\n\n/**\n * Windows PE and NSIS resource metadata options.\n */\nexport interface MuonWindowsResourceOptions {\n  /**\n   * Windows-specific icon PNG file path override.\n   *\n   * @remarks Only `.png` files are accepted as app inputs. muon generates the\n   * required Windows `.ico` file automatically when updating PE resources or\n   * creating NSIS installers. Use top-level `iconPath` for a shared static\n   * application icon. Relative paths are resolved from the source that supplied\n   * the option.\n   * @defaultValue Uses top-level `iconPath`, then the packaged `muon-256.png`\n   * icon.\n   */\n  iconPath?: string;\n\n  /**\n   * Product name written to the Windows version resource.\n   *\n   * @defaultValue Uses `windows.resource.productName`, `project.json`,\n   * `package.json`, then the muon launcher name.\n   */\n  productName?: string;\n\n  /**\n   * File description written to the Windows version resource.\n   *\n   * @defaultValue Uses `windows.resource.fileDescription`, `project.json`,\n   * `package.json.description`, then the product name.\n   */\n  fileDescription?: string;\n\n  /**\n   * Company name written to the Windows version resource.\n   *\n   * @defaultValue Uses `windows.resource.companyName`, `project.json`,\n   * `package.json.author`, then `\"Unknown\"`.\n   */\n  companyName?: string;\n\n  /**\n   * Product and file version string.\n   *\n   * @remarks PE fixed version fields are normalized to four numeric parts, so\n   * `1.2.3` becomes `1.2.3.0`. String fields keep the original value.\n   * @defaultValue Uses `windows.resource.version`, `project.json.version`,\n   * `package.json.version`, then `\"0.0.0\"`.\n   */\n  version?: string;\n\n  /**\n   * Legal copyright written to the Windows version resource.\n   *\n   * @defaultValue Uses `windows.resource.copyright`, `project.json`, then\n   * `package.json.copyright` when available.\n   */\n  copyright?: string;\n\n  /**\n   * Windows resource language identifier.\n   *\n   * @defaultValue `1033` (`en-US`).\n   */\n  language?: number;\n\n  /**\n   * Windows version resource code page.\n   *\n   * @defaultValue `1200` (`UTF-16LE`).\n   */\n  codePage?: number;\n}\n\n/**\n * Linux desktop entry metadata options.\n */\nexport interface MuonLinuxDesktopOptions {\n  /**\n   * Desktop entry identifier without the `.desktop` suffix.\n   *\n   * @defaultValue Uses the resolved muon `appId`.\n   */\n  desktopId?: string;\n\n  /**\n   * Application display name.\n   *\n   * @defaultValue Uses `linux.desktop.name`, then `package.json` name.\n   */\n  name?: string;\n\n  /**\n   * Desktop entry comment.\n   *\n   * @defaultValue Uses `linux.desktop.comment`, then `package.json`\n   * description.\n   */\n  comment?: string;\n\n  /**\n   * Linux-specific desktop icon PNG file path override.\n   *\n   * @remarks Only `.png` files are accepted as app inputs. Relative paths are\n   * resolved from the source that supplied the option. Use top-level\n   * `iconPath` for a shared static application icon.\n   * @defaultValue Uses top-level `iconPath`, then the packaged `muon-256.png`\n   * icon when available.\n   */\n  iconPath?: string;\n\n  /**\n   * Desktop menu categories.\n   *\n   * @defaultValue `[\"Utility\"]`.\n   */\n  categories?: readonly string[];\n\n  /**\n   * Whether desktop startup notification is requested.\n   *\n   * @defaultValue `true`.\n   */\n  startupNotify?: boolean;\n}\n\n/**\n * Options for generating muon app distributions after Vite build.\n */\nexport interface MuonViteBuildOptions {\n  /**\n   * Public target identifiers to build.\n   *\n   * @defaultValue Uses every supported target unless `allTargets` is `false`,\n   * then the host target is used.\n   */\n  targets?: readonly string[];\n\n  /**\n   * Build every supported target from the installed package.\n   *\n   * @remarks Set false to build only the host target when `targets` is omitted.\n   * @defaultValue `true` when `targets` is omitted.\n   */\n  allTargets?: boolean;\n\n  /**\n   * File name used for the app launcher.\n   *\n   * @remarks The .exe suffix is added automatically for Windows targets.\n   * @defaultValue The sanitized package name, or `\"muon-app\"` when unavailable.\n   */\n  appName?: string;\n\n  /**\n   * Stable base application identifier used for runtime app identity.\n   *\n   * @remarks Windows target distributions embed `<appId>.<arch>` as their\n   * runtime app identifier. Linux targets embed this value unchanged.\n   *\n   * @defaultValue The sanitized package name, or `\"muon-app\"` when unavailable.\n   */\n  appId?: string;\n\n  /**\n   * Parent directory that receives dist-muon/linux-amd64/ style outputs.\n   *\n   * @defaultValue The Vite project root.\n   */\n  outputRoot?: string;\n\n  /**\n   * muon config path to embed.\n   *\n   * @defaultValue Auto-detects `muon.json5`, `muon.jsonc`, then `muon.json`;\n   * uses an empty config when none exists.\n   */\n  configPath?: string;\n\n  /**\n   * Static application icon PNG file path.\n   *\n   * @remarks The icon is used for Windows PE/NSIS resources, Linux desktop\n   * entries, and the generated initial title bar icon asset. Target-specific\n   * icon paths in `windowsResource` or `linuxDesktop` override this value for\n   * that target.\n   * @defaultValue Uses top-level `muon.json` `iconPath`, `project.json`, then\n   * the packaged `muon-256.png` icon.\n   */\n  iconPath?: string;\n\n  /**\n   * Additional project files copied next to the generated app launcher.\n   *\n   * @remarks When omitted, `package.json` `files` is used as a candidate list.\n   * Only regular files are copied. Asset input paths, `node_modules`, `.git`,\n   * and generated target output directories are excluded. Set an empty array to\n   * disable package.json files fallback.\n   */\n  distributionFiles?: readonly string[];\n\n  /**\n   * Windows PE and NSIS resource metadata.\n   *\n   * @defaultValue Uses CLI options, `muon.json` `windows.resource`,\n   * `project.json`, `package.json`, then muon defaults.\n   */\n  windowsResource?: MuonWindowsResourceOptions;\n\n  /**\n   * Windows code signing command for generated executable artifacts.\n   *\n   * @remarks Uses `muon.json` `windows.codeSigning` when omitted. Set false\n   * to disable `muon.json` code signing.\n   */\n  windowsCodeSigning?: false | MuonWindowsCodeSigningOptions;\n\n  /**\n   * Linux desktop entry metadata.\n   *\n   * @defaultValue Uses CLI options, `muon.json` `linux.desktop`, package\n   * metadata, then muon defaults.\n   */\n  linuxDesktop?: MuonLinuxDesktopOptions;\n\n  /**\n   * Directory containing package runtime/ and native/ folders.\n   *\n   * @defaultValue The installed muon package dist directory.\n   */\n  packageDirectory?: string;\n\n  /**\n   * Asset salt override for deterministic tests.\n   *\n   * @remarks Production builds should omit this option.\n   * @defaultValue A random 16-byte salt.\n   */\n  assetSalt?: Uint8Array;\n}\n\n/**\n * Import-side capability rule for muon plugin virtual modules.\n */\nexport interface MuonVitePluginAccessImportOptions extends MuonPluginAccessImportOptions {}\n\n/**\n * Plugin entry and capability import configuration for muon virtual modules.\n */\nexport interface MuonVitePluginAccessEntryOptions extends MuonPluginAccessEntryOptions {}\n\n/**\n * Plugin access configuration for muon plugin virtual modules.\n */\nexport interface MuonVitePluginAccessOptions extends MuonPluginAccessOptions {\n  /**\n   * Runtime plugin entries and validate-mode import rules.\n   */\n  plugins?: readonly MuonVitePluginAccessEntryOptions[];\n}\n\n/**\n * Options for the muon Vite development plugin.\n */\nexport interface MuonVitePluginOptions {\n  /**\n   * Directory containing muon-core runtime files such as muon-core and plugins.\n   *\n   * @remarks Relative paths are resolved from the Vite project root. When omitted,\n   * the packaged runtime at dist/runtime/<public-target> is used.\n   * @defaultValue The packaged runtime at `dist/runtime/<public-target>`.\n   */\n  muonPath?: string;\n\n  /**\n   * Directory containing CEF files, or a CEF archive root with Release/Resources.\n   *\n   * @remarks Relative paths are resolved from the Vite project root. When omitted,\n   * muon-builder downloads and caches the tested CEF artifact from muonPath.\n   * @defaultValue The tested CEF artifact downloaded and cached by muon-builder.\n   */\n  cefPath?: string;\n\n  /**\n   * Runtime staging directory used for development startup.\n   *\n   * @remarks Relative paths are resolved from the Vite project root.\n   * @defaultValue `.muon/<public-target>`.\n   */\n  stagePath?: string;\n\n  /**\n   * Launch muon automatically during Vite dev startup.\n   *\n   * @remarks This is independent from Vite's server.open browser startup\n   * option. Vite build ignores this option.\n   * @defaultValue `true`\n   */\n  open?: boolean;\n\n  /**\n   * Enable the muon debugger defaults during Vite dev startup.\n   *\n   * @remarks When enabled, the generated development config enables CDP and\n   * binds DevTools to F12. Vite build ignores this option.\n   * @defaultValue `true`\n   */\n  enableDebugger?: boolean;\n\n  /**\n   * Close the Vite dev server when the launched muon process exits.\n   *\n   * @remarks Vite build and `muon run` ignore this option. Recycle exits keep\n   * the Vite dev server running so muon can restart.\n   * @defaultValue `true`\n   */\n  exitWithServer?: boolean;\n\n  /**\n   * Plugin access mode and virtual module capability imports.\n   *\n   * @remarks Omit this option to use the `plugin` section from `muon.json`.\n   * Pass plugin entries with import rules to override `muon.json` and allow\n   * virtual modules such as `muon:executor`. Pass `false` to use simple\n   * window-global exposure.\n   * @defaultValue `muon.json` plugin config, or validate mode with no\n   * capability imports.\n   */\n  pluginAccess?: false | MuonVitePluginAccessOptions;\n\n  /**\n   * Build app distributions from Vite output.\n   *\n   * @remarks Set false to disable the build hook while keeping the development\n   * bridge enabled.\n   * @defaultValue `true` during Vite build.\n   */\n  build?: boolean | MuonViteBuildOptions;\n}\n\n/**\n * Creates a Vite plugin that launches muon during Vite dev startup.\n *\n * @param options muon plugin options used for development startup and build.\n * @returns Vite plugin instance.\n * @defaultValue `options` defaults to `{}`.\n */\nconst muon = (options: MuonVitePluginOptions = {}): Plugin => {\n  let resolvedConfig: ResolvedConfig | undefined = undefined;\n  let capabilityResolver: MuonCapabilityModuleResolver | undefined = undefined;\n  let resolvedPluginAccess: MuonResolvedPluginAccessOptions | undefined =\n    undefined;\n  let loadedCapabilityRuntimePluginConfig: MuonRuntimePluginConfig | undefined =\n    undefined;\n\n  const getRuntimePluginConfig = (): MuonRuntimePluginConfig =>\n    resolveMuonRuntimePluginConfig(capabilityResolver, resolvedPluginAccess);\n\n  const refreshPluginAccess = async (config: ResolvedConfig): Promise<void> => {\n    resolvedPluginAccess = await resolveMuonPluginAccessOptions({\n      root: config.root,\n      configPath: resolveMuonConfigPathForViteCommand(config, options),\n      pluginAccess: options.pluginAccess,\n      ...(config.command === \"serve\"\n        ? {\n            onConfigReadError: (error: unknown): void => {\n              config.logger.warn(\n                `muon project config will be ignored because it could not be read or parsed: ${getErrorMessage(error)}`,\n              );\n            },\n          }\n        : {}),\n    });\n    const pluginFunctionPaths =\n      await collectMuonPluginFunctionPathsForAccess(resolvedPluginAccess);\n    capabilityResolver =\n      resolvedPluginAccess.mode === \"validate\"\n        ? createMuonCapabilityModuleResolver(config.root, {\n            ...resolvedPluginAccess.capabilityOptions,\n            functionPaths: pluginFunctionPaths,\n          })\n        : undefined;\n    loadedCapabilityRuntimePluginConfig = undefined;\n  };\n\n  const refreshRuntimePluginConfig =\n    async (): Promise<MuonRuntimePluginConfig> => {\n      if (resolvedConfig === undefined) {\n        throw new Error(\"muon Vite plugin config was not resolved.\");\n      }\n      await refreshPluginAccess(resolvedConfig);\n      return getRuntimePluginConfig();\n    };\n\n  const plugin: Plugin = {\n    name: \"muon\",\n    config: (config): Omit<UserConfig, \"plugins\"> | null => {\n      if (config.server?.watch === null) {\n        return null;\n      }\n\n      return {\n        server: {\n          watch: createMuonWatchOptions(config.server?.watch),\n        },\n      };\n    },\n    configResolved: async (config): Promise<void> => {\n      resolvedConfig = config;\n      await refreshPluginAccess(config);\n    },\n    resolveId: (source, importer) =>\n      capabilityResolver?.resolveId(source, importer)?.id,\n    load: (id) => {\n      const source = capabilityResolver?.load(id);\n      if (source !== undefined) {\n        loadedCapabilityRuntimePluginConfig = getRuntimePluginConfig();\n      }\n      return source;\n    },\n    configureServer: async (server) => {\n      await startMuonViteBrowserBridge({\n        server,\n        pluginOptions: options,\n        refreshRuntimePluginConfig,\n        platform: process.platform,\n        architecture: process.arch,\n        environment: process.env,\n      });\n    },\n    closeBundle: async () => {\n      if (resolvedConfig === undefined || resolvedConfig.command !== \"build\") {\n        return;\n      }\n      if (\n        process.env[muonBuildSequenceSuppressViteBuildEnvironmentKey] === \"1\"\n      ) {\n        return;\n      }\n      if (options.build === false) {\n        return;\n      }\n\n      const buildOptions =\n        typeof options.build === \"object\" ? options.build : {};\n      const muonBuildOptions = createMuonBuildOptions(\n        resolvedConfig,\n        buildOptions,\n        getRuntimePluginConfig(),\n      );\n      const progressRenderer = createMuonProgressRenderer();\n      (muonBuildOptions as InternalMuonBuildOptions).progress =\n        progressRenderer.report;\n      try {\n        await buildMuonApp(muonBuildOptions);\n      } finally {\n        progressRenderer.flush();\n      }\n    },\n  };\n\n  return attachMuonVitePluginRuntimeState(\n    attachMuonVitePluginOptions(plugin, options),\n    {\n      getResolvedConfig: () => resolvedConfig,\n      getRuntimePluginConfig: () =>\n        resolvedConfig === undefined\n          ? undefined\n          : (loadedCapabilityRuntimePluginConfig ?? getRuntimePluginConfig()),\n    },\n  );\n};\n\nconst isMuonStagingWatchPath = (path: string): boolean => {\n  const normalized = path.replaceAll(\"\\\\\", \"/\");\n  return (\n    normalized === \".muon\" ||\n    normalized.startsWith(\".muon/\") ||\n    normalized.endsWith(\"/.muon\") ||\n    normalized.includes(\"/.muon/\")\n  );\n};\n\nconst mergeMuonWatchIgnored = (\n  ignored: WatchOptions[\"ignored\"] | undefined,\n): MuonWatchIgnored => {\n  const muonIgnored = (path: string): boolean => isMuonStagingWatchPath(path);\n  if (ignored === undefined) {\n    return muonIgnored;\n  }\n  return Array.isArray(ignored)\n    ? [...ignored, muonIgnored]\n    : [ignored, muonIgnored];\n};\n\nconst createMuonWatchOptions = (\n  watch: WatchOptions | undefined,\n): WatchOptions => ({\n  ...(watch ?? {}),\n  ignored: mergeMuonWatchIgnored(watch?.ignored),\n});\n\nconst createMuonBuildOptions = (\n  config: ResolvedConfig,\n  buildOptions: MuonViteBuildOptions,\n  runtimePluginConfig: MuonRuntimePluginConfig,\n): MuonBuildOptions => {\n  const outDir = isAbsolute(config.build.outDir)\n    ? config.build.outDir\n    : resolve(config.root, config.build.outDir);\n  const packagedAssetOptions = createVitePackagedAssetOptions(config.base);\n  const options: MuonBuildOptions = {\n    root: config.root,\n    assetSourcePath: outDir,\n    assetPrefix: packagedAssetOptions.assetPrefix,\n  };\n  if (packagedAssetOptions.browserStartPage !== undefined) {\n    options.browserStartPage = packagedAssetOptions.browserStartPage;\n  }\n\n  if (buildOptions.allTargets !== undefined) {\n    options.allTargets = buildOptions.allTargets;\n  }\n  if (buildOptions.targets !== undefined) {\n    options.targets = buildOptions.targets;\n  }\n  if (buildOptions.appName !== undefined) {\n    options.appName = buildOptions.appName;\n  }\n  if (buildOptions.appId !== undefined) {\n    options.appId = buildOptions.appId;\n  }\n  if (buildOptions.outputRoot !== undefined) {\n    options.outputRoot = buildOptions.outputRoot;\n  }\n  if (buildOptions.configPath !== undefined) {\n    options.configPath = buildOptions.configPath;\n  }\n  if (buildOptions.iconPath !== undefined) {\n    options.iconPath = buildOptions.iconPath;\n  }\n  if (buildOptions.distributionFiles !== undefined) {\n    options.distributionFiles = buildOptions.distributionFiles;\n  }\n  if (buildOptions.windowsResource !== undefined) {\n    options.windowsResource = buildOptions.windowsResource;\n  }\n  if (buildOptions.windowsCodeSigning !== undefined) {\n    options.windowsCodeSigning = buildOptions.windowsCodeSigning;\n  }\n  if (buildOptions.linuxDesktop !== undefined) {\n    options.linuxDesktop = buildOptions.linuxDesktop;\n  }\n  if (buildOptions.packageDirectory !== undefined) {\n    options.packageDirectory = buildOptions.packageDirectory;\n  }\n  if (buildOptions.assetSalt !== undefined) {\n    options.assetSalt = buildOptions.assetSalt;\n  }\n  options.runtimePluginConfig = runtimePluginConfig;\n\n  return options;\n};\n\nconst resolveMuonConfigPathForViteCommand = (\n  config: ResolvedConfig,\n  options: MuonVitePluginOptions,\n): string | undefined => {\n  if (config.command !== \"build\" || typeof options.build !== \"object\") {\n    return undefined;\n  }\n  return options.build.configPath;\n};\n\nconst resolveMuonRuntimePluginConfig = (\n  capabilityResolver: MuonCapabilityModuleResolver | undefined,\n  pluginAccess: MuonResolvedPluginAccessOptions | undefined,\n): MuonRuntimePluginConfig =>\n  pluginAccess?.mode === \"simple\"\n    ? { mode: \"simple\", ...pluginAccess.runtimeOverlay }\n    : {\n        ...(capabilityResolver?.getRuntimePluginConfig() ?? {\n          mode: \"validate\",\n          capabilities: [],\n        }),\n        ...(pluginAccess?.runtimeOverlay ?? {}),\n      };\n\nexport default muon;\n"],"mappings":"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"}