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.
@@ -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"}