docs: 插件适配指南 + 共用模块提取(为接入更多平台做准备)
两次适配(opencode、DeepSeek Harness)里的方法与坑此前散落在提交信息和 代码注释里,接第三个平台时要重新翻。这次固化成文档,并把与平台 SDK 无关的 逻辑提到共用模块。 ## docs/PLUGIN-GUIDE.md 八节:职责边界、必须实现的六件事、会话命名回写、平台会话快照上报、 平台差异对照表、踩过的坑(按排查成本降序)、新平台适配清单、共用模块清单。 三条设计原则贯穿全文,后面每一节都是它们的推论: 1. **平台原生信号才是真相来源**,不要求模型「记得」调工具 —— 因此不提供 request_permission(改挂权限钩子)、不要求模型主动回信(改在「一轮结束」 的平台信号上自动转发) 2. **插件代劳的转发不消耗配额** —— 因此这两类转发带 relay + relay_key 3. **平台命名优先** —— 因此创建会话时不传占位标题(那会掐掉平台自己的命名机制) 「踩过的坑」一节按排查成本排序,头一条是花了一下午的 followup() 参数形状。 ## 共用模块提取 `lib/inbox-format.js`(新):收件箱渲染与已读策略。三条规则各对应一次错误行为, 而它们与平台 SDK 无关: - 附件必须带 attachment_id(只说「有附件」模型无从下载) - 抄送人要显示(不显示模型以为是私信,回信时漏掉其他参与方) - 只标本次列出的、status=all 时不标(limit 之外的还没看过;把历史邮件标成已读 会让下一轮的新邮件混在里面认不出来) 顺带修好两处不一致:DSH 的 read_inbox 此前**完全没有标记已读**(每轮重复捞同一批), 且默认 status=all(同上);附件大小两边一个显示字节数一个显示 KB/MB。 `lib/workspace.js`:提到两侧共用。签名从 (workspace, fallbackKey) 改为 (workspace, fallback) —— 各平台的兜底不同:opencode 有插件启动时的 directory, DSH 只能落到 ~/.dsh/mail-sessions/<会话>(mailSessionFallback)。 opencode 侧此前是内联的三行判断,没有「目录不存在时不创建」与「拒绝相对路径」 这两条保护。 ## deploy/check-shared-libs.sh `lib/` 与 `test/` 下的共用文件必须逐字节相同,纳入 install.sh 门禁。 一侧改了另一侧没改,两个平台的行为就会悄悄分叉:同一封邮件在 opencode 那边 标了已读、在 DSH 那边没标,而两处代码看起来都「对」。这类分叉没有测试能发现, 只能靠 diff。 ## 文档同步 - PLAN.md §7.7 从「待做」改为已完成,补 7.7.1(工作目录归属)与 7.7.2(平台会话快照)两节,记录根因而非只记改法 - API.md 加「心跳与平台会话快照」章节;SSE 章节补 new_mail 与 permission_decision 的 payload 说明(to_workspace 的语义、relay_key 的用途) - PHASE7-REMAINING.md 移除已完成的 7.7,新增「每平台可用模型范围」的进展 (repo 层已就绪,handler/插件/前端待做) - README 文档索引与项目结构 验证:两插件共 136 个测试通过,同源校验通过,Go/前端全绿; 端到端发信 → DSH 用新的 read_inbox 渲染读取 → 自动回信 213 字节。
This commit is contained in:
@ -128,7 +128,8 @@ DATABASE_URL= # 留空 = 内置 SQLit
|
||||
agentmail/
|
||||
├── docs/
|
||||
│ ├── PLAN.md # 分阶段实施计划
|
||||
│ └── MVP-SPEC.md # MVP 技术规格书
|
||||
│ ├── MVP-SPEC.md # MVP 技术规格书
|
||||
│ └── PLUGIN-GUIDE.md # Agent 平台插件适配指南
|
||||
├── gateway/ # 后端(Go,单二进制)
|
||||
│ ├── cmd/server/ # 入口与路由表
|
||||
│ └── internal/
|
||||
@ -139,8 +140,9 @@ agentmail/
|
||||
│ ├── middleware/ # Agent / 用户双认证
|
||||
│ ├── sse/ # 事件推送(按收件人分流)
|
||||
│ └── static/ # go:embed 的前端产物
|
||||
├── plugins/
|
||||
│ └── opencode-mail-bridge/ # opencode 桥接插件
|
||||
├── plugins/ # 各平台桥接插件(lib/ 下的纯函数模块逐字节共用)
|
||||
│ ├── opencode-mail-bridge/ # opencode
|
||||
│ └── dsh-mail-bridge/ # DeepSeek Harness(Cordis)
|
||||
├── web/ # 前端(React + Vite + Tailwind)
|
||||
└── deploy/ # systemd 单元 + 安装脚本
|
||||
```
|
||||
@ -250,5 +252,6 @@ Agent 干完活可以在正文里**提议**改成更贴切的名字,但改不
|
||||
## 文档
|
||||
|
||||
- [WebAPI](docs/API.md) — 接口清单、认证方式、错误约定
|
||||
- [插件适配指南](docs/PLUGIN-GUIDE.md) — 接一个新 Agent 平台要实现什么,以及踩过的坑
|
||||
- [实施计划](docs/PLAN.md) — 分阶段任务与验收标准
|
||||
- [MVP 技术规格书](docs/MVP-SPEC.md) — 数据模型与接口细节
|
||||
|
||||
Reference in New Issue
Block a user