func Tesses.CrossLang.Shell.UploadPackage(dd)
{
     //crosslang upload-package [--host=HOST --token=TOKEN] [--session=NAME] [PACKAGE_FILE]
            var host=null;
            var token=null;
            var session=null;
            var package=null;
            var nobuild=false;
            each(var flag : dd.Flags)
            {
                if(flag == "help")
                {
                    Console.WriteLine("crosslang upload-package [options] PackageFile");
                    Console.WriteLine();
                    Console.WriteLine("OPTIONS");
                    Console.WriteLine("host: the host (for ci/cd)");
                    Console.WriteLine("token: the token (for ci/cd)");
                    Console.WriteLine("session: if you have multiple sessions logged in pass in session name");
                    Console.WriteLine();
                    Console.WriteLine("Positional:");
                    Console.WriteLine("PackageFile: if specified push the crvm file or if not push the result of the current project");
                    return 0;
                }
            }
            each(var option : dd.Options)
            {
                if(option.Key == "host")
                {
                    host = option.Value;
                }
                if(option.Key == "token")
                {
                    token = option.Value;
                }
                if(option.Key == "session")
                {
                    session = option.Value;
                }
            }
            if(dd.Arguments.Length > 1)
            {
                package = dd.Arguments[1];
            }
            else {
                if(nobuild)
                {
                    throw {Type="NotImplementedException", Message="nobuild on upload-package is not implemented",ToString=(this)=>$"{this.Type} on line: {this.Line}: {this.Message}"};
                }
                else {

                    var pm = new Tesses.CrossLang.PackageManager();
                    pm.Offline = false;
                    var bt = new Tesses.CrossLang.BuildTool(pm);
                    bt.Config = "";
                    bt.AllowFullCompTime = false;
                    package =  bt.BuildProject(".").Output;
                }
            }

            if(TypeOf(host) != "String" || TypeOf(token) != "String")
            {
                if(FS.Local.FileExists(Env.CrossLangConfig / "auth.json"))
                {
                    var json = Json.Decode(FS.ReadAllText(FS.Local,Env.CrossLangConfig / "auth.json"));
                    if(json.Length == 0)
                    {
                        Console.WriteLine("The auth.json file is empty, use crosslang login to login");
                        return 1;
                    }
                    else if(json.Length == 1)
                    {
                        host = json[0].host;
                        token = json[0].token;
                    }
                    else {
                        if(TypeOf(session) != "String")
                        {
                            Console.WriteLine("Multiple entries in auth.json file, session is ambiguous.");
                            Console.WriteLine("Sessions:");
                            each(var item : json)
                            {
                                Console.WriteLine($"{item.name}: {item.host}");
                            }
                            return 1;
                        }
                        else {
                            var found=false;
                            each(var item : json)
                            {
                                if(item.name == session)
                                {
                                    found=true;
                                    host = item.host;
                                    token = item.token;
                                    break;
                                }
                            }
                            if(!found) { 
                                Console.WriteLine($"Could not find session with name: {session}");
                                return 1;
                            }
                        }
                    }
                }
                else { Console.WriteLine("No auth.json file, use crosslang login to login"); return 1;}
            }

            if(TypeOf(host) != "String" || TypeOf(token) != "String")
            {
                Console.WriteLine("You are not logged in, use crosslang login to login");
                return 1;
            }
            var strm = FS.Local.OpenFile(package,"rb");
            if(strm == null)
            {
                Console.WriteLine("Could not open file");
                return 1;
            }
            var req = {
                Method="PUT",
                RequestHeaders = [
                    {Key= "Authorization",Value=$"Bearer {token}"}
                ],
                Body = Net.Http.StreamHttpRequestBody(strm,"application/crvm")
            };
            var http = Net.Http.MakeRequest($"{host.TrimEnd('/')}/api/v1/upload",req);
           
            
            if(http.StatusCode == 204)
            {
                Console.WriteLine("Uploaded package successfully");
            }
            else if(http.ResponseHeaders.TryGetFirst("Content-Type") == "application/json")
            {
                var json = Json.Decode(http.ReadAsString());
                Console.WriteLine($"Failed to upload package, {json.reason.TrimEnd('.')}.");
            }
            else {
                Console.WriteLine($"Failed to upload package.");
            }
             strm.Close();
}