能力声明地基 + 自撤回门控修复 + typing 指示器(Slice 1/5 of #19) #20
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Parent
#19(Phase 3 PRD:能力与多模态)
What to build
新增
CapabilitySet(frozen dataclass):typing/recall/self_recall/edit/at_all/sticker/voice/poke/poke_send/reaction_receive/reaction_send/quote/profile_like共 13 个能力位,全部默认
False。本片只消费其中typing/self_recall/edit三个,其余字段先占位供后续切片(Slice 2/3/4)使用,不需要现在就实现对应行为。
ArisePorts新增capabilities: CapabilitySet字段,host 在插件加载时随其它 port 一起声明,静态、进程生命周期内不变(不做运行时探测)。移除
Config.arise_edit_capable,其行为完全迁移为capabilities.edit;RuntimeLoop.__init__的edit_capable: bool参数改为capabilities: CapabilitySet,_handle_edit改用capabilities.edit。顺带修复一个既有 bug:
_handle_self_recall对"已发送(非 pending)"的句柄目前无条件调用egress.recall(),在不支持撤回的平台上会直接抛异常。本片补上capabilities.self_recall门控——无该能力时 fail-closed,不产生任何平台调用,直接返回错误结果(同
handle not found的处理方式);pre-send(句柄仍在
state.pending)分支不变,纯 core 操作,不受影响。新增
typing能力:EgressPort新增send_typing_indicator(chat_id) -> None;_flush在长回复实际发送前,若
capabilities.typing为真则调用之。既有的 sleep pacing 逻辑(_typing_delay)不受影响,那部分纯 core、一直生效,不需要任何能力。
Acceptance criteria
CapabilitySetfrozen dataclass 声明全部 13 个能力位,全部默认FalseArisePorts新增capabilities: CapabilitySet字段,configure()/get_ports()正常透传Config.arise_edit_capable已移除,代码库中无任何引用;capabilities.edit完全取代其行为RuntimeLoop.__init__的edit_capable: bool参数替换为capabilities: CapabilitySet,_handle_edit改用capabilities.edit_handle_self_recall对已发送句柄在capabilities.self_recall=False时不调用egress.recall(),返回明确的错误结果;有专门的回归测试覆盖这一行为(防止未来改动删掉这条门控,重新引入无条件调用的 bug)
EgressPort新增send_typing_indicator(chat_id) -> None方法;_flush在capabilities.typing=True时、长回复实际发送前调用它;capabilities.typing=False时跳过,不影响既有 sleep pacing
FakeEgress扩展为接受CapabilitySet(或等价具名布尔参数),新增记录typing_indicator_callstest_self_message_control*.py/test_runtime_loop.py测试套件全部通过(迁移到新构造参数后无回归)
Blocked by
None - can start immediately