@remcp/runtime 0.2.88 → 0.2.90

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,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.90 — 2026-09-21
4
+
5
+ - Updated README tool-count documentation to the current 15 hosted / 10 model-visible / 5 app-only / 83 granular runtime architecture.
6
+ - Clarified the separate compact local stdio surface of up to 8 tools.
7
+ - Added regression coverage that rejects obsolete 94/91 hosted counts.
8
+ - Runtime behavior and tool schemas are unchanged; lockstep documentation patch at `0.2.90`.
9
+
10
+ ## 0.2.89 — 2026-09-21
11
+
12
+ - EIS direct typing preflights every character before dispatch, so unsupported Unicode fails before any partial keyboard mutation.
13
+ - Added regression coverage proving `abc✓` sends zero EIS events before the ASCII-only error.
14
+ - Compact and granular runtime catalogs remain unchanged; lockstep patch release at `0.2.89`.
15
+
3
16
  ## 0.2.88 — 2026-09-21
4
17
 
5
18
  - 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/README.md CHANGED
@@ -52,11 +52,13 @@ support and emits `notifications/tools/list_changed` when that capability set ch
52
52
  | Diagnostics | `service`, `event_log`, `network`, `installed_apps`, `environment`, `audio`, `power_action`, `record_screen` |
53
53
  | Documents | `read_document`, `edit_spreadsheet`, `edit_document`, `pdf_action` |
54
54
 
55
- The hosted ReMCP endpoint adds eleven account/presentation tools — `list_devices`, `ping_device`,
56
- `who_am_i`, `create_pairing_command`, `get_recent_tool_calls`, `get_usage_statistics`,
57
- `get_configuration`, `render_file_preview`, `render_image_preview`, `render_terminal_preview`, and
58
- `rename_device` — for a 94-tool MCP Apps catalog. Native-only deployments receive 91 tools because the
59
- three presentation-only render tools are disabled by configuration.
55
+ The hosted ReMCP endpoint does not append those 83 granular operation names to its discovery list.
56
+ It exposes **15 hosted tool definitions** with widgets enabled: **10 model-visible** definitions
57
+ (8 device-facing façade tools plus 2 account/fleet tools) and **5 app-only** UI helpers. Those compact
58
+ definitions route to the same **83 granular runtime operations** after the selected computer's live
59
+ capabilities are checked. With `REMCP_CUSTOM_WIDGETS_ENABLED=false`, hosted discovery exposes the same
60
+ 10 model-visible definitions without the five app-only helpers. Cached legacy clients can still call
61
+ supported granular aliases without inflating discovery for new clients.
60
62
 
61
63
  `computer_snapshot` and `computer_action` keep OCR inside the compact high-level surface: when a local `tesseract` binary is available, snapshot can return bounded OCR text/boxes and click targeting can fall back through Accessibility → browser DOM/CDP → OCR → coordinates. OCR is optional and never adds another MCP tool or bundled OCR dependency.
62
64
 
@@ -76,9 +78,11 @@ A running device can advertise a smaller capability-aware subset; the runtime de
76
78
  agent forwards the refreshed tool names to the hosted relay. Browser/CDP tools are the primary dynamic
77
79
  example: they are enabled only while the runtime can use a supported loopback browser endpoint.
78
80
 
79
- The generated hosted reference covers the full **94-tool production surface** with custom widgets enabled: 83 device tools,
80
- 8 account/fleet tools, and 3 chat-presentation tools. Setting `REMCP_CUSTOM_WIDGETS_ENABLED=false` on the hosted server exposes
81
- the 91-tool native-only surface. See https://remcp.site/docs#tools and public `docs/TOOLS.md`.
81
+ The generated hosted reference covers the current **15 hosted tool definitions**: 10 model-visible
82
+ definitions plus 5 app-only helpers, all routing to the 83 granular runtime operations described above.
83
+ The separate compact local stdio entrypoint advertises `read_file` plus up to seven domain tools
84
+ (up to 8 tools total) while the paired agent keeps using the capability-aware granular runtime.
85
+ See https://remcp.site/docs#tools and public `docs/TOOLS.md`.
82
86
 
83
87
  ## No approval staircase
84
88
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remcp/runtime",
3
- "version": "0.2.88",
3
+ "version": "0.2.90",
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
  }