文档 · v0.2.3

Memosaic 的完整说明

从安装到工具调用协议,再到存储模型和能力边界。下面每一节都对应 README 里的实际实现, 没有承诺尚未做出来的功能。

概述

Memosaic 是一个本地优先的 Chrome / Chromium Manifest V3 扩展原型。它在扩展自己的 IndexedDB 中维护一份 可编辑的 Markdown 记忆文档,并向受支持的聊天页面暴露两个有边界的操作: read_memory 与 edit_memory。

设计目标不是「让 AI 记住一切」,而是让同一份你写下的上下文,在几个不同的模型之间 保持一致 —— 由你自己决定里面写什么。

怎么读这个名字:名字来自 memory 与 mosaic, 拼写是 Memosaic,读作 meh‑MOH‑zik (/məˈmoʊ.zɪk/)—— 重音在第二段,词尾与英文 mosaic 同韵。词首不是 “memo”,重音也不在第一段。 完整的拼写拆解见 首页的读音说明。

这是一个原型。 适配器和协议都会继续变化。发布包已可以下载安装,但尚未上架 Chrome 应用商店。

安装

Memosaic 通过「加载已解压的扩展程序」安装。你需要 Chrome 或任意 Chromium 内核的桌面浏览器。 不需要 Node.js,也不需要克隆仓库 —— 发布页上的压缩包就是可以直接加载的扩展本体。

v0.2.3 发布于 2026-09-25 · 52 KB
文件
memosaic-0.2.3.zip
校验
memosaic-0.2.3.zip.sha256
  1. 下载并解压

    从发布页下载压缩包并解压到任意目录。扩展之后会一直从这个目录加载,所以别解压到会被清理的临时目录里。

  2. 打开扩展管理页

    在地址栏输入 chrome://extensions 并回车。

  3. 启用开发者模式

    打开页面右上角的「开发者模式」开关。

  4. 加载解压后的文件夹

    把文件夹拖到页面上,或点击「加载已解压的扩展程序」选中它。压缩包的根目录就是 manifest.json,不要再往内选一层。

  5. 确认已启用

    扩展列表里会出现 Memosaic,版本号应显示 0.2.3,并处于启用状态。

从源码构建

想自己构建而非下载发布包,克隆仓库后需要 Node.js 20 或更新版本:

build
git clone https://github.com/FlashingChen/memosaic.git
cd memosaic
npm run check
npm test
npm run package -- --version 0.2.3

构建产物是dist/memosaic-0.2.3.zip,并会同时生成同名的 .sha256 校验文件。这个脚本与发布流程用的是同一个, 所以本地构建出来的包和发布页上的包内容一致。

发布包是自动构建的。 往仓库推一个 v* tag 会触发 GitHub Actions 流程:先跑语法检查与测试, 再打包。如果 tag 与 manifest.json、package.json 的版本号对不上,构建会直接失败而不是发一个版本号不对的包。

卸载与数据清除

记忆和编辑记录存放在扩展自身的存储中。在 chrome://extensions 里移除扩展会一并清除这些数据。清除前如果想保留记忆,请先在记忆编辑器里复制全文。


记忆编辑器

点击工具栏上的扩展图标打开弹出窗口,选择 Open memory editor, 即可查看或编辑初始文档。这是手动维护记忆的主要入口 —— 模型改了什么,你也可以在这里改回去。

编辑器里保存的修改会递增修订号,和模型的编辑走同一套规则。


工具协议

这些聊天网站没有提供给扩展的、与模型厂商无关的工具调用接口(provider-independent tool-calling API)。所以 Memosaic 采用了一条完全可见的替代路线。

流程

首个消息 适配器在你的消息里附加一段很短的引导语。
模型判断 若判断需要个人上下文,则输出一次调用请求。
扩展执行 校验后只执行内置记忆操作,结果作为后续消息发回。

两个内置操作

操作输入行为
read_memory 无参数 返回记忆全文与当前修订号。
edit_memory op · base_revision · find · replace 按 append / replace / delete 修改记忆,成功后修订号 +1。

调用信封

当模型回一段被 <<<MEMOSAIC_MEMORY_TOOL_CALL>>> 包裹的 JSON 时,扩展才会校验并执行它。包裹之外的任何内容都不会被当作指令执行。

