@getmarrow/mcp 3.9.88 → 3.9.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.
@@ -0,0 +1,414 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnsafeLoopGuardStateError = void 0;
4
+ exports.consultSessionLoopGuard = consultSessionLoopGuard;
5
+ exports.recordSessionLoopOutcome = recordSessionLoopOutcome;
6
+ exports.advanceSessionInstructionEpoch = advanceSessionInstructionEpoch;
7
+ exports.clearSessionLoopGuard = clearSessionLoopGuard;
8
+ exports.sessionLoopGuardPath = sessionLoopGuardPath;
9
+ exports.sessionLoopGuardEnabled = sessionLoopGuardEnabled;
10
+ exports.runSessionLoopGuardSelfTest = runSessionLoopGuardSelfTest;
11
+ const node_crypto_1 = require("node:crypto");
12
+ const node_fs_1 = require("node:fs");
13
+ const node_os_1 = require("node:os");
14
+ const node_path_1 = require("node:path");
15
+ const hook_tool_policy_1 = require("./hook-tool-policy");
16
+ const STATE_VERSION = 1;
17
+ const STATE_DIRECTORY = 'session-loop-guard';
18
+ const STATE_FILENAME = 'state.json';
19
+ const STATE_MAX_BYTES = 256 * 1024;
20
+ const STATE_TTL_MS = 24 * 60 * 60 * 1000;
21
+ const MAX_SESSIONS = 64;
22
+ const MAX_ENTRIES_PER_SESSION = 256;
23
+ class UnsafeLoopGuardStateError extends Error {
24
+ constructor() {
25
+ super('Local Marrow session loop-guard state is unsafe or invalid. Repair ~/.marrow/session-loop-guard before retrying.');
26
+ this.name = 'UnsafeLoopGuardStateError';
27
+ }
28
+ }
29
+ exports.UnsafeLoopGuardStateError = UnsafeLoopGuardStateError;
30
+ function unsafe() { throw new UnsafeLoopGuardStateError(); }
31
+ function uid() {
32
+ return typeof process.getuid === 'function' ? process.getuid() : null;
33
+ }
34
+ function owned(stat) {
35
+ const current = uid();
36
+ return current == null || stat.uid === current;
37
+ }
38
+ function exactPrivate(stat, mode) {
39
+ return owned(stat) && !stat.isSymbolicLink() && (stat.mode & 0o777) === mode;
40
+ }
41
+ function canonical(value, depth = 0) {
42
+ if (depth > 8)
43
+ return '[depth]';
44
+ if (value === null || typeof value === 'boolean')
45
+ return value;
46
+ if (typeof value === 'number')
47
+ return Number.isFinite(value) ? value : String(value);
48
+ if (typeof value === 'string')
49
+ return value.slice(0, 16_384);
50
+ if (Array.isArray(value))
51
+ return value.slice(0, 128).map((item) => canonical(item, depth + 1));
52
+ if (value && typeof value === 'object') {
53
+ const source = value;
54
+ return Object.fromEntries(Object.keys(source).sort().slice(0, 128).map((key) => [key.slice(0, 128), canonical(source[key], depth + 1)]));
55
+ }
56
+ return String(value).slice(0, 256);
57
+ }
58
+ function keyedHash(secret, value) {
59
+ return (0, node_crypto_1.createHmac)('sha256', Buffer.from(secret, 'base64url'))
60
+ .update(JSON.stringify(canonical(value)))
61
+ .digest('hex');
62
+ }
63
+ function paths(home = (0, node_os_1.homedir)()) {
64
+ const marrow = (0, node_path_1.join)(home, '.marrow');
65
+ const directory = (0, node_path_1.join)(marrow, STATE_DIRECTORY);
66
+ return { marrow, directory, target: (0, node_path_1.join)(directory, STATE_FILENAME) };
67
+ }
68
+ function ensureDirectories(home = (0, node_os_1.homedir)()) {
69
+ const result = paths(home);
70
+ if (!(0, node_fs_1.existsSync)(result.marrow))
71
+ (0, node_fs_1.mkdirSync)(result.marrow, { mode: 0o700 });
72
+ const marrowStat = (0, node_fs_1.lstatSync)(result.marrow);
73
+ if (!marrowStat.isDirectory() || marrowStat.isSymbolicLink() || !owned(marrowStat) || (marrowStat.mode & 0o022) !== 0)
74
+ unsafe();
75
+ if (!(0, node_fs_1.existsSync)(result.directory))
76
+ (0, node_fs_1.mkdirSync)(result.directory, { mode: 0o700 });
77
+ const directoryStat = (0, node_fs_1.lstatSync)(result.directory);
78
+ if (!directoryStat.isDirectory() || !exactPrivate(directoryStat, 0o700))
79
+ unsafe();
80
+ return result;
81
+ }
82
+ function withStateLock(home, callback) {
83
+ const { directory } = ensureDirectories(home);
84
+ const lock = (0, node_path_1.join)(directory, '.state.lock');
85
+ let fd = -1;
86
+ for (let attempt = 0; attempt < 40; attempt += 1) {
87
+ try {
88
+ fd = (0, node_fs_1.openSync)(lock, node_fs_1.constants.O_WRONLY | node_fs_1.constants.O_CREAT | node_fs_1.constants.O_EXCL | (node_fs_1.constants.O_NOFOLLOW || 0), 0o600);
89
+ const opened = (0, node_fs_1.fstatSync)(fd);
90
+ if (!opened.isFile() || !exactPrivate(opened, 0o600))
91
+ return unsafe();
92
+ break;
93
+ }
94
+ catch (error) {
95
+ if (error.code !== 'EEXIST')
96
+ return unsafe();
97
+ const stat = (0, node_fs_1.lstatSync)(lock);
98
+ if (!stat.isFile() || !exactPrivate(stat, 0o600))
99
+ return unsafe();
100
+ if (Date.now() - stat.mtimeMs > 30_000) {
101
+ (0, node_fs_1.unlinkSync)(lock);
102
+ continue;
103
+ }
104
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 5);
105
+ }
106
+ }
107
+ if (fd < 0)
108
+ return unsafe();
109
+ try {
110
+ return callback();
111
+ }
112
+ finally {
113
+ (0, node_fs_1.closeSync)(fd);
114
+ try {
115
+ (0, node_fs_1.unlinkSync)(lock);
116
+ }
117
+ catch { /* a stopped process leaves a bounded stale lock */ }
118
+ }
119
+ }
120
+ function emptyState() {
121
+ return { version: STATE_VERSION, secret: (0, node_crypto_1.randomBytes)(32).toString('base64url'), sessions: {} };
122
+ }
123
+ function validEntry(value) {
124
+ if (!value || typeof value !== 'object' || Array.isArray(value))
125
+ return false;
126
+ const entry = value;
127
+ return /^[a-f0-9]{64}$/.test(entry.fingerprint)
128
+ && ['poll', 'verification', 'read', 'mutation'].includes(entry.kind)
129
+ && (entry.outcome === null || entry.outcome === 'success' || entry.outcome === 'failure')
130
+ && (entry.result_hash === null || /^[a-f0-9]{64}$/.test(entry.result_hash))
131
+ && Number.isSafeInteger(entry.unchanged_count) && entry.unchanged_count >= 0 && entry.unchanged_count <= 1_000_000
132
+ && Number.isSafeInteger(entry.attempts) && entry.attempts >= 0 && entry.attempts <= 1_000_000
133
+ && Number.isSafeInteger(entry.updated_at) && entry.updated_at > 0
134
+ && /^lgr_[a-f0-9]{24}$/.test(entry.receipt);
135
+ }
136
+ function validateState(value) {
137
+ if (!value || typeof value !== 'object' || Array.isArray(value))
138
+ return unsafe();
139
+ const state = value;
140
+ if (state.version !== STATE_VERSION || !/^[A-Za-z0-9_-]{43}$/.test(state.secret) || !state.sessions || typeof state.sessions !== 'object' || Array.isArray(state.sessions))
141
+ unsafe();
142
+ const sessions = Object.entries(state.sessions);
143
+ if (sessions.length > MAX_SESSIONS || sessions.some(([key]) => !/^[a-f0-9]{64}$/.test(key)))
144
+ unsafe();
145
+ for (const [, session] of sessions) {
146
+ if (!session || typeof session !== 'object' || Array.isArray(session)
147
+ || !Number.isSafeInteger(session.work_epoch) || session.work_epoch < 0
148
+ || !Number.isSafeInteger(session.instruction_epoch) || session.instruction_epoch < 0
149
+ || !Number.isSafeInteger(session.updated_at) || session.updated_at <= 0
150
+ || !session.entries || typeof session.entries !== 'object' || Array.isArray(session.entries)
151
+ || !session.invocations || typeof session.invocations !== 'object' || Array.isArray(session.invocations)
152
+ || Object.keys(session.invocations).length > MAX_ENTRIES_PER_SESSION
153
+ || Object.entries(session.invocations).some(([key, fingerprint]) => !/^[a-f0-9]{64}$/.test(key) || !/^[a-f0-9]{64}$/.test(fingerprint))
154
+ || Object.keys(session.entries).length > MAX_ENTRIES_PER_SESSION
155
+ || Object.entries(session.entries).some(([key, entry]) => !/^[a-f0-9]{64}$/.test(key) || !validEntry(entry)))
156
+ unsafe();
157
+ }
158
+ return state;
159
+ }
160
+ function readState(home = (0, node_os_1.homedir)()) {
161
+ const { target, directory } = ensureDirectories(home);
162
+ if (!(0, node_fs_1.existsSync)(target))
163
+ return { state: emptyState(), target, directory };
164
+ const stat = (0, node_fs_1.lstatSync)(target);
165
+ if (!stat.isFile() || !exactPrivate(stat, 0o600) || stat.size < 2 || stat.size > STATE_MAX_BYTES)
166
+ return unsafe();
167
+ let fd = -1;
168
+ try {
169
+ fd = (0, node_fs_1.openSync)(target, node_fs_1.constants.O_RDONLY | (node_fs_1.constants.O_NOFOLLOW || 0));
170
+ const opened = (0, node_fs_1.fstatSync)(fd);
171
+ if (!opened.isFile() || opened.ino !== stat.ino || !exactPrivate(opened, 0o600))
172
+ return unsafe();
173
+ const raw = (0, node_fs_1.readFileSync)(fd, 'utf8');
174
+ if (Buffer.byteLength(raw) > STATE_MAX_BYTES)
175
+ return unsafe();
176
+ return { state: validateState(JSON.parse(raw)), target, directory };
177
+ }
178
+ catch (error) {
179
+ if (error instanceof UnsafeLoopGuardStateError)
180
+ throw error;
181
+ return unsafe();
182
+ }
183
+ finally {
184
+ if (fd >= 0)
185
+ (0, node_fs_1.closeSync)(fd);
186
+ }
187
+ }
188
+ function prune(state, now) {
189
+ for (const [sessionKey, session] of Object.entries(state.sessions)) {
190
+ if (now - session.updated_at > STATE_TTL_MS)
191
+ delete state.sessions[sessionKey];
192
+ else
193
+ for (const [key, entry] of Object.entries(session.entries)) {
194
+ if (now - entry.updated_at > STATE_TTL_MS)
195
+ delete session.entries[key];
196
+ }
197
+ }
198
+ const sessions = Object.entries(state.sessions).sort((a, b) => b[1].updated_at - a[1].updated_at);
199
+ for (const [key] of sessions.slice(MAX_SESSIONS))
200
+ delete state.sessions[key];
201
+ for (const session of Object.values(state.sessions)) {
202
+ const entries = Object.entries(session.entries).sort((a, b) => b[1].updated_at - a[1].updated_at);
203
+ for (const [key] of entries.slice(MAX_ENTRIES_PER_SESSION))
204
+ delete session.entries[key];
205
+ const liveFingerprints = new Set(Object.keys(session.entries));
206
+ for (const [key, fingerprint] of Object.entries(session.invocations)) {
207
+ if (!liveFingerprints.has(fingerprint))
208
+ delete session.invocations[key];
209
+ }
210
+ for (const key of Object.keys(session.invocations).slice(0, Math.max(0, Object.keys(session.invocations).length - MAX_ENTRIES_PER_SESSION))) {
211
+ delete session.invocations[key];
212
+ }
213
+ }
214
+ }
215
+ function writeState(state, target, directory) {
216
+ prune(state, Date.now());
217
+ const raw = `${JSON.stringify(state)}\n`;
218
+ if (Buffer.byteLength(raw) > STATE_MAX_BYTES)
219
+ unsafe();
220
+ const temporary = (0, node_path_1.join)(directory, `.state-${process.pid}-${(0, node_crypto_1.randomBytes)(8).toString('hex')}.tmp`);
221
+ let fd = -1;
222
+ try {
223
+ fd = (0, node_fs_1.openSync)(temporary, node_fs_1.constants.O_WRONLY | node_fs_1.constants.O_CREAT | node_fs_1.constants.O_EXCL | (node_fs_1.constants.O_NOFOLLOW || 0), 0o600);
224
+ (0, node_fs_1.writeFileSync)(fd, raw, 'utf8');
225
+ (0, node_fs_1.closeSync)(fd);
226
+ fd = -1;
227
+ (0, node_fs_1.renameSync)(temporary, target);
228
+ }
229
+ finally {
230
+ if (fd >= 0)
231
+ (0, node_fs_1.closeSync)(fd);
232
+ try {
233
+ if ((0, node_fs_1.existsSync)(temporary))
234
+ (0, node_fs_1.unlinkSync)(temporary);
235
+ }
236
+ catch { /* best effort cleanup */ }
237
+ }
238
+ }
239
+ function sessionKey(state, operation) {
240
+ return keyedHash(state.secret, ['session', operation.sessionId || 'workspace-session', operation.agentId || 'credential-agent', operation.harness]);
241
+ }
242
+ function getSession(state, operation, now) {
243
+ const key = sessionKey(state, operation);
244
+ const existing = state.sessions[key];
245
+ if (existing)
246
+ return existing;
247
+ const session = { work_epoch: 0, instruction_epoch: 0, updated_at: now, entries: {}, invocations: {} };
248
+ state.sessions[key] = session;
249
+ return session;
250
+ }
251
+ function operationKind(operation) {
252
+ if (!operation.readOnly)
253
+ return 'mutation';
254
+ const tool = (0, hook_tool_policy_1.normalizeHookToolName)(operation.toolName);
255
+ const command = (0, hook_tool_policy_1.hookToolCommand)({ tool_name: operation.toolName, tool_input: operation.toolInput }).toLowerCase();
256
+ if (/(?:^|[_:.-])(?:status|poll|wait|watch|health)(?:$|[_:.-])/.test(tool)
257
+ || /\b(?:status|poll|health|wait|watch)\b/.test(command))
258
+ return 'poll';
259
+ if (/(?:^|[_:.-])(?:test|check|audit|verify|lint|typecheck)(?:$|[_:.-])/.test(tool)
260
+ || /\b(?:test|check|audit|verify|lint|typecheck)\b/.test(command))
261
+ return 'verification';
262
+ return 'read';
263
+ }
264
+ function operationIdentity(state, session, operation) {
265
+ return keyedHash(state.secret, [
266
+ 'operation',
267
+ operation.harness,
268
+ operation.agentId || 'credential-agent',
269
+ (0, hook_tool_policy_1.normalizeHookToolName)(operation.toolName) || 'tool',
270
+ canonical(operation.toolInput ?? null),
271
+ session.work_epoch,
272
+ session.instruction_epoch,
273
+ ]);
274
+ }
275
+ function denial(entry) {
276
+ const result = entry.outcome === 'success' ? 'passed' : 'failed';
277
+ return `Marrow local loop guard: this operation already ${result} with an unchanged result. Reuse the recorded result instead of repeating it. Receipt: ${entry.receipt}.`;
278
+ }
279
+ function consultSessionLoopGuard(operation, options = {}) {
280
+ return withStateLock(options.home, () => {
281
+ const now = options.now ?? Date.now();
282
+ const loaded = readState(options.home);
283
+ const session = getSession(loaded.state, operation, now);
284
+ const fingerprint = operationIdentity(loaded.state, session, operation);
285
+ const kind = operationKind(operation);
286
+ const existing = session.entries[fingerprint];
287
+ if (existing) {
288
+ const threshold = existing.kind === 'poll' || existing.outcome === 'failure' ? 2 : 1;
289
+ if (existing.outcome && existing.unchanged_count >= threshold) {
290
+ return { allow: false, receipt: existing.receipt, reason: denial(existing), fingerprint };
291
+ }
292
+ existing.attempts += 1;
293
+ existing.updated_at = now;
294
+ }
295
+ else {
296
+ const receipt = `lgr_${keyedHash(loaded.state.secret, ['receipt', fingerprint]).slice(0, 24)}`;
297
+ session.entries[fingerprint] = {
298
+ fingerprint,
299
+ kind,
300
+ outcome: null,
301
+ result_hash: null,
302
+ unchanged_count: 0,
303
+ attempts: 1,
304
+ updated_at: now,
305
+ receipt,
306
+ };
307
+ }
308
+ session.updated_at = now;
309
+ if (operation.invocationId) {
310
+ session.invocations[keyedHash(loaded.state.secret, ['invocation', operation.invocationId])] = fingerprint;
311
+ }
312
+ writeState(loaded.state, loaded.target, loaded.directory);
313
+ return { allow: true, receipt: session.entries[fingerprint].receipt, fingerprint };
314
+ });
315
+ }
316
+ function recordSessionLoopOutcome(operation, success, result, options = {}) {
317
+ withStateLock(options.home, () => {
318
+ const now = options.now ?? Date.now();
319
+ const loaded = readState(options.home);
320
+ const session = getSession(loaded.state, operation, now);
321
+ const invocationKey = operation.invocationId
322
+ ? keyedHash(loaded.state.secret, ['invocation', operation.invocationId])
323
+ : null;
324
+ const fingerprint = invocationKey && session.invocations[invocationKey]
325
+ ? session.invocations[invocationKey]
326
+ : operationIdentity(loaded.state, session, operation);
327
+ const entry = session.entries[fingerprint];
328
+ if (!entry)
329
+ return;
330
+ const outcome = success ? 'success' : 'failure';
331
+ const resultHash = keyedHash(loaded.state.secret, ['result', canonical(result ?? null)]);
332
+ entry.unchanged_count = entry.outcome === outcome && entry.result_hash === resultHash
333
+ ? entry.unchanged_count + 1
334
+ : 1;
335
+ entry.outcome = outcome;
336
+ entry.result_hash = resultHash;
337
+ entry.updated_at = now;
338
+ session.updated_at = now;
339
+ if (!operation.readOnly && success) {
340
+ session.work_epoch += 1;
341
+ session.entries = {};
342
+ session.invocations = {};
343
+ }
344
+ writeState(loaded.state, loaded.target, loaded.directory);
345
+ });
346
+ }
347
+ function advanceSessionInstructionEpoch(operation, options = {}) {
348
+ withStateLock(options.home, () => {
349
+ const now = options.now ?? Date.now();
350
+ const loaded = readState(options.home);
351
+ const session = getSession(loaded.state, operation, now);
352
+ session.instruction_epoch += 1;
353
+ session.entries = {};
354
+ session.invocations = {};
355
+ session.updated_at = now;
356
+ writeState(loaded.state, loaded.target, loaded.directory);
357
+ });
358
+ }
359
+ function clearSessionLoopGuard(operation, options = {}) {
360
+ withStateLock(options.home, () => {
361
+ const loaded = readState(options.home);
362
+ delete loaded.state.sessions[sessionKey(loaded.state, operation)];
363
+ writeState(loaded.state, loaded.target, loaded.directory);
364
+ });
365
+ }
366
+ function sessionLoopGuardPath(home = (0, node_os_1.homedir)()) {
367
+ return paths(home).target;
368
+ }
369
+ function sessionLoopGuardEnabled(autoHook, localControlEnabled) {
370
+ return autoHook !== 'false' && localControlEnabled;
371
+ }
372
+ function runSessionLoopGuardSelfTest() {
373
+ const root = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'marrow-loop-guard-self-test-'));
374
+ const operation = {
375
+ sessionId: 'self-test-session',
376
+ agentId: 'self-test-agent',
377
+ harness: 'self-test',
378
+ toolName: 'Bash',
379
+ toolInput: { command: 'npm test' },
380
+ readOnly: true,
381
+ };
382
+ try {
383
+ const first = consultSessionLoopGuard(operation, { home: root });
384
+ recordSessionLoopOutcome(operation, true, { status: 'passed' }, { home: root });
385
+ const repeat = consultSessionLoopGuard(operation, { home: root });
386
+ if (!first.allow || repeat.allow)
387
+ throw new Error('repeat denial was not enforced');
388
+ const mutation = {
389
+ ...operation,
390
+ toolName: 'Edit',
391
+ toolInput: { patch_hash: 'self-test' },
392
+ readOnly: false,
393
+ };
394
+ if (!consultSessionLoopGuard(mutation, { home: root }).allow)
395
+ throw new Error('mutation was unexpectedly denied');
396
+ recordSessionLoopOutcome(mutation, true, { changed: true }, { home: root });
397
+ if (!consultSessionLoopGuard(operation, { home: root }).allow)
398
+ throw new Error('mutation did not advance the work epoch');
399
+ if (sessionLoopGuardEnabled('true', false))
400
+ throw new Error('owner-disabled loop guard did not bypass');
401
+ return {
402
+ pass: true,
403
+ isolated: true,
404
+ live_hook_observed: false,
405
+ repeat_denied: true,
406
+ mutation_reset: true,
407
+ owner_disabled_bypass: true,
408
+ };
409
+ }
410
+ finally {
411
+ (0, node_fs_1.rmSync)(root, { recursive: true, force: true });
412
+ }
413
+ }
414
+ //# sourceMappingURL=session-loop-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-loop-guard.js","sourceRoot":"","sources":["../src/session-loop-guard.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getmarrow/mcp",
3
- "version": "3.9.88",
3
+ "version": "3.9.89",
4
4
  "mcpName": "io.github.getmarrow/marrow",
5
5
  "description": "Runtime control, proof, and fleet intelligence for MCP-compatible AI agents.",
6
6
  "bin": {
@@ -53,6 +53,7 @@
53
53
  "category": "agent_fleet_governance_and_control_layer",
54
54
  "positioning": "agent_fleet_governance_and_control_layer",
55
55
  "role": "mcp-runtime-control-and-proof-server",
56
+ "localSessionLoopGuard": "default-enabled for supported native hooks; private hashed state; explicit owner opt-out",
56
57
  "operatorApprovalRequired": true,
57
58
  "privacy": "No raw prompts, source code, credentials, or customer data are accepted by public discovery.",
58
59
  "governanceFit": "https://getmarrow.ai/.well-known/marrow.json",
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/getmarrow/marrow-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "3.9.88",
9
+ "version": "3.9.89",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@getmarrow/mcp",
14
- "version": "3.9.88",
14
+ "version": "3.9.89",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },