diff --git a/src/services/session-manager.ts b/src/services/session-manager.ts new file mode 100644 index 0000000..027ce7c --- /dev/null +++ b/src/services/session-manager.ts @@ -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 { + 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 { + return this.store.data.projects; + } +}