用途
draft-message 用于在 AI 智能体起草了消息、但需要人工在发送前审阅的场景。它把草稿发送到用户自己的 Telegram「Saved Messages」(收藏夹,即每个账号内置的私密自聊会话,会自动同步到所有客户端),由用户自行复制粘贴到目标聊天并发送。
何时用草稿、何时直接发送
- 智能体自主撰写的长消息或多段消息:用草稿,让人先过目。
- 措辞敏感的消息(招聘、解雇、合同条款):用草稿,一个错别字或错名字代价很高。
- 语气重要的回复(面向同级或外部方):用草稿,AI 生成语气可能微妙偏差。
- 简短确认、状态更新、例行回复:直接发送,草稿的摩擦大于价值。
- 自动通知、告警、定时提醒:直接发送,无需人工介入。
- 时间紧迫、草稿→审阅→发送往返太慢:直接发送,接受风险。
不确定时默认用草稿:用户一键即可发送,但发错的消息无法直接撤回。
为什么用 Saved Messages 而非 MTProto 云草稿
官方 Telegram 客户端存在一个已知且未修复的竞态条件(tdesktop#29111,已关闭为「not planned」):本地空草稿状态会静默覆盖通过 SaveDraftRequest 从其他授权推送的云草稿。实践中曾观察到服务器确认了草稿,但用户输入框仍为空。Saved Messages 完全绕开该问题——完整 HTML 格式得以保留,且 Telegram 原生在 iOS、Android、Desktop、Web 各端输入框之间复制粘贴会保留富文本。
使用前检查
起草前先验证会话已授权(不只是文件存在):
bun "$SCRIPT" check-auth
若返回 EXPIRED,先运行 /tlg:setup。
使用方式:tg-cli.ts draft
/usr/bin/env bash << 'DRAFT_EOF'
ROOT="$(cc-plugin-root tlg)"
SCRIPT="$ROOT/scripts/tg-cli.ts"
# 起草纯文本消息,标注目标为某群组
bun "$SCRIPT" draft -1003958083153 "Plain text draft goes here"
# 起草 HTML 格式消息
bun "$SCRIPT" draft --html -1003958083153 "<b>Bold heading</b>
Body text with <code>inline code</code> and a <a href=\"https://example.com\">link</a>."
# 起草并标注目标为某用户
bun "$SCRIPT" draft @someusername "Quick question: does this framing land right?"
DRAFT_EOF
recipient 参数仅用于标注 Saved Messages 中草稿的横幅,并非实际目的地。消息始终发往已授权账号自己的 Saved Messages。该标注帮助用户识别每条累积草稿对应的目标聊天。
在 Saved Messages 中的呈现
每次起草会发送两条消息:
- 标题横幅——
<b>Draft → <chat name></b>(若无法解析聊天名,则回退为原始 recipient 标识符)。 - 正文——按请求格式化的草稿内容。
标题与正文分开,用户可只长按正文、点复制,干净地粘贴到目标聊天输入框,无需裁剪横幅。
AI 智能体工作流
- 在回复中撰写消息。
- 调用 draft 命令——消息落入用户的 Saved Messages,而非目标聊天。
- 告知用户:「Draft for <chat name> saved to your Saved Messages. Open Saved Messages → long-press the body → Copy → paste into the target chat's compose area → review → send.」
- 用户执行复制粘贴,始终既是发送者也是最终审阅者。
- 如需修改,在目标聊天输入框中发送前完成。
草稿是审阅者的安全网——在 AI 撰写与人工发布之间刻意留出停顿。
参数
- recipient(string/int):目标聊天 ID/用户名,仅用于标注 Saved Messages 横幅。
- message(string):草稿文本(必填)。
- --html(flag):将消息按 HTML 解析(加粗/代码/链接)。
- -p/--profile(string):账号配置(默认 eon)。
行为细节
- 草稿是追加而非替换。每次调用发送一对新的(标题、正文)到 Saved Messages,旧草稿仍显示在上方,用户可按位置判断最新一条。
- 长草稿自动分段。正文按约 3900 纯字符自动切分(Telegram 硬上限 4096)。切分边界优先使用 ━━━━━━━━━━━━━━ 分隔符,其次段落换行,再次行换行。每个续段标注
<i>(Part N/M)</i>。完整算法见 send-message SKILL.md 的「Auto-split for long messages」。 - 格式端到端保留:HTML 输入 → 渲染的 Saved Messages 条目 → 复制 → 目标聊天输入框中渲染粘贴。
- 无云草稿竞态:Saved Messages 是普通聊天,消息经正常同步路径传播,不受本地空草稿覆盖缺陷影响。
- 对目标聊天静默:目标聊天中无人被通知或看到任何迹象,只有用户手动粘贴并发送后目标才会知晓。
反模式
- 消息简短且模板化时仍起草:浪费用户时间,本可直接发送并在输入框编辑。
- 快速连续起草多条:Saved Messages 变成过期草稿墙,难以分辨哪条是当前草稿。
- 对时间紧迫的告警(宕机、故障)使用草稿:用户可能数小时后才打开 Saved Messages。
- 声称草稿「已发送到群组」:应明确区分「Draft saved to Saved Messages for your review」与「Message sent」。
- 忘记告知用户粘贴到目标聊天:若用户不知下一步,草稿会永远留在 Saved Messages。
错误处理
- Cannot find any entity:用户名/聊天 ID 有误。标注回退为原始标识符,草稿仍会保存到 Saved Messages。
- Session expired:会话失效。运行 /tlg:setup。
与其他 TLG 技能的关系
- send-message:无需人工审阅时使用;包含对已发送消息的编辑与补充规范。
- draft-message(本技能):需要发送前人工审阅时使用。
- search-messages:起草回复前查看现有聊天上下文时有用。
执行后反思
技能完成后检查:草稿是否落入 Saved Messages(请用户确认);用户是否成功粘贴到目标聊天(若粘贴时格式损坏,报告具体客户端 iOS/Android/Desktop/Web,以便在行为细节中补充客户端特定说明);草稿是否比直接发送更合适(若用户未编辑即复制粘贴发送,说明草稿多余,下次类似消息可考虑直接发送)。仅在问题真实且可复现时才更新此 SKILL.md。
限制
本技能依赖已授权的 Telegram 会话与 tlg 插件脚本;recipient 仅作标注,不决定发送目的地;草稿不会自动发送,需用户手动复制粘贴并发送;长消息分段阈值与格式保留效果受 Telegram 客户端行为影响。