import { CodeListItemDto, CodeSnippetJsonDto, ContextRepositoryJsonDto, ContextJsonResponseDto, ContextVersionJsonDto, InfoSnippetJsonDto, LibrarySearchJsonResponseDto, LibrarySearchJsonResultDto, SnippetOriginJsonDto, type SnippetJsonDto } from '$lib/server/models/context-response.js'; import { LibrarySearchResult, SnippetSearchResult } from '$lib/server/models/search-result.js'; export interface ContextResponseMetadata { localSource: boolean; resultCount: number; repository: { id: string; title: string; source: 'github' | 'local'; sourceUrl: string; branch: string | null; } | null; version: { requested: string | null; resolved: string | null; id: string | null; } | null; snippetVersions: Record; } export class ContextResponseMapper { static toLibrarySearchJson(results: LibrarySearchResult[]): LibrarySearchJsonResponseDto { return new LibrarySearchJsonResponseDto( results.map( ({ repository, versions }) => new LibrarySearchJsonResultDto({ id: repository.id, title: repository.title, description: repository.description ?? null, branch: repository.branch ?? null, lastUpdateDate: repository.lastIndexedAt ? repository.lastIndexedAt.toISOString() : null, state: repository.state === 'indexed' ? 'finalized' : repository.state === 'error' ? 'error' : 'initial', totalTokens: repository.totalTokens ?? null, totalSnippets: repository.totalSnippets ?? null, stars: repository.stars ?? null, trustScore: repository.trustScore ?? null, benchmarkScore: repository.benchmarkScore ?? null, versions: versions.map((version) => version.tag), source: repository.sourceUrl }) ) ); } static toContextJson( snippets: SnippetSearchResult[], rules: string[], metadata?: ContextResponseMetadata ): ContextJsonResponseDto { const mapped: SnippetJsonDto[] = snippets.map(({ snippet }) => { const origin = metadata?.repository ? new SnippetOriginJsonDto({ repositoryId: snippet.repositoryId, repositoryTitle: metadata.repository.title, source: metadata.repository.source, sourceUrl: metadata.repository.sourceUrl, version: snippet.versionId ? metadata.snippetVersions[snippet.versionId] ?? null : null, versionId: snippet.versionId, isLocal: metadata.localSource }) : null; if (snippet.type === 'code') { return new CodeSnippetJsonDto({ title: snippet.title ?? null, description: snippet.breadcrumb ?? null, language: snippet.language ?? null, codeList: [ new CodeListItemDto({ language: snippet.language ?? '', code: snippet.content }) ], id: snippet.id, tokenCount: snippet.tokenCount ?? null, pageTitle: snippet.breadcrumb ? snippet.breadcrumb.split('>')[0].trim() || null : null, origin }); } return new InfoSnippetJsonDto({ text: snippet.content, breadcrumb: snippet.breadcrumb ?? null, pageId: snippet.id, tokenCount: snippet.tokenCount ?? null, origin }); }); return new ContextJsonResponseDto({ snippets: mapped, rules, totalTokens: snippets.reduce((sum, result) => sum + (result.snippet.tokenCount ?? 0), 0), localSource: metadata?.localSource ?? false, repository: metadata?.repository ? new ContextRepositoryJsonDto({ id: metadata.repository.id, title: metadata.repository.title, source: metadata.repository.source, sourceUrl: metadata.repository.sourceUrl, branch: metadata.repository.branch, isLocal: metadata.localSource }) : null, version: metadata?.version ? new ContextVersionJsonDto({ requested: metadata.version.requested, resolved: metadata.version.resolved, id: metadata.version.id }) : null, resultCount: metadata?.resultCount ?? snippets.length }); } }