@ulpi/browse 1.3.0 → 1.3.1
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/browse.cjs +42 -11
- package/package.json +1 -1
- package/skill/references/permissions.md +3 -1
package/dist/browse.cjs
CHANGED
|
@@ -227,10 +227,21 @@ async function launchChrome() {
|
|
|
227
227
|
}
|
|
228
228
|
}
|
|
229
229
|
const port = await pickDebugPort();
|
|
230
|
-
let dataDir;
|
|
231
230
|
const localDir = process.env.BROWSE_LOCAL_DIR || ".browse";
|
|
232
|
-
dataDir = path2.join(localDir, "chrome-data");
|
|
233
|
-
|
|
231
|
+
const dataDir = path2.join(localDir, "chrome-data");
|
|
232
|
+
const realDataDir = getChromeUserDataDir();
|
|
233
|
+
if (realDataDir && !fs2.existsSync(path2.join(dataDir, "Default", "Preferences"))) {
|
|
234
|
+
console.log("[browse] Copying Chrome profile (first-time setup)...");
|
|
235
|
+
fs2.mkdirSync(dataDir, { recursive: true });
|
|
236
|
+
(0, import_child_process.execSync)(`cp -a "${realDataDir}/Default" "${dataDir}/Default"`, { stdio: "pipe", timeout: 3e4 });
|
|
237
|
+
for (const f of ["Local State", "First Run"]) {
|
|
238
|
+
const src = path2.join(realDataDir, f);
|
|
239
|
+
if (fs2.existsSync(src)) fs2.copyFileSync(src, path2.join(dataDir, f));
|
|
240
|
+
}
|
|
241
|
+
console.log("[browse] Profile copied.");
|
|
242
|
+
} else {
|
|
243
|
+
fs2.mkdirSync(dataDir, { recursive: true });
|
|
244
|
+
}
|
|
234
245
|
cleanStaleLock(dataDir);
|
|
235
246
|
const chromeArgs = [
|
|
236
247
|
`--remote-debugging-port=${port}`,
|
|
@@ -1001,13 +1012,30 @@ var init_browser_manager = __esm({
|
|
|
1001
1012
|
* Creates a new BrowserContext on the shared browser.
|
|
1002
1013
|
* This instance does NOT own the browser — close() only closes the context.
|
|
1003
1014
|
*/
|
|
1004
|
-
async launchWithBrowser(browser2) {
|
|
1015
|
+
async launchWithBrowser(browser2, reuseContext = false) {
|
|
1005
1016
|
this.browser = browser2;
|
|
1006
1017
|
this.ownsBrowser = false;
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1018
|
+
if (reuseContext) {
|
|
1019
|
+
const contexts = browser2.contexts();
|
|
1020
|
+
this.context = contexts[0] || await browser2.newContext({
|
|
1021
|
+
viewport: { width: 1920, height: 1080 }
|
|
1022
|
+
});
|
|
1023
|
+
const pages = this.context.pages();
|
|
1024
|
+
if (pages.length > 0) {
|
|
1025
|
+
for (const page of pages) {
|
|
1026
|
+
const tabId = this.nextTabId++;
|
|
1027
|
+
this.wirePageEvents(page);
|
|
1028
|
+
this.pages.set(tabId, page);
|
|
1029
|
+
this.activeTabId = tabId;
|
|
1030
|
+
}
|
|
1031
|
+
return;
|
|
1032
|
+
}
|
|
1033
|
+
} else {
|
|
1034
|
+
this.context = await browser2.newContext({
|
|
1035
|
+
viewport: { width: 1920, height: 1080 },
|
|
1036
|
+
...this.customUserAgent ? { userAgent: this.customUserAgent } : {}
|
|
1037
|
+
});
|
|
1038
|
+
}
|
|
1011
1039
|
await this.newTab();
|
|
1012
1040
|
}
|
|
1013
1041
|
/**
|
|
@@ -8377,9 +8405,11 @@ var init_session_manager = __esm({
|
|
|
8377
8405
|
browser;
|
|
8378
8406
|
localDir;
|
|
8379
8407
|
encryptionKey;
|
|
8380
|
-
|
|
8408
|
+
reuseContext;
|
|
8409
|
+
constructor(browser2, localDir = "/tmp", reuseContext = false) {
|
|
8381
8410
|
this.browser = browser2;
|
|
8382
8411
|
this.localDir = localDir;
|
|
8412
|
+
this.reuseContext = reuseContext;
|
|
8383
8413
|
try {
|
|
8384
8414
|
this.encryptionKey = resolveEncryptionKey(localDir);
|
|
8385
8415
|
} catch {
|
|
@@ -8428,7 +8458,7 @@ var init_session_manager = __esm({
|
|
|
8428
8458
|
fs15.mkdirSync(outputDir, { recursive: true });
|
|
8429
8459
|
const buffers = new SessionBuffers();
|
|
8430
8460
|
const manager = new BrowserManager(buffers);
|
|
8431
|
-
await manager.launchWithBrowser(this.browser);
|
|
8461
|
+
await manager.launchWithBrowser(this.browser, this.reuseContext && this.sessions.size === 0);
|
|
8432
8462
|
let domainFilter = null;
|
|
8433
8463
|
if (allowedDomains) {
|
|
8434
8464
|
const domains = allowedDomains.split(",").map((d) => d.trim()).filter(Boolean);
|
|
@@ -8913,7 +8943,8 @@ async function start() {
|
|
|
8913
8943
|
shutdown();
|
|
8914
8944
|
});
|
|
8915
8945
|
}
|
|
8916
|
-
|
|
8946
|
+
const reuseContext = runtime.name === "chrome";
|
|
8947
|
+
sessionManager = new SessionManager(browser, LOCAL_DIR2, reuseContext);
|
|
8917
8948
|
}
|
|
8918
8949
|
const startTime = Date.now();
|
|
8919
8950
|
const server = nodeServe({
|
package/package.json
CHANGED
|
@@ -47,5 +47,7 @@ Add these rules to `.claude/settings.json` under `permissions.allow` to pre-allo
|
|
|
47
47
|
"Bash(browse doctor:*)", "Bash(browse upgrade:*)",
|
|
48
48
|
"Bash(browse --max-output:*)",
|
|
49
49
|
"Bash(browse handoff:*)", "Bash(browse resume:*)",
|
|
50
|
-
"Bash(browse react-devtools:*)", "Bash(browse profile:*)"
|
|
50
|
+
"Bash(browse react-devtools:*)", "Bash(browse profile:*)",
|
|
51
|
+
"Bash(browse --chrome:*)", "Bash(browse provider:*)",
|
|
52
|
+
"Bash(browse cookie-import:*)", "Bash(browse cookie-export:*)"
|
|
51
53
|
```
|