{"record":{"id":"714929420091c8c5","repo":"wavetermdev/waveterm","slug":"invalid-ssh-remote-name-s-w","errorCode":null,"errorMessage":"invalid ssh remote name (%s): %w","messagePattern":"invalid ssh remote name \\((.+?)\\): %w","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/blockcontroller/durableshellcontroller.go","lineNumber":239,"sourceCode":"\tif len(inputUnion.InputData) > 0 {\n\t\tdata.InputData64 = base64.StdEncoding.EncodeToString(inputUnion.InputData)\n\t}\n\treturn jobcontroller.SendInput(context.Background(), data)\n}\n\nfunc (dsc *DurableShellController) startNewJob(ctx context.Context, blockMeta waveobj.MetaMapType, connName string, rtOpts *waveobj.RuntimeOpts) (string, error) {\n\ttermSize := waveobj.TermSize{\n\t\tRows: shellutil.DefaultTermRows,\n\t\tCols: shellutil.DefaultTermCols,\n\t}\n\tif rtOpts != nil && rtOpts.TermSize.Rows > 0 && rtOpts.TermSize.Cols > 0 {\n\t\ttermSize = rtOpts.TermSize\n\t}\n\tcmdStr := blockMeta.GetString(waveobj.MetaKey_Cmd, \"\")\n\tcwd := blockMeta.GetString(waveobj.MetaKey_CmdCwd, \"\")\n\topts, err := remote.ParseOpts(connName)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"invalid ssh remote name (%s): %w\", connName, err)\n\t}\n\tconn := conncontroller.MaybeGetConn(opts)\n\tif conn == nil {\n\t\treturn \"\", fmt.Errorf(\"connection %q not found\", connName)\n\t}\n\tconnRoute := wshutil.MakeConnectionRouteId(connName)\n\tremoteInfo, err := wshclient.RemoteGetInfoCommand(wshclient.GetBareRpcClient(), &wshrpc.RpcOpts{Route: connRoute, Timeout: 2000})\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"unable to obtain remote info from connserver: %w\", err)\n\t}\n\tshellType := shellutil.GetShellTypeFromShellPath(remoteInfo.Shell)\n\tswapToken := makeSwapToken(ctx, ctx, dsc.BlockId, blockMeta, connName, shellType)\n\tsockName := wavebase.GetPersistentRemoteSockName(wstore.GetClientId())\n\trpcContext := wshrpc.RpcContext{\n\t\tProcRoute: true,\n\t\tSockName:  sockName,\n\t\tBlockId:   dsc.BlockId,\n\t\tConn:      connName,","sourceCodeStart":221,"sourceCodeEnd":257,"githubUrl":"https://github.com/wavetermdev/waveterm/blob/a4447c1563b2df285ab89e76c82f91e1a1a49c1e/pkg/blockcontroller/durableshellcontroller.go#L221-L257","documentation":"startNewJob validates the block's connection name via remote.ParseOpts before dialing. This error means the configured conn name is not a valid/known SSH remote identity (bad format or unresolvable remote config). The block cannot determine SSH options for the connection.","triggerScenarios":"Block meta has meta:conn set to a name that fails remote.ParseOpts — misspelled remote name, removed remote profile, or a conn name belonging to a non-SSH scheme where SSH opts parsing is invalid.","commonSituations":"User renamed or deleted an SSH remote profile in settings but old blocks still reference it; typo in conn name; connecting to a wsl:// conn through a code path expecting SSH opts.","solutions":["Verify the block's meta:conn value matches an existing remote profile name.","Re-add the remote in connection settings, then retry Start.","Update the block meta to the correct connection name.","For local/wsl shells, ensure the correct conn type is used instead of an SSH name."],"exampleFix":"// before\nmeta := waveobj.MetaMapType{\"conn\": \"prod-servr\"} // typo, ParseOpts fails\n// after\nmeta := waveobj.MetaMapType{\"conn\": \"prod-server\"} // matches a configured remote","handlingStrategy":"validation","validationCode":"opts, err := remote.ParseOpts(connName)\nif err != nil {\n    return fmt.Errorf(\"conn %q is not a valid ssh remote: %w\", connName, err)\n}","typeGuard":null,"tryCatchPattern":"if err := controller.Start(ctx, meta, rtOpts, false); err != nil {\n    if strings.Contains(err.Error(), \"invalid ssh remote name\") {\n        // prompt user to fix meta:conn in block settings\n    }\n    return err\n}","preventionTips":["Keep remote profile names stable; migrate blocks when renaming","Validate meta:conn against configured remotes before creating terminal blocks","Use a picker of known remotes instead of free-text names"],"tags":["ssh","config","remote","validation"],"backgroundTag":"invalid-remote-name","analyzedSha":"a4447c1563b2df285ab89e76c82f91e1a1a49c1e","analyzedAt":"2026-09-01T15:26:23.972Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}