hcengineering/platform · warning · TrackInvalidError

No video track found

Error message

No video track found

What it means

The network service in foundations/net/packages/core/src/network.ts runs a checkAlive sweep that compares each registered agent's lastSeen time against timeouts.aliveTimeout. When an agent has been silent longer than the timeout it is logged with this warning, added to deadAgents, and then removed along with its containers. This is an liveness-expiry event, not an internal error.

Source

Thrown at desktop/src/ui/screenShare.ts:140

            if (constraints.video === undefined) {
              log.error('Wrong video options specified')
              throw new Error('Wrong video options specified')
            }

            constraints.video = {
              mandatory: {
                ...(typeof constraints.video === 'boolean' ? {} : constraints.video),
                chromeMediaSource: 'desktop',
                chromeMediaSourceId: val
              }
            } as any

            void window.navigator.mediaDevices.getUserMedia(constraints).then((stream) => {
              const tracks = stream.getVideoTracks()
              if (tracks.length === 0) {
                log.error('No video track found')
                throw new TrackInvalidError('No video track found')
              }
              const screenVideo = new LocalVideoTrack(tracks[0], undefined, false, {
                loggerName: this.roomOptions.loggerName,
                loggerContextCb: () => this.logContext
              })
              screenVideo.source = Track.Source.ScreenShare
              if (options?.contentHint !== undefined) {
                screenVideo.mediaStreamTrack.contentHint = options.contentHint
              }

              const localTracks: Array<LocalTrack> = [screenVideo]
              if (stream.getAudioTracks().length > 0) {
                this.emit(ParticipantEvent.AudioStreamAcquired)
                const screenAudio = new LocalAudioTrack(
                  stream.getAudioTracks()[0],
                  undefined,
                  false,
                  this.audioContext,

View on GitHub (pinned to 63e28dc964)

Solutions

  1. Check the agent's container/process logs — it likely crashed, was OOM-killed, or hung.
  2. Make the agent send heartbeats well inside timeouts.aliveTimeout (e.g. interval <= aliveTimeout/3).
  3. Add agent-side supervision/restart (systemd, k8s liveness) so dead agents come back and re-register.
  4. If agents are legitimately slow, raise timeouts.aliveTimeout in the network service configuration.

Example fix

// before
setInterval(() => reportAlive(), 90_000) // exceeds 60s aliveTimeout
// after
setInterval(() => reportAlive(), 15_000)
Defensive patterns

Strategy: retry

Try / catch

agent.on('removed', async (agentId) => {
  if (await isHealthy(agentId)) {
    await backoffRegister(agentId) // re-register with the network service
  }
})

Prevention

When it happens

Trigger: An agent registered with the network service has not reported in within timeouts.aliveTimeout seconds when the periodic checkAlive (started from the constructor) runs.

Common situations: Agent container crashed or OOM-killed; agent host network interruption; agent process stalled (deadlock, CPU starvation); heartbeat interval configured longer than aliveTimeout; agents running on machines entering sleep.

Related errors


AI-assisted analysis of hcengineering/platform@63e28dc964 (2026-08-29). Data as JSON: /api/errors/bc6643e179b9e276. Report an issue: GitHub.