openclaw/extensions
Viz 4cfc8cd5be
fix(browser): discover CDP websocket from bare ws:// URL before attach (#68715)
* fix(browser): discover CDP websocket from bare ws:// URL before attach

When browser.cdpUrl is set to a bare ws://host:port (no /devtools/ path), ensureBrowserAvailable would call isChromeReachable -> canOpenWebSocket against the URL verbatim. Chrome only accepts WebSocket upgrades at the specific path returned by /json/version, so the handshake failed immediately with HTTP 400. With attachOnly: true, that surfaced as:

  Browser attachOnly is enabled and profile "openclaw" is not running.

even though the CDP endpoint was reachable and the profile was healthy. Reproduced by the new tests in chrome.test.ts and cdp.test.ts (#68027).

Fix: introduce isDirectCdpWebSocketEndpoint(url) — true only when a ws/wss URL has a /devtools/<kind>/<id> handshake path. Route any other ws/wss cdpUrl (including the bare ws://host:port shape) through HTTP /json/version discovery by normalising the scheme via the existing normalizeCdpHttpBaseForJsonEndpoints helper. Apply this in isChromeReachable, getChromeWebSocketUrl, and createTargetViaCdp. Direct WS endpoints with a /devtools/ path are still opened without an extra discovery round-trip.

Fixes #68027

* test(browser): add seeded fuzz coverage for CDP URL helpers

Adds property-based / seeded-fuzz tests for the URL helpers the
attachOnly CDP fix depends on (#68027):

  - isWebSocketUrl
  - isDirectCdpWebSocketEndpoint
  - normalizeCdpHttpBaseForJsonEndpoints
  - parseBrowserHttpUrl
  - redactCdpUrl
  - appendCdpPath
  - getHeadersWithAuth

Follows the existing repo convention (see
src/gateway/http-common.fuzz.test.ts): no fast-check dep, small
mulberry32 PRNG + hand-rolled generators, deterministic per-describe
seeds so failures are reproducible.

Lifts cdp.helpers.ts coverage from 77.77% -> 89.54% statements,
67.9% -> 80.24% branches, 78% -> 90% lines. Remaining uncovered
lines are inside the WS sender internals (createCdpSender,
withCdpSocket, fetchCdpChecked rate-limit branch), which require
integration-style mocks and are unrelated to the attachOnly fix.

* test(browser): drive cdp.helpers/cdp/chrome to 100% coverage

Lifts the three files touched by the #68027 attachOnly fix to 100% statements/branches/functions/lines across the extensions test suite. Adds cdp.helpers.internal.test.ts, cdp.internal.test.ts, and chrome.internal.test.ts covering error paths, branch matrices, CDP session helpers, Chrome spawn/launch/stop flows, and canRunCdpHealthCommand. Defensively unreachable guards are annotated with c8 ignore + inline justifications.

* fix(browser): restore WS fallback for non-/devtools ws:// CDP URLs

When /json/version discovery is unavailable (or returns no
webSocketDebuggerUrl), fall back to treating the original bare ws/wss
URL as a direct WebSocket endpoint. This preserves the #68027 fix for
Chrome's debug port while restoring compatibility with Browserless/
Browserbase-style providers that expose a direct WebSocket root without
a /json/version endpoint.

Priority order for bare ws/wss cdpUrl inputs:
  1. /devtools/<kind>/<id> URL \u2192 direct handshake, no discovery (unchanged)
  2. bare ws/wss root \u2192 try HTTP discovery first; if discovery returns a
     webSocketDebuggerUrl use it; otherwise fall back to the original URL
     as a direct WS endpoint
  3. HTTP/HTTPS URL \u2192 HTTP discovery only, no fallback (unchanged)

Affected call sites: isChromeReachable, getChromeWebSocketUrl,
createTargetViaCdp.

Also renames a misleading test ('still enforces SSRF policy for direct
WebSocket URLs') to accurately describe what it tests: SSRF enforcement
on the navigation target URL, not on the CDP endpoint.

New tests added for all three fallback paths. Coverage remains 100% on
all three touched files (238 tests).

* fix: browser attachOnly bare ws CDP follow-ups (#68715) (thanks @visionik)
2026-04-19 05:43:39 -04:00
..
acpx chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
active-memory fix: align active-memory timeout schema (#68480) (thanks @Bartok9) 2026-04-18 20:31:41 +01:00
alibaba chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
amazon-bedrock chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
amazon-bedrock-mantle chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
anthropic chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
anthropic-vertex chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
arcee chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
bluebubbles chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
brave chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
browser fix(browser): discover CDP websocket from bare ws:// URL before attach (#68715) 2026-04-19 05:43:39 -04:00
byteplus chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
chutes chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
cloudflare-ai-gateway chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
codex chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
comfy chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
copilot-proxy chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
deepgram chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
deepseek chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
device-pair test(plugins): fix sync register call sites 2026-04-17 10:14:00 +05:30
diagnostics-otel chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
diffs chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
discord chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
duckduckgo chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
elevenlabs chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
exa chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
fal chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
feishu chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
firecrawl chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
fireworks chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
github-copilot chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
google chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
googlechat chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
groq chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
huggingface chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
image-generation-core chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
imessage chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
irc chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
kilocode chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
kimi-coding chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
line chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
litellm chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
llm-task chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
lmstudio chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
lobster chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
matrix chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
mattermost chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
media-understanding-core chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
memory-core chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
memory-lancedb chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
memory-wiki chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
microsoft chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
microsoft-foundry chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
minimax chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
mistral chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
moonshot chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
msteams chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
nextcloud-talk chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
nostr chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
nvidia chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
ollama chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
open-prose chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
openai chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
opencode chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
opencode-go chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
openrouter chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
openshell chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
perplexity chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
phone-control test(plugins): fix sync register call sites 2026-04-17 10:14:00 +05:30
qa-channel chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
qa-lab chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
qa-matrix chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
qianfan chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
qqbot chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
qwen chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
runway chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
searxng chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
sglang chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
shared
signal chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
slack chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
speech-core chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
stepfun chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
synology-chat chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
synthetic chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
talk-voice test(plugins): fix sync register call sites 2026-04-17 10:14:00 +05:30
tavily chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
telegram chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
thread-ownership test(plugins): fix sync register call sites 2026-04-17 10:14:00 +05:30
tlon chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
together chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
twitch chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
venice chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
vercel-ai-gateway chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
video-generation-core chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
vllm chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
voice-call chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
volcengine chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
voyage chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
vydra chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
webhooks chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
whatsapp chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
xai chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
xiaomi chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
zai chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
zalo chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
zalouser chore: prepare 2026.4.19-beta.1 release 2026-04-19 02:09:43 +01:00
.npmignore
AGENTS.md Docs: add test performance guardrails 2026-04-17 02:23:49 -04:00
CLAUDE.md
music-generation-providers.live.test.ts
tsconfig.package-boundary.base.json
tsconfig.package-boundary.paths.json
video-generation-providers.live.test.ts fix: bound live video generation smoke 2026-04-14 14:59:01 +01:00