Commit Graph
540 Commits
Author SHA1 Message Date
kim 636a06f17d v4.1.14: 언어앱 독일어 지원 추가 (언어 파라미터화)
우즈베크어 전용으로 하드코딩돼 있던 language-app을 lang 파라미터 기반으로
리팩터링하고 독일어 어휘 56개·레슨 8개를 추가. 진도/커스텀 카테고리도
언어별로 분리 저장(기존 우즈베크어 데이터는 자동 마이그레이션).

덤으로 퀴즈 시작 시 id 불일치로 showQuizQuestion()이 매번 죽던 버그도 수정.
2026-07-16 16:18:04 +09:00
kim f6f7f14541 v4.1.13: 언어앱 타일뷰 기본화 + 카테고리 추가 + 선생님 Q&A 패널
기본 보기를 타일 그리드로 전환하고 사용자가 카테고리를 직접 추가할 수 있게 함.
문법/단어/문화 질문에 답하는 "선생님" 채팅 패널 신설(/api/language/ask-teacher).
선생님 답변의 마크다운(표·볼드·목록·인용)이 그대로 노출되던 버그를 자체 렌더러로 수정.
2026-07-16 15:30:48 +09:00
kimandClaude Sonnet 5 edd7816048 v4.1.12: 보안 취약점 수정 — RCE, 경로탈출 2건, IDOR, XSS(스튜디오/언어 앱)
- [CRITICAL] image_edit/imagegen 도구의 숫자 파라미터(x,y,width,height,degrees,opacity,quality,seed,guidance_scale,num_frames,fps)가 검증 없이 Python 소스에 직접 문자열 삽입되어 원격 코드 실행 가능했음. toFiniteNumber()로 전 지점 강제 숫자 변환 — 실제 페이로드로 라이브 검증 완료
- [HIGH] imageStyleTransformTool과 /api/imagegen/save-result에 경로 탈출 방어(isPathInsideDir) 누락 — 다른 사용자 워크스페이스/임의 파일 접근 가능했음. 둘 다 수정 후 실제 ../ 페이로드로 차단 확인
- [HIGH] 언어 앱 진행상황 저장 API가 URL의 :userId를 그대로 신뢰해 다른 사용자 진행상황을 읽고 덮어쓸 수 있었음(IDOR). 세션 기반으로 수정, 실제 다른 사용자명으로 테스트해 본인 워크스페이스에만 저장됨을 확인
- [MEDIUM] 언어 앱 플래시카드·단어장 렌더링(LLM 생성 콘텐츠)이 이스케이프 없이 innerHTML에 삽입되던 XSS 경로 수정(escHtml 추가)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-16 15:04:20 +09:00
kimandClaude Sonnet 5 5b089ac297 v4.1.11: 뉴스 전용 도구 신설(NewsData.io) + 검색 루프/설정 버그 수정
- news_search 도구 신설(NewsData.io /latest API) — 과거 48시간 실시간 뉴스, 국가/언어/카테고리 필터, 실제 pubDate·출처 포함. 뉴스 요청엔 web_search보다 우선 사용하도록 시스템프롬프트·강제재시도 넛지 전부 갱신 — 위키피디아 연도페이지·날짜 오라벨링 문제가 구조적으로 해결됨
- 검색예산(5회) 차단 후에도 모델이 무시하고 계속 재시도하는 문제 수정 — "오늘 남미 주요 뉴스" 요청에서 실제 검색 6회 후 42라운드가 전부 헛되이 낭비된 사례 확인(TOOL[48]까지 감). 두 번째 차단부터는 해당 턴 나머지 동안 모델에게 tools를 빈 배열로 보내 물리적으로 더 이상 호출 못 하게 함
- OpenWeather 도시명 모호성 버그 수정 — "Rome, Italy"가 미국 조지아주 Rome으로 잘못 resolve되던 문제. 국가명→ISO코드 자동 정규화(40여개국) + 국가 불일치 시 에러로 재시도 유도
- SearXNG general 카테고리에 뉴스 아닌 위키피디아 엔진이 섞여있던 문제 수정 — 뉴스 쿼리는 categories=news로 daum_news/yahoo_news 등 뉴스 전용 엔진만 사용하도록 변경(사후 필터링 아닌 근본 차단)
- 설정 화면에서 모델 전환 시 models.fallback/profiles가 매번 사라지던 버그 수정 — /api/settings/model 저장 로직이 models 객체를 통째로 새로 만들어서 덮어쓰던 것을, 기존 값을 먼저 펼친 뒤 필요한 필드만 덮어쓰도록 변경
- news.newsdata_api_key를 SECRET_FIELD_MAP에 추가해 vault 자동 암호화 대상에 포함(평문 미저장)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-16 14:25:14 +09:00
kimandClaude Sonnet 5 a5fb92d477 v4.1.10: 웹검색/도구호출 신뢰성 대개선 — 모델별 프로필 시스템 도입
- AUTO-RECOVER 구조적 허점 수정: "라운드 0 & 도구 0회 호출"일 때만 발동하던 걸 "이 요청에 필요한 도구가 아직 안 불렸으면" 언제든 발동하도록 변경 — 엉뚱한 도구 하나만 불러도 안전장치가 통째로 무장해제되던 버그 수정
- 뉴스/날씨/스펙·가격·비교 등 팩트성 질문에 도구 호출 강제(isLiveDataRequest/isFactualInfoRequest) — 확신에 차서 지어내는 것(mistral-large-3에서 다발, 없는 "2026 파리 올림픽" 등)을 사전 넛지+사후 강제재시도로 이중 차단
- web_search/web_fetch 턴당 5회 하드캡 추가 — kimi-k2.6이 단순 뉴스요청에 최대 50회까지 검색하던 문제 차단
- 모델이 함수 호출 대신 텍스트로 tool call을 흉내내는 케이스(`web_search{...}`, 반복시 토큰 열화로 `웍웍웍_search`, 가비지 토큰 삽입 `web_search Räikk{...}`) 복구 로직을 브레이스 앞 텍스트에서 실제 도구명을 찾는 방식으로 일반화
- 뉴스 검색: 대화 이력 주제로 새는 것 방지, 국제뉴스는 영어 쿼리 사용, 위키/홈페이지뿐인 저품질 결과는 다음 provider(tavily 등)로 폴백, 기사 실제 게재일 라벨링(오늘 날짜로 잘못 표기 금지)
- email_send/kakao_send_message 실제 호출 없이 "보냈습니다"라고 답하면 강제 재시도
- browser_open: image_edit와 동일하게 명시 요청 없으면 코드 레벨 차단(기존엔 프롬프트 텍스트뿐)
- config.json models.profiles로 모델별 시스템프롬프트 추가지침 주입 가능(코드 재배포 없이 모델별 이상행동 교정)
- ollama-client 모델 fallback 재시도를 quota 초과 외 retired/deprecated 에러까지 확장, models.fallback 값 유지
- 각종 인텐트 판별 함수(브라우저/데스크톱/실행형 요청, 백그라운드 작업 재개/취소/상태질문)에 한국어 키워드 커버리지 추가
- shell 툴 스키마 예시와 PACKAGE INSTALL 프롬프트 규칙의 모순(pip install 예시 vs 금지 규칙) 제거

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-16 12:58:57 +09:00
kimandClaude Sonnet 5 2228aedbf7 v4.1.9: 스튜디오 이미지 편집·저장 플로우 + 음성엔진 정리 + GPU 게이지 분리
- 스튜디오 앱: 사진 편집(스타일 변환/이모티콘 세트) + 결과 뷰어 내 크롭/회전/필터/보정/텍스트 오버레이 편집 툴바 + 저장 플로우(중간 편집은 갤러리에 안 남기고 최종본만 저장+업로드 목록에 재사용 등록)
- image_style_transform: SDXL img2img + IP-Adapter-FaceID로 cartoon 스타일 추가 (watercolor/sketch는 identity drift로 재검토 후 제외)
- 음성엔진 provider 값 xtts_gpu → omnivoice_gpu로 리네이밍 (실제 로딩 모델과 이름 일치, XTTS는 이미 OmniVoice로 교체된 지 오래)
- 메인창 사이드바 GPU 게이지를 GPU0/GPU1로 분리 표시
- 단종된 gemini-3-flash-preview를 기본 모델값에서 전부 제거, kimi-k2.6:cloud로 교체
- vault 백업을 cron→systemd timer(Persistent=true)로 전환, /DATA 전체 동기화 스크립트 추가

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 18:16:20 +09:00
kimandClaude Sonnet 5 88bad1e7d9 v4.1.8: 이미지/동영상 생성 스튜디오 앱 + SDXL/FLUX 품질 개선
- 이미지·동영상 생성 전용 앱(studio-app.html) + API 라우트 추가, 갤러리 기능 포함
- SD1.5 → SDXL 교체 (프롬프트 반영력/해상도 개선), 한글 프롬프트 자동 영어 번역 추가
- image_generate에 quality="high" 옵션 추가 (FLUX.1-schnell 4비트 양자화, 게이트 없는 커뮤니티 미러 사용)
- video_generate에 guidance_scale 노출, 기본 steps 상향
- 생성기 서브프로세스가 결과 없이 죽는 경우의 크래시 방지 + 에러 로깅 강화
- 멀티 GPU 환경에서 시스템 통계 GPU 미터가 깨지던 nvidia-smi 파싱 버그 수정

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 02:38:58 +09:00
kim 2427aeeaba v4.1.7: SD1.5/LTX-Video 로컬 이미지·동영상 생성 툴 추가
image_generate(SD1.5), video_generate(LTX-Video)를 전용 venv+GPU1에서
구동하는 채팅 툴로 추가. image_edit과 구분되도록 시스템 프롬프트에
사용 규칙 명시.
2026-07-14 20:42:42 +09:00
kimandClaude Sonnet 5 2f690fd999 v4.1.6: SMILES 구조식 위젯 교과서식 개편 + 화학표기 규칙 추가 + 코드블록 렌더링 버그 수정
- SMILES 위젯을 버튼 클릭식 큰 위젯 → 자동렌더링 소형 인라인(교과서식)으로 전면 개편
- 링크/이미지/볼드 등 후속 정규식이 SMILES 입체화학 표기([C@@H](C) 등)를 마크다운 링크로
  오인해 구조식이 깨지던 버그 수정 (코드블록 결과물을 플레이스홀더로 보호 후 최종 복원)
