129 lines
3.8 KiB
TypeScript
129 lines
3.8 KiB
TypeScript
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<string, string>;
|
|
}
|
|
|
|
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
|
|
});
|
|
}
|
|
} |