openinputbridge-mcp 0.1.0
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/LICENSE +29 -0
- package/README.md +211 -0
- package/bin/oib_bridge.exe +0 -0
- package/dist/bridge.js +224 -0
- package/dist/bridge.js.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/keycodes.js +325 -0
- package/dist/keycodes.js.map +1 -0
- package/dist/safety.js +60 -0
- package/dist/safety.js.map +1 -0
- package/dist/tools.js +465 -0
- package/dist/tools.js.map +1 -0
- package/package.json +54 -0
package/dist/keycodes.js
ADDED
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scan-code tables for the OpenInputBridge wire protocol (docs/PROTOCOL.md).
|
|
3
|
+
*
|
|
4
|
+
* Key names follow the DOM UI Events `KeyboardEvent.code` vocabulary
|
|
5
|
+
* (e.g. "KeyA", "Digit1", "ShiftLeft", "ArrowUp") since that is the
|
|
6
|
+
* physical-key naming scheme test automation engineers already know from
|
|
7
|
+
* Playwright/Selenium. Values are the standard PS/2 Set 1 make codes used
|
|
8
|
+
* by KEYBOARD_INPUT_DATA.MakeCode, with an `extended` flag for the E0
|
|
9
|
+
* prefix.
|
|
10
|
+
*
|
|
11
|
+
* `press_key`/`key_down`/`key_up` name a *physical key* (layout-independent
|
|
12
|
+
* - the scan code is a position, not a character), so they work the same
|
|
13
|
+
* regardless of the OS's active keyboard layout. `type_text` instead takes
|
|
14
|
+
* literal *characters* and must decide which physical key + Shift state
|
|
15
|
+
* produces each one, which genuinely does depend on the active layout -
|
|
16
|
+
* see charToKeyEvent()'s `layout` parameter below. IME-based Japanese text
|
|
17
|
+
* entry (kana/kanji conversion) is out of scope for v1 regardless of layout.
|
|
18
|
+
*/
|
|
19
|
+
function sc(makeCode, extended = false) {
|
|
20
|
+
return { makeCode, extended };
|
|
21
|
+
}
|
|
22
|
+
export const KEY_TABLE = Object.freeze({
|
|
23
|
+
// Letter row 1 (Q..P)
|
|
24
|
+
KeyQ: sc(0x10), KeyW: sc(0x11), KeyE: sc(0x12), KeyR: sc(0x13), KeyT: sc(0x14),
|
|
25
|
+
KeyY: sc(0x15), KeyU: sc(0x16), KeyI: sc(0x17), KeyO: sc(0x18), KeyP: sc(0x19),
|
|
26
|
+
// Letter row 2 (A..L)
|
|
27
|
+
KeyA: sc(0x1e), KeyS: sc(0x1f), KeyD: sc(0x20), KeyF: sc(0x21), KeyG: sc(0x22),
|
|
28
|
+
KeyH: sc(0x23), KeyJ: sc(0x24), KeyK: sc(0x25), KeyL: sc(0x26),
|
|
29
|
+
// Letter row 3 (Z..M)
|
|
30
|
+
KeyZ: sc(0x2c), KeyX: sc(0x2d), KeyC: sc(0x2e), KeyV: sc(0x2f), KeyB: sc(0x30),
|
|
31
|
+
KeyN: sc(0x31), KeyM: sc(0x32),
|
|
32
|
+
// Digit row
|
|
33
|
+
Digit1: sc(0x02), Digit2: sc(0x03), Digit3: sc(0x04), Digit4: sc(0x05), Digit5: sc(0x06),
|
|
34
|
+
Digit6: sc(0x07), Digit7: sc(0x08), Digit8: sc(0x09), Digit9: sc(0x0a), Digit0: sc(0x0b),
|
|
35
|
+
// Punctuation (US layout)
|
|
36
|
+
Minus: sc(0x0c), Equal: sc(0x0d),
|
|
37
|
+
BracketLeft: sc(0x1a), BracketRight: sc(0x1b),
|
|
38
|
+
Semicolon: sc(0x27), Quote: sc(0x28), Backquote: sc(0x29),
|
|
39
|
+
Backslash: sc(0x2b), Comma: sc(0x33), Period: sc(0x34), Slash: sc(0x35),
|
|
40
|
+
// Whitespace / control
|
|
41
|
+
Enter: sc(0x1c), Tab: sc(0x0f), Space: sc(0x39), Backspace: sc(0x0e), Escape: sc(0x01),
|
|
42
|
+
CapsLock: sc(0x3a), NumLock: sc(0x45), ScrollLock: sc(0x46),
|
|
43
|
+
// Modifiers
|
|
44
|
+
ControlLeft: sc(0x1d), ControlRight: sc(0x1d, true),
|
|
45
|
+
ShiftLeft: sc(0x2a), ShiftRight: sc(0x36),
|
|
46
|
+
AltLeft: sc(0x38), AltRight: sc(0x38, true),
|
|
47
|
+
MetaLeft: sc(0x5b, true), MetaRight: sc(0x5c, true),
|
|
48
|
+
ContextMenu: sc(0x5d, true),
|
|
49
|
+
// Function keys
|
|
50
|
+
F1: sc(0x3b), F2: sc(0x3c), F3: sc(0x3d), F4: sc(0x3e), F5: sc(0x3f),
|
|
51
|
+
F6: sc(0x40), F7: sc(0x41), F8: sc(0x42), F9: sc(0x43), F10: sc(0x44),
|
|
52
|
+
F11: sc(0x57), F12: sc(0x58),
|
|
53
|
+
// Navigation / editing (extended)
|
|
54
|
+
Insert: sc(0x52, true), Delete: sc(0x53, true),
|
|
55
|
+
Home: sc(0x47, true), End: sc(0x4f, true),
|
|
56
|
+
PageUp: sc(0x49, true), PageDown: sc(0x51, true),
|
|
57
|
+
ArrowUp: sc(0x48, true), ArrowLeft: sc(0x4b, true),
|
|
58
|
+
ArrowRight: sc(0x4d, true), ArrowDown: sc(0x50, true),
|
|
59
|
+
// Numpad
|
|
60
|
+
Numpad0: sc(0x52), Numpad1: sc(0x4f), Numpad2: sc(0x50), Numpad3: sc(0x51),
|
|
61
|
+
Numpad4: sc(0x4b), Numpad5: sc(0x4c), Numpad6: sc(0x4d),
|
|
62
|
+
Numpad7: sc(0x47), Numpad8: sc(0x48), Numpad9: sc(0x49),
|
|
63
|
+
NumpadAdd: sc(0x4e), NumpadSubtract: sc(0x4a), NumpadDecimal: sc(0x53),
|
|
64
|
+
NumpadEnter: sc(0x1c, true), NumpadDivide: sc(0x35, true),
|
|
65
|
+
// JIS-only physical keys (109-key Japanese keyboards have 5 keys with no
|
|
66
|
+
// US-layout equivalent; DOM code names per the UI Events spec). Safe to
|
|
67
|
+
// press regardless of active layout - on a non-JIS system the physical
|
|
68
|
+
// key simply doesn't exist, so this is an inert/unmapped scan code.
|
|
69
|
+
IntlRo: sc(0x73), IntlYen: sc(0x7d),
|
|
70
|
+
Convert: sc(0x79), NonConvert: sc(0x7b), KanaMode: sc(0x70),
|
|
71
|
+
// ISO "102nd key" (between LeftShift and KeyZ on European/UK keyboards;
|
|
72
|
+
// absent on US ANSI keyboards). Used by German/French layouts below.
|
|
73
|
+
IntlBackslash: sc(0x56),
|
|
74
|
+
});
|
|
75
|
+
export function isKnownKey(name) {
|
|
76
|
+
return Object.prototype.hasOwnProperty.call(KEY_TABLE, name);
|
|
77
|
+
}
|
|
78
|
+
export const MODIFIER_KEYS = [
|
|
79
|
+
"ShiftLeft", "ShiftRight",
|
|
80
|
+
"ControlLeft", "ControlRight",
|
|
81
|
+
"AltLeft", "AltRight",
|
|
82
|
+
"MetaLeft", "MetaRight",
|
|
83
|
+
];
|
|
84
|
+
/** Windows LANGID (low word of HKL) - see bridge.ts getActiveKeyboardLayout(). */
|
|
85
|
+
const LANGID_JAPANESE = 0x0411;
|
|
86
|
+
const LANGID_GERMAN = 0x0407;
|
|
87
|
+
const LANGID_FRENCH = 0x040c;
|
|
88
|
+
const LANGID_RUSSIAN = 0x0419;
|
|
89
|
+
/** @deprecated kept for compatibility; prefer resolving via LANGID_TO_AUTO_LAYOUT. */
|
|
90
|
+
export const JAPANESE_LANGUAGE_ID = LANGID_JAPANESE;
|
|
91
|
+
/** `layout: "auto"` resolution: Windows LANGID -> layout. Unlisted LANGIDs (including Korean/Taiwan) fall back to "us". */
|
|
92
|
+
export const LANGID_TO_AUTO_LAYOUT = new Map([
|
|
93
|
+
[LANGID_JAPANESE, "jis"],
|
|
94
|
+
[LANGID_GERMAN, "de"],
|
|
95
|
+
[LANGID_FRENCH, "fr"],
|
|
96
|
+
[LANGID_RUSSIAN, "ru"],
|
|
97
|
+
]);
|
|
98
|
+
function k(key, shift = false) {
|
|
99
|
+
return { key, shift };
|
|
100
|
+
}
|
|
101
|
+
/** a-z -> KeyA..KeyZ (shift=false), A-Z -> same keys (shift=true) - true for every layout below except "fr" (AZERTY moves several letters) and the partial "de" swap, both overridden explicitly in their own tables. */
|
|
102
|
+
function usAsciiLetters() {
|
|
103
|
+
const out = {};
|
|
104
|
+
for (let c = 0; c < 26; c++) {
|
|
105
|
+
const upper = String.fromCharCode(65 + c);
|
|
106
|
+
const key = `Key${upper}`;
|
|
107
|
+
out[upper.toLowerCase()] = k(key, false);
|
|
108
|
+
out[upper] = k(key, true);
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
112
|
+
/** 0-9 -> Digit0..Digit9, unshifted - true for every layout below except "fr" (AZERTY digits need Shift). */
|
|
113
|
+
function usAsciiDigits() {
|
|
114
|
+
const out = {};
|
|
115
|
+
for (let d = 0; d <= 9; d++) {
|
|
116
|
+
out[String(d)] = k(`Digit${d}`, false);
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
const US_TABLE = Object.freeze({
|
|
121
|
+
...usAsciiLetters(),
|
|
122
|
+
...usAsciiDigits(),
|
|
123
|
+
"!": k("Digit1", true), "@": k("Digit2", true), "#": k("Digit3", true), "$": k("Digit4", true), "%": k("Digit5", true),
|
|
124
|
+
"^": k("Digit6", true), "&": k("Digit7", true), "*": k("Digit8", true), "(": k("Digit9", true), ")": k("Digit0", true),
|
|
125
|
+
"-": k("Minus"), "=": k("Equal"), "[": k("BracketLeft"), "]": k("BracketRight"),
|
|
126
|
+
"\\": k("Backslash"), ";": k("Semicolon"), "'": k("Quote"), "`": k("Backquote"),
|
|
127
|
+
",": k("Comma"), ".": k("Period"), "/": k("Slash"),
|
|
128
|
+
"_": k("Minus", true), "+": k("Equal", true), "{": k("BracketLeft", true), "}": k("BracketRight", true),
|
|
129
|
+
"|": k("Backslash", true), ":": k("Semicolon", true), '"': k("Quote", true), "~": k("Backquote", true),
|
|
130
|
+
"<": k("Comma", true), ">": k("Period", true), "?": k("Slash", true),
|
|
131
|
+
});
|
|
132
|
+
/*
|
|
133
|
+
* JIS (106/109-key Japanese) layout. The digit-row Shift symbols diverge
|
|
134
|
+
* from US starting at "2", and most punctuation keys produce entirely
|
|
135
|
+
* different characters since JIS reassigns several positions and adds
|
|
136
|
+
* IntlRo (no US equivalent) to the layout. Every mapping below (including
|
|
137
|
+
* the one exception noted at the "¥" omission) is confirmed against real
|
|
138
|
+
* JIS keyboard hardware - see test/REALWORLD_TESTING.md and
|
|
139
|
+
* test/realworld_jis_layout_test.mjs.
|
|
140
|
+
*/
|
|
141
|
+
const JIS_TABLE = Object.freeze({
|
|
142
|
+
...usAsciiLetters(),
|
|
143
|
+
...usAsciiDigits(),
|
|
144
|
+
"!": k("Digit1", true), '"': k("Digit2", true), "#": k("Digit3", true), "$": k("Digit4", true), "%": k("Digit5", true),
|
|
145
|
+
"&": k("Digit6", true), "'": k("Digit7", true), "(": k("Digit8", true), ")": k("Digit9", true),
|
|
146
|
+
// Digit0 has no standard Shift symbol on JIS - omitted (unsupported).
|
|
147
|
+
"-": k("Minus"), "^": k("Equal"), "@": k("BracketLeft"), "[": k("BracketRight"),
|
|
148
|
+
"]": k("Backslash"), ";": k("Semicolon"), ":": k("Quote"),
|
|
149
|
+
",": k("Comma"), ".": k("Period"), "/": k("Slash"),
|
|
150
|
+
"\\": k("IntlRo"),
|
|
151
|
+
// No mapping for "¥" (U+00A5): confirmed on real hardware that pressing
|
|
152
|
+
// IntlYen unshifted sends ASCII backslash (U+005C), the same character
|
|
153
|
+
// IntlRo unshifted already produces - a long-standing Windows JIS-driver
|
|
154
|
+
// quirk (the Yen key has never sent the true yen sign character, for
|
|
155
|
+
// historical Shift-JIS/CP932 compatibility reasons), not a bug here.
|
|
156
|
+
// There is no key combination that types an actual U+00A5 on this
|
|
157
|
+
// layout, so it's simply unsupported here; the physical key can still
|
|
158
|
+
// be pressed directly via press_key({key:"IntlYen"}).
|
|
159
|
+
"=": k("Minus", true), "~": k("Equal", true), "`": k("BracketLeft", true), "{": k("BracketRight", true),
|
|
160
|
+
"}": k("Backslash", true), "+": k("Semicolon", true), "*": k("Quote", true),
|
|
161
|
+
"<": k("Comma", true), ">": k("Period", true), "?": k("Slash", true),
|
|
162
|
+
"_": k("IntlRo", true), "|": k("IntlYen", true),
|
|
163
|
+
});
|
|
164
|
+
/*
|
|
165
|
+
* German (QWERTZ, "Germany" layout, LANGID 0x0407). NOT confirmed against
|
|
166
|
+
* real hardware - see the KeyboardLayoutId doc comment above. Base +
|
|
167
|
+
* Shift levels only; dead keys (´ on Equal, ^ on Backquote) and AltGr-
|
|
168
|
+
* level characters (@ € etc.) are unsupported.
|
|
169
|
+
*/
|
|
170
|
+
const DE_TABLE = Object.freeze({
|
|
171
|
+
...usAsciiLetters(),
|
|
172
|
+
...usAsciiDigits(),
|
|
173
|
+
// Y/Z swapped relative to US (physical position, not character).
|
|
174
|
+
y: k("KeyZ"), Y: k("KeyZ", true), z: k("KeyY"), Z: k("KeyY", true),
|
|
175
|
+
"!": k("Digit1", true), '"': k("Digit2", true), "§": k("Digit3", true), "$": k("Digit4", true), "%": k("Digit5", true),
|
|
176
|
+
"&": k("Digit6", true), "/": k("Digit7", true), "(": k("Digit8", true), ")": k("Digit9", true), "=": k("Digit0", true),
|
|
177
|
+
"ß": k("Minus"), "?": k("Minus", true),
|
|
178
|
+
"ü": k("BracketLeft"), "Ü": k("BracketLeft", true),
|
|
179
|
+
"+": k("BracketRight"), "*": k("BracketRight", true),
|
|
180
|
+
"ö": k("Semicolon"), "Ö": k("Semicolon", true),
|
|
181
|
+
"ä": k("Quote"), "Ä": k("Quote", true),
|
|
182
|
+
"°": k("Backquote", true), // Backquote unshifted is the dead "^" (circumflex) - unsupported.
|
|
183
|
+
"#": k("Backslash"), "'": k("Backslash", true),
|
|
184
|
+
"<": k("IntlBackslash"), ">": k("IntlBackslash", true),
|
|
185
|
+
",": k("Comma"), ";": k("Comma", true),
|
|
186
|
+
".": k("Period"), ":": k("Period", true),
|
|
187
|
+
"-": k("Slash"), "_": k("Slash", true),
|
|
188
|
+
});
|
|
189
|
+
/*
|
|
190
|
+
* French (AZERTY, "France" layout, LANGID 0x040C). NOT confirmed against
|
|
191
|
+
* real hardware. Base + Shift levels only; dead keys (^ on BracketLeft, ¨
|
|
192
|
+
* AltGr) and AltGr-level characters (€ etc.) are unsupported. Note the
|
|
193
|
+
* AZERTY-specific quirk that digits require Shift (the unshifted digit
|
|
194
|
+
* row types symbols instead).
|
|
195
|
+
*/
|
|
196
|
+
const FR_TABLE = Object.freeze({
|
|
197
|
+
// Letters: mostly QWERTY positions, but A<->Q and W<->Z swap, and "M"
|
|
198
|
+
// moves to the Semicolon position (French has no letter at KeyM).
|
|
199
|
+
a: k("KeyQ"), A: k("KeyQ", true), q: k("KeyA"), Q: k("KeyA", true),
|
|
200
|
+
z: k("KeyW"), Z: k("KeyW", true), w: k("KeyZ"), W: k("KeyZ", true),
|
|
201
|
+
m: k("Semicolon"), M: k("Semicolon", true),
|
|
202
|
+
e: k("KeyE"), E: k("KeyE", true), r: k("KeyR"), R: k("KeyR", true), t: k("KeyT"), T: k("KeyT", true),
|
|
203
|
+
y: k("KeyY"), Y: k("KeyY", true), u: k("KeyU"), U: k("KeyU", true), i: k("KeyI"), I: k("KeyI", true),
|
|
204
|
+
o: k("KeyO"), O: k("KeyO", true), p: k("KeyP"), P: k("KeyP", true),
|
|
205
|
+
s: k("KeyS"), S: k("KeyS", true), d: k("KeyD"), D: k("KeyD", true), f: k("KeyF"), F: k("KeyF", true),
|
|
206
|
+
g: k("KeyG"), G: k("KeyG", true), h: k("KeyH"), H: k("KeyH", true), j: k("KeyJ"), J: k("KeyJ", true),
|
|
207
|
+
k: k("KeyK"), K: k("KeyK", true), l: k("KeyL"), L: k("KeyL", true),
|
|
208
|
+
x: k("KeyX"), X: k("KeyX", true), c: k("KeyC"), C: k("KeyC", true), v: k("KeyV"), V: k("KeyV", true),
|
|
209
|
+
b: k("KeyB"), B: k("KeyB", true), n: k("KeyN"), N: k("KeyN", true),
|
|
210
|
+
// Digits require Shift on AZERTY; unshifted digit row types symbols.
|
|
211
|
+
"&": k("Digit1"), "1": k("Digit1", true),
|
|
212
|
+
"é": k("Digit2"), "2": k("Digit2", true),
|
|
213
|
+
'"': k("Digit3"), "3": k("Digit3", true),
|
|
214
|
+
"'": k("Digit4"), "4": k("Digit4", true),
|
|
215
|
+
"(": k("Digit5"), "5": k("Digit5", true),
|
|
216
|
+
"-": k("Digit6"), "6": k("Digit6", true),
|
|
217
|
+
"è": k("Digit7"), "7": k("Digit7", true),
|
|
218
|
+
"_": k("Digit8"), "8": k("Digit8", true),
|
|
219
|
+
"ç": k("Digit9"), "9": k("Digit9", true),
|
|
220
|
+
"à": k("Digit0"), "0": k("Digit0", true),
|
|
221
|
+
")": k("Minus"), "°": k("Minus", true),
|
|
222
|
+
"=": k("Equal"), "+": k("Equal", true),
|
|
223
|
+
"$": k("BracketRight"), // BracketLeft unshifted is the dead "^" circumflex - unsupported.
|
|
224
|
+
"ù": k("Quote"), "%": k("Quote", true),
|
|
225
|
+
"*": k("Backslash"), "µ": k("Backslash", true),
|
|
226
|
+
",": k("KeyM"), "?": k("KeyM", true),
|
|
227
|
+
";": k("Comma"), ".": k("Comma", true),
|
|
228
|
+
":": k("Period"), "/": k("Period", true),
|
|
229
|
+
"!": k("Slash"), "§": k("Slash", true),
|
|
230
|
+
"<": k("IntlBackslash"), ">": k("IntlBackslash", true),
|
|
231
|
+
});
|
|
232
|
+
/*
|
|
233
|
+
* Russian (ЙЦУКЕН layout, LANGID 0x0419). NOT confirmed against real
|
|
234
|
+
* hardware - letter positions are the well-standardized part; some
|
|
235
|
+
* punctuation-key details (marked below) are lower-confidence.
|
|
236
|
+
*/
|
|
237
|
+
const RU_TABLE = Object.freeze({
|
|
238
|
+
...usAsciiDigits(),
|
|
239
|
+
"!": k("Digit1", true), '"': k("Digit2", true), "№": k("Digit3", true), ";": k("Digit4", true), "%": k("Digit5", true),
|
|
240
|
+
":": k("Digit6", true), "?": k("Digit7", true), "*": k("Digit8", true), "(": k("Digit9", true), ")": k("Digit0", true),
|
|
241
|
+
"-": k("Minus"), "_": k("Minus", true), "=": k("Equal"), "+": k("Equal", true),
|
|
242
|
+
й: k("KeyQ"), Й: k("KeyQ", true), ц: k("KeyW"), Ц: k("KeyW", true), у: k("KeyE"), У: k("KeyE", true),
|
|
243
|
+
к: k("KeyR"), К: k("KeyR", true), е: k("KeyT"), Е: k("KeyT", true), н: k("KeyY"), Н: k("KeyY", true),
|
|
244
|
+
г: k("KeyU"), Г: k("KeyU", true), ш: k("KeyI"), Ш: k("KeyI", true), щ: k("KeyO"), Щ: k("KeyO", true),
|
|
245
|
+
з: k("KeyP"), З: k("KeyP", true), х: k("BracketLeft"), Х: k("BracketLeft", true),
|
|
246
|
+
ъ: k("BracketRight"), Ъ: k("BracketRight", true),
|
|
247
|
+
ф: k("KeyA"), Ф: k("KeyA", true), ы: k("KeyS"), Ы: k("KeyS", true), в: k("KeyD"), В: k("KeyD", true),
|
|
248
|
+
а: k("KeyF"), А: k("KeyF", true), п: k("KeyG"), П: k("KeyG", true), р: k("KeyH"), Р: k("KeyH", true),
|
|
249
|
+
о: k("KeyJ"), О: k("KeyJ", true), л: k("KeyK"), Л: k("KeyK", true), д: k("KeyL"), Д: k("KeyL", true),
|
|
250
|
+
ж: k("Semicolon"), Ж: k("Semicolon", true), э: k("Quote"), Э: k("Quote", true),
|
|
251
|
+
"\\": k("Backslash"), "/": k("Backslash", true), // lower confidence
|
|
252
|
+
я: k("KeyZ"), Я: k("KeyZ", true), ч: k("KeyX"), Ч: k("KeyX", true), с: k("KeyC"), С: k("KeyC", true),
|
|
253
|
+
м: k("KeyV"), М: k("KeyV", true), и: k("KeyB"), И: k("KeyB", true), т: k("KeyN"), Т: k("KeyN", true),
|
|
254
|
+
ь: k("KeyM"), Ь: k("KeyM", true), б: k("Comma"), Б: k("Comma", true), ю: k("Period"), Ю: k("Period", true),
|
|
255
|
+
".": k("Slash"), ",": k("Slash", true), // lower confidence
|
|
256
|
+
});
|
|
257
|
+
/*
|
|
258
|
+
* Korean 2-beolsik (2-set) jamo keyboard, LANGID 0x0412 - explicit-only,
|
|
259
|
+
* never auto-detected (see KeyboardLayoutId doc comment). Produces
|
|
260
|
+
* standalone Hangul Compatibility Jamo (U+3131-U+318E), NOT IME-composed
|
|
261
|
+
* syllable blocks - typing "r" + "k" gives "ㄱㅏ" (two separate jamo
|
|
262
|
+
* characters), not the composed syllable "가". Composing jamo into
|
|
263
|
+
* syllables is IME work, out of scope. Digits pass through unshifted
|
|
264
|
+
* like every other layout; punctuation is not tabled (Korean keyboards
|
|
265
|
+
* use the same punctuation regardless of Hangul/English mode, so callers
|
|
266
|
+
* needing ASCII punctuation alongside jamo should switch `layout` per
|
|
267
|
+
* call, or a future version could merge in US's punctuation directly).
|
|
268
|
+
*/
|
|
269
|
+
const KO_TABLE = Object.freeze({
|
|
270
|
+
...usAsciiDigits(),
|
|
271
|
+
ㅂ: k("KeyQ"), ㅃ: k("KeyQ", true), ㅈ: k("KeyW"), ㅉ: k("KeyW", true),
|
|
272
|
+
ㄷ: k("KeyE"), ㄸ: k("KeyE", true), ㄱ: k("KeyR"), ㄲ: k("KeyR", true),
|
|
273
|
+
ㅅ: k("KeyT"), ㅆ: k("KeyT", true), ㅛ: k("KeyY"), ㅕ: k("KeyU"), ㅑ: k("KeyI"),
|
|
274
|
+
ㅐ: k("KeyO"), ㅒ: k("KeyO", true), ㅔ: k("KeyP"), ㅖ: k("KeyP", true),
|
|
275
|
+
ㅁ: k("KeyA"), ㄴ: k("KeyS"), ㅇ: k("KeyD"), ㄹ: k("KeyF"), ㅎ: k("KeyG"),
|
|
276
|
+
ㅗ: k("KeyH"), ㅓ: k("KeyJ"), ㅏ: k("KeyK"), ㅣ: k("KeyL"),
|
|
277
|
+
ㅋ: k("KeyZ"), ㅌ: k("KeyX"), ㅊ: k("KeyC"), ㅍ: k("KeyV"),
|
|
278
|
+
ㅠ: k("KeyB"), ㅜ: k("KeyN"), ㅡ: k("KeyM"),
|
|
279
|
+
});
|
|
280
|
+
/*
|
|
281
|
+
* Taiwan Zhuyin/Bopomofo standard keyboard, LANGID 0x0404 (zh-TW) -
|
|
282
|
+
* explicit-only, never auto-detected, for the same reason as Korean
|
|
283
|
+
* above. Produces standalone Bopomofo symbols (U+3105-U+312F range) and
|
|
284
|
+
* tone marks, NOT IME-composed Han characters - composing these into
|
|
285
|
+
* actual Chinese characters is IME work, out of scope.
|
|
286
|
+
*/
|
|
287
|
+
const TW_TABLE = Object.freeze({
|
|
288
|
+
...usAsciiDigits(),
|
|
289
|
+
ㄅ: k("Digit1"), ㄉ: k("Digit2"), ˇ: k("Digit3"), ˋ: k("Digit4"), ㄓ: k("Digit5"),
|
|
290
|
+
ˊ: k("Digit6"), "˙": k("Digit7"), ㄚ: k("Digit8"), ㄞ: k("Digit9"), ㄢ: k("Digit0"),
|
|
291
|
+
ㄦ: k("Minus"),
|
|
292
|
+
ㄆ: k("KeyQ"), ㄊ: k("KeyW"), ㄍ: k("KeyE"), ㄐ: k("KeyR"), ㄔ: k("KeyT"),
|
|
293
|
+
ㄗ: k("KeyY"), ㄧ: k("KeyU"), ㄛ: k("KeyI"), ㄟ: k("KeyO"), ㄣ: k("KeyP"),
|
|
294
|
+
ㄇ: k("KeyA"), ㄋ: k("KeyS"), ㄎ: k("KeyD"), ㄑ: k("KeyF"), ㄕ: k("KeyG"),
|
|
295
|
+
ㄖ: k("KeyH"), ㄨ: k("KeyJ"), ㄜ: k("KeyK"), ㄠ: k("KeyL"), ㄤ: k("Semicolon"),
|
|
296
|
+
ㄈ: k("KeyZ"), ㄌ: k("KeyX"), ㄏ: k("KeyC"), ㄒ: k("KeyV"), ㄘ: k("KeyB"),
|
|
297
|
+
ㄙ: k("KeyN"), ㄩ: k("KeyM"), ㄝ: k("Comma"), ㄡ: k("Period"), ㄥ: k("Slash"),
|
|
298
|
+
});
|
|
299
|
+
const LAYOUT_TABLES = Object.freeze({
|
|
300
|
+
us: US_TABLE,
|
|
301
|
+
jis: JIS_TABLE,
|
|
302
|
+
de: DE_TABLE,
|
|
303
|
+
fr: FR_TABLE,
|
|
304
|
+
ru: RU_TABLE,
|
|
305
|
+
ko: KO_TABLE,
|
|
306
|
+
tw: TW_TABLE,
|
|
307
|
+
});
|
|
308
|
+
/**
|
|
309
|
+
* Resolves a single character to the physical key that types it and
|
|
310
|
+
* whether Shift is required, for the given keyboard layout (default
|
|
311
|
+
* "us"). Returns null for characters that cannot be typed this way
|
|
312
|
+
* (dead-key/AltGr/IME-composed characters, or anything outside that
|
|
313
|
+
* layout's table).
|
|
314
|
+
*/
|
|
315
|
+
export function charToKeyEvent(ch, layout = "us") {
|
|
316
|
+
if (ch === " ")
|
|
317
|
+
return { key: "Space", shift: false };
|
|
318
|
+
if (ch === "\n" || ch === "\r")
|
|
319
|
+
return { key: "Enter", shift: false };
|
|
320
|
+
if (ch === "\t")
|
|
321
|
+
return { key: "Tab", shift: false };
|
|
322
|
+
const entry = LAYOUT_TABLES[layout][ch];
|
|
323
|
+
return entry ?? null;
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=keycodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycodes.js","sourceRoot":"","sources":["../src/keycodes.ts"],"names":[],"mappings":"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CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC;IAC1C,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC;IACpG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC;IACpG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC;IAClE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC;IACpG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC;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"}
|
package/dist/safety.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safety gate for input-injection tools: requires an explicit "arm" call
|
|
3
|
+
* before any tool can send synthetic input, and enforces a sliding-window
|
|
4
|
+
* rate limit so a runaway/prompt-injected agent cannot flood input.
|
|
5
|
+
* See the "セーフティ設計" section of the project plan.
|
|
6
|
+
*/
|
|
7
|
+
export class NotArmedError extends Error {
|
|
8
|
+
constructor() {
|
|
9
|
+
super("Input control is not armed. Call the 'enable_input_control' tool once per session before sending any key/mouse input.");
|
|
10
|
+
this.name = "NotArmedError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class RateLimitError extends Error {
|
|
14
|
+
constructor(maxEvents, windowMs) {
|
|
15
|
+
super(`Rate limit exceeded: max ${maxEvents} input events per ${windowMs}ms. Slow down and retry.`);
|
|
16
|
+
this.name = "RateLimitError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export const DEFAULT_SAFETY_OPTIONS = {
|
|
20
|
+
maxEventsPerWindow: 500,
|
|
21
|
+
windowMs: 10_000,
|
|
22
|
+
};
|
|
23
|
+
export class SafetyGate {
|
|
24
|
+
options;
|
|
25
|
+
armed = false;
|
|
26
|
+
timestamps = [];
|
|
27
|
+
constructor(options = DEFAULT_SAFETY_OPTIONS) {
|
|
28
|
+
this.options = options;
|
|
29
|
+
}
|
|
30
|
+
arm() {
|
|
31
|
+
this.armed = true;
|
|
32
|
+
}
|
|
33
|
+
disarm() {
|
|
34
|
+
this.armed = false;
|
|
35
|
+
this.timestamps = [];
|
|
36
|
+
}
|
|
37
|
+
isArmed() {
|
|
38
|
+
return this.armed;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Must be called before every synthetic input event (or once with
|
|
42
|
+
* `cost` = event count for a batch like type_text). Throws if the
|
|
43
|
+
* session is not armed or the rate limit would be exceeded; otherwise
|
|
44
|
+
* records the event(s).
|
|
45
|
+
*/
|
|
46
|
+
checkAndConsume(cost = 1) {
|
|
47
|
+
if (!this.armed) {
|
|
48
|
+
throw new NotArmedError();
|
|
49
|
+
}
|
|
50
|
+
const now = Date.now();
|
|
51
|
+
const cutoff = now - this.options.windowMs;
|
|
52
|
+
this.timestamps = this.timestamps.filter((t) => t > cutoff);
|
|
53
|
+
if (this.timestamps.length + cost > this.options.maxEventsPerWindow) {
|
|
54
|
+
throw new RateLimitError(this.options.maxEventsPerWindow, this.options.windowMs);
|
|
55
|
+
}
|
|
56
|
+
for (let i = 0; i < cost; i++)
|
|
57
|
+
this.timestamps.push(now);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../src/safety.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC;QACE,KAAK,CACH,uHAAuH,CACxH,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,SAAiB,EAAE,QAAgB;QAC7C,KAAK,CAAC,4BAA4B,SAAS,qBAAqB,QAAQ,0BAA0B,CAAC,CAAC;QACpG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AASD,MAAM,CAAC,MAAM,sBAAsB,GAAsB;IACvD,kBAAkB,EAAE,GAAG;IACvB,QAAQ,EAAE,MAAM;CACjB,CAAC;AAEF,MAAM,OAAO,UAAU;IAIQ;IAHrB,KAAK,GAAG,KAAK,CAAC;IACd,UAAU,GAAa,EAAE,CAAC;IAElC,YAA6B,UAA6B,sBAAsB;QAAnD,YAAO,GAAP,OAAO,CAA4C;IAAG,CAAC;IAEpF,GAAG;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACH,eAAe,CAAC,IAAI,GAAG,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,aAAa,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;YACpE,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnF,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3D,CAAC;CACF"}
|