refactor: unify agent session persistence

This commit is contained in:
2026-06-04 15:02:27 +08:00
parent 04ded0ceb0
commit 0ecb2babf3
22 changed files with 542 additions and 497 deletions
+22 -22
View File
@@ -3,11 +3,11 @@ import { spawn } from "node:child_process";
import cors from "cors";
import express from "express";
import { SessionHistoryStore } from "./history/store.js";
import { SessionTranscriptStore } from "./sessions/transcriptStore.js";
import { ChatSessionBridge } from "./chat/sessionBridge.js";
import { config } from "./config.js";
import { ConversationStateStore } from "./conversations/stateStore.js";
import { ConversationStore } from "./conversations/store.js";
import { SessionUiStateStore } from "./sessions/uiStateStore.js";
import { SessionMetadataStore } from "./sessions/metadataStore.js";
import { logger } from "./logger.js";
import { LearningOrchestrator } from "./learning/orchestrator.js";
import { MemoryStore } from "./memory/store.js";
@@ -15,20 +15,20 @@ import { ResultReferenceResolver } from "./results/resolver.js";
import { ResultReferenceStore } from "./results/store.js";
import { buildChatRouter } from "./routes/chat.js";
import { opencodeRuntime } from "./runtime/opencode.js";
import { ToolSessionContextStore } from "./session/toolContextStore.js";
import { SessionRuntimeContextStore } from "./sessions/runtimeContextStore.js";
import { DynamicHttpExecutor } from "./tools/dynamicHttpExecutor.js";
const app = express();
const sessionBridge = new ChatSessionBridge(opencodeRuntime);
const conversationStore = new ConversationStore();
const conversationStateStore = new ConversationStateStore();
const sessionMetadataStore = new SessionMetadataStore();
const sessionUiStateStore = new SessionUiStateStore();
const memoryStore = new MemoryStore();
const sessionHistoryStore = new SessionHistoryStore();
const toolContextStore = new ToolSessionContextStore();
const sessionTranscriptStore = new SessionTranscriptStore();
const sessionRuntimeContextStore = new SessionRuntimeContextStore();
const learningOrchestrator = new LearningOrchestrator(
opencodeRuntime,
memoryStore,
sessionHistoryStore,
sessionTranscriptStore,
);
const resultReferenceStore = new ResultReferenceStore();
const resultReferenceResolver = new ResultReferenceResolver(resultReferenceStore);
@@ -68,7 +68,7 @@ app.post("/internal/tools/dynamic-http-call", async (req, res) => {
const sessionId =
typeof req.body?.session_id === "string" ? req.body.session_id.trim() : "";
const context = sessionId ? await toolContextStore.read(sessionId) : null;
const context = sessionId ? await sessionRuntimeContextStore.read(sessionId) : null;
if (!context) {
res.status(404).json({
message: "session context not found",
@@ -114,7 +114,7 @@ app.post("/internal/tools/tjwater-cli-call", async (req, res) => {
const sessionId =
typeof req.body?.session_id === "string" ? req.body.session_id.trim() : "";
const context = sessionId ? await toolContextStore.read(sessionId) : null;
const context = sessionId ? await sessionRuntimeContextStore.read(sessionId) : null;
if (!context) {
res.status(404).json({
message: "session context not found",
@@ -218,7 +218,7 @@ app.post("/internal/tools/fetch-result-ref", async (req, res) => {
const sessionId =
typeof req.body?.session_id === "string" ? req.body.session_id.trim() : "";
const resultRef = typeof req.body?.result_ref === "string" ? req.body.result_ref : "";
const context = sessionId ? await toolContextStore.read(sessionId) : null;
const context = sessionId ? await sessionRuntimeContextStore.read(sessionId) : null;
if (!context) {
res.status(404).json({
message: "session context not found",
@@ -261,7 +261,7 @@ app.post("/internal/tools/store-render-ref", async (req, res) => {
const sessionId =
typeof req.body?.session_id === "string" ? req.body.session_id.trim() : "";
const filePath = typeof req.body?.file_path === "string" ? req.body.file_path.trim() : "";
const context = sessionId ? await toolContextStore.read(sessionId) : null;
const context = sessionId ? await sessionRuntimeContextStore.read(sessionId) : null;
if (!context) {
res.status(404).json({
message: "session context not found",
@@ -311,7 +311,7 @@ app.post("/internal/tools/session-search", async (req, res) => {
const sessionId =
typeof req.body?.session_id === "string" ? req.body.session_id.trim() : "";
const query = typeof req.body?.query === "string" ? req.body.query : "";
const context = sessionId ? await toolContextStore.read(sessionId) : null;
const context = sessionId ? await sessionRuntimeContextStore.read(sessionId) : null;
if (!context) {
res.status(404).json({
message: "session context not found",
@@ -323,7 +323,7 @@ app.post("/internal/tools/session-search", async (req, res) => {
res.status(400).json({ message: "query is required" });
return;
}
const hits = await sessionHistoryStore.search(
const hits = await sessionTranscriptStore.search(
{
actorKey: context.actorKey,
projectKey: context.projectKey,
@@ -342,10 +342,10 @@ app.use(
buildChatRouter(
sessionBridge,
opencodeRuntime,
conversationStore,
conversationStateStore,
sessionMetadataStore,
sessionUiStateStore,
memoryStore,
sessionHistoryStore,
sessionTranscriptStore,
learningOrchestrator,
resultReferenceResolver,
),
@@ -353,13 +353,13 @@ app.use(
const bootstrap = async () => {
await Promise.all([
conversationStore.initialize(),
conversationStateStore.initialize(),
sessionMetadataStore.initialize(),
sessionUiStateStore.initialize(),
learningOrchestrator.initialize(),
memoryStore.initialize(),
resultReferenceStore.initialize(),
sessionHistoryStore.initialize(),
toolContextStore.initialize(),
sessionTranscriptStore.initialize(),
sessionRuntimeContextStore.initialize(),
]);
resultReferenceStore.startCleanupLoop();
};