
























@@ -147,6 +147,9 @@ const replyMediaPathMocks = vi.hoisted(() => ({
147147(_params?: unknown) => async (payload: ReplyPayload) => payload,
148148),
149149}));
150+const runtimePluginMocks = vi.hoisted(() => ({
151+ensureRuntimePluginsLoaded: vi.fn(),
152+}));
150153const threadInfoMocks = vi.hoisted(() => ({
151154parseSessionThreadInfo: vi.fn<
152155(sessionKey: string | undefined) => {
@@ -337,6 +340,9 @@ vi.mock("./reply-media-paths.runtime.js", () => ({
337340createReplyMediaPathNormalizer: (params: unknown) =>
338341replyMediaPathMocks.createReplyMediaPathNormalizer(params),
339342}));
343+vi.mock("../../agents/runtime-plugins.js", () => ({
344+ensureRuntimePluginsLoaded: runtimePluginMocks.ensureRuntimePluginsLoaded,
345+}));
340346vi.mock("../../tts/status-config.js", () => ({
341347resolveStatusTtsSnapshot: () => ({
342348autoMode: "always",
@@ -657,7 +663,30 @@ describe("dispatchReplyFromConfig", () => {
657663replyMediaPathMocks.createReplyMediaPathNormalizer.mockReturnValue(
658664async (payload: ReplyPayload) => payload,
659665);
666+runtimePluginMocks.ensureRuntimePluginsLoaded.mockClear();
667+});
668+669+it("loads runtime plugins before reading inbound hook state", async () => {
670+setNoAbort();
671+const cfg = emptyConfig;
672+const dispatcher = createDispatcher();
673+const ctx = buildTestCtx({
674+Provider: "whatsapp",
675+SessionKey: "agent:main:main",
676+});
677+678+const replyResolver = async () => ({ text: "hi" }) satisfies ReplyPayload;
679+await dispatchReplyFromConfig({ ctx, cfg, dispatcher, replyResolver });
680+681+expect(runtimePluginMocks.ensureRuntimePluginsLoaded).toHaveBeenCalledWith({
682+config: cfg,
683+workspaceDir: expect.any(String),
684+});
685+expect(runtimePluginMocks.ensureRuntimePluginsLoaded.mock.invocationCallOrder[0]).toBeLessThan(
686+hookMocks.runner.hasHooks.mock.invocationCallOrder[0],
687+);
660688});
689+661690it("does not route when Provider matches OriginatingChannel (even if Surface is missing)", async () => {
662691setNoAbort();
663692mocks.routeReply.mockClear();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。