model → extension
// 只接受这一个 JSON 调用,op 限定为内置操作
<<<MEMOSAIC_MEMORY_TOOL_CALL>>>
{
  "name": "read_memory",
  "arguments": {}
}
<<</MEMOSAIC_MEMORY_TOOL_CALL>>>

引导语

在会话中第一条被提交的消息上,适配器会附加一段短引导语。它告诉模型: 当个人上下文、偏好、先前对话、正在进行的项目,或需要结合用户处境才能给出的建议 会实质影响回答时,调用 read_memory。

反过来,通用知识和自包含的任务不应该触发读取。这条规则决定了 Memosaic 不会在无关对话里打扰你。

引导语本身不含任何记忆内容。当模型请求读取时,结果会作为后续聊天消息发回 —— 也就是说,引导语和工具结果都显示在对话里,你可以看到。


一次完整调用

下面是一次修改记忆的完整往返。扩展校验 base_revision 是否匹配、以及 find 是否唯一命中,两者都通过才写入。

1 · model requests an edit
{
  "name": "edit_memory",
  "arguments": {
    "op": "replace",
    "base_revision": 7,
    "find": "偏好:先给结论",
    "replace": "偏好:先给结论,再展开推理"
  }
}
2 · extension replies in a follow-up message
{
  "ok": true,
  "revision": 8,
  "applied": "replace"
}

// 校验不通过时:
// { "ok": false, "error": "STALE_REVISION",
//   "current_revision": 9 }
精确匹配是硬约束。 如果 find 在记忆里命中 0 处或多处,操作会被拒绝, 记忆保持不变。这样能避免模型改错地方。

存储与修订

记忆文档和最近 50 条编辑记录存放在浏览器扩展配置内的 IndexedDB 中。 它们不会被上传,也不会被同步。

项目说明
存储位置扩展配置内的 IndexedDB
编辑记录上限最近 50 条
修订号模型或手动编辑成功一次,递增一次
同步无。扩展不具备网络权限
卸载后随扩展一并清除

并发与过期修订

每次模型编辑都必须带上 base_revision。 IndexedDB 的读写事务会把并发编辑串行化,并且拒绝基于过期修订号的写入。

实际效果是:如果你在另一个标签页里同时进行对话,两边不会互相覆盖 —— 后提交的那次会收到过期提示,而不是把前一次的结果悄悄抹掉。


支持的页面

提供商页面备注
DeepSeek chat.deepseek.com 官方网页对话
Gemini gemini.google.com 官方网页对话
小米 MiMo Studio aistudio.xiaomimimo.com 适配对象是 MiMo Studio 的官方对话页,而不是小米 MiMo 的产品页或 API 文档页

每个提供商各自有一个适配器,负责 DOM 选择器与发送行为。适配器是「声明式配置 + 少量 provider 局部函数」, 不直接读写记忆 —— 所有记忆操作都要经过 service worker。 共享控制器里不含任何 provider 专有的选择器或路由逻辑。

新增一个 provider 通常只需五处改动:src/adapters/<id>.js、 manifest.json 里的一条记录、 src/shared/providers.js 里的元数据、 service-worker.js 里的来源域名授权, 以及该 provider 路由的测试。可以从仓库里的 _template.js 开始。完整字段说明见 适配器指南。


适配失败时会发生什么

适配器出错不会破坏原本的聊天页面 —— 它只是不介入。这种情况下你可能需要手动重试, 或者自己把上下文粘贴进对话。

具体表现取决于站点改动的类型:有时引导语不再注入,有时工具结果无法发回。 这两种情况都不影响你在记忆编辑器里手动维护内容。

几个实现细节

旧版本数据库会自动迁移

Memosaic 是之前叫 CAM / Cross-AI Memory 的原型的新名字。 更新后的扩展第一次打开时,会把旧的 cross-ai-memory 数据库迁移到新的 memosaic 数据库,你的记忆不会丢。

为什么能识别推理标头下的工具调用

部分提供商会把内部推理标题(例如「已深度思考(用时 0.4 秒)」)渲染在同一个助手回复元素里。 解析器允许工具调用包裹前面只存在已知推理标签,以保证这类页面上仍能正确识别调用。

