hunk.code_window:     const index = getWorkspaces().indexOf(workspace);
       return index === -1 ? chalk.white : workspaceColors[index % workspaceColors.length];
   }
   module.exports = {
  
hunk.labels: keep keep keep keep add keep
hunk.after_edit: /**
    * @param {import("concurrently").CloseEvent[]} closeEvents - An array of CloseEvents thrown by concurrently when waiting on a result
    * @param {number} codeOnSignal - Which error code to return when the process is interrupted
    */
   function getExitCode(closeEvents, codeOnSignal = 1) {
       const exitCode = closeEvents.find((event) => !event.killed && event.exitCode > 0)?.exitCode;
       if (typeof exitCode === 'string') {
           return codeOnSignal
       } else {
           return exitCode;
       }
   }
  
hunk.file_path: webapp/scripts/utils.js
hunk.type: add
file: // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
  // See LICENSE.txt for license information.
  
  package app
  
  import (
  	"github.com/mattermost/mattermost/server/public/model"
  )
  
  func (a *App) NotifySelfHostedSignupProgress(progress string, userId string) {
  	// this is an event only the relevant admin should receive.
  	// If there is no progress, there is nothing to report.
  	// If there is no userId, we do not want to mistakenly broadcast to all users.
  	if progress == "" || userId == "" {
  		return
  	}
  	message := model.NewWebSocketEvent(model.WebsocketEventHostedCustomerSignupProgressUpdated, "", "", userId, nil, "")
  	message.Add("progress", progress)
  
  	a.Srv().Platform().Publish(message)
  }
  