Skip to content

feat(browser): 受管浏览器支持最小化与后台 session LRU 回收【已审核 PR】 - #1743

Merged
ErlichLiu merged 2 commits into
proma-ai:mainfrom
Andreaseszhang:feat/browser-minimize-202608182333
Aug 19, 2026
Merged

feat(browser): 受管浏览器支持最小化与后台 session LRU 回收【已审核 PR】#1743
ErlichLiu merged 2 commits into
proma-ai:mainfrom
Andreaseszhang:feat/browser-minimize-202608182333

Conversation

@Andreaseszhang

Copy link
Copy Markdown
Contributor

概述

为受管浏览器加入「最小化」能力:点击 Minus 隐藏浏览器面板时保留 WebContents、标签、页面状态与登录态,TabBar 上显示高亮的受管浏览器入口可随时恢复;X 仍是真正的销毁。同时为后台浏览器 session 引入全局 LRU 上限(8 个),防止跨会话长期累积 WebContents 导致内存膨胀。

本次改动同时修复两个生命周期边界问题:

  1. Dialog/Popover/Toast 等 overlay 临时遮挡 BrowserSlot 时不再被 LRU 误回收;只有真正卸载 BrowserSlot 或用户主动最小化后才进入回收候选。
  2. Agent 浏览器操作的保护 lease 覆盖完整生命周期(URL 安全校验、本地预览路径校验、入队、执行、finally 释放),不再只在 tab 操作阶段生效。

改动

  • packages/shared/src/types/agent.ts — 新增 MINIMIZE_BROWSER IPC 消息类型。
  • packages/shared/src/types/browser.tsBrowserViewLayout 新增 preserveSessionOnHide 字段,区分 overlay 临时遮挡与真正卸载。
  • apps/electron/src/main/lib/browser-controller.ts — 核心改动:
    • 新增 MAX_BACKGROUND_BROWSER_SESSIONS = 8 全局上限;
    • minimize(sessionId) 保留 WebContents、清除 presentation、触发 LRU 回收;
    • pruneBackgroundSessions()sessionLastActivityAt LRU 回收,跳过前台、overlay 保护、有 Agent 操作的 session;
    • acquireAgentOperation() / lease 机制:Navigate 与本地预览在异步安全校验前获取 lease,成功、失败、取消均 finally 释放;
    • isBackgroundSession() 显式排除 preserveSessionOnHideactiveAgentOperationCount > 0 的 session。
  • apps/electron/src/main/ipc.ts — 注册 MINIMIZE_BROWSER IPC 路由到 browserController.minimize()
  • apps/electron/src/preload/index.ts — 暴露 minimizeAgentBrowser API。
  • apps/electron/src/renderer/components/browser/BrowserSlot.tsx — overlay 遮挡时发送 preserveSessionOnHide: true;真正卸载时发送 false
  • apps/electron/src/renderer/components/browser/BrowserPanel.tsx — 标题栏新增 Minus 最小化按钮(位于 X 左侧),调用最小化 IPC 并更新 minimized 原子状态。
  • apps/electron/src/renderer/components/tabs/TabBar.tsx — 浏览器入口按钮在有最小化 session 时高亮显示,tooltip 统一为「打开受管浏览器」。
  • apps/electron/src/renderer/atoms/browser-atoms.ts — 新增 browserPanelMinimizedMapAtom
  • apps/electron/src/renderer/components/tabs/MainArea.tsx — 读取 minimized 状态使用 store.get,避免 React 闭包拿到过期值。
  • apps/electron/src/renderer/components/browser/AgentBrowserLinkProvider.tsx — Agent 响应打开链接前清除 minimized 状态。
  • 版本号:@proma/electron 0.17.43、@proma/shared 0.1.60。

测试方法

  1. bun run typecheck(workspace 全量)通过。
  2. bun run --filter='@proma/electron' build:main / build:preload / build:renderer 通过。
  3. git diff --check 无空白错误。
  4. 运行时验证(建议):
    • 打开受管浏览器 → 点 Minus 最小化 → TabBar 浏览器按钮高亮 → 点击恢复,页面状态保留;
    • 最小化 8 个 session 后再最小化第 9 个,最久未使用的最小化 session 被回收(WebContents 关闭,Cookie/LocalStorage 因持久化分区保留);
    • 打开 Dialog/Popover/Toast 遮挡 BrowserSlot 时不触发回收;
    • Agent 执行浏览器操作期间最小化或打开其他 session 不会回收该 session。

备注

  • 回收仅关闭 tab/WebContents,持久化 Electron 分区保留 Cookie 与 LocalStorage,恢复登录态不丢失。
  • 当前未引入 TTL 自动清理;仅在后台 session 数超过 8 时按 LRU 回收(符合之前与用户的决策)。
  • LRU 单位是 Agent 会话的整个浏览器 session,不是单个 tab。
  • 已包含独立 Agent 只读审核建议的修复(overlay 保护 + 完整 lease 覆盖)。

Made with Proma · GitHub

Andreaseszhang and others added 2 commits August 18, 2026 23:34
- 新增 MINIMIZE_BROWSER IPC:最小化保留 WebContents 与页面状态,X 仍为真正销毁
- 全局最多保留 8 个后台浏览器 session,按 LRU 回收,绝不回收前台或有 Agent 操作的 session
- BrowserSlot overlay 临时遮挡时保持回收保护,仅真正卸载或最小化才进入候选
- Agent 浏览器操作 lease 覆盖安全校验、路径校验、排队、执行与 finally 释放
- 浏览器入口 tooltip 统一为「打开受管浏览器」
- 版本号:@proma/electron 0.17.43、@proma/shared 0.1.60

Made-with: Proma
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants