remote-access-mcp 3.1.0 → 3.1.1

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,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.1.1 - Security & Reliability Hardening
4
+
5
+ ### Fixed
6
+ - Hardened command allowlists against shell chaining, redirection, substitution and other operator-based bypasses.
7
+ - Removed production dependency audit findings by pinning the vulnerable `qs` transitive dependency through an npm override.
8
+ - Hardened managed filesystem change sets with pre-mutation capture, create/delete tracking and resumable rollback.
9
+ - Made background job persistence safe across concurrent gateway processes with locking, merged writes and live-owner protection.
10
+ - Made shell approvals durable across restarts and bound them to the exact command and working directory.
11
+ - Approvals are now atomically single-use and record the approving token fingerprint.
12
+ - Required explicit `trusted: true` for local plugins and prevented plugin entrypoints from escaping their plugin directory.
13
+ - Implemented the `ramcp://audit` resource instead of returning a placeholder.
14
+
15
+ ### Security notes
16
+ - Plugins remain an explicitly trusted in-process extension mechanism; they are not a sandbox.
17
+ - Health watchers persist their configuration and recover after gateway restart; a single live gateway process owns each watcher, and they remain application-level timers rather than OS services.
18
+
19
+
3
20
  ## 3.1.0 - Parallel Workers & Agent Operations
4
21
 
5
22
  ### Added
package/README.md CHANGED
@@ -29,15 +29,15 @@ Remote Access MCP includes a bounded local worker pool for long-running or paral
29
29
 
30
30
  - Binary-safe `upload_file` / `download_file` with size limits and SHA-256 verification.
31
31
  - Approval-required shell mode and command allowlists.
32
- - Transaction-style change sets with backup and rollback.
32
+ - Managed filesystem change sets with durable pre-mutation capture, create/delete tracking, resumable rollback, and atomic per-path restore.
33
33
  - Token roles: `auditor`, `developer`, `deployer`, `admin`.
34
34
 
35
35
  ## Diagnostics & extensibility
36
36
 
37
- - Structured system/service diagnostics and health watchers with webhook alerts.
37
+ - Structured system/service diagnostics and persistent health watchers with webhook alerts.
38
38
  - MySQL/PostgreSQL/Redis query and schema tools using credentials held in environment variables.
39
39
  - MCP Resources and Prompts for operational context.
40
- - Trusted local plugin manifests and lifecycle management.
40
+ - Trusted local plugin manifests and lifecycle management; plugins must explicitly declare `trusted: true` and execute in-process, so only install code you trust.
41
41
 
42
42
  ## Install
43
43
 
@@ -214,7 +214,7 @@ ramcp config import backup.json --merge # union: keeps local identity, adds ne
214
214
  - **Per-token scopes + read-only + rate limit + expiry.** Least privilege by construction.
215
215
  - **SSRF guards** on all outbound fetch tools — the AI can't reach your metadata endpoints or internal services.
216
216
  - **Injection guards.** git verbs whitelisted, SQL single-statement, ATTACH blocked, unit names validated.
217
- - **Tamper-evident audit.** Every tool invocation → SQLite with a hash chain; `ramcp audit --verify` detects deletions/edits. Secrets in arguments are redacted before storage.
217
+ - **Tamper-evident audit.** Every tool invocation → append-only JSONL with a hash chain; `ramcp audit --verify` detects deletions/edits. Secrets in arguments are redacted before storage.
218
218
  - **Hot-reload.** Policy edits apply on the next request — no restart, no downtime.
219
219
  - **Global read-only** kill-switch: `ramcp policy readonly on`.
220
220
 
@@ -4,9 +4,14 @@ export interface Approval {
4
4
  command: string;
5
5
  cwd?: string;
6
6
  created: string;
7
- status: 'pending' | 'approved' | 'rejected';
7
+ decided?: string;
8
+ decidedBy?: string;
9
+ consumed?: string;
10
+ status: 'pending' | 'approved' | 'rejected' | 'consumed';
8
11
  }
9
12
  export declare function requestApproval(tokenId: string, command: string, cwd?: string): Approval;
10
13
  export declare function getApproval(id: string, tokenId?: string): Approval | undefined;
11
- export declare function decideApproval(id: string, tokenId: string | undefined, approved: boolean): Approval | undefined;
14
+ export declare function decideApproval(id: string, tokenId: string | undefined, approved: boolean, decidedBy?: string | undefined): Approval | undefined;
15
+ /** Atomically consume an approval. The approval is bound to the exact command and cwd. */
16
+ export declare function consumeApproval(id: string, tokenId: string, command: string, cwd?: string): Approval | undefined;
12
17
  //# sourceMappingURL=approvals.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/core/approvals.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,QAAQ;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAC,UAAU,GAAC,UAAU,CAAC;CAAE;AAEnJ,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAA6J;AACtP,wBAAgB,WAAW,CAAC,EAAE,EAAC,MAAM,EAAE,OAAO,CAAC,EAAC,MAAM,GAAG,QAAQ,GAAC,SAAS,CAAyF;AACpK,wBAAgB,cAAc,CAAC,EAAE,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,GAAC,SAAS,EAAE,QAAQ,EAAC,OAAO,GAAG,QAAQ,GAAC,SAAS,CAAiI"}
1
+ {"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/core/approvals.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;CAC1D;AAoDD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAWxF;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAG9E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,qBAAU,GAAG,QAAQ,GAAG,SAAS,CAiBpI;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAYhH"}
@@ -1,7 +1,113 @@
1
1
  import crypto from 'node:crypto';
