그동안 쌓여 있던 미커밋 파일들을 정리. 소스·자산만 올리고, 개인 데이터와 런타임 상태는 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>
101 lines
2.5 KiB
JavaScript
Executable File
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 );
|