@mnemonik/cursor-hooks 0.7.5 → 0.7.7
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/dist/hook.js +167 -64
- package/dist/hook.js.map +1 -1
- package/dist/install.d.ts +5 -9
- package/dist/install.js +194 -83
- package/dist/install.js.map +1 -1
- package/dist/lib/behavior.d.ts +4 -2
- package/dist/lib/behavior.js +4 -2
- package/dist/lib/behavior.js.map +1 -1
- package/dist/lib/contextOverflow.js +90 -7
- package/dist/lib/contextOverflow.js.map +1 -1
- package/dist/lib/cursorOutput.js +4 -2
- package/dist/lib/cursorOutput.js.map +1 -1
- package/dist/lib/dedupGuard.d.ts +1 -0
- package/dist/lib/dedupGuard.js +4 -1
- package/dist/lib/dedupGuard.js.map +1 -1
- package/dist/lib/http.d.ts +10 -5
- package/dist/lib/http.js +40 -26
- package/dist/lib/http.js.map +1 -1
- package/dist/lib/installerSupport.d.ts +33 -0
- package/dist/lib/installerSupport.js +563 -0
- package/dist/lib/installerSupport.js.map +1 -0
- package/dist/lib/mcpOwnership.d.ts +19 -0
- package/dist/lib/mcpOwnership.js +127 -0
- package/dist/lib/mcpOwnership.js.map +1 -0
- package/dist/lib/retiredCursorRule.d.ts +9 -0
- package/dist/lib/retiredCursorRule.js +87 -0
- package/dist/lib/retiredCursorRule.js.map +1 -0
- package/dist/lib/types.d.ts +12 -11
- package/dist/lib/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/lib/files.d.ts +0 -20
- package/dist/lib/files.js +0 -52
- package/dist/lib/files.js.map +0 -1
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
+
import { cp, copyFile, link, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, rmdir, stat, unlink, } from 'node:fs/promises';
|
|
3
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
4
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
5
|
+
const LAUNCHER_SOURCE = "const u=Buffer.from(process.argv[1],'base64url').toString('utf8');process.argv[1]=require('node:url').fileURLToPath(u);import(u).catch(e=>{console.error(e);process.exitCode=1})";
|
|
6
|
+
const OWNER_PATTERN = /^[a-z0-9-]+$/;
|
|
7
|
+
const TOKEN_PATTERN = /^[A-Za-z0-9_-]+$/;
|
|
8
|
+
const LOCK_STALE_MS = 120_000;
|
|
9
|
+
const LOCK_RETRIES = 100;
|
|
10
|
+
const LOCK_RETRY_MS = 20;
|
|
11
|
+
function errorCode(error) {
|
|
12
|
+
return error && typeof error === 'object' && 'code' in error
|
|
13
|
+
? String(error.code)
|
|
14
|
+
: undefined;
|
|
15
|
+
}
|
|
16
|
+
export function buildManagedCommand(targetPath, owner) {
|
|
17
|
+
if (!OWNER_PATTERN.test(owner))
|
|
18
|
+
throw new Error(`Invalid Mnemonik command owner: ${owner}`);
|
|
19
|
+
const token = Buffer.from(pathToFileURL(resolve(targetPath)).href, 'utf8').toString('base64url');
|
|
20
|
+
return `node -e ${JSON.stringify(LAUNCHER_SOURCE)} -- ${token} --mnemonik-owner=${owner}`;
|
|
21
|
+
}
|
|
22
|
+
export function parseManagedCommand(command, owner) {
|
|
23
|
+
if (!OWNER_PATTERN.test(owner))
|
|
24
|
+
return null;
|
|
25
|
+
const prefix = `node -e ${JSON.stringify(LAUNCHER_SOURCE)} -- `;
|
|
26
|
+
const suffix = ` --mnemonik-owner=${owner}`;
|
|
27
|
+
if (!command.startsWith(prefix) || !command.endsWith(suffix))
|
|
28
|
+
return null;
|
|
29
|
+
const token = command.slice(prefix.length, -suffix.length);
|
|
30
|
+
if (!TOKEN_PATTERN.test(token))
|
|
31
|
+
return null;
|
|
32
|
+
try {
|
|
33
|
+
return fileURLToPath(Buffer.from(token, 'base64url').toString('utf8'));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function parseLegacyNodeTarget(command) {
|
|
40
|
+
const match = command.match(/^node ("(?:[^"\\]|\\.)*")(?: --mnemonik-owner=[a-z0-9-]+)?$/);
|
|
41
|
+
if (!match)
|
|
42
|
+
return null;
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(match[1]);
|
|
45
|
+
return typeof parsed === 'string' ? parsed : null;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function isManagedCommand(command, owner, packageName, entrypoint, currentTarget) {
|
|
52
|
+
if (OWNER_PATTERN.test(owner) && command.endsWith(` --mnemonik-owner=${owner}`))
|
|
53
|
+
return true;
|
|
54
|
+
if (parseManagedCommand(command, owner) !== null)
|
|
55
|
+
return true;
|
|
56
|
+
const legacyTarget = parseLegacyNodeTarget(command);
|
|
57
|
+
if (!legacyTarget)
|
|
58
|
+
return false;
|
|
59
|
+
if (currentTarget && resolve(legacyTarget) === resolve(currentTarget))
|
|
60
|
+
return true;
|
|
61
|
+
const normalized = legacyTarget.replace(/\\/g, '/');
|
|
62
|
+
const workspacePackage = packageName.split('/').at(-1);
|
|
63
|
+
return (normalized.endsWith(`/node_modules/${packageName}/dist/${entrypoint}`) ||
|
|
64
|
+
(workspacePackage !== undefined &&
|
|
65
|
+
normalized.endsWith(`/packages/${workspacePackage}/dist/${entrypoint}`)));
|
|
66
|
+
}
|
|
67
|
+
export function resolvePackageRoot(importMetaUrl) {
|
|
68
|
+
return resolve(dirname(fileURLToPath(importMetaUrl)), '..');
|
|
69
|
+
}
|
|
70
|
+
export function resolveRuntimeParent(env = process.env) {
|
|
71
|
+
const home = env.HOME?.trim() || env.USERPROFILE?.trim();
|
|
72
|
+
if (!home)
|
|
73
|
+
throw new Error('Could not determine home directory for durable Mnemonik hooks');
|
|
74
|
+
return join(home, '.mnemonik', 'hooks');
|
|
75
|
+
}
|
|
76
|
+
/** Non-invasive lock location shared by host/project installers for one config path. */
|
|
77
|
+
export function installerConfigLockPath(configPath, runtimeParent = resolveRuntimeParent()) {
|
|
78
|
+
const key = createHash('sha256').update(resolve(configPath)).digest('hex').slice(0, 32);
|
|
79
|
+
return join(runtimeParent, '.config-locks', `${key}.lock`);
|
|
80
|
+
}
|
|
81
|
+
async function canonicalMissingTarget(path) {
|
|
82
|
+
let cursor = resolve(path);
|
|
83
|
+
const missingSegments = [];
|
|
84
|
+
while (true) {
|
|
85
|
+
try {
|
|
86
|
+
return resolve(await realpath(cursor), ...missingSegments);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (errorCode(error) !== 'ENOENT')
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const info = await lstat(cursor);
|
|
94
|
+
if (info.isSymbolicLink())
|
|
95
|
+
throw new Error(`Refusing dangling configuration path symlink ${cursor}`);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (errorCode(error) !== 'ENOENT')
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
const parent = dirname(cursor);
|
|
102
|
+
if (parent === cursor)
|
|
103
|
+
throw new Error(`Could not canonicalize configuration path ${path}`);
|
|
104
|
+
missingSegments.unshift(basename(cursor));
|
|
105
|
+
cursor = parent;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function configTargetIdentity(path) {
|
|
109
|
+
const absolutePath = resolve(path);
|
|
110
|
+
try {
|
|
111
|
+
const canonicalPath = await realpath(absolutePath);
|
|
112
|
+
const info = await stat(canonicalPath);
|
|
113
|
+
return {
|
|
114
|
+
canonicalPath,
|
|
115
|
+
identity: info.ino === 0 ? `path:${canonicalPath}` : `inode:${String(info.dev)}:${String(info.ino)}`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if (errorCode(error) !== 'ENOENT')
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
const canonicalPath = await canonicalMissingTarget(absolutePath);
|
|
123
|
+
return { canonicalPath, identity: `path:${canonicalPath}` };
|
|
124
|
+
}
|
|
125
|
+
/** Resolve symlink/hard-link aliases before config locking and migration. */
|
|
126
|
+
export async function canonicalizeConfigTargets(paths) {
|
|
127
|
+
const representatives = new Map();
|
|
128
|
+
const canonical = [];
|
|
129
|
+
for (const path of paths) {
|
|
130
|
+
const target = await configTargetIdentity(path);
|
|
131
|
+
const representative = representatives.get(target.identity) ?? target.canonicalPath;
|
|
132
|
+
representatives.set(target.identity, representative);
|
|
133
|
+
canonical.push(representative);
|
|
134
|
+
}
|
|
135
|
+
return canonical;
|
|
136
|
+
}
|
|
137
|
+
async function findDependencyPackageRoot(startDirectory, expectedName) {
|
|
138
|
+
let cursor = startDirectory;
|
|
139
|
+
while (true) {
|
|
140
|
+
const candidate = join(cursor, 'node_modules', ...expectedName.split('/'));
|
|
141
|
+
try {
|
|
142
|
+
const manifest = JSON.parse(await readFile(join(candidate, 'package.json'), 'utf8'));
|
|
143
|
+
if (manifest.name === expectedName)
|
|
144
|
+
return candidate;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (errorCode(error) !== 'ENOENT')
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
const parent = dirname(cursor);
|
|
151
|
+
if (parent === cursor)
|
|
152
|
+
throw new Error(`Could not locate ${expectedName} from ${startDirectory}`);
|
|
153
|
+
cursor = parent;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function hashTree(hash, root, label) {
|
|
157
|
+
const walk = async (directory, relative) => {
|
|
158
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
159
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
160
|
+
for (const entry of entries) {
|
|
161
|
+
const childRelative = relative ? join(relative, entry.name) : entry.name;
|
|
162
|
+
const childPath = join(directory, entry.name);
|
|
163
|
+
if (entry.isDirectory())
|
|
164
|
+
await walk(childPath, childRelative);
|
|
165
|
+
else if (entry.isFile()) {
|
|
166
|
+
hash.update(`${label}:${childRelative}\0`);
|
|
167
|
+
hash.update(await readFile(childPath));
|
|
168
|
+
}
|
|
169
|
+
else
|
|
170
|
+
throw new Error(`Unsupported runtime artifact at ${childPath}`);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
await walk(root, '');
|
|
174
|
+
}
|
|
175
|
+
async function runtimeDigest(packageRoot, sharedRoot) {
|
|
176
|
+
const hash = createHash('sha256');
|
|
177
|
+
hash.update(await readFile(join(packageRoot, 'package.json')));
|
|
178
|
+
await hashTree(hash, join(packageRoot, 'dist'), 'hook-package');
|
|
179
|
+
hash.update(await readFile(join(sharedRoot, 'package.json')));
|
|
180
|
+
await hashTree(hash, join(sharedRoot, 'dist'), 'shared-package');
|
|
181
|
+
return hash.digest('hex');
|
|
182
|
+
}
|
|
183
|
+
async function syncDirectory(path) {
|
|
184
|
+
try {
|
|
185
|
+
const handle = await open(path, 'r');
|
|
186
|
+
try {
|
|
187
|
+
await handle.sync();
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
await handle.close();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
/* platform optional */
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async function syncTree(root) {
|
|
198
|
+
const entries = await readdir(root, { withFileTypes: true });
|
|
199
|
+
for (const entry of entries) {
|
|
200
|
+
const path = join(root, entry.name);
|
|
201
|
+
if (entry.isDirectory()) {
|
|
202
|
+
await syncTree(path);
|
|
203
|
+
await syncDirectory(path);
|
|
204
|
+
}
|
|
205
|
+
else if (entry.isFile()) {
|
|
206
|
+
const handle = await open(path, 'r');
|
|
207
|
+
try {
|
|
208
|
+
await handle.sync();
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
await handle.close();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function lockOwnerIsAlive(raw) {
|
|
217
|
+
const pid = Number.parseInt(raw.split(/\s+/, 1)[0] ?? '', 10);
|
|
218
|
+
if (!Number.isSafeInteger(pid) || pid <= 0)
|
|
219
|
+
return false;
|
|
220
|
+
try {
|
|
221
|
+
process.kill(pid, 0);
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
return errorCode(error) === 'EPERM';
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async function removeStaleLock(lockPath) {
|
|
229
|
+
const info = await lstat(lockPath);
|
|
230
|
+
if (!info.isDirectory())
|
|
231
|
+
throw new Error(`Refusing unsafe non-directory installer lock ${lockPath}`);
|
|
232
|
+
if (Date.now() - info.mtimeMs <= LOCK_STALE_MS)
|
|
233
|
+
return false;
|
|
234
|
+
const entries = await readdir(lockPath);
|
|
235
|
+
if (entries.length === 0) {
|
|
236
|
+
try {
|
|
237
|
+
await rmdir(lockPath);
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
if (['ENOENT', 'ENOTEMPTY'].includes(errorCode(error) ?? ''))
|
|
242
|
+
return false;
|
|
243
|
+
throw error;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (entries.length !== 1 || !entries[0].startsWith('owner-'))
|
|
247
|
+
return false;
|
|
248
|
+
const tokenPath = join(lockPath, entries[0]);
|
|
249
|
+
const owner = await readFile(tokenPath, 'utf8');
|
|
250
|
+
if (lockOwnerIsAlive(owner))
|
|
251
|
+
return false;
|
|
252
|
+
try {
|
|
253
|
+
await unlink(tokenPath);
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
if (errorCode(error) === 'ENOENT')
|
|
257
|
+
return false;
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
await rmdir(lockPath);
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
if (['ENOENT', 'ENOTEMPTY'].includes(errorCode(error) ?? ''))
|
|
266
|
+
return false;
|
|
267
|
+
throw error;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
async function acquireLock(lockPath) {
|
|
271
|
+
await mkdir(dirname(lockPath), { recursive: true });
|
|
272
|
+
const owner = `${process.pid} ${Date.now()} ${randomBytes(12).toString('hex')}\n`;
|
|
273
|
+
for (let attempt = 0; attempt < LOCK_RETRIES; attempt += 1) {
|
|
274
|
+
try {
|
|
275
|
+
await mkdir(lockPath, { mode: 0o700 });
|
|
276
|
+
const tokenPath = join(lockPath, `owner-${process.pid}-${randomBytes(12).toString('hex')}`);
|
|
277
|
+
const handle = await open(tokenPath, 'wx', 0o600);
|
|
278
|
+
try {
|
|
279
|
+
await handle.writeFile(owner, 'utf8');
|
|
280
|
+
await handle.sync();
|
|
281
|
+
}
|
|
282
|
+
finally {
|
|
283
|
+
await handle.close();
|
|
284
|
+
}
|
|
285
|
+
await syncDirectory(lockPath);
|
|
286
|
+
await syncDirectory(dirname(lockPath));
|
|
287
|
+
return tokenPath;
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
if (errorCode(error) !== 'EEXIST') {
|
|
291
|
+
await rmdir(lockPath).catch(() => undefined);
|
|
292
|
+
if (errorCode(error) === 'ENOENT')
|
|
293
|
+
continue;
|
|
294
|
+
throw error;
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
if (await removeStaleLock(lockPath))
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
catch (inspectError) {
|
|
301
|
+
if (errorCode(inspectError) === 'ENOENT')
|
|
302
|
+
continue;
|
|
303
|
+
throw inspectError;
|
|
304
|
+
}
|
|
305
|
+
await new Promise((done) => setTimeout(done, LOCK_RETRY_MS));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
throw new Error(`Timed out waiting for installer lock ${lockPath}`);
|
|
309
|
+
}
|
|
310
|
+
export async function withFileLock(lockPath, action) {
|
|
311
|
+
const tokenPath = await acquireLock(lockPath);
|
|
312
|
+
try {
|
|
313
|
+
return await action();
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
try {
|
|
317
|
+
await unlink(tokenPath);
|
|
318
|
+
await rmdir(lockPath);
|
|
319
|
+
await syncDirectory(dirname(lockPath));
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
// A missing token or non-empty successor lock is never removed by a stale owner.
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
export async function withFileLocks(lockPaths, action) {
|
|
327
|
+
const ordered = [...new Set(lockPaths)].sort();
|
|
328
|
+
const acquire = (index) => index >= ordered.length ? action() : withFileLock(ordered[index], () => acquire(index + 1));
|
|
329
|
+
return acquire(0);
|
|
330
|
+
}
|
|
331
|
+
export async function readTextIfExists(path) {
|
|
332
|
+
try {
|
|
333
|
+
return await readFile(path, 'utf8');
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
if (errorCode(error) === 'ENOENT')
|
|
337
|
+
return null;
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
async function writableTarget(path) {
|
|
342
|
+
try {
|
|
343
|
+
return await realpath(path);
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
if (errorCode(error) !== 'ENOENT')
|
|
347
|
+
throw error;
|
|
348
|
+
try {
|
|
349
|
+
const info = await lstat(path);
|
|
350
|
+
if (info.isSymbolicLink())
|
|
351
|
+
throw new Error(`Refusing to replace dangling configuration symlink ${path}`);
|
|
352
|
+
}
|
|
353
|
+
catch (inspectError) {
|
|
354
|
+
if (errorCode(inspectError) !== 'ENOENT')
|
|
355
|
+
throw inspectError;
|
|
356
|
+
}
|
|
357
|
+
return path;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
export async function atomicWriteText(path, next, expectedCurrent) {
|
|
361
|
+
const target = await writableTarget(path);
|
|
362
|
+
await mkdir(dirname(target), { recursive: true });
|
|
363
|
+
if ((await readTextIfExists(target)) !== expectedCurrent)
|
|
364
|
+
throw new Error(`Configuration changed concurrently while installing: ${path}`);
|
|
365
|
+
let mode = 0o600;
|
|
366
|
+
try {
|
|
367
|
+
mode = (await stat(target)).mode & 0o777;
|
|
368
|
+
if ((mode & 0o222) === 0)
|
|
369
|
+
throw new Error(`Configuration is not writable: ${path}`);
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
if (errorCode(error) !== 'ENOENT')
|
|
373
|
+
throw error;
|
|
374
|
+
}
|
|
375
|
+
const tempPath = join(dirname(target), `.${join(target).split(/[\\/]/).pop()}.mnemonik-${process.pid}-${randomBytes(6).toString('hex')}`);
|
|
376
|
+
let handle;
|
|
377
|
+
try {
|
|
378
|
+
handle = await open(tempPath, 'wx', mode);
|
|
379
|
+
await handle.writeFile(next, 'utf8');
|
|
380
|
+
await handle.sync();
|
|
381
|
+
await handle.close();
|
|
382
|
+
handle = undefined;
|
|
383
|
+
if ((await readTextIfExists(target)) !== expectedCurrent)
|
|
384
|
+
throw new Error(`Configuration changed concurrently while installing: ${path}`);
|
|
385
|
+
await rename(tempPath, target);
|
|
386
|
+
await syncDirectory(dirname(target));
|
|
387
|
+
}
|
|
388
|
+
finally {
|
|
389
|
+
if (handle)
|
|
390
|
+
await handle.close().catch(() => undefined);
|
|
391
|
+
await rm(tempPath, { force: true }).catch(() => undefined);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
export async function atomicRestoreText(path, original, expectedCurrent) {
|
|
395
|
+
if (original !== null) {
|
|
396
|
+
await atomicWriteText(path, original, expectedCurrent);
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
if (expectedCurrent === null)
|
|
400
|
+
return;
|
|
401
|
+
await atomicRemoveText(path, expectedCurrent);
|
|
402
|
+
}
|
|
403
|
+
async function restoreQuarantinedText(path, quarantine) {
|
|
404
|
+
try {
|
|
405
|
+
await link(quarantine, path);
|
|
406
|
+
await unlink(quarantine);
|
|
407
|
+
await syncDirectory(dirname(path));
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
throw new Error(`Could not restore concurrently changed configuration; preserved it at ${quarantine}`, { cause: error });
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
export async function atomicRemoveText(path, expectedCurrent) {
|
|
414
|
+
const quarantine = join(dirname(path), `.${join(path).split(/[\\/]/).pop()}.mnemonik-remove-${process.pid}-${randomBytes(6).toString('hex')}`);
|
|
415
|
+
try {
|
|
416
|
+
await rename(path, quarantine);
|
|
417
|
+
}
|
|
418
|
+
catch (error) {
|
|
419
|
+
if (errorCode(error) === 'ENOENT')
|
|
420
|
+
throw new Error(`Configuration changed concurrently while removing: ${path}`);
|
|
421
|
+
throw error;
|
|
422
|
+
}
|
|
423
|
+
const info = await lstat(quarantine);
|
|
424
|
+
const current = info.isFile() ? await readFile(quarantine, 'utf8') : null;
|
|
425
|
+
if (!info.isFile() || current !== expectedCurrent) {
|
|
426
|
+
await restoreQuarantinedText(path, quarantine);
|
|
427
|
+
throw new Error(info.isSymbolicLink()
|
|
428
|
+
? `Refusing to remove configuration symlink ${path}`
|
|
429
|
+
: `Configuration changed concurrently while removing: ${path}`);
|
|
430
|
+
}
|
|
431
|
+
await unlink(quarantine);
|
|
432
|
+
await syncDirectory(dirname(path));
|
|
433
|
+
}
|
|
434
|
+
export async function atomicWriteTransaction(changes) {
|
|
435
|
+
const effective = changes.filter((change) => change.next !== change.expected);
|
|
436
|
+
const identities = await Promise.all(effective.map(async (change) => (await configTargetIdentity(change.path)).identity));
|
|
437
|
+
if (new Set(identities).size !== effective.length)
|
|
438
|
+
throw new Error('Atomic configuration transaction contains duplicate paths');
|
|
439
|
+
const applied = [];
|
|
440
|
+
try {
|
|
441
|
+
for (const change of effective) {
|
|
442
|
+
if (change.next === null) {
|
|
443
|
+
if (change.expected === null)
|
|
444
|
+
continue;
|
|
445
|
+
await atomicRemoveText(change.path, change.expected);
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
await atomicWriteText(change.path, change.next, change.expected);
|
|
449
|
+
}
|
|
450
|
+
applied.push(change);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
catch (error) {
|
|
454
|
+
const rollbackErrors = [];
|
|
455
|
+
for (const change of applied.reverse()) {
|
|
456
|
+
try {
|
|
457
|
+
await atomicRestoreText(change.path, change.expected, change.next);
|
|
458
|
+
}
|
|
459
|
+
catch (rollbackError) {
|
|
460
|
+
rollbackErrors.push(rollbackError);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
if (rollbackErrors.length > 0)
|
|
464
|
+
throw new AggregateError([error, ...rollbackErrors], 'Configuration transaction failed and rollback was incomplete');
|
|
465
|
+
throw error;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
export async function installDurableRuntime(options) {
|
|
469
|
+
if (!OWNER_PATTERN.test(options.runtimeName))
|
|
470
|
+
throw new Error(`Invalid runtime name: ${options.runtimeName}`);
|
|
471
|
+
const manifestRaw = await readFile(join(options.sourcePackageRoot, 'package.json'), 'utf8');
|
|
472
|
+
const manifest = JSON.parse(manifestRaw);
|
|
473
|
+
if (typeof manifest.name !== 'string' || typeof manifest.version !== 'string')
|
|
474
|
+
throw new Error(`Invalid hook package manifest at ${options.sourcePackageRoot}`);
|
|
475
|
+
const sharedRoot = await findDependencyPackageRoot(options.sourcePackageRoot, '@mnemonik/shared');
|
|
476
|
+
const sourceDigest = await runtimeDigest(options.sourcePackageRoot, sharedRoot);
|
|
477
|
+
const digest = sourceDigest.slice(0, 16);
|
|
478
|
+
const version = manifest.version.replace(/[^A-Za-z0-9._-]/g, '_');
|
|
479
|
+
const container = join(options.runtimeParent, options.runtimeName);
|
|
480
|
+
const root = join(container, `${version}-${digest}`);
|
|
481
|
+
const packageRoot = join(root, 'package');
|
|
482
|
+
const entrypoints = Object.fromEntries(options.entrypoints.map((entrypoint) => [entrypoint, join(packageRoot, 'dist', entrypoint)]));
|
|
483
|
+
const validAt = async (candidateRoot) => {
|
|
484
|
+
try {
|
|
485
|
+
const candidatePackage = join(candidateRoot, 'package');
|
|
486
|
+
const installedShared = join(candidatePackage, 'node_modules', '@mnemonik', 'shared');
|
|
487
|
+
const requiredFiles = [
|
|
488
|
+
join(candidatePackage, 'package.json'),
|
|
489
|
+
...options.entrypoints.map((entrypoint) => join(candidatePackage, 'dist', entrypoint)),
|
|
490
|
+
join(installedShared, 'dist', 'index.js'),
|
|
491
|
+
];
|
|
492
|
+
const requiredStats = await Promise.all(requiredFiles.map((path) => stat(path)));
|
|
493
|
+
return (requiredStats.every((info) => info.isFile()) &&
|
|
494
|
+
(await runtimeDigest(candidatePackage, installedShared)) === sourceDigest);
|
|
495
|
+
}
|
|
496
|
+
catch {
|
|
497
|
+
return false;
|
|
498
|
+
}
|
|
499
|
+
};
|
|
500
|
+
await mkdir(container, { recursive: true });
|
|
501
|
+
await withFileLock(join(container, '.install.lock'), async () => {
|
|
502
|
+
if (await validAt(root))
|
|
503
|
+
return;
|
|
504
|
+
const staging = join(container, `.stage-${process.pid}-${randomBytes(6).toString('hex')}`);
|
|
505
|
+
const quarantine = join(container, `.quarantine-${process.pid}-${randomBytes(6).toString('hex')}`);
|
|
506
|
+
const stagingPackage = join(staging, 'package');
|
|
507
|
+
try {
|
|
508
|
+
await mkdir(stagingPackage, { recursive: true });
|
|
509
|
+
await copyFile(join(options.sourcePackageRoot, 'package.json'), join(stagingPackage, 'package.json'));
|
|
510
|
+
await cp(join(options.sourcePackageRoot, 'dist'), join(stagingPackage, 'dist'), {
|
|
511
|
+
recursive: true,
|
|
512
|
+
});
|
|
513
|
+
const stagingShared = join(stagingPackage, 'node_modules', '@mnemonik', 'shared');
|
|
514
|
+
await mkdir(stagingShared, { recursive: true });
|
|
515
|
+
await copyFile(join(sharedRoot, 'package.json'), join(stagingShared, 'package.json'));
|
|
516
|
+
await cp(join(sharedRoot, 'dist'), join(stagingShared, 'dist'), { recursive: true });
|
|
517
|
+
await syncTree(staging);
|
|
518
|
+
await syncDirectory(staging);
|
|
519
|
+
if (!(await validAt(staging)))
|
|
520
|
+
throw new Error(`Mnemonik runtime staging did not validate: ${staging}`);
|
|
521
|
+
let quarantined = false;
|
|
522
|
+
try {
|
|
523
|
+
await rename(root, quarantine);
|
|
524
|
+
quarantined = true;
|
|
525
|
+
}
|
|
526
|
+
catch (error) {
|
|
527
|
+
if (errorCode(error) !== 'ENOENT')
|
|
528
|
+
throw error;
|
|
529
|
+
}
|
|
530
|
+
try {
|
|
531
|
+
await rename(staging, root);
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
if (quarantined) {
|
|
535
|
+
try {
|
|
536
|
+
await rename(quarantine, root);
|
|
537
|
+
}
|
|
538
|
+
catch (restoreError) {
|
|
539
|
+
throw new AggregateError([error, restoreError], 'Mnemonik runtime swap failed and rollback was incomplete');
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
throw error;
|
|
543
|
+
}
|
|
544
|
+
await syncDirectory(container);
|
|
545
|
+
if (!(await validAt(root))) {
|
|
546
|
+
await rm(root, { recursive: true, force: true });
|
|
547
|
+
if (quarantined)
|
|
548
|
+
await rename(quarantine, root);
|
|
549
|
+
throw new Error(`Mnemonik runtime installation did not complete: ${root}`);
|
|
550
|
+
}
|
|
551
|
+
if (quarantined)
|
|
552
|
+
await rm(quarantine, { recursive: true, force: true });
|
|
553
|
+
await syncDirectory(container);
|
|
554
|
+
}
|
|
555
|
+
finally {
|
|
556
|
+
await rm(staging, { recursive: true, force: true }).catch(() => undefined);
|
|
557
|
+
}
|
|
558
|
+
if (!(await validAt(root)))
|
|
559
|
+
throw new Error(`Mnemonik runtime installation did not complete: ${root}`);
|
|
560
|
+
});
|
|
561
|
+
return { root, packageRoot, entrypoints };
|
|
562
|
+
}
|
|
563
|
+
//# sourceMappingURL=installerSupport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installerSupport.js","sourceRoot":"","sources":["../../src/lib/installerSupport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare function isCursorMcpToolEvent(tool: string): boolean;
|
|
2
|
+
/** Canonical server-facing name; call only after ownership has been proved. */
|
|
3
|
+
export declare function canonicalMnemonikMcpTool(tool: string): string | null;
|
|
4
|
+
export interface CursorMcpOwnershipInput {
|
|
5
|
+
tool: string;
|
|
6
|
+
command?: string;
|
|
7
|
+
url?: string;
|
|
8
|
+
cwd: string;
|
|
9
|
+
workspaceRoots?: string[];
|
|
10
|
+
hookServer: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Prove that a globally observed Cursor MCP event belongs to Mnemonik.
|
|
14
|
+
* A namespace is only a user-configurable server key, not authentication.
|
|
15
|
+
* Without exact event URL/command metadata, that extracted key must be bound
|
|
16
|
+
* to the configured Mnemonik endpoint in Cursor's MCP config. Missing,
|
|
17
|
+
* unreadable, or conflicting bindings fail closed.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isMnemonikMcpCall(input: CursorMcpOwnershipInput): Promise<boolean>;
|