Skip to content

Latest commit

 

History

History

README.md

Stacker 网页对话

管理 ChatGPT(chatgpt.com)、Claude(claude.ai)、Gemini(gemini.google.com)、Grok(grok.com)与 DeepSeek(chat.deepseek.com)网页版对话的浏览器插件:整理、搜索、导出、清理。

原则

  • 数据只存在本机:浏览器的 IndexedDB;连接本机 Stacker 后再同步一份到 Stacker 的数据目录。不上传到任何服务器。
  • 对话管理不读取、不保存任何账号凭证;正文读取和删除都是借用你在浏览器里已经登录的状态,直接调用站点自己的网页接口完成的。网站密码是单独的功能,默认关闭,见「网站密码」。ChatGPT 的访问令牌、Gemini 的页面令牌、DeepSeek 的登录令牌只在该网站页面里的插件脚本内存中临时使用,不写入插件数据。
  • 不读取、不保存账号邮箱。
  • 插件默认只申请上面 5 个网站的访问权限;只有在设置里打开「网站密码」时,才会弹出浏览器自己的授权框,申请访问所有网站,关掉就把这个权限还回去。
  • 插件对网页本身的改动只有一处:选中文字时出现的「存为摘录」按钮。

安装

  1. 构建插件:

    npm run ext:build

    产物在 extension/dist。

  2. 打开浏览器的扩展管理页:Chrome 访问 chrome://extensions,Edge 访问 edge://extensions。

  3. 打开右上角的「开发者模式」。

  4. 点击「加载已解压的扩展程序」,选择 extension/dist 目录。

  5. 插件的 ID 固定为 extension/EXTENSION_ID 文件中的值(由 manifest.json 里内置的 key 决定,每次构建都一样)。

  6. 浏览器可能会提示「已停用以开发者模式加载的扩展」,此时点「保留」即可继续使用。

安装或更新后,已经打开的上述网站页面请刷新一次,插件的内容脚本才会生效。从旧版本更新后,浏览器会请求新增 3 个网站的访问权限。

使用

  1. 打开并登录要管理的网站(未登录时读取和删除都会失败并提示重新登录)。
  2. 点击浏览器工具栏上的插件图标,打开管理页(一个独立标签页)。
  3. 管理页顶部有「刷新」和「打开网站」两个下拉按钮:
    • 「刷新」可以选择单个网站,或选「全部站点」依次刷新;只读取对话标题、时间等索引信息,不读正文,速度快、不消耗额度。没登录或没打开的网站会在结果里单独说明,不影响其他网站。
    • 「打开网站」在新标签页打开对应网站,方便先登录再回来刷新。
  4. 正文(对话内容)按需读取:打开一条对话查看详情、导出、或删除前需要正文时才会去请求;读过的正文会缓存,避免重复请求。
  5. 管理页支持按站点、账号筛选,按文件夹、标签整理,按标题或正文搜索,收藏、加备注。
  6. Alt+Shift+S(可在浏览器快捷键设置里修改)打开一个可拖动、可调整大小的独立小窗口,显示当前浏览器标签页对应的那条对话:打标签、写备注、收藏、查看和管理摘录。
  7. 在网页上选中一段文字,会出现「存为摘录」按钮,点一下把这段文字保存下来(在小窗口的摘录列表里查看)。
  8. 右上角的齿轮里可以改「外观」(跟随系统 / 深色 / 浅色)和「语言」(跟随浏览器 / 中文 / English)。默认跟随系统明暗、跟随浏览器语言;系统在使用中切换明暗,插件页面会立刻跟着变,不用刷新。语言只影响插件自己的页面;外观在连接 Stacker 后与主程序共用一个设置(见「连接 Stacker」)。

界面

管理页和小窗用 Ant Design 6 搭建,配色沿用 Stacker 主程序(橙色主色、同一套灰阶),深浅两套都有,所以两边看起来是同一个产品。

  • 管理页分三栏:左侧文件夹与标签、中间对话表格、右侧对话详情。窗口宽度小于 1180 像素时,详情改为从右侧滑出的抽屉,表格不会被挤窄。
  • 需要等待的操作(刷新、读取正文、导出、从 Stacker 恢复)会弹出带遮罩的进度框,防止误操作。
  • 删除、新建文件夹、改名等都用对话框,不再使用浏览器自带的 alert / confirm / prompt。