- 구조 복잡도(중원자 수)에 따라 SMILES 캔버스 크기 동적 조절 (벤젠은 작게, 콜레스테롤 등은 크게)
- SMILES 위젯 테두리/배경/여백 제거로 더 가벼운 인라인 표시
- 코드블록(.md-code-block) 검은 배경 제거 + 고정폭 폰트 누락으로 ASCII 다이어그램이
  틀어지던 버그 수정 (font-family 미지정 → 본문 가변폭 폰트 상속이 원인)
- code.trim()이 전체 문자열 기준으로만 동작해 ASCII 아트 첫 줄의 들여쓰기만 사라지던
  버그 수정 (줄 단위가 아닌 blank 줄만 제거하도록 변경)
- 시스템 프롬프트에 CHEMISTRY NOTATION 규칙 추가 (ASCII 아트 금지, LaTeX/mhchem·SMILES 사용 유도)
- Ollama Cloud 일시적 오류(5xx/타임아웃) 발생 시 즉시 실패 대신 백오프 재시도 추가
- weather_map_screenshot 툴을 ToolRegistry에도 등록 (buildImageMarkdown export 추가)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 15:18:23 +09:00
kimandClaude Sonnet 5 c8b4e251bf v4.1.5: KaTeX 수식·화학식 렌더링 + SMILES 2D 구조식(결합선) 추가 + 코드블록 이스케이핑 버그 수정
- 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>
2026-07-14 12:35:33 +09:00
kimandClaude Sonnet 5 4526de2914 v4.1.4: 메인챗 무한 스피너 버그 수정 + SSE 스톨 자동복구
- 진짜 원인: 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>
2026-07-14 11:31:52 +09:00
kimandClaude Sonnet 5 30db2a0a48 v4.1.3: 투자앱 시작화면 XLK 차트 자동표시 + 언어앱 타일뷰 발음 버튼 추가
- 투자앱 시작 시 빈 차트 대신 XLK(기술주 섹터 ETF) TradingView 차트를 바로 띄우도록 변경
- 언어앱 플래시카드 타일 그리드 뷰에 🔊 발음 듣기 버튼 추가 (기존엔 로마자 발음
  표시만 있고 TTS 버튼이 빠져있었음) — 단일 카드 뷰와 동일하게 카드 중앙 하단에 배치,
  클릭 시 카드가 뒤집히지 않도록 stopPropagation 처리

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 10:38:19 +09:00
kimandClaude Sonnet 5 1f112fd227 v4.1.2: 기상도(Windy) 캡처 화질 개선 + 지도 읽는 법·좌표·태풍 트리거 추가
- 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>
2026-07-13 22:47:43 +09:00
kimandClaude Sonnet 5 c1d72a2a2d v4.1.1: weather_map_screenshot 연결 + 언어앱 카드생성 버그 수정 + 상담앱 심리검사 5종 추가
- 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>
2026-07-13 21:46:18 +09:00
kimandClaude Sonnet 5 b969c672b0 v4.1.0: 메인챗 툴/시스템프롬프트 오버헤드 66% 감소 + 실시간 컨텍스트 게이지
- 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>
2026-07-13 01:09:27 +09:00
kimandClaude a11e554e88 feat: web_search·ollama_web_search 폴백 체인 통일 + ollama_web_search 설명 정정
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>
2026-07-12 15:19:38 +09:00
kimandClaude Sonnet 5 20f0db935a fix: web_search 폴백 체인이 빈 결과를 성공으로 오판하던 버그 수정
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>
2026-07-12 00:27:56 +09:00
kimandClaude Sonnet 5 e356573228 feat: 웹검색에 Ollama Cloud API 폴백 추가 + ollama_web_search 이중화
- 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>
2026-07-12 00:08:20 +09:00
kimandClaude Sonnet 5 cec930c69c fix: 음성통화 STT 잡음/겹침 목소리 환각 완화
no_speech_prob가 높은 세그먼트를 텍스트 조합에서 제외하고
hallucination_silence_threshold를 걸어, 배경 소음이나 다른 사람
목소리가 섞였을 때 엉뚱한 텍스트가 연속으로 나오는 문제를 완화.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-11 02:04:20 +09:00
kimandClaude Sonnet 5 64f7e5ec3b fix: TTS 발음/타이밍 대규모 개선 (숫자, 단위, 방위, 줄바꿈 pause)
- 숫자를 완전한 한글 표기로 변환 (사이노-한국어 기본, 시각은 순우리말)
- °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>
2026-07-10 16:39:46 +09:00
kimandClaude Sonnet 5 adfa136597 fix: TTS 중첩클릭 에코 버그 + 음성엔진 한/영 발음 개선 + 생성속도 2배
- 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>
2026-07-10 14:42:44 +09:00
kimandClaude Sonnet 5 f014fec7e2 v4.0.0: 라이브 서비스 /srv/homeclaw로 이전 + Android 실기기 USB 연동 + 관리자 IP 차단 뷰어
- 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>
2026-07-10 13:31:28 +09:00
kimandClaude Sonnet 5 34fac14b20 fix: 음성통화 TTS 괄호 문자 처리 + error 응답 시 큐 멈춤 버그 수정
OmniVoice가 "(" 문자(특히 한글에 바로 붙은 경우, 예: 영웅(Heroic))를 합성하다
멈춰버리는 문제가 있어 sanitizeForSpeech에서 괄호를 제거하도록 변경.
또한 TTS 엔진이 합성 실패 시 보내는 error 메시지를 클라이언트가 로그만 찍고
ttsBusy를 리셋하지 않아, 이후 통화 내내 TTS가 먹통이 되는 버그를 tts_end와
동일하게 큐를 복구하도록 수정.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 00:42:16 +09:00
kimandClaude Sonnet 5 b8bfb501b9 fix: 음성통화 STT 환각 완화 + 툴콜 턴 TTS 누락 수정 + 볼륨 슬라이더
- 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>
2026-07-09 23:58:25 +09:00
kimandClaude Sonnet 5 73967d1f55 v3.5.0: 실시간 음성통화 TTS 엔진을 OmniVoice로 교체 + Wake Lock 추가
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>
2026-07-09 23:14:38 +09:00
kimandClaude Sonnet 5 22c692fec3 feat: 실시간 음성대화 GPU 엔진(whisper+XTTS) + Ollama 쿼터 자동 폴백
- 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>
2026-07-09 18:05:55 +09:00
kimandClaude Sonnet 5 94caf1c4da v3.4.0: 서버사이드 Android 에뮬레이터 (코드 에디터 내장)
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>
2026-07-08 00:41:54 +09:00
kimandClaude Sonnet 5 186dc4cb23 feat: kakao_send_message 에이전트 도구화 + 멀티기기 메인챗 세션 동기화 + 터미널 전체화면
- 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>
2026-07-05 14:41:57 +09:00
kim ce1a99b723 fix: 투자앱 차트 링크 onclick/텍스트 이스케이프 처리 (XSS 방지) 2026-07-05 13:11:08 +09:00
kimandClaude Sonnet 5 2f965f7493 feat: companion.py 원클릭 설치기 + 다운로드 링크 공개 라우트, 서버 터미널 경로 고정
- 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>
2026-07-04 00:38:42 +09:00
kimandClaude Sonnet 5 9f683bd637 feat: companion.py 다운로드 링크 + 시작 시 의존성 점검
- claude-app/code 에디터의 companion 상태 표시 옆에 companion.py 다운로드
  링크(⬇) 추가 — 업데이트될 때마다 재다운로드해야 함을 쉽게 안내
