diff --git a/package.json b/package.json index 7598647..122de0a 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "connect-ai-lab", "displayName": "Connect AI LAB", "description": "100% 로컬 AI 코딩 에이전트 — 파일 생성, 코드 편집, 터미널 실행을 오프라인으로. Ollama + Gemma/Llama/DeepSeek 지원.", - "version": "1.0.10", + "version": "1.0.11", "publisher": "connectailab", "license": "MIT", "icon": "assets/icon.png", diff --git a/src/extension.ts b/src/extension.ts index 14515da..81c50c2 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -604,12 +604,12 @@ textarea::placeholder{color:var(--text-dim)} @keyframes shimmer{0%{left:-40px}100%{left:120px}} @keyframes pulse{0%,100%{opacity:.5}50%{opacity:1}} -
Connect AI LAB
+
Connect AI
-
Connect AI LAB
-
100% \ub85c\uceec \u00b7 100% \uc624\ud504\ub77c\uc778 \u00b7 100% \ubb34\ub8cc
\ud504\ub85c\uc81d\ud2b8\ub97c \uc774\ud574\ud558\uace0, \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uace0, \uc2e4\ud589\ud569\ub2c8\ub2e4.
+
Connect AI
+
보안 · 비용최적화 · 지식화
프로젝트를 이해하고, 코드를 작성하고, 실행합니다.
@@ -627,12 +627,16 @@ input.addEventListener('input',()=>{input.style.height='auto';input.style.height function getTime(){return new Date().toLocaleTimeString('ko-KR',{hour:'2-digit',minute:'2-digit'})} function esc(s){const d=document.createElement('div');d.innerText=s;return d.innerHTML} function fmt(t){ - t=t.replace(new RegExp('([\\\\s\\\\S]*?)<\\\\/create_file>', 'g'),(_,p,c)=>'
\uD83D\uDCC1 '+esc(p)+' \u2014 \uC790\uB3D9 \uC0DD\uC131\uB428
'+esc(c)+'
'); - t=t.replace(new RegExp('([\\\\s\\\\S]*?)<\\\\/edit_file>', 'g'),(_,p,c)=>'
\u270F\uFE0F '+esc(p)+' \u2014 \uD3B8\uC9D1\uB428
'+esc(c)+'
'); - t=t.replace(new RegExp('([\\\\s\\\\S]*?)<\\\\/run_command>', 'g'),(_,c)=>'
\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 '
'+l+'
'+esc(c)+'
'}); - t=t.replace(new RegExp('\\\\x60([^\\\\x60]+)\\\\x60', 'g'),(_,c)=>''+esc(c)+''); + 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=esc(t); t=t.replace(new RegExp('\\\\*\\\\*([^*]+)\\\\*\\\\*', 'g'),'$1'); + t=t.replace(new RegExp('__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)})} @@ -640,12 +644,12 @@ function addMsg(text,role){ const isUser=role==='user',isErr=role==='error'; const el=document.createElement('div');el.className='msg'+(isUser?' msg-user':'')+(isErr?' msg-error':''); const head=document.createElement('div');head.className='msg-head'; - head.innerHTML=(isUser?'
\ud83d\udc64
You':'
\u2726
Connect AI LAB')+''+getTime()+''; + head.innerHTML=(isUser?'
\ud83d\udc64
You':'
\u2726
Connect AI')+''+getTime()+''; const body=document.createElement('div');body.className='msg-body'; 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 LAB'+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})}