{"record":{"id":"3ed04a3474d686bb","repo":"Mintplex-Labs/anything-llm","slug":"no-websocketdebuggerurl-is-chromium-running-3ed04a","errorCode":null,"errorMessage":"No webSocketDebuggerUrl — is Chromium running?","messagePattern":"No webSocketDebuggerUrl — is Chromium running\\?","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"open-computer/services/interface-service/utils/cdp-input.js","lineNumber":77,"sourceCode":"    ws.on(\"message\", handler);\n    ws.send(JSON.stringify(msg));\n  });\n}\n\nfunction sleep(ms) {\n  return new Promise((r) => setTimeout(r, ms));\n}\n\n// Randomized human-like delay between keystrokes\nfunction keystrokeDelay() {\n  return 30 + Math.floor(Math.random() * 60);\n}\n\nasync function main() {\n  const versionRaw = await httpGet(\"http://127.0.0.1:9222/json/version\");\n  const version = JSON.parse(versionRaw);\n  const browserWsUrl = version.webSocketDebuggerUrl;\n  if (!browserWsUrl) throw new Error(\"No webSocketDebuggerUrl — is Chromium running?\");\n\n  const ws = await new Promise((resolve, reject) => {\n    const socket = new WebSocket(browserWsUrl);\n    const t = setTimeout(() => reject(new Error(\"WS connect timeout\")), 5000);\n    socket.on(\"open\", () => { clearTimeout(t); resolve(socket); });\n    socket.on(\"error\", (err) => { clearTimeout(t); reject(err); });\n  });\n\n  try {\n    // Find target page\n    const { targetInfos } = await cdpSend(ws, \"Target.getTargets\");\n    const pages = targetInfos.filter(\n      (t) => t.type === \"page\" && !t.url.startsWith(\"chrome://\") && !t.url.startsWith(\"devtools://\")\n    );\n    if (pages.length === 0) throw new Error(\"No browser pages open.\");\n\n    // Determine target URL filter (always last arg if it doesn't look like a coordinate/text)\n    let targetUrl = \"\";","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/Mintplex-Labs/anything-llm/blob/3aec848f2885144aa8f1e53b9731a04310d5d558/open-computer/services/interface-service/utils/cdp-input.js#L59-L95","documentation":"Identical guard to cdp-eval's, in the cdp-input helper (click/type/key injection): GET http://127.0.0.1:9222/json/version succeeded but the parsed JSON has no webSocketDebuggerUrl, so there is no browser-level WS endpoint to attach Input.* domains to. Something is serving /json/version on 9222, but it is not a fully remote-debuggable Chromium.","triggerScenarios":"Chromium running without --remote-debugging-port while another DevTools-protocol-speaking service owns 9222; headless shells or embedded Chromium builds whose /json/version omits the browser WS URL; managed/enterprise Chromium with the debug WS endpoint stripped.","commonSituations":"The desktop agent's Chromium got replaced by the user's normal browser session; a chromedriver or puppeteer-connected Chrome already bound to 9222 with a single-client WS URL; port 9222 forwarded to a container that only implements part of the DevTools HTTP API.","solutions":["Restart Chromium with --remote-debugging-port=9222 and a dedicated --user-data-dir so the browser WS endpoint is exposed","curl http://127.0.0.1:9222/json/version and confirm webSocketDebuggerUrl is non-empty before invoking click/type/key","Find and stop the squatter on 9222 or move your debug port and update the helper's URL","If a puppeteer/playwright session owns the browser, drive input through that session instead of this helper"],"exampleFix":"# before\nchromium &            # no debugging endpoint -> error\n# after\nchromium --remote-debugging-port=9222 --user-data-dir=/tmp/oc-chrome https://example.com &\nnode cdp-input.js click 100 200","handlingStrategy":"validation","validationCode":"async function cdpInputReady() {\n  const v = await (await fetch('http://127.0.0.1:9222/json/version')).json();\n  return Boolean(v.webSocketDebuggerUrl);\n}\nif (!(await cdpInputReady())) throw new Error('relaunch Chromium: --remote-debugging-port=9222 --user-data-dir=/tmp/oc-chrome');","typeGuard":"function hasDebuggerUrl(v: unknown): v is { webSocketDebuggerUrl: string } {\n  return typeof (v as any)?.webSocketDebuggerUrl === 'string' && (v as any).webSocketDebuggerUrl.length > 0;\n}","tryCatchPattern":"try { await sendInput('click', x, y); } catch (e) { if (/No webSocketDebuggerUrl/.test(e.message)) { await relaunchChromiumWithDebugPort(); await sendInput('click', x, y); } else throw e; }","preventionTips":["Never drive input against the user's daily browser — keep the debug Chromium instance dedicated to the agent","Check /json/version for webSocketDebuggerUrl before every input batch; input has no retry otherwise","Use one shared readiness check for both cdp-eval and cdp-input since they fail identically"],"tags":["chrome","cdp","remote-debugging","input-injection","open-computer"],"backgroundTag":"chrome-remote-debugging-unavailable","analyzedSha":"3aec848f2885144aa8f1e53b9731a04310d5d558","analyzedAt":"2026-08-18T10:02:21.017Z","contentChangedAt":"2026-08-18T10:02:21.017Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}