feat: add session manager with CRUD, switching, bookmarks

This commit is contained in:
neken
2026-04-10 15:06:21 +05:00
parent 4e8ada9ac4
commit b889519314
+92
View File
@@ -0,0 +1,92 @@
import { Store, type SessionInfo } from "../state/store.js";
import { basename } from "path";
export class SessionManager {
constructor(private store: Store) {}
get activeSession(): string | null {
return this.store.data.activeSession;
}
get activeSessionInfo(): SessionInfo | null {
const name = this.store.data.activeSession;
if (!name) return null;
return this.store.data.sessions[name] ?? null;
}
getAllSessions(): Record<string, SessionInfo> {
return this.store.data.sessions;
}
resolveProjectPath(nameOrPath: string): { name: string; path: string } | null {
const bookmarked = this.store.data.projects[nameOrPath];
if (bookmarked) {
return { name: nameOrPath, path: bookmarked };
}
const name = this.generateName(basename(nameOrPath));
return { name, path: nameOrPath };
}
private generateName(base: string): string {
if (!this.store.data.sessions[base]) return base;
let i = 2;
while (this.store.data.sessions[`${base}-${i}`]) i++;
return `${base}-${i}`;
}
createSession(name: string, cwd: string, sessionId: string): void {
this.store.data.sessions[name] = { sessionId, cwd, status: "idle" };
this.store.data.activeSession = name;
this.store.save();
}
stopSession(name: string): boolean {
if (!this.store.data.sessions[name]) return false;
delete this.store.data.sessions[name];
if (this.store.data.activeSession === name) {
const remaining = Object.keys(this.store.data.sessions);
this.store.data.activeSession = remaining.length > 0 ? remaining[0] : null;
}
this.store.save();
return true;
}
stopAll(): number {
const count = Object.keys(this.store.data.sessions).length;
this.store.data.sessions = {};
this.store.data.activeSession = null;
this.store.save();
return count;
}
switchSession(name: string): boolean {
if (!this.store.data.sessions[name]) return false;
this.store.data.activeSession = name;
this.store.save();
return true;
}
setStatus(name: string, status: "idle" | "busy"): void {
const session = this.store.data.sessions[name];
if (session) {
session.status = status;
this.store.save();
}
}
saveProject(name: string, path: string): void {
this.store.data.projects[name] = path;
this.store.save();
}
removeProject(name: string): boolean {
if (!this.store.data.projects[name]) return false;
delete this.store.data.projects[name];
this.store.save();
return true;
}
getProjects(): Record<string, string> {
return this.store.data.projects;
}
}