test(channels): preserve thread origin contracts · openclaw/openclaw@645ef81
steipete
·
2026-05-18
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -228,6 +228,31 @@ describe("buildChannelInboundEventContext", () => {
|
228 | 228 | expect(ctx.InboundEventKind).toBe("room_event"); |
229 | 229 | }); |
230 | 230 | |
| 231 | +it("preserves thread-addressable origins alongside flat reply targets", () => { |
| 232 | +const ctx = buildChannelInboundEventContext( |
| 233 | +createBaseContextParams({ |
| 234 | +conversation: { |
| 235 | +kind: "group", |
| 236 | +id: "room-1", |
| 237 | +threadId: "topic-42", |
| 238 | +routePeer: { |
| 239 | +kind: "group", |
| 240 | +id: "room-1", |
| 241 | +}, |
| 242 | +}, |
| 243 | +reply: { |
| 244 | +to: "test:room:room-1", |
| 245 | +originatingTo: "test:room:room-1:topic:topic-42", |
| 246 | +messageThreadId: "topic-42", |
| 247 | +}, |
| 248 | +}), |
| 249 | +); |
| 250 | + |
| 251 | +expect(ctx.To).toBe("test:room:room-1"); |
| 252 | +expect(ctx.OriginatingTo).toBe("test:room:room-1:topic:topic-42"); |
| 253 | +expect(ctx.MessageThreadId).toBe("topic-42"); |
| 254 | +}); |
| 255 | + |
231 | 256 | it("keeps legacy command authorization fallback for authorizer arrays", () => { |
232 | 257 | const ctx = buildChannelInboundEventContext( |
233 | 258 | createBaseContextParams({ |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -131,6 +131,33 @@ describe("message hook mappers", () => {
|
131 | 131 | expect(canonical.messageId).toBe("override-msg"); |
132 | 132 | }); |
133 | 133 | |
| 134 | +it("uses OriginatingTo as the canonical conversation when To is flat", () => { |
| 135 | +const canonical = deriveInboundMessageHookContext( |
| 136 | +makeInboundCtx({ |
| 137 | +To: "demo-chat:chat:456", |
| 138 | +OriginatingTo: "demo-chat:chat:456:topic:42", |
| 139 | +MessageThreadId: 42, |
| 140 | +}), |
| 141 | +); |
| 142 | + |
| 143 | +expect(canonical.to).toBe("demo-chat:chat:456"); |
| 144 | +expect(canonical.conversationId).toBe("demo-chat:chat:456:topic:42"); |
| 145 | +expect(canonical.originatingTo).toBe("demo-chat:chat:456:topic:42"); |
| 146 | + |
| 147 | +const pluginContext = toPluginMessageContext(canonical); |
| 148 | +expect(pluginContext.conversationId).toBe("demo-chat:chat:456:topic:42"); |
| 149 | + |
| 150 | +const receivedEvent = toPluginMessageReceivedEvent(canonical); |
| 151 | +expect(receivedEvent.metadata?.to).toBe("demo-chat:chat:456"); |
| 152 | +expect(receivedEvent.metadata?.originatingTo).toBe("demo-chat:chat:456:topic:42"); |
| 153 | +expect(receivedEvent.metadata?.threadId).toBe(42); |
| 154 | + |
| 155 | +const internalReceived = toInternalMessageReceivedContext(canonical); |
| 156 | +expect(internalReceived.conversationId).toBe("demo-chat:chat:456:topic:42"); |
| 157 | +expect(internalReceived.metadata?.to).toBe("demo-chat:chat:456"); |
| 158 | +expect(internalReceived.metadata?.threadId).toBe(42); |
| 159 | +}); |
| 160 | + |
134 | 161 | it("preserves multi-attachment arrays for inbound claim metadata", () => { |
135 | 162 | const canonical = deriveInboundMessageHookContext( |
136 | 163 | makeInboundCtx({ |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。