Skip to content

feat(browser): support direct WebSocket CDP URLs#31085

Merged
steipete merged 15 commits intoopenclaw:mainfrom
shrey150:docs/add-browserbase-section
Mar 8, 2026
Merged

feat(browser): support direct WebSocket CDP URLs#31085
steipete merged 15 commits intoopenclaw:mainfrom
shrey150:docs/add-browserbase-section

Conversation

@shrey150
Copy link
Contributor

@shrey150 shrey150 commented Mar 2, 2026

Summary

  • Problem: Remote CDP providers that use direct WebSocket connections (wss://) instead of HTTP-based /json/version discovery are incompatible with the browser tool. The cdpUrl parser rejects non-HTTP protocols, and all connection paths assume /json/version is available.
  • Why it matters: Cloud browser platforms that expose WebSocket-only CDP endpoints require workarounds or separate plugins instead of the built-in browser tool.
  • What changed: cdpUrl now accepts ws:// and wss:// protocols. When a WebSocket URL is detected, OpenClaw connects directly instead of attempting /json/version HTTP discovery. The legacy browser.cdpUrl config path preserves the full WebSocket URL (including query params like API keys) on the auto-created default profile. Added documentation for WebSocket-based CDP providers.
  • What did NOT change (scope boundary): The existing HTTP-based flow (Browserless, local Chrome, /json/version discovery) is untouched — WebSocket detection only activates for ws:///wss:// URLs. No changes to the Playwright integration path or extension relay.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

User-visible / Behavior Changes

  • browser.profiles.<name>.cdpUrl now accepts ws:// and wss:// URLs in addition to http:// and https://.
  • browser.cdpUrl (legacy single-URL config) also works with wss:// URLs — the full URL including query params is preserved.
  • When a WebSocket URL is provided, OpenClaw connects directly without hitting /json/version.
  • New docs section for configuring direct WebSocket CDP providers.

Security Impact (required)

  • New permissions/capabilities? No
  • Secrets/tokens handling changed? No — API key is passed as a query param, same pattern as existing token auth
  • New/changed network calls? Yes — WebSocket URLs are probed via WS handshake instead of HTTP GET for reachability checks
    • Risk: minimal — the handshake probe uses openCdpWebSocket which already handles auth headers and proxy bypass
  • Command/tool execution surface changed? No
  • Data access scope changed? No
  • SSRF guards are unaffected — navigation URL validation (assertBrowserNavigationAllowed) runs before any connection attempt regardless of CDP protocol.

Repro + Verification

Environment

  • OS: macOS
  • Runtime: Node.js v22
  • Integration: Cloud browser provider with wss:// CDP endpoint

Steps

  1. Set browser.profiles.<name>.cdpUrl to a wss:// endpoint
  2. Start OpenClaw with the profile
  3. Use the browser tool to navigate to a page

Expected

  • OpenClaw connects directly via WebSocket (no /json/version call)
  • Browser tool works normally (navigate, screenshot, etc.)

Actual

  • All browser tests pass (402 passed; 3 pre-existing failures in pw-tools-core.waits-next-download-saves-it.test.ts unrelated to this PR — same failures on main)

Evidence

  • Failing test/log before + passing after
  • Trace/log snippets: empirically confirmed WebSocket handshake succeeds against a live cloud browser endpoint

Test coverage:

Area Tests
isWebSocketUrl helper 4 — ws, wss, http/https rejection, invalid strings
parseHttpUrl WSS support 5 — wss default port, ws default port, explicit port, http/https still work, unsupported protocol rejection
createTargetViaCdp direct WS 3 — target creation skips /json/version, query param preservation, SSRF still enforced
isChromeReachable WS probe 1 — WS URLs probe via handshake, not HTTP fetch
isChromeReachable CDP health 2 — cdpReady success + stale channel detection
Legacy browser.cdpUrl preservation 1 — wss:// URL with query params preserved through default profile resolution

Human Verification (required)

  • Verified scenarios: WebSocket handshake to a live cloud browser endpoint succeeds; all browser tests pass; SSRF guards verified for WS URLs
  • Edge cases checked: HTTP URLs still use /json/version discovery (no regression); WSS URLs skip HTTP discovery; invalid protocols still rejected; query params preserved through WS connection and legacy config path; explicit ports respected
  • What I did not verify: End-to-end browser tool usage with a live session (page navigation, screenshots); zh-CN docs (auto-generated by scripts/docs-i18n)

Compatibility / Migration

  • Backward compatible? Yes — HTTP(S) URLs behave exactly as before
  • Config/env changes? No — existing configs work unchanged; ws:///wss:// is a new option
  • Migration needed? No

Failure Recovery (if this breaks)

  • How to disable/revert this change quickly: Revert the commits; users can use provider-specific plugins as an alternative integration path
  • Files/config to restore: src/browser/config.ts, src/browser/cdp.ts, src/browser/cdp.helpers.ts, src/browser/chrome.ts, docs/tools/browser.md
  • Known bad symptoms reviewers should watch for: Remote CDP profiles with wss:// URLs failing to connect; existing http:///https:// profiles breaking (regression)

Risks and Mitigations

  • Risk: WebSocket-only endpoints don't support HTTP /json/list fallback for tab listing
    • Mitigation: Remote profiles already use the Playwright path for tab operations (!cdpIsLoopbacklistPagesViaPlaywright); HTTP fallback only applies to loopback profiles
  • Risk: Reachability probing for WSS endpoints opens a fresh connection per check
    • Mitigation: Remote profiles are only probed 1–2 times per ensureBrowserAvailable call (not in a polling loop); the probe does a handshake-only check and immediately closes

🤖 AI-assisted PR — Generated with Claude Code

@openclaw-barnacle openclaw-barnacle bot added docs Improvements or additions to documentation size: XS size: S and removed size: XS labels Mar 2, 2026
@shrey150 shrey150 changed the title docs: add Browserbase as hosted remote CDP option feat(browser): support direct WebSocket CDP URLs for Browserbase Mar 2, 2026
@shrey150 shrey150 changed the title feat(browser): support direct WebSocket CDP URLs for Browserbase feat(browser): support direct WebSocket CDP URLs Mar 2, 2026
shrey150 and others added 11 commits March 3, 2026 12:53
Add Browserbase documentation section alongside the existing Browserless
section in the browser docs. Includes signup instructions, CDP connection
configuration, and environment variable setup for both English and Chinese
(zh-CN) translations.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Add Browserbase documentation section alongside the existing Browserless
section in the browser docs. Includes signup instructions, CDP connection
configuration, and environment variable setup.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Rename "Configuration" sub-heading to "Profile setup" to avoid
MD024/no-duplicate-heading conflict with the existing top-level
"Configuration" heading.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Browserbase requires creating a session via their API to get a CDP
connect URL, unlike Browserless which uses a static endpoint. Updated
to show the correct curl-based session creation flow, removed
unverified static WebSocket URL, and added the 5-minute connect
timeout note from official docs.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Browserbase exposes a direct WebSocket connect endpoint that
auto-creates a session, similar to how Browserless works. Simplified
the section to use this static URL pattern instead of requiring
manual session creation via the API.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
- Fix CAPTCHA/stealth/proxy claims: these are Developer plan+ only,
  not available on free tier
- Fix free tier limits: 1 browser hour, 15-min session duration
  (not "60 minutes of monthly usage")
- Add link to pricing page for paid plan details
- Simplify structure to match Browserless section format
- Remove sub-headings to match Browserless section style

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Restore platform-level feature description (CAPTCHA solving, stealth
mode, proxies) without plan-specific pricing gating. Keep free tier
note brief.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Browserbase uses direct WebSocket connections (wss://) rather than the
standard HTTP-based /json/version CDP discovery flow used by Browserless.
This change teaches the browser tool to accept ws:// and wss:// URLs as
cdpUrl values: when a WebSocket URL is detected, OpenClaw connects
directly instead of attempting HTTP discovery.

Changes:
- config.ts: accept ws:// and wss:// in cdpUrl validation
- cdp.helpers.ts: add isWebSocketUrl() helper
- cdp.ts: skip /json/version when cdpUrl is already a WebSocket URL
- chrome.ts: probe WSS endpoints via WebSocket handshake instead of HTTP
- cdp.test.ts: add test for direct WebSocket target creation
- docs/tools/browser.md: update Browserbase section with correct URL
  format and notes

Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Add 12 new tests covering: isWebSocketUrl detection, parseHttpUrl WSS
  acceptance/rejection, direct WS target creation with query params,
  SSRF enforcement on WS URLs, WS reachability probing bypasses HTTP
- Reframe docs section as generic "Direct WebSocket CDP providers" with
  Browserbase as one example — any WSS-based provider works
- Update security tips to mention WSS alongside HTTPS

Co-Authored-By: Claude Opus 4.6 <[email protected]>
Two pre-existing tests still expected ws:// URLs to be rejected by
parseHttpUrl, which now accepts them. Switch the invalid-protocol
fixture to ftp:// and tighten the assertion to match the full
"must be http(s) or ws(s)" error message.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
@shrey150 shrey150 force-pushed the docs/add-browserbase-section branch from c1a05a2 to 0c2713f Compare March 3, 2026 20:55
@shrey150 shrey150 marked this pull request as ready for review March 3, 2026 20:57
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0c2713ff43

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Mar 3, 2026

Greptile Summary

This PR extends the browser tool's CDP connection flow to accept ws:///wss:// URLs directly, enabling cloud browser providers like Browserbase that expose WebSocket-only endpoints (no /json/version HTTP discovery). The change is well-scoped: WebSocket detection is a clean branch in createTargetViaCdp, isChromeReachable, and getChromeWebSocketUrl, and the existing HTTP(S) path is untouched. Test coverage for the new paths is solid (12 new tests covering helpers, config, reachability, and SSRF enforcement).

Key issue to address before merging:

  • cdpProtocol is "http" for wss: URLs — the ternary on line 275 of config.ts only maps https:"https", leaving ws: and wss: both falling through to "http". If a user defines custom profiles with only cdpPort (no explicit cdpUrl) against a global wss:// endpoint, resolveProfile will silently construct http:// URLs via the cdpProtocol fallback, bypassing the entire WebSocket path this PR adds. The default "openclaw" profile is protected by the new legacyCdpUrl workaround, but any other port-only profile would be broken.

Confidence Score: 2/5

  • The PR is safe for typical single-profile WebSocket use cases, but has a protocol inheritance bug that silently breaks custom profiles using only cdpPort against wss:// root endpoints.
  • The WebSocket connection flow itself (helpers, createTargetViaCdp, isChromeReachable, getChromeWebSocketUrl) is correct and well-tested. However, the config resolution layer has a real gap: cdpProtocol on line 275 always produces "http" for WebSocket URLs, causing the fallback URL construction in resolveProfile (line 338) to generate invalid http:// URLs for any custom profile that uses cdpPort without cdpUrl. This is a concrete regression risk for users who define multiple profiles or customize the default one. The default "openclaw" profile is protected, but the API allows other profiles to be broken silently.
  • src/browser/config.ts — specifically the cdpProtocol computation (line 275) and the type definition at line 25, which needs to be extended to support "ws" and "wss".

Last reviewed commit: 93889c0

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Mar 3, 2026

Additional Comments (1)

src/browser/config.ts, line 267
cdpProtocol is not updated for wss: protocol

parseHttpUrl now accepts wss:// and ws:// URLs, but the cdpProtocol derivation only checks for https:. A top-level browser.cdpUrl set to a wss:// address will produce cdpProtocol = "http" instead of "https".

This matters because cdpProtocol is used downstream in resolveProfile to construct URLs for profiles that don't define their own cdpUrl:

// config.ts ~line 330
cdpUrl = `${resolved.cdpProtocol}://${resolved.cdpHost}:${cdpPort}`;

A top-level wss:// cdpUrl would cause those inherited profiles to receive an http:// URL instead of wss://. The fix is to also treat wss: as secure:

  const cdpProtocol = (cdpInfo.parsed.protocol === "https:" || cdpInfo.parsed.protocol === "wss:") ? "https" : "http";

@shrey150
Copy link
Contributor Author

shrey150 commented Mar 3, 2026

@greptileai

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 93889c0eb0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Mar 3, 2026

Additional Comments (1)

src/browser/config.ts, line 275
The cdpProtocol computed on this line only distinguishes between https: and everything else, defaulting all other protocols (including ws: and wss:) to "http":

const cdpProtocol = cdpInfo.parsed.protocol === "https:" ? "https" : "http";

This value is used as a fallback in resolveProfile (line 338) when a profile specifies only cdpPort without an explicit cdpUrl:

cdpUrl = `${resolved.cdpProtocol}://${resolved.cdpHost}:${cdpPort}`;

The problem: If the root config uses a wss:// endpoint and a custom profile defines only cdpPort, the resulting URL will incorrectly be http:// instead of wss://.

Example:

browser:
  cdpUrl: "wss://connect.browserbase.com"
  profiles:
    custom:
      cdpPort: 9999

This would construct http://connect.browserbase.com:9999 instead of wss://connect.browserbase.com:9999, causing the WebSocket detection in createTargetViaCdp to fail and fall back to HTTP /json/version discovery.

The default "openclaw" profile is protected by the legacyCdpUrl workaround (line 175), but explicitly-defined profiles with cdpPort-only config would be broken.

Suggested fix: Extend the cdpProtocol type definition (line 25) to include "ws" | "wss", then update the ternary to preserve WebSocket protocols:

const cdpProtocol = 
  cdpInfo.parsed.protocol === "https:" || cdpInfo.parsed.protocol === "wss:"
    ? (cdpInfo.parsed.protocol === "wss:" ? "wss" : "https")
    : cdpInfo.parsed.protocol === "ws:" ? "ws" : "http";

This ensures custom profiles with cdpPort-only config inherit the correct protocol from the root endpoint.

@shrey150
Copy link
Contributor Author

shrey150 commented Mar 3, 2026

Re: new P2 ("Disallow ws:// loopback cdpUrl in profile parsing") — not a concern in practice.

For remote (non-loopback) profiles, createProfileTabOps.listTabs uses the Playwright path (listPagesViaPlaywright) and never reaches the fetchJson(appendCdpPath(..., "/json/list")) fallback — that branch is only hit for cdpIsLoopback profiles.

No real-world provider exposes a loopback WebSocket CDP endpoint (ws://127.0.0.1:...), so this code path can't be triggered by the configurations this PR enables.

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5daf9a74c0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +270 to +272
const legacyCdpUrl = rawCdpUrl && isWsUrl ? cdpInfo.normalized : undefined;
const profiles = ensureDefaultChromeExtensionProfile(
ensureDefaultProfile(cfg?.profiles, defaultColor, legacyCdpPort, cdpPortRangeStart),
ensureDefaultProfile(cfg?.profiles, defaultColor, legacyCdpPort, cdpPortRangeStart, legacyCdpUrl),

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve ws/wss base protocol for port-only profiles

When browser.cdpUrl is a WebSocket URL, this branch only preserves that full URL for an auto-created default profile; any existing (or additional) profile that has only cdpPort is still resolved via resolveProfile using resolved.cdpProtocol, which currently collapses ws:/wss: to http. In configs like browser.cdpUrl: "wss://..." plus profiles.work.cdpPort, the work profile is silently rewritten to http://host:port, dropping WebSocket semantics and query auth, so CDP connections fail for those profiles.

Useful? React with 👍 / 👎.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same issue addressed in the Greptile thread — port-only profiles inheriting from a global wss:// endpoint is a contrived config. Cloud WS providers use per-session URLs with auth params. Happy to address in a
follow-up if needed.

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 19ead8653e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +100 to +102
if (isWebSocketUrl(cdpUrl)) {
// Direct WebSocket endpoint — probe via WS handshake.
return await canOpenWebSocket(cdpUrl, timeoutMs);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use handshake timeout when probing WebSocket CDP URLs

The new WebSocket branch reuses timeoutMs from isChromeReachable for the WS handshake, but callers treat that value as an HTTP timeout: createProfileAvailability.isHttpReachable passes remoteCdpTimeoutMs (default 1500ms) while WS readiness checks use remoteCdpHandshakeTimeoutMs (default 3000ms). For direct ws/wss providers that need >1.5s to establish a session, ensureBrowserAvailable can now fail early with “Remote CDP … not reachable” even though isChromeCdpReady would succeed with the configured handshake timeout (src/browser/server-context.availability.ts).

Useful? React with 👍 / 👎.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1bc935ee44

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +100 to +102
if (isWebSocketUrl(cdpUrl)) {
// Direct WebSocket endpoint — probe via WS handshake.
return await canOpenWebSocket(cdpUrl, timeoutMs);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Respect WS handshake timeout in reachability checks

For direct ws:///wss:// CDP URLs, isChromeReachable now uses the HTTP timeout argument as the WebSocket handshake timeout, so remote profiles get probed with remoteCdpTimeoutMs (default 1500ms) instead of remoteCdpHandshakeTimeoutMs (default 3000ms). In ensureBrowserAvailable, that first probe gates the whole flow, so providers that need a slower handshake can be reported as unreachable even though the later CDP-ready check would succeed with the configured handshake timeout.

Useful? React with 👍 / 👎.

Comment on lines +132 to +134
const allowed = ["http:", "https:", "ws:", "wss:"];
if (!allowed.includes(parsed.protocol)) {
throw new Error(`${label} must be http(s) or ws(s), got: ${parsed.protocol.replace(":", "")}`);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reject loopback WS CDP URLs until tab ops support them

Allowing ws:/wss: in URL parsing makes loopback WebSocket CDP endpoints pass validation, but loopback tab operations still call HTTP discovery endpoints via fetchJson(appendCdpPath(profile.cdpUrl, ...)); with a ws:// base URL this produces ws://.../json/*, which Node fetch rejects (unknown scheme). That means newly accepted configs (including local Chrome-style webSocketDebuggerUrl values) can pass startup checks and then fail on tab list/focus/close flows. Fresh evidence in this commit is that the profile-creation test switched its invalid protocol case from ws://bad to ftp://bad, confirming WS URLs are now intentionally accepted.

Useful? React with 👍 / 👎.

@shrey150
Copy link
Contributor Author

shrey150 commented Mar 6, 2026

Independent E2E Verification

Tested the integration end-to-end on macOS with a live Browserbase account against build 19ead86.

Config

{
  browser: {
    enabled: true,
    defaultProfile: "browserbase",
    remoteCdpTimeoutMs: 3000,
    remoteCdpHandshakeTimeoutMs: 5000,
    profiles: {
      browserbase: {
        cdpUrl: "wss://connect.browserbase.com?apiKey=<redacted>",
        color: "#F97316",
      },
    },
  },
}

Verified scenarios

  • Default profile resolution: openclaw browser status reports "profile": "browserbase" when no --browser-profile is passed — defaultProfile config is respected
  • Navigate via WSS: openclaw browser navigate https://example.com succeeds, returns a real target ID from the remote Browserbase session
  • Screenshot via WSS: openclaw browser screenshot renders correctly through the remote session (example.com screenshot confirmed)
  • Agent-driven browsing: Agent session using profile browserbase successfully navigated to https://news.ycombinator.com, took screenshots, and extracted page content
  • Agent-driven browsing (no profile specified): With defaultProfile: "browserbase", unqualified browser tool calls route through Browserbase without needing to specify the profile

Edge cases checked

  • Phantom "openclaw" profile is auto-injected by ensureDefaultProfile but does not override defaultProfile: "browserbase"
  • openclaw browser profiles correctly marks browserbase as [default]
  • Query params (API key) preserved through config resolution (confirmed via openclaw browser status showing full WSS URL)

What I did not verify

  • Session timeout / reconnection behavior (long-lived sessions)
  • Concurrent tabs in a single Browserbase session
  • openclaw browser stop behavior for remote profiles (it no-ops correctly, but didn't test session cleanup on Browserbase's side)

This covers the "End-to-end browser tool usage with a live session (page navigation, screenshots)" gap noted in the PR's Human Verification section.

@steipete steipete merged commit 4d904e7 into openclaw:main Mar 8, 2026
28 checks passed
@steipete
Copy link
Contributor

steipete commented Mar 8, 2026

Landed.

PR merge:

Follow-up fix landed on main:

Gate:

  • pnpm check
  • pnpm build
  • pnpm test

Thanks @shrey150!

GordonSH-oss pushed a commit to GordonSH-oss/openclaw that referenced this pull request Mar 9, 2026
jenawant pushed a commit to jenawant/openclaw that referenced this pull request Mar 10, 2026
sauerdaniel pushed a commit to sauerdaniel/openclaw that referenced this pull request Mar 11, 2026
Moshiii pushed a commit to Moshiii/openclaw that referenced this pull request Mar 11, 2026
Moshiii pushed a commit to Moshiii/openclaw that referenced this pull request Mar 11, 2026
dhoman pushed a commit to dhoman/chrono-claw that referenced this pull request Mar 11, 2026
alexey-pelykh pushed a commit to remoteclaw/remoteclaw that referenced this pull request Mar 14, 2026
alexey-pelykh added a commit to remoteclaw/remoteclaw that referenced this pull request Mar 14, 2026
) (#1314)

(cherry picked from commit 9914b48)

Co-authored-by: Peter Steinberger <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Improvements or additions to documentation size: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants