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
- Check the agent's container/process logs — it likely crashed, was OOM-killed, or hung.
- Make the agent send heartbeats well inside timeouts.aliveTimeout (e.g. interval <= aliveTimeout/3).
- Add agent-side supervision/restart (systemd, k8s liveness) so dead agents come back and re-register.
- 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
- Run agents under a supervisor (systemd, Kubernetes) that restarts crashed agents automatically.
- Send agent heartbeats at an interval comfortably below timeouts.aliveTimeout.
- Watch agent memory/CPU to prevent OOM kills and stalls that trigger liveness expiry.
- Alert on this warning to catch hosts with recurring network instability.
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.