2
- const rows = new Map();
3
- export function requestApproval(tokenId, command, cwd) { const a = { id: crypto.randomUUID().slice(0, 12), tokenId, command, cwd, created: new Date().toISOString(), status: 'pending' }; rows.set(a.id, a); return a; }
4
- export function getApproval(id, tokenId) { const a = rows.get(id); return a && (!tokenId || a.tokenId === tokenId) ? a : undefined; }
5
- export function decideApproval(id, tokenId, approved) { const a = getApproval(id, tokenId); if (!a || a.status !== 'pending')
6
- return a; a.status = approved ? 'approved' : 'rejected'; return a; }
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { dataDir } from './platform.js';
5
+ const MAX_ROWS = 2000;
6
+ const LOCK_TIMEOUT_MS = 10_000;
7
+ const STALE_LOCK_MS = 30_000;
8
+ function storePath() { return path.join(dataDir(), 'approvals.json'); }
9
+ function lockPath() { return path.join(dataDir(), 'approvals.lock'); }
10
+ function load() {
11
+ try {
12
+ const raw = fs.readFileSync(storePath(), 'utf8');
13
+ const rows = JSON.parse(raw);
14
+ if (!Array.isArray(rows))
15
+ throw new Error('invalid approvals store');
16
+ return rows.filter((row) => row && typeof row === 'object' && typeof row.id === 'string' && typeof row.tokenId === 'string' && typeof row.command === 'string' && typeof row.created === 'string' && ['pending', 'approved', 'rejected', 'consumed'].includes(row.status));
17
+ }
18
+ catch (e) {
19
+ if (e?.code === 'ENOENT')
20
+ return [];
21
+ throw new Error(`failed to read approvals store: ${e?.message || e}`);
22
+ }
23
+ }
24
+ function withStoreLock(fn) {
25
+ const dir = path.dirname(storePath());
26
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
27
+ const lock = lockPath();
28
+ const started = Date.now();
29
+ while (true) {
30
+ try {
31
+ fs.mkdirSync(lock, { mode: 0o700 });
32
+ try {
33
+ return fn();
34
+ }
35
+ finally {
36
+ fs.rmSync(lock, { recursive: true, force: true });
37
+ }
38
+ }
39
+ catch (e) {
40
+ if (e?.code !== 'EEXIST')
41
+ throw e;
42
+ try {
43
+ if (Date.now() - fs.statSync(lock).mtimeMs > STALE_LOCK_MS)
44
+ fs.rmSync(lock, { recursive: true, force: true });
45
+ }
46
+ catch { /* lock disappeared; retry */ }
47
+ if (Date.now() - started > LOCK_TIMEOUT_MS)
48
+ throw new Error('timed out waiting for approvals persistence lock');
49
+ const until = Date.now() + 20;
50
+ while (Date.now() < until) { /* synchronous lock acquisition */ }
51
+ }
52
+ }
53
+ }
54
+ function saveUnlocked(rows) {
55
+ const target = storePath();
56
+ const tmp = `${target}.tmp-${process.pid}-${crypto.randomUUID()}`;
57
+ const retained = [...rows].sort((a, b) => a.created.localeCompare(b.created)).slice(-MAX_ROWS);
58
+ fs.writeFileSync(tmp, JSON.stringify(retained, null, 2), { mode: 0o600 });
59
+ fs.renameSync(tmp, target);
60
+ }
61
+ export function requestApproval(tokenId, command, cwd) {
62
+ const approval = {
63
+ id: crypto.randomUUID().slice(0, 12), tokenId, command, cwd,
64
+ created: new Date().toISOString(), status: 'pending',
65
+ };
66
+ withStoreLock(() => {
67
+ const rows = load();
68
+ rows.push(approval);
69
+ saveUnlocked(rows);
70
+ });
71
+ return { ...approval };
72
+ }
73
+ export function getApproval(id, tokenId) {
74
+ const approval = load().find(a => a.id === id);
75
+ return approval && (!tokenId || approval.tokenId === tokenId) ? { ...approval } : undefined;
76
+ }
77
+ export function decideApproval(id, tokenId, approved, decidedBy = tokenId) {
78
+ return withStoreLock(() => {
79
+ const rows = load();
80
+ const index = rows.findIndex(a => a.id === id && (!tokenId || a.tokenId === tokenId));
81
+ if (index < 0)
82
+ return undefined;
83
+ const current = rows[index];
84
+ if (current.status !== 'pending')
85
+ return { ...current };
86
+ const updated = {
87
+ ...current,
88
+ status: approved ? 'approved' : 'rejected',
89
+ decided: new Date().toISOString(),
90
+ decidedBy,
91
+ };
92
+ rows[index] = updated;
93
+ saveUnlocked(rows);
94
+ return { ...updated };
95
+ });
96
+ }
97
+ /** Atomically consume an approval. The approval is bound to the exact command and cwd. */
98
+ export function consumeApproval(id, tokenId, command, cwd) {
99
+ return withStoreLock(() => {
100
+ const rows = load();
101
+ const index = rows.findIndex(a => a.id === id && a.tokenId === tokenId);
102
+ if (index < 0)
103
+ return undefined;
104
+ const current = rows[index];
105
+ if (current.status !== 'approved' || current.command !== command || current.cwd !== cwd)
106
+ return undefined;
107
+ const updated = { ...current, status: 'consumed', consumed: new Date().toISOString() };
108
+ rows[index] = updated;
109
+ saveUnlocked(rows);
110
+ return { ...updated };
111
+ });
112
+ }
7
113
  //# sourceMappingURL=approvals.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/core/approvals.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;AACzC,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,OAAe,EAAE,GAAY,IAAc,MAAM,CAAC,GAAC,EAAC,EAAE,EAAC,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAC,EAAE,CAAC,EAAC,OAAO,EAAC,OAAO,EAAC,GAAG,EAAC,OAAO,EAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAC,MAAM,EAAC,SAAkB,EAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACtP,MAAM,UAAU,WAAW,CAAC,EAAS,EAAE,OAAe,IAAwB,MAAM,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACpK,MAAM,UAAU,cAAc,CAAC,EAAS,EAAE,OAAwB,EAAE,QAAgB,IAAwB,MAAM,CAAC,GAAC,WAAW,CAAC,EAAE,EAAC,OAAO,CAAC,CAAC,CAAC,IAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAG,SAAS;IAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAC,QAAQ,CAAA,CAAC,CAAA,UAAU,CAAA,CAAC,CAAA,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/core/approvals.ts"],"names":[],"mappings":"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"}
@@ -16,12 +16,16 @@ export interface JobRecord {
16
16
  timeoutMs: number;
17
17
  attempts: number;
18
18
  maxAttempts: number;
19
+ ownerId?: string;
20
+ ownerPid?: number;
19
21
  }
