@remcp/runtime 0.2.125 → 0.2.127

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,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.127 — 2026-10-01
4
+
5
+ - macOS `network listeners` now returns only TCP `LISTEN` rows from the native network table instead of all active connections.
6
+ - Established/closing and Unix-domain rows are filtered out, aligning macOS with the documented listener-only contract.
7
+ - The macOS release CI runs the routing + listener diagnostics test on `macos-latest`. Tool names and schemas remain unchanged.
8
+
9
+ ## 0.2.126 — 2026-10-01
10
+
11
+ - macOS `network` route inventory now uses `/usr/sbin/netstat -rn`; the previous generic Unix fallback invoked `route -n`, which on BSD/macOS expects a command and can return usage instead of the table.
12
+ - Linux and Windows network backends are unchanged.
13
+ - The public macOS release gate executes the real route handler on `macos-latest`. The 83 tool names/schemas remain unchanged.
14
+
3
15
  ## 0.2.125 — 2026-10-01
4
16
 
5
17
  - Windows `audio` now controls the default render endpoint through the native Core Audio `IAudioEndpointVolume` interface hosted by inbox PowerShell `Add-Type`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remcp/runtime",
3
- "version": "0.2.125",
3
+ "version": "0.2.127",
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",
@@ -108,6 +108,13 @@ export async function eventLog(args) {
108
108
  return text(rendered, result.code !== 0 && !result.stdout.trim());
109
109
  }
110
110
 
111
+ export function filterMacosTcpListeners(output) {
112
+ const lines = String(output || '').split(/\r?\n/);
113
+ const header = lines.filter(line => /^Proto\s+/i.test(line) || /^Active Internet connections/i.test(line));
114
+ const listeners = lines.filter(line => /\bLISTEN\b/i.test(line));
115
+ return [...header, ...listeners].join('\n').trim();
116
+ }
117
+
111
118
  async function connectivityTest(host, port, timeoutMs) {
112
119
  return new Promise(resolve => {
113
120
  const started = performance.now();
@@ -135,6 +142,13 @@ export async function networkTool(args) {
135
142
  : 'Get-NetTCPConnection -State Listen | Select-Object LocalAddress,LocalPort,OwningProcess,State | Sort-Object LocalPort | ConvertTo-Json -Compress';
136
143
  return text((await runPowerShell(script, { label:`network ${action}` })).stdout.trim() || '[]');
137
144
  }
145
+ if (process.platform === 'darwin' && action === 'routes') {
146
+ return text((await runFile('/usr/sbin/netstat', ['-rn'], { label:'routes' })).stdout);
147
+ }
148
+ if (process.platform === 'darwin' && action === 'listeners') {
149
+ const { stdout } = await runFile('/usr/sbin/netstat', ['-an', '-p', 'tcp'], { label:'listeners' });
150
+ return text(filterMacosTcpListeners(stdout));
151
+ }
138
152
  if (action === 'routes') {
139
153
  if (commandExists('ip')) return text((await runFile('ip', ['route','show'], { label:'routes' })).stdout);
140
154
  if (commandExists('route')) return text((await runFile('route', ['-n'], { label:'routes' })).stdout);