musistudio/claude-code-router · error

Plugin app URL must be an http(s) URL or a CCR gateway path.

Error message

Plugin app URL must be an http(s) URL or a CCR gateway path.

What it means

Error "Plugin app URL must be an http(s) URL or a CCR gateway path." thrown in musistudio/claude-code-router.

Source

Thrown at packages/electron/src/main/ipc.ts:1130

    ...(id ? { id } : {}),
    name,
    url
  };
}

function normalizePluginAppUrl(value: string | undefined): string {
  const trimmed = value?.trim() || "";
  if (!trimmed) {
    return "";
  }
  if (/^https?:\/\//i.test(trimmed)) {
    return new URL(trimmed).toString();
  }
  if (trimmed.startsWith("//")) {
    throw new Error("Plugin app URL cannot be protocol-relative.");
  }
  if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) {
    throw new Error("Plugin app URL must be an http(s) URL or a CCR gateway path.");
  }
  return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
}

function readPluginPermissions(
  manifest: Record<string, unknown> | undefined,
  packageJson: Record<string, unknown> | undefined
): GatewayPluginPermission[] | undefined {
  const values = [
    manifest?.permissions,
    readRecord(manifest?.ccr)?.permissions,
    readRecord(manifest?.ccrPlugin)?.permissions,
    readRecord(packageJson?.ccr)?.permissions,
    readRecord(packageJson?.ccrPlugin)?.permissions
  ];
  const parsedValues = values.map(parsePluginPermissions).filter((value): value is GatewayPluginPermission[] => Boolean(value));
  return parsedValues.length > 0 ? uniquePluginPermissions(parsedValues.flat()) : undefined;
}

View on GitHub (pinned to 99f24806c6)

When it happens

Trigger: Thrown at packages/electron/src/main/ipc.ts:1130 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of musistudio/claude-code-router@99f24806c6 (2026-08-27). Data as JSON: /api/errors/fc00da1fafbeeb97. Report an issue: GitHub.