/**
* 코드 분석 도구
*/
import { z } from 'zod';
import { analyzeCode as analyzeCodeService, type GeminiModel, type GeminiProvider, type CodeTask, getDefaultProvider } from '../services/gemini.js';
export const analyzeCodeSchema = z.object({
code: z.string().describe('분석할 코드'),
language: z.string().optional().describe('프로그래밍 언어 (예: javascript, python, typescript)'),
task: z
.enum(['review', 'explain', 'improve'])
.optional()
.default('review')
.describe('분석 유형: review(코드 리뷰), explain(코드 설명), improve(개선 제안)'),
prompt: z.string().optional().describe('커스텀 프롬프트 (기본 프롬프트 대신 사용)'),
model: z.enum(['flash', 'pro']).optional().default('flash').describe('모델 선택'),
provider: z.enum(['api', 'cli']).optional().describe('백엔드 선택: api(직접 API) 또는 cli(Gemini CLI, 높은 쿼터)'),
});
export type AnalyzeCodeInput = z.infer<typeof analyzeCodeSchema>;
const TASK_LABELS: Record<CodeTask, string> = {
review: '코드 리뷰',
explain: '코드 설명',
improve: '개선 제안',
};
export async function analyzeCode(input: AnalyzeCodeInput) {
const result = await analyzeCodeService({
code: input.code,
language: input.language,
task: input.task as CodeTask,
prompt: input.prompt,
model: input.model as GeminiModel,
provider: (input.provider || getDefaultProvider()) as GeminiProvider,
});
if (!result.success) {
return {
content: [{ type: 'text' as const, text: `오류: ${result.error}` }],
isError: true,
};
}
const providerLabel = result.provider === 'cli' ? 'CLI (높은 쿼터)' : 'API';
const summary = [
`## ${TASK_LABELS[result.task]} 결과`,
`- **모델**: ${result.model}`,
`- **백엔드**: ${providerLabel}`,
input.language ? `- **언어**: ${input.language}` : '',
result.tokenUsage
? `- **토큰**: ${result.tokenUsage.totalTokens} (입력: ${result.tokenUsage.promptTokens}, 출력: ${result.tokenUsage.completionTokens})`
: '',
'',
'---',
'',
result.analysis,
]
.filter(Boolean)
.join('\n');
return {
content: [{ type: 'text' as const, text: summary }],
};
}