@remcp/runtime 0.2.101 → 0.2.102

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,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.102 — 2026-09-22
4
+
5
+ - `runWithInput` installs a stdin error handler before writing input, so an early child pipe close is returned as a `ToolError` instead of an uncaught `EPIPE` that can terminate the runtime.
6
+ - A failed input pipe now terminates the child before rejecting, preventing a rejected call from leaving an orphan process behind.
7
+ - Empty input closes stdin without a zero-byte write, reducing races with short-lived subprocesses.
8
+ - Added a deterministic closed-stdin regression and stress coverage; runtime tool names and schemas are unchanged.
9
+
3
10
  ## 0.2.101 — 2026-09-22
4
11
 
5
12
  - macOS `record_screen` resolves FFmpeg from standard Homebrew locations when launchd's minimal `PATH` cannot see it.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remcp/runtime",
3
- "version": "0.2.101",
3
+ "version": "0.2.102",
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",
@@ -98,7 +98,14 @@ export async function runWithInput(file, args = [], input = '', options = {}) {
98
98
  if (code === 0 || options.allowFailure) finish(resolve, { stdout, stderr, code });
99
99
  else finish(reject, new ToolError(`${options.label || file} failed: ${stderr.trim() || `exit ${code}`}`));
100
100
  });
101
- child.stdin.end(String(input));
101
+ child.stdin.on('error', error => {
102
+ if (settled) return;
103
+ child.kill('SIGKILL');
104
+ finish(reject, new ToolError(`${options.label || file} input failed: ${error.message}`));
105
+ });
106
+ const inputText = String(input);
107
+ if (inputText.length) child.stdin.end(inputText);
108
+ else child.stdin.end();
102
109
  });
103
110
  }
104
111