


























@@ -7,6 +7,53 @@ afterEach(() => {
77__testing.setDepsForTest();
88});
9910+const slackThreadOrigin = {
11+channel: "slack",
12+to: "channel:C123",
13+accountId: "acct-1",
14+threadId: "171.222",
15+} as const;
16+17+function createGatewayMock() {
18+return vi.fn(async () => ({}) as Record<string, unknown>) as unknown as typeof runtimeCallGateway;
19+}
20+21+async function deliverSlackThreadAnnouncement(params: {
22+callGateway: typeof runtimeCallGateway;
23+isActive: boolean;
24+sessionId: string;
25+expectsCompletionMessage: boolean;
26+directIdempotencyKey: string;
27+queueEmbeddedPiMessage?: (sessionId: string, message: string) => boolean;
28+}) {
29+__testing.setDepsForTest({
30+callGateway: params.callGateway,
31+getRequesterSessionActivity: () => ({
32+sessionId: params.sessionId,
33+isActive: params.isActive,
34+}),
35+loadConfig: () => ({}) as never,
36+ ...(params.queueEmbeddedPiMessage
37+ ? { queueEmbeddedPiMessage: params.queueEmbeddedPiMessage }
38+ : {}),
39+});
40+41+return deliverSubagentAnnouncement({
42+requesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
43+targetRequesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
44+triggerMessage: "child done",
45+steerMessage: "child done",
46+requesterOrigin: slackThreadOrigin,
47+requesterSessionOrigin: slackThreadOrigin,
48+completionDirectOrigin: slackThreadOrigin,
49+directOrigin: slackThreadOrigin,
50+requesterIsSubagent: false,
51+expectsCompletionMessage: params.expectsCompletionMessage,
52+bestEffortDeliver: true,
53+directIdempotencyKey: params.directIdempotencyKey,
54+});
55+}
56+1057describe("resolveAnnounceOrigin threaded route targets", () => {
1158it("preserves stored thread ids when requester origin omits one for the same chat", () => {
1259expect(
@@ -70,53 +117,15 @@ describe("resolveAnnounceOrigin threaded route targets", () => {
7011771118describe("deliverSubagentAnnouncement completion delivery", () => {
72119it("keeps completion announces session-internal while preserving route context for active requesters", async () => {
73-const callGateway = vi.fn(
74-async () => ({}) as Record<string, unknown>,
75-) as unknown as typeof runtimeCallGateway;
120+const callGateway = createGatewayMock();
76121const queueEmbeddedPiMessage = vi.fn(() => true);
77-__testing.setDepsForTest({
122+const result = await deliverSlackThreadAnnouncement({
78123 callGateway,
79-getRequesterSessionActivity: () => ({
80-sessionId: "requester-session-1",
81-isActive: true,
82-}),
83-loadConfig: () => ({}) as never,
84- queueEmbeddedPiMessage,
85-});
86-87-const result = await deliverSubagentAnnouncement({
88-requesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
89-targetRequesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
90-triggerMessage: "child done",
91-steerMessage: "child done",
92-requesterOrigin: {
93-channel: "slack",
94-to: "channel:C123",
95-accountId: "acct-1",
96-threadId: "171.222",
97-},
98-requesterSessionOrigin: {
99-channel: "slack",
100-to: "channel:C123",
101-accountId: "acct-1",
102-threadId: "171.222",
103-},
104-completionDirectOrigin: {
105-channel: "slack",
106-to: "channel:C123",
107-accountId: "acct-1",
108-threadId: "171.222",
109-},
110-directOrigin: {
111-channel: "slack",
112-to: "channel:C123",
113-accountId: "acct-1",
114-threadId: "171.222",
115-},
116-requesterIsSubagent: false,
124+sessionId: "requester-session-1",
125+isActive: true,
117126expectsCompletionMessage: true,
118-bestEffortDeliver: true,
119127directIdempotencyKey: "announce-1",
128+ queueEmbeddedPiMessage,
120129});
121130122131expect(result).toEqual(
@@ -130,50 +139,12 @@ describe("deliverSubagentAnnouncement completion delivery", () => {
130139});
131140132141it("keeps direct external delivery for dormant completion requesters", async () => {
133-const callGateway = vi.fn(
134-async () => ({}) as Record<string, unknown>,
135-) as unknown as typeof runtimeCallGateway;
136-__testing.setDepsForTest({
142+const callGateway = createGatewayMock();
143+await deliverSlackThreadAnnouncement({
137144 callGateway,
138-getRequesterSessionActivity: () => ({
139-sessionId: "requester-session-2",
140-isActive: false,
141-}),
142-loadConfig: () => ({}) as never,
143-});
144-145-await deliverSubagentAnnouncement({
146-requesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
147-targetRequesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
148-triggerMessage: "child done",
149-steerMessage: "child done",
150-requesterOrigin: {
151-channel: "slack",
152-to: "channel:C123",
153-accountId: "acct-1",
154-threadId: "171.222",
155-},
156-requesterSessionOrigin: {
157-channel: "slack",
158-to: "channel:C123",
159-accountId: "acct-1",
160-threadId: "171.222",
161-},
162-completionDirectOrigin: {
163-channel: "slack",
164-to: "channel:C123",
165-accountId: "acct-1",
166-threadId: "171.222",
167-},
168-directOrigin: {
169-channel: "slack",
170-to: "channel:C123",
171-accountId: "acct-1",
172-threadId: "171.222",
173-},
174-requesterIsSubagent: false,
145+sessionId: "requester-session-2",
146+isActive: false,
175147expectsCompletionMessage: true,
176-bestEffortDeliver: true,
177148directIdempotencyKey: "announce-1b",
178149});
179150@@ -193,50 +164,12 @@ describe("deliverSubagentAnnouncement completion delivery", () => {
193164});
194165195166it("keeps direct external delivery for non-completion announces", async () => {
196-const callGateway = vi.fn(
197-async () => ({}) as Record<string, unknown>,
198-) as unknown as typeof runtimeCallGateway;
199-__testing.setDepsForTest({
167+const callGateway = createGatewayMock();
168+await deliverSlackThreadAnnouncement({
200169 callGateway,
201-getRequesterSessionActivity: () => ({
202-sessionId: "requester-session-3",
203-isActive: false,
204-}),
205-loadConfig: () => ({}) as never,
206-});
207-208-await deliverSubagentAnnouncement({
209-requesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
210-targetRequesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
211-triggerMessage: "child done",
212-steerMessage: "child done",
213-requesterOrigin: {
214-channel: "slack",
215-to: "channel:C123",
216-accountId: "acct-1",
217-threadId: "171.222",
218-},
219-requesterSessionOrigin: {
220-channel: "slack",
221-to: "channel:C123",
222-accountId: "acct-1",
223-threadId: "171.222",
224-},
225-completionDirectOrigin: {
226-channel: "slack",
227-to: "channel:C123",
228-accountId: "acct-1",
229-threadId: "171.222",
230-},
231-directOrigin: {
232-channel: "slack",
233-to: "channel:C123",
234-accountId: "acct-1",
235-threadId: "171.222",
236-},
237-requesterIsSubagent: false,
170+sessionId: "requester-session-3",
171+isActive: false,
238172expectsCompletionMessage: false,
239-bestEffortDeliver: true,
240173directIdempotencyKey: "announce-2",
241174});
242175此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。