refactor: complete P0-P1 improvements

Constants migration:
- server-agent.ts: SERVER_CONSULTATION_STATUS, LANGUAGE_CODE
- troubleshoot-agent.ts: TROUBLESHOOT_STATUS
- notification.ts: NOTIFICATION_TYPE

API improvements:
- search-tool.ts: Zod schema validation for Brave/Context7 APIs
- api-helper.ts: Centralized API call utility with retry/timeout

Testing:
- kv-cache.test.ts: 38 test cases for cache abstraction

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
kappa
2026-01-29 11:02:27 +09:00
parent f304c6a7d4
commit fbe696b88c
8 changed files with 832 additions and 56 deletions

View File

@@ -13,6 +13,7 @@ import type { Env, ServerSession, BandwidthInfo, RecommendResponse } from './typ
import { createLogger } from './utils/logger';
import { executeSearchWeb, executeLookupDocs } from './tools/search-tool';
import { formatTrafficInfo } from './utils/formatters';
import { SERVER_CONSULTATION_STATUS, LANGUAGE_CODE } from './constants';
const logger = createLogger('server-agent');
@@ -683,7 +684,7 @@ export async function processServerConsultation(
// 새 세션 생성하고 시작 메시지 반환
const newSession: ServerSession = {
telegramUserId: session.telegramUserId,
status: 'gathering',
status: SERVER_CONSULTATION_STATUS.GATHERING,
collectedInfo: {},
messages: [],
createdAt: Date.now(),
@@ -699,10 +700,10 @@ export async function processServerConsultation(
status: session.status,
hasLastRecommendation: !!session.lastRecommendation,
recommendationCount: session.lastRecommendation?.recommendations?.length || 0,
willProcessSelection: session.status === 'selecting' && !!session.lastRecommendation
willProcessSelection: session.status === SERVER_CONSULTATION_STATUS.SELECTING && !!session.lastRecommendation
});
if (session.status === 'selecting' && session.lastRecommendation) {
if (session.status === SERVER_CONSULTATION_STATUS.SELECTING && session.lastRecommendation) {
// 상담과 무관한 키워드 감지 (selecting 상태에서만)
// 명확히 다른 기능 요청인 경우 세션 종료하고 일반 처리로 전환
const unrelatedPatterns = /기억|날씨|계산|검색|도메인|입금|충전|잔액|시간|문서/;
@@ -812,7 +813,7 @@ export async function processServerConsultation(
}
// Mark session as recommending
session.status = 'recommending';
session.status = SERVER_CONSULTATION_STATUS.RECOMMENDING;
await saveServerSession(env.DB, session.telegramUserId, session);
// 1. Call recommendation API (추천 먼저 받기)
@@ -877,7 +878,7 @@ export async function processServerConsultation(
use_case: session.collectedInfo.useCase || '웹 서비스',
region_preference: finalRegionPreference,
budget_limit: session.collectedInfo.budgetLimit,
lang: 'ko',
lang: LANGUAGE_CODE.KOREAN,
},
env
);
@@ -927,14 +928,14 @@ export async function processServerConsultation(
use_case: session.collectedInfo.useCase || '웹 서비스',
region_preference: session.collectedInfo.regionPreference,
budget_limit: session.collectedInfo.budgetLimit,
lang: 'ko',
lang: LANGUAGE_CODE.KOREAN,
},
env,
session.telegramUserId
);
// Mark session as selecting (사용자 선택 대기)
session.status = 'selecting';
session.status = SERVER_CONSULTATION_STATUS.SELECTING;
await saveServerSession(env.DB, session.telegramUserId, session);
// 4. 추천 결과 + AI 검토 코멘트 (검토 코멘트는 마지막에)
@@ -942,14 +943,14 @@ export async function processServerConsultation(
return `${formattedRecommendation}\n\n💬 ${reviewResult.message}\n\n💡 원하는 서버 번호를 선택해주세요 (예: 1번)`;
} else {
// 추천 결과 없음 - 세션 삭제
session.status = 'completed';
session.status = SERVER_CONSULTATION_STATUS.COMPLETED;
await deleteServerSession(env.DB, session.telegramUserId);
return `${aiResult.message}\n\n조건에 맞는 서버를 찾지 못했습니다.`;
}
} else {
// Continue gathering information
session.status = 'gathering';
session.status = SERVER_CONSULTATION_STATUS.GATHERING;
await saveServerSession(env.DB, session.telegramUserId, session);
return aiResult.message;