@remcp/runtime 0.2.88 → 0.2.89

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.89 — 2026-09-21
4
+
5
+ - EIS direct typing preflights every character before dispatch, so unsupported Unicode fails before any partial keyboard mutation.
6
+ - Added regression coverage proving `abc✓` sends zero EIS events before the ASCII-only error.
7
+ - Compact and granular runtime catalogs remain unchanged; lockstep patch release at `0.2.89`.
8
+
3
9
  ## 0.2.88 — 2026-09-21
4
10
 
5
11
  - Added a real compact stdio façade over the same runtime handlers: `read_file` plus up to seven capability-filtered `verb_noun` domain tools.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remcp/runtime",
3
- "version": "0.2.88",
3
+ "version": "0.2.89",
4
4
  "description": "First-party ReMCP local device runtime: filesystem, terminal, computer-use, browser, diagnostics and document tools over MCP.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -564,19 +564,25 @@ function eisStrokeForChar(char) {
564
564
 
565
565
  export async function portalTypeText(value, { delayMs = 1, timeoutMs, state: suppliedState } = {}) {
566
566
  const state = suppliedState || await ensureWaylandRemoteDesktop({ timeoutMs });
567
- for (const char of String(value ?? '')) {
568
- if (state.backend === 'xdg-eis') {
569
- const stroke = eisStrokeForChar(char);
570
- if (!stroke) throw new ToolError('EIS 1.2 direct typing supports ASCII only; use accessibility or clipboard-paste input for Unicode text');
567
+ const input = String(value ?? '');
568
+ if (state.backend === 'xdg-eis') {
569
+ const strokes = [...input].map(eisStrokeForChar);
570
+ if (strokes.some(stroke => !stroke)) {
571
+ throw new ToolError('EIS 1.2 direct typing supports ASCII only; use accessibility or clipboard-paste input for Unicode text');
572
+ }
573
+ for (const stroke of strokes) {
571
574
  if (stroke.shift) await notifyKeycode(state, 42, 1);
572
575
  await notifyKeycode(state, stroke.keycode, 1);
573
576
  await notifyKeycode(state, stroke.keycode, 0);
574
577
  if (stroke.shift) await notifyKeycode(state, 42, 0);
575
- } else {
578
+ if (delayMs > 0) await new Promise(resolve => setTimeout(resolve, Math.min(1000, delayMs)));
579
+ }
580
+ return;
581
+ }
582
+ for (const char of input) {
576
583
  const keysym = char === '\n' ? 0xff0d : char === '\t' ? 0xff09 : keysymForToken(char);
577
584
  await notifyKeysym(state, keysym, 1);
578
585
  await notifyKeysym(state, keysym, 0);
579
- }
580
586
  if (delayMs > 0) await new Promise(resolve => setTimeout(resolve, Math.min(1000, delayMs)));
581
587
  }
582
588
  }