@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 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
- fs2.mkdirSync(dataDir, { recursive: true });
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
- this.context = await browser2.newContext({
1008
- viewport: { width: 1920, height: 1080 },
1009
- ...this.customUserAgent ? { userAgent: this.customUserAgent } : {}
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
- constructor(browser2, localDir = "/tmp") {
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
- sessionManager = new SessionManager(browser, LOCAL_DIR2);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ulpi/browse",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/ulpi-io/browse"
@@ -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
  ```