mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-05-02 02:38:38 +00:00
68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import { scanStateDb } from '@/modules/database/index.js';
|
|
import { providerRegistry } from '@/modules/providers/provider.registry.js';
|
|
import type { LLMProvider } from '@/shared/types.js';
|
|
|
|
type SessionSynchronizeResult = {
|
|
processedByProvider: Record<LLMProvider, number>;
|
|
failures: string[];
|
|
};
|
|
|
|
/**
|
|
* Orchestrates provider-specific session indexers and indexed-session lifecycle operations.
|
|
*/
|
|
export const sessionSynchronizerService = {
|
|
/**
|
|
* Runs all provider synchronizers and updates scan_state.last_scanned_at.
|
|
*/
|
|
async synchronizeSessions(): Promise<SessionSynchronizeResult> {
|
|
const lastScanAt = scanStateDb.getLastScannedAt();
|
|
const processedByProvider: Record<LLMProvider, number> = {
|
|
claude: 0,
|
|
codex: 0,
|
|
cursor: 0,
|
|
gemini: 0,
|
|
};
|
|
const failures: string[] = [];
|
|
|
|
const results = await Promise.allSettled(
|
|
providerRegistry.listProviders().map(async (provider) => ({
|
|
provider: provider.id,
|
|
processed: await provider.sessionSynchronizer.synchronize(lastScanAt ?? undefined),
|
|
}))
|
|
);
|
|
|
|
for (const result of results) {
|
|
if (result.status === 'fulfilled') {
|
|
processedByProvider[result.value.provider] = result.value.processed;
|
|
continue;
|
|
}
|
|
|
|
const reason = result.reason instanceof Error ? result.reason.message : String(result.reason);
|
|
failures.push(reason);
|
|
}
|
|
|
|
scanStateDb.updateLastScannedAt();
|
|
|
|
return {
|
|
processedByProvider,
|
|
failures,
|
|
};
|
|
},
|
|
|
|
/**
|
|
* Indexes one provider artifact file without running a full provider rescan.
|
|
*/
|
|
async synchronizeProviderFile(
|
|
provider: LLMProvider,
|
|
filePath: string
|
|
): Promise<{ provider: LLMProvider; indexed: boolean; sessionId: string | null }> {
|
|
const resolvedProvider = providerRegistry.resolveProvider(provider);
|
|
const sessionId = await resolvedProvider.sessionSynchronizer.synchronizeFile(filePath);
|
|
return {
|
|
provider,
|
|
indexed: Boolean(sessionId),
|
|
sessionId,
|
|
};
|
|
},
|
|
};
|