tinyhumansai/openhuman · error · anyhow::Error
Playwright daemon stdin unavailable
Error message
Playwright daemon stdin unavailable
What it means
Guard in start_daemon for the Playwright backend: the daemon process spawned successfully but its stdin pipe could not be taken — the child was not spawned with piped stdin or the handle was already consumed. The Rust side can no longer send commands to the daemon.
Source
Thrown at src/openhuman/tools/impl/browser/playwright_backend.rs:272
.stderr(Stdio::piped());
apply_node_cwd(&mut command);
let mut child = command
.spawn()
.map_err(|error| {
tracing::debug!(
error = %error,
"[browser::playwright] failed to spawn backend daemon"
);
error
})
.context(
"Failed to start Playwright backend. Ensure Node.js and the Playwright package are installed.",
)?;
let stdin = child
.stdin
.take()
.ok_or_else(|| anyhow::anyhow!("Playwright daemon stdin unavailable"))?;
let stdout = child
.stdout
.take()
.ok_or_else(|| anyhow::anyhow!("Playwright daemon stdout unavailable"))?;
if let Some(stderr) = child.stderr.take() {
tokio::spawn(async move {
let mut lines = BufReader::new(stderr).lines();
while let Ok(Some(line)) = lines.next_line().await {
tracing::debug!("[browser::playwright] stderr: {line}");
}
});
}
tracing::debug!("[browser::playwright] backend daemon spawned");
Ok(PlaywrightDaemon {
child,
stdin,View on GitHub (pinned to 7491200858)
Solutions
- Restart the tool/core so the daemon respawns with piped stdio
- Check for another instance holding the daemon
- Report if persistent — the Stdio::piped wiring may be broken
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at src/openhuman/tools/impl/browser/playwright_backend.rs:272 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17).
Data as JSON: /api/errors/cfb4b64f06bc0bb4.
Report an issue: GitHub.