fix: resolve TypeScript errors after SessionManager refactoring

- Remove unused import types (*SessionStatus, OpenAIMessage)
- Replace deprecated session functions with SessionManager API
- Prefix unused base class parameters with underscore
- Update all session management calls across agents and tools

Files affected:
- src/agents/*.ts (removed unused imports)
- src/utils/session-manager.ts (unused param prefixes)
- src/tools/server-tool.ts (SessionManager migration)
- src/tools/troubleshoot-tool.ts (SessionManager migration)
- src/routes/api/chat.ts (SessionManager migration)
- src/routes/handlers/message-handler.ts (SessionManager migration)

Verification:
- TypeScript: compiles without errors
- Tests: 223 passed (10 pre-existing failures)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
kappa
2026-02-05 11:48:11 +09:00
parent edf1bbc9a2
commit 02b18301a1
9 changed files with 49 additions and 41 deletions

View File

@@ -17,7 +17,7 @@
import { createLogger } from '../utils/logger';
import { executeWithOptimisticLock, OptimisticLockError } from '../utils/optimistic-lock';
import { TRANSACTION_STATUS, TRANSACTION_TYPE } from '../constants';
import type { Env, ManageDepositArgs, DepositFunctionResult, DepositSession, DepositSessionStatus, OpenAIToolCall, OpenAIMessage, OpenAIAPIResponse } from '../types';
import type { Env, ManageDepositArgs, DepositFunctionResult, DepositSession, OpenAIToolCall, OpenAIAPIResponse } from '../types';
import { SessionManager } from '../utils/session-manager';
import { getSessionConfig } from '../constants/agent-config';

View File

@@ -8,7 +8,7 @@
* - 추천 후 사용자 선택 및 등록 흐름
*/
import type { Env, DomainSession, DomainSessionStatus } from '../types';
import type { Env, DomainSession } from '../types';
import { createLogger } from '../utils/logger';
import { executeDomainAction, executeSuggestDomains } from '../tools/domain-tool';
import { DomainSessionManager } from '../utils/session-manager';
@@ -137,7 +137,7 @@ const DOMAIN_TOOLS = [
];
// Import OpenAI types from centralized types
import type { OpenAIToolCall, OpenAIMessage, OpenAIAPIResponse } from '../types';
import type { OpenAIToolCall, OpenAIAPIResponse } from '../types';
/**
* Domain Expert AI 호출 (Function Calling 지원)

View File

@@ -15,7 +15,7 @@
* 4. Expected: Order confirmation
*/
import type { Env, ServerSession, ServerSessionStatus, BandwidthInfo, RecommendResponse, OpenAIToolCall, OpenAIMessage, OpenAIAPIResponse } from '../types';
import type { Env, ServerSession, BandwidthInfo, RecommendResponse, OpenAIToolCall, OpenAIAPIResponse } from '../types';
import { createLogger } from '../utils/logger';
import { executeSearchWeb, executeLookupDocs } from '../tools/search-tool';
import { formatTrafficInfo } from '../utils/formatters';

View File

@@ -14,7 +14,7 @@
* 4. Expected: Session deleted
*/
import type { Env, TroubleshootSession, TroubleshootSessionStatus, OpenAIToolCall, OpenAIMessage, OpenAIAPIResponse } from '../types';
import type { Env, TroubleshootSession, OpenAIToolCall, OpenAIAPIResponse } from '../types';
import { createLogger } from '../utils/logger';
import { executeSearchWeb, executeLookupDocs } from '../tools/search-tool';
import { SessionManager } from '../utils/session-manager';

View File

@@ -331,8 +331,10 @@ async function handleChatApi(request: Request, env: Env): Promise<Response> {
const orderData = JSON.parse(orderSessionData);
// 1. 서버 세션에서 가격 정보 가져오기
const { getServerSession, deleteServerSession } = await import('../../agents/server-agent');
const session = await getServerSession(env.DB, telegramUserId);
const { ServerSessionManager } = await import('../../utils/session-manager');
const { getSessionConfig } = await import('../../constants/agent-config');
const sessionManager = new ServerSessionManager(getSessionConfig('server'));
const session = await sessionManager.get(env.DB, telegramUserId);
if (!session || !session.last_recommendation) {
await env.SESSION_KV.delete(orderSessionKey);
@@ -348,7 +350,7 @@ async function handleChatApi(request: Request, env: Env): Promise<Response> {
const selected = session.last_recommendation.recommendations[orderData.index];
if (!selected) {
await env.SESSION_KV.delete(orderSessionKey);
await deleteServerSession(env.DB, telegramUserId);
await sessionManager.delete(env.DB, telegramUserId);
const processingTimeMs = Date.now() - startTime;
return Response.json({
@@ -409,7 +411,7 @@ async function handleChatApi(request: Request, env: Env): Promise<Response> {
// 5. 세션 정리
await env.SESSION_KV.delete(orderSessionKey);
await deleteServerSession(env.DB, telegramUserId);
await sessionManager.delete(env.DB, telegramUserId);
// 6. 즉시 응답
const processingTimeMs = Date.now() - startTime;

View File

@@ -121,8 +121,10 @@ export async function handleMessage(
const orderData = JSON.parse(orderSessionData);
// 1. 서버 세션에서 가격 정보 가져오기
const { getServerSession, deleteServerSession } = await import('../../agents/server-agent');
const session = await getServerSession(env.DB, telegramUserId);
const { ServerSessionManager } = await import('../../utils/session-manager');
const { getSessionConfig } = await import('../../constants/agent-config');
const sessionManager = new ServerSessionManager(getSessionConfig('server'));
const session = await sessionManager.get(env.DB, telegramUserId);
if (!session || !session.last_recommendation) {
await env.SESSION_KV.delete(orderSessionKey);
@@ -137,7 +139,7 @@ export async function handleMessage(
const selected = session.last_recommendation.recommendations[orderData.index];
if (!selected) {
await env.SESSION_KV.delete(orderSessionKey);
await deleteServerSession(env.DB, telegramUserId);
await sessionManager.delete(env.DB, telegramUserId);
await sendMessage(env.BOT_TOKEN, chatId, '❌ 선택한 서버를 찾을 수 없습니다.');
return;
}
@@ -190,7 +192,7 @@ export async function handleMessage(
// 5. 세션 정리
await env.SESSION_KV.delete(orderSessionKey);
await deleteServerSession(env.DB, telegramUserId);
await sessionManager.delete(env.DB, telegramUserId);
// 6. 즉시 응답
await sendMessage(

View File

@@ -663,9 +663,6 @@ export async function executeServerAction(
switch (action) {
case 'start_consultation': {
// Import session functions
const { createServerSession, saveServerSession } = await import('../agents/server-agent');
if (!telegramUserId) {
return '🚫 사용자 인증이 필요합니다.';
}
@@ -674,10 +671,8 @@ export async function executeServerAction(
return '🚫 세션 저장소가 설정되지 않았습니다.';
}
const session = createServerSession(telegramUserId, 'gathering');
await saveServerSession(env.DB, session);
logger.info('상담 세션 생성', { userId: maskUserId(telegramUserId) });
// Note: Session is created automatically in processServerConsultation when first message arrives
logger.info('상담 시작 요청', { userId: maskUserId(telegramUserId) });
return '안녕하세요! 서버 추천을 도와드리겠습니다. 😊\n\n어떤 서비스를 운영하실 건가요?\n\n1. 웹 서비스 (SaaS, 랜딩페이지)\n2. 모바일 앱 백엔드\n3. AI/ML 서비스 (챗봇, 모델 서빙)\n4. 게임 서버\n5. Discord/Telegram 봇\n6. 자동화 서버 (n8n, 크롤링)\n7. 미디어 스트리밍\n8. 개발/테스트 환경\n9. 데이터베이스 서버\n10. 기타 (직접 입력)\n\n번호나 용도를 말씀해주세요!';
}
@@ -702,8 +697,6 @@ export async function executeServerAction(
}
case 'cancel_consultation': {
const { deleteServerSession } = await import('../agents/server-agent');
if (!telegramUserId) {
return '🚫 사용자 인증이 필요합니다.';
}
@@ -712,7 +705,11 @@ export async function executeServerAction(
return '🚫 세션 저장소가 설정되지 않았습니다.';
}
await deleteServerSession(env.DB, telegramUserId);
// Import sessionManager to delete session
const { ServerSessionManager } = await import('../utils/session-manager');
const { getSessionConfig } = await import('../constants/agent-config');
const sessionManager = new ServerSessionManager(getSessionConfig('server'));
await sessionManager.delete(env.DB, telegramUserId);
logger.info('상담 세션 취소', { userId: maskUserId(telegramUserId) });
@@ -758,14 +755,16 @@ export async function executeServerAction(
// 세션에 추천 결과 저장 (선택 기능 활성화)
if (telegramUserId && env?.DB && recommendationData.recommendations && recommendationData.recommendations.length > 0) {
try {
const { getServerSession, saveServerSession, createServerSession } = await import('../agents/server-agent');
const { ServerSessionManager } = await import('../utils/session-manager');
const { getSessionConfig } = await import('../constants/agent-config');
const sessionManager = new ServerSessionManager(getSessionConfig('server'));
// 기존 세션 조회 또는 새로 생성
let session = await getServerSession(env.DB, telegramUserId);
let session = await sessionManager.get(env.DB, telegramUserId);
if (!session) {
// 세션이 없으면 새로 생성
session = createServerSession(telegramUserId, 'selecting');
session = sessionManager.create(telegramUserId, 'selecting');
session.collected_info = {
useCase: use_case,
scale: expected_users <= 50 ? 'personal' : 'business',
@@ -809,7 +808,7 @@ export async function executeServerAction(
session.status = 'selecting';
session.updated_at = Date.now();
await saveServerSession(env.DB, session);
await sessionManager.save(env.DB, session);
logger.info('추천 결과 세션 저장 완료', {
userId: telegramUserId,
recommendationCount: session.last_recommendation.recommendations.length,
@@ -1324,8 +1323,10 @@ export async function executeServerDelete(
// Clear server consultation session (if any)
try {
const { deleteServerSession } = await import('../agents/server-agent');
await deleteServerSession(env.DB, telegramUserId);
const { ServerSessionManager } = await import('../utils/session-manager');
const { getSessionConfig } = await import('../constants/agent-config');
const sessionManager = new ServerSessionManager(getSessionConfig('server'));
await sessionManager.delete(env.DB, telegramUserId);
} catch (error) {
provisionLogger.error('서버 세션 삭제 실패 (무시)', error as Error);
}
@@ -1413,8 +1414,10 @@ export async function executeServerOrder(
// Clear server consultation session
try {
const { deleteServerSession } = await import('../agents/server-agent');
await deleteServerSession(env.DB, telegramUserId);
const { ServerSessionManager } = await import('../utils/session-manager');
const { getSessionConfig } = await import('../constants/agent-config');
const sessionManager = new ServerSessionManager(getSessionConfig('server'));
await sessionManager.delete(env.DB, telegramUserId);
} catch (error) {
provisionLogger.error('서버 세션 삭제 실패 (무시)', error as Error);
}

View File

@@ -35,15 +35,17 @@ export async function executeManageTroubleshoot(
return '🚫 트러블슈팅 기능을 사용할 수 없습니다.';
}
const { getTroubleshootSession, createTroubleshootSession, saveTroubleshootSession, deleteTroubleshootSession } = await import('../agents/troubleshoot-agent');
const { SessionManager } = await import('../utils/session-manager');
const { getSessionConfig } = await import('../constants/agent-config');
const sessionManager = new SessionManager(getSessionConfig('troubleshoot'));
if (action === 'cancel') {
await deleteTroubleshootSession(env.DB, telegramUserId);
await sessionManager.delete(env.DB, telegramUserId);
return '✅ 트러블슈팅 세션이 취소되었습니다.';
}
// action === 'start'
const existingSession = await getTroubleshootSession(env.DB, telegramUserId);
const existingSession = await sessionManager.get(env.DB, telegramUserId);
if (existingSession && existingSession.status !== 'completed') {
return '이미 진행 중인 트러블슈팅 세션이 있습니다. 계속 진행해주세요.\n\n현재까지 파악된 정보:\n' +
@@ -52,9 +54,9 @@ export async function executeManageTroubleshoot(
}
// Create new session
const newSession = createTroubleshootSession(telegramUserId, 'gathering');
const newSession = sessionManager.create(telegramUserId, 'gathering');
await saveTroubleshootSession(env.DB, newSession);
await sessionManager.save(env.DB, newSession);
logger.info('트러블슈팅 세션 시작', { userId: telegramUserId });

View File

@@ -123,7 +123,6 @@ export class SessionManager<T extends BaseSession> {
// Build additional columns from subclass
const additionalColumns = this.getAdditionalColumns(session);
const additionalColumnNames = Object.keys(additionalColumns);
const additionalColumnPlaceholders = additionalColumnNames.map(() => '?').join(', ');
const additionalColumnValues = Object.values(additionalColumns);
// Build SQL with optional additional columns
@@ -277,10 +276,10 @@ export class SessionManager<T extends BaseSession> {
* Override this method in subclasses to parse additional fields from DB result
* (e.g., target_domain for DomainSession, last_recommendation for ServerSession)
*
* @param result - Raw DB result
* @param _result - Raw DB result
* @returns Additional fields to merge into session
*/
protected parseAdditionalFields(result: Record<string, unknown>): Partial<T> {
protected parseAdditionalFields(_result: Record<string, unknown>): Partial<T> {
return {};
}
@@ -288,10 +287,10 @@ export class SessionManager<T extends BaseSession> {
* Override this method in subclasses to provide additional columns for saving
* (e.g., target_domain for DomainSession, last_recommendation for ServerSession)
*
* @param session - Session to save
* @param _session - Session to save
* @returns Additional column values
*/
protected getAdditionalColumns(session: T): Record<string, unknown> {
protected getAdditionalColumns(_session: T): Record<string, unknown> {
return {};
}
}