Files
homeclaw/web-ui/audiomass/keys.js
T
kimandClaude Opus 5 e85ebe6608 v4.3.20: 미커밋 자산 일괄 정리 + 유저 워크스페이스/세션토큰 gitignore
그동안 쌓여 있던 미커밋 파일들을 정리. 소스·자산만 올리고, 개인 데이터와
런타임 상태는 gitignore로 차단.

추가된 자산:
- web-ui/audiomass, web-ui/wavacity — 자체 호스팅 오디오 에디터
- web-ui/drums — 드럼 샘플
- wol-gate — WOL 프록시 컨테이너(Dockerfile + server.js)
- glm-1m-fix — GLM 1M 컨텍스트 설치 스크립트(linux/windows)
- RENODE_FIXES_SUMMARY*.md, CCTV정보_서울특별시.csv, .claude/plans

수정:
- edge_tts_synth.py: rate 인자 추가(말하기 속도 조절)
- .smallclaw/config.json: google(gemini) provider 등록 — 키는 vault 참조
- assets/SmallClaw*.png 삭제분 반영

gitignore (중요):
- .smallclaw/users/*/workspace/ 전체 차단. 기존 패턴이 memory/uploads와 일부
  확장자만 막아서 detective/(고소장·통화녹취·의사소견서·가족관계증명서),
  generated-media/, music/, pptx/ 등 앱 생성 개인 데이터 403MB가 노출돼 있었음
- .smallclaw/active-sessions.json 차단 — 살아있는 bearer 토큰과 admin 역할이
  평문으로 들어있어 커밋 시 게이트웨이 관리자 자격증명이 그대로 공개됨
- google-usage.json, config.json.bak-*, workspace/memory·weather-maps·
  task_result_*, voice/ 등 런타임 상태도 함께 차단

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 14:55:37 +09:00

101 lines
2.5 KiB
JavaScript
Executable File

(function( w, d, PKAE ) {
'use strict';
function KeyHandler () {
var q = this;
q.keyMap = {}; // holds a map of all the active keys
q.callbacks = {}; // callbacks for when a key combintation becomes active
q.singleCallbacks = {}; // callbacks to the 'keypress' event - not required
q.mac = /mac|iphone|ipad|ipod/.test ((navigator.platform || '').toLowerCase ());
q.isAccel = function ( e ) {
return e && (q.mac ? e.metaKey : e.ctrlKey) && !e.altKey;
};
q.isEditTarget = function ( e ) {
var t = e && e.target;
return !!(t && /INPUT|TEXTAREA|SELECT/.test (t.tagName));
};
q.addCallback = function (callback_name, callback_function, keys) {
q.callbacks[ callback_name ] = {
keys : keys,
callback : callback_function
};
};
q.addSingleCallback = function (callback_name, callback_function, key) {
q.singleCallbacks[ callback_name ] = {
key : key,
callback : callback_function
};
};
q.removeCallback = function ( callback_name ) {
q.callbacks[ callback_name ] = null;
};
d.addEventListener ('keydown', function ( e ) {
var keyCode = e.keyCode;
q.keyDown (keyCode, e);
});
q.keyDown = function (keyCode, e ) {
q.keyMap[keyCode] = 1;
for (var key in q.callbacks) {
var group = q.callbacks[key];
if (!group) continue;
if (keyCode !== group.keys[group.keys.length - 1]) continue;
var l = group.keys.length;
var all_ok = true;
while (l-- > 0) {
if (!q.keyMap[group.keys[l]])
{
all_ok = false;
break;
}
}
all_ok && group.callback && group.callback ( keyCode, q.keyMap, e );
}
};
q.keyUp = function ( keyCode ) {
q.keyMap[keyCode] = 0;
};
q.keyPress = function ( keyCode, e ) {
if (q.isEditTarget ( e )) return ;
for (var key in q.singleCallbacks) {
var group = q.singleCallbacks[key];
if (!group) continue;
if (group.key === keyCode)
group.callback && group.callback ( e );
}
};
d.addEventListener ('keyup', function ( e ) {
var keyCode = e.keyCode;
q.keyUp (keyCode);
});
d.addEventListener ('keypress', function ( e ) {
var keyCode = e.keyCode;
q.keyPress (keyCode, e);
});
w.addEventListener ('blur', function ( e ) {
q.keyMap = {};
}, false);
d.addEventListener ('contextmenu', function( e ) {
e.preventDefault();
}, false);
};
PKAE._deps.keyhandler = KeyHandler;
})( window, document, PKAudioEditor );