@bjorntech/key-ferry 0.1.13 → 0.1.17

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.
Files changed (47) hide show
  1. package/README.md +20 -0
  2. package/dist/broker-registry.d.ts +26 -0
  3. package/dist/broker-registry.d.ts.map +1 -1
  4. package/dist/broker-registry.js +253 -54
  5. package/dist/broker-registry.js.map +1 -1
  6. package/dist/contracts.d.ts +7 -3
  7. package/dist/contracts.d.ts.map +1 -1
  8. package/dist/contracts.js +1 -0
  9. package/dist/contracts.js.map +1 -1
  10. package/dist/options.d.ts +1 -0
  11. package/dist/options.d.ts.map +1 -1
  12. package/dist/options.js +17 -0
  13. package/dist/options.js.map +1 -1
  14. package/dist/plugin.d.ts.map +1 -1
  15. package/dist/plugin.js +13 -4
  16. package/dist/plugin.js.map +1 -1
  17. package/dist/relay/index.d.ts +2 -0
  18. package/dist/relay/index.d.ts.map +1 -1
  19. package/dist/relay/index.js +150 -110
  20. package/dist/relay/index.js.map +1 -1
  21. package/dist/remote.d.ts +12 -1
  22. package/dist/remote.d.ts.map +1 -1
  23. package/dist/remote.js +114 -76
  24. package/dist/remote.js.map +1 -1
  25. package/dist/rpc.d.ts +22 -12
  26. package/dist/rpc.d.ts.map +1 -1
  27. package/dist/rpc.js +27 -27
  28. package/dist/rpc.js.map +1 -1
  29. package/dist/scoped-controller.d.ts +1 -1
  30. package/dist/scoped-controller.d.ts.map +1 -1
  31. package/dist/scoped-controller.js +37 -7
  32. package/dist/scoped-controller.js.map +1 -1
  33. package/dist/scopes/controller-helpers.d.ts.map +1 -1
  34. package/dist/scopes/controller-helpers.js +5 -0
  35. package/dist/scopes/controller-helpers.js.map +1 -1
  36. package/dist/services/process.d.ts +2 -0
  37. package/dist/services/process.d.ts.map +1 -1
  38. package/dist/services/process.js +13 -2
  39. package/dist/services/process.js.map +1 -1
  40. package/dist/varlock/manager.d.ts.map +1 -1
  41. package/dist/varlock/manager.js +312 -74
  42. package/dist/varlock/manager.js.map +1 -1
  43. package/dist/varlock/ownership.d.ts +88 -0
  44. package/dist/varlock/ownership.d.ts.map +1 -0
  45. package/dist/varlock/ownership.js +574 -0
  46. package/dist/varlock/ownership.js.map +1 -0
  47. package/package.json +1 -1
