@browserbasehq/browse-cli 0.5.0-alpha-902ef50 → 0.5.0-alpha-a4ca430
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +179 -6
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -161660,9 +161660,6 @@ var StagehandAPIClient = class {
|
|
|
161660
161660
|
browserbaseSessionID
|
|
161661
161661
|
// browser, TODO for local browsers
|
|
161662
161662
|
}) {
|
|
161663
|
-
if (!modelApiKey) {
|
|
161664
|
-
throw new StagehandAPIError("modelApiKey is required");
|
|
161665
|
-
}
|
|
161666
161663
|
this.modelApiKey = modelApiKey;
|
|
161667
161664
|
this.modelProvider = modelName?.includes("/") ? modelName.split("/")[0] : void 0;
|
|
161668
161665
|
this.region = browserbaseSessionCreateParams?.region;
|
|
@@ -161943,7 +161940,7 @@ var StagehandAPIClient = class {
|
|
|
161943
161940
|
const apiKey = provider && provider !== this.modelProvider ? loadApiKeyFromEnv(provider, this.logger) ?? this.modelApiKey : this.modelApiKey;
|
|
161944
161941
|
return {
|
|
161945
161942
|
modelName: model,
|
|
161946
|
-
apiKey
|
|
161943
|
+
...apiKey ? { apiKey } : {}
|
|
161947
161944
|
};
|
|
161948
161945
|
}
|
|
161949
161946
|
if (!model.apiKey) {
|
|
@@ -161951,7 +161948,7 @@ var StagehandAPIClient = class {
|
|
|
161951
161948
|
const apiKey = provider && provider !== this.modelProvider ? loadApiKeyFromEnv(provider, this.logger) ?? this.modelApiKey : this.modelApiKey;
|
|
161952
161949
|
return {
|
|
161953
161950
|
...model,
|
|
161954
|
-
apiKey
|
|
161951
|
+
...apiKey ? { apiKey } : {}
|
|
161955
161952
|
};
|
|
161956
161953
|
}
|
|
161957
161954
|
return model;
|
|
@@ -162078,7 +162075,7 @@ var StagehandAPIClient = class {
|
|
|
162078
162075
|
"x-bb-session-id": this.sessionId,
|
|
162079
162076
|
// we want real-time logs, so we stream the response
|
|
162080
162077
|
"x-stream-response": "true",
|
|
162081
|
-
"x-model-api-key": this.modelApiKey,
|
|
162078
|
+
...this.modelApiKey ? { "x-model-api-key": this.modelApiKey } : {},
|
|
162082
162079
|
"x-language": "typescript",
|
|
162083
162080
|
"x-sdk-version": STAGEHAND_VERSION
|
|
162084
162081
|
};
|
|
@@ -164650,6 +164647,7 @@ var os3 = __toESM(require("os"));
|
|
|
164650
164647
|
var net2 = __toESM(require("net"));
|
|
164651
164648
|
var import_child_process4 = require("child_process");
|
|
164652
164649
|
var readline = __toESM(require("readline"));
|
|
164650
|
+
var import_ws3 = __toESM(require("ws"));
|
|
164653
164651
|
|
|
164654
164652
|
// package.json
|
|
164655
164653
|
var version3 = "0.5.0";
|
|
@@ -166807,6 +166805,181 @@ networkCmd.command("clear").description("Clear all captured requests").action(as
|
|
|
166807
166805
|
process.exit(1);
|
|
166808
166806
|
}
|
|
166809
166807
|
});
|
|
166808
|
+
var CDP_DEFAULT_DOMAINS = ["Network", "Console", "Runtime", "Log", "Page"];
|
|
166809
|
+
program.command("cdp <url|port>").description(
|
|
166810
|
+
"Attach to a CDP target and stream DevTools protocol events as NDJSON.\nAccepts a WebSocket URL (ws://...) or a bare port number (e.g. 9222).\nOutput is one JSON object per line, suitable for piping to files or jq."
|
|
166811
|
+
).option(
|
|
166812
|
+
"--domain <domains...>",
|
|
166813
|
+
`CDP domains to enable (repeatable). Default: ${CDP_DEFAULT_DOMAINS.join(",")}`
|
|
166814
|
+
).option("--pretty", "Human-readable output instead of JSON").action(
|
|
166815
|
+
async (target, cmdOpts) => {
|
|
166816
|
+
const wsUrl = await resolveWsTarget(target);
|
|
166817
|
+
const domains = cmdOpts.domain ?? CDP_DEFAULT_DOMAINS;
|
|
166818
|
+
const usePretty = cmdOpts.pretty ?? process.stdout.isTTY ?? false;
|
|
166819
|
+
let messageId = 1;
|
|
166820
|
+
const pendingIds = /* @__PURE__ */ new Set();
|
|
166821
|
+
const targetSessionMap = /* @__PURE__ */ new Map();
|
|
166822
|
+
function sendCDP(ws, method, params = {}, sessionId) {
|
|
166823
|
+
const id = messageId++;
|
|
166824
|
+
pendingIds.add(id);
|
|
166825
|
+
const msg = { id, method, params };
|
|
166826
|
+
if (sessionId) msg.sessionId = sessionId;
|
|
166827
|
+
ws.send(JSON.stringify(msg));
|
|
166828
|
+
return id;
|
|
166829
|
+
}
|
|
166830
|
+
function enableDomainsForSession(ws, sessionId) {
|
|
166831
|
+
for (const domain2 of domains) {
|
|
166832
|
+
if (domain2 === "Network") {
|
|
166833
|
+
sendCDP(
|
|
166834
|
+
ws,
|
|
166835
|
+
"Network.enable",
|
|
166836
|
+
{ maxTotalBufferSize: 1e6, maxResourceBufferSize: 1e5 },
|
|
166837
|
+
sessionId
|
|
166838
|
+
);
|
|
166839
|
+
} else {
|
|
166840
|
+
sendCDP(ws, `${domain2}.enable`, {}, sessionId);
|
|
166841
|
+
}
|
|
166842
|
+
}
|
|
166843
|
+
}
|
|
166844
|
+
function writeEvent(message) {
|
|
166845
|
+
try {
|
|
166846
|
+
process.stdout.write(JSON.stringify(message) + "\n");
|
|
166847
|
+
} catch (err) {
|
|
166848
|
+
if (err.code === "EPIPE") process.exit(0);
|
|
166849
|
+
throw err;
|
|
166850
|
+
}
|
|
166851
|
+
}
|
|
166852
|
+
function writePrettyEvent(message) {
|
|
166853
|
+
if (!message.method) return;
|
|
166854
|
+
const params = message.params;
|
|
166855
|
+
let line = `[${message.method}]`;
|
|
166856
|
+
try {
|
|
166857
|
+
switch (message.method) {
|
|
166858
|
+
case "Network.requestWillBeSent": {
|
|
166859
|
+
const req = params?.request;
|
|
166860
|
+
if (req) line += ` ${req.method ?? "?"} ${req.url ?? ""}`;
|
|
166861
|
+
break;
|
|
166862
|
+
}
|
|
166863
|
+
case "Network.responseReceived": {
|
|
166864
|
+
const resp = params?.response;
|
|
166865
|
+
if (resp) line += ` ${resp.status ?? "?"} ${resp.url ?? ""}`;
|
|
166866
|
+
break;
|
|
166867
|
+
}
|
|
166868
|
+
case "Network.loadingFailed": {
|
|
166869
|
+
const errorText = params?.errorText ?? (params?.canceled ? "Canceled" : "Unknown");
|
|
166870
|
+
line += ` ${errorText}`;
|
|
166871
|
+
break;
|
|
166872
|
+
}
|
|
166873
|
+
case "Runtime.consoleAPICalled": {
|
|
166874
|
+
const type = params?.type ?? "log";
|
|
166875
|
+
const args = params?.args ?? [];
|
|
166876
|
+
const text2 = args.map((a2) => a2.description ?? a2.value ?? "").join(" ");
|
|
166877
|
+
line += ` [${type}] ${text2}`;
|
|
166878
|
+
break;
|
|
166879
|
+
}
|
|
166880
|
+
case "Runtime.exceptionThrown": {
|
|
166881
|
+
const detail = params?.exceptionDetails;
|
|
166882
|
+
line += ` ${detail?.exception?.description ?? detail?.text ?? "Unknown exception"}`;
|
|
166883
|
+
break;
|
|
166884
|
+
}
|
|
166885
|
+
case "Page.frameNavigated": {
|
|
166886
|
+
const url2 = params?.frame?.url ?? "";
|
|
166887
|
+
if (url2) line += ` ${url2}`;
|
|
166888
|
+
break;
|
|
166889
|
+
}
|
|
166890
|
+
case "Target.attachedToTarget": {
|
|
166891
|
+
const info = params?.targetInfo;
|
|
166892
|
+
if (info) line += ` [${info.type ?? "?"}] ${info.url ?? ""}`;
|
|
166893
|
+
break;
|
|
166894
|
+
}
|
|
166895
|
+
default:
|
|
166896
|
+
break;
|
|
166897
|
+
}
|
|
166898
|
+
} catch {
|
|
166899
|
+
}
|
|
166900
|
+
try {
|
|
166901
|
+
process.stdout.write(line + "\n");
|
|
166902
|
+
} catch (err) {
|
|
166903
|
+
if (err.code === "EPIPE") process.exit(0);
|
|
166904
|
+
throw err;
|
|
166905
|
+
}
|
|
166906
|
+
}
|
|
166907
|
+
const emit = usePretty ? writePrettyEvent : writeEvent;
|
|
166908
|
+
await new Promise((resolve4) => {
|
|
166909
|
+
const ws = new import_ws3.default(wsUrl);
|
|
166910
|
+
let closed = false;
|
|
166911
|
+
function cleanup() {
|
|
166912
|
+
if (closed) return;
|
|
166913
|
+
closed = true;
|
|
166914
|
+
if (ws.readyState === import_ws3.default.OPEN || ws.readyState === import_ws3.default.CONNECTING) {
|
|
166915
|
+
ws.close();
|
|
166916
|
+
}
|
|
166917
|
+
resolve4();
|
|
166918
|
+
}
|
|
166919
|
+
process.on("SIGINT", cleanup);
|
|
166920
|
+
process.on("SIGTERM", cleanup);
|
|
166921
|
+
ws.on("open", () => {
|
|
166922
|
+
if (usePretty) {
|
|
166923
|
+
process.stderr.write(`Connected to ${wsUrl}
|
|
166924
|
+
`);
|
|
166925
|
+
}
|
|
166926
|
+
sendCDP(ws, "Target.setAutoAttach", {
|
|
166927
|
+
autoAttach: true,
|
|
166928
|
+
flatten: true,
|
|
166929
|
+
waitForDebuggerOnStart: false,
|
|
166930
|
+
filter: [{ type: "page" }]
|
|
166931
|
+
});
|
|
166932
|
+
sendCDP(ws, "Target.setDiscoverTargets", {
|
|
166933
|
+
discover: true,
|
|
166934
|
+
filter: [{ type: "page" }]
|
|
166935
|
+
});
|
|
166936
|
+
});
|
|
166937
|
+
ws.on("message", (raw) => {
|
|
166938
|
+
let data;
|
|
166939
|
+
try {
|
|
166940
|
+
data = JSON.parse(raw.toString());
|
|
166941
|
+
} catch {
|
|
166942
|
+
return;
|
|
166943
|
+
}
|
|
166944
|
+
if (data.id !== void 0 && pendingIds.has(data.id)) {
|
|
166945
|
+
pendingIds.delete(data.id);
|
|
166946
|
+
if (data.error) {
|
|
166947
|
+
process.stderr.write(
|
|
166948
|
+
`CDP error (id=${data.id}): ${data.error.message}
|
|
166949
|
+
`
|
|
166950
|
+
);
|
|
166951
|
+
}
|
|
166952
|
+
return;
|
|
166953
|
+
}
|
|
166954
|
+
if (data.method === "Target.attachedToTarget" && data.params) {
|
|
166955
|
+
const p2 = data.params;
|
|
166956
|
+
if (p2.targetInfo?.type === "page") {
|
|
166957
|
+
targetSessionMap.set(p2.targetInfo.targetId, p2.sessionId);
|
|
166958
|
+
enableDomainsForSession(ws, p2.sessionId);
|
|
166959
|
+
}
|
|
166960
|
+
}
|
|
166961
|
+
if (data.method === "Target.detachedFromTarget" && data.params) {
|
|
166962
|
+
const p2 = data.params;
|
|
166963
|
+
const targetId = p2.targetId ?? [...targetSessionMap.entries()].find(
|
|
166964
|
+
([, sid]) => sid === p2.sessionId
|
|
166965
|
+
)?.[0];
|
|
166966
|
+
if (targetId) targetSessionMap.delete(targetId);
|
|
166967
|
+
}
|
|
166968
|
+
emit(data);
|
|
166969
|
+
});
|
|
166970
|
+
ws.on("error", (err) => {
|
|
166971
|
+
process.stderr.write(`Error: ${err.message}
|
|
166972
|
+
`);
|
|
166973
|
+
});
|
|
166974
|
+
ws.on("close", () => {
|
|
166975
|
+
if (!closed && usePretty) {
|
|
166976
|
+
process.stderr.write("Disconnected.\n");
|
|
166977
|
+
}
|
|
166978
|
+
cleanup();
|
|
166979
|
+
});
|
|
166980
|
+
});
|
|
166981
|
+
}
|
|
166982
|
+
);
|
|
166810
166983
|
program.parse();
|
|
166811
166984
|
/*! Bundled license information:
|
|
166812
166985
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@browserbasehq/browse-cli",
|
|
3
|
-
"version": "0.5.0-alpha-
|
|
3
|
+
"version": "0.5.0-alpha-a4ca430",
|
|
4
4
|
"description": "Browser automation CLI for AI agents, built on Stagehand",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"license": "MIT",
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@types/node": "^20.11.30",
|
|
55
|
+
"@types/ws": "^8.5.13",
|
|
55
56
|
"devtools-protocol": "^0.0.1464554",
|
|
56
57
|
"eslint": "^10.0.2",
|
|
57
58
|
"tsup": "^8.2.1",
|