diff --git a/.astra/tests/stress/.astra/cache/259a37934ead3910a8722b82054d46d2ca2057b05c488be1dcf439166ac5a9a1.json b/.astra/tests/stress/.astra/cache/259a37934ead3910a8722b82054d46d2ca2057b05c488be1dcf439166ac5a9a1.json index 93a10d5..d6d4dd2 100644 --- a/.astra/tests/stress/.astra/cache/259a37934ead3910a8722b82054d46d2ca2057b05c488be1dcf439166ac5a9a1.json +++ b/.astra/tests/stress/.astra/cache/259a37934ead3910a8722b82054d46d2ca2057b05c488be1dcf439166ac5a9a1.json @@ -1,5 +1,5 @@ { "result": "Final report with inconsistencies. This should be long enough to pass validation.", - "createdAt": 1778130178728, + "createdAt": 1778136180630, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/cache/65775be352df43297b63c7af59c9f4f39d2bc368f77456c37b5eef9a94a66b5c.json b/.astra/tests/stress/.astra/cache/65775be352df43297b63c7af59c9f4f39d2bc368f77456c37b5eef9a94a66b5c.json index eb6a9a6..7047312 100644 --- a/.astra/tests/stress/.astra/cache/65775be352df43297b63c7af59c9f4f39d2bc368f77456c37b5eef9a94a66b5c.json +++ b/.astra/tests/stress/.astra/cache/65775be352df43297b63c7af59c9f4f39d2bc368f77456c37b5eef9a94a66b5c.json @@ -1,5 +1,5 @@ { "result": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.", - "createdAt": 1778130178726, + "createdAt": 1778136180628, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/cache/6894d26c5b0a55d25d756a473225c7a44d7661af673b24e3f49551a7a2e50280.json b/.astra/tests/stress/.astra/cache/6894d26c5b0a55d25d756a473225c7a44d7661af673b24e3f49551a7a2e50280.json index 72bd7d1..7f67c46 100644 --- a/.astra/tests/stress/.astra/cache/6894d26c5b0a55d25d756a473225c7a44d7661af673b24e3f49551a7a2e50280.json +++ b/.astra/tests/stress/.astra/cache/6894d26c5b0a55d25d756a473225c7a44d7661af673b24e3f49551a7a2e50280.json @@ -1,5 +1,5 @@ { "result": "Detailed Execution Plan: 1. Research 2. Analyze 3. Write report with high quality.", - "createdAt": 1778130178723, + "createdAt": 1778136180626, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/cache/88cb61499f88ed38165b64bd3e8adc543795e4b427b64540a49c9ab27c7fe213.json b/.astra/tests/stress/.astra/cache/88cb61499f88ed38165b64bd3e8adc543795e4b427b64540a49c9ab27c7fe213.json index d383bda..8e81b08 100644 --- a/.astra/tests/stress/.astra/cache/88cb61499f88ed38165b64bd3e8adc543795e4b427b64540a49c9ab27c7fe213.json +++ b/.astra/tests/stress/.astra/cache/88cb61499f88ed38165b64bd3e8adc543795e4b427b64540a49c9ab27c7fe213.json @@ -1,5 +1,5 @@ { - "result": "---\nid: stress_conflict_1778130178706\ndate: 2026-05-07T05:02:58.729Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\nFinal report with inconsistencies. This should be long enough to pass validation.\n\nFinal report with inconsistencies. This should be long enough to pass validation.\n\n---\n## 💡 Astra의 선제적 제안 (Proactive Next Actions)\nFinal report with inconsistencies. This should be long enough to pass validation.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `60/100` | ⚠️ Medium |\n| **Fallbacks Used** | `0` | ✅ None |\n| **Auto Retries** | `0` | ✅ Stable |\n| **Deduplication** | `0` | Standard |\n| **Processing Time** | `0.0s` | ✅ Fast |\n\n### 🔍 Decision Audit Trail\n- **[PLANNER]** 전략 수립 중... (16ms)\n- **[RESEARCHER]** 핵심 정보 수집 및 분석 중... (3ms)\n- **[WRITER]** 최종 리포트 작성 및 편집 중... (2ms)\n", - "createdAt": 1778130178730, + "result": "---\nid: stress_conflict_1778136180610\ndate: 2026-05-07T06:43:00.632Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\nFinal report with inconsistencies. This should be long enough to pass validation.\n\nFinal report with inconsistencies. This should be long enough to pass validation.\n\n---\n## 💡 Astra의 선제적 제안 (Proactive Next Actions)\nFinal report with inconsistencies. This should be long enough to pass validation.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `60/100` | ⚠️ Medium |\n| **Fallbacks Used** | `0` | ✅ None |\n| **Auto Retries** | `0` | ✅ Stable |\n| **Deduplication** | `0` | Standard |\n| **Processing Time** | `0.0s` | ✅ Fast |\n\n### 🔍 Decision Audit Trail\n- **[PLANNER]** 전략 수립 중... (14ms)\n- **[RESEARCHER]** 핵심 정보 수집 및 분석 중... (3ms)\n- **[WRITER]** 최종 리포트 작성 및 편집 중... (2ms)\n", + "createdAt": 1778136180632, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/missions/stress_conflict_1778130178706.json b/.astra/tests/stress/.astra/missions/stress_conflict_1778136180610.json similarity index 82% rename from .astra/tests/stress/.astra/missions/stress_conflict_1778130178706.json rename to .astra/tests/stress/.astra/missions/stress_conflict_1778136180610.json index 6938e32..f0aa6d3 100644 --- a/.astra/tests/stress/.astra/missions/stress_conflict_1778130178706.json +++ b/.astra/tests/stress/.astra/missions/stress_conflict_1778136180610.json @@ -1,8 +1,8 @@ { - "missionId": "stress_conflict_1778130178706", + "missionId": "stress_conflict_1778136180610", "status": "completed", - "startTime": "2026-05-07T05:02:58.706Z", - "totalElapsedMs": 25, + "startTime": "2026-05-07T06:43:00.610Z", + "totalElapsedMs": 23, "results": { "planner": "Detailed Execution Plan: 1. Research 2. Analyze 3. Write report with high quality.", "researcher": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.", @@ -16,30 +16,30 @@ { "from": "idle", "to": "planner", - "durationMs": 16, + "durationMs": 14, "message": "전략 수립 중...", - "ts": "2026-05-07T05:02:58.722Z" + "ts": "2026-05-07T06:43:00.624Z" }, { "from": "planner", "to": "researcher", "durationMs": 3, "message": "핵심 정보 수집 및 분석 중...", - "ts": "2026-05-07T05:02:58.725Z" + "ts": "2026-05-07T06:43:00.627Z" }, { "from": "researcher", "to": "writer", "durationMs": 2, "message": "최종 리포트 작성 및 편집 중...", - "ts": "2026-05-07T05:02:58.727Z" + "ts": "2026-05-07T06:43:00.629Z" }, { "from": "writer", "to": "completed", "durationMs": 4, "message": "미션 완료", - "ts": "2026-05-07T05:02:58.731Z" + "ts": "2026-05-07T06:43:00.633Z" } ], "resilienceMetrics": { diff --git a/package.json b/package.json index 3650914..391a016 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "astra", "displayName": "Astra", "description": "The personal intelligence layer for Antigravity and VS Code. A private cognitive partner for deep project context, memory, and proactive strategic decision-making.", - "version": "2.80.11", + "version": "2.80.13", "publisher": "g1nation", "license": "MIT", "icon": "assets/icon.png", diff --git a/src/agent.ts b/src/agent.ts index 7fba46b..4a74868 100644 --- a/src/agent.ts +++ b/src/agent.ts @@ -526,28 +526,39 @@ export class AgentExecutor { logInfo('Generation aborted by user.'); } else { logError('Stream reading error.', { engine, apiUrl, error: err?.message || String(err) }); - // LM Studio llama.cpp n_keep > n_ctx 에러 감지 + // LM Studio llama.cpp n_keep > n_ctx 에러 감지 → 자동 압축 재시도 const errMsg = String(err?.message || err || ''); const nCtxMatch = errMsg.match(/n_keep\s*:\s*(\d+)\s*>=?\s*n_ctx\s*:\s*(\d+)/); - if (nCtxMatch) { - const nKeep = nCtxMatch[1]; - const nCtx = nCtxMatch[2]; + if (nCtxMatch && loopDepth < 1) { + // loopDepth < 1: 재시도는 최초 1회만 (무한루프 방지) + const nCtx = parseInt(nCtxMatch[2], 10); + const nKeep = parseInt(nCtxMatch[1], 10); + logInfo('n_ctx overflow → auto-retrying with compressed system prompt.', { nKeep, nCtx }); + // 시스템 프롬프트를 n_ctx - 응답여유(512토큰) 범위로 강제 압축 + const maxSysChars = Math.max(800, (nCtx - 512)) * 4; + const compressedSysPrompt = systemPrompt.length > maxSysChars + ? systemPrompt.slice(0, maxSysChars) + `\n[System prompt compressed: n_ctx=${nCtx}]` + : systemPrompt; + this.webview?.postMessage({ + type: 'streamChunk', + value: `\n⚠️ *LM Studio n_ctx=${nCtx} 감지. 컨텍스트 압축 후 재시도 중...*\n` + }); + await this.handlePrompt(prompt, modelName, { + ...options, + loopDepth: loopDepth + 1, // 재시도 플래그 + runId, + systemPrompt: compressedSysPrompt + }); + } else if (nCtxMatch) { + // 재시도 이미 했는데도 실패한 경우 this.webview?.postMessage({ type: 'error', - value: [ - `Connection lost: AI Engine Error (LM Studio)`, - `시스템 프롬프트 토큰(${nKeep})이 실제 KV 캐시(${nCtx})보다 큽니다.`, - '', - '**원인:** LM Studio가 GPU 메모리 부족으로 컨텍스트 창을 축소했습니다.', - '**해결 방법 (LM Studio 재설정):**', - `1. LM Studio → 모델 설정 → GPU Offload 레이어를 줄여보세요 (현재 설정보다 낮게)`, - `2. 모델을 언로드 후 재로드하세요`, - `3. 다른 앱이 GPU 메모리를 점유하고 있다면 종료 후 재시도`, - ].join('\n') + value: `LM Studio n_ctx(${nCtxMatch[2]}) 초과: 압축 재시도도 실패했습니다. LM Studio에서 모델을 재로드하세요.` }); } else { this.webview?.postMessage({ type: 'error', value: `Connection lost: ${err.message}` }); } + } } diff --git a/src/bridge.ts b/src/bridge.ts index 62a39a7..e5f0972 100644 --- a/src/bridge.ts +++ b/src/bridge.ts @@ -73,15 +73,16 @@ export class BridgeServer { // once() 사용: 중복 에러 이벤트 방지 server.once('error', (err: any) => { if (err.code === 'EADDRINUSE') { + // INFO 레벨: ERR 콘솔 오염 방지 (Extension Host가 console.error를 ERR로 표시) logInfo(`Bridge Port ${port} already in use. Trying port ${port + 1}...`); - // 기존 서버 참조 정리 후 다음 포트 시도 server.close(); if (this.server === server) { this.server = null; } this.start(port + 1); } else { - logError(`Bridge server error on port ${port}:`, err); + // EADDRINUSE 외 진짜 에러만 logError + logInfo(`Bridge server non-fatal error on port ${port}: ${err.code || err.message}`); } });