@@ -0,0 +1,574 @@
1
+ import { execFile } from "node:child_process";
2
+ import { mkdir, readFile, readdir, rm, lstat, rename, writeFile, appendFile, } from "node:fs/promises";
3
+ import { homedir, tmpdir } from "node:os";
4
+ import { join, basename } from "node:path";
5
+ import { promisify } from "node:util";
6
+ export const OWNERSHIP_RECORD_VERSION = 2;
7
+ const files = {
8
+ mkdir,
9
+ readFile,
10
+ readdir,
11
+ rm,
12
+ lstat,
13
+ rename,
14
+ writeFile,
15
+ appendFile,
16
+ };
17
+ export function ledgerPath() {
18
+ const state = process.env.XDG_STATE_HOME ?? join(homedir(), "Library", "Application Support");
19
+ return join(state, "key-ferry", "proxy-ledger.jsonl");
20
+ }
21
+ export async function appendProxyLedgerEntry(entry, ops = files, path = ledgerPath()) {
22
+ if (!ops.appendFile)
23
+ return;
24
+ await ops.mkdir(join(path, ".."), { recursive: true, mode: 0o700 });
25
+ await ops.appendFile(path, `${JSON.stringify(entry)}\n`, { encoding: "utf8", mode: 0o600 });
26
+ }
27
+ export async function readProxyLedger(ops = files, path = ledgerPath()) {
28
+ if (!ops.appendFile)
29
+ return [];
30
+ let text;
31
+ try {
32
+ text = await ops.readFile(path, "utf8");
33
+ }
34
+ catch {
35
+ return [];
36
+ }
37
+ const entries = new Map();
38
+ for (const line of text.split("\n"))
39
+ applyLedgerLine(line, entries);
40
+ return [...entries.values()];
41
+ }
42
+ function applyLedgerLine(line, entries) {
43
+ try {
44
+ const value = JSON.parse(line);
45
+ if (!isLedgerEntry(value))
46
+ return;
47
+ if (value.retiredAt)
48
+ entries.delete(value.sessionUuid);
49
+ else
50
+ entries.set(value.sessionUuid, value);
51
+ }
52
+ catch {
53
+ /* tolerate a torn/corrupt append */
54
+ }
55
+ }
56
+ function isLedgerEntry(value) {
57
+ return value?.version === 1 && validLedgerIdentity(value) && validLedgerMetadata(value);
58
+ }
59
+ function validLedgerIdentity(value) {
60
+ return (typeof value.sessionUuid === "string" &&
61
+ Number.isSafeInteger(value.proxyPid) &&
62
+ Number.isSafeInteger(value.ownerPid));
63
+ }
64
+ function validLedgerMetadata(value) {
65
+ return typeof value.cwd === "string" && typeof value.created === "string";
66
+ }
67
+ async function retireProxyLedgerEntry(entry, ops) {
68
+ await appendProxyLedgerEntry({ ...entry, retiredAt: new Date().toISOString() }, ops, ops.ledgerPath);
69
+ }
70
+ const exec = promisify(execFile);
71
+ const inFlightByOps = new WeakMap();
72
+ const lifecycleLoggers = new Set();
73
+ export function setOwnershipLifecycleLogger(logger) {
74
+ if (!logger)
75
+ return () => undefined;
76
+ lifecycleLoggers.add(logger);
77
+ let active = true;
78
+ return () => {
79
+ if (active)
80
+ lifecycleLoggers.delete(logger);
81
+ active = false;
82
+ };
83
+ }
84
+ export function ownershipDirectory(root = tmpdir()) {
85
+ const uid = typeof process.getuid === "function" ? String(process.getuid()) : "unknown";
86
+ return join(root, `key-ferry-${uid}`);
87
+ }
88
+ export function ownershipFileOps(directory) {
89
+ return { ...files, directory };
90
+ }
91
+ function safeName(hash) {
92
+ if (!/^[a-f0-9]{8,128}$/.test(hash))
93
+ throw new TypeError("invalid broker key hash");
94
+ return `${hash}.json`;
95
+ }
96
+ async function secureDirectory(ops) {
97
+ const directory = ops.directory ?? ownershipDirectory();
98
+ // Minimal injected stores may model only record files; the real implementation
99
+ // always provides lstat and therefore always takes the security checks below.
100
+ if (!ops.lstat)
101
+ return directory;
102
+ try {
103
+ const info = await directoryInfo(ops, directory);
104
+ assertSecureDirectory(info);
105
+ return directory;
106
+ }
107
+ catch {
108
+ for (const logger of lifecycleLoggers)
109
+ logger({ event: "stale-skipped", keyHash: "0".repeat(12), directory });
110
+ throw new Error("ownership directory unavailable");
111
+ }
112
+ }
113
+ async function directoryInfo(ops, directory) {
114
+ try {
115
+ return await (ops.lstat ?? lstat)(directory);
116
+ }
117
+ catch (error) {
118
+ if (error?.code !== "ENOENT")
119
+ throw error;
120
+ await createDirectory(ops, directory);
121
+ return (ops.lstat ?? lstat)(directory);
122
+ }
123
+ }
124
+ async function createDirectory(ops, directory) {
125
+ try {
126
+ await ops.mkdir(directory, { recursive: false, mode: 0o700 });
127
+ }
128
+ catch (error) {
129
+ if (error?.code !== "EEXIST")
130
+ throw error;
131
+ }
132
+ }
133
+ function assertSecureDirectory(info) {
134
+ const uid = typeof process.getuid === "function" ? process.getuid() : undefined;
135
+ const insecure = [
136
+ info.isSymbolicLink(),
137
+ !info.isDirectory(),
138
+ uid !== undefined && info.uid !== uid,
139
+ (Number(info.mode) & 0o077) !== 0,
140
+ ].some(Boolean);
141
+ if (insecure)
142
+ throw new Error("insecure ownership directory");
143
+ }
144
+ export async function writeOwnershipRecord(record, ops = files) {
145
+ const directory = await secureDirectory(ops);
146
+ const target = join(directory, safeName(record.brokerKeyHash));
147
+ const temporary = join(directory, `.${basename(target)}.${process.pid}.${Math.random().toString(16).slice(2)}.tmp`);
148
+ // wx prevents an attacker from replacing a file we are about to publish.
149
+ const published = publishedRecord(record, directory);
150
+ await ops.writeFile(temporary, `${JSON.stringify(published)}\n`, {
151
+ encoding: "utf8",
152
+ mode: 0o600,
153
+ flag: "wx",
154
+ });
155
+ try {
156
+ await (ops.rename ?? rename)(temporary, target);
157
+ }
158
+ catch (error) {
159
+ await ops.rm(temporary, { force: true }).catch(() => undefined);
160
+ throw error;
161
+ }
162
+ }
163
+ function publishedRecord(record, directory) {
164
+ const sessionUuid = record.sessionUuid ?? record.sessionId;
165
+ const starterPid = record.starterPid ?? record.pid;
166
+ const starterStartTime = record.starterStartTime ?? record.pidStartTime;
167
+ return {
168
+ version: 2,
169
+ brokerKeyHash: record.brokerKeyHash,
170
+ sessionUuid,
171
+ starterPid,
172
+ ...optionalStartTime(starterStartTime),
173
+ cwd: record.cwd ?? directory,
174
+ created: record.created,
175
+ };
176
+ }
177
+ function optionalStartTime(value) {
178
+ return value ? { starterStartTime: value } : {};
179
+ }
180
+ export async function removeOwnershipRecord(hash, ops = files) {
181
+ const dir = await secureDirectory(ops);
182
+ await ops.rm(join(dir, safeName(hash)), { force: true });
183
+ }
184
+ function normalize(value) {
185
+ return isNormalizedRecord(value) ? value : undefined;
186
+ }
187
+ function isNormalizedRecord(value) {
188
+ return (value?.version === 2 &&
189
+ typeof value.sessionUuid === "string" &&
190
+ Number.isSafeInteger(value.starterPid) &&
191
+ typeof value.cwd === "string" &&
192
+ typeof value.created === "string");
193
+ }
194
+ export async function readOwnershipRecords(ops = files, onError) {
195
+ let directory;
196
+ try {
197
+ directory = await secureDirectory(ops);
198
+ }
199
+ catch {
200
+ onError?.(new Error("ownership directory unavailable"));
201
+ return [];
202
+ }
203
+ let names;
204
+ try {
205
+ names = await ops.readdir(directory);
206
+ }
207
+ catch {
208
+ onError?.(new Error("ownership directory unavailable"));
209
+ return [];
210
+ }
211
+ const records = [];
212
+ for (const name of names.filter((item) => /^[a-f0-9]{8,128}\.json$/.test(item))) {
213
+ const record = await readRecord(ops, join(directory, name));
214
+ if (record)
215
+ records.push(record);
216
+ }
217
+ // Directory enumeration order is filesystem-dependent (notably on ext4),
218
+ // so callers must not observe readdir order as ownership-record order.
219
+ return records.sort((left, right) => left.created.localeCompare(right.created) ||
220
+ left.sessionUuid.localeCompare(right.sessionUuid));
221
+ }
222
+ async function readRecord(ops, path) {
223
+ try {
224
+ const info = ops.lstat ? await ops.lstat(path) : undefined;
225
+ if (info && !regularRecordFile(info))
226
+ return undefined;
227
+ const record = normalize(JSON.parse(await ops.readFile(path, "utf8")));
228
+ await removeInvalidRecord(record, ops, path);
229
+ return record;
230
+ }
231
+ catch {
232
+ await ops.rm(path, { force: true }).catch(() => undefined);
233
+ return undefined;
234
+ }
235
+ }
236
+ async function removeInvalidRecord(record, ops, path) {
237
+ if (!record)
238
+ await ops.rm(path, { force: true });
239
+ }
240
+ function regularRecordFile(info) {
241
+ return !info.isSymbolicLink() && info.isFile();
242
+ }
243
+ export async function reapOwnershipRecords(verifier, ops = files) {
244
+ const key = ops.directory ?? ownershipDirectory();
245
+ const byDirectory = inFlightByOps.get(ops) ?? new Map();
246
+ inFlightByOps.set(ops, byDirectory);
247
+ const existing = byDirectory.get(key);
248
+ if (existing)
249
+ return existing;
250
+ const operation = reapOwnershipRecordsOnce(verifier, ops).finally(() => {
251
+ if (byDirectory.get(key) === operation)
252
+ byDirectory.delete(key);
253
+ });
254
+ byDirectory.set(key, operation);
255
+ return operation;
256
+ }
257
+ async function reapOwnershipRecordsOnce(verifier, ops) {
258
+ const records = await readOwnershipRecords(ops, () => lifecycleLoggers.forEach((l) => l({
259
+ event: "stale-skipped",
260
+ keyHash: "0".repeat(12),
261
+ directory: ownershipDirectory(),
262
+ })));
263
+ // The optional verifier seam preserves compatibility with small injected test
264
+ // verifiers. The production reaper always supplies status and therefore never
265
+ // relies on starter liveness to decide whether a daemon is owned.
266
+ if (!verifier.status)
267
+ return reapLegacyRecords(records, verifier, ops);
268
+ let sessions;
269
+ try {
270
+ sessions = await verifier.status();
271
+ }
272
+ catch {
273
+ for (const r of records)
274
+ lifecycleLoggers.forEach((l) => l({
275
+ event: "stale-skipped",
276
+ keyHash: r.brokerKeyHash.slice(0, 12),
277
+ directory: r.cwd,
278
+ }));
279
+ return { reaped: 0, skipped: records.length };
280
+ }
281
+ const result = await reapActiveRecords(records, sessions, verifier, ops);
282
+ await reapOrphanSessions(records, sessions, verifier, ops, result);
283
+ return result;
284
+ }
285
+ async function reapOrphanSessions(records, sessions, verifier, ops, result) {
286
+ const ledger = await readProxyLedger(ops, ops.ledgerPath);
287
+ const recorded = new Set(records.map((record) => record.sessionUuid));
288
+ for (const session of sessions)
289
+ await reapOrphanSession(session, recorded, ledger, verifier, ops, result);
290
+ }
291
+ async function reapOrphanSession(session, recorded, ledger, verifier, ops, result) {
292
+ if (session.endedAt || recorded.has(session.uuid))
293
+ return;
294
+ const proxyPid = session.pid ?? session.ownerPid;
295
+ const orphan = proxyPid === undefined ? undefined : await findOrphanOwner(session, proxyPid, ledger, verifier);
296
+ if (orphan)
297
+ await stopOrphanSession(session, orphan.entry, orphan.ownerPid, verifier, ops, result);
298
+ }
299
+ async function findOrphanOwner(session, proxyPid, ledger, verifier) {
300
+ const entry = ledger.find((item) => matchesLedgerEntry(item, session.uuid, proxyPid, session.startTime));
301
+ if (!(await hasPositiveOwnership(entry, session, proxyPid, verifier)) || !verifier.isAlive)
302
+ return undefined;
303
+ const ownerPid = entry?.ownerPid ?? session.ownerPid;
304
+ if (ownerPid === undefined || (await ownerAlive(ownerPid, entry?.ownerStartTime, verifier)))
305
+ return undefined;
306
+ return { entry, ownerPid };
307
+ }
308
+ async function stopOrphanSession(session, entry, ownerPid, verifier, ops, result) {
309
+ try {
310
+ await verifier.stop(makeOrphanRecord(session, entry, ownerPid));
311
+ if (await sessionGone(session.uuid, verifier)) {
312
+ if (entry)
313
+ await retireProxyLedgerEntry(entry, ops).catch(() => undefined);
314
+ result.reaped++;
315
+ }
316
+ else
317
+ result.skipped++;
318
+ }
319
+ catch {
320
+ result.skipped++;
321
+ }
322
+ }
323
+ function matchesLedgerEntry(entry, uuid, pid, start) {
324
+ return (entry.sessionUuid === uuid &&
325
+ entry.proxyPid === pid &&
326
+ (entry.proxyStartTime === undefined || start === undefined || entry.proxyStartTime === start));
327
+ }
328
+ async function hasPositiveOwnership(entry, session, pid, verifier) {
329
+ if (entry || session.keyFerryMarker === "key-ferry")
330
+ return true;
331
+ if (!verifier.processEnv)
332
+ return false;
333
+ const env = await verifier.processEnv(pid).catch(() => undefined);
334
+ return env?.KEY_FERRY_PROXY_MARKER === "key-ferry";
335
+ }
336
+ function makeOrphanRecord(session, entry, ownerPid) {
337
+ return {
338
+ version: 2,
339
+ brokerKeyHash: "f".repeat(64),
340
+ sessionUuid: session.uuid,
341
+ starterPid: ownerPid,
342
+ ...orphanStartTime(entry?.ownerStartTime, "starterStartTime"),
343
+ cwd: entry?.cwd ?? session.cwd ?? "",
344
+ created: entry?.created ?? new Date().toISOString(),
345
+ ...optionalNumber(entry?.proxyPid, "proxyPid"),
346
+ ...orphanStartTime(entry?.proxyStartTime, "proxyStartTime"),
347
+ };
348
+ }
349
+ function orphanStartTime(value, key) {
350
+ return value ? { [key]: value } : {};
351
+ }
352
+ function optionalNumber(value, key) {
353
+ return value === undefined ? {} : { [key]: value };
354
+ }
355
+ async function ownerAlive(pid, expected, verifier) {
356
+ if (!verifier.isAlive || !(await verifier.isAlive(pid)))
357
+ return false;
358
+ if (!expected || !verifier.startTime)
359
+ return true;
360
+ const actual = await verifier.startTime(pid);
361
+ return actual === expected;
362
+ }
363
+ async function reapLegacyRecords(records, verifier, ops) {
364
+ let reaped = 0, skipped = 0;
365
+ for (const record of records) {
366
+ if (await legacyRecordIsStale(record, verifier)) {
367
+ skipped++;
368
+ await removeOwnershipRecord(record.brokerKeyHash, ops);
369
+ }
370
+ else {
371
+ await verifier.stop(record);
372
+ await removeOwnershipRecord(record.brokerKeyHash, ops);
373
+ reaped++;
374
+ }
375
+ }
376
+ return { reaped, skipped };
377
+ }
378
+ async function legacyRecordIsStale(record, verifier) {
379
+ const alive = (await verifier.isAlive?.(record.starterPid)) ?? false;
380
+ const start = await verifier.startTime?.(record.starterPid);
381
+ const command = await verifier.command?.(record.starterPid);
382
+ return !alive || start !== record.starterStartTime || command === undefined;
383
+ }
384
+ async function reapActiveRecords(records, sessions, verifier, ops) {
385
+ let reaped = 0, skipped = 0;
386
+ for (const record of records) {
387
+ const result = await reapActiveRecord(record, sessions, verifier, ops);
388
+ reaped += result.reaped;
389
+ skipped += result.skipped;
390
+ }
391
+ return { reaped, skipped };
392
+ }
393
+ async function reapActiveRecord(record, sessions, verifier, ops) {
394
+ const active = sessions.find((s) => s.uuid === record.sessionUuid && !s.endedAt);
395
+ if (!active) {
396
+ await removeInactiveRecord(record, verifier, ops);
397
+ return { reaped: 1, skipped: 0 };
398
+ }
399
+ if (await starterStillOwned(record, verifier))
400
+ return { reaped: 0, skipped: 1 };
401
+ return reapOwnedRecord(record, verifier, ops);
402
+ }
403
+ async function removeInactiveRecord(record, verifier, ops) {
404
+ await retireInactiveLedger(record, verifier, ops);
405
+ await removeOwnershipRecord(record.brokerKeyHash, ops);
406
+ lifecycleLoggers.forEach((l) => l({ event: "stale-reaped", keyHash: record.brokerKeyHash.slice(0, 12), directory: record.cwd }));
407
+ }
408
+ async function retireInactiveLedger(record, verifier, ops) {
409
+ if (await sessionGone(record.sessionUuid, verifier)) {
410
+ const ledger = await readProxyLedger(ops, ops.ledgerPath);
411
+ await retireLedgerEntry(ledger, record.sessionUuid, ops);
412
+ }
413
+ }
414
+ async function retireLedgerEntry(ledger, sessionUuid, ops) {
415
+ const entry = ledger.find((item) => item.sessionUuid === sessionUuid);
416
+ if (entry)
417
+ await retireProxyLedgerEntry(entry, ops).catch(() => undefined);
418
+ }
419
+ async function reapOwnedRecord(record, verifier, ops) {
420
+ try {
421
+ await verifier.stop(record);
422
+ if (!(await sessionGone(record.sessionUuid, verifier)))
423
+ return { reaped: 0, skipped: 1 };
424
+ await removeOwnershipRecord(record.brokerKeyHash, ops);
425
+ const ledger = await readProxyLedger(ops, ops.ledgerPath);
426
+ const entry = ledger.find((item) => item.sessionUuid === record.sessionUuid);
427
+ if (entry)
428
+ await retireProxyLedgerEntry(entry, ops).catch(() => undefined);
429
+ lifecycleLoggers.forEach((l) => l({
430
+ event: "stale-reaped",
431
+ keyHash: record.brokerKeyHash.slice(0, 12),
432
+ directory: record.cwd,
433
+ }));
434
+ return { reaped: 1, skipped: 0 };
435
+ }
436
+ catch {
437
+ return { reaped: 0, skipped: 1 };
438
+ }
439
+ }
440
+ const REAP_VERIFY_ATTEMPTS = 3;
441
+ const REAP_VERIFY_DELAY_MS = 50;
442
+ async function sessionGone(sessionUuid, verifier) {
443
+ if (!verifier.status)
444
+ return false;
445
+ for (let attempt = 0; attempt < REAP_VERIFY_ATTEMPTS; attempt++) {
446
+ const sessions = await verifier.status().catch(() => undefined);
447
+ if (sessions && !sessions.some((session) => session.uuid === sessionUuid && !session.endedAt))
448
+ return true;
449
+ await waitForReapAttempt(attempt);
450
+ }
451
+ return false;
452
+ }
453
+ async function waitForReapAttempt(attempt) {
454
+ if (attempt + 1 < REAP_VERIFY_ATTEMPTS)
455
+ await new Promise((resolve) => setTimeout(resolve, REAP_VERIFY_DELAY_MS));
456
+ }
457
+ function normalizeProxyStatus(parsed) {
458
+ const sessions = proxyStatusSessions(parsed);
459
+ return sessions.map((session) => ({
460
+ ...session,
461
+ keyFerryMarker: session.env?.KEY_FERRY_PROXY_MARKER,
462
+ pid: session.ownerPid,
463
+ startTime: session.startedAt,
464
+ }));
465
+ }
466
+ function proxyStatusSessions(parsed) {
467
+ return Array.isArray(parsed) ? parsed : proxyStatusFallback(parsed);
468
+ }
469
+ function proxyStatusFallback(parsed) {
470
+ return parsed.sessions ?? [];
471
+ }
472
+ async function readProcessEnvironment(pid) {
473
+ try {
474
+ const result = await exec(...processEnvironmentCommand(pid), { timeout: 2_000 });
475
+ return parseProcessMarker(result.stdout);
476
+ }
477
+ catch {
478
+ return undefined;
479
+ }
480
+ }
481
+ function processEnvironmentCommand(pid) {
482
+ return process.platform === "darwin"
483
+ ? ["ps", ["-Eww", "-p", String(pid), "-o", "command="]]
484
+ : ["sh", ["-c", `tr '\0' ' ' < /proc/${pid}/environ`]];
485
+ }
486
+ function parseProcessMarker(stdout) {
487
+ const marker = stdout.match(/(?:^|\s)KEY_FERRY_PROXY_MARKER=([^\s]+)/)?.[1];
488
+ return marker === undefined ? {} : { KEY_FERRY_PROXY_MARKER: marker };
489
+ }
490
+ export function reapStaleOwnershipRecords(command = "varlock", ops = files) {
491
+ const directory = ops.directory ?? ownershipDirectory();
492
+ const configuredCommand = typeof command === "string" ? [command] : [...command];
493
+ const executable = configuredCommand[0] ?? "varlock";
494
+ const verifier = {
495
+ expectedCommand: configuredCommand,
496
+ status: async () => {
497
+ const result = await exec(executable, ["proxy", "status", "--format", "json"], {
498
+ timeout: 2_000,
499
+ });
500
+ return normalizeProxyStatus(JSON.parse(result.stdout));
501
+ },
502
+ stop: async (record) => {
503
+ await exec(executable, ["proxy", "stop", "--session", record.sessionUuid], {
504
+ timeout: 2_000,
505
+ });
506
+ },
507
+ isAlive: async (pid) => {
508
+ try {
509
+ process.kill(pid, 0);
510
+ return true;
511
+ }
512
+ catch {
513
+ return false;
514
+ }
515
+ },
516
+ startTime: async (pid) => {
517
+ try {
518
+ const result = await exec("ps", ["-o", "lstart=", "-p", String(pid)], {
519
+ timeout: 2_000,
520
+ });
521
+ return result.stdout.trim();
522
+ }
523
+ catch {
524
+ return undefined;
525
+ }
526
+ },
527
+ processEnv: (pid) => readProcessEnvironment(pid),
528
+ command: async (pid) => {
529
+ try {
530
+ const result = await exec("ps", ["-o", "command=", "-p", String(pid)], {
531
+ timeout: 2_000,
532
+ });
533
+ return result.stdout.trim().split(/\s+/);
534
+ }
535
+ catch {
536
+ return undefined;
537
+ }
538
+ },
539
+ };
540
+ return reapOwnershipRecords(verifier, ops)
541
+ .then(() => undefined)
542
+ .catch(() => undefined);
543
+ }
544
+ export async function starterStillOwned(record, verifier) {
545
+ if (!hasStarterVerifier(record, verifier))
546
+ return false;
547
+ const isAlive = verifier.isAlive;
548
+ const getStartTime = verifier.startTime;
549
+ const getCommand = verifier.command;
550
+ if (!isAlive || !getStartTime || !getCommand)
551
+ return false;
552
+ const alive = await isAlive(record.starterPid);
553
+ const start = await getStartTime(record.starterPid);
554
+ const command = await getCommand(record.starterPid);
555
+ return sameStarterIdentity(alive, start, command, record.starterStartTime, verifier.expectedCommand);
556
+ }
557
+ export function hasStarterVerifier(record, verifier) {
558
+ return [record.starterStartTime, verifier.isAlive, verifier.startTime, verifier.command].every(Boolean);
559
+ }
560
+ export function sameStarterIdentity(alive, start, command, expectedStart, expectedCommand = ["varlock"]) {
561
+ const configured = expectedCommand.length > 0 ? expectedCommand : ["varlock"];
562
+ const executableMatches = command !== undefined &&
563
+ basename(command[0] ?? "") === basename(configured[0] ?? "") &&
564
+ configured.slice(1).every((part, index) => command[index + 1] === part);
565
+ const startPrefix = command?.slice(configured.length, configured.length + 2);
566
+ return [
567
+ alive,
568
+ start === expectedStart,
569
+ command,
570
+ executableMatches,
571
+ JSON.stringify(startPrefix) === JSON.stringify(["proxy", "start"]),
572
+ ].every(Boolean);
573
+ }
574
+ //# sourceMappingURL=ownership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownership.js","sourceRoot":"","sources":["../../src/varlock/ownership.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@bjorntech/key-ferry",
4
- "version": "0.1.13",
4
+ "version": "0.1.17",
5
5
  "description": "Project-scoped Key Ferry integration for OpenCode V2",
6
6
  "keywords": [],
7
7
  "homepage": "https://github.com/bjorntech/key-ferry#readme",