开发时想调界面又不想反复加载插件,可以用预览页:

npm run ext:preview

浏览器打开 http://localhost:5173/preview.html 看管理页,preview.html?page=popup 看小窗。预览用示例数据和假的 chrome.* 接口,只用于看样式,不参与构建。

已实测与未实测的站点

站点 状态 刷新、读取、搜索、整理、导出 删除
ChatGPT 已实测 可以 可以
Claude 已实测 可以 可以
Gemini 已实测 可以 可以
Grok 已实测 可以 可以
DeepSeek 已实测 可以 可以

五个站点都已在真实账号上核对过列表、正文和删除接口。以后新加的站点在核对之前会标为「未实测」:可以刷新、读取和导出,但不能删除,删除对话框会列出它们并说明原因。

各站点的差异:

  • Gemini:只支持浏览器里默认的 Google 账号(gemini.google.com/app,不含 /u/1/ 这类其他已登录账号)。列表只给出最近活动时间,所以创建时间与更新时间相同。账号显示为「Gemini」(不读邮箱就拿不到账号名,可以在管理页「改备注名」)。置顶的对话可能不在列表中,此时刷新后本地会把它显示为「已删除」——它并没有在网站上被删除,只是列表没有给出。Gemini 没有归档。
  • Grok:账号以网站的 x-userid Cookie 区分,没有时显示为 default。对话有多个分支(重新生成过)时,只取当前显示的那条。
  • DeepSeek:读取正文时只保存提问和回答,不包含「深度思考」的内容。DeepSeek 的删除接口不管删没删掉都回「成功」,所以插件删完会再读一次那条对话:还读得到就报「该网站接口已变化」并停下,不会把没删掉的当成已删除。

导出

选中一条或多条对话后可以「导出精简版」(仅用户和助手的正文)或「导出完整版」(包含角色、时间、附件文件名等完整信息),导出为 Markdown 文件,保存到系统下载目录下的 Stacker 网页对话/<站点>/ 文件夹,按日期、标题和对话 ID 命名,不会询问保存位置。

连接 Stacker 后,导出文件改存到 Stacker 的导出目录 %LOCALAPPDATA%\Stacker\stable\conversations\exports\web\<站点>\(同名时自动加「 (1)」);未连接时照旧存到下载目录。

删除

选中要删除的对话后点「删除…」,可以选择:

  • 精简导出后删除(默认):先把正文存成 Markdown,再删除网站上的对话。
  • 完整备份后删除:先保存当前分支的完整 Markdown(含工具消息和附件名),并把同样的消息另存为 JSON,再删除网站上的对话。不保存网站接口的原始数据。
  • 直接删除:不留任何副本,需要二次确认。

删除过程中:

  • 只删除已实测站点、当前浏览器已登录账号下的对话;选中的对话如果属于其他账号,会被跳过,并提示先在网站上切换账号;属于未实测站点的对话不会被删除。
  • 每处理 20 条会重新核对一次当前登录账号,账号在中途被切换会立刻停止继续删除那些不属于新账号的对话。
  • 请求之间会自动限速;遇到网站返回「请求过于频繁」会自动退避重试。
  • 删除中可以点「中止」随时停止,已经处理的条目不会回滚。
  • 删除完成后会显示每一条的结果(成功、失败、跳过及原因)。

网站密码

在管理页右上角齿轮里打开「网站密码」(浏览器会询问是否允许插件访问所有网站)。之后:

  • 在网站上登录提交后,页面右上角出现「保存到 Stacker 密钥保管?」:保存、保存并允许填充、不保存、此网站不再询问。登录后跳到别的页面也没关系,三分钟内回到同一网站的下一个页面会接着问。
  • 保存的登录先交给 Windows 凭据管理器暂存,Stacker 的密钥保管下次解锁时(或开着时每几秒)收进去:同一网站同一账号算同一条,密码变了就更新,旧密码留在历史里。保管库里打着「浏览器」标签。
  • 只有「允许填充」、也就是在 Stacker 里放进了 Windows 凭据的登录,才会在登录页的账号或密码框下面列出来;点一下才填,从不自动填入。
  • 插件从不读取浏览器自己保存的密码。已经存在浏览器里的密码,用 Stacker 密钥保管的「导入浏览器密码」一次性导入。
  • 需要 Stacker 已连接这个浏览器(见下一节)。

