forked from EduCraft/curriculum-project-hub
fix(hub): 保留飞书回复上下文
This commit is contained in:
@@ -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 });
|
||||
|
||||
Reference in New Issue
Block a user