feat: support MCP elicitation and rebuild release

This commit is contained in:
shiyue
2026-08-24 17:39:41 +08:00
parent dd233a40e8
commit bd20a79d4b
69 changed files with 8978 additions and 13 deletions

View File

@@ -0,0 +1,15 @@
# Gitea Codex 工作流实现发现
- `server.js` 的 `codexAppThreadConfig(session, options)` 最终将每项配置写为 `mcp_servers.<server>`,所以独立适配器应返回与 app-server config 兼容的 `{type:'stdio', command, args, env}`。
- `startCodexAppTurn()` 在 `thread/start`/`thread/resume` 后记录 `entry.threadId`,在 `turn/start` 返回后记录 `entry.turnId`;`handleCodexAppTurnComplete()` 是完成监听点。
- 运行时事件可能从 `params.turnId`、`params.turn.id`、`params.item.turnId` 取 turnId;关联标记必须同时支持明文状态字段和 HTML 注释隐藏标识。
- 官方 gitea-mcp 采用 stdio,启动参数为 `-t stdio -H <host>`,token 通过线程级 env 注入;不应放到长驻 app-server 全局环境。
- gitea-mcp 最终评论需要查询确认;查询需匹配资源、Bot 作者和 taskId/turnId/resourceKey 隐藏标识,未知状态不能直接重复执行。
- waiting_user 新评论应复用原 `sessionKey/threadId`,但每条评论创建新 task/turn;补触发必须是同一 thread 的隐藏轮次,且最多一次。
## 实现接口
- `buildGiteaThreadConfig({cwd, host, accessToken})` 返回 `config['mcp_servers.gitea']`,内部为 `type=stdio`、`gitea-mcp -t stdio -H host` 和线程级 `GITEA_HOST/GITEA_ACCESS_TOKEN`。
- `buildWorkflowMarker`/`parseWorkflowMarker` 使用 `<!-- ccweb-gitea v="1" ... -->`,缺少 taskId、turnId 或 resourceKey 时返回 null。
- `createGiteaWorkflowCodex` 通过 `verifyReply/listComments/startTurn/sendRestReply` 依赖注入实现外部副作用;`unknown` 查询直接进入保守 `failed_reply`,不会自动补触发。
- `server.js` 的 `codexAppThreadConfig` 同时兼容 `{host, accessToken}` 和已构建的 stdio config;`startCodexAppTurn`、`handleCodexAppTurnComplete` 提供 turn 生命周期薄挂接,既有 waiter 在完成时执行回执确认/补偿。

View File

@@ -0,0 +1,22 @@
# Gitea Codex 工作流实施进度
## 日志
- 2026-08-24:读取现有 Gitea Workflow 研究、PRD/ARCHITECTURE 和 Codex App 代码入口;确认本次只改独立模块、最小 server.js 挂接点、协议 mock 与单测。
- 2026-08-24:完成代码入口定位;计划审查要求补齐隐藏标识、Bot 身份、回执三态、同线程单次补触发和 REST 终止条件,已纳入验收约束。
- 2026-08-24:新增 `lib/gitea-workflow-codex.js`,实现线程级 stdio gitea-mcp 配置、版本化隐藏标记、turnId/threadId 提取、Bot 自评论过滤、waiting_user 连续评论、回执 confirmed/missing/unknown 和单次 reply_retry/REST 兜底。
- 2026-08-24:`server.js` 增加独立模块 require、gitea MCP config 合并、turn started/completed 薄挂接,并让既有 Gitea waiter 在 turn 完成时 settle;查询未知状态不再自动重跑。
- 2026-08-24:补充 server waiter 对预分配 workflow marker turnId 与实际 Codex turnId 的兼容匹配;首轮旧 marker 可确认,reply_retry 使用实际新 turnId。
- 2026-08-24:新增 `scripts/gitea-workflow-codex-unit.js` 协议 mock/单测,覆盖配置形状、隐藏标记、Bot id/login、waiting_user 事件与同线程连续评论、单次补触发、REST 次数和 unknown 保守终态。
## 验证
| 命令 | 结果 |
|---|---|
| `node --check`(Codex 适配器、server.js、相关 Gitea 模块) | 通过 |
| `node scripts/gitea-workflow-codex-unit.js` | 通过 |
| `node scripts/gitea-webhook-regression.js` | 通过,9 场景 |
| `node scripts/gitea-webhook-workspace-unit.js` | 通过 |
| `node scripts/gitea-workflow-management-unit.js` | 通过 |
| `node scripts/gitea-workflow-core-unit.js` | 通过,6 项 |
| `timeout 60s npm run regression` | 未通过:既有 MCP 创建会话回归在等待 `background_done` 处超时(scripts/regression.js:6717),未出现本适配器异常;需后续单独修复该既有回归 |

View File

@@ -0,0 +1,39 @@
# Gitea Codex 工作流会话与回执实施计划
## 目标
新增独立的 Codex App/Gitea 工作流适配模块,覆盖线程级官方 gitea-mcp 注入、turnId 关联、waiting_user 连续评论、回执确认、一次补触发和 REST 兜底;以最小挂接点接入 server.js,并用协议 mock 与单测验收。
## 步骤
- [x] 定位现有 Codex App 线程、turn、MCP 配置和通知路由挂接点
- [x] 冻结独立模块 API 与隐藏 turnId/Bot 自评论标记协议
- [x] 实现线程级 gitea-mcp 配置、waiting_user 评论串联和回执状态机
- [x] 增加 server.js 最小挂接示例与可复制的接入说明
- [x] 编写协议 mock 和模块单元测试,覆盖补触发/REST 兜底
- [x] 运行语法检查、单测和现有回归并记录结果
## 完成记录
- 线程级 `mcp_servers.gitea`、隐藏标识、Bot 过滤、waiting_user 连续评论、一次补发和
REST 兜底已接入 `server.js`。
- 回帖校验允许历史补发标识集合;查询 `unknown` 时保守失败,不自动重复写操作。
- `node scripts/gitea-workflow-codex-unit.js`、Gitea 专项回归和全量 `npm run regression`
均通过。
## 验收约束
- 隐藏标识采用版本化 HTML 注释,编码后的 payload 必须包含 `taskId`、`turnId` 和 `resourceKey`,解析失败时不得误判为本轮回执。
- Bot 自评论优先按稳定 user id 判定;未配置 id 时才回退到大小写无关 login;带有效 ccweb 隐藏标识的评论始终不触发新任务。
- 回执确认严格区分 `confirmed`、`missing` 和 `unknown`;查询异常为 `unknown`,禁止据此重复执行代码修改。
- 正常回执未确认时最多创建一个 `reply_retry`,且必须复用原 `threadId`;补触发提示词只允许补发回执,不允许修改代码。
- 补触发后仍非 `confirmed` 才允许 REST 兜底;REST 成功或最终失败后不得再次补触发。
- gitea-mcp 只能出现在 `thread/start.config.mcp_servers.gitea`,host/token 经该线程的 args/env 注入,禁止写入 app-server 进程全局环境。
- `server.js` 仅增加 require、配置合并、turn started/completed/user-input 信号等薄挂接;工作流逻辑必须留在独立模块。
- 单测必须断言线程配置形状、标记往返/Bot 过滤、waiting_user 同线程投递、查询异常、单次补触发和 REST 兜底次数。
## 错误记录
| 错误 | 尝试 | 处理 |
|---|---:|---|
| planning-with-files catchup 脚本路径不存在 | 1 | 记录后改为直接读取现有规划文件并继续 |