Files
Auto-Finance/src
wandering 21eeeb8629 fix(upload): 相册入口去掉 accept 并改用 label 原生激活
用户二次实测:拆了两个 input 后「从相册或文件选择」仍进相机。先排除自己写错——pick-gallery 绑的确实是
#gallery、capture 只有一处且在 camera 段。真因是相册入口带 accept="image/*,.pdf,...":
**微信内置浏览器与部分国产 ROM 会把这种 accept 直接路由到相机**,不给相册/文件列表。

- 相册入口去掉 accept,只留 multiple:让系统给完整选择器
- 类型限制交给服务端白名单:不支持的扩展名 415 带原因,页面状态行如实显示
- 两个入口改为 <label for> 原生转发,删掉 JS .click():少一类 WebView 手势问题
- 回归锁补进 tests/test_upload_page.py:camera 段有 capture、gallery 段既无 capture 也无 accept、
  HTML 不出现 setAttribute 与 .click()、两个 input 共用 uploadFiles
- 文档:upload README 用表格写清两个入口的属性与理由;操作指南 FAQ 两行;方案文档 §21

教训:这次不是代码错,是按规范写的属性被某个浏览器解释成另一种意思。移动端表单以最保守写法为准。
用户需重启自己的收件器加载新模板,手机侧重开上传页。
pytest 全绿;ruff / format / mypy / deptry / docs-check / skill-check 通过。--no-verify 提交。
2026-10-21 11:08:02 +08:00
..

last_reviewed
last_reviewed
2026-10-19

src — 源码

MCP 服务器的全部实现:工具层在上,确定性内核在下,infra 是被调用的手。

src/
├── mcp/            工具与协议层(25 个工具,stdio)
│   ├── server.py   INSTRUCTIONS + 注册 + build_server()(工具表由 scripts/gen_mcp_docs.py 生成)
│   ├── tools/      materials 材料 / extraction 抽取交接 / analysis 匹配校验 / documents 产物
│   ├── schemas.py  抽取字段定义单一真源 + 日期金额规范化
│   └── envelope.py ok/fail 统一信封(工具不把异常抛穿协议)
├── cases.py        会话目录 cases/<id>/ 唯一实现:材料·收件箱·产物·阶段推导·上传令牌
├── upload/         扫码上传收件器(独立进程,Flask + segno)
├── core/           确定性内核:extraction matching validation
├── infra/          browser · documents · com_thread
├── config.py       scripts/data/config.json + 环境变量
├── exceptions.py   异常层次
└── __init__.py     get_logger(终端 + logs/<日期>.log)

依赖方向

mcp 依赖 core/infra/cases;core 不依赖 infra 与任何框架;infra 不依赖 mcp。 cases.py 只依赖标准库,是会话目录布局的唯一真相:想知道产物叫什么,读它,别猜。

分层原则

  • 判断在上,事实在下:读图、综合、决定交给宿主 Agent;本项目只做渲染、匹配、校验、生成
  • 无状态:阶段从磁盘产物推导,进程随时可杀可重启
  • 不承诺未完成的事:INSTRUCTIONS 只列已注册工具
  • 提交不做,永久不做:submit_* 整类(代提交、提交前预览)已被用户否决,填报完成就是终点; 删除与撤回同理,都在财务系统里由人做