连接 Stacker

插件可以完全单独使用。本机装有 Stacker 时,可以把两者连接起来:

  1. 在 Stacker 打开「会话数据 → 设置 → 浏览器插件」,看到插件文件夹位置(安装版 Stacker 自带插件,位于程序目录下的 extension)。
  2. 用这个文件夹按上面的「安装」步骤加载插件(已经加载过 extension/dist 的也可以继续用)。
  3. 在同一处点对应浏览器的「连接」。Stacker 会在当前用户的注册表写入 HKCU\Software\Google\Chrome\NativeMessagingHosts\com.stacker.webchat(Edge 为 HKCU\Software\Microsoft\Edge\NativeMessagingHosts\com.stacker.webchat),并在数据目录保存登记文件 native-messaging\com.stacker.webchat.json。
  4. 回到 chrome://extensions(或 edge://extensions)点插件的「重新加载」。

连接后:

  • 管理页顶部显示「已连接 Stacker · 待同步 N 项」;连不上时显示「未连接 Stacker」,插件照常单独工作,可点「重新连接」重试。
  • 每次改动(刷新列表、读取正文、文件夹、标签、收藏、备注、账号备注名、摘录、删除)都先记入插件的待同步队列,连接时自动小批量推送给 Stacker;推送失败的留在队列里下次再推,不会丢。
  • 同步的内容:账号内部编号与备注名、对话列表与整理字段、已读取的正文、文件夹、摘录。不同步任何凭证,不保存邮箱。
  • Stacker「会话数据 → 网页对话」可以查看、搜索(含正文)这些对话,并用本机智能体生成摘要。
  • 「从 Stacker 恢复」:重装浏览器或插件后,一键找回账号备注名、文件夹、标签、收藏、备注和摘录;这台浏览器里较新的修改会保留。
  • 浏览器只在需要同步时启动 Stacker 的后台程序(stacker.exe,不打开窗口),空闲 2 分钟后自动断开。
  • 在 Stacker 点「断开」会删除注册表项;两个浏览器都断开后删除登记文件。
  • 打开一条对话时,详情下方会列出 Stacker 对它的提炼结果(经验问答、领域要求、提示词、skill 草稿),只能查看;提炼在 Stacker 的「会话数据 → 提炼」里发起。
  • 外观两边保持一致:连接后谁改都行,管理页、小窗和 Stacker 主窗口跟着同一个设置走(存在 Stacker 的 settings.json,几秒内同步)。断开时各改各的,下次连上以 Stacker 的为准。
  • 管理页或小窗打开时会保持连接(外观和待同步项都靠它),所以打开小窗也可能唤起后台的 stacker.exe。

开发时可以不经浏览器直接检查桥接程序:node scripts/webchat-bridge-probe.mjs src-tauri/target/debug/stacker.exe(只读);加 --write 并把环境变量 STACKER_WEBCHAT_DIR 指向一个临时目录,可以把示例数据写到那个目录里检查。浏览器正在使用调试版 stacker.exe 时重新编译可能因文件被占用而失败,关掉管理页等 2 分钟或在 chrome://extensions 停用插件即可。

站点接口变化时的表现

这 5 个网站用的都是网站自己的私有接口,不是公开 API。如果网站改版导致某个接口返回的数据结构和插件预期的不一样,插件会立刻停止当前操作(刷新、读取、删除等),并提示「该网站接口已变化,已停止操作,等待插件更新」,不会继续按错误的数据处理,也不会误删。遇到这种情况请等待插件更新后重试。

打包

npm run ext:zip

先执行 ext:build,再用 extension/scripts/zip.mjs(基于 PowerShell 自带的 Compress-Archive)把 extension/dist 打包成 extension/stacker-web-chats-<version>.zip,供离线分发或手动安装。