- companion.py를 직접 실행하면 시작 배너 다음에 tkinter(폴더 선택창)/
  pywinpty(Windows 터미널)/pystray+Pillow(트레이) 의존성 상태를 요약해서
  보여주고, 없는 항목은 설치 명령까지 안내

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-04 00:27:37 +09:00
kimandClaude Sonnet 5 830ae12bac feat: claude-app Anthropic 백엔드 추가 + 코드 에디터 하단 패널 리사이즈/테마 통일
- 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>
2026-07-04 00:18:10 +09:00
kim 504830693e v3.3.0: 메인챗에서 클로드 앱 버튼 제거 (코드 에디터 내장 패널로 대체) 2026-07-03 23:42:45 +09:00
kimandClaude Sonnet 5 5fdf99fb73 feat: claude-app 로컬 LLM 코딩 에이전트 추가 + 코드 에디터 임베드
- 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>
2026-07-03 23:41:07 +09:00
kimandClaude Sonnet 5 d953f69de4 chore: package.json 버전 3.2.2로 동기화
커밋 메시지 태그(v3.2.2)와 실제 package.json 버전(2.10.0)이 그동안
어긋나 있던 것을 맞춤.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-03 00:15:47 +09:00
kimandClaude Sonnet 5 137351e0d8 feat: 탐정앱 증거자료 날짜 인식 + 타임라인 자동 등록 기능
사진/텍스트 문서에서 날짜를 인식(EXIF, 비전 LLM, 텍스트 LLM)해 타임라인에
등록하는 기능 추가 — 폴더별 일괄 인식, 이름 변경 + 원본 백업, 증거 파일
삭제 연동까지 포함. 코드 리뷰로 발견된 XSS, 동시 저장 데이터 유실,
날짜 접두사 중복, GIF 미지원 등 다수 버그 수정도 포함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-03 00:07:20 +09:00
kimandClaude Sonnet 4.6 28b230f1b8 fix: SSD1306 mock — class Print 중복 제거, HEX 매크로 충돌 수정
- class Print 블록 제거 (Arduino.h가 이미 제공)
- HEX[] → _SSD_HEX[] (#define HEX 16 매크로 충돌 회피)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 20:56:17 +09:00
kimandClaude Sonnet 4.6 26f928a873 feat: STM32 Renode SSD1306 OLED 지원
- mocks-stm32.ts: _RN_SSD1306_MOCK_H 추가
  - 5×7 소프트웨어 폰트 포함 (96 ASCII)
  - 내부 framebuffer + display() → L:oD: 텔레메트리
  - Wire stub, GFX base class (_RN_GFX_DEFINED 가드)
- routes-arduino.ts: SSD1306 감지 → mock 주입
- arduino-emulator.html: L:O: (초기화) + L:oD: (프레임) 핸들러

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 20:30:25 +09:00
kimandClaude Sonnet 4.6 f0270be9fe fix: 캔버스 확대 배율 1.5x로 조정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 18:04:04 +09:00
kimandClaude Sonnet 4.6 f79af9c990 fix: 캔버스 확대 오버레이 — img 스냅샷 → 라이브 캔버스 복사
- toDataURL 대신 requestAnimationFrame으로 소스 캔버스를 실시간 복사
- 화면 90% 이내에서 최대 정수 배율로 선명하게 확대 (imageSmoothingEnabled:false)
- 라이브 뷰이므로 애니메이션도 확대 창에서 실시간 반영

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 18:02:27 +09:00
kimandClaude Sonnet 4.6 0a8e8e1ea8 fix: 캔버스 확대 클릭 핸들러 — DOMContentLoaded 제거 (이미 발화 후)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 17:59:14 +09:00
kimandClaude Sonnet 4.6 b618b2e1cb feat: TFT/OLED 캔버스 클릭 시 확대 오버레이
- 클릭 → 화면 최대 3배 확대, 90vw/90vh 이내로 제한
- 오버레이 클릭 또는 ESC 키로 닫기
- cursor:zoom-in/zoom-out 표시

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 17:57:13 +09:00
kimandClaude Sonnet 4.6 0951368221 feat: 보드 선택 시 설치된 라이브러리 목록을 AI 시스템 프롬프트에 포함
- _csbFetchLibs(): 보드 선택 시 /api/arduino/libs?fqbn= 호출 후 캐시
- 초기 로드 및 보드 변경 시 자동 갱신
- lang: 선택 시 라이브러리 조회 생략
- boardBlock에 "설치된 라이브러리: ..." 추가 (~113 토큰)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 17:53:54 +09:00
kimandClaude Sonnet 4.6 267441d633 feat: 보드 선택에 언어 옵션 추가 + 아두이노 힌트 범용화
- 보드 드롭다운 상단에 Python / C++(일반) / 기타 언어 옵션 추가
- _boardSpecificHints 리팩터: 모든 하드웨어 보드에 Arduino C++ 기본 규칙 적용
- arch별 추가 규칙 (esp32/esp8266/stm32/avr) 유지
- STM32 힌트 "Python 절대 사용 금지" → "PC 앱 필요 시 병행 가능"으로 완화

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 17:50:12 +09:00
kimandClaude Sonnet 4.6 1eb4674303 fix: 코드 AI 시스템 프롬프트 — 보드/파일 컨텍스트 강화
- 보드 블록을 프롬프트 앞으로 이동, 로컬 폴더와 분리
- 에디터 열린 파일 목록을 별도 섹션으로 강조
- 로컬 폴더는 '파일 저장소'로만 표현 (프로젝트 탐색 대상 아님)
- AI가 Glob/list로 로컬 폴더를 탐색해 프로젝트 파악하는 행동 방지

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 17:06:15 +09:00
kimandClaude Sonnet 4.6 b5155a153b fix: 코드 AI에 STM32 보드 컨텍스트 항상 포함
- _boardSpecificHints에 stm32 케이스 추가 (C++/Arduino 명시, Python 금지)
- boardBlock: hints 유무 관계없이 보드명+FQBN 항상 시스템 프롬프트에 포함

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 16:54:22 +09:00
kimandClaude Sonnet 4.6 11799e7553 fix: STM32 핀 매핑 수정 + Renode 로그 정리
- _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>
2026-06-30 16:42:01 +09:00
kimandClaude Sonnet 4.6 73fc4f4319 chore: Renode WARNING 서버 로그에서도 제거
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 16:20:53 +09:00
kimandClaude Sonnet 4.6 5e9596e188 feat: STM32 Renode 시리얼 출력 수정 + 로그 정리
- uartBuf 버퍼 추가: SSE 연결 전 도착한 UART 데이터 재전송 (타이밍 이슈 해결)
- Renode 로그 라인버퍼링 + ANSI 코드 제거
- 시리얼 모니터에 WARNING/INFO 숨김, Machine started + ERROR만 표시
- ILI9341 mock: &SPI1 → nullptr 패치 (cast-macro address-of 오류 수정)
- STM32 보드 목록: 블루필/블랙필 한국어 표기 + Nucleo 3종 유지

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 13:52:12 +09:00
kimandClaude Sonnet 4.6 e520d09ca1 feat: STM32 Blue Pill 에뮬레이터 UI — 보드 SVG + GPIO LED 시각화
- 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>
2026-06-29 22:07:06 +09:00