This commit is contained in:
kim
2026-05-03 19:41:35 +09:00
parent cb131e8047
commit b37525434c
8 changed files with 111 additions and 7 deletions
+4 -1
View File
@@ -46,7 +46,10 @@
"Bash(grep -n \"^ default:\\\\|^ default:\\\\|^ }$\\\\|^ }$\" /home/kim/homeclaw/src/gateway/server-v2.ts)",
"Bash(awk -F: '$1>2436 && $1<3700')",
"Bash(awk 'NR>=3450 && NR<=3550' /home/kim/homeclaw/src/gateway/server-v2.ts)",
"Bash(awk '{print \"server-v2.ts lines:\", $1}')"
"Bash(awk '{print \"server-v2.ts lines:\", $1}')",
"Bash(docker --version)",
"Bash(mkdir -p ~/searxng)",
"Read(//home/kim/**)"
]
},
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
@@ -111,12 +111,52 @@
"role": "assistant",
"content": "최신 유리치은이식술(FGG) 관련 저널 3개를 요약해 드립니다.\n\n1. **Modified FGG (2023)**: 하악 전치부 치은퇴축 치료 시 기존 방식보다 치근 피복률(91.8%)과 환자 만족도가 유의미하게 높고 수술 후 통증이 적은 변형 술식을 제시했습니다.\n2. **Mesh-FGG (2024)**: 이식편을 그물 모양(Mesh)으로 늘려 채득 부위는 최소화하면서 넓은 부위의 부착치은을 확보하는 혁신적인 접근법입니다.\n3. **Fishnet Suture (2025)**: '그물망 봉합법'이라는 새로운 미세 봉합 기술을 통해 이식편을 골막에 완벽히 고정하고 혈관 재형성을 촉진하여 안정성을 극대화한 사례가 보고되었습니다.",
"timestamp": 1777800841224
},
{
"role": "user",
"content": "오늘 ABC 뉴스 정리",
"timestamp": 1777804194776
},
{
"role": "assistant",
"content": "오늘(2026년 5월 3일) ABC 뉴스의 주요 헤드라인을 정리해 드립니다.\n\n* **국제**: 이스라엘과 헤즈볼라 간의 교전이 지속되는 가운데, 미 국방부가 독일에서 미군 5,000명을 철수하겠다고 발표했습니다.\n* **정치**: 트럼프 대통령이 EU산 자동차 및 트럭에 25% 관세를 부과하겠다고 선언했으며, 대법원에는 우편 주문 낙태약에 대한 접근권 복구 요청이 접수되었습니다.\n* **스포츠**: 켄터키 더비에서 'Golden Tempo'가 우승하며, 셰리 드보(Cherie DeVaux)가 여성 최초의 우승마 조련사가 되었습니다.\n* **사회**: 실종되었던 USF 학생 나히다 브리스티(Nahida Bristy)의 시신이 확인되었으며, 뉴저지에서는 불법 투표 혐의로 4명이 기소되었습니다.",
"timestamp": 1777804237249
},
{
"role": "user",
"content": "오늘 ABC 뉴스 한 페이지로 정리",
"timestamp": 1777804677808
},
{
"role": "assistant",
"content": "오늘 ABC 뉴스의 주요 소식을 한 페이지로 정리한 파워포인트 파일을 생성했습니다. 국제 정세, 경제, 스포츠 및 사회 분야의 핵심 헤드라인을 담았습니다.",
"timestamp": 1777804685110
},
{
"role": "user",
"content": "오늘 bbc 뉴스 정리",
"timestamp": 1777804724242
},
{
"role": "assistant",
"content": "오늘(2026년 5월 3일) BBC 뉴스의 주요 소식입니다.\n\n* **이란 전쟁**: 이스라엘-미국과 이란 간의 전쟁 상황에 대한 데일리 브리핑이 이어지고 있습니다.\n* **미군 철수**: 트럼프 대통령이 독일 주둔 미군을 5,000명 이상 추가 감축하겠다고 발표하며 독일 총리와의 갈등이 심화되고 있습니다.\n* **기후 변화**: 지구를 구하는 것이 왜 어려운지, 그리고 이를 변화시킬 방법에 대한 심층 보도가 있었습니다.\n* **영국 정치**: 일요일 아침 정치 대담 프로그램을 통해 최신 정치 현안과 인터뷰가 진행되었습니다.",
"timestamp": 1777804735549
},
{
"role": "user",
"content": "조금 더 상세하게.",
"timestamp": 1777804777240
},
{
"role": "assistant",
"content": "오늘 BBC 뉴스의 주요 이슈를 더 상세히 정리해 드립니다.\n\n* **독일 주둔 미군 감축 논란**: 트럼프 대통령이 독일 주둔 미군 5,000명 추가 철수를 발표하며 나토(NATO) 내 긴장이 고조되었습니다. 독일 정부는 \"유럽 안보에 대한 위협\"이라며 강력히 반발하고 있습니다.\n* **중동 분쟁 심화**: 이스라엘과 헤즈볼라 간의 국경 교전이 격화되면서 전면전 우려가 커지고 있습니다. BBC는 현지 특파원을 통해 민간인 피해 상황과 레바논 남부의 긴박한 분위기를 상세히 보도했습니다.\n* **기후 위기 심층 분석**: '지구를 구하는 것이 왜 어려운가'라는 주제로, 정치적 이해관계와 경제적 비용이 탄소 중립 목표를 어떻게 가로막고 있는지에 대한 데이터 분석 기사가 게재되었습니다.\n* **영국 내각 인터뷰**: 일요일 아침 '로라 쿤스버그 쇼'에서 영국 장관들이 출연해 최근의 경제 지표와 공공 서비스 개혁안에 대해 야당과 치열한 공방을 벌였습니다.",
"timestamp": 1777804783436
}
],
"workspace": "/home/kim/homeclaw/.smallclaw/users/papa/workspace",
"createdAt": 1777792768975,
"lastActiveAt": 1777800841225,
"lastActiveAt": 1777804783436,
"pendingMemoryFlush": false,
"pendingCompaction": false,
"contextTokenEstimate": 1107
"contextTokenEstimate": 1538
}
@@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>ABC News Summary - 다운로드</title>
<style>
body { font-family: 'Malgun Gothic', sans-serif; max-width: 600px; margin: 60px auto; padding: 20px; text-align: center; background: #f8f9fa; }
.card { background: white; border-radius: 12px; padding: 40px 30px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
h1 { color: #1a1a2e; font-size: 24px; margin-bottom: 10px; }
p { color: #5f6f86; margin-bottom: 30px; }
.btn { display: inline-block; background: #1668e3; color: white; text-decoration: none; padding: 14px 36px; border-radius: 8px; font-size: 16px; font-weight: bold; transition: background 0.2s; }
.btn:hover { background: #1255bb; }
.meta { margin-top: 20px; font-size: 12px; color: #888; }
</style>
</head>
<body>
<div class="card">
<h1>ABC News Summary</h1>
<p>슬라이드 1장이 준비되었습니다.</p>
<a class="btn" href="abc_news_summary.pptx" download>프레젠테이션 다운로드</a>
<div class="meta">/home/kim/homeclaw/.smallclaw/users/papa/workspace/abc_news_summary/abc_news_summary.pptx</div>
</div>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

@@ -322,3 +322,24 @@
1. **Modified FGG (2023)**: 하악 전치부 치은퇴축 치료 시 기존 방식보다 치근 피복률(91.8%)과 환자 만족도가 유의미하게 높고 수술 후 통증이 적은 변형 술식을 제시했습니다.
2. **Mesh-FGG (2024)**: 이식편을 그물 모양(Mesh)으로 늘려 채득 부위는 최소화하면서 넓은 부위의 부착치은을 확보하는 혁신적인 접근법입니다.
3. **Fishnet Suture (2025)**: '그물망 봉합법'이라는 새로운 미세 봉합 기술을
[19:30:04] **User**: 오늘 ABC 뉴스 정리
[19:30:37] **SmallClaw**: 오늘(2026년 5월 3일) ABC 뉴스의 주요 헤드라인을 정리해 드립니다.
* **국제**: 이스라엘과 헤즈볼라 간의 교전이 지속되는 가운데, 미 국방부가 독일에서 미군 5,000명을 철수하겠다고 발표했습니다.
* **정치**: 트럼프 대통령이 EU산 자동차 및 트럭에 25% 관세를 부과하겠다고 선언했으며, 대법원에는 우편 주문 낙태약에 대한 접근권 복구 요청이 접수되었습니다.
* **스포츠**: 켄터키 더비에서 'Golden Tempo'가 우승하며, 셰리 드보(Cherie DeVaux)가 여성 최초의 우승마 조련사가
[19:38:00] **User**: 오늘 ABC 뉴스 한 페이지로 정리
[19:38:05] **SmallClaw**: 오늘 ABC 뉴스의 주요 소식을 한 페이지로 정리한 파워포인트 파일을 생성했습니다. 국제 정세, 경제, 스포츠 및 사회 분야의 핵심 헤드라인을 담았습니다.
[19:38:49] **User**: 오늘 bbc 뉴스 정리
[19:38:55] **SmallClaw**: 오늘(2026년 5월 3일) BBC 뉴스의 주요 소식입니다.
* **이란 전쟁**: 이스라엘-미국과 이란 간의 전쟁 상황에 대한 데일리 브리핑이 이어지고 있습니다.
* **미군 철수**: 트럼프 대통령이 독일 주둔 미군을 5,000명 이상 추가 감축하겠다고 발표하며 독일 총리와의 갈등이 심화되고 있습니다.
* **기후 변화**: 지구를 구하는 것이 왜 어려운지, 그리고 이를 변화시킬 방법에 대한 심층 보도가 있었습니다.
* **영국 정치**: 일요일 아침 정치 대담 프로그램을 통해 최신 정치 현안과 인터뷰가 진행되었
[19:39:40] **User**: 조금 더 상세하게.
[19:39:43] **SmallClaw**: 오늘 BBC 뉴스의 주요 이슈를 더 상세히 정리해 드립니다.
* **독일 주둔 미군 감축 논란**: 트럼프 대통령이 독일 주둔 미군 5,000명 추가 철수를 발표하며 나토(NATO) 내 긴장이 고조되었습니다. 독일 정부는 "유럽 안보에 대한 위협"이라며 강력히 반발하고 있습니다.
* **중동 분쟁 심화**: 이스라엘과 헤즈볼라 간의 국경 교전이 격화되면서 전면전 우려가 커지고 있습니다. BBC는 현지 특파원을 통해 민간인 피해 상황과 레바논 남부의 긴박한 분위기를 상세히 보도했습니다.
* **기후 위기 심층 분석**:
+5 -3
View File
@@ -2163,13 +2163,13 @@ async function webSearch(query: string): Promise<string> {
const tavilyKey = searchCfg.tavily_api_key || '';
console.log(`[v2] webSearch via ${provider}: ${query.slice(0, 80)}`);
if (provider === 'ollama') {
if (provider === 'ollama' || provider === 'searxng') {
try {
const { executeWebSearch } = await import('../tools/web.js');
const res = await executeWebSearch({ query, max_results: 5 });
if (res.success && res.stdout) return res.stdout;
} catch (err: any) {
console.warn('[v2] webSearch ollama failed, falling back to DDG:', err.message);
console.warn(`[v2] webSearch ${provider} failed, falling back to DDG:`, err.message);
}
return duckDuckGoSearch(query);
}
@@ -9534,11 +9534,12 @@ app.get('/api/settings/search', (_req, res) => {
google_cx: cfg.google_cx || '',
brave_api_key: maskIfSet(cfg.brave_api_key),
ollama_model: cfg.ollama_model || '',
searxng_url: cfg.searxng_url || '',
});
});
app.post('/api/settings/search', (req, res) => {
const { preferred_provider, search_rigor, tavily_api_key, google_api_key, google_cx, brave_api_key, ollama_model } = req.body;
const { preferred_provider, search_rigor, tavily_api_key, google_api_key, google_cx, brave_api_key, ollama_model, searxng_url } = req.body;
const cm = getConfig();
const current = cm.getConfig() as any;
// Only write a key field if the user actually entered a new value.
@@ -9553,6 +9554,7 @@ app.post('/api/settings/search', (req, res) => {
...(google_cx !== undefined && { google_cx }),
...(isNew(brave_api_key) && { brave_api_key }),
...(ollama_model !== undefined && { ollama_model }),
...(searxng_url !== undefined && { searxng_url }),
};
cm.updateConfig({ search: newSearch } as any);
// migrateSecretsToVault() runs inside updateConfig → saveConfig, so any
+15 -1
View File
@@ -2876,17 +2876,22 @@
<div style="border:1px solid var(--line);border-radius:12px;padding:12px">
<div class="right-section-title" style="margin-bottom:8px">웹 검색</div>
<label style="display:block;font-size:12px;color:var(--muted);margin-bottom:6px">검색 제공자</label>
<select id="settings-provider" onchange="toggleOllamaModelRow(this.value)" style="width:100%;border:1px solid var(--line);border-radius:10px;padding:8px;font-size:13px">
<select id="settings-provider" onchange="toggleOllamaModelRow(this.value);toggleSearxngUrlRow(this.value)" style="width:100%;border:1px solid var(--line);border-radius:10px;padding:8px;font-size:13px">
<option value="ddg">DuckDuckGo</option>
<option value="ollama">Ollama (모델 보조 검색)</option>
<option value="tavily">Tavily</option>
<option value="google">Google CSE</option>
<option value="brave">Brave</option>
<option value="searxng">SearXNG (셀프호스트)</option>
</select>
<div id="search-ollama-model-row" style="display:none;margin-top:8px">
<label style="display:block;font-size:12px;color:var(--muted);margin-bottom:4px">Ollama 검색 모델</label>
<input id="settings-search-ollama-model" type="text" placeholder="예: gemini-3-flash-preview:cloud" style="width:100%;border:1px solid var(--line);border-radius:8px;padding:7px 9px;font-size:12px;box-sizing:border-box">
</div>
<div id="search-searxng-url-row" style="display:none;margin-top:8px">
<label style="display:block;font-size:12px;color:var(--muted);margin-bottom:4px">SearXNG 인스턴스 URL</label>
<input id="settings-search-searxng-url" type="text" placeholder="예: http://127.0.0.1:8888" style="width:100%;border:1px solid var(--line);border-radius:8px;padding:7px 9px;font-size:12px;box-sizing:border-box">
</div>
<label style="display:block;font-size:12px;color:var(--muted);margin:10px 0 6px">검색 엄격도</label>
<select id="settings-search-rigor" style="width:100%;border:1px solid var(--line);border-radius:10px;padding:8px;font-size:13px">
<option value="fast">빠름</option>
@@ -5896,6 +5901,11 @@ function toggleOllamaModelRow(provider) {
if (row) row.style.display = provider === 'ollama' ? 'block' : 'none';
}
function toggleSearxngUrlRow(provider) {
const row = document.getElementById('search-searxng-url-row');
if (row) row.style.display = provider === 'searxng' ? 'block' : 'none';
}
async function setQuickSearchRigor(level) {
quickSearchRigor = level;
updateQuickModeUI();
@@ -6488,7 +6498,10 @@ async function openSettings(tab) {
document.getElementById('settings-search-rigor').value = s.search_rigor || 'verified';
if (document.getElementById('settings-search-ollama-model'))
document.getElementById('settings-search-ollama-model').value = s.ollama_model || '';
if (document.getElementById('settings-search-searxng-url'))
document.getElementById('settings-search-searxng-url').value = s.searxng_url || '';
toggleOllamaModelRow(s.preferred_provider);
toggleSearxngUrlRow(s.preferred_provider);
// Keys are loaded via the Credentials tab — not here
} catch {}
try {
@@ -7220,6 +7233,7 @@ async function saveSettings() {
google_cx: document.getElementById('cred-google-cx')?.value.trim() || '',
brave_api_key: document.getElementById('cred-brave-key')?.value.trim() || '',
ollama_model: document.getElementById('settings-search-ollama-model')?.value.trim() || '',
searxng_url: document.getElementById('settings-search-searxng-url')?.value.trim() || '',
};
const policyPayload = {
force_web_for_fresh: document.getElementById('settings-force-web-fresh').checked,