Repository navigation
Description
What happens
Using the in-app Browser (right-side FilePanel) in a Desktop session, every page visit appends a new tab. Nothing reuses or closes a tab, so after a few iterations the tab strip is full of identical entries with the same title and the same URL.
On my machine (3.1.10.145, Windows) the persisted tab registry currently holds:
session A: 9 tabs
[0] 合板预检 · Conform Pre-flight http://127.0.0.1:<port>/index.html#/report
[1] 合板预检 · Conform Pre-flight http://127.0.0.1:<port>/index.html#/report
[2] 合板预检 · Conform Pre-flight http://127.0.0.1:<port>/index.html#/report
[3] 合板预检 · Conform Pre-flight http://127.0.0.1:<port>/index.html#/report <-- same URL x4
[4] 合板预检 · Conform Pre-flight http://127.0.0.1:<port2>/index.html#/report
[5] 合板预检 · Conform Pre-flight http://127.0.0.1:<port2>/index.html#/exec
[6] 合板预检 · Conform Pre-flight http://127.0.0.1:<port3>/index.html#/project
[7] 合板预检 · Conform Pre-flight http://127.0.0.1:<port3>/index.html#/scan
[8] 合板预检 · Conform Pre-flight http://127.0.0.1:<port3>/index.html#/colour
session B: 7 tabs, all http://localhost:<port>/home/analysis
The tab strip shows 7 tabs all titled "合板预检 · Conform Pre-flight" — visually indistinguishable from each other.
Steps to reproduce
- Desktop app → open a session → use the in-app Browser on a page you iterate on (a local dev server is easiest:
http://127.0.0.1:<port>/index.html#/report). - In the same session, have the agent look at that page several times (re-check after a change, re-read the report, ...), or open the same link again.
- Look at the Browser tab strip: one new tab per visit, all with the same title and URL.
Expected and actual behavior
Expected: revisiting a URL the Browser already has open focuses/reuses that tab — or at minimum the agent can close the tabs it opened.
Actual: unbounded tab growth, all duplicates. No agent-side way to clean up, and the duplicates are persisted across restarts.
Root cause (from the shipped 3.1.10 main-process bundle)
-
navigaterefuses to reuse a loaded tab.embedded-browser-manager.js→runAgentBrowserAction():if (tool === 'navigate' && hasLoadedBrowserPage(tab.url) && rawArgs.replaceCurrentTab !== true) { throw new Error('CURRENT_TAB_OCCUPIED: Current Browser tab already has a loaded page; retry with open_tab'); }
The tool schema (
builtin-browser-defs.js) tells the model: "Set true only when the user explicitly asked to replace or reuse the currently loaded Browser tab. Omit it for blank tabs and use open_tab to preserve a loaded page." The provider guidance repeats it: "Use navigate only when the current FilePanel tab is absent or blank… use open_tab by default to preserve it." So for any already-loaded tab the model is steered toopen_tab. -
open_tabalways creates a new tab.openAgentTab()callsthis.openTab({ active: false, bounds: OFFSCREEN_BOUNDS, sessionId }), which allocates a freshtabId+WebContentsView, then navigates it and returnsopenedInNewTab: true. There is no lookup for an existing tab with the same URL. -
The agent cannot close tabs.
BROWSER_BROKER_ACTIONS(dist/main/modules/local-runtime/utility/control.js) exposesopen_tabbut noclose_tab. Nothing in the agent tool surface can destroy a tab. -
The "new tab" IPC path only dedupes in-flight calls.
createNewEmbeddedBrowserTab()keeps a pending map keyed bysessionId + initialUrland returns the in-flight promise; sequential opens of the same URL are never deduped against existing tabs. -
Persistence keeps the duplicates.
persistent-browser-registry.js:MAX_PERSISTED_BROWSER_TABS_PER_SESSION = 10,.slice(-10), no URL dedup — up to 10 identical entries are persisted and restored, and older ones are silently dropped.
Net effect: N navigations = N tabs, with no reuse path and no close path.
Suggested fixes (any one helps a lot)
open_tab: if a tab in the session already has the same normalized URL, focus + navigate it in place instead of creating a new one (or add an explicitreusemode).- Add a
close_tabaction, and/or auto-close agent-opened tabs when the turn that opened them ends. - Let
navigatereplace the current tab by default when that tab was opened by the agent rather than by the user. - Dedupe by URL in
PersistentBrowserRegistry, and cap live tabs per session with LRU eviction.
Environment
- Desktop app 3.1.10.145, Windows 11 x64 (10.0.26200)
- In-app Browser provider:
electron-file-panel - Registry file:
%APPDATA%/MiniMax/embedded-browser-tabs.json(electron-store, nameembedded-browser-tabs)
Activity