diff --git a/package.json b/package.json index 91c5395..07339a7 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "connect-ai-lab", "displayName": "Connect AI", "description": "100% 로컬 AI 코딩 에이전트 — 파일 생성, 코드 편집, 터미널 실행을 오프라인으로. Ollama + Gemma/Llama/DeepSeek 지원.", - "version": "1.0.21", + "version": "1.0.22", "publisher": "connectailab", "license": "MIT", "icon": "assets/icon.png", diff --git a/src/extension.ts b/src/extension.ts index a6509f3..9a03ebd 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -887,8 +887,9 @@ class SidebarChatProvider implements vscode.WebviewViewProvider { return report; } + // ============================================================ - // Webview HTML — Premium UI v2 (Zero External Dependencies) + // Webview HTML — CINEMATIC UI v3 (Content-Grade Visuals) // ============================================================ private _getHtml(): string { return ` @@ -897,83 +898,113 @@ class SidebarChatProvider implements vscode.WebviewViewProvider { -
Connect AI
+
Connect AI
Connect AI
-
보안 · 비용최적화 · 지식화
프로젝트를 이해하고, 코드를 작성하고, 실행합니다.
+
\ubcf4\uc548 \u00b7 \ube44\uc6a9\ucd5c\uc801\ud654 \u00b7 \uc9c0\uc2dd\uc5f0\uacb0
\ud504\ub85c\uc81d\ud2b8\ub97c \uc774\ud574\ud558\uace0, \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uace0, \uc2e4\ud589\ud569\ub2c8\ub2e4.
@@ -993,14 +1024,14 @@ function esc(s){const d=document.createElement('div');d.innerText=s;return d.inn function fmt(t){ const blocks = []; function pushB(h){ blocks.push(h); return '__B' + (blocks.length-1) + '__'; } - t=t.replace(new RegExp('([\\\\s\\\\S]*?)<\\\\/create_file>', 'g'),(_,p,c)=>pushB('
\uD83D\uDCC1 '+esc(p)+' \u2014 \uC790\uB3D9 \uC0DD\uC131\uB428
'+esc(c)+'
')); - t=t.replace(new RegExp('([\\\\s\\\\S]*?)<\\\\/edit_file>', 'g'),(_,p,c)=>pushB('
\u270F\uFE0F '+esc(p)+' \u2014 \uD3B8\uC9D1\uB428
'+esc(c)+'
')); - t=t.replace(new RegExp('([\\\\s\\\\S]*?)<\\\\/run_command>', 'g'),(_,c)=>pushB('
\u25B6 '+esc(c)+'
')); - t=t.replace(new RegExp('\\\\x60\\\\x60\\\\x60(\\\\w*)\\\\n([\\\\s\\\\S]*?)\\\\x60\\\\x60\\\\x60', 'g'),(_,lang,c)=>{const l=lang||'code';return pushB('
'+esc(l)+'
'+esc(c)+'
');}); - t=t.replace(new RegExp('\\\\x60([^\\\\x60]+)\\\\x60', 'g'),(_,c)=>pushB(''+esc(c)+'')); + t=t.replace(/([\\s\\S]*?)<\\/create_file>/g,(_,p,c)=>pushB('
\ud83d\udcc1 '+esc(p)+' \u2014 \uc790\ub3d9 \uc0dd\uc131\ub428
'+esc(c)+'
')); + t=t.replace(/([\\s\\S]*?)<\\/edit_file>/g,(_,p,c)=>pushB('
\u270f\ufe0f '+esc(p)+' \u2014 \ud3b8\uc9d1\ub428
'+esc(c)+'
')); + t=t.replace(/([\\s\\S]*?)<\\/run_command>/g,(_,c)=>pushB('
\u25b6 '+esc(c)+'
')); + t=t.replace(/\x60\x60\x60(\\w*)\\n([\\s\\S]*?)\x60\x60\x60/g,(_,lang,c)=>{const l=lang||'code';return pushB('
'+esc(l)+'
'+esc(c)+'
');}); + t=t.replace(/\x60([^\x60]+)\x60/g,(_,c)=>pushB(''+esc(c)+'')); t=esc(t); - t=t.replace(new RegExp('\\\\*\\\\*([^*]+)\\\\*\\\\*', 'g'),'$1'); - t=t.replace(new RegExp('__B(\\\\d+)__', 'g'), (_,i)=>blocks[i]); + t=t.replace(/\\*\\*([^*]+)\\*\\*/g,'$1'); + t=t.replace(/__B(\\d+)__/g, (_,i)=>blocks[i]); return t; } function copyCode(btn){const code=btn.parentElement.querySelector('code');if(!code)return;navigator.clipboard.writeText(code.innerText).then(()=>{btn.textContent='\u2713 Copied';btn.classList.add('copied');setTimeout(()=>{btn.textContent='Copy';btn.classList.remove('copied')},1500)})} @@ -1013,7 +1044,7 @@ function addMsg(text,role){ if(isUser){body.innerText=text}else{body.innerHTML=fmt(text)} el.appendChild(head);el.appendChild(body);chat.appendChild(el);chat.scrollTop=chat.scrollHeight; } -function showLoader(){loader=document.createElement('div');loader.className='msg';loader.innerHTML='
\u2726
Connect AI'+getTime()+'
\uc0dd\uac01\ud558\ub294 \uc911...
';chat.appendChild(loader);chat.scrollTop=chat.scrollHeight} +function showLoader(){loader=document.createElement('div');loader.className='msg';loader.innerHTML='
\u2726
Connect AI'+getTime()+'
\uc0dd\uac01\ud558\ub294 \uc911...
';chat.appendChild(loader);chat.scrollTop=chat.scrollHeight} function hideLoader(){if(loader&&loader.parentNode)loader.parentNode.removeChild(loader);loader=null} function setSending(v){sending=v;sendBtn.disabled=v;stopBtn.classList.toggle('visible',v);input.disabled=v;if(!v)input.focus()} function send(){const text=input.value.trim();if(!text||sending)return;const w=document.querySelector('.welcome');if(w)w.remove();document.querySelectorAll('.quick-actions').forEach(e=>e.remove());addMsg(text,'user');input.value='';input.style.height='auto';setSending(true);showLoader();vscode.postMessage({type:'prompt',value:text,model:modelSel.value})} @@ -1033,7 +1064,7 @@ window.addEventListener('message',e=>{const msg=e.data;switch(msg.type){ case 'injectPrompt':input.value=msg.value;input.style.height='auto';input.style.height=Math.min(input.scrollHeight,150)+'px';send();break; } }); } catch(err) { - document.body.innerHTML = '

⚠️ WEBVIEW JS CRASH

' + err.name + ': ' + err.message + '\\n' + err.stack + '
'; + document.body.innerHTML = '

\u26a0\ufe0f WEBVIEW JS CRASH

' + err.name + ': ' + err.message + '\\n' + err.stack + '
'; } `; }