同一条回复不会被处理两次

流式输出的推理标头可能反复触发扫描。控制器用 WeakMap 保存回复快照、用 WeakSet 标记已处理的元素, 因此同一次调用只会被执行一次。

安全边界

Memosaic 刻意做得很窄。协议不评估代码、表达式或正则表达式,也不接受文件路径。 扩展没有网络权限、没有远程 API、没有 shell,也没有任意文件访问能力。

面向模型的引导语和工具结果在对话里可见。 所以不要把密码、密钥或其他敏感信息写进记忆文档。

存在的权限

  • · 在受支持站点上运行内容脚本
  • · 本地 IndexedDB 存储
  • · 扩展弹出窗口与编辑器界面

不存在的权限

  • · 网络 / 远程 API 请求
  • · shell 或本机命令执行
  • · 任意文件系统访问
  • · 读取或上传你的聊天记录

常见问题

记忆会自动变好吗?

不会。记忆只在你手动编辑,或模型按引导语规则主动调用 edit_memory 时变化。没有后台总结、没有自动归档。

换台电脑,记忆还在吗?

不在。没有网络权限,就没有跨设备同步。你可以在记忆编辑器里复制全文,手动迁移。

支持非 Chrome 浏览器吗?

目标平台是 Chrome / Chromium 桌面。Manifest V3 的其他 Chromium 内核浏览器理论上可以加载, 但项目目前只针对 Chrome 验证。

支持手机吗?

不支持。桌面浏览器扩展是当前唯一的形态。

在哪里下载?

源码在 github.com/FlashingChen/memosaic,MIT 许可。 从发布页下载压缩包并解压,然后用开发者模式的「加载已解压的扩展程序」 加载该目录。Chrome 应用商店渠道尚未开通,所以这里只能手动安装。

界面支持中文吗?

支持。内置英文(en)与简体中文(zh-CN)两种语言, 可在弹出窗口或记忆编辑器里切换。这个设置同时控制扩展界面,以及注入到对话里的模型指令语言。

可以自己加一个 AI 站点吗?

可以,这也是主要的贡献路径。新增一个 provider 通常只需:一份 src/adapters/<id>.js、manifest.json 里的一条记录、 src/shared/providers.js 里的元数据、service worker 里的来源授权, 以及对应的测试。参见适配器指南。


语言支持

运行时会按以下顺序选定语言:① 保存在 chrome.storage.local 里的设置; ② 当设置为 auto 时,使用浏览器语言;③ 回退到英文。

内置 en 与 zh-CN。 要新增一种语言,在 src/shared/i18n.js 里补上词条并加入 SUPPORTED_LOCALES,再在弹出窗口和编辑器里加一个选项即可; 缺失的键会回退到英文。

语言设置影响的是界面语言和注入到对话里的指令语言,不会翻译你的记忆文档内容 —— 那份文档始终是你自己写的原文。

项目结构与开发

它被拆成五层:共享协议、本地记忆存储、service worker、每个站点一个适配器, 以及运行在对话页面上的共享内容控制器。共享层里不包含任何 provider 专有的 DOM 选择器或路由逻辑。

repository structure
src/
  adapters/
    _template.js       # 复制它来新增一个 provider
    deepseek.js
    gemini.js
    mimo.js
    registry.js
  content/
    runtime.js         # 共享 DOM / 控制器循环
  shared/
    i18n.js            # 界面与提示词翻译
    protocol.js        # 工具标记与解析器
    providers.js       # provider 元数据
  memory-store.js      # IndexedDB 存储与修订
  memory-page.js       # 本地编辑器
  service-worker.js    # 后台工具执行
  popup.js
icons/
  source.png           # 图标母版
  generate.py          # 生成 16/32/48/128/512 五档 PNG
  icon16.png … icon512.png
tests/
  adapters.test.js
  protocol.test.js
  providers.test.js
docs/
  adapters.md
  architecture.md
README.md              # 英文
README.zh-CN.md        # 简体中文

需要 Node.js 20 或更高版本:

shell
# 语法检查浏览器脚本
npm run check

# 跑测试:provider 注册、路由解析、协议解析、
# MiMo 推理标头回归、本地化
npm test