feat(01-01): thread FileSystemProvider through SessionParser and SubagentResolver

- Add getFileSystemProvider() getter to ProjectScanner
- Update SessionParser.parseSessionFile() to pass provider to parseJsonlFile()
- Update SessionParser.parseSubagentFile() to pass provider to parseJsonlFile()
- Update SubagentResolver.parseSubagentFile() to pass provider to parseJsonlFile()
- Update SessionParser test mock to include getFileSystemProvider method

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
matt 2026-02-12 09:12:49 +09:00
parent ad4e75b8e5
commit a3f5dafdab
4 changed files with 12 additions and 3 deletions

View file

@ -756,6 +756,13 @@ export class ProjectScanner {
return this.todosDir; return this.todosDir;
} }
/**
* Gets the FileSystemProvider instance used by this scanner.
*/
getFileSystemProvider(): FileSystemProvider {
return this.fsProvider;
}
/** /**
* Checks if the projects directory exists. * Checks if the projects directory exists.
*/ */

View file

@ -85,7 +85,7 @@ export class SubagentResolver {
*/ */
private async parseSubagentFile(filePath: string): Promise<Process | null> { private async parseSubagentFile(filePath: string): Promise<Process | null> {
try { try {
const messages = await parseJsonlFile(filePath); const messages = await parseJsonlFile(filePath, this.projectScanner.getFileSystemProvider());
if (messages.length === 0) { if (messages.length === 0) {
return null; return null;

View file

@ -74,7 +74,7 @@ export class SessionParser {
* Parse a JSONL file at the given path. * Parse a JSONL file at the given path.
*/ */
async parseSessionFile(filePath: string): Promise<ParsedSession> { async parseSessionFile(filePath: string): Promise<ParsedSession> {
const messages = await parseJsonlFile(filePath); const messages = await parseJsonlFile(filePath, this.projectScanner.getFileSystemProvider());
return this.processMessages(messages); return this.processMessages(messages);
} }
@ -339,7 +339,7 @@ export class SessionParser {
messages: ParsedMessage[]; messages: ParsedMessage[];
metrics: SessionMetrics; metrics: SessionMetrics;
}> { }> {
const messages = await parseJsonlFile(filePath); const messages = await parseJsonlFile(filePath, this.projectScanner.getFileSystemProvider());
const metrics = calculateMetrics(messages); const metrics = calculateMetrics(messages);
return { messages, metrics }; return { messages, metrics };

View file

@ -16,6 +16,7 @@ import {
type ParsedSession, type ParsedSession,
} from '../../../../src/main/services/parsing/SessionParser'; } from '../../../../src/main/services/parsing/SessionParser';
import type { ParsedMessage } from '../../../../src/main/types'; import type { ParsedMessage } from '../../../../src/main/types';
import { LocalFileSystemProvider } from '../../../../src/main/services/infrastructure/LocalFileSystemProvider';
// ============================================================================= // =============================================================================
// Mock ProjectScanner // Mock ProjectScanner
@ -30,6 +31,7 @@ const mockProjectScanner = {
getSession: vi.fn(), getSession: vi.fn(),
listWorktreeSessions: vi.fn(), listWorktreeSessions: vi.fn(),
scanWithWorktreeGrouping: vi.fn(), scanWithWorktreeGrouping: vi.fn(),
getFileSystemProvider: vi.fn().mockReturnValue(new LocalFileSystemProvider()),
}; };
// ============================================================================= // =============================================================================