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; 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 { for (const h of HANDLERS) { if (await h(provider, data)) return true; } return false; } /** 디버그 — 현재 등록된 핸들러 수. 테스트 setup/teardown 검증용. */ export function _sidebarHandlerCount(): number { return HANDLERS.length; }