0a97324f1b
R56–R59: agent.ts 2731→1529줄 god-file 분해 (25 modules) · attrParsers + LLM 메서드 8개 (callNonStreaming, streamChatOnce 등) · executeActions 415줄 → 8 handler 그룹 (file/run/list/brain/calendar/sheets/tasks) · handlePrompt 1100줄 → 7 phase 모듈 (system prompt + budget + autoContinue 등) R50–R55: extension.ts 1145→349줄 (telegram/settings/provider commands 분리) Stocks feature 신규: /stocks slash command (v2.2.152~158) · .astra/stocks.json 저장소 + Yahoo Finance 현재가 갱신 · 8 키워드 필터 (ROE/성장성/유동성/수익성/영업효율/기술력/안정성/PBR) · Naver 시가총액 페이지 JSON API (m.stock.naver.com) 발굴 · LLM Top 5 매력도 분석 + Telegram 자동 보고서 · KST 09:00/15:00 watcher 자동 모니터링 대화 연속성 (v2.2.150~157): · [PRIOR TURN CONCLUSION] block 으로 직전 결론 anchor · thin follow-up 분류 → boilerplate 헤더 suppression · slash 명령 결과 chatHistory mirror (capture wrapper) · echo/parrot 금지 system prompt rule 기타: /stocks 슬래시 자동완성 dropdown UI, Naver JSON API 전환 (cheerio 제거) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
32 lines
1.4 KiB
TypeScript
32 lines
1.4 KiB
TypeScript
import * as fs from 'fs';
|
|
import { HandlerContext } from './types';
|
|
import { validatePath } from '../../security';
|
|
import { EXCLUDED_DIRS } from '../../config';
|
|
|
|
export async function applyListFilesActions(ctx: HandlerContext): Promise<void> {
|
|
const { aiMessage, rootPath, report } = ctx;
|
|
let match: RegExpExecArray | null;
|
|
// Action 6: List Files
|
|
const listRegex = /<list_files\s+path=['"]?([^'"]+)['"]?\s*\/?>(?:<\/list_files>)?/gi;
|
|
while ((match = listRegex.exec(aiMessage)) !== null) {
|
|
const relPath = match[1].trim() || '.';
|
|
try {
|
|
const absPath = validatePath(rootPath, relPath);
|
|
if (fs.existsSync(absPath) && fs.statSync(absPath).isDirectory()) {
|
|
const entries = fs.readdirSync(absPath, { withFileTypes: true });
|
|
let listing = entries
|
|
.filter(e => !e.name.startsWith('.') && !EXCLUDED_DIRS.has(e.name))
|
|
.map(e => e.isDirectory() ? `${e.name}/` : e.name)
|
|
.join('\n');
|
|
|
|
if (listing.length > 5000) {
|
|
listing = listing.slice(0, 5000) + "\n... (truncated for context)";
|
|
}
|
|
|
|
report.push(`📂 Listed: ${relPath}`);
|
|
ctx.chatHistory.push({ role: 'system', content: `[Result of list_files ${relPath}]\n${listing}`, internal: true });
|
|
}
|
|
} catch (err: any) { report.push(`❌ Listing failed: ${err.message}`); }
|
|
}
|
|
}
|