Skip to content

feat(cards): botmux send 卡片增加导出飞书文档和原始Markdown按钮#145

Open
zjdznl wants to merge 5 commits into
deepcoldy:masterfrom
zjdznl:feat/card-export-buttons
Open

feat(cards): botmux send 卡片增加导出飞书文档和原始Markdown按钮#145
zjdznl wants to merge 5 commits into
deepcoldy:masterfrom
zjdznl:feat/card-export-buttons

Conversation

@zjdznl

@zjdznl zjdznl commented Jun 8, 2026

Copy link
Copy Markdown

功能

botmux send 发出的消息卡片底部增加两个按钮:

按钮 功能
📄 导出飞书文档 将 AI 回复 markdown 异步导入为飞书 Docx,完成后回复文档链接
📝 原始 Markdown 直接回复 markdown 原文到话题

设计要点

跨进程缓存botmux send 是短命 CLI 进程,卡片回调由长命 daemon 处理,内存 Map 互相不可见。用 os.tmpdir() 文件系统缓存桥接两个进程,TTL 1 小时,上限 2000 文件。

异步导出:飞书卡片回调有超时限制(~3s),export_to_doclark-cli drive +import 需要 3-6s。处理方式:立即返回 toast,Promise.resolve().then(...) 后台执行导入,完成后 sessionReply 回复结果。

安全:卡片按钮回调加入了 isSensitive 白名单,校验 root_id 归属。

改动文件

文件 说明
src/im/lark/reply-content-cache.ts 新增:文件系统缓存,跨进程共享
src/services/doc-import.ts 新增:调 lark-cli drive +import 导入飞书 Docx
src/cli.ts cmdSend 卡片底部加两列按钮
src/im/lark/card-handler.ts 处理 export_to_doc / send_raw_md 回调
src/i18n/zh.ts, src/i18n/en.ts 新增 card.action.content_expired 文案

🤖 Generated with Claude Code

@zjdznl zjdznl requested a review from deepcoldy as a code owner June 8, 2026 07:35
- 新增 reply-content-cache 基于文件系统的跨进程缓存
- 新增 doc-import 调用 lark-cli drive +import 导入飞书 Docx
- 卡片底部加两列按钮:导出飞书文档 + 原始 Markdown
- 异步导出避免飞书回调超时

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@zjdznl zjdznl force-pushed the feat/card-export-buttons branch from 1bc8101 to 931d35a Compare June 8, 2026 07:38
zjdznl and others added 4 commits June 8, 2026 15:43
- 错误提示中安装命令改为 npx @larksuite/cli@latest install
- 新增 BOTMUX_CARD_EXPORT_ENABLED 开关,默认关闭
- 未设置开关时卡片不显示导出/原始MD按钮

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@deepcoldy

Copy link
Copy Markdown
Owner

好想法,不过记得在dashboard中加个开关~ per-bot的或者全局的都行

@deepcoldy

Copy link
Copy Markdown
Owner

感谢这个 PR!🙏 功能很实用——把 AI 回复一键导出成飞书文档 / 取原始 Markdown,确实是不少人想要的。设计上几个点也很用心:用文件系统缓存桥接 short-lived 的 botmux send 和长命 daemon、异步导出避开飞书回调超时、isSensitive 白名单 + root_id 归属校验都到位。

我本地拉下来 review(lark-cli 1.0.44 实测)时发现一个会让导出功能跑不通的点,想跟你同步下,也可能是我哪里理解有误,欢迎指正:

1.(阻断)lark-cli drive +import 没有 --json 这个 flag

doc-import.ts 拼的命令带了 --json,但本地跑会直接报错:

$ lark-cli drive +import --file ... --type docx --name ... --json
Error: unknown flag: --json

(lark-cli 全局 flag 只有 --profile/-h/-v,子命令的 JSON 过滤是 -q/--jq。)于是 exec 非 0 退出,importMarkdownAsDoc 走 catch,用户点「导出飞书文档」每次都会收到 ❌ 导出失败:unknown flag: --json

好消息是 去掉 --json 就完全正常——lark-cli 默认就把结果 JSON 打到 stdout(进度行和 proxy 告警都在 stderr),我真导了一个文档验证过,你现有的解析逻辑 json.ok / json.data.url / job_error_msg === 'success' 跟真实返回结构全部对得上。所以这里应该只需删掉那个 --json 就能端到端跑通。


下面几条是顺手记的小建议,都不阻断,供参考:

2. cli.ts 里把 WEB_TERMINAL_PASSWORD 也加进了 PM2 env 透传,但全仓 grep 没找到读取它的地方,而且跟本 PR 的卡片导出没关系——会不会是本地调试顺带进来的?可以考虑拆出去 / 放单独 PR。

3. importMarkdownAsDoc 的第一个参数 _larkAppId 目前没用到,导入走的是 lark-cli 默认的 user 身份(宿主登录用户),所以生成的文档归宿主用户所有、也没设共享权限。单运营者自己用没问题,但群里其他人点导出时拿到的链接可能打不开——看要不要后续补个共享 / 或在文档里说明下这个限制。

4. 几个 toast(正在导出飞书文档… / 导出失败… / 无法确定 Lark 应用)是直接写的中文,没走 i18n(只有 content_expired 进了 i18n),英文用户会看到中文。

5. reply-content-cacheMAX_FILES(2000) 只在超限时清理过期文件、不删未过期的,高频场景理论上会超过 2000;另外它写在 os.tmpdir()(默认 0644),而 doc-import 写在 dataDir/tmp,两边权限/位置不太一致——都属细节,看要不要统一。


再次感谢~主要就是第 1 点删掉 --json、导出就能跑通了,其余都是可选优化。期待更新!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants