refactor: delete server-agent.ts (905 lines)
Remove server recommendation consultation system: - 30-year expert AI persona - Session-based information gathering - Brave Search / Context7 tool integration - Automatic spec inference Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
533
docs/plans/2026-02-05-remove-server-recommendation.md
Normal file
533
docs/plans/2026-02-05-remove-server-recommendation.md
Normal file
@@ -0,0 +1,533 @@
|
||||
# 서버 추천 기능 제거 Implementation Plan
|
||||
|
||||
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
|
||||
|
||||
**Goal:** 서버 추천/상담 기능을 제거하고, 서버 관리 기능(목록, 시작/중지, 삭제 등)만 유지
|
||||
|
||||
**Architecture:** 진입점(openai-service.ts, message-handler.ts)에서 상담 세션 분기 제거 → server-agent.ts 삭제 → server-tool.ts에서 추천 관련 action 제거 → types.ts 정리 → constants 정리 → DB 마이그레이션
|
||||
|
||||
**Tech Stack:** TypeScript, Cloudflare Workers, D1 SQLite
|
||||
|
||||
---
|
||||
|
||||
## Task 1: openai-service.ts - 서버 상담 세션 분기 제거
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/openai-service.ts:9` (import), `src/openai-service.ts:211-250` (session check)
|
||||
|
||||
**Step 1: import 제거**
|
||||
|
||||
```typescript
|
||||
// 제거할 라인 (줄 9)
|
||||
import { hasServerSession, processServerConsultation } from './agents/server-agent';
|
||||
```
|
||||
|
||||
**Step 2: 서버 상담 세션 체크 블록 제거**
|
||||
|
||||
줄 211-250의 서버 세션 체크 블록 전체 삭제:
|
||||
```typescript
|
||||
// 이 전체 블록 삭제 (줄 211-250 근처)
|
||||
// Check if server consultation session is active
|
||||
if (telegramUserId && env.DB) {
|
||||
try {
|
||||
const hasSession = await hasServerSession(env.DB, telegramUserId);
|
||||
|
||||
if (hasSession) {
|
||||
logger.info('Active server session detected, routing to consultation', {
|
||||
userId: telegramUserId
|
||||
});
|
||||
|
||||
// Create callback for intermediate messages
|
||||
let sendIntermediateMessage: ((message: string) => Promise<void>) | undefined;
|
||||
if (chatIdStr) {
|
||||
sendIntermediateMessage = async (message: string) => {
|
||||
logger.info('Sending intermediate message', { chatId: chatIdStr, messagePreview: message.substring(0, 50) });
|
||||
await sendMessage(env.BOT_TOKEN, parseInt(chatIdStr), message);
|
||||
logger.info('Intermediate message sent successfully', { chatId: chatIdStr });
|
||||
};
|
||||
}
|
||||
|
||||
const result = await processServerConsultation(
|
||||
env.DB,
|
||||
telegramUserId,
|
||||
userMessage,
|
||||
env,
|
||||
{ sendIntermediateMessage }
|
||||
);
|
||||
|
||||
// PASSTHROUGH: 무관한 메시지는 일반 처리로 전환
|
||||
if (result !== '__PASSTHROUGH__') {
|
||||
return result;
|
||||
}
|
||||
// Continue to normal flow below
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error('Session check failed, continuing with normal flow', error as Error, {
|
||||
telegramUserId
|
||||
});
|
||||
// Continue with normal flow if session check fails
|
||||
}
|
||||
// ... (troubleshoot, domain, deposit, ddos 세션 체크는 유지)
|
||||
```
|
||||
|
||||
**Step 3: 타입체크**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && npm run typecheck`
|
||||
Expected: 서버 세션 관련 에러들 발생 (다음 태스크에서 해결)
|
||||
|
||||
**Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add src/openai-service.ts
|
||||
git commit -m "refactor: remove server consultation session routing from openai-service
|
||||
|
||||
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 2: message-handler.ts - 서버 신청 관련 코드 정리
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/routes/handlers/message-handler.ts:117-218`
|
||||
|
||||
**Step 1: "신청" 처리에서 서버 세션 의존 코드 제거**
|
||||
|
||||
줄 117-218의 서버 신청 확인 처리 블록 전체 삭제 (서버 관리는 manage_server 도구로 직접 처리):
|
||||
|
||||
```typescript
|
||||
// 이 전체 블록 삭제 (줄 117-218)
|
||||
// 7. 서버 신청 확인 처리 (텍스트 기반) - Queue 기반
|
||||
if (text.trim() === '신청') {
|
||||
if (orderSessionData) {
|
||||
// ... 전체 블록
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Step 2: orderSessionKey 변수 및 Promise.all에서 제거**
|
||||
|
||||
```typescript
|
||||
// 변경 전 (줄 60-66)
|
||||
const deleteSessionKey = `delete_confirm:${telegramUserId}`;
|
||||
const orderSessionKey = `server_order_confirm:${telegramUserId}`;
|
||||
|
||||
const [deleteSessionData, orderSessionData] = await Promise.all([
|
||||
env.SESSION_KV.get(deleteSessionKey),
|
||||
env.SESSION_KV.get(orderSessionKey),
|
||||
]);
|
||||
|
||||
// 변경 후
|
||||
const deleteSessionKey = `delete_confirm:${telegramUserId}`;
|
||||
|
||||
const deleteSessionData = await env.SESSION_KV.get(deleteSessionKey);
|
||||
```
|
||||
|
||||
**Step 3: 타입체크**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && npm run typecheck`
|
||||
Expected: PASS 또는 server-agent 관련 에러
|
||||
|
||||
**Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add src/routes/handlers/message-handler.ts
|
||||
git commit -m "refactor: remove server order confirmation from message-handler
|
||||
|
||||
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 3: server-agent.ts 파일 삭제
|
||||
|
||||
**Files:**
|
||||
- Delete: `src/agents/server-agent.ts`
|
||||
|
||||
**Step 1: 파일 삭제**
|
||||
|
||||
```bash
|
||||
rm src/agents/server-agent.ts
|
||||
```
|
||||
|
||||
**Step 2: 타입체크**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && npm run typecheck`
|
||||
Expected: server-tool.ts에서 import 에러 발생 (다음 태스크에서 해결)
|
||||
|
||||
**Step 3: Commit**
|
||||
|
||||
```bash
|
||||
git add -A
|
||||
git commit -m "refactor: delete server-agent.ts (905 lines)
|
||||
|
||||
Remove server recommendation consultation system:
|
||||
- 30-year expert AI persona
|
||||
- Session-based information gathering
|
||||
- Brave Search / Context7 tool integration
|
||||
- Automatic spec inference
|
||||
|
||||
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 4: server-tool.ts - 추천 관련 action 제거
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/tools/server-tool.ts`
|
||||
|
||||
**Step 1: 추천 관련 함수 제거**
|
||||
|
||||
다음 함수들 삭제:
|
||||
- `getRecommendationData()` (줄 332-374)
|
||||
- `formatRecommendations()` (줄 378-431)
|
||||
- `estimateCdnCacheHitRate()` (줄 42-66)
|
||||
- `CDN_CACHE_HIT_RATES` 상수 (줄 24-31)
|
||||
|
||||
**Step 2: manageServerTool 정의에서 추천 관련 enum 값 제거**
|
||||
|
||||
```typescript
|
||||
// 변경 전 (줄 96-99)
|
||||
action: {
|
||||
type: 'string',
|
||||
enum: ['recommend', 'order', 'list', 'info', 'delete', 'images', 'start', 'stop', 'reboot',
|
||||
'start_consultation', 'continue_consultation', 'cancel_consultation', 'rename'],
|
||||
description: '...',
|
||||
}
|
||||
|
||||
// 변경 후
|
||||
action: {
|
||||
type: 'string',
|
||||
enum: ['order', 'list', 'info', 'delete', 'images', 'start', 'stop', 'reboot', 'rename'],
|
||||
description: 'start: 서버 시작, stop: 서버 중지, reboot: 서버 재시작, delete: 서버 삭제, list: 내 서버 목록, info: 서버 상세, order: 서버 주문, rename: 이름 변경, images: OS 이미지 목록',
|
||||
}
|
||||
```
|
||||
|
||||
**Step 3: 추천 관련 파라미터 제거**
|
||||
|
||||
manageServerTool.function.parameters.properties에서 제거:
|
||||
- `tech_stack`
|
||||
- `expected_users`
|
||||
- `use_case`
|
||||
- `traffic_pattern`
|
||||
- `region_preference`
|
||||
- `budget_limit`
|
||||
- `lang`
|
||||
- `message`
|
||||
|
||||
**Step 4: executeServerAction에서 추천 관련 case 제거**
|
||||
|
||||
삭제할 case들:
|
||||
- `case 'start_consultation':` (줄 665-678)
|
||||
- `case 'continue_consultation':` (줄 680-697)
|
||||
- `case 'cancel_consultation':` (줄 699-717)
|
||||
- `case 'recommend':` (줄 719-825)
|
||||
|
||||
**Step 5: executeServerAction에서 server-agent import 제거**
|
||||
|
||||
```typescript
|
||||
// 삭제할 dynamic import (case 'continue_consultation' 내부)
|
||||
const { processServerConsultation } = await import('../agents/server-agent');
|
||||
|
||||
// 삭제할 dynamic import (case 'cancel_consultation' 내부)
|
||||
const { ServerSessionManager } = await import('../utils/session-manager');
|
||||
const { getSessionConfig } = await import('../constants/agent-config');
|
||||
```
|
||||
|
||||
**Step 6: 타입체크**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && npm run typecheck`
|
||||
Expected: PASS
|
||||
|
||||
**Step 7: Commit**
|
||||
|
||||
```bash
|
||||
git add src/tools/server-tool.ts
|
||||
git commit -m "refactor: remove recommendation actions from server-tool
|
||||
|
||||
Removed:
|
||||
- start_consultation, continue_consultation, cancel_consultation, recommend actions
|
||||
- getRecommendationData(), formatRecommendations()
|
||||
- CDN cache hit rate estimation
|
||||
- Recommendation-related parameters (tech_stack, expected_users, etc.)
|
||||
|
||||
Retained:
|
||||
- order, list, info, delete, images, start, stop, reboot, rename actions
|
||||
|
||||
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 5: types.ts - 서버 세션 관련 타입 제거
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/types.ts`
|
||||
|
||||
**Step 1: ServerSession 관련 타입 제거**
|
||||
|
||||
삭제할 타입들:
|
||||
- `ServerSessionStatus` (줄 248-253)
|
||||
- `ServerSession` (줄 256-293)
|
||||
|
||||
**Step 2: ManageServerArgs에서 추천 관련 필드 제거**
|
||||
|
||||
```typescript
|
||||
// 변경 전 (줄 212-239)
|
||||
export interface ManageServerArgs {
|
||||
action:
|
||||
| "recommend"
|
||||
| "order"
|
||||
| "start"
|
||||
| "stop"
|
||||
| "delete"
|
||||
| "list"
|
||||
| "info"
|
||||
| "images"
|
||||
| "start_consultation"
|
||||
| "continue_consultation"
|
||||
| "cancel_consultation";
|
||||
tech_stack?: string[];
|
||||
expected_users?: number;
|
||||
use_case?: string;
|
||||
traffic_pattern?: string;
|
||||
region_preference?: string[];
|
||||
budget_limit?: number;
|
||||
lang?: string;
|
||||
// ... 나머지
|
||||
}
|
||||
|
||||
// 변경 후
|
||||
export interface ManageServerArgs {
|
||||
action:
|
||||
| "order"
|
||||
| "start"
|
||||
| "stop"
|
||||
| "delete"
|
||||
| "list"
|
||||
| "info"
|
||||
| "images"
|
||||
| "reboot"
|
||||
| "rename";
|
||||
server_id?: string;
|
||||
region_code?: string;
|
||||
label?: string;
|
||||
pricing_id?: number;
|
||||
order_id?: number;
|
||||
new_label?: string;
|
||||
image?: string;
|
||||
}
|
||||
```
|
||||
|
||||
**Step 3: 타입체크**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && npm run typecheck`
|
||||
Expected: PASS
|
||||
|
||||
**Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add src/types.ts
|
||||
git commit -m "refactor: remove ServerSession types from types.ts
|
||||
|
||||
Removed:
|
||||
- ServerSessionStatus type
|
||||
- ServerSession interface
|
||||
- Recommendation-related fields from ManageServerArgs
|
||||
|
||||
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 6: constants/index.ts - SERVER_CONSULTATION_STATUS 제거
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/constants/index.ts`
|
||||
|
||||
**Step 1: SERVER_CONSULTATION_STATUS 상수 제거**
|
||||
|
||||
```typescript
|
||||
// 삭제 (줄 157-162)
|
||||
export const SERVER_CONSULTATION_STATUS = {
|
||||
GATHERING: 'gathering',
|
||||
RECOMMENDING: 'recommending',
|
||||
SELECTING: 'selecting',
|
||||
COMPLETED: 'completed',
|
||||
} as const;
|
||||
```
|
||||
|
||||
**Step 2: 타입 export 제거**
|
||||
|
||||
```typescript
|
||||
// 삭제 (줄 220)
|
||||
export type ServerConsultationStatus = typeof SERVER_CONSULTATION_STATUS[keyof typeof SERVER_CONSULTATION_STATUS];
|
||||
```
|
||||
|
||||
**Step 3: 타입체크**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && npm run typecheck`
|
||||
Expected: PASS
|
||||
|
||||
**Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add src/constants/index.ts
|
||||
git commit -m "refactor: remove SERVER_CONSULTATION_STATUS from constants
|
||||
|
||||
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 7: commands.ts - /server 명령어 응답 수정
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/commands.ts:268-274`
|
||||
|
||||
**Step 1: "서버 추천" 안내 문구 제거**
|
||||
|
||||
```typescript
|
||||
// 변경 전 (줄 268-274)
|
||||
if (servers.length === 0) {
|
||||
return `🖥️ <b>내 서버</b>
|
||||
|
||||
보유한 서버가 없습니다.
|
||||
|
||||
"서버 추천" 또는 "서버 신청"으로 시작하세요!`;
|
||||
}
|
||||
|
||||
// 변경 후
|
||||
if (servers.length === 0) {
|
||||
return `🖥️ <b>내 서버</b>
|
||||
|
||||
보유한 서버가 없습니다.`;
|
||||
}
|
||||
```
|
||||
|
||||
**Step 2: 타입체크**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && npm run typecheck`
|
||||
Expected: PASS
|
||||
|
||||
**Step 3: Commit**
|
||||
|
||||
```bash
|
||||
git add src/commands.ts
|
||||
git commit -m "refactor: update /server command to remove recommendation guide
|
||||
|
||||
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 8: D1 마이그레이션 - server_sessions 테이블 DROP
|
||||
|
||||
**Files:**
|
||||
- Create: `migrations/006_drop_server_sessions.sql`
|
||||
- Modify: `schema.sql` (server_sessions 정의 제거)
|
||||
|
||||
**Step 1: 마이그레이션 파일 생성**
|
||||
|
||||
```sql
|
||||
-- migrations/006_drop_server_sessions.sql
|
||||
-- Drop server consultation sessions table
|
||||
-- This table was used for server recommendation consultation feature which is now removed
|
||||
|
||||
DROP TABLE IF EXISTS server_sessions;
|
||||
DROP INDEX IF EXISTS idx_server_sessions_expires;
|
||||
```
|
||||
|
||||
**Step 2: schema.sql에서 server_sessions 제거**
|
||||
|
||||
```sql
|
||||
-- 삭제할 부분 (줄 89-99)
|
||||
-- 서버 상담 세션 테이블
|
||||
CREATE TABLE IF NOT EXISTS server_sessions (
|
||||
user_id TEXT PRIMARY KEY,
|
||||
status TEXT NOT NULL CHECK(status IN ('gathering', 'recommending', 'selecting', 'ordering', 'completed')),
|
||||
collected_info TEXT,
|
||||
last_recommendation TEXT,
|
||||
messages TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL,
|
||||
expires_at INTEGER NOT NULL
|
||||
);
|
||||
|
||||
-- 인덱스도 삭제 (줄 156)
|
||||
CREATE INDEX IF NOT EXISTS idx_server_sessions_expires ON server_sessions(expires_at);
|
||||
```
|
||||
|
||||
**Step 3: 로컬 마이그레이션 테스트**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && wrangler d1 execute telegram-conversations --local --file=migrations/006_drop_server_sessions.sql`
|
||||
Expected: 성공
|
||||
|
||||
**Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add migrations/006_drop_server_sessions.sql schema.sql
|
||||
git commit -m "refactor: drop server_sessions table
|
||||
|
||||
Add migration to remove server consultation sessions table.
|
||||
Update schema.sql to remove table definition.
|
||||
|
||||
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task 9: 최종 검증
|
||||
|
||||
**Step 1: 타입체크**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && npm run typecheck`
|
||||
Expected: PASS (에러 0개)
|
||||
|
||||
**Step 2: 빌드**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && npm run build`
|
||||
Expected: PASS
|
||||
|
||||
**Step 3: 테스트**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && npm test`
|
||||
Expected: PASS (또는 서버 추천 관련 테스트만 실패)
|
||||
|
||||
**Step 4: 로컬 서버 테스트**
|
||||
|
||||
Run: `cd /Users/kaffa/Projects/bots/telegram-bot-workers && npm run dev`
|
||||
|
||||
테스트 항목:
|
||||
1. `/server` 명령어 - 서버 목록 표시 확인
|
||||
2. "서버 추천해줘" 입력 - 상담 시작 안 됨 확인 (일반 AI 응답)
|
||||
3. 서버 시작/중지/삭제 (기존 서버 있는 경우)
|
||||
|
||||
**Step 5: 최종 커밋 (선택)**
|
||||
|
||||
```bash
|
||||
git add -A
|
||||
git commit -m "chore: final cleanup after server recommendation removal
|
||||
|
||||
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
| Task | 파일 | 변경 내용 |
|
||||
|------|------|----------|
|
||||
| 1 | openai-service.ts | 서버 세션 import 및 라우팅 제거 |
|
||||
| 2 | message-handler.ts | "신청" 처리 블록 제거 |
|
||||
| 3 | server-agent.ts | 파일 삭제 (905줄) |
|
||||
| 4 | server-tool.ts | 추천 action 4개 + 헬퍼 함수 제거 |
|
||||
| 5 | types.ts | ServerSession 타입 제거 |
|
||||
| 6 | constants/index.ts | SERVER_CONSULTATION_STATUS 제거 |
|
||||
| 7 | commands.ts | /server 안내 문구 수정 |
|
||||
| 8 | schema.sql + migration | server_sessions 테이블 DROP |
|
||||
| 9 | - | 최종 검증 |
|
||||
|
||||
**예상 제거 라인:** ~1,200줄
|
||||
**유지 기능:** 서버 관리 (list, info, start, stop, reboot, delete, rename, order, images)
|
||||
Reference in New Issue
Block a user