feat: v2.2.74 → v2.2.82 — chunked writer + 코드 리뷰 패치 + /youtube 확장

주요 변경:

[chunked writer 아키텍처 (v2.2.74~v2.2.75)]
- 5-stage 다중 에이전트(planner/researcher/reflector/writer/synthesizer)
  파이프라인 제거 → 단일 ChunkedWriter 의 outline → section[N] → polish
  3-step 으로 교체. 본문 분석에서 추상화 손실 / 토큰 폭증 문제 해소
- 답변 길이 자동 분기: 짧은 prompt 는 fast-path direct 1회 호출,
  본문 분석은 chunked. outline 빈 배열도 direct 폴백

[코드 리뷰 9개 항목 일괄 패치 (v2.2.76)]
- /research polling hang 방어 (heartbeat + status 정규화 + 연속 실패 abort)
- 회사 모드 dispatcher abort 신호를 AIService.chat 까지 전달
- bridgeFetch 에 onHeartbeat 콜백 도입 (slow endpoint 사용자 친화적)
- dead code 정리: reflectionPersister.ts 제거 + enableReflection 등 좀비 config 키
- parseOutline 의 empty vs fallback reason 명시적 분리
- chatHandlers 의 회사 모드 케이스 ~325줄을 src/sidebar/companyHandlers.ts 로 분리
- Intent Alignment 라운드 한도 도달 시 smart 모드 자동 진행
- LM Studio doSwitch unload 실패 시 currentModel 정리 + load 강행
- retrieval informationDensity → queryCoverage 정합화

[/youtube 채널 지원 (v2.2.77~v2.2.82)]
- 채널/플레이리스트 URL 자동 감지 + n:N 으로 영상 개수 지정 (최대 50)
- 채널 루트 URL 에 /videos 탭 자동 append (yt-dlp enumeration 정상화)
- 영상별 순차 처리 (queue 패턴) + i/N 진행 표시 + 마지막 통계 요약
- mode:info / mode:benchmark / mode:both 분석 모드 분기
  - info: 영상 내용을 지식 카드로 추출 (튜토리얼·강의·뉴스용)
  - benchmark: 4-렌즈 대본 역기획서 (콘텐츠 제작 벤치마크용)
  - both: 둘 다 (기본)
  - bare keyword 도 허용: /youtube <url> n:1 info
- bridge 에러 메시지 [object Object] 깨짐 수정 (구조화 에러 추출)
- "패키지 없음" 등 환경 의존성 에러에 자동 가이드 첨부

[Astra: Setup Datacollect Dependencies 명령 추가 (v2.2.80)]
- Python 자동 감지 + yt-dlp / youtube-transcript-api 자동 설치
- macOS PEP 668 환경 자동 폴백 (--user --break-system-packages)
- /youtube 등에서 패키지 미설치 감지 시 "Install Now" 버튼 notification

[테스트]
- tests/agentEngine.test.ts 를 chunked flow 에 맞춰 전체 재작성
- tests/resilience_stress.test.ts Scenario B/D 를 role-aware mock 으로 갱신
- 399/399 통과

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
g1nation
2026-05-23 23:13:21 +09:00
parent 0712014fcb
commit ded3eea7ce
39 changed files with 2098 additions and 1820 deletions
+12 -6
View File
@@ -2288,11 +2288,15 @@ export class SidebarChatProvider implements vscode.WebviewViewProvider, BridgeIn
const mode = opts.mode;
const reachedLimit = opts.roundsAsked >= opts.roundsLimit;
// 자동 진행 조건: smart 모드 + high confidence + open question 없음.
// strict 모드면 절대 자동 진행 안 함 — 항상 사용자 확인.
const canAutoProceed = mode === 'smart'
&& contract.confidence === 'high'
&& contract.openQuestions.length === 0;
// 자동 진행 2가지 조건 (smart 모드 한정 — strict 는 항상 사용자 확인):
// (a) high confidence + openQuestions 0 → 명백히 충분한 alignment
// (b) 라운드 한도 도달 + medium 이상 confidence → 더 물어봐도 별 효용 없으니
// 사용자가 멍하니 확인 클릭만 하게 하지 말고 진행. 무한 round 방어 + UX.
// (b) 케이스에서 confidence='low' 인 경우엔 여전히 confirm 카드로 사용자 결정 요청.
const canAutoProceed = mode === 'smart' && (
(contract.confidence === 'high' && contract.openQuestions.length === 0)
|| (reachedLimit && (contract.confidence === 'high' || contract.confidence === 'medium'))
);
if (canAutoProceed) {
// contract 한 줄 안내 후 곧장 pipeline. 사용자 friction 최소.
@@ -2301,6 +2305,7 @@ export class SidebarChatProvider implements vscode.WebviewViewProvider, BridgeIn
value: {
kind: 'auto-proceed',
contract,
reachedLimit,
},
});
try { this.pixelOfficeOnAlignmentResult('auto-proceed', contract); } catch { /* noop */ }
@@ -2345,7 +2350,8 @@ export class SidebarChatProvider implements vscode.WebviewViewProvider, BridgeIn
if (!pending) return;
const cfg = getConfig();
const mode = (cfg.companyIntentAlignmentMode === 'strict') ? 'strict' : 'smart';
const roundsLimit = Math.max(1, Math.min(5, cfg.companyIntentAlignmentMaxRounds ?? 3));
const { ALIGNMENT_DEFAULT_MAX_ROUNDS } = await import('./features/company/intentAlignment');
const roundsLimit = Math.max(1, Math.min(5, cfg.companyIntentAlignmentMaxRounds ?? ALIGNMENT_DEFAULT_MAX_ROUNDS));
// 사용자 답변을 미해결 질문들에 일괄 매핑 — 작은 모델이 자연어로 통째로
// 답하기 마련이라 질문별로 분리 안 함. 그냥 "이번 라운드 사용자 추가
// 답변" 한 덩어리로 넣어주면 분석기가 다음 라운드에 그걸 보고 알아서