QM,给全公司用的 agent 平台
AgentInfrastructureTypeScript市面上的 agent 几乎都按个人助理的样子设计,一个人用很顺,搬进公司就开始别扭:所有人共享一份记忆和一台沙箱,配置互相踩,权限一刀切。
QM 反过来,从第一天就按「多人」设计:每个人、每个频道各有一套隔离的工作空间,又能在同一个组织里协作。
上层目录里这份代码已经长到七万多行,值得完整写一写它的设计。
它是什么
QM 是一个面向创业公司的 multiplayer agent harness:员工在 Slack 和 Web 两个入口使用同一个 agent,身份与配置在两端完全一致。
关键抽象是 scope:每个人是一个 scope,每个频道、群组、项目也是一个 scope。memory、文件、keychain 视图、定时任务、Web 应用、durable sandbox,全部按 scope 隔离——你调教出来的 agent 是你的,频道里的 agent 是大家的,互不污染。
另一个立场是不绑供应商:Pi、OpenCode、Codex、Claude Code 四种 harness 驱动同一个 core,部署方选自己的模型和 harness,随时可换。
架构
core 是无头的:API、身份、策略、调度器加一个 agent loop,TypeScript 直接跑在 Node 上,HTTP 用 Fastify。Web UI、admin 面板、公开 portal 都是 core HTTP API 之上的可选插件;Slack 是 core 进程内启动并监督的插件(Bolt 实现)。
持久层是 Postgres:会话历史、memory、队列等全部耐久状态都在这。
每个 scope 有自己的沙箱——一台「durable computer」,装过的工具一直在,agent 的 execute 工具就在这台机器里跑命令。
每回合怎么走
每个回合都经过 core 中枢:入口插件收到消息,解析身份并落到对应 scope,策略层决定这个 scope 允许什么,然后交给所选 harness 生成回应。
工具面是刻意收小的固定集合,其中 execute 负责一切命令执行,落进该 scope 自己的沙箱。harness 层做了统一适配:pi-harness / opencode-harness / codex-harness / claude-harness 四个实现落在同一接口上,还有 mock-harness 供测试,上下文压缩(context-compaction)和录制回放(replay / tape-fold)也做在这一层,换 harness 不用动业务。
安全姿态
QM 的信任模型与本地编码 agent(OpenCode、Codex、Claude Code)同源:agent 以使用者的身份行事,用他的凭证和权限,一切留审计。组织选一个安全姿态,更窄的 scope 只能收紧不能放松:
Strict:除两个无副作用的回合终止工具外,每次 harness 工具调用都停下来等人工批准。
Auto(默认):带来源标注的外部数据与工具结果,先过一个分类器再进模型;部署方可以把分类器指向自己的筛查代理。
Dangerous:不筛内容、不暂停。
预声明命令策略是姿态之外的另一层:递归删除、破坏性 SQL 这类命令的批准规则与硬性拒绝,在任何姿态下都生效,Dangerous 也不例外。
deployment directory
core 本身是通用的,一切公司特定的东西——组织配置、自定义工具与技能、沙箱镜像、基础设施——都放在一个独立的部署目录里,由 qm CLI 校验和部署:
npm exec --yes --package=@yc-software/qm@latest -- \
qm init . --org <slug> --target <fly-or-aws>
npm install初始化会物化一个部署技能,带着 agent 走完基础设施、Web 登录、连接器凭证、Slack 接入、部署与线上验证,全程不需要 checkout 源码。每个部署跑在运营方自己的云账号里(Fly 或 AWS)。
想把定制和核心放在一个仓库里读的组织,走私有 fork:用裸克隆 mirror 出一个独立私有仓,而不是 GitHub 的 Fork 按钮——GitHub fork 会继承上游仓库的可见性,公共仓库的 fork 私有不了,这个坑文档里点得很清楚。
工程规范
代码之外的规矩同样能看出这个项目的性格:仓库标准是零注释,意图全靠命名、结构和测试表达;合并前必须由没看过这个 diff 的新上下文做破坏性审查,作者自审不算数,绿色的 CI 也不算审查;本地只跑受影响的测试,全量交给 CI 分片并行。贡献方式更特别——只收人写的文字(ADR),不收代码,对齐之后由维护方实现。
边界和取舍
固定小工具面意味着放弃各 harness 自带的工具生态,换来的是四种 harness 行为一致、审计一致。
agent 以人的身份行事,是把「agent 做了什么」等同于「这个人做了什么」——审计因此简单,但也要求组织真的信任姿态与命令策略这两层闸门。
多 scope 隔离的代价是运维面变宽:每个 scope 一台沙箱,状态耐久也就意味着状态要管。
回头看,这套东西像是把「本地编码 agent」的那套信任与工具哲学,抬到了组织级——个人的照样是个人的,公司的才是公司的。