/**
 * Post-Answer Hook 인터페이스 — 답변 streaming 완료 후 실행되는 부가 작업.
 *
 * 옛 구조: `agent.ts` 의 `_maybeEmitDevilRebuttal`, `_maybePostHocSelfCheck`,
 * `_maybeRunTermValidator` 3개 private method. 새 hook 추가 시 (1) method 정의
 * (2) import (3) call site `void this._maybeX(...)` — 3곳 편집.
 *
 * 새 구조: 각 hook 이 `PostAnswerHook` 객체로 자기 module 에. agent.ts 는 1 loop.
 * 새 hook = 1 파일 + index.ts 에 1 push.
 */

/**
 * Hook 이 webview 에 postMessage 만 하면 되므로 vscode.Webview 또는 slashRouter 의
 * 간이 Webview 둘 다 만족하는 최소 인터페이스로 정의.
 */
interface PostMessageWebview {
    postMessage(msg: any): Thenable<boolean> | boolean;
}

export interface PostAnswerHookContext {
    userPrompt: string;
    assistantAnswer: string;
    /** LLM 호출용 — Devil/SelfCheck 가 사용. */
    baseUrl: string;
    modelName: string;
    contextLength: number;
    engine: 'lmstudio' | 'ollama';
    /** Self-check 용 출처 미리보기. memoryContext 가 turnCtx 에 채움. */
    selfCheckSources: Array<{ title: string; excerpt: string }>;
    /** Confidence Engine 검색 신호 (Phase 2). memoryContext 가 채움 — 검색 안 돈 turn 은 null. */
    confidenceSignals?: import('../../intelligence/confidenceEngine').RetrievalConfidenceSignals | null;
    /** Devil Agent 가 호출 — non-streaming LLM. */
    callNonStreaming: (params: any) => Promise<{ text: string; stopReason?: string }>;
    /** Abort signal accessor. */
    getAbortSignal: () => AbortSignal | undefined;
    /** Webview accessor — hook 결과 streamChunk 송출. vscode.Webview / 간이 Webview 호환. */
    getWebview: () => PostMessageWebview | undefined;
    /** 활성 두뇌 경로 — Reflection 기록용. 없으면 회고 skip. */
    getBrainPath?: () => string | undefined;
}

export interface PostAnswerHook {
    /** 디버그·중복 방지용. */
    id: string;
    /**
     * true → fire-and-forget (async, main turn 영향 없음).
     * false → 동기 실행 (LLM 호출 없는 결정론적 hook, 예: termValidator).
     */
    runAsync: boolean;
    /** 실행 본문. throw 해도 다른 hook 영향 없음 (caller 가 try/catch 로 감쌈). */
    run(ctx: PostAnswerHookContext): void | Promise<void>;
}
