code: function AppMessageListener(message) {
  		if (message.pid) { // get these for run and debug
  			dashboard.pid = message.pid
  			if (message.state === 'run'&& conf.signal) pidlink.getData(dashboard.pid, conf.id, pidLinkListener)
  		}
  		if (message.exit) dashboard.exitCode = message.exit
  		if (message.lastLaunch) dashboard.lastLaunch = message.lastLaunch
  		if (message.state) {
  			dashboard.state = message.state
  			if (message.state === 'stop') {
  				watchers.deactivate() // no restarts on file changes
  				dashboard.pid = 0
  			}
  			if (message.state === 'crash') {
  				// crash notify
  				var previousCrash = dashboard.lastCrash
  				dashboard.lastCrash = message.lastExit
  				dashboard.crashCount++
  				dashboard.pid = 0
  
  				// crash recovery
  				var doRecovery = !previousCrash // true: always retry on first crash
  				if (!doRecovery) { // check duration for subsequent crashes
  					var elapsed = Math.floor((dashboard.lastCrash - previousCrash) / 1000)
  					doRecovery = elapsed >= minSecondsCrashToCrash
  				}
  				if (doRecovery) appLink.recover()
  			}
  			if (message.state === 'run' ||
  				message.state === 'debug' ||
  				message.state === 'crash') {
  				watchers.activate()
  			}
  			updateDashboard()
  		}
  	}
docs: /*
  message from master process' appconduit
  message: object
  top-level keys: state pid lastLaunch exit lastExit
  error-message-isConfig