\{activeError\}<\/p>/);
// And: only the two live-region phases ever produce spoken text.
const phases: readonly ChatReplyPhase[] = ["idle", "generating", "recovering", "completed", "stopped", "failed"];
const spoken = phases.filter((phase) => chatReplyAnnouncement(phase, 1) !== "");
assert.deepEqual(spoken, ["generating", "completed"]);
});
test("the recovered background reply tells the reader where it landed", () => {
// 原值: homeSurface 里两处「回答已恢复,已显示在对话区末尾。」
// 新值: use-consultation-run 与 consultation-recovery-poll 各一处。
// 原因: 恢复轮询搬出 page.tsx,两处文案都还在,没有改成更短的「回答已恢复。」
const poll = readFileSync(new URL("../src/lib/consultation-recovery-poll.ts", import.meta.url), "utf8");
const hook = readFileSync(new URL("../src/hooks/use-consultation-run.ts", import.meta.url), "utf8");
assert.equal(poll.match(/回答已恢复,已显示在对话区末尾。/g)?.length, 1);
assert.equal(hook.match(/回答已恢复,已显示在对话区末尾。/g)?.length, 1);
assert.doesNotMatch(pageSource, /setComposerNotice\("回答已恢复。"\)/);
assert.doesNotMatch(poll, /setComposerNotice\("回答已恢复。"\)/);
});
test("assertive announcement is reserved for genuine errors", () => {
// 原值: page.tsx / homeSurface 内联 `