- KaTeX self-host (vendor/katex) 추가, $...$/$$...$$ 자동 렌더링 + mhchem 확장으로
\ce{C4H10} 같은 화학식·반응식 표기 지원 (renderKatexIn, renderChatMessages 후처리)
- SmilesDrawer self-host (vendor/smiles-drawer) 추가, ```smiles``` 코드블록으로 SMILES
표기를 실제 결합선 있는 2D 구조식으로 렌더링. 라이브러리의 Drawer(canvas) 클래스가
내부 svgWrapper null 참조로 깨지는 버그가 있어 SvgDrawer로 우회
- 진짜 원인 버그 수정: escHtml()가 백틱(`)/백슬래시/달러도 이스케이프하는데, 코드블록·
인라인코드 정규식이 이스케이프 *이후*에 원본 백틱을 찾고 있어 애초에 매치가 안 됐음
— tradingview 차트·네이버 주식차트·MIDI 위젯 등 기존 기능도 전부 이 버그로 작동 안
하고 있었고, 이번에 같이 고쳐서 정상 작동 확인
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 진짜 원인: partialContent가 try{} 블록 안에서 let 선언돼 catch{}에서 참조되던
스코프 버그. fetch abort/에러 시 catch 블록 자체가 ReferenceError로 죽어서
뒤따르는 정리 코드(isThinking=false 등)가 전혀 실행되지 않고 스피너가 영원히
돌았음(직접 재현 확인). 선언을 try 밖으로 이동해 해결
- SSE 스톨 워치독 추가: 45초간 스트림에 아무 데이터도 없으면 자동 abort 후
세션 히스토리를 재조회해 서버가 이미 완료·저장한 응답이 있으면 복구 표시,
없으면 재시도 안내. 방금 보낸 사용자 메시지(fullMessage, 내용을 정확히 아는
값)를 기준점 삼아 뒤에서부터 매칭 — AI 응답 내용 추측/비교보다 안정적
- 부수 개선: 이메일 첨부 SSE 파일 링크 푸시 로직 등 기존 코드는 변경 없음
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 투자앱 시작 시 빈 차트 대신 XLK(기술주 섹터 ETF) TradingView 차트를 바로 띄우도록 변경
- 언어앱 플래시카드 타일 그리드 뷰에 🔊 발음 듣기 버튼 추가 (기존엔 로마자 발음
표시만 있고 TTS 버튼이 빠져있었음) — 단일 카드 뷰와 동일하게 카드 중앙 하단에 배치,
클릭 시 카드가 뒤집히지 않도록 stopPropagation 처리
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- weather_map_screenshot 캡처 해상도 900x620→1280x880, PNG→JPEG(품질90)로 변경.
300KB 넘으면 vision 파이프라인이 600x600으로 강제 축소하던 걸(server-v2.ts
resolveToolImageContent) 파일 크기를 낮춰서 회피 — 지명·기온 숫자가 선명해짐
- 기상전문가 프롬프트에 lat/lon을 서울로 고정 복사하지 않고 실제 언급된 지역
기준으로 치환하도록 명시 + 주요 도시 12곳 좌표표 추가
- 오버레이 9종(바람/강수/기온/구름/기압/대기질/레이더/적설/파고)별 색상 범례
해석 가이드("지도 읽는 법") 추가 — 이미지는 받아도 읽는 법이 없어 해석이
부실했던 문제
- "태풍" 계열 단어를 Windy 지도 트리거에 추가(기존엔 없어서 뜨는 게 랜덤했음)
+ 태풍 요청 시 좌표를 먼저 검색해 그 위치로 지도를 센터링하도록 지시
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- weather_map_screenshot 툴이 코드(weather.ts)·레지스트리엔 있었지만 buildTools()
스키마가 없어 모델이 호출 자체를 못 하던 걸 연결. 날씨앱(wt_ 세션) 전용으로 게이팅
- 언어앱 "AI 카드 생성"이 실제로는 0장을 반환하던 버그 수정 — config.json 모델이
kimi-k2.6:cloud(추론모델)로 바뀌면서 num_predict가 너무 작아 생각(thinking)만 하다
토큰을 다 쓰고 실제 답변을 못 내놓고 있었음. think:false + num_predict 상향으로 해결
(generate-flashcards/generate-lesson/check-answer 3개 API 모두 동일 수정)
- 언어앱 플래시카드에 타일 그리드 뷰 추가 — 카테고리 카드 전체를 한번에 펼쳐보고
개별 탭으로 뒤집어볼 수 있음
- 상담앱 심리검사를 7종 → 12종으로 확장: PCL-5(PTSD), MDQ(양극성), OCI-R(강박),
ASRS-6(성인ADHD), SPIN(사회불안) 추가. PHQ-9 9번 문항(자살/자해 생각) 안전장치를
안내문 한 줄에서 결과화면 상단 위기상담 배너로 강화
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 2개월 tool_audit.log 실사용 확인 후 미사용 에이전트 툴(start_task 등)과
포트 9222 연결실패로 고장난 브라우저 툴을 메인챗에서 제외
- 날씨/법률/논문 툴을 스킬+키워드 조건부로 전환, dental/mind 전용 MCP DB
24개를 해당 앱 세션(dental_/mn_)에만 스코핑, weather/lawyer 앱 세션은
스킬·키워드와 무관하게 항상 포함되도록 별도 처리
- 위 변경으로 메인챗 고정 오버헤드 24,439 → 8,169 토큰(-66%) 실측 확인
- tool_overhead SSE 이벤트를 모델 호출 전에 전송해 세션 게이지가 중단된
턴에서도 툴 스키마+시스템프롬프트 크기를 반영하도록 수정 (app.js)
- 부수 수정: heartbeat 세션을 lastMainSessionId 폴백에서 완전 격리(다른
세션 기록 오염 방지), webSearch 빈 결과를 실패로 오판하던 버그 수정
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
searchForSynthesis가 executeWebSearch에 위임하도록 재작성 — 두 툴이 동일한
6-provider 체인(searxng→ollama_cloud→tavily→google→brave→ddg→ddg_html) +
빈결과가드(21367ea) + 이벤트 보강을 공유. 이전엔 ollama_web_search가
searxng→ollama_cloud→ddg→ddg_html만 거치고 tavily/google/brave를 스킵하는
분리된 체인이었음(API 키가 없어 잠복 상태로 남아 있던 구멍).
ollamaWebSearchTool 설명이 "Ollama 모델이 DuckDuckGo 웹 검색을 수행"이라
적혀 있던 것을 실제 동작에 맞게 정정 — 코드가 먼저 폴백 체인으로 검색하고
Ollama chat API(config의 ollama.endpoint+model)는 요약만 담당. 모델은 검색을
직접 수행하거나 검색 여부를 결정하지 않음(환각 방지). 모델명처럼 변하는 값은
하드코딩하지 않고 config 참조로만 기술.
Co-Authored-By: Claude <noreply@anthropic.com>
executeWebSearch()가 provider 호출이 예외를 던지지 않으면 결과가
0건이어도 "성공"으로 간주하고 그 자리에서 반환해버려, 뒤에 있는
(더 잘 작동할 수도 있는) provider로 넘어가지 못했음. 오늘 시어엔진이
bing 타임아웃으로 0건을 반환했을 때 ollama_cloud가 멀쩡히 있었는데도
전혀 시도되지 않은 게 이 버그 때문이었음.
- SearchProviderAttempt에 'empty' 상태 추가 (성공했지만 결과 없음)
- 각 provider 호출 후 실제 결과 개수를 확인해서 0건이면 다음
provider로 계속 진행하도록 수정
- 전부 empty/failed로 끝나면 하드 에러 대신 가장 처음 나온 "성공했지만
빈 결과"를 우아하게 반환 (기존엔 여기까지 오면 무조건 에러)
- ddg를 candidates 맨 뒤로 재배치 — Instant Answer API는 구조적으로
일반 검색을 지원 안 하고, HTML 스크래핑 폴백은 현재 이 서버 IP에서
DuckDuckGo 봇탐지에 막혀있어 거의 항상 빈손임 (html.duckduckgo.com,
lite.duckduckgo.com, duckduckgo.com 전부 확인함)
- 중복되던 6개의 거의 동일한 provider 분기를 runProvider() 디스패치
헬퍼 하나로 통합
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- searchOllama()를 예전 tool_calls 방식에서 "코드가 검색 먼저 실행 →
모델은 결과만 요약" 방식으로 교체 (모델이 검색 스킵하고 환각 답변하던
버그 수정)
- ollama.com/api/web_search 기반 새 provider(ollama_cloud) 추가,
web_search 폴백 순서: searxng → ollama_cloud → ddg → tavily →
google → brave
- web_search와 ollama_web_search가 searchForSynthesis() 공통 헬퍼로
같은 폴백 체인을 공유하도록 통합 (기존엔 ollama_web_search가 DDG
단일 의존이라 SearXNG 이중화 혜택을 못 받았음)
- search.ollama_api_key 설정 필드 추가 (config.json, types.ts,
settings.ts REST 라우트). 실제 키 값은 vault:search.ollama_api_key
참조로 저장 — 평문은 config.json에도 git 히스토리에도 남기지 않음
(.smallclaw/vault/ AES-256-GCM 암호화 저장소, gitignore 대상)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
no_speech_prob가 높은 세그먼트를 텍스트 조합에서 제외하고
hallucination_silence_threshold를 걸어, 배경 소음이나 다른 사람
목소리가 섞였을 때 엉뚱한 텍스트가 연속으로 나오는 문제를 완화.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 숫자를 완전한 한글 표기로 변환 (사이노-한국어 기본, 시각은 순우리말)
- °C/°F/%/m/s/mm/km 등 단위를 한글로 스펠아웃
- 괄호 앞뒤 pause 강화, 방위 약어(SSW 등) 한글 변환
- 마크다운 표/리스트를 줄바꿈 전에 분할 후 정제하도록 파이프라인 재설계
- 구조적 개행(리스트/표 셀) 유래 조각은 병합 금지, 대화체 문장만 병합
- 소수점(27.7) 오탐 문장경계 버그 수정
- num_step 16, speed 1.15로 튜닝 (품질 손실 없이 생성속도 개선)
- 대기열 위치 표시 (tts_queue 메시지)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- web-ui: 🔊 버튼 연타/중첩 클릭 시 이전 요청이 완료되면서 새 요청과 오디오가
겹쳐 재생되던 버그 수정 (playTTSText/playTTSMsg를 _ttsPlay 공용 코어로 통합,
AbortController + 활성 버튼 가드로 stale response의 재생을 원천 차단)
- voice.tts.provider를 edge_tts(ko-KR-SunHiNeural)에서 xtts_gpu로 전환 —
실제로는 실시간 통화와 동일한 GPU 엔진(OmniVoice)을 타서 영어 섞인 문장의
발음이 훨씬 자연스러워짐
- voice_engine.py: OmniVoice num_step 기본값을 32→16으로 낮춤. STT 왕복
검증으로 실측: ~1.9배 빠른 생성(2.94s→1.55s), 품질 저하 없음(8은 문장이
깨져서 폐기). 텍스트 버튼/실시간 통화 양쪽에 공통 적용됨
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- homeclaw 라이브 서비스를 /home/kim/homeclaw에서 /srv/homeclaw(480G 전용 파티션)로
컷오버, 하드코딩된 절대경로 전부 치환 (config, mcp-servers, routes, scripts, web-ui)
- Android 에뮬레이터 컨테이너 리소스를 32스레드 Xeon 기준으로 상향(3g/3cpu → 6g/10cpu)
- 코드 에디터에 USB 실기기 패널 추가: 기기 감지, APK 설치, Logcat, scrcpy 화면 미러링
(companion.py에 독립 프로세스로 scrcpy 스폰하는 로직 포함)
- 관리자 컨텍스트 뷰어에 차단된 IP 목록 탭 추가
- ollama primary 모델을 gemma4:31b-cloud로, 음성 TTS를 edge_tts로 전환
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
OmniVoice가 "(" 문자(특히 한글에 바로 붙은 경우, 예: 영웅(Heroic))를 합성하다
멈춰버리는 문제가 있어 sanitizeForSpeech에서 괄호를 제거하도록 변경.
또한 TTS 엔진이 합성 실패 시 보내는 error 메시지를 클라이언트가 로그만 찍고
ttsBusy를 리셋하지 않아, 이후 통화 내내 TTS가 먹통이 되는 버그를 tts_end와
동일하게 큐를 복구하도록 수정.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- voice_engine.py: condition_on_previous_text=False로 whisper가 애매한
구간에서 그럴듯한 문장을 지어내는 환각 완화
- app.js/voice-call.js: 툴 사용 턴(웹검색 등)에서 finalAnswer가 partialContent를
통째로 덮어쓰면서 음성통화의 spokenUpTo 오프셋이 무효화돼 텍스트는 나오는데
음성이 안 나오는 버그 수정
- index.html/voice-call.js: 통화 중 GainNode 기반 인앱 볼륨 슬라이더 추가
(일부 모바일 브라우저에서 마이크 사용 중엔 하드웨어 볼륨 버튼이 통화
오디오에 반영 안 되는 문제 우회)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
XTTS는 한영 혼용 발음이 깨지고(Zoom→쭘 등) 짧은 문장에서 rambling이 발생했음.
Qwen3-TTS로 교체해봤으나 realtime factor 0.3x로 통화에 쓰기엔 너무 느려서 폐기.
최종적으로 OmniVoice(k2-fsa)로 교체 — realtime factor 1.8~2.8x로 XTTS보다도
빠르고 한영 혼용 발음도 자연스러움.
voice-call.js에는 navigator.wakeLock 추가 — 폰 화면이 꺼지면 브라우저가
백그라운드 탭을 스로틀링해서 통화가 끊기는 문제를 방지.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- voice_engine.py: faster-whisper(STT)+XTTS-v2(TTS)를 상시 로드해 로컬에서
서빙하는 WebSocket 엔진 (배치/스트리밍 프로토콜)
- routes-voice-realtime.ts: 브라우저 WS를 voice_engine.py로 그대로 프록시
- voice-call.js/worklets: 실시간 연속 대화 모드(VAD 기반 발화 감지,
barge-in), 마크다운/표/URL을 정리하고 읽는 sanitizeForSpeech 포함
- tts.ts/stt.ts: xtts_gpu/whisper_gpu provider 분기 추가
- ollama-client.ts/factory.ts: Ollama Cloud 세션 쿼터 초과 시
설정된 fallback 모델로 자동 재시도
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Docker(budtmo/docker-android) + noVNC로 코드 에디터 하단 패널에 실제
조작 가능한 Android 에뮬레이터 화면을 띄운다. 세션 생명주기(생성/유휴
타임아웃/정리)는 기존 Arduino QEMU 라우트 패턴을 따르고, noVNC 화면은
Stirling-PDF 프록시와 같은 방식으로 게이트웨이를 통해 리버스 프록시한다.
- src/gateway/routes-android.ts: Docker 세션 관리 + noVNC HTTP/WS 프록시
- web-ui/android-emulator.html: 부팅 폴링 + noVNC 임베드 페이지
- code.js/code.html: "🤖 Android" 버튼, 기존 에뮬레이터 패널 재사용
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- src/tools/kakao.ts: 기존 KakaoNotify를 kakao_send_message 도구로 노출, 코드에디터에서는 차단
- app.js/server-v2.ts: 메인챗 마지막 활성 세션을 서버에 기록해 새 기기에서 열 때 자동 이어보기
- code.html/code.js/styles.css: 서버 터미널 패널 전체화면 토글 (Esc로 종료)
- companion.py: .vbs 자동시작 시 cwd가 System32로 잡히는 문제 방지 위해 홈 디렉터리로 고정
- papa 워크스페이스: 우즈베크어 학습 진행상황, 서버 이름(지서버/클로서버) 메모 갱신
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- install_autostart.py를 진짜 설치기로 재작성: 최신 companion.py를 서버에서
직접 받아 %LOCALAPPDATA%\PythonCompanion에 설치(다운로드 폴더 정리돼도
안전), 재실행 시 최신 버전으로 갱신. 네트워크 실패 시 옆 폴더의
companion.py로 폴백
- claude-app/code 에디터의 companion 상태 옆에 companion.py(⬇)/
install_autostart.py(⚙) 다운로드 링크 추가
- /companion.py, /install_autostart.py를 인증 미들웨어에서 예외 처리 —
독립 실행되는 install_autostart.py는 로그인 세션 쿠키가 없어, 예외가
없으면 로그인 페이지 HTML을 companion.py인 척 받아버림
- 코드 에디터 ☁️서버 터미널 탭의 기본 작업 폴더를 ~/homeclaw로 고정
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- claude-app/code 에디터의 companion 상태 표시 옆에 companion.py 다운로드
링크(⬇) 추가 — 업데이트될 때마다 재다운로드해야 함을 쉽게 안내
- companion.py를 직접 실행하면 시작 배너 다음에 tkinter(폴더 선택창)/
pywinpty(Windows 터미널)/pystray+Pillow(트레이) 의존성 상태를 요약해서
보여주고, 없는 항목은 설치 명령까지 안내
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- claude-app에 Anthropic 백엔드 추가 (Ollama/LM Studio에 이어 3번째). Messages
API(system 필드, tool_use/tool_result 블록) 변환 로직 구현, 브라우저 직접
호출(anthropic-dangerous-direct-browser-access), API 키는 브라우저 로컬
저장만 하고 서버로는 전송하지 않음
- 코드 에디터 터미널 패널에도 클로드 앱과 동일한 하단 패널 높이 제한(전체
높이의 1/2~7/10) 적용, 공용 헬퍼(_bottomPanelHeightBounds)로 정리
- 터미널 배경색을 클로드 앱 Ubuntu 테마 색(#4B1D45)으로 통일
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Ollama/LM Studio 기반 터미널형 코딩 에이전트(claude-app.html/js): 테마 11종,
Plan/Confirm/Auto/Yolo 실행 모드, companion.py 연동
- companion.py에 browse_folder/fs_list/fs_read/fs_write 추가 — 네이티브 폴더
선택이 곧 Bash 작업 경로가 되도록 통합해 Write/Bash가 서로 다른 폴더를 보던
문제 해결
- code.html에 클로드 앱 하단 패널 추가, 우측 AI 채팅 패널은 그대로 유지되도록
그리드 레이아웃 조정, 패널 높이를 전체 높이의 50~70%로 제한
- iframe 관련 버그 수정: src="" 판정 오류로 패널이 로드되지 않던 문제,
드래그 리사이즈 중 마우스가 iframe 위를 지나면 릴리즈가 안 되던 문제
(미리보기/에뮬레이터 패널도 동일 수정)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
사진/텍스트 문서에서 날짜를 인식(EXIF, 비전 LLM, 텍스트 LLM)해 타임라인에
등록하는 기능 추가 — 폴더별 일괄 인식, 이름 변경 + 원본 백업, 증거 파일
삭제 연동까지 포함. 코드 리뷰로 발견된 XSS, 동시 저장 데이터 유실,
날짜 접두사 중복, GIF 미지원 등 다수 버그 수정도 포함.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- toDataURL 대신 requestAnimationFrame으로 소스 캔버스를 실시간 복사
- 화면 90% 이내에서 최대 정수 배율로 선명하게 확대 (imageSmoothingEnabled:false)
- 라이브 뷰이므로 애니메이션도 확대 창에서 실시간 반영
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- _csbFetchLibs(): 보드 선택 시 /api/arduino/libs?fqbn= 호출 후 캐시
- 초기 로드 및 보드 변경 시 자동 갱신
- lang: 선택 시 라이브러리 조회 생략
- boardBlock에 "설치된 라이브러리: ..." 추가 (~113 토큰)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 보드 드롭다운 상단에 Python / C++(일반) / 기타 언어 옵션 추가
- _boardSpecificHints 리팩터: 모든 하드웨어 보드에 Arduino C++ 기본 규칙 적용
- arch별 추가 규칙 (esp32/esp8266/stm32/avr) 유지
- STM32 힌트 "Python 절대 사용 금지" → "PC 앱 필요 시 병행 가능"으로 완화
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 보드 블록을 프롬프트 앞으로 이동, 로컬 폴더와 분리
- 에디터 열린 파일 목록을 별도 섹션으로 강조
- 로컬 폴더는 '파일 저장소'로만 표현 (프로젝트 탐색 대상 아님)
- AI가 Glob/list로 로컬 폴더를 탐색해 프로젝트 파악하는 행동 방지
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- _boardSpecificHints에 stm32 케이스 추가 (C++/Arduino 명시, Python 금지)
- boardBlock: hints 유무 관계없이 보드명+FQBN 항상 시스템 프롬프트에 포함
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- _RN_PNAME: digitalPinToPinName() 제거, PinName 직접 디코딩 (PB_3→PB3)
- _STM32_ARDUINO_PINS: variant_PILL_F103Cx 실제 순서로 교정
- Renode 서버 로그(console.error) 및 시리얼 모니터 INFO 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Blue Pill SVG: 핀 서클(r=3), 폰트 4px bold, 온보드 LED/PWR/RST 버튼 확대
- GPIO 텔레메트리: _RN_PNAME()+Serial.write(STX/ETX)로 digitalWrite() 후 핀 상태 전송
- PA0 등 아날로그 핀 번호(0xC0=192) → digitalPinToPinName()으로 런타임 복원
- PC13 toggle 시 핀 서클 + 온보드 LED 동시 업데이트 (active LOW)
- PA9(TX)/PA10(RX) 시리얼 신호 깜빡임
- 코드 에디터 AI에 선택된 보드 이름(boardContext) 전달
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- mobToggle 가드 640→1024: 음악·슬라이드·코드·날씨·언어·치과·ESP32·아두이노 앱
(CSS max-width:1024px인데 JS guard가 >640으로 남아 폴드 내부화면에서 토글 불가)
- #mob-tabbar z-index 400/490→600, 패널 bottom 0→52px, backdrop inset 0 0 52px 0
(backdrop이 탭바를 가려 열린 상태에서 다른 탭 전환 불가 문제 해결)
- 모든 innerWidth<=640 자동트리거 →<=1024 통일 (9개 앱)
- 탐정앱: 네트워크 분석 패널 (IP조회/Traceroute/Nmap/DNS/WHOIS/SSL/취약점/해시/웹스캔/배너/CVE)
- voice-utils.js 분리 — 서브앱 공통 음성입력+TTS 유틸
- app.js: 컨텍스트 토큰 게이지 (세션 목록에 tok/max 표시), usage 이벤트 처리
- routes-music.ts: Demucs 보컬분리 + YouTube 다운로드 잡 관리 (TTL 자동정리)
- server-v2.ts: 탐정 네트워크 API (traceroute/dns/whois/ssl/nmap/vuln/hash/webscan/cve)
- session.ts: resolveNumCtx export, /api/agent/session contextTokenEstimate 노출
- config.json: 카카오 채널 설정, ITS 교통 API 키 vault 참조
- styles.css: app-mic-btn / app-tts-btn 공통 스타일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- OAuth 로그인 시 카카오 userId 자동 조회 → 현재 계정 자동 매핑
- 채널 링크 나에게 보내기 버튼 (OAuth 완료 후 표시)
- 카카오 채널 설정: 링크·등록방법 안내, 기본 탭으로 변경
- 날씨앱: 지역 선택 드롭다운, 🚨 기상특보 버튼, 오버레이 한 줄 배치, 폰트 굵기 개선
- 모바일 브레이크포인트 1024px 통일 (갤럭시 폴드 대응)
- 교통앱 마지막 지역 localStorage 저장/복원
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 카카오톡 채널 챗봇 (오픈빌더 비동기 콜백 방식, 5초 제한 우회)
- 카카오 "나에게 보내기" OAuth 알림 (kakao-notify.ts)
- 채널 설정 UI + userMap으로 다중 사용자 계정 매핑
- 탐정앱: 탭(메모/체크리스트/타임라인), 우선순위, 검색, 보고서/고소장/접수안내 생성
- 모바일 브레이크포인트 640px → 1024px (갤럭시 폴드 대응)
- 프롬프트 파일 제한 상향 (USER.md 3000, SOUL.md/AGENTS.md 4000)
- 교통앱 마지막 선택 지역 localStorage 저장/복원
- docs/kakao-setup.md 작성
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- music-app: 마스터채널 추가 (볼륨 0–200%, FX 항상 표시), 효과 토글 패널 제거
- routes-music.ts: 한글 파일명 Content-Disposition 500 에러 수정 (Buffer.ascii → JS replace)
- 모바일 오버레이 패턴 (max-width:640px): mind/accountant/investor/lawyer/language/pptx-wizard/dental-agent
각 앱 사이드바·채팅 패널을 fixed 오버레이로, 바텀 탭바로 네비게이션
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
미디 에디터:
- 솔로/뮤트 실시간 반영: writeMidi 기반으로 buildSpessaMidi 재설계, 토글 시 sfReloadSong()으로 즉시 시퀀서 리로드
- MIDI 파서 CC 이벤트 보존: 기존에 모든 CC(볼륨·팬·expression·리버브 등) 버리던 것 수정, ccs[] 배열로 저장·재출력
- 멀티채널 트랙 분리: 포맷0 등 한 트랙에 채널 혼합 시 채널별로 자동 분리, 드럼 채널 보호
- 노트에 ch 필드 추가: 파서에서 각 노트에 실제 MIDI 채널 저장, writeMidi에서 활용
- 롤에디터 기본 8마디 보기, 마스터 FX 패널 추가
- 기타프로 마스터 볼륨 200%까지 확장
기타프로 MIDI 포트 매핑:
- sendMidiProgramChanges 순서 수정: PC→Bank 오류를 Bank→PC로 교정
- 세컨더리 채널(팜뮤트·하모닉스) 초기화 추가
- CC7 볼륨·CC10 팬 초기값 전송 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 스킬앱 HTML 내장화: accountant/lawyer/investor/weather/music/mind/dental-agent
각 앱이 SKILL_CONTENT를 HTML에 직접 내장 → .smallclaw/skills/ SKILL.md 파일 제거
- 새 게이트웨이 라우트: routes-dental, routes-music, routes-mcp, routes-voice
- skillContext 서버 지원: /api/chat에서 skill 컨텍스트를 callerCtx로 주입
- 세션 삭제 API: DELETE /api/admin/sessions/:username/:id
- Telegram defaultUsername: 어드민 계정 자동 추론
- Ollama /api/ollama/models에 vision 지원 여부 플래그 추가
- DB 워크플로 개선: workflow_images.py 대규모 리팩터링
- 아두이노 에뮬레이터 추가 개선 (arduino-emulator.html +400줄)
- 우즈베크어 학습 콘텐츠 및 MIDI 파일 추가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 우즈베크어 언어 교육 스킬(SKILL.md) 및 language-app.html 추가
- /api/language/* 백엔드 라우트 (레슨·플래시카드·퀴즈·TTS·진행도)
- 메인 페이지에 언어 앱 버튼 추가
- 서버 로그 레벨 필터(INFO/WARN/ERROR) — 선택 레벨만 표시, 빈 결과 안내
- 과거 세션 서버↔클라이언트 동기화 (/api/chat/sessions GET)
- 세션 삭제 시 서버 파일도 함께 삭제 (DELETE /api/chat/sessions/:id)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- USB CDC 경로 복원: #define Serial Serial1 우회 제거
- rp2040js/avr8js/codemirror/xterm/monaco-editor vendor화
- /vendor 정적 라우팅 추가 (Express 5 catch-all 우회)
- 부팅 완료 타임아웃 감지 (Serial 출력 없어도 8초 후 RAF 전환)
- 리셋 시 Simulator 재생성으로 주변 장치 상태 초기화
- 시리얼 패널의 내부 메시지를 console.log로 이동
- RP2040(Pico) 보드 감지·컴파일·에뮬레이션 지원 추가
- Serial → Serial1(UART0) 자동 리다이렉트 (#define 삽입)
- .uf2 파일 우선 추출, bootrom 자동 다운로드·캐싱
- ELF .text 추출: arm-none-eabi-objcopy 대신 Node.js 내장 파서
- HTTP 302 리다이렉트 자동 팔로우 (_httpsGetFollow)
- rp2040js 에뮬레이터: fast-path 초기화 루프, 피코 SVG 보드, GPIO25 LED
- 예외 처리: HardFault(#3)만 중지, 나머지 IRQ/SysTick 정상 통과
- UART onByte: TextDecoder stream 모드로 한글 UTF-8 정상 출력
- heartbeat 메시지 제거
- WiFi scan mock: WSCN 프로토콜로 C++ ↔ 브라우저 동기화, UI 편집 지원
- 에뮬레이터 팝업 → 코드 에디터 인라인 iframe 패널로 전환
- CDN 의존성 → /vendor/ 로컬 서빙 (xterm, Monaco)
- SSE 세션 idle timer (창 닫힘 후 5분 자동 종료)
- 업로드: 속도 자동 재시도(921600→460800→230400) + FlashMode fallback
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
컴파일 에러에서 'fatal error: Foo.h: No such file or directory' 파싱 →
arduino-cli lib search로 최적 라이브러리 찾기 → 자동 설치 → 재컴파일.
성공 시 autoInstalled[] 포함하여 반환, 클라이언트는 "📦 자동 설치" 시스템 메시지 표시.
에러 지속 시 sendCompileErrorToAI()로 AI 채팅에 전달.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
오류 발생 시 codeAiAppend(system) 대신 sendCompileErrorToAI()로
에러 메시지 + 코드 컨텍스트를 AI 입력창에 넣고 즉시 전송.
arduino / esp32 / 에뮬레이터 버튼 세 경로 모두 적용.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
aspect-ratio:2/1 미지원 브라우저에서 캔버스가 64px 자연 높이로
렌더링되어 가로로만 늘어나 '줄만 몇 개'로 보이는 버그 수정.
- canvas 128×64 → 256×128 (물리 픽셀 2배)
- JS 렌더러: 논리 픽셀 1개 → 2×2 물리 픽셀로 직접 기록
- CSS: image-rendering:pixelated + aspect-ratio 제거
→ max-width:100%; height:auto 로 브라우저 자연 스케일링
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 캔버스 width:256px → width:100%; aspect-ratio:2/1
(보드 패널 280px 기준 오버플로우·클리핑 해소)
- OLED 섹션 항상 표시, 연결 전 플레이스홀더:
"OLED 연결 대기 / 0x3C / 0x3D" + 점선 격자
- 파란 점(dot) 인디케이터: 연결 전=꺼짐, displayOn=켜짐
- display.display() 수신 시 플레이스홀더 숨김·캔버스 표시
- display off(0xAE) 시 플레이스홀더 복원
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- AVRTWI connectToSlave에서 LCD(0x27/0x3F)와 OLED(0x3C/0x3D) 동시 지원
- SSD1306 프로토콜 파서:
- control byte (0x00=cmd stream, 0x40=data stream)
- 주요 명령: addressing mode, set col/page addr, display on/off,
inverse, page/col low/high nibble, 2바이트 명령 처리
- horizontal/vertical/page 어드레싱 모드 모두 지원
- GDDRAM(128×8 pages) 유지 → canvas 128×64 px 렌더링
(픽셀 2× 스케일, 청백색 톤)
- displayOn 명령 수신 시 OLED 패널 자동 표시
- runFrame마다 dirty 플래그로 효율적 canvas flush
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- web-ui/arduino-emulator.html: avr8js 기반 ATmega328P 에뮬레이터
(핀 상태 패널, 보드 LED, 시리얼 모니터, 속도 조절)
- cpu.tick() 누락 수정: delay()/millis()/Serial 동작 안 하던 버그
- 시리얼 라인 추적(serialLineSpan): D13 sys 메시지 끼어들 때 줄 깨짐 수정
- web-ui/esp32-flasher.html: Web Serial로 merged.bin 플래시
- POST /api/arduino/compile: arduino-cli로 uno/nano hex, esp32 merged.bin 컴파일
- POST /api/code/round: 클라이언트 주도 코드 에디터용 1라운드 SSE 엔드포인트
- code.js: 실행 모드에 Arduino 에뮬레이터 / ESP32 플래시 추가
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 🧠 Karpathy 코딩 가이드라인 토글 버튼 추가 (시스템 프롬프트 주입)
- 모델 셀렉터를 AI 패널 헤더 내부로 이동 (채팅창 너비 연동)
- CSS Grid 레이아웃으로 전환: AI 패널이 파일 탭 상단까지 연장
- 오른쪽 공백 수정: auto 컬럼 → CSS 변수(--ai-panel-w) 제어
- 입력창 소실 수정: #code-ai-panel에 overflow:hidden 추가
- 터미널 불작동 수정: .code-bottom-panels overflow:hidden 제거
- body padding/gap 초기화로 전체 여백 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- requestAnimationFrame → setTimeout(60ms): 패널 레이아웃 계산 후 xterm 초기화
- ptyReady 스냅샷 버그 수정: codeTermShells 대신 xtermInstances 참조
- 터미널 열릴 때 cls/clear 자동 실행 (Windows: cls, Linux: clear)
- companionPlatform 타이밍 버그 수정: clearCmd를 shell_ready 수신 후 평가
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add alternating block background colors (ff-block-even/odd) for functions/classes
- Add ¶빈줄숨김 / ▓블록색상 toggle buttons to file panel sidebar (below file tree)
- Fix terminal error send: filter Windows prompt+command lines, only send last Traceback block, strip pygame header noise
- Show live server log bubble during AI tool calls, fade out on completion
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Per-file streaming: text shows while AI works, collapses on tool call, ✅완료 at end
- Options UI: numbered choice buttons with number/keyword input selection
- Number input in chat (1~6) selects corresponding option chip
- Terminal error 🤖 button permanently visible in header bar
- Model card moved to tabs bar top-right, synced with panel width
- Removed 코드 저장 디렉토리 from settings; merged save/folder into sidebar
- Removed language selector from chat header
- Bottom cards anchored to sidebar bottom
- Simplified planInstruction prompt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Move code editor to standalone page; remove from main index/app mode switcher
- Add diff-active tab highlight and diff bar CSS to styles
- Add markdown table styles for chat messages
- PubMed: try NCBI FTP link before Unpaywall for PDF download
- Login: also persist token to localStorage for cross-tab auth
- Update skills state and config
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
/api/show가 cloud 모델의 PARAMETER num_ctx를 반환 안 하는 문제 해결.
매니페스트 → params 레이어 블롭 직접 파싱해서 num_ctx 우선 사용.
kimi-k2.6:cloud 1M으로 Modelfile 수정 후 정확히 표시됨.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
chat, generate, chatStream 모두 /api/show에서 읽은 context_length를
num_ctx 기본값으로 사용. 결과는 모델별로 캐시됨.
엔드포인트 변경 시 캐시 자동 무효화.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GET /api/model-context?model=<name> 엔드포인트 추가.
Claude → 200k 고정, Ollama → /api/show 쿼리 후 model_info 또는
num_ctx 파라미터에서 실제 컨텍스트 크기 추출.
클라이언트: 모델 변경 및 초기 부팅 시 자동 fetch.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
세션 바에 현재 컨텍스트 토큰 추정치 / 모델 최대값 표시.
글자 수 ÷ 4 로 토큰 추정, 50% 이하 초록 / 50~80% 노랑 / 80%+ 빨강 색상 진행 바.
메시지 전송·응답 완료 시 즉시 업데이트.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 오케스트레이터 auto-trigger 경로에 !isCodeAiSession/!isProjSession 누락 수정
(code_ai_ 세션에서 tool failure 쌓이면 memory_read 등 엉뚱한 도구 호출로 멈추던 문제)
- 로컬 셸 시작/프로젝트 전환 시 프로젝트 폴더로 자동 cd
- companion.py: shell_ready에 platform/home 정보 포함
- Windows/Unix 경로 처리: cd /d "경로" vs cd "경로"
- localTermPath 미설정 시 companionHome fallback, 둘 다 없으면 cd 안 함
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
터미널 패널이 닫힌 상태에서 로컬 셸을 열면 레이아웃 계산 전에
fitAddon.fit()이 실행돼 rows=0/cols=0으로 companion에 전달됨.
300ms 타임아웃 안에서 fit을 재실행하고 최솟값(24x80) 보장.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 로컬 모드 shell 차단: error:true로 변경, 시스템 프롬프트에 명시적 금지 문구 추가
- 로컬 모드 파일 자동 저장: 새 파일 생성 시 승인 팝업 없이 즉시 디스크 저장 + "💾 저장" 알림
- 계획 단계 프롬프트 강화: 파일별 주요 함수/로직/데이터흐름/주의사항 포함
- 프로젝트 마법사 디폴트화: 새 세션 생성 시 자동으로 계획 단계 진입
- _isNewProjectIntent / _isSingleFileIntent 제거: 수동 프로젝트 생성으로 대체
- 채팅 히스토리 버그 수정: codeAiClear에서 history 지우기 전 saveProjectSession 호출
- 초기 로드 버그 수정: restoreLocalDirHandle에서 채팅 패널 렌더링 누락 수정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 코드 에디터 저장: 서버 API → File System Access API로 전환
- codeSaveFileById에 저장 성공/실패/폴더미선택 피드백 메시지 추가
- 프로젝트 생성 형식: project-files JSON → @@FILE/@@ENDFILE 델리미터로 변경
- JSON 이스케이프 오류(Unterminated string) 근본 해결
- 계획 단계 시스템 프롬프트 강화: JSON 출력 절대 금지 명시
- 프로젝트 생성 세션 ID: 계획 세션 재사용 (서버가 history 파라미터 무시하므로)
- _projFileCreated async화: 파일 쓰기 완료 후 사이드바 리프레시
- 헤더/드롭다운 폴더명 표시 동적 업데이트 (workspace/code/ 하드코딩 제거)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PDF: skip references/bibliography section from text extraction
- PDF: add minimal system prompt for translate sessions (translation-only, no tool calls)
- Wizard: image download button per card + bulk download all
- Wizard: translation modal download button (saves as _ko.txt / _en.txt)
- Wizard: save papers.json immediately on upload, after text extraction, and before outline step
- Wizard: short image directory names (22 chars + timestamp suffix)
- Wizard: project-images scans workspace root dir alongside pptx/ folder
- Server: pptx/list scans only pptx/ folder (workspace root scanning removed after file migration)
- create_presentation: save output to workspace/pptx/{slug}/ instead of workspace root
- edit_presentation: fuzzy path search includes pptx/ subfolder
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Server:
- download-pdf-stream: check if PDF already exists (size > 1KB) → return
cached path immediately, skip all network requests
Client (startPrep):
- save pdfPaths from prepLog before reset → skip PMC download if path known
- skip text extraction if paperTexts[key] already loaded in memory
- text from project open (onOpenProjChange) now survives "다시 실행"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Image extraction now immediately followed by per-figure mistral analysis
no manual button click needed: extract → analyze runs as one atomic flow
- Progress shows "이미지 분석 1/5..." inline with prep step
- Captions + 제외 filtering available before outline generation
- "🔍 재분석" button retained for manual uploads / re-run on failures
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
gpt-oss:120b-cloud refuses even short medical texts with "텍스트가 너무 길어...".
Add model:'mistral-large-3:675b-cloud' explicitly to three wizard /api/chat calls:
- translateAbstract() — abstract Korean translation
- chatStream() — PDF text chunk translation (used by translatePdfText)
- generateOutline() — slide outline generation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- pptx-wizard: add "🔍 이미지 분석" button in Step 2 image panel
* calls /api/pptx/analyze-image per figure via mistral vision
* shows per-image progress (1/10, 2/10...)
* "제외" caption → dimmed card + filtered from outline prompt
* captions shown below each thumbnail in the grid
- server: POST /api/pptx/analyze-image endpoint
* resolves /api/files/ path to workspace file, thumbnails if >300KB
* calls orchestration.secondary vision model (mistral-large-3:675b-cloud)
* caches results in project/.image-captions.json (skips on re-analysis)
- pptx-wizard: generateOutline() includes captions in imgList
* "제외" images filtered out before sending to LLM
* format: "/api/files/... (figure_p2_1) — 카플란-마이어 생존곡선 3그룹"
- skills-manager: fix getModelOverrideForUser() trigger filtering
* was returning skill model for ALL messages regardless of trigger keywords
* now only overrides when message matches skill triggers (same logic as buildPromptContext)
* presenter model (mistral) now only applies for 발표/pptx/슬라이드 keywords
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- config: primary model → gpt-oss:120b-cloud (faster general chat, 2.72s median)
- server-v2: fix vision regex to exclude gpt-oss (gpt(?!-oss) negative lookahead)
* gpt-oss was incorrectly matching /gpt/ → image data sent to non-vision model
* applied at all 3 _supportsVision check sites (lines 5204, 6362, 7832)
- server-v2: vision fallback routing — when primary lacks vision support and user
message contains images, automatically route to orchestration.secondary
(mistral-large-3:675b-cloud, 4.27s avg, fastest vision cloud model)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- skills-manager: conditional skill injection via triggers frontmatter field
(skills only sent to model when message matches trigger keywords)
- skills: added triggers to all skill SKILL.md files; cleaned up headers/disclaimers
- anthropic-adapter: toAnthropicContent() converts OpenAI image_url → Anthropic image blocks
- multi-agent: vision flag in SecondaryProfile; secondarySupportsVision() checks config
- config: secondary set to mistral-large-3:675b-cloud with vision:true
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The 💻 코드 sidebar tab now opens a dedicated code.html page in a new tab,
mirroring how the slide wizard opens pptx-wizard.html.
- Add web-ui/code.html: standalone code editor page reusing styles.css and
the same CodeMirror/xterm/Monaco head as the main app.
- Add web-ui/code.js: self-contained code-view logic — inlined shared helpers
(api/authHeaders/escHtml/getCookie) + the extracted code-editor block +
a bootstrap that inits Monaco and loads models/dir. It mirrors the code
block in app.js (kept duplicated so the main app stays untouched).
- index.html: tab-code now window.open('/code.html'). The in-page code mode
(top mode button) is unchanged, so chat→editor live streaming still works.
Verified with Playwright: Monaco initializes, editor/sidebar/toolbar/Coder AI
render, no JS errors.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The slide editor draws a title slide's image as a full-bleed darkened
background, but pptx_gen.py's make_title_slide ignored image_path entirely
and only drew the skin background — so photo backgrounds showed in the
editor but vanished from the generated PPTX / preview.
- make_title_slide now renders image_path full-bleed (cover) with a dark
overlay and white title/subtitle, matching the editor preview.
- Add set_shape_fill_opacity() that injects OOXML <a:alpha>, since
python-pptx's fill.transparency is a silent no-op (the overlay was
rendering as fully opaque black). Apply it to the fullscreen bottom bar too.
- Pass project_dir/workspace_path/warnings into make_title_slide.
- Bump version to 2.8.2.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>