




















@@ -36,11 +36,48 @@ const deliveryMocks = vi.hoisted(() => ({
3636) => Promise<import("discord-api-types/v10").APIMessage>
3737>(async () => ({ id: "m1" }) as import("discord-api-types/v10").APIMessage),
3838deliverDiscordReply: vi.fn<(params: unknown) => Promise<void>>(async () => {}),
39-createDiscordDraftStream: vi.fn(() => createMockDraftStream()),
39+createDiscordDraftStream: vi.fn<(params: unknown) => ReturnType<typeof createMockDraftStream>>(
40+() => createMockDraftStream(),
41+),
4042}));
4143const editMessageDiscord = deliveryMocks.editMessageDiscord;
4244const deliverDiscordReply = deliveryMocks.deliverDiscordReply;
4345const createDiscordDraftStream = deliveryMocks.createDiscordDraftStream;
46+47+vi.mock("../send.js", () => ({
48+reactMessageDiscord: async (
49+channelId: string,
50+messageId: string,
51+emoji: string,
52+opts?: unknown,
53+) => {
54+await sendMocks.reactMessageDiscord(channelId, messageId, emoji, opts);
55+return { ok: true };
56+},
57+removeReactionDiscord: async (
58+channelId: string,
59+messageId: string,
60+emoji: string,
61+opts?: unknown,
62+) => {
63+await sendMocks.removeReactionDiscord(channelId, messageId, emoji, opts);
64+return { ok: true };
65+},
66+}));
67+68+vi.mock("../send.messages.js", () => ({
69+editMessageDiscord: (channelId: string, messageId: string, payload: unknown, opts?: unknown) =>
70+deliveryMocks.editMessageDiscord(channelId, messageId, payload, opts),
71+}));
72+73+vi.mock("../draft-stream.js", () => ({
74+createDiscordDraftStream: (params: unknown) => deliveryMocks.createDiscordDraftStream(params),
75+}));
76+77+vi.mock("./reply-delivery.js", () => ({
78+deliverDiscordReply: (params: unknown) => deliveryMocks.deliverDiscordReply(params),
79+}));
80+4481type DispatchInboundParams = {
4582dispatcher: {
4683sendBlockReply: (payload: ReplyPayload) => boolean | Promise<boolean>;
@@ -101,94 +138,70 @@ const configSessionsMocks = vi.hoisted(() => ({
101138}));
102139const readSessionUpdatedAt = configSessionsMocks.readSessionUpdatedAt;
103140const resolveStorePath = configSessionsMocks.resolveStorePath;
141+const createDiscordRestClientSpy = vi.hoisted(() =>
142+vi.fn<
143+(params: unknown) => {
144+token: string;
145+rest: object;
146+account: { accountId: string; config: object };
147+}
148+>(() => ({
149+token: "token",
150+rest: {},
151+account: { accountId: "default", config: {} },
152+})),
153+);
104154let createBaseDiscordMessageContext: typeof import("./message-handler.test-harness.js").createBaseDiscordMessageContext;
105155let createDiscordDirectMessageContextOverrides: typeof import("./message-handler.test-harness.js").createDiscordDirectMessageContextOverrides;
106156let threadBindingTesting: typeof import("./thread-bindings.js").__testing;
107157let createThreadBindingManager: typeof import("./thread-bindings.js").createThreadBindingManager;
108158let processDiscordMessage: typeof import("./message-handler.process.js").processDiscordMessage;
109159110-const sendModule = await import("../send.js");
111-vi.spyOn(sendModule, "reactMessageDiscord").mockImplementation(
112-async (channelId, messageId, emoji, opts) => {
113-await sendMocks.reactMessageDiscord(channelId, messageId, emoji, opts);
114-return { ok: true };
115-},
116-);
117-vi.spyOn(sendModule, "removeReactionDiscord").mockImplementation(
118-async (channelId, messageId, emoji, opts) => {
119-await sendMocks.removeReactionDiscord(channelId, messageId, emoji, opts);
120-return { ok: true };
121-},
122-);
123-124-const sendMessagesModule = await import("../send.messages.js");
125-vi.spyOn(sendMessagesModule, "editMessageDiscord").mockImplementation(
126-((
127-channelId: Parameters<typeof sendMessagesModule.editMessageDiscord>[0],
128-messageId: Parameters<typeof sendMessagesModule.editMessageDiscord>[1],
129-payload: Parameters<typeof sendMessagesModule.editMessageDiscord>[2],
130-opts: Parameters<typeof sendMessagesModule.editMessageDiscord>[3],
131-) => deliveryMocks.editMessageDiscord(channelId, messageId, payload, opts) as never) as never,
132-);
133-134-const draftStreamModule = await import("../draft-stream.js");
135-vi.spyOn(draftStreamModule, "createDiscordDraftStream").mockImplementation(
136-deliveryMocks.createDiscordDraftStream,
137-);
138-139-const replyDeliveryModule = await import("./reply-delivery.js");
140-vi.spyOn(replyDeliveryModule, "deliverDiscordReply").mockImplementation(
141-((params: Parameters<typeof replyDeliveryModule.deliverDiscordReply>[0]) =>
142-deliveryMocks.deliverDiscordReply(params) as never) as never,
143-);
160+vi.mock("openclaw/plugin-sdk/reply-runtime", () => ({
161+dispatchInboundMessage: (params: DispatchInboundParams) => dispatchInboundMessage(params),
162+createReplyDispatcherWithTyping: (opts: {
163+deliver: (payload: unknown, info: { kind: string }) => Promise<void> | void;
164+}) => ({
165+dispatcher: {
166+sendToolResult: vi.fn(() => true),
167+sendBlockReply: vi.fn((payload: unknown) => {
168+void opts.deliver(payload, { kind: "block" });
169+return true;
170+}),
171+sendFinalReply: vi.fn((payload: unknown) => {
172+void opts.deliver(payload, { kind: "final" });
173+return true;
174+}),
175+waitForIdle: vi.fn(async () => {}),
176+getQueuedCounts: vi.fn(() => ({ tool: 0, block: 0, final: 0 })),
177+markComplete: vi.fn(),
178+},
179+replyOptions: {},
180+markDispatchIdle: vi.fn(),
181+markRunComplete: vi.fn(),
182+}),
183+}));
144184145-const replyRuntimeModule = await import("openclaw/plugin-sdk/reply-runtime");
146-vi.spyOn(replyRuntimeModule, "dispatchInboundMessage").mockImplementation(
147-((params: Parameters<typeof replyRuntimeModule.dispatchInboundMessage>[0]) =>
148-dispatchInboundMessage(params as DispatchInboundParams) as never) as never,
149-);
150-vi.spyOn(replyRuntimeModule, "createReplyDispatcherWithTyping").mockImplementation(((opts: {
151-deliver: (payload: unknown, info: { kind: string }) => Promise<void> | void;
152-}) => ({
153-dispatcher: {
154-sendToolResult: vi.fn(() => true),
155-sendBlockReply: vi.fn((payload: unknown) => {
156-void opts.deliver(payload as never, { kind: "block" });
157-return true;
158-}),
159-sendFinalReply: vi.fn((payload: unknown) => {
160-void opts.deliver(payload as never, { kind: "final" });
161-return true;
162-}),
163-waitForIdle: vi.fn(async () => {}),
164-getQueuedCounts: vi.fn(() => ({ tool: 0, block: 0, final: 0 })),
165-markComplete: vi.fn(),
166-},
167-replyOptions: {},
168-markDispatchIdle: vi.fn(),
169-markRunComplete: vi.fn(),
170-})) as never);
171-172-const conversationRuntimeModule = await import("openclaw/plugin-sdk/conversation-runtime");
173-vi.spyOn(conversationRuntimeModule, "recordInboundSession").mockImplementation(
174-((params: Parameters<typeof conversationRuntimeModule.recordInboundSession>[0]) =>
175-recordInboundSession(params) as never) as never,
176-);
185+vi.mock("openclaw/plugin-sdk/conversation-runtime", () => ({
186+recordInboundSession: (...args: unknown[]) => recordInboundSession(...args),
187+registerSessionBindingAdapter: vi.fn(),
188+unregisterSessionBindingAdapter: vi.fn(),
189+resolveThreadBindingConversationIdFromBindingId: (bindingId: string) =>
190+bindingId.split(":").at(-1) ?? bindingId,
191+}));
177192178-const sessionStoreRuntimeModule = await import("openclaw/plugin-sdk/session-store-runtime");
179-vi.spyOn(sessionStoreRuntimeModule, "readSessionUpdatedAt").mockImplementation(
180-((params: Parameters<typeof sessionStoreRuntimeModule.readSessionUpdatedAt>[0]) =>
181-configSessionsMocks.readSessionUpdatedAt(params) as never) as never,
182-);
183-vi.spyOn(sessionStoreRuntimeModule, "resolveStorePath").mockImplementation(
184-((
185-path: Parameters<typeof sessionStoreRuntimeModule.resolveStorePath>[0],
186-opts: Parameters<typeof sessionStoreRuntimeModule.resolveStorePath>[1],
187-) => configSessionsMocks.resolveStorePath(path, opts) as never) as never,
188-);
193+vi.mock("openclaw/plugin-sdk/session-store-runtime", () => ({
194+readSessionUpdatedAt: (...args: unknown[]) => configSessionsMocks.readSessionUpdatedAt(...args),
195+resolveStorePath: (...args: unknown[]) => configSessionsMocks.resolveStorePath(...args),
196+}));
189197190-const clientModule = await import("../client.js");
191-const createDiscordRestClientSpy = vi.spyOn(clientModule, "createDiscordRestClient");
198+vi.mock("../client.js", () => ({
199+createDiscordRuntimeAccountContext: (params: { cfg: unknown; accountId: string }) => ({
200+cfg: params.cfg,
201+accountId: params.accountId,
202+}),
203+createDiscordRestClient: (params: unknown) => createDiscordRestClientSpy(params),
204+}));
192205193206const BASE_CHANNEL_ROUTE = {
194207agentId: "main",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。