


























@@ -1,4 +1,4 @@
1-type LiveTransportStandardScenarioId =
1+export type LiveTransportStandardScenarioId =
22| "canary"
33| "mention-gating"
44| "allowlist-block"
@@ -22,6 +22,26 @@ type LiveTransportStandardScenarioDefinition = {
2222title: string;
2323};
242425+export type LiveTransportCoverageMember = {
26+scenarioId?: string;
27+standardId: LiveTransportStandardScenarioId;
28+};
29+30+export type LiveTransportCoverageLane = {
31+commandName: string;
32+members: readonly LiveTransportCoverageMember[];
33+transportId: string;
34+};
35+36+export type LiveTransportCoverageLaneSummary = {
37+baselineMissingStandardScenarioIds: LiveTransportStandardScenarioId[];
38+commandName: string;
39+memberCount: number;
40+members: LiveTransportCoverageMember[];
41+standardScenarioIds: LiveTransportStandardScenarioId[];
42+transportId: string;
43+};
44+2545const LIVE_TRANSPORT_STANDARD_SCENARIOS: readonly LiveTransportStandardScenarioDefinition[] = [
2646{
2747id: "canary",
@@ -79,6 +99,48 @@ export const LIVE_TRANSPORT_BASELINE_STANDARD_SCENARIO_IDS: readonly LiveTranspo
7999"restart-resume",
80100] as const;
81101102+export const LIVE_TRANSPORT_COVERAGE_LANES: readonly LiveTransportCoverageLane[] = [
103+{
104+transportId: "discord",
105+commandName: "discord",
106+members: [
107+{ standardId: "canary", scenarioId: "discord-canary" },
108+{ standardId: "mention-gating", scenarioId: "discord-mention-gating" },
109+],
110+},
111+{
112+transportId: "slack",
113+commandName: "slack",
114+members: [
115+{ standardId: "canary", scenarioId: "slack-canary" },
116+{ standardId: "mention-gating", scenarioId: "slack-mention-gating" },
117+{ standardId: "allowlist-block", scenarioId: "slack-allowlist-block" },
118+{ standardId: "top-level-reply-shape", scenarioId: "slack-top-level-reply-shape" },
119+{ standardId: "restart-resume", scenarioId: "slack-restart-resume" },
120+{ standardId: "thread-follow-up", scenarioId: "slack-thread-follow-up" },
121+{ standardId: "thread-isolation", scenarioId: "slack-thread-isolation" },
122+],
123+},
124+{
125+transportId: "telegram",
126+commandName: "telegram",
127+members: [
128+{ standardId: "canary" },
129+{ standardId: "help-command", scenarioId: "telegram-help-command" },
130+{ standardId: "mention-gating", scenarioId: "telegram-mention-gating" },
131+],
132+},
133+{
134+transportId: "whatsapp",
135+commandName: "whatsapp",
136+members: [
137+{ standardId: "canary", scenarioId: "whatsapp-canary" },
138+{ standardId: "allowlist-block", scenarioId: "whatsapp-pairing-block" },
139+{ standardId: "mention-gating", scenarioId: "whatsapp-mention-gating" },
140+],
141+},
142+] as const;
143+82144const LIVE_TRANSPORT_STANDARD_SCENARIO_ID_SET = new Set(
83145LIVE_TRANSPORT_STANDARD_SCENARIOS.map((scenario) => scenario.id),
84146);
@@ -146,3 +208,31 @@ export function findMissingLiveTransportStandardScenarios(params: {
146208const covered = new Set(params.coveredStandardScenarioIds);
147209return params.expectedStandardScenarioIds.filter((id) => !covered.has(id));
148210}
211+212+export function buildLiveTransportCoverageLaneSummaries(
213+lanes: readonly LiveTransportCoverageLane[] = LIVE_TRANSPORT_COVERAGE_LANES,
214+): LiveTransportCoverageLaneSummary[] {
215+return lanes
216+.map((lane) => {
217+const standardScenarioIds = collectLiveTransportStandardScenarioCoverage({
218+scenarios: lane.members.map((member) => ({
219+id: member.scenarioId ?? `${lane.transportId}:${member.standardId}`,
220+standardId: member.standardId,
221+timeoutMs: 0,
222+title: member.standardId,
223+})),
224+});
225+return {
226+baselineMissingStandardScenarioIds: findMissingLiveTransportStandardScenarios({
227+coveredStandardScenarioIds: standardScenarioIds,
228+expectedStandardScenarioIds: LIVE_TRANSPORT_BASELINE_STANDARD_SCENARIO_IDS,
229+}),
230+commandName: lane.commandName,
231+memberCount: lane.members.length,
232+members: [...lane.members],
233+ standardScenarioIds,
234+transportId: lane.transportId,
235+};
236+})
237+.toSorted((left, right) => left.transportId.localeCompare(right.transportId));
238+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。