@cliphijack/santaclaude 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/santaclaude.js +5 -3
package/package.json
CHANGED
package/santaclaude.js
CHANGED
|
@@ -76,8 +76,8 @@ function listWindows(session) {
|
|
|
76
76
|
}
|
|
77
77
|
// 각 루돌프(탭) 화면 캡처 — 웹 미러용 (마지막 ~30줄)
|
|
78
78
|
function captureWindow(session, name) {
|
|
79
|
-
// -e: ANSI 색상 보존(웹에서 터미널 색 재현), -S -
|
|
80
|
-
try { return execFileSync('tmux', ['capture-pane', '-t', session + ':' + name, '-p', '-e', '-S', '-
|
|
79
|
+
// -e: ANSI 색상 보존(웹에서 터미널 색 재현), -S -700: 최근 700줄 (반응속도 vs 스크롤 균형 — 2000은 렌더 비용 4배라 맥에서 느림)
|
|
80
|
+
try { return execFileSync('tmux', ['capture-pane', '-t', session + ':' + name, '-p', '-e', '-S', '-700'], { encoding: 'utf8' }).replace(/\n+$/, '').slice(-75000); }
|
|
81
81
|
catch (e) { return ''; }
|
|
82
82
|
}
|
|
83
83
|
// 🔍 로컬 스킬 발견 — ~/.claude/skills + 각 루돌프 프로젝트 .claude/skills 스캔 (등록 누를 때만 1회)
|
|
@@ -443,11 +443,13 @@ async function run(conf) {
|
|
|
443
443
|
execFileSync('tmux', ['send-keys', '-t', w, '-l', String(cmd.text || '')]);
|
|
444
444
|
setTimeout(() => { try { execFileSync('tmux', ['send-keys', '-t', w, 'Enter']); } catch (e) {} }, 300);
|
|
445
445
|
console.log(` ⌨️ 입력 → ${w}: ${String(cmd.text || '').slice(0, 50)}`);
|
|
446
|
+
setTimeout(sendScreen, 650); setTimeout(sendScreen, 1200); // 입력 직후 즉시 화면 푸시(diff-gated) — 타이핑→결과 1초 안
|
|
446
447
|
} else if (cmd.action === 'key') {
|
|
447
448
|
// 플로팅 컨트롤 — 특수키 그대로 전달 (Escape, C-c, Up 등)
|
|
448
449
|
const w = (cmd.name && windowExists(session, cmd.name)) ? (session + ':' + cmd.name) : pane;
|
|
449
450
|
execFileSync('tmux', ['send-keys', '-t', w, String(cmd.key || '')]);
|
|
450
451
|
console.log(` ⌨️ 키 → ${w}: ${cmd.key}`);
|
|
452
|
+
setTimeout(sendScreen, 300); setTimeout(sendScreen, 750);
|
|
451
453
|
} else if (cmd.action === 'resize') {
|
|
452
454
|
// 📐 창에맞춤 토글: fit=강제 reflow(사람 붙어있어도) / restore=window-size latest로 원복(내 터미널 따라가기)
|
|
453
455
|
const w = (cmd.name && windowExists(session, cmd.name)) ? (session + ':' + cmd.name) : pane;
|
|
@@ -583,7 +585,7 @@ async function run(conf) {
|
|
|
583
585
|
let ws = null, hbIv = null, scrIv = null;
|
|
584
586
|
function connectWS() {
|
|
585
587
|
try { ws = new WebSocket(wsUrl); } catch (e) { console.error(' WebSocket 생성 실패:', e.message); setTimeout(connectWS, 5000); return; }
|
|
586
|
-
ws.addEventListener('open', () => { console.log(' 🔌 클라우드 연결됨 (WebSocket).'); lastScr = ''; sendHb(); sendScreen(); clearInterval(hbIv); clearInterval(scrIv); hbIv = setInterval(sendHb, Math.max(every, 15000)); scrIv = setInterval(() => { sendScreen(); sendTxDelta(); },
|
|
588
|
+
ws.addEventListener('open', () => { console.log(' 🔌 클라우드 연결됨 (WebSocket).'); lastScr = ''; sendHb(); sendScreen(); clearInterval(hbIv); clearInterval(scrIv); hbIv = setInterval(sendHb, Math.max(every, 15000)); scrIv = setInterval(() => { sendScreen(); sendTxDelta(); }, 1000); });
|
|
587
589
|
ws.addEventListener('message', (e) => { let m; try { m = JSON.parse(typeof e.data === 'string' ? e.data : e.data.toString()); } catch { return; } if (m.type === 'job') onJob(m); else if (m.type === 'ctl') runControl(m.cmd); });
|
|
588
590
|
ws.addEventListener('close', () => { clearInterval(hbIv); clearInterval(scrIv); console.log(' 🔌 연결 끊김 — 5초 후 재연결'); setTimeout(connectWS, 5000); });
|
|
589
591
|
ws.addEventListener('error', () => { try { ws.close(); } catch (e) {} });
|