{"record":{"id":"17b2790631da45a7","repo":"Mintplex-Labs/anything-llm","slug":"no-websocketdebuggerurl-is-chromium-running","errorCode":null,"errorMessage":"No webSocketDebuggerUrl — is Chromium running?","messagePattern":"No webSocketDebuggerUrl — is Chromium running\\?","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"open-computer/services/interface-service/utils/cdp-eval.js","lineNumber":71,"sourceCode":"      ws.off(\"message\", handler);\n      clearTimeout(timeout);\n      if (parsed.error) {\n        reject(new Error(`CDP error: ${parsed.error.message}`));\n      } else {\n        resolve(parsed.result);\n      }\n    }\n\n    ws.on(\"message\", handler);\n    ws.send(JSON.stringify(msg));\n  });\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    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    let target = pages[pages.length - 1];\n    if (targetUrl) {\n      const match = pages.find(","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/Mintplex-Labs/anything-llm/blob/3aec848f2885144aa8f1e53b9731a04310d5d558/open-computer/services/interface-service/utils/cdp-eval.js#L53-L89","documentation":"Thrown by the cdp-eval helper when GET http://127.0.0.1:9222/json/version returns JSON whose webSocketDebuggerUrl field is missing/empty. That field is only present when the HTTP endpoint is a real Chrome DevTools debugger service; its absence means something answered on port 9222 but it is not a Chromium instance started with remote debugging enabled (or it is a headless shell/older build that omits the browser-level WS URL). The helper needs the browser WS endpoint to send Target.getTargets/attachToTarget.","triggerScenarios":"Chromium launched without --remote-debugging-port=9222 while another service occupies 9222 and returns JSON on /json/version; using chrome --headless=old variants or minimal shells that omit webSocketDebuggerUrl in /json/version; a DevTools-compatible proxy (e.g. chromedriver or a tab-capture server) that serves /json/version without the WS field.","commonSituations":"The open-computer agent expects its own pre-launched Chromium with remote debugging; users kill that instance and open Chrome normally, or another tool (browser extension host, devtools proxy) grabs 9222; corporate Chromium builds with remote debugging disabled by policy.","solutions":["Relaunch Chromium with remote debugging: chromium --remote-debugging-port=9222 --user-data-dir=/tmp/oc-chrome (Chrome 111+ requires a non-default --user-data-dir)","Verify with curl http://127.0.0.1:9222/json/version that webSocketDebuggerUrl is present before retrying","Free port 9222 from whatever else is listening (lsof -i :9222 / netstat) or start Chromium on a free port and update the helper","Disable policies/flags (e.g. --remote-allow-origins=*) that strip the debugger WS endpoint in managed environments"],"exampleFix":"# before: plain launch, /json/version has no webSocketDebuggerUrl\nchromium --no-sandbox &\n# after\nchromium --remote-debugging-port=9222 --user-data-dir=/tmp/oc-chrome --no-first-run &\ncurl -s http://127.0.0.1:9222/json/version | jq .webSocketDebuggerUrl","handlingStrategy":"validation","validationCode":"async function cdpReady() {\n  try {\n    const v = JSON.parse(await (await fetch('http://127.0.0.1:9222/json/version')).text());\n    return typeof v.webSocketDebuggerUrl === 'string' && v.webSocketDebuggerUrl.startsWith('ws');\n  } catch { return false; }\n}\nif (!(await cdpReady())) { /* relaunch Chromium with --remote-debugging-port=9222 --user-data-dir=... */ }","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 evalInPage(expr); } catch (e) { if (/No webSocketDebuggerUrl/.test(e.message)) { await relaunchChromiumWithDebugPort(); await evalInPage(expr); } else throw e; }","preventionTips":["Always launch the agent's Chromium with --remote-debugging-port=9222 and a dedicated --user-data-dir (Chrome 111+ refuses debugging on the default profile)","Gate every CDP helper invocation behind a /json/version webSocketDebuggerUrl check","Reserve port 9222 — don't let chromedriver/puppeteer instances or dev proxies squat it"],"tags":["chrome","cdp","devtools","websocket","remote-debugging","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"}