chat history in projects

This commit is contained in:
2026-02-23 06:49:18 +00:00
parent 46c3b6b71d
commit 3e2c8090d5
8 changed files with 212 additions and 30 deletions
+12 -7
View File
@@ -50,6 +50,11 @@ const resolveCwd = (home: string, cwd?: string) => {
return home;
};
export const resolveBaseCwd = (email: string, cwdRoot?: string, cwd?: string) => {
const root = resolveRoot(email, cwdRoot);
return resolveCwd(root, cwd);
};
const wsToSessionMap = new WeakMap<any, string>();
function sendToClient(ws: ServerWebSocket<WSData> | null, msg: ServerMessage): void {
@@ -93,7 +98,7 @@ export function close(ws: ServerWebSocket<WSData>): void {
}
}
function createEventHandler(sessionId: string, model: string, cwd: string) {
function createEventHandler(sessionId: string, model: string, cwd: string, storageDir: string) {
return async (event: PiEvent): Promise<void> => {
const session = sessionManager.getSession(sessionId);
if (!session) return;
@@ -212,7 +217,7 @@ function createEventHandler(sessionId: string, model: string, cwd: string) {
// Save session to disk
try {
await storage.saveSession(cwd, sessionId, session.meta, session.messages);
await storage.saveSession(storageDir, sessionId, session.meta, session.messages);
logger.info('Session saved to disk', { sessionId, messageCount: session.messages.length });
} catch (err) {
logger.error('Failed to save session', { sessionId, error: String(err) });
@@ -280,7 +285,7 @@ async function handleChat(
sendToClient(ws, { type: 'session:init', sessionId, model, cwd });
if (!session.piProcess) {
try {
const onEvent = createEventHandler(sessionId, model, cwd);
const onEvent = createEventHandler(sessionId, model, cwd, homeDir);
session.piProcess = await piBridge.spawnPi(cwd, model, onEvent, sandboxed ? { userId, username, email, homeDir } : undefined);
logger.info('Spawned Pi process for session', { sessionId, model, cwd, sandboxed });
} catch (err) {
@@ -313,17 +318,17 @@ async function handleChat(
async function handleResume(
ws: ServerWebSocket<WSData>,
msg: { sessionId: string }
msg: { sessionId: string; cwd?: string; cwdRoot?: string }
): Promise<void> {
const { email } = ws.data;
const { sessionId } = msg;
try {
let session = sessionManager.getSession(sessionId);
if (!session) {
const homeDir = getHomeDir(email);
try {
const { meta, messages } = await storage.loadSession(homeDir, sessionId);
@@ -349,7 +354,7 @@ async function handleResume(
try {
const homeDir = getHomeDir(email);
const sandbox = session.sandboxed && session.userId ? { userId: session.userId, username: ws.data.username, email, homeDir } : undefined;
const onEvent = createEventHandler(sessionId, session.model, session.cwd);
const onEvent = createEventHandler(sessionId, session.model, session.cwd, homeDir);
session.piProcess = await piBridge.spawnPi(session.cwd, session.model, onEvent, sandbox);
logger.info('Spawned fresh Pi process for resumed session', { sessionId, model: session.model, sandboxed: session.sandboxed });
} catch (err) {