20
22
  export declare class JobManager {
21
23
  private jobs;
22
24
  private running;
23
25
  private queue;
26
+ private dirty;
24
27
  private readonly maxWorkers;
28
+ private readonly workerId;
25
29
  constructor(maxWorkers?: number);
26
30
  create(command: string, tokenId: string, cwd?: string, timeoutMs?: number, maxAttempts?: number): JobRecord;
27
31
  get(id: string, tokenId?: string): JobRecord | undefined;
@@ -29,6 +33,8 @@ export declare class JobManager {
29
33
  cancel(id: string, tokenId: string): boolean;
30
34
  shutdown(): void;
31
35
  private pump;
36
+ private refresh;
37
+ private markDirty;
32
38
  private persist;
33
39
  }
34
40
  export declare const jobManager: JobManager;
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/core/jobs.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;AAClG,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IACnH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;CACjL;AAQD,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBACxB,UAAU,SAAmE;IASzF,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,SAAU,EAAE,WAAW,SAAI,GAAG,SAAS;IAIvG,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IACxD,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE;IACnC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAO5C,QAAQ,IAAI,IAAI;IAChB,OAAO,CAAC,IAAI;IAwBZ,OAAO,CAAC,OAAO;CAChB;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/core/jobs.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;AAClG,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IACnH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACtN;AAsDD,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAC7B,UAAU,SAAmE;IAazF,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,SAAU,EAAE,WAAW,SAAI,GAAG,SAAS;IAIvG,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IACxD,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE;IACnC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAO5C,QAAQ,IAAI,IAAI;IAChB,OAAO,CAAC,IAAI;IA6BZ,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;CAWhB;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}
package/dist/core/jobs.js CHANGED
@@ -4,43 +4,114 @@ import { spawn } from 'node:child_process';
4
4
  import { randomUUID } from 'node:crypto';
5
5
  import { dataDir, childEnv, shellCommand } from './platform.js';
6
6
  const MAX_OUTPUT = 200_000;
7
- const STORE = path.join(dataDir(), 'jobs.json');
8
- function load() { try {
9
- return JSON.parse(fs.readFileSync(STORE, 'utf8'));
7
+ function storePath() { return path.join(dataDir(), 'jobs.json'); }
8
+ function lockPath() { return path.join(dataDir(), 'jobs.lock'); }
9
+ function isProcessAlive(pid) {
10
+ if (!Number.isInteger(pid) || pid <= 0)
11
+ return false;
12
+ try {
13
+ process.kill(pid, 0);
14
+ return true;
15
+ }
16
+ catch (e) {
17
+ return e?.code === 'EPERM';
18
+ }
19
+ }
20
+ function load() {
21
+ try {
22
+ return JSON.parse(fs.readFileSync(storePath(), 'utf8'));
23
+ }
24
+ catch {
25
+ return [];
26
+ }
27
+ }
28
+ /**
29
+ * Cross-process persistence lock. mkdir is atomic on local filesystems, so two
30
+ * gateway processes cannot perform a read/merge/write at the same time.
31
+ * A stale lock is recoverable after an owner crash.
32
+ */
33
+ function withStoreLock(fn) {
34
+ const dir = path.dirname(storePath());
35
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
36
+ const lock = lockPath();
37
+ const started = Date.now();
38
+ while (true) {
39
+ try {
40
+ fs.mkdirSync(lock, { mode: 0o700 });
41
+ try {
42
+ return fn();
43
+ }
44
+ finally {
45
+ fs.rmSync(lock, { recursive: true, force: true });
46
+ }
47
+ }
48
+ catch (e) {
49
+ if (e?.code !== 'EEXIST')
50
+ throw e;
51
+ try {
52
+ const age = Date.now() - fs.statSync(lock).mtimeMs;
53
+ if (age > 30_000)
54
+ fs.rmSync(lock, { recursive: true, force: true });
55
+ }
56
+ catch { /* another process may be replacing/removing the lock */ }
57
+ if (Date.now() - started > 10_000)
58
+ throw new Error('timed out waiting for jobs persistence lock');
59
+ const until = Date.now() + 20;
60
+ while (Date.now() < until) { /* synchronous backoff keeps the critical section simple */ }
61
+ }
62
+ }
63
+ }
64
+ function saveMerged(changed) {
65
+ withStoreLock(() => {
66
+ const current = new Map(load().map(j => [j.id, j]));
67
+ for (const job of changed)
68
+ current.set(job.id, { ...job });
69
+ const rows = [...current.values()].sort((a, b) => a.created.localeCompare(b.created)).slice(-500);
70
+ const target = storePath();
71
+ const tmp = `${target}.tmp-${process.pid}-${randomUUID()}`;
72
+ fs.writeFileSync(tmp, JSON.stringify(rows, null, 2), { mode: 0o600 });
73
+ fs.renameSync(tmp, target);
74
+ });
10
75
  }
11
- catch {
12
- return [];
13
- } }
14
- function save(rows) { fs.mkdirSync(path.dirname(STORE), { recursive: true }); fs.writeFileSync(STORE, JSON.stringify(rows.slice(-500), null, 2), { mode: 0o600 }); }
15
76
  export class JobManager {
16
77
  jobs = new Map();
17
78
  running = 0;
18
79
  queue = [];
80
+ dirty = new Set();
19
81
  maxWorkers;
82
+ workerId = randomUUID();
20
83
  constructor(maxWorkers = Math.max(2, Math.min(8, Number(process.env.RAMCP_WORKERS || 4)))) {
21
84
  this.maxWorkers = maxWorkers;
22
85
  for (const j of load()) {
23
86
  if (j.status === 'running') {
24
- j.status = 'queued';
25
- j.started = undefined;
26
- j.finished = undefined;
87
+ const ownerAlive = typeof j.ownerPid === 'number' && isProcessAlive(j.ownerPid);
88
+ if (!ownerAlive) {
89
+ j.status = 'queued';
90
+ j.started = undefined;
91
+ j.finished = undefined;
92
+ j.ownerId = undefined;
93
+ j.ownerPid = undefined;
94
+ this.markDirty(j.id);
95
+ }
27
96
  }
28
97
  this.jobs.set(j.id, j);
29
- if (j.status === 'queued')
98
+ if (j.status === 'queued' && (!j.ownerId || j.ownerId === this.workerId))
30
99
  this.queue.push(j.id);
31
100
  }
101
+ this.persist();
32
102
  this.pump();
33
103
  }
34
104
  create(command, tokenId, cwd, timeoutMs = 600_000, maxAttempts = 1) {
35
- const j = { id: randomUUID(), command, cwd, status: 'queued', created: new Date().toISOString(), output: '', truncated: false, tokenId, timeoutMs: Math.min(Math.max(1000, timeoutMs), 600_000), attempts: 0, maxAttempts: Math.min(Math.max(1, maxAttempts), 5) };
105
+ const j = { id: randomUUID(), command, cwd, status: 'queued', created: new Date().toISOString(), output: '', truncated: false, tokenId, timeoutMs: Math.min(Math.max(1000, timeoutMs), 600_000), attempts: 0, maxAttempts: Math.min(Math.max(1, maxAttempts), 5), ownerId: this.workerId, ownerPid: process.pid };
36
106
  this.jobs.set(j.id, j);
37
107
  this.queue.push(j.id);
108
+ this.markDirty(j.id);
38
109
  this.persist();
39
110
  this.pump();
40
111
  return j;
41
112
  }
42
- get(id, tokenId) { const j = this.jobs.get(id); return j && (!tokenId || j.tokenId === tokenId) ? { ...j } : undefined; }
43
- list(tokenId) { return [...this.jobs.values()].filter(j => !tokenId || j.tokenId === tokenId).sort((a, b) => b.created.localeCompare(a.created)).map(j => ({ ...j })); }
113
+ get(id, tokenId) { this.refresh(); const j = this.jobs.get(id); return j && (!tokenId || j.tokenId === tokenId) ? { ...j } : undefined; }
114
+ list(tokenId) { this.refresh(); return [...this.jobs.values()].filter(j => !tokenId || j.tokenId === tokenId).sort((a, b) => b.created.localeCompare(a.created)).map(j => ({ ...j })); }
44
115
  cancel(id, tokenId) {
45
116
  const j = this.jobs.get(id);
46
117
  if (!j || j.tokenId !== tokenId)
@@ -49,6 +120,7 @@ export class JobManager {
49
120
  j.status = 'cancelled';
50
121
  j.finished = new Date().toISOString();
51
122
  this.queue = this.queue.filter(x => x !== id);
123
+ this.markDirty(id);
52
124
  this.persist();
53
125
  return true;
54
126
  }
@@ -73,9 +145,14 @@ export class JobManager {
73
145
  this.running++;
74
146
  j.status = 'running';
75
147
  j.started = new Date().toISOString();
148
+ j.ownerId = this.workerId;
149
+ j.ownerPid = process.pid;
150
+ this.markDirty(id);
76
151
  this.persist();
77
152
  const { file, args } = shellCommand(j.command);
78
153
  j.attempts++;
154
+ this.markDirty(j.id);
155
+ this.persist();
79
156
  const child = spawn(file, args, { cwd: j.cwd || undefined, env: childEnv(), windowsHide: true });
80
157
  j.__child = child;
81
158
  const timer = setTimeout(() => { j.__timedOut = true; child.kill('SIGTERM'); }, j.timeoutMs);
@@ -83,10 +160,10 @@ export class JobManager {
83
160
  j.truncated = true;
84
161
  return;
85
162
  } const s = String(chunk); const room = MAX_OUTPUT - j.output.length; j.output += s.slice(0, room); if (s.length > room)
86
- j.truncated = true; this.persist(); };
163
+ j.truncated = true; this.markDirty(j.id); this.persist(); };
87
164
  child.stdout.on('data', append);
88
165
  child.stderr.on('data', x => append(`\n--- stderr ---\n${x}`));
89
- child.on('error', e => { j.error = e.message; });
166
+ child.on('error', e => { j.error = e.message; this.markDirty(j.id); this.persist(); });
90
167
  child.on('close', (code, signal) => {
91
168
  clearTimeout(timer);
92
169
  delete j.__child;
@@ -108,15 +185,50 @@ export class JobManager {
108
185
  else
109
186
  j.status = 'failed';
110
187
  j.finished = j.status === 'queued' ? undefined : new Date().toISOString();
188
+ if (j.status !== 'queued') {
189
+ j.ownerId = undefined;
190
+ j.ownerPid = undefined;
191
+ }
111
192
  if (!j.output)
112
193
  j.output = '(no output)';
113
194
  this.running--;
195
+ this.markDirty(j.id);
114
196
  this.persist();
115
197
  this.pump();
116
198
  });
117
199
  }
118
200
  }
119
- persist() { save([...this.jobs.values()].map(j => { const c = { ...j }; delete c.__child; return c; })); }
201
+ refresh() {
202
+ for (const diskJob of load()) {
203
+ const local = this.jobs.get(diskJob.id);
204
+ if (!local || local.ownerId !== this.workerId || local.status !== 'running')
205
+ this.jobs.set(diskJob.id, diskJob);
206
+ }
207
+ }
208
+ markDirty(id) { this.dirty.add(id); }
209
+ persist() {
210
+ if (!this.dirty.size)
211
+ return;
212
+ const changed = [];
213
+ for (const id of this.dirty) {
214
+ const j = this.jobs.get(id);
215
+ if (j) {
216
+ const c = { ...j };
217
+ delete c.__child;
218
+ delete c.__timedOut;
219
+ changed.push(c);
220
+ }
221
+ }
222
+ this.dirty.clear();
223
+ try {
224
+ saveMerged(changed);
225
+ }
226
+ catch (e) {
227
+ for (const j of changed)
228
+ this.dirty.add(j.id);
229
+ throw e;
230
+ }
231
+ }
120
232
  }
121
233
  export const jobManager = new JobManager();
122
234
  //# sourceMappingURL=jobs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/core/jobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/core/jobs.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/core/policy.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,+CAA+C;AAC/C,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CA4BhD,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,cAAc,aAQzB,CAAC;AAEH,wEAAwE;AACxE,qBAAa,WAAY,SAAQ,KAAK;aACR,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAI3C;AAED,qEAAqE;AACrE,qBAAa,UAAW,SAAQ,KAAK;gBACvB,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;CAItC;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAoB7C;AAUD,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAUtE;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAEnE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE1D;AAED,iEAAiE;AACjE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKnD;AAED,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;CAAE;AAE9G,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,IAAI,CAOlG;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAClG,IAAI,CAcN"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/core/policy.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,+CAA+C;AAC/C,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CA4BhD,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,cAAc,aAQzB,CAAC;AAEH,wEAAwE;AACxE,qBAAa,WAAY,SAAQ,KAAK;aACR,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM;CAI3C;AAED,qEAAqE;AACrE,qBAAa,UAAW,SAAQ,KAAK;gBACvB,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;CAItC;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAoB7C;AAUD,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAUtE;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAEnE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE1D;AAED,iEAAiE;AACjE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKnD;AAED,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;CAAE;AA+B9G,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,IAAI,CAmBlG;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAClG,IAAI,CAcN"}
@@ -127,14 +127,69 @@ export function scopeOf(tool) {
127
127
  }
128
128
  return null;
129
129
  }
130
+ /**
131
+ * Return every executable token represented by a shell command.
132
+ * The allowlist is executable-oriented, so shell control operators,
133
+ * substitutions and chained commands are rejected rather than attempting
134
+ * to parse an entire shell language imperfectly.
135
+ */
136
+ function commandHasShellOperators(command) {
137
+ let quote = null;
138
+ let escaped = false;
139
+ for (let i = 0; i < command.length; i++) {
140
+ const ch = command[i];
141
+ if (escaped) {
142
+ escaped = false;
143
+ continue;
144
+ }
145
+ if (ch === '\\' && quote !== "'") {
146
+ escaped = true;
147
+ continue;
148
+ }
149
+ if (quote) {
150
+ if (ch === quote)
151
+ quote = null;
152
+ continue;
153
+ }
154
+ if (ch === "'" || ch === '"') {
155
+ quote = ch;
156
+ continue;
157
+ }
158
+ if (ch === ';' || ch === '|' || ch === '`' || ch === '$' || ch === '<' || ch === '>' || ch === '\n' || ch === '\r')
159
+ return true;
160
+ if (ch === '&')
161
+ return true;
162
+ }
163
+ return false;
164
+ }
165
+ function commandExecutable(command) {
166
+ const trimmed = command.trim();
167
+ if (!trimmed)
168
+ return '';
169
+ // A command with shell syntax is intentionally handled by the caller.
170
+ // For simple commands, the first whitespace-delimited token is the executable.
171
+ return trimmed.split(/\s+/)[0]?.replace(/^.*[\\/]/, '') || '';
172
+ }
130
173
  export function assertCommandPolicy(policy, command, approved = false) {
131
- if (policy.approval_mode === 'approval-required' && !approved)
174
+ if (policy.approval_mode === 'approval-required' && !approved) {
132
175
  throw new ScopeError('run_command', 'approval is required for command execution');
176
+ }
177
+ const trimmed = command.trim();
178
+ if (!trimmed)
179
+ throw new ScopeError('run_command', 'command must not be empty');
133
180
  const list = policy.command_allowlist || [];
134
- if (list.length) {
135
- const executable = command.trim().split(/\s+/)[0]?.replace(/^.*[\\/]/, '') || '';
136
- if (!list.includes(executable) && !list.includes(command.trim()))
137
- throw new ScopeError('run_command', `command is not in the allowlist (${list.join(', ')})`);
181
+ if (!list.length)
182
+ return;
183
+ // Exact command entries remain supported. Otherwise the command must be a
184
+ // single simple invocation whose executable is explicitly allowlisted.
185
+ if (list.includes(trimmed))
186
+ return;
187
+ if (commandHasShellOperators(trimmed)) {
188
+ throw new ScopeError('run_command', 'shell operators are not allowed when a command allowlist is active; allow the exact command instead');
189
+ }
190
+ const executable = commandExecutable(trimmed);
191
+ if (!list.includes(executable)) {
192
+ throw new ScopeError('run_command', `command is not in the allowlist (${list.join(', ')})`);
138
193
  }
139
194
  }
140
195
  export function assertToolPermitted(opts) {
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/core/policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/core/policy.ts"],"names":[],"mappings":"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"}