{"record":{"id":"cfb4b64f06bc0bb4","repo":"tinyhumansai/openhuman","slug":"playwright-daemon-stdin-unavailable","errorCode":null,"errorMessage":"Playwright daemon stdin unavailable","messagePattern":"Playwright daemon stdin unavailable","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/openhuman/tools/impl/browser/playwright_backend.rs","lineNumber":272,"sourceCode":"        .stderr(Stdio::piped());\n    apply_node_cwd(&mut command);\n\n    let mut child = command\n        .spawn()\n        .map_err(|error| {\n            tracing::debug!(\n                error = %error,\n                \"[browser::playwright] failed to spawn backend daemon\"\n            );\n            error\n        })\n        .context(\n            \"Failed to start Playwright backend. Ensure Node.js and the Playwright package are installed.\",\n        )?;\n    let stdin = child\n        .stdin\n        .take()\n        .ok_or_else(|| anyhow::anyhow!(\"Playwright daemon stdin unavailable\"))?;\n    let stdout = child\n        .stdout\n        .take()\n        .ok_or_else(|| anyhow::anyhow!(\"Playwright daemon stdout unavailable\"))?;\n\n    if let Some(stderr) = child.stderr.take() {\n        tokio::spawn(async move {\n            let mut lines = BufReader::new(stderr).lines();\n            while let Ok(Some(line)) = lines.next_line().await {\n                tracing::debug!(\"[browser::playwright] stderr: {line}\");\n            }\n        });\n    }\n\n    tracing::debug!(\"[browser::playwright] backend daemon spawned\");\n    Ok(PlaywrightDaemon {\n        child,\n        stdin,","sourceCodeStart":254,"sourceCodeEnd":290,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/tools/impl/browser/playwright_backend.rs#L254-L290","documentation":"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.","triggerScenarios":"Thrown at src/openhuman/tools/impl/browser/playwright_backend.rs:272 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","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"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}