The Steel (steel.dev) backend driver for the MemberJunction Remote Browser channel.
Steel is a browser-as-a-service: a CDP connect endpoint plus a hosted session viewer (with human
takeover), stealth, proxy egress, session recording, persistent contexts, multi-tab, downloads, and
CAPTCHA solving — but no first-party AI-control harness. Steel sessions are driven by MJ's own
computer-use control (or OSS Stagehand-over-CDP). This package contributes the SteelRemoteBrowser
driver that the channel resolves for the "Steel" provider metadata row.
All Remote Browser backends drive the page identically over CDP — the shared
@memberjunction/remote-browser-cdp kit owns that entire control path (action translation,
capability gating, screencast, human takeover, Connect/Disconnect, teardown). A driver subclasses
BaseCdpRemoteBrowserProvider and fills in just one hook:
protected async AcquireSession(ctx): Promise<{ CdpEndpoint: string; Backend: ICdpSessionBackend }>
SteelRemoteBrowser.AcquireSession calls the client's CreateSession and returns its CDP endpoint plus
a small ICdpSessionBackend:
| Backend hook | Steel mapping |
|---|---|
GetLiveViewUrl() |
the hosted session-viewer URL from CreateSession |
InvokeNativeAIControl(intent) |
throws RemoteBrowserCapabilityNotSupportedError('NativeAIControl', 'Steel') — no first-party AI harness |
Release() |
client.ReleaseSession(...) |
Mirrors the "Steel" seed row's SupportedFeatures: LiveView, HumanTakeover, ScreenStreaming, Stealth,
ProxyEgress, SessionRecording, PersistentContext, MultiTab, FileDownloads, CaptchaSolving (plus
RawCdpControl). NativeAIControl is intentionally absent — and the driver enforces that by throwing
when it is invoked.
All Steel I/O goes through ISteelClient, so this package builds and unit-tests with no network, no
real SDK, and no API keys:
export interface ISteelClient {
CreateSession(opts): Promise<{ SessionId: string; CdpEndpoint: string; SessionViewerUrl: string }>;
ReleaseSession(sessionId: string): Promise<void>;
}
The default factory throws until you bind a real one — production must opt in explicitly:
import { SteelRemoteBrowser } from '@memberjunction/remote-browser-steel';
SteelRemoteBrowser.SetClientFactory((config) => new MySteelClientAdapter(config));
Bind ISteelClient to the official steel-sdk:
CreateSession → Steel.sessions.create(...) (session id + CDP websocketUrl + sessionViewerUrl).ReleaseSession → Steel.sessions.release(id).Declare steel-sdk as an optional dependency wherever the production factory is bound — none of the SDK
types leak into this package.
npm install # from the repo root
cd packages/AI/RemoteBrowser/Providers/Steel
npm run build
npm run test
@memberjunction/remote-browser-steel— the Steel (steel.dev) backend driver for the Remote Browser channel.Exports the injectable client seam (ISteelClient + factory types) and the driver (SteelRemoteBrowser), and statically anchors the driver's
@RegisterClassregistration so bundlers cannot tree-shake it away.