Refactor SessionManager to use static factory methods

- Add factory methods: create(cwd), open(path), continueRecent(cwd), inMemory()
- Add static list(cwd) for session listing
- Make constructor private, pass cwd explicitly
- Update SDK to take sessionManager instead of sessionFile options
- Update main.ts to create SessionManager based on CLI flags
- Update SessionSelectorComponent to take sessions[] instead of SessionManager
- Update tests to use factory methods
This commit is contained in:
Mario Zechner 2025-12-22 01:29:54 +01:00
parent 7bf4c8ff24
commit ace8ea3d5b
9 changed files with 346 additions and 473 deletions

View file

@ -11,27 +11,17 @@ import {
Text,
truncateToWidth,
} from "@mariozechner/pi-tui";
import type { SessionManager } from "../../../core/session-manager.js";
import type { SessionInfo } from "../../../core/session-manager.js";
import { fuzzyFilter } from "../../../utils/fuzzy.js";
import { theme } from "../theme/theme.js";
import { DynamicBorder } from "./dynamic-border.js";
interface SessionItem {
path: string;
id: string;
created: Date;
modified: Date;
messageCount: number;
firstMessage: string;
allMessagesText: string;
}
/**
* Custom session list component with multi-line items and search
*/
class SessionList implements Component {
private allSessions: SessionItem[] = [];
private filteredSessions: SessionItem[] = [];
private allSessions: SessionInfo[] = [];
private filteredSessions: SessionInfo[] = [];
private selectedIndex: number = 0;
private searchInput: Input;
public onSelect?: (sessionPath: string) => void;
@ -39,7 +29,7 @@ class SessionList implements Component {
public onExit: () => void = () => {};
private maxVisible: number = 5; // Max sessions visible (each session is 3 lines: msg + metadata + blank)
constructor(sessions: SessionItem[]) {
constructor(sessions: SessionInfo[]) {
this.allSessions = sessions;
this.filteredSessions = sessions;
this.searchInput = new Input();
@ -176,16 +166,13 @@ export class SessionSelectorComponent extends Container {
private sessionList: SessionList;
constructor(
sessionManager: SessionManager,
sessions: SessionInfo[],
onSelect: (sessionPath: string) => void,
onCancel: () => void,
onExit: () => void,
) {
super();
// Load all sessions
const sessions = sessionManager.loadAllSessions();
// Add header
this.addChild(new Spacer(1));
this.addChild(new Text(theme.bold("Resume Session"), 1, 0));

View file

@ -32,7 +32,12 @@ import type { HookUIContext } from "../../core/hooks/index.js";
import { isBashExecutionMessage } from "../../core/messages.js";
import { invalidateOAuthCache } from "../../core/model-config.js";
import { listOAuthProviders, login, logout, type OAuthProvider } from "../../core/oauth/index.js";
import { getLatestCompactionEntry, SUMMARY_PREFIX, SUMMARY_SUFFIX } from "../../core/session-manager.js";
import {
getLatestCompactionEntry,
SessionManager,
SUMMARY_PREFIX,
SUMMARY_SUFFIX,
} from "../../core/session-manager.js";
import { loadSkills } from "../../core/skills.js";
import { loadProjectContextFiles } from "../../core/system-prompt.js";
import type { TruncationResult } from "../../core/tools/truncate.js";
@ -1513,8 +1518,9 @@ export class InteractiveMode {
private showSessionSelector(): void {
this.showSelector((done) => {
const sessions = SessionManager.list(this.sessionManager.getCwd());
const selector = new SessionSelectorComponent(
this.sessionManager,
sessions,
async (sessionPath) => {
done();
await this.handleResumeSession(sessionPath);