fix(hub): 保留飞书回复上下文

This commit is contained in:
2026-07-08 16:03:52 +08:00
parent a025d23af8
commit a00e4f9871
7 changed files with 311 additions and 10 deletions
+80
View File
@@ -336,6 +336,86 @@ describe("trigger full lifecycle (integration)", () => {
expect(receipts[0]?.eventId).toBe("evt-dedup-1");
});
it("dedups flattened websocket events by top-level event_id", async () => {
await seedProject("proj-13b", "chat-13b");
const trigger = makeTriggerHandler({ prisma, settings, logger: silentLogger, runAgent });
const event: MessageReceiveEvent = {
...makeEvent("chat-13b", "@_user_1 写教案"),
event_id: "evt-flat-1",
event_type: "im.message.receive_v1",
};
await trigger(event, rt);
await vi.waitFor(async () => {
expect(await prisma.agentRun.findMany()).toHaveLength(1);
});
await trigger(
{
...event,
message: { ...event.message, message_id: "m_flat_redelivery" },
},
rt,
);
const runs = await prisma.agentRun.findMany();
expect(runs).toHaveLength(1);
const receipts = await prisma.feishuEventReceipt.findMany();
expect(receipts).toHaveLength(1);
expect(receipts[0]?.eventId).toBe("evt-flat-1");
});
it("seeds replied-to message context when @bot is used in a Feishu reply", async () => {
await seedProject("proj-13c", "chat-13c");
rt.readableMessages.set("m-parent", {
message_id: "m-parent",
root_id: "m-root",
thread_id: "thread-1",
msg_type: "text",
chat_id: "chat-13c",
sender: { id: "ou_teacher_2", sender_type: "user" },
body: { content: JSON.stringify({ text: "上一条需求: 把第二题改成探究题。" }) },
});
const trigger = makeTriggerHandler({ prisma, settings, logger: silentLogger, runAgent });
const baseEvent = makeEvent("chat-13c", "@_user_1 继续这个改法");
const event: MessageReceiveEvent = {
...baseEvent,
message: {
...baseEvent.message,
message_id: "m-child",
root_id: "m-root",
parent_id: "m-parent",
thread_id: "thread-1",
},
};
await trigger(event, rt);
await vi.waitFor(() => {
expect(runAgentCalls).toHaveLength(1);
});
const prompt = runAgentCalls[0]?.prompt ?? "";
expect(prompt).toContain("Feishu trigger context");
expect(prompt).toContain("reply_to_message_id");
expect(prompt).toContain("m-parent");
expect(prompt).toContain("thread-1");
expect(prompt).toContain("上一条需求");
expect(prompt).toContain("User request:\n继续这个改法");
const run = await prisma.agentRun.findFirst();
expect(run?.prompt).toBe(prompt);
expect(run?.metadata).toMatchObject({
roleId: "draft",
rawPrompt: "继续这个改法",
feishuTriggerContext: {
trigger_message_id: "m-child",
reply_to_message_id: "m-parent",
root_id: "m-root",
thread_id: "thread-1",
},
});
});
it("writes audit entries across the run lifecycle", async () => {
await seedProject("proj-14", "chat-14");
const trigger = makeTriggerHandler({ prisma, settings, logger: silentLogger, runAgent });