chore: v2.2.73 — ASTRA-DEBUG 로그 레벨 + webview CSP font-src 보강

- ASTRA-DEBUG 정상 흐름 로그를 console.error → logInfo/console.log 로 강등
  (chatHandlers, extension, slashRouter): DevTools에 ERR로 찍히던 오탐 제거
- sidebar webview에 명시적 CSP meta 추가 + font-src에 data: 허용
  (sidebar.html, sidebarProvider._getHtml): VS Code outer iframe이 codicon.ttf를
  data:font/ttf 로 inject하면서 기본 CSP에 막혀 매 prompt 마다 violation
  경고가 찍히던 문제 해소
- 누적된 LM Studio / agent / 컨텍스트 매니저 / 테스트 갱신 동반

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
g1nation
2026-05-23 15:52:19 +09:00
parent 36db170844
commit 0712014fcb
43 changed files with 2417 additions and 977 deletions
+68
View File
@@ -223,3 +223,71 @@ export function mergeContinuationParts(prev: string, next: string): string {
/** Rough token count of a string — re-exported helper so callers don't need contextManager directly. */
export const countTokens = estimateTokens;
/**
* ── Plain-text 출력 위생 ──────────────────────────────────────────────
* 사용자가 마크다운 렌더 없이 깔끔한 한국어 plain text 답변을 원함.
* 모델/페르소나가 학습된 습관으로 `##`, `**`, `> `, `* ` 등을 섞어 내보내면 화면에 그대로 노출되므로,
* 최종 답변 직전 한 번 더 마커를 벗겨낸다.
*
* 보존:
* - 코드 블록 (```fence``` 사이 본문은 손대지 않음)
* - 인라인 코드 `code` (백틱 유지)
* - 숫자 목록 `1. ` `1) ` 같은 자연 표기
* - 줄 시작 대시 `- ` (자연스러운 plain text bullet)
*
* 제거 / 변환:
* - 줄 시작 `#`,`##`,`###`,... `[space]` → 헤더 마커 제거 (라벨 텍스트는 유지)
* - `**bold**` / `__bold__` → bold (강조 마커만 제거)
* - 단일 `*텍스트*` 강조 → 텍스트 (단, `* ` 불릿 / 곱셈/와일드카드 패턴은 보존)
* - 줄 시작 `> ` blockquote 마커 → 제거
* - 줄 시작 `* ` 불릿 → `- ` 로 정규화 (asterisk 가 강조로 오인되는 일을 줄임)
* - 헤더 줄에 붙어 있던 trailing colon/space 정리
*/
export function stripMarkdownFormatting(text: string): string {
if (!text) return '';
// 1. 코드 블록은 통째로 보호. fenced(```...```) 만 보호하고 본문 내부는 어떤 치환도 적용 안 함.
const fenceParts: string[] = [];
let src = String(text).replace(/```[\s\S]*?```/g, (m) => {
fenceParts.push(m);
return `FENCE${fenceParts.length - 1}`;
});
// 2. 인라인 코드도 보호 (백틱 안 표현은 손대지 않는다).
const inlineParts: string[] = [];
src = src.replace(/`[^`\n]+`/g, (m) => {
inlineParts.push(m);
return `INL${inlineParts.length - 1}`;
});
// 3. 줄 단위 정리.
src = src.split('\n').map((rawLine) => {
let line = rawLine;
// 줄 시작 헤더 마커 제거 ("## 핵심 요약" → "핵심 요약")
line = line.replace(/^\s{0,3}#{1,6}\s+/, '');
// 줄 시작 blockquote 제거
line = line.replace(/^\s{0,3}>\s?/, '');
// 줄 시작 `* ` 또는 `+ ` 불릿 → `- ` 로 통일
line = line.replace(/^(\s*)[*+]\s+/, '$1- ');
return line;
}).join('\n');
// 4. 강조 마커 제거.
src = src.replace(/\*\*(.+?)\*\*/g, '$1'); // **bold**
src = src.replace(/__([^_\n]+?)__/g, '$1'); // __bold__
// 단일 별 강조: 양쪽 공백/줄경계로 둘러싸인 경우만 (`a*b*c` 같은 코드/수식은 건드리지 않음).
src = src.replace(/(^|[\s(\[])\*([^\s*][^*\n]*?[^\s*])\*(?=[\s).,!?;:]|$)/g, '$1$2');
src = src.replace(/(^|[\s(\[])\*([^\s*])\*(?=[\s).,!?;:]|$)/g, '$1$2');
// 5. 헤더가 라벨처럼 단독 줄로 남았으면 뒤에 콜론을 보장 (가독성 — "핵심 요약" → "핵심 요약" 그대로 유지하고,
// 사용자가 라벨임을 인지하기 쉽도록 직후 줄에 본문이 오는 형태를 유도). 콜론은 자동 추가하지 않는다 — 모델이
// 이미 본문을 줄바꿈해 두는 케이스가 더 흔함.
// 6. 연속 빈 줄 3개+ → 2개로.
src = src.replace(/\n{3,}/g, '\n\n');
// 7. 보호했던 코드/인라인 복원.
src = src.replace(/INL(\d+)/g, (_, i) => inlineParts[Number(i)] || '');
src = src.replace(/FENCE(\d+)/g, (_, i) => fenceParts[Number(i)] || '');
return src.trim();
}