{"record":{"id":"12a2f1eabe78f626","repo":"google-gemini/gemini-cli","slug":"maximum-number-of-parallel-browser-instances-br","errorCode":null,"errorMessage":"Maximum number of parallel browser instances (${BrowserManager.MAX_PARALLEL_INSTANCES}) reached. Please wait for an existing browser task to complete before starting a new one.","messagePattern":"Maximum number of parallel browser instances \\((.+?)\\) reached\\. Please wait for an existing browser task to complete before starting a new one\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/src/agents/browser/browserManager.ts","lineNumber":174,"sourceCode":"      // Chrome prevents multiple instances from using the same profile, so\n      // concurrent usage would cause \"profile locked\" errors.\n      if (sessionMode === 'persistent' || sessionMode === 'existing') {\n        throw new Error(\n          `Cannot launch a concurrent browser agent in \"${sessionMode}\" session mode. ` +\n            `The browser instance is already in use by another task. ` +\n            `Please run browser tasks sequentially, or switch to \"isolated\" session mode for concurrent browser usage.`,\n        );\n      }\n\n      // Isolated mode: allow parallel instances up to the limit.\n      let inUseCount = 1; // primary is already in-use\n      let suffix = 1;\n      let parallelKey = `${key}:${suffix}`;\n      let parallel = BrowserManager.instances.get(parallelKey);\n      while (parallel?.inUse) {\n        inUseCount++;\n        if (inUseCount >= BrowserManager.MAX_PARALLEL_INSTANCES) {\n          throw new Error(\n            `Maximum number of parallel browser instances (${BrowserManager.MAX_PARALLEL_INSTANCES}) reached. ` +\n              `Please wait for an existing browser task to complete before starting a new one.`,\n          );\n        }\n        suffix++;\n        parallelKey = `${key}:${suffix}`;\n        parallel = BrowserManager.instances.get(parallelKey);\n      }\n      if (!parallel) {\n        parallel = new BrowserManager(config);\n        BrowserManager.instances.set(parallelKey, parallel);\n        debugLogger.log(\n          `Created parallel BrowserManager (key: ${parallelKey})`,\n        );\n      } else {\n        debugLogger.log(\n          `Reusing released parallel BrowserManager (key: ${parallelKey})`,\n        );","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/google-gemini/gemini-cli/blob/5024443c7217464a66e98f80d73172a26440bd8f/packages/core/src/agents/browser/browserManager.ts#L156-L192","documentation":"Thrown by BrowserManager.getInstance in 'isolated' mode after scanning all parallel instance slots (key:suffix) and finding MAX_PARALLEL_INSTANCES (5) already in use. This caps concurrent isolated browser processes.","triggerScenarios":"sessionMode === 'isolated' and the primary plus slots :1..:4 all have inUse===true, so inUseCount reaches MAX_PARALLEL_INSTANCES during the while loop.","commonSituations":"Five or more concurrent browser subagents/tasks fanned out at once; isolated instances not released because of missing finally release(); long-running browser tasks stacking up.","solutions":["Wait for at least one in-flight browser task to complete before launching another.","Lower the fan-out / parallelism of browser tasks to stay under 5 concurrent.","Audit that every browser invocation releases its instance in a finally block; leaked inUse flags exhaust the pool.","Call BrowserManager.resetAll() if the count is stale due to a prior crash, or restart the process."],"exampleFix":"// problematic: fanning out 8 parallel browser subagents\nawait Promise.all(tasks.map(t => browserAgent.run(t))); // >5 concurrent\n\n// fix: limit concurrency to <= MAX_PARALLEL_INSTANCES\nawait pMap(tasks, t => browserAgent.run(t), { concurrency: 4 });","handlingStrategy":"validation","validationCode":"import { BrowserManager } from './browserManager.js';\nfunction countInUse() {\n  let n = 0;\n  for (const inst of BrowserManager.instances.values()) if (inst.isAcquired()) n++;\n  return n;\n}\n// Before launching: assert countInUse() < BrowserManager.MAX_PARALLEL_INSTANCES.","typeGuard":null,"tryCatchPattern":"try {\n  const bm = BrowserManager.getInstance(config);\n} catch (e) {\n  if (e instanceof Error && /Maximum number of parallel/.test(e.message)) {\n    // wait / queue / reduce concurrency\n  }\n  throw e;\n}","preventionTips":["Cap concurrent browser tasks below MAX_PARALLEL_INSTANCES (5).","Ensure every isolated instance is released after use.","Reset stale instances via BrowserManager.resetAll() if counts look wrong."],"tags":["browser","concurrency","resource-limits"],"backgroundTag":null,"analyzedSha":"5024443c7217464a66e98f80d73172a26440bd8f","analyzedAt":"2026-08-12T06:01:53.711Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}