把这条线从“最初想成为 OpenClaw 贡献者、寻找可合并价值点”,收口到一个更现实的结论: 你当前工作树里最显眼的 browser/CORS 改动,解决的是一个已经被你放弃的本地 IM / 浏览器直连方向; 它不是你现在的 Feishu 主线刚需,所以最优解不是继续硬推 upstream,而是把实验和主线拆开管理。
这不是“代码能不能写出来”的问题,而是“什么应该进主线、什么应该留在实验分支”的问题。
他们最关心的是:这是不是多数用户共享的问题?维护成本是不是低?边界是不是说得清楚?
从这个视角看,你现在的 loopback CORS 改动更像一个特定使用方式的增强,而不是主流路径上的 bug 修复。
经典判断标准不是“能不能加”,而是“为什么非加不可”。
如果一个改动主要服务于个人工作流或定制场景,它更适合停留在 fork / patch / branch,而不是占据上游主线复杂度。
实验可以很多,但主线必须可验证、可回滚、可低风险演进。
所以这里的重点不是“删不删代码”,而是先把实验路径和生产主线隔离,再用定向测试保护现有流程。
scripts/im-demo-local.sh 中存在显式的 OPTIONS /v1/chat/completions 预检请求,带 Origin: http://localhost:3000,
并等待 204。这不是 Feishu 路径会用到的行为,而是本地浏览器 / IM demo 会用到的行为。
通俗说,它解决的不是“飞书发不过来”,而是“浏览器网页能不能直接调你本地 Gateway HTTP API”。
http://localhost:3000 一类 loopback 页面,直连本地 Gateway 的 /v1/chat/completions。/v1/responses。OPTIONS 预检,并在响应里回写允许的 Origin / methods / headers。| 问题 | 答案 | 影响等级 |
|---|---|---|
| 如果不保留 CORS patch,会不会影响你现在的 Feishu 主线? | 按目前定位,不会直接影响。因为 Feishu 路径不需要浏览器从 localhost 直接调 Gateway HTTP。 |
低 |
| 如果以后又想做本地浏览器 / IM demo 呢? | 那时浏览器预检会再次成为问题,所以更合理的做法是归档而不是忘掉。 | 中 |
| 如果一直把它留在主工作树里呢? | 会增加和 upstream 的差异、抬高后续同步与解释成本,但不一定立刻炸主流程。 | 中 |
| 文件 | 作用 | 建议 | 理由 |
|---|---|---|---|
src/gateway/http-cors.ts |
新增 loopback origin 识别与 CORS header 处理。 | 回退主线 / 归档 | 完全服务于浏览器直连本地 Gateway 的场景,不是你当前主线必需。 |
src/gateway/openai-http.ts |
给 /v1/chat/completions 加 CORS 分支。 |
回退主线 / 归档 | 价值点和上面一致,属于支线需求接线点。 |
src/gateway/openresponses-http.ts |
给 /v1/responses 加 CORS 分支。 |
回退主线 / 归档 | 同样只对浏览器入口有意义。 |
src/gateway/openai-http.e2e.test.ts |
验证 chat/completions 的 loopback CORS。 | 随 patch 一起归档 | 测试本身没问题,但如果主线不保留功能,测试也不该留在主线。 |
src/gateway/openresponses-http.e2e.test.ts |
验证 responses 的 loopback CORS。 | 随 patch 一起归档 | 同上。 |
docs/gateway/openai-http-api.md / docs/gateway/openresponses-http-api.md |
给浏览器 loopback CORS 写说明。 | 随 patch 一起归档 | 文档服务于同一支线,不该先于决策长期留在主线。 |
scripts/im-demo-local.sh |
本地 IM / 浏览器 demo 的验证脚本。 | 归档 | 作为实验资产保留有价值,但不必占据主工作树核心位置。 |
src/gateway/server-constants.ts |
让 tick / health refresh 间隔支持 env 覆盖。 | 单独评估 | 它和浏览器 CORS 不是一回事。如果你现实里确实需要降低后台探测频率,这是唯一可能还值得单独保留的部分。 |
im-demo-local.sh 作为未来需要时的复活入口。这次我没有只停留在静态分析,还做了最小必要的定向验证。但我不会夸大成“全链路已经验证完毕”。
| 测试 | 结果 | 说明 |
|---|---|---|
./node_modules/.bin/vitest run --config vitest.e2e.config.ts src/gateway/openai-http.e2e.test.ts |
通过 | 4/4 通过,包含新增的 loopback CORS 用例。 |
./node_modules/.bin/vitest run --config vitest.e2e.config.ts src/gateway/openresponses-http.e2e.test.ts |
通过 | 4/4 通过,包含新增的 loopback CORS 用例。 |
node --import tsx 对 server-constants.ts 做 env smoke |
通过 | 验证了合法值会覆盖默认值,非法值会回退到默认值。 |
pnpm test:e2e -- <files> 的第一次尝试 |
不作为结论 | 该命令意外把大量无关 e2e 也带起来了,噪音过大,因此不能作为这次局部改动的判断依据。 |
| Feishu live workflow | 未跑 | 这次没有去动你的实际 Feishu 运行环境,也没有冒然在 live 登录态上做扰动测试。 |
| 层级 | 测试用例 | 目标 |
|---|---|---|
| 自动化 / 局部 | Gateway HTTP 相关 e2e;如果保留 server-constants.ts,再补一个真正的单测。 |
确认改动面内的行为清楚、可复现。 |
| 启动 smoke | 本地启动 Gateway,看是否能正常监听、认证、返回健康信息。 | 确认没有因回退 browser patch 导致服务本身起不来。 |
| Feishu smoke | 发一条普通消息;看是否回复;再执行 1 个你常用动作。 | 确认当前实际主流程无回归。 |
| 观察期 | 看日志、health、session 行为、报错率。 | 避免只验证“瞬间可用”,忽略延时问题。 |
server-constants.ts 的 env 化改动,但前提是你现实里确实需要它。scripts/im-demo-local.sh 从主线心智里降级为“归档资产”。server-constants.ts 留不留;如果留,建议补 1 个真正的自动化测试。