重构会话管理,简化上下文存储逻辑

This commit is contained in:
2026-06-03 17:14:55 +08:00
parent 76d4b510f4
commit 04ded0ceb0
19 changed files with 420 additions and 235 deletions
+90
View File
@@ -1,9 +1,12 @@
import { describe, expect, it } from "bun:test";
import {
buildPromptWithLearningContext,
generateSessionTitle,
shouldGenerateSessionTitle,
} from "../../src/routes/chatSession.js";
import { type SessionTurnRecord } from "../../src/history/store.js";
import { type MemoryStore } from "../../src/memory/store.js";
import { type OpencodeRuntimeAdapter } from "../../src/runtime/opencode.js";
describe("shouldGenerateSessionTitle", () => {
@@ -71,3 +74,90 @@ describe("generateSessionTitle", () => {
expect(titlePrompt).toContain("助手:三号泵站压力波动主要与夜间阀门开度变化有关。");
});
});
describe("buildPromptWithLearningContext", () => {
const memoryStore = {
buildPromptSnapshot: async () => "",
} as unknown as MemoryStore;
it("prefers persisted frontend messages so aborted turns remain in restored context", async () => {
const prompt = await buildPromptWithLearningContext(
memoryStore,
"actor-1",
"project-1",
{
recentTurns: [],
persistedMessages: [
{ role: "user", content: "先分析 3 号泵站夜间压力波动" },
{
role: "assistant",
content: "已定位到夜间阀门开度变化与压力波动时间段重合,下一步准备对比相邻支路。",
isError: true,
},
{ role: "assistant", content: "⚠️ **请求已中断**", isError: true },
],
message: "继续刚才的分析,并补充相邻支路影响",
},
);
expect(prompt).toContain("用户:先分析 3 号泵站夜间压力波动");
expect(prompt).toContain(
"助手:已定位到夜间阀门开度变化与压力波动时间段重合,下一步准备对比相邻支路。",
);
expect(prompt).not.toContain("⚠️ **请求已中断**");
expect(prompt).toContain("[Current user request]\n继续刚才的分析,并补充相邻支路影响");
});
it("falls back to history turns when frontend state is unavailable", async () => {
const recentTurns: SessionTurnRecord[] = [
{
id: "turn-1",
userMessage: "检查 DMA-2 夜间漏损异常",
assistantMessage: "DMA-2 在 02:00-04:00 出现持续最小夜流抬升。",
timestamp: new Date().toISOString(),
toolCallCount: 1,
},
];
const prompt = await buildPromptWithLearningContext(
memoryStore,
"actor-1",
"project-1",
{
recentTurns,
message: "继续给出排查建议",
},
);
expect(prompt).toContain("用户:检查 DMA-2 夜间漏损异常");
expect(prompt).toContain("助手:DMA-2 在 02:00-04:00 出现持续最小夜流抬升。");
});
it("skips restored conversation injection when reusing an existing opencode session", async () => {
const prompt = await buildPromptWithLearningContext(
memoryStore,
"actor-1",
"project-1",
{
recentTurns: [
{
id: "turn-1",
userMessage: "上一轮问题",
assistantMessage: "上一轮回答",
timestamp: new Date().toISOString(),
toolCallCount: 0,
},
],
persistedMessages: [
{ role: "user", content: "旧问题" },
{ role: "assistant", content: "旧回答" },
],
message: "基于刚才结果继续分析",
restoreConversation: false,
},
);
expect(prompt).not.toContain("[Previous conversation context]");
expect(prompt).toBe("基于刚才结果继续分析");
});
});