feat(channel): owner 车道结构化参与闸与可调旋钮(乙 = C)
主人 2026-10-13 裁决「乙 C」= 默认按甲(群里不对她说就不开口)+ 可调旋钮。 - inbound.go: owner 不再无条件短路参与闸(去掉 `!actor.IsOwner()` 门), 主人群消息改走 shouldRespond 的 owner 车道分支;主人私聊恒回。 - ownerlane.go(新): owner 车道结构化闸 + 判据 `msg.AddressedToMe || (msg.SelfID == "" && len(msg.Mentions) > 0)` (未接线渠道退回旧判据,保护 kook/webhook 的群 @);指向她本人必回(硬保留); 非指向消息按每群旋钮——默认只进上下文不回(registerSilenced 落隔离会话)。 「少说点」类关键词落成结构化降频配置,带 source 日志。 - channelbridge.go: Options.OwnerLaneFor/OwnerLaneSet 读写接缝 + Bridge 状态。 - engage.go: 冷避词表并入「少说点」(与既有「少说两句」同义)。 - runtimeconfig/channels_ownerlane.go(新): owner_lane.json 落盘面 (默认档 + 每群覆盖,可读可改,面板可写)。 - wire_channels.go: 注入 owner_lane.json 存储($DATA_DIR/config/)。 - 测试:不对她说就不回(进上下文零回复)/ @她必回(即使降频)/ 未接线退回 旧判据 / 降频生效且可恢复 + 频率闸 / 旋钮读写接缝 / 归属不变量闭合 / 陌生人私聊与主人私聊回归。变异自证:恢复 owner 短路 ⇒ 5 条用例红。
This commit is contained in:
1 parent
3f266c26b2
commit
537a8b7988
11 files changed
+917
-21
No files matched your search
@@ -123,6 +123,9 @@ func TestInboundChannelPersonaPrecedence(t *testing.T) {
|
||||
// TestInboundGroupForcesDefaultRole 是 design/22 §7-4:群聊——即使
|
||||
// 群里是主人自己的消息——即使账号绑定了角色也仍用默认
|
||||
// 角色,因此隔离的群会话绝不会被移入某个角色的作用域。
|
||||
// 这条主人群消息**指向她本人**(含提及):owner 车道默认「不对她说就不开口」
|
||||
// (design/18 §11),不带指向信号的主人群消息只进上下文、不驱动回合,
|
||||
// 因此这里刻意带上 @ 信号,让本用例仍只验证角色解析这件事。
|
||||
func TestInboundGroupForcesDefaultRole(t *testing.T) {
|
||||
t.Parallel()
|
||||
chat := &envChatter{}
|
||||
@@ -143,7 +146,8 @@ func TestInboundGroupForcesDefaultRole(t *testing.T) {
|
||||
|
||||
b.process(context.Background(), adapter.UnifiedMessage{
|
||||
Platform: "telegram", ChannelID: "-20", ChannelType: adapter.ChannelGroup, GroupID: "-20",
|
||||
SenderID: "100", Sender: adapter.Actor{Role: adapter.RoleOwner}, Content: "我在群里", ContentType: adapter.ContentText,
|
||||
SenderID: "100", Sender: adapter.Actor{Role: adapter.RoleOwner}, Mentions: []adapter.Mention{{UserID: "100"}},
|
||||
Content: "我在群里", ContentType: adapter.ContentText,
|
||||
})
|
||||
|
||||
if !chat.got {
|
||||
|
||||
Reference in new issue
Block a user