






















@@ -1391,36 +1391,55 @@ describe("dispatchCronDelivery — double-announce guard", () => {
13911391}
13921392});
139313931394-it("suppresses NO_REPLY payload in direct delivery so sentinel never leaks to external channels", async () => {
1395-const params = makeBaseParams({ synthesizedText: "NO_REPLY" });
1396-// Force the useDirectDelivery path (structured content) to exercise
1397-// deliverViaDirect without going through finalizeTextDelivery.
1398-(params as Record<string, unknown>).deliveryPayloadHasStructuredContent = true;
1399-const state = await dispatchCronDelivery(params);
1394+it.each([SILENT_REPLY_TOKEN, "ANNOUNCE_SKIP", "REPLY_SKIP"])(
1395+"suppresses %s payload in direct delivery so control tokens never leak to external channels",
1396+async (controlToken) => {
1397+const params = makeBaseParams({ synthesizedText: controlToken });
1398+// Force the useDirectDelivery path (structured content) to exercise
1399+// deliverViaDirect without going through finalizeTextDelivery.
1400+(params as Record<string, unknown>).deliveryPayloadHasStructuredContent = true;
1401+const state = await dispatchCronDelivery(params);
140014021401-// NO_REPLY must be filtered out before reaching the outbound adapter.
1402-expect(deliverOutboundPayloads).not.toHaveBeenCalled();
1403-expectResultFields(state.result, {
1404-status: "ok",
1405-delivered: false,
1406-deliveryAttempted: true,
1407-});
1408-// deliveryAttempted must be true so the heartbeat timer does not fire
1409-// a fallback enqueueSystemEvent with the NO_REPLY sentinel text.
1410-expect(state.deliveryAttempted).toBe(true);
1403+ // Control tokens must be filtered out before reaching the outbound adapter.
1404+ expect(deliverOutboundPayloads).not.toHaveBeenCalled();
1405+ expectResultFields(state.result, {
1406+ status: "ok",
1407+ delivered: false,
1408+ deliveryAttempted: true,
1409+ });
1410+ // deliveryAttempted must be true so the heartbeat timer does not fire
1411+ // a fallback enqueueSystemEvent with the control-token text.
1412+ expect(state.deliveryAttempted).toBe(true);
141114131412-// Verify timer guard agrees: shouldEnqueueCronMainSummary returns false
1413-expect(
1414-shouldEnqueueCronMainSummary({
1415-summaryText: "NO_REPLY",
1416-deliveryRequested: true,
1417-delivered: state.result?.delivered,
1418-deliveryAttempted: state.result?.deliveryAttempted,
1419-suppressMainSummary: false,
1420-isCronSystemEvent: () => true,
1421-}),
1422-).toBe(false);
1423-});
1414+// Verify timer guard agrees: shouldEnqueueCronMainSummary returns false
1415+expect(
1416+shouldEnqueueCronMainSummary({
1417+summaryText: controlToken,
1418+deliveryRequested: true,
1419+delivered: state.result?.delivered,
1420+deliveryAttempted: state.result?.deliveryAttempted,
1421+suppressMainSummary: false,
1422+isCronSystemEvent: () => true,
1423+}),
1424+).toBe(false);
1425+},
1426+);
1427+1428+it.each(["ANNOUNCE_SKIP", "REPLY_SKIP"])(
1429+"suppresses %s payload in text delivery so control tokens never leak to external channels",
1430+async (controlToken) => {
1431+const params = makeBaseParams({ synthesizedText: controlToken });
1432+const state = await dispatchCronDelivery(params);
1433+1434+expect(deliverOutboundPayloads).not.toHaveBeenCalled();
1435+expectResultFields(state.result, {
1436+status: "ok",
1437+delivered: false,
1438+deliveryAttempted: true,
1439+});
1440+expect(state.deliveryAttempted).toBe(true);
1441+},
1442+);
1424144314251444it("delivers explicit targets with direct text through the outbound adapter", async () => {
14261445const params = makeBaseParams({ synthesizedText: "hello from cron" });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。