MessageWeave/src
anonsaber bfe0fd88aa feat: Telegram /search 邮件搜索(email/query Filter + SearchSnippet/get 高亮)
⑥-c 落地代码缺口:/search <关键词>

实现
- JmapBackend::search_emails 加 trait 默认实现(mock 后端返回 InvalidRequest,
  真机后端用 Email/query + text Filter 取 ID,再 SearchSnippet/get 取高亮)
- JmapService::search_emails 暴露搜索入口,与 list_emails_page 共享超时/错误映射
- worker:Intent::Search + /search 分发分支 + /help 说明行

降级路径(不 panic、不回栈给用户)
- SearchSnippet/get 不支持(unknownMethod/timeout)→ 仍返回匹配 ID 列表,
  渲染降级为高亮片段暂不可用
- 无匹配 → 没有找到匹配「…」的邮件。
- JMAP 侧失败 → SearchReply::Retry,交由协调器 503 + Retry-After 重试
- 搜索关键词为空 → 引导提示,不发请求

安全边界
- subject/preview 只做展示:strip_mark_tags 剥 <mark> 高亮(大小写不敏感、
  未闭合标记丢弃,不泄漏原始标记),unescape_html_entities 单趟解码,
  先剥标签再解码实体以保留邮箱正文里字面 <mark>
- 无匹配 ID / 主题 / preview 分别有截断上限(120/120/160 字符)
- 每条命中带 email_id,可直接接 /summary <email_id>
- 中文关键词仅前缀匹配,避免帮我搜一下发票被劫持成搜索、或覆盖授权意图

测试 +7(55 → 62 passed, 0 failed, 1 ignored)
2026-09-28 21:09:06 +08:00
..
domain feat: Telegram /search 邮件搜索(email/query Filter + SearchSnippet/get 高亮) 2026-09-28 21:09:06 +08:00
ai.rs feat: initial MessageWeave release 2026-09-25 09:14:04 +08:00
channel.rs telegram: 重试之间加指数退避,429 尊重服务端 retry_after(01a0e75f-f7e3) 2026-09-28 18:13:08 +08:00
config.rs fix(worker,state,jmap,config): close independent-review findings 2026-09-27 12:53:05 +08:00
debug.rs debug: 新增 /debug/* 远程联调面,双因子门禁默认绝对关闭(01a0e319) 2026-09-28 15:00:49 +08:00
domain.rs feat: initial MessageWeave release 2026-09-25 09:14:04 +08:00
error.rs feat: initial MessageWeave release 2026-09-25 09:14:04 +08:00
main.rs debug: 新增 /debug/* 远程联调面,双因子门禁默认绝对关闭(01a0e319) 2026-09-28 15:00:49 +08:00
notify.rs debug: 新增 /debug/* 远程联调面,双因子门禁默认绝对关闭(01a0e319) 2026-09-28 15:00:49 +08:00
state.rs state: XAUTOCLAIM 空闲阈值改由运行超时配置推导,封顶 6h(01a0e75f-f9b1) 2026-09-28 18:38:00 +08:00
web.rs feat: initial MessageWeave release 2026-09-25 09:14:04 +08:00
worker.rs feat: Telegram /search 邮件搜索(email/query Filter + SearchSnippet/get 高亮) 2026-09-28 21:09:06 +08:00