diff --git a/src/commands.ts b/src/commands.ts index 627f79f..b4e3884 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -43,9 +43,9 @@ export async function handleCommand( return `πŸ“Š ν˜„μž¬ μ»¨ν…μŠ€νŠΈ -λΆ„μ„λœ λ©”μ‹œμ§€: ${ctx.previousSummary?.message_count || 0}개 +λΆ„μ„λœ λ©”μ‹œμ§€: ${ctx.previousSummary?.message_count ?? 0}개 버퍼 λ©”μ‹œμ§€: ${ctx.recentMessages.length}개 -ν”„λ‘œν•„ 버전: ${ctx.previousSummary?.generation || 0} +ν”„λ‘œν•„ 버전: ${ctx.previousSummary?.generation ?? 0} 총 λ©”μ‹œμ§€: ${ctx.totalMessages}개 πŸ’‘ ${remaining > 0 ? `${remaining}개 λ©”μ‹œμ§€ ν›„ ν”„λ‘œν•„ μ—…λ°μ΄νŠΈ` : 'μ—…λ°μ΄νŠΈ λŒ€κΈ° 쀑'}`; @@ -78,12 +78,18 @@ ${summary.summary} return `πŸ“ˆ λŒ€ν™” 톡계 총 λ©”μ‹œμ§€: ${ctx.totalMessages}개 -ν”„λ‘œν•„ 버전: ${ctx.previousSummary?.generation || 0} -μ €μž₯된 ν”„λ‘œν•„: ${profileCount?.cnt || 0}개 +ν”„λ‘œν•„ 버전: ${ctx.previousSummary?.generation ?? 0} +μ €μž₯된 ν”„λ‘œν•„: ${profileCount?.cnt ?? 0}개 버퍼 λŒ€κΈ°: ${ctx.recentMessages.length}개`; } case '/debug': { + // Admin only - exposes internal debug info + const adminId = env.DEPOSIT_ADMIN_ID ? parseInt(env.DEPOSIT_ADMIN_ID, 10) : null; + if (!adminId || userId !== adminId) { + return 'πŸ”’ 이 λͺ…λ Ήμ–΄λŠ” κ΄€λ¦¬μžλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.'; + } + // λ””λ²„κ·Έμš© λͺ…λ Ήμ–΄ (개발 μ‹œ 유용) const ctx = await getConversationContext(env.DB, userId, chatId); const recentMsgs = ctx.recentMessages.slice(-5).map((m, i) => @@ -95,7 +101,7 @@ ${summary.summary} User ID: ${userId} Chat ID: ${chatId} Buffer Count: ${ctx.recentMessages.length} -Summary Gen: ${ctx.previousSummary?.generation || 0} +Summary Gen: ${ctx.previousSummary?.generation ?? 0} 졜근 버퍼 (5개): ${recentMsgs || '(λΉ„μ–΄μžˆμŒ)'}`; diff --git a/src/deposit-agent.ts b/src/deposit-agent.ts index 475b423..5058db2 100644 --- a/src/deposit-agent.ts +++ b/src/deposit-agent.ts @@ -20,6 +20,7 @@ const logger = createLogger('deposit-agent'); const MIN_DEPOSIT_AMOUNT = 1000; // 1,000원 const MAX_DEPOSIT_AMOUNT = 100_000_000; // 1얡원 +const DEFAULT_HISTORY_LIMIT = 10; export interface DepositContext { userId: number; @@ -197,8 +198,8 @@ export async function executeDepositFunction( } case 'get_transactions': { - // LIMIT κ°’ 검증: 1-100 λ²”μœ„, κΈ°λ³Έκ°’ 10 - const limit = Math.min(Math.max(parseInt(String(funcArgs.limit)) || 10, 1), 100); + // LIMIT κ°’ 검증: 1-100 λ²”μœ„ + const limit = Math.min(Math.max(parseInt(String(funcArgs.limit)) || DEFAULT_HISTORY_LIMIT, 1), 100); const transactions = await db.prepare( `SELECT id, type, amount, status, depositor_name, description, created_at, confirmed_at diff --git a/src/openai-service.ts b/src/openai-service.ts index bc78266..cc9a5e8 100644 --- a/src/openai-service.ts +++ b/src/openai-service.ts @@ -413,7 +413,9 @@ export async function generateOpenAIResponse( const saveableInfo = extractSaveableInfo(userMessage); if (saveableInfo) { // λΉ„λ™κΈ°λ‘œ μ €μž₯, 응닡 μ§€μ—° μ—†μŒ - saveMemorySilently(db, telegramUserId, saveableInfo).catch(() => {}); + saveMemorySilently(db, telegramUserId, saveableInfo).catch(err => { + logger.debug('Memory save failed (non-critical)', { error: (err as Error).message }); + }); } return finalResponse; diff --git a/src/services/bank-sms-parser.ts b/src/services/bank-sms-parser.ts index e91ad78..5cda688 100644 --- a/src/services/bank-sms-parser.ts +++ b/src/services/bank-sms-parser.ts @@ -4,6 +4,8 @@ import { createLogger } from '../utils/logger'; const logger = createLogger('bank-sms-parser'); +const SMS_CONTENT_MAX_LENGTH = 500; + /** * 은행 SMS νŒŒμ‹± ν•¨μˆ˜ * @@ -52,7 +54,7 @@ function preprocessText(content: string): string { // [Webλ°œμ‹ ] λ˜λŠ” 은행 ν‚€μ›Œλ“œκ°€ μžˆλŠ” λΆ€λΆ„λ§Œ μΆ”μΆœ const smsStartMatch = text.match(/ \[Webλ°œμ‹ \]| \[ν•˜λ‚˜μ€ν–‰\]| \[KB\]| \[μ‹ ν•œ\]| \[우리\]| \[λ†ν˜‘\]/); if (smsStartMatch && smsStartMatch.index !== undefined) { - text = text.slice(smsStartMatch.index, smsStartMatch.index + 500); + text = text.slice(smsStartMatch.index, smsStartMatch.index + SMS_CONTENT_MAX_LENGTH); } return text; } @@ -68,7 +70,7 @@ function parseWithRegex(text: string): BankNotification | null { depositorName: depositor.trim(), amount: parseInt(amountStr.replace(/,/g, '')), transactionTime: parseDateTime(date, time), - rawMessage: text.slice(0, 500), + rawMessage: text.slice(0, SMS_CONTENT_MAX_LENGTH), }; } @@ -83,7 +85,7 @@ function parseWithRegex(text: string): BankNotification | null { amount: parseInt(amountStr.replace(/,/g, '')), balanceAfter: balanceStr ? parseInt(balanceStr.replace(/,/g, '')) : undefined, transactionTime: parseDateTime(date, time), - rawMessage: text.slice(0, 500), + rawMessage: text.slice(0, SMS_CONTENT_MAX_LENGTH), }; } @@ -97,7 +99,7 @@ function parseWithRegex(text: string): BankNotification | null { depositorName: depositor, amount: parseInt(amountStr.replace(/,/g, '')), transactionTime: date ? parseDateTime(date, time) : undefined, - rawMessage: text.slice(0, 500), + rawMessage: text.slice(0, SMS_CONTENT_MAX_LENGTH), }; } @@ -111,7 +113,7 @@ function parseWithRegex(text: string): BankNotification | null { depositorName: depositor, amount: parseInt(amountStr.replace(/,/g, '')), transactionTime: date ? parseDateTime(date) : undefined, - rawMessage: text.slice(0, 500), + rawMessage: text.slice(0, SMS_CONTENT_MAX_LENGTH), }; } @@ -125,7 +127,7 @@ function parseWithRegex(text: string): BankNotification | null { bankName: 'μ•Œμˆ˜μ—†μŒ', depositorName: genericMatch1[2], amount: parseInt(genericMatch1[1].replace(/,/g, '')), - rawMessage: text.slice(0, 500), + rawMessage: text.slice(0, SMS_CONTENT_MAX_LENGTH), }; } @@ -135,7 +137,7 @@ function parseWithRegex(text: string): BankNotification | null { bankName: 'μ•Œμˆ˜μ—†μŒ', depositorName: genericMatch2[1], amount: parseInt(genericMatch2[2].replace(/,/g, '')), - rawMessage: text.slice(0, 500), + rawMessage: text.slice(0, SMS_CONTENT_MAX_LENGTH), }; } @@ -149,7 +151,7 @@ async function parseWithAI(text: string, env: Env): Promise