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>
52 lines
1.9 KiB
TypeScript
52 lines
1.9 KiB
TypeScript
import type { SidebarChatProvider } from '../sidebarProvider';
|
|
|
|
/**
|
|
* Sidebar webview message handler 등록소.
|
|
*
|
|
* 의도: 옛 sidebarProvider 의 if-chain (`if (await handleChat()) return; if (await
|
|
* handleBrain()) return; ...`) 은 새 도메인 추가 시 항상 sidebarProvider.ts 본문을
|
|
* 손대야 했다. 이 레지스트리는 도메인 핸들러를 *배열* 로 관리해 그 의존성을
|
|
* 끊는다 — 새 핸들러는 array push 한 줄, sidebarProvider 본문은 무수정.
|
|
*
|
|
* 외부 플러그인 / 다른 모듈도 활성화 시점에 `registerSidebarHandler()` 한 번
|
|
* 호출하면 message dispatch loop 에 자동 합류.
|
|
*
|
|
* Handler 계약:
|
|
* - 처리했으면 true 반환 (dispatch 종료)
|
|
* - 자기 도메인 아니면 false 반환 (다음 handler 로 chain)
|
|
* - throw 는 호출자 (sidebarProvider) 가 잡아 unhandled 로 로그
|
|
*/
|
|
export type SidebarMessageHandler = (
|
|
provider: SidebarChatProvider,
|
|
data: any,
|
|
) => Promise<boolean>;
|
|
|
|
const HANDLERS: SidebarMessageHandler[] = [];
|
|
|
|
/**
|
|
* 새 sidebar handler 등록. 중복 등록 시 *추가* 함 (같은 함수 여러 번 등록 가능,
|
|
* 호출자가 dedup 해야 함). 일반적으로 모듈 load 시점 1회만 호출.
|
|
*/
|
|
export function registerSidebarHandler(h: SidebarMessageHandler): void {
|
|
HANDLERS.push(h);
|
|
}
|
|
|
|
/**
|
|
* 등록 순서대로 handler 들을 순회. true 반환한 첫 핸들러에서 stop.
|
|
* sidebarProvider 의 webview message dispatch 가 이걸 호출.
|
|
*/
|
|
export async function dispatchSidebarMessage(
|
|
provider: SidebarChatProvider,
|
|
data: any,
|
|
): Promise<boolean> {
|
|
for (const h of HANDLERS) {
|
|
if (await h(provider, data)) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/** 디버그 — 현재 등록된 핸들러 수. 테스트 setup/teardown 검증용. */
|
|
export function _sidebarHandlerCount(): number {
|
|
return HANDLERS.length;
|
|
}
|