






















@@ -733,12 +733,74 @@ describe("server-channels auto restart", () => {
733733const manager = createManager({ startupTrace });
734734735735await manager.startChannels();
736+expect(startAccount).not.toHaveBeenCalled();
737+738+await vi.advanceTimersByTimeAsync(0);
739+await flushMicrotasks();
736740737741const names = measureMock.mock.calls.map(([name]) => name);
738742expect(names).toContain("channels.discord.start");
739743expect(names).toContain("channels.discord.list-accounts");
740744expect(names).toContain("channels.discord.runtime");
741745expect(names).toContain("channels.discord.approval-bootstrap");
746+expect(names).toContain("channels.discord.start-account-handoff");
747+expect(startAccount).toHaveBeenCalledTimes(1);
748+});
749+750+it("ends startup trace spans before long-lived channel account tasks settle", async () => {
751+const activeNames = new Set<string>();
752+const measuredNames: string[] = [];
753+const startupTrace = {
754+measure: async <T>(name: string, run: () => T | Promise<T>) => {
755+activeNames.add(name);
756+measuredNames.push(name);
757+try {
758+return await run();
759+} finally {
760+activeNames.delete(name);
761+}
762+},
763+};
764+const channelTask = createDeferred();
765+const startAccount = vi.fn(() => channelTask.promise);
766+767+installTestRegistry(createTestPlugin({ startAccount }));
768+const manager = createManager({ startupTrace });
769+770+await manager.startChannels();
771+await vi.advanceTimersByTimeAsync(0);
772+await flushMicrotasks();
773+774+expect(startAccount).toHaveBeenCalledTimes(1);
775+expect(measuredNames).toContain("channels.discord.start-account-handoff");
776+expect(activeNames.has("channels.discord.start-account-handoff")).toBe(false);
777+expect(
778+manager.getRuntimeSnapshot().channelAccounts.discord?.[DEFAULT_ACCOUNT_ID]?.running,
779+).toBe(true);
780+781+channelTask.resolve();
782+await flushMicrotasks();
783+});
784+785+it("does not start traced channel accounts after stop wins the handoff", async () => {
786+const startupTrace = {
787+measure: async <T>(_name: string, run: () => T | Promise<T>) => await run(),
788+};
789+const startAccount = vi.fn(async () => {});
790+791+installTestRegistry(createTestPlugin({ startAccount }));
792+const manager = createManager({ startupTrace });
793+794+await manager.startChannel("discord", DEFAULT_ACCOUNT_ID);
795+const stopTask = manager.stopChannel("discord", DEFAULT_ACCOUNT_ID);
796+await vi.advanceTimersByTimeAsync(0);
797+await stopTask;
798+await flushMicrotasks();
799+800+expect(startAccount).not.toHaveBeenCalled();
801+expect(
802+manager.getRuntimeSnapshot().channelAccounts.discord?.[DEFAULT_ACCOUNT_ID]?.running,
803+).toBe(false);
742804});
743805744806it("limits whole-channel account startup fanout to four", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。