






















@@ -220,3 +220,73 @@ describe("session origin across a channel switch (real inbound-event context bui
220220expect(afterTelegram.origin?.nativeChannelId).toBeUndefined();
221221});
222222});
223+224+describe("session origin across a non-delivery turn", () => {
225+const webchatTurn = {
226+Provider: "webchat",
227+Surface: "webchat",
228+OriginatingChannel: "webchat",
229+ChatType: "direct",
230+} satisfies Partial<MsgContext>;
231+232+it("keeps the bound Slack channel identity across a non-deliver gateway webchat turn", () => {
233+const afterSlack = applyOrigin(undefined, slackTurn);
234+const afterWebchat = applyOrigin(afterSlack, webchatTurn);
235+236+expect(afterWebchat.origin?.nativeChannelId).toBe("D111SLACK");
237+expect(afterWebchat.origin?.nativeDirectUserId).toBe("U0001");
238+expect(afterWebchat.origin?.accountId).toBe("slack-team-1");
239+expect(afterWebchat.origin?.threadId).toBe("1700000000.000100");
240+});
241+242+it("keeps the bound channel identity across a heartbeat tick", () => {
243+const afterSlack = applyOrigin(undefined, slackTurn);
244+const afterHeartbeat = applyOrigin(afterSlack, {
245+Provider: "heartbeat",
246+Surface: "heartbeat",
247+OriginatingChannel: "heartbeat",
248+ChatType: "direct",
249+} satisfies Partial<MsgContext>);
250+251+expect(afterHeartbeat.origin?.nativeChannelId).toBe("D111SLACK");
252+expect(afterHeartbeat.origin?.threadId).toBe("1700000000.000100");
253+});
254+255+it("keeps the bound channel identity across a cron-event turn that omits the channel", () => {
256+const afterSlack = applyOrigin(undefined, slackTurn);
257+const afterCron = applyOrigin(afterSlack, {
258+Provider: "cron-event",
259+ChatType: "direct",
260+From: "cron:job_REDACTED",
261+To: "cron:job_REDACTED",
262+} satisfies Partial<MsgContext>);
263+264+expect(afterCron.origin?.nativeChannelId).toBe("D111SLACK");
265+expect(afterCron.origin?.nativeDirectUserId).toBe("U0001");
266+expect(afterCron.origin?.accountId).toBe("slack-team-1");
267+expect(afterCron.origin?.threadId).toBe("1700000000.000100");
268+});
269+270+it("keeps the bound channel identity across an exec-event turn that omits the channel", () => {
271+const afterSlack = applyOrigin(undefined, slackTurn);
272+const afterExec = applyOrigin(afterSlack, {
273+Provider: "exec-event",
274+ChatType: "direct",
275+From: "exec:run_REDACTED",
276+To: "exec:run_REDACTED",
277+} satisfies Partial<MsgContext>);
278+279+expect(afterExec.origin?.nativeChannelId).toBe("D111SLACK");
280+expect(afterExec.origin?.threadId).toBe("1700000000.000100");
281+});
282+283+it("still adopts a real channel after an intervening non-delivery turn", () => {
284+const afterSlack = applyOrigin(undefined, slackTurn);
285+const afterWebchat = applyOrigin(afterSlack, webchatTurn);
286+const afterTelegram = applyOrigin(afterWebchat, telegramTurn);
287+288+expect(afterTelegram.origin?.provider).toBe("telegram");
289+expect(afterTelegram.origin?.nativeChannelId).toBeUndefined();
290+expect(afterTelegram.origin?.threadId).toBeUndefined();
291+});
292+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。