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>
This commit is contained in:
kim
2026-07-10 13:31:28 +09:00
co-authored by Claude Sonnet 5
parent 34fac14b20
commit f014fec7e2
17 changed files with 380 additions and 265 deletions
+20
View File
@@ -333,6 +333,9 @@
<button id="code-upload-btn" class="csb-term-btn" onclick="csbUploadToBoard()" title="보드에 업로드 (USB 연결 필요)" style="background:var(--brand);color:#fff;border-color:var(--brand)">⚡ 업로드</button>
<button id="code-android-btn" class="csb-term-btn" onclick="openAndroidEmulator()" title="Android 에뮬레이터 열기">🤖 Android</button>
</div>
<div class="csb-term-row">
<button id="code-usb-android-btn" class="csb-term-btn" onclick="toggleAndroidUsbPanel()" title="USB로 연결된 실제 Android 기기 (기기 감지 / APK 설치 / Logcat / 화면 미러링)">📱 실기기(USB)</button>
</div>
<!-- Claude App (로컬 LLM 코딩 에이전트) -->
<div class="csb-term-row">
<button id="code-claude-btn" class="csb-term-btn" onclick="toggleClaudeAppPanel()" title="Claude App(로컬 LLM 코딩 에이전트) 패널 토글">🤖 클로드 앱</button>
@@ -635,6 +638,23 @@
</div>
</div>
</div>
<!-- 📱 USB 실기기 panel -->
<div id="android-usb-panel" style="display:none;flex-direction:column;flex-shrink:0;height:340px;min-height:120px;border-top:2px solid #1e5a8a;background:#0e1a24;position:relative">
<div id="android-usb-drag" style="position:absolute;top:0;left:0;right:0;height:5px;cursor:ns-resize;z-index:2;transition:background .15s"></div>
<div style="display:flex;align-items:center;height:32px;background:#122636;border-bottom:1px solid #1e5a8a;flex-shrink:0;padding:0 8px;gap:6px;overflow-x:auto">
<span id="android-usb-status" style="padding:2px 8px;border-radius:4px;font-size:11px;font-weight:700;background:#1a3448;color:#5aa8e8;flex-shrink:0;white-space:nowrap">대기 중</span>
<select id="android-usb-device-sel" style="display:none;background:#1a3448;border:1px solid #2a5a8a;color:#7ac0f0;border-radius:4px;padding:3px 6px;font-size:12px;font-family:'IBM Plex Mono',monospace;flex-shrink:0;max-width:180px"></select>
<input type="text" id="android-usb-pkg-filter" placeholder="패키지 필터 (선택, 예: com.example.app)"
style="flex:1;min-width:100px;background:#1a3448;border:1px solid #2a5a8a;color:#bcdcf8;border-radius:4px;padding:3px 8px;font-size:12px;font-family:'IBM Plex Mono',monospace;outline:none">
<button onclick="androidUsbRefreshDevices()" title="새로고침" style="background:#1a3448;border:1px solid #2a5a8a;color:#5aa8e8;border-radius:5px;padding:3px 10px;font-size:12px;cursor:pointer;font-family:'IBM Plex Mono',monospace;flex-shrink:0">🔄</button>
<button id="android-usb-install-btn" onclick="androidUsbInstallApk()" disabled style="background:#1a3448;border:1px solid #2a5a8a;color:#5aa8e8;border-radius:5px;padding:3px 10px;font-size:12px;cursor:pointer;font-family:'IBM Plex Mono',monospace;flex-shrink:0;white-space:nowrap">📦 APK 설치</button>
<button id="android-usb-logcat-btn" onclick="androidUsbOpenLogcat()" disabled style="background:#1a3448;border:1px solid #2a5a8a;color:#5aa8e8;border-radius:5px;padding:3px 10px;font-size:12px;cursor:pointer;font-family:'IBM Plex Mono',monospace;flex-shrink:0;white-space:nowrap">📜 Logcat</button>
<button id="android-usb-mirror-btn" onclick="androidUsbStartMirror()" disabled style="background:color-mix(in srgb,#5aa8e8 20%,#122636);border:1px solid #5aa8e8;color:#5aa8e8;border-radius:5px;padding:3px 10px;font-size:12px;cursor:pointer;font-family:'IBM Plex Mono',monospace;font-weight:700;flex-shrink:0;white-space:nowrap">🪞 화면 미러링</button>
<button onclick="toggleAndroidUsbPanel()" style="background:none;border:none;color:#3d6f9f;cursor:pointer;font-size:16px;padding:0 6px;line-height:1;flex-shrink:0">&times;</button>
</div>
<div id="android-usb-hint" style="display:none;padding:8px 14px;font-size:12px;color:#7ac0f0;background:#0f2233;border-bottom:1px solid #1e5a8a;line-height:1.6"></div>
<div id="android-usb-log" style="flex:1;overflow-y:auto;padding:10px 14px;font-size:13px;line-height:1.8;white-space:pre-wrap;word-break:break-all;font-family:'IBM Plex Mono',monospace;color:#a8ccec"></div>
</div>
</div>
</div>