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
+22 -2
View File
@@ -49,7 +49,9 @@ describe('contextManager.computeOutputBudget', () => {
});
describe('contextManager.trimHistoryToBudget', () => {
const marker = (n: number): BudgetMessage => ({ role: 'system', content: `[dropped ${n}]`, internal: true });
// v2.2.69: makeMarker now also receives the dropped messages array so callers can build a real summary.
// Tests don't need the dropped payload — just keep the signature compatible.
const marker = (n: number, _dropped?: BudgetMessage[]): BudgetMessage => ({ role: 'system', content: `[dropped ${n}]`, internal: true });
it('keeps everything when under budget', () => {
const msgs: BudgetMessage[] = [{ role: 'user', content: 'hi' }, { role: 'assistant', content: 'hello' }];
const r = trimHistoryToBudget(msgs, 10_000, marker);
@@ -63,7 +65,25 @@ describe('contextManager.trimHistoryToBudget', () => {
expect(r.messages[0].content).toMatch(/^\[dropped \d+\]$/);
// most recent message survives
expect(r.messages[r.messages.length - 1]).toEqual(msgs[msgs.length - 1]);
expect(r.tokensAfter).toBeLessThanOrEqual(250 + estimateMessagesTokens([marker(1)]));
expect(r.tokensAfter).toBeLessThanOrEqual(250 + estimateMessagesTokens([marker(1, [])]));
});
it('passes the dropped messages array to the marker factory (v2.2.69)', () => {
const msgs: BudgetMessage[] = Array.from({ length: 6 }, (_, i) => ({
role: i % 2 ? 'assistant' : 'user',
content: 'x'.repeat(400),
}));
let observedDropped: BudgetMessage[] | undefined;
const factory = (n: number, dropped: BudgetMessage[]): BudgetMessage => {
observedDropped = dropped;
return { role: 'system', content: `[summary of ${n}: first=${dropped[0]?.role}]`, internal: true };
};
const r = trimHistoryToBudget(msgs, 250, factory);
expect(r.droppedCount).toBeGreaterThan(0);
expect(observedDropped).toBeDefined();
expect(observedDropped!.length).toBe(r.droppedCount);
// Dropped messages are the OLDEST ones, in order.
expect(observedDropped![0]).toEqual(msgs[0]);
expect(r.messages[0].content).toMatch(/^\[summary of \d+: first=user\]$/);
});
it('always keeps at least the last message even if it alone exceeds the budget', () => {
const msgs: BudgetMessage[] = [{ role: 'user', content: 'short' }, { role: 'user', content: 'y'.repeat(5000) }];