# Mercury — 以灵魂驱动的 AI Agent

Mercury — Soul-Driven AI Agent

以灵魂驱动、内置权限加固工具、Token 预算和多渠道访问的 AI Agent。

记住重要信息。行动前先请求确认。通过 CLI 或 Telegram 全天候运行。31 个内置工具、可扩展的 Skills、基于 SQLite 的第二大脑记忆。

npm license node

🔖 当前稳定版:v1.1.6

English | 简体中文

--- ## 快速开始 ```bash npx @cosmicstack/mercury-agent ``` 或全局安装: ```bash npm i -g @cosmicstack/mercury-agent mercury ``` 首次运行会触发设置向导(姓名、Provider、可选 Telegram)。设置完成后,Mercury 打开 Ink TUI 启动画面,并在聊天开始前请求权限模式(`Ask Me` 或 `Allow All`)。 之后重新配置(更改 key、名称、设置): ```bash mercury doctor mercury doctor --platform ``` ## 为什么选择 Mercury? 每个 AI Agent 都能读写文件、运行命令和获取 URL。大多数默默做这些事。**Mercury 先询问 — 并且记住重要的事。** - **权限加固** — Shell 黑名单(`sudo`、`rm -rf /` 等永不执行)。目录级读/写作用域。待批准流程。会话级"问我"或"全部允许"。无意外。 - **第二大脑** — 基于 SQLite + FTS5 全文搜索的持久化结构化记忆。10 种记忆类型、自动提取、冲突解决、自动整合。Mercury 无需手动输入即可学习你的偏好、目标和习惯。 - **灵魂驱动** — 人格由你拥有的 Markdown 文件定义(`soul.md`、`persona.md`、`taste.md`、`heartbeat.md`)。无企业包装。 - **Token 感知** — 每日预算强制执行。超过 70% 时自动简洁。`/budget` 命令查看、重置或覆盖。 - **实时流式输出** — CLI 实时 Token 流式输出,带光标保存/恢复和 markdown 重渲染。Telegram 流式输出配合可编辑状态消息。 - **全天候运行** — 在任何操作系统上作为后台守护进程运行。崩溃后自动重启。开机自启。Crontab 调度、心跳监控和主动通知。 - **可扩展** — 一条命令安装社区 Skills。将 Skills 调度为循环任务。基于 [Agent Skills](https://agentskills.io) 规范。 Mercury 现在在首次运行时在 `~/.mercury/skills/web-search/SKILL.md` 中植入默认 `web-search` Skill。 ## 守护进程模式 **一条命令让 Mercury 持久化:** ```bash mercury up ``` 这会安装系统服务(如果未安装)、启动后台守护进程,并确保 Mercury 正在运行。将此作为你的常用命令。 如果 Mercury 已在运行,`mercury up` 仅确认状态并显示 PID。 ### 其他守护进程命令 ```bash mercury restart # 重启后台进程 mercury stop # 停止后台进程 mercury start -d # 后台启动(不安装服务) mercury logs # 查看近期守护进程日志 mercury status # 显示守护进程是否运行 ``` 守护进程模式内置崩溃恢复 — 如果进程崩溃,它会自动重启并使用指数退避(最高每分钟 10 次重启)。 ### 系统服务(开机自启) `mercury up` 自动安装此服务。你也可以直接管理它: ```bash mercury service install ``` | 平台 | 方式 | 需要管理员 | |------|------|-----------| | **macOS** | LaunchAgent (`~/Library/LaunchAgents/`) | 否 | | **Linux** | systemd user unit (`~/.config/systemd/user/`) | 否(开机自启可能需要 linger) | | **Windows** | Task Scheduler (`schtasks`) | 否 | ```bash mercury service status # 检查服务是否运行 mercury service uninstall # 移除系统服务 ``` 在守护进程模式下,Telegram 成为主要渠道 — CLI 是纯日志,因为没有终端输入。 ## CLI 命令 | 命令 | 描述 | |------|------| | `mercury up` | **推荐。** 安装服务 + 启动守护进程 + 确保运行 | | `mercury` | 启动 Agent(等同于 `mercury start`) | | `mercury start` | 前台启动 | | `mercury start -d` | 后台启动(守护进程模式) | | `mercury restart` | 重启后台进程 | | `mercury stop` | 停止后台进程 | | `mercury logs` | 查看近期守护进程日志 | | `mercury doctor` | 重新配置(姓名、Provider、渠道、权限默认项) | | `mercury doctor --platform` | 显示跨平台终端/守护进程兼容性诊断 | | `mercury setup` | 重新运行设置向导 | | `mercury status` | 显示配置和守护进程状态 | | `mercury help` | 显示完整手册 | | `mercury upgrade` | 升级到最新版本 | | `mercury telegram list` | 列出已批准和待处理的 Telegram 用户 | | `mercury telegram approve ` | 批准配对码或待处理请求 | | `mercury telegram reject ` | 拒绝待处理的 Telegram 访问请求 | | `mercury telegram remove ` | 移除已批准的 Telegram 用户 | | `mercury telegram promote ` | 将 Telegram 成员晋升为管理员 | | `mercury telegram demote ` | 将 Telegram 管理员降级为成员 | | `mercury telegram reset` | 清除所有 Telegram 访问并重新开始 | | `mercury service install` | 安装为系统服务(开机自启) | | `mercury service uninstall` | 卸载系统服务 | | `mercury service status` | 显示系统服务状态 | | `mercury --verbose` | 使用调试日志启动 | ## 对话内命令 在对话中输入这些 — 它们不消耗 API Token。CLI 和 Telegram 都适用。 | 命令 | 描述 | |------|------| | `/help` | 显示完整手册 | | `/status` | 显示 Agent 配置、预算和用量 | | `/tools` | 列出所有已加载的工具 | | `/skills` | 列出已安装的 Skills | | `/stream` | 切换 Telegram 文本流式输出 | | `/stream off` | 禁用流式输出(单条消息) | | `/budget` | 显示 Token 预算状态 | | `/budget override` | 单次请求覆盖预算 | | `/budget reset` | 将用量重置为零 | | `/budget set ` | 更改每日 Token 预算 | | `/permissions` | 更改权限模式(问我 / 全部允许) | | `/view` | 切换进度视图(平衡 / 详细) | | `/view balanced` | 设置精简进度视图 | | `/view detailed` | 设置完整进度视图 | | `/code agent ` | 将编码任务委托给后台子 Agent | | `/ws exit` | 退出工作区 IDE 模式回到常规聊天 | | `/tasks` | 列出调度任务 | | `/memory` | 查看和管理第二大脑记忆 | | `/unpair` | Telegram:重置所有访问 | ## 内置工具 | 分类 | 工具 | |------|------| | **文件系统** | `read_file`、`write_file`、`create_file`、`edit_file`、`list_dir`、`delete_file`、`send_file`、`approve_scope` | | **Shell** | `run_command`、`cd`、`approve_command` | | **消息** | `send_message` | | **Git** | `git_status`、`git_diff`、`git_log`、`git_add`、`git_commit`、`git_push` | | **Web** | `fetch_url` | | **Skills** | `install_skill`、`list_skills`、`use_skill` | | **调度器** | `schedule_task`、`list_scheduled_tasks`、`cancel_scheduled_task` | | **系统** | `budget_status` | ## 渠道 | 渠道 | 特性 | |------|------| | **CLI** | Ink TUI、启动权限模式选择器、交互式权限提示(方向键 + Enter;Y/N/A 快捷键)、进度视图(平衡/详细)、实时流式输出 | | **Telegram** | HTML 格式化、可编辑流式消息、文件上传、输入状态指示器、多用户访问与管理员/成员角色 | ### 工作区/编码快捷键(CLI) - `Ctrl+P` → 切换到计划模式 - `Ctrl+X` → 切换到执行模式 - `Esc` 或 `Ctrl+Q` → 退出工作区回到常规聊天 - `Ctrl+V` → 切换进度视图(当终端拦截 Ctrl+V 时 `/view` 作为后备) ### Spotify UI 注意事项(CLI) - Spotify 面板支持键盘快捷键:`N` 下一曲、`P` 上一曲、`+/-` 音量、`Z` 正在播放。 - 内联专辑封面是可选的且安全屏蔽: - 用 `MERCURY_SPOTIFY_ART=1` 启用 - 目前仅在本地 iTerm 会话中渲染 - 在 SSH/移动端/轻量终端中自动回退到纯文本 UI ### Telegram 访问 Mercury 使用**组织访问模型**,包含管理员和成员。 - **首次设置:** 向你的 Bot 发送 `/start`,收到配对码,然后在 CLI 中输入 `mercury telegram approve `。你成为首位管理员。 - **其他用户:** 发送 `/start` 请求访问。管理员从 CLI 批准或拒绝。 - **角色:** 管理员可以批准/拒绝请求、晋升/降级用户和重置访问。成员可以与 Mercury 聊天。 - **重置:** 管理员可以在 Telegram 发送 `/unpair`,或在 CLI 中运行 `mercury telegram reset` 清除所有访问并重新开始。 - 仅限私聊 — 群组消息始终被忽略。 CLI 命令:`mercury telegram list|approve|reject|remove|promote|demote|reset` ## 调度器 - **循环**:使用 cron 表达式的 `schedule_task`(`0 9 * * *` 每天 9 点) - **一次性**:使用 `delay_seconds` 的 `schedule_task`(例如 15 秒) - 任务持久化到 `~/.mercury/schedules.yaml`,重启后恢复 - 响应路由回创建任务的渠道 ## 第二大脑 Mercury 构建一个结构化、持久化的记忆,随每次对话增长。默认启用,自动提取、存储和召回关于你的事实。 - **10 种记忆类型** — identity、preference、goal、project、habit、decision、constraint、relationship、episode、reflection - **自动提取** — 每轮对话后,Mercury 提取 0–3 条带置信度、重要性和持久性分数的事实 - **相关召回** — 每次消息前,将最匹配的 5 条记忆(900 字符预算)注入上下文 - **自动整合** — 每 60 分钟,Mercury 构建个人资料摘要、活跃状态摘要,并从模式生成反思 - **冲突解决** — 对立记忆按置信度(更高者胜出)或新旧(更新者胜出)解决 - **自动修剪** — 活跃作用域记忆 21 天后过期;推断记忆会衰减;低置信度持久记忆 120 天后清除 - **用户控制** — `/memory` 用于概览、搜索、暂停、恢复和清除 - **禁用** — `SECOND_BRAIN_ENABLED=false` 环境变量或配置中的 `memory.secondBrain.enabled: false` 所有数据保留在你机器的 `~/.mercury/memory/second-brain/second-brain.db`(SQLite + FTS5)。不上云。 ## 配置 所有运行时数据位于 `~/.mercury/` — 不在你的项目目录中。 | 路径 | 用途 | |------|------| | `~/.mercury/mercury.yaml` | 主配置(Provider、渠道、预算) | | `~/.mercury/.env` | API key 和 Token(与项目 .env 一起加载) | | `~/.mercury/soul/*.md` | Agent 人格(soul、persona、taste、heartbeat) | | `~/.mercury/permissions.yaml` | 能力和审批规则 | | `~/.mercury/skills/` | 已安装的 Skills | | `~/.mercury/schedules.yaml` | 调度任务 | | `~/.mercury/token-usage.json` | 每日 Token 用量跟踪 | | `~/.mercury/memory/short-term/` | 每段对话的 JSON 文件 | | `~/.mercury/memory/long-term/` | 自动提取的事实(JSONL) | | `~/.mercury/memory/episodic/` | 带时间戳的事件日志(JSONL) | | `~/.mercury/memory/second-brain/` | 结构化记忆数据库(SQLite + FTS5) | | `~/.mercury/daemon.pid` | 后台进程 PID | | `~/.mercury/daemon.log` | 守护进程模式日志 | ## Provider 兜底 配置多个 LLM Provider。Mercury 按顺序尝试并自动兜底: | Provider | 默认模型 | API Key | 备注 | |----------|----------|---------|------| | **DeepSeek** | deepseek-chat | `DEEPSEEK_API_KEY` | 默认,成本效益高 | | **OpenAI** | gpt-4o-mini | `OPENAI_API_KEY` | GPT-4o、o3 等 | | **Anthropic** | claude-sonnet-4 | `ANTHROPIC_API_KEY` | Claude Sonnet、Haiku、Opus | | **Grok (xAI)** | grok-4 | `GROK_API_KEY` | OpenAI 兼容端点 | | **Ollama Cloud** | gpt-oss:120b | `OLLAMA_CLOUD_API_KEY` | 通过 API 的远程 Ollama | | **Ollama Local** | gpt-oss:20b | 无需 Key | 本地 Ollama 实例 | 当 Provider 失败时,Mercury 自动尝试下一个。它记住最后一个成功的 Provider,并在下次请求时从那里开始。 > **更多 Provider 即将到来** — Google Gemini、Mistral 等已在路线图上。Mercury 的 OpenAI 兼容架构也支持通过 base URL 配置自定义端点。 ## 架构 - **TypeScript + Node.js 18+** — ESM,tsup 构建 - **Vercel AI SDK v4** — `generateText` + `streamText`,10 步 Agent 循环,Provider 兜底 - **grammY** — Telegram Bot,带输入指示器、可编辑流式输出和文件上传 - **SQLite + FTS5** — 第二大脑,带全文搜索、冲突解决、自动整合 - **JSONL** — 短期、长期和情景对话记忆 - **守护进程管理器** — 后台生成 + PID 文件 + 看门狗崩溃恢复 - **系统服务** — macOS LaunchAgent、Linux systemd、Windows Task Scheduler ## 许可证 MIT © [Cosmic Stack](https://github.com/cosmicstack-labs) --- ## 免责声明 **这是 AI 软件 — 有时可能会出问题,请自行评估风险后使用。** --- ## 参与贡献 我们欢迎贡献!Mercury 是为演进而构建的,我们欢迎社区的帮助。无论是修复 bug、添加工具、改善记忆还是改进 soul — 所有高质量的贡献都受欢迎。 ### 🎯 Agent 专业知识 — 贡献者必读 Mercury 不只是一个开源项目 — 它是一个**以灵魂驱动的 Agent**,全天候运行,管理权限,记住上下文,并在多个渠道间交互。如果你正在贡献,你必须像 Agent 构建者一样思考,而不只是库贡献者。这些是每个贡献者都应该内化的不可协商的原则: | 原则 | 含义 | |------|------| | 🧠 **以循环思维** | Mercury 在 10 步 Agent 循环中运行。你的工具或功能每轮对话会被调用多次。尽可能保持幂等。 | | 🔐 **权限优先** | 每个触碰外部世界的行为(文件、shell、网络、git)必须经过权限系统。永远不要假设批准。 | | 💾 **记忆感知** | 如果你的功能生成关于用户的事实,考虑接入第二大脑。如果它读取用户数据,先检查记忆。 | | 📏 **Token 意识** | Mercury 有每日 Token 预算。日志、冗长输出和大上下文转储会快速消耗 Token。保持精简。 | | 🔌 **渠道无关** | 工具应该在 CLI 和 Telegram 上表现一致。不要假设终端、键盘,甚至另一端是人。 | | 🔁 **优雅降级** | 如果 Provider 失败、工具出错或文件不存在 — Mercury 应该恢复,而不是崩溃。始终处理边缘情况。 | | 📋 **自文档化** | 你的工具的名称和描述是 Mercury 决定何时使用它的依据。让它们清晰、具体和面向行动。 | | 🧪 **测试循环,不只是函数** | 在隔离中工作的工具在 Agent 循环中可能失败(例如,返回太多数据,阻塞下一步)。端到端测试。 | ### 代码质量 — 做 | 做 | 为什么 | |---|--------| | ✅ 写干净的、可读的带显式类型的 TypeScript | Mercury's codebase 是类型安全的 — 保持这样 | | ✅ 在公共函数和工具上添加 JSDoc 注释 | 帮助其他贡献者和 Agent 理解意图 | | ✅ 保持函数小而单一职责 | 更易于测试、审查和推理 | | ✅ 使用 async/await 而不是原始 Promise | 一致的错误处理和可读性 | | ✅ 为新工具和记忆功能写测试 | 对 24/7 Agent 来说可靠性很重要 | | ✅ 遵循现有项目结构(`src/tools/`、`src/memory/`、`src/channels/`) | 保持代码库可导航 | | ✅ 使用 Agent Skills 规范用于新的基于 skill 的功能 | 确保与 skills 生态系统的兼容性 | | ✅ 在 PR 描述中记录破坏性变更 | 帮助维护者正确版本管理 | ### 代码质量 — 不做 | 不做 | 为什么 | |------|--------| | ❌ 未经讨论不添加依赖 | Mercury 很精简 — 每个依赖增加表面积 | | ❌ 不硬编码 API key、Token 或路径 | 像代码库其他部分一样使用 config/env 变量 | | ❌ 不绕过权限系统 | 工具必须先请求再行动 — 这是 Mercury 的核心承诺 | | ❌ 不在热路径中引入同步/阻塞 I/O | Mercury 是异步优先的,有原因 | | ❌ 不提交大二进制文件或 secrets | 使用 `.gitignore` 和 env 文件 | | ❌ 未经讨论不更改 soul/persona 系统 | 它是 Mercury 的核心 — 更改需要谨慎 | | ❌ 不提交未测试的 Telegram 或守护进程更改 | 这些在合并后很难调试 | | ❌ 不忽略 Token 预算系统 | 每个工具都应该注意 Token 消耗 | ### 开始 1. Fork 仓库 2. 运行 `npm install` 3. 进行更改 4. 运行 `npm run build` 验证编译 5. 本地使用 `mercury` 测试 6. 打开 PR,清晰描述你更改了什么和为什么 ### PR 指南 - 保持 PR 聚焦 — 每个 PR 一个功能/修复 - 在描述中包含前/后行为 - 适当时标记相关 issues - 对审查反馈响应迅速 ### 需要帮助? 打开 issue 或联系 [mercury@cosmicstack.org](mailto:mercury@cosmicstack.org)。我们很友好。 --- ## 社区 1. **Discord** — [加入 Mercury Agent Discord](https://discord.gg/5emMpMJy5J) 获取实时聊天、支持和小社区讨论。