@mnemonik/shared 7.104.9 → 7.104.10

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/index.d.ts CHANGED
@@ -24,5 +24,8 @@ export * from './hostAdapter.js';
24
24
  export * from './hostBinary.js';
25
25
  export type { ServiceDefinition, SupervisorStatus, ServiceOperation, ServiceResult, } from './scannerSupervisor.js';
26
26
  export { apiOrigin } from './apiOrigin.js';
27
- export { WINDOWS_SERVICE_BUDGET_MS } from './scannerSupervisor.js';
27
+ export { WINDOWS_SERVICE_BUDGET_MS, SCANNER_STARTUP_BUDGET_MS, SCANNER_RAPID_FAILURE_LIMIT, SCANNER_HANDOFF_BUDGET_MS, SCANNER_RECEIPT_STALE_MS, SCANNER_MAC_COMMAND_BUDGET_MS, SCANNER_STOP_BUDGET_MS, SCANNER_REMOVAL_BUDGET_MS, scannerAttemptHealthy, } from './scannerSupervisor.js';
28
+ export { printLaunchdRegistration, stopLaunchdRegistrations, removeMacScanner, authorizeMacService, macScannerPlist, macScannerLauncher, } from './launchdControl.js';
29
+ export { uninstallSystemdUnit } from './systemdControl.js';
30
+ export { pidIsScanner } from './scannerPid.js';
28
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,eAAO,MAAM,6BAA6B,SAAU,CAAC;AACrD,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,wBAAwB,GAC9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,YAAY,EACZ,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAC3B,+BAA+B,EAC/B,uBAAuB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAEhC,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,eAAO,MAAM,6BAA6B,SAAU,CAAC;AACrD,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,wBAAwB,GAC9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,YAAY,EACZ,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAC3B,+BAA+B,EAC/B,uBAAuB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAEhC,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -23,5 +23,8 @@ export * from './readiness.js';
23
23
  export * from './hostAdapter.js';
24
24
  export * from './hostBinary.js';
25
25
  export { apiOrigin } from './apiOrigin.js';
26
- export { WINDOWS_SERVICE_BUDGET_MS } from './scannerSupervisor.js';
26
+ export { WINDOWS_SERVICE_BUDGET_MS, SCANNER_STARTUP_BUDGET_MS, SCANNER_RAPID_FAILURE_LIMIT, SCANNER_HANDOFF_BUDGET_MS, SCANNER_RECEIPT_STALE_MS, SCANNER_MAC_COMMAND_BUDGET_MS, SCANNER_STOP_BUDGET_MS, SCANNER_REMOVAL_BUDGET_MS, scannerAttemptHealthy, } from './scannerSupervisor.js';
27
+ export { printLaunchdRegistration, stopLaunchdRegistrations, removeMacScanner, authorizeMacService, macScannerPlist, macScannerLauncher, } from './launchdControl.js';
28
+ export { uninstallSystemdUnit } from './systemdControl.js';
29
+ export { pidIsScanner } from './scannerPid.js';
27
30
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC;AACrD,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,GAGrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,GAKnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,mBAAmB,EACnB,YAAY,GAGb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,YAAY,EACZ,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAC3B,+BAA+B,EAC/B,uBAAuB,GAIxB,MAAM,qBAAqB,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAShC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC;AACrD,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,GAGrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,GAKnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,mBAAmB,EACnB,YAAY,GAGb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,YAAY,EACZ,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAC3B,+BAA+B,EAC/B,uBAAuB,GAIxB,MAAM,qBAAqB,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAShC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,25 @@
1
+ type Run = (file: string, args: string[]) => Promise<string>;
2
+ /** Print one registration, or null when the domain holds none and says so plainly. */
3
+ export declare function printLaunchdRegistration(domain: string, label: string, run: Run): Promise<string | null>;
4
+ /** Are any of these processes still alive? ps exits 1 when none of them exist. */
5
+ export declare function processesAlive(pids: Iterable<number>, run: Run): Promise<boolean>;
6
+ export declare const macScannerLauncher = "/Library/Application Support/Mnemonik/scanner-launcher";
7
+ export declare const macScannerPlist = "/Library/LaunchDaemons/ai.mnemonik.scanner.plist";
8
+ export declare function authorizeMacService(run: Run, env?: NodeJS.ProcessEnv): Promise<void>;
9
+ /** Native removal also works when the selected scanner executable is missing or old. */
10
+ export declare function removeMacScanner(state: string, home: string, uid: number, run: Run, options?: {
11
+ now?: () => number;
12
+ sleep?: (ms: number) => Promise<void>;
13
+ plist?: string;
14
+ launcher?: string;
15
+ remove?: boolean;
16
+ environment?: NodeJS.ProcessEnv;
17
+ }): Promise<void>;
18
+ /** Stop every registration and verify its processes exited before callers remove software. */
19
+ export declare function stopLaunchdRegistrations(domains: string[], label: string, run: Run, options?: {
20
+ now?: () => number;
21
+ sleep?: (ms: number) => Promise<void>;
22
+ recordedPid?: number | null;
23
+ }): Promise<void>;
24
+ export {};
25
+ //# sourceMappingURL=launchdControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchdControl.d.ts","sourceRoot":"","sources":["../src/launchdControl.ts"],"names":[],"mappings":"AAKA,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7D,sFAAsF;AACtF,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBxB;AAED,kFAAkF;AAClF,wBAAsB,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAcvF;AAED,eAAO,MAAM,kBAAkB,2DAA2D,CAAC;AAC3F,eAAO,MAAM,eAAe,qDAAqD,CAAC;AAClF,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,oBAAc,iBAqBpE;AAED,wFAAwF;AACxF,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,GAAG,EACR,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC5B,iBAmDP;AAED,8FAA8F;AAC9F,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,GAAG,EACR,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,GACL,OAAO,CAAC,IAAI,CAAC,CAkCf"}
@@ -0,0 +1,149 @@
1
+ import { setTimeout as delay } from 'node:timers/promises';
2
+ import { mkdir, readFile, rm, writeFile, lstat } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { SCANNER_STOP_BUDGET_MS } from './scannerSupervisor.js';
5
+ /** Print one registration, or null when the domain holds none and says so plainly. */
6
+ export async function printLaunchdRegistration(domain, label, run) {
7
+ try {
8
+ return await run('launchctl', ['print', `${domain}/${label}`]);
9
+ }
10
+ catch (error) {
11
+ // An unavailable GUI login is normal over SSH. Other errors prove nothing.
12
+ const failure = error;
13
+ if (/Could not find (?:service|domain)\b/i.test(failure.message))
14
+ return null;
15
+ const unsupportedDomain = /Could not print domain:\s*125:\s*Domain does not support specified action\s*$/.test(failure.message);
16
+ if (domain.startsWith('gui/') &&
17
+ unsupportedDomain &&
18
+ ((failure.code === 125 && !failure.killed && !failure.signal) ||
19
+ /^supervisor_command_failed killed=false code=125 signal=null:/.test(failure.message)))
20
+ return null;
21
+ throw error;
22
+ }
23
+ }
24
+ /** Are any of these processes still alive? ps exits 1 when none of them exist. */
25
+ export async function processesAlive(pids, run) {
26
+ const list = [...pids];
27
+ if (!list.length)
28
+ return false;
29
+ try {
30
+ return (await run('ps', ['-p', list.join(','), '-o', 'pid='])).trim() !== '';
31
+ }
32
+ catch (error) {
33
+ const failure = error;
34
+ if ((failure.code === 1 && !failure.killed && !failure.signal) ||
35
+ /^supervisor_command_failed killed=false code=1 signal=null:/.test(failure.message))
36
+ return false;
37
+ throw error;
38
+ }
39
+ }
40
+ export const macScannerLauncher = '/Library/Application Support/Mnemonik/scanner-launcher';
41
+ export const macScannerPlist = '/Library/LaunchDaemons/ai.mnemonik.scanner.plist';
42
+ export async function authorizeMacService(run, env = process.env) {
43
+ let interrupted = false;
44
+ const interrupt = () => {
45
+ interrupted = true;
46
+ };
47
+ process.on('SIGINT', interrupt);
48
+ try {
49
+ // sudo reads /dev/tty itself, including when the service protocol uses stdin.
50
+ await run('sudo', [...(env.SUDO_ASKPASS ? ['-A'] : []), '-v']);
51
+ }
52
+ catch (error) {
53
+ throw new Error(!interrupted &&
54
+ /terminal is required|a password is required|no tty present|no askpass program/iu.test(error.message)
55
+ ? 'mac_authorization_required'
56
+ : 'mac_authorization_failed');
57
+ }
58
+ finally {
59
+ process.removeListener('SIGINT', interrupt);
60
+ }
61
+ }
62
+ /** Native removal also works when the selected scanner executable is missing or old. */
63
+ export async function removeMacScanner(state, home, uid, run, options = {}) {
64
+ const exists = (path) => lstat(path).then(() => true, (error) => {
65
+ if (error.code === 'ENOENT')
66
+ return false;
67
+ throw error;
68
+ });
69
+ const receipt = await readFile(join(state, 'scanner/status.json'), 'utf8').catch((error) => {
70
+ if (error.code === 'ENOENT')
71
+ return null;
72
+ throw error;
73
+ });
74
+ const recordedPid = receipt ? JSON.parse(receipt).snapshot?.lifecycle?.pid : undefined;
75
+ const system = (await printLaunchdRegistration('system', 'ai.mnemonik.scanner', run)) !== null;
76
+ const plist = options.plist ?? macScannerPlist;
77
+ const present = await exists(plist);
78
+ const launcher = options.launcher ?? macScannerLauncher;
79
+ const launcherPresent = await exists(launcher);
80
+ if (system || present || launcherPresent)
81
+ await authorizeMacService(run, options.environment);
82
+ const privileged = (file, args) => file === 'launchctl' && args[0] === 'bootout'
83
+ ? run('sudo', ['-n', '/bin/launchctl', ...args])
84
+ : run(file, args);
85
+ await stopLaunchdRegistrations(['system'], 'ai.mnemonik.scanner', privileged, {
86
+ ...options,
87
+ });
88
+ const legacy = [`user/${uid}`, `gui/${uid}`];
89
+ await stopLaunchdRegistrations(legacy, 'ai.mnemonik.scanner.replacement', run, options);
90
+ await stopLaunchdRegistrations(legacy, 'ai.mnemonik.scanner', run, { ...options, recordedPid });
91
+ // Nothing is being replaced any more, so the last attempt must not outlive the
92
+ // job it describes: its dead pid would read as an interrupted replacement.
93
+ await rm(join(state, 'scanner/service-replacement'), { recursive: true, force: true });
94
+ if (options.remove === false) {
95
+ await mkdir(join(state, 'scanner/service-replacement'), { recursive: true });
96
+ await writeFile(join(state, 'scanner/service-replacement/result.json'), JSON.stringify({ stopped: true }));
97
+ return;
98
+ }
99
+ if (present || launcherPresent)
100
+ await run('sudo', ['-n', '/bin/rm', '-f', plist, launcher]);
101
+ for (const label of ['ai.mnemonik.scanner', 'ai.mnemonik.scanner.replacement'])
102
+ await rm(join(home, 'Library/LaunchAgents', `${label}.plist`), { force: true });
103
+ await rm(join(state, 'scanner/assets'), { recursive: true, force: true });
104
+ await rm(join(state, 'scanner/service-supervisor.json'), { force: true });
105
+ await rm(join(state, 'scanner/service-migrated'), { force: true });
106
+ await rm(join(state, 'scanner/system-service.plist'), { force: true });
107
+ }
108
+ /** Stop every registration and verify its processes exited before callers remove software. */
109
+ export async function stopLaunchdRegistrations(domains, label, run, options = {}) {
110
+ const now = options.now ?? Date.now;
111
+ const sleep = options.sleep ?? delay;
112
+ const inspect = (domain) => printLaunchdRegistration(domain, label, run);
113
+ const pids = new Set();
114
+ const recordedPid = options.recordedPid;
115
+ if (typeof recordedPid === 'number' && Number.isInteger(recordedPid) && recordedPid > 0)
116
+ pids.add(recordedPid);
117
+ const registrations = [];
118
+ // Inspect every domain before stopping any service: an unknown domain error
119
+ // must not turn a harmless preflight failure into a partially stopped scanner.
120
+ for (const domain of domains) {
121
+ const output = await inspect(domain);
122
+ if (output === null)
123
+ continue;
124
+ const pid = Number(/\bpid = (\d+)/.exec(output)?.[1]);
125
+ if (pid)
126
+ pids.add(pid);
127
+ registrations.push(domain);
128
+ }
129
+ for (const domain of registrations)
130
+ await run('launchctl', ['bootout', `${domain}/${label}`]);
131
+ const deadline = now() + SCANNER_STOP_BUDGET_MS;
132
+ do {
133
+ let registered = false;
134
+ for (const domain of domains) {
135
+ const output = await inspect(domain);
136
+ if (output !== null) {
137
+ registered = true;
138
+ const pid = Number(/\bpid = (\d+)/.exec(output)?.[1]);
139
+ if (pid)
140
+ pids.add(pid);
141
+ }
142
+ }
143
+ if (!registered && !(await processesAlive(pids, run)))
144
+ return;
145
+ await sleep(100);
146
+ } while (now() <= deadline);
147
+ throw new Error('scanner_stop_failed');
148
+ }
149
+ //# sourceMappingURL=launchdControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchdControl.js","sourceRoot":"","sources":["../src/launchdControl.ts"],"names":[],"mappings":"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"}
@@ -96,6 +96,7 @@ export declare class RuntimeReader {
96
96
  private operation;
97
97
  protected verifyAt(artifact: Artifact, ref: Reference, directory: string): Promise<Verified>;
98
98
  private verifyOpen;
99
+ verifyRetainedRuntime(artifact: Artifact, reference: Reference): Promise<Verified>;
99
100
  verifyRuntime(artifact: Artifact): Promise<Verified>;
100
101
  }
101
102
  export * from './runtimeSigners.js';
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeReader.d.ts","sourceRoot":"","sources":["../src/runtimeReader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtimeReader.d.ts","sourceRoot":"","sources":["../src/runtimeReader.ts"],"names":[],"mappings":"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"}
@@ -394,6 +394,10 @@ export class RuntimeReader {
394
394
  }
395
395
  return { directory, manifest: m, entry: join(directory, m.entry), reference: ref };
396
396
  }
397
+ verifyRetainedRuntime(artifact, reference) {
398
+ versionName(reference.version);
399
+ return this.verifyAt(artifact, reference, join(dirname(this.pointerPath(artifact)), reference.version));
400
+ }
397
401
  async verifyRuntime(artifact) {
398
402
  return this.operation(async () => {
399
403
  const p = await this.pointer(artifact);
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeReader.js","sourceRoot":"","sources":["../src/runtimeReader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtimeReader.js","sourceRoot":"","sources":["../src/runtimeReader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ export declare function pidIsScanner(pid: number, platform?: NodeJS.Platform, exec?: typeof execFileSync, identity?: {
3
+ binaryPath: string;
4
+ uid: number;
5
+ }): boolean;
6
+ //# sourceMappingURL=scannerPid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scannerPid.d.ts","sourceRoot":"","sources":["../src/scannerPid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAyDlD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,QAAQ,kBAAmB,EAC3B,IAAI,sBAAe,EACnB,QAAQ,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAWT"}
@@ -0,0 +1,67 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ /**
4
+ * PID-reuse guard shared by the CLI lock paths (index.ts) and doctor.
5
+ *
6
+ * `process.kill(pid, 0)` only proves that *some* process is alive at that
7
+ * PID, not that it is ours. After a reboot or plain PID recycling the number
8
+ * in daemon.pid can belong to an unrelated process, SIGTERMing it from
9
+ * `stop`, or refusing to `start` because of it, would be wrong. So a live PID
10
+ * only counts as the scanner when its command line matches the daemon's
11
+ * signature (same pattern doctor uses to find daemon processes via `ps`).
12
+ */
13
+ const SCANNER_CMD_PATTERN = /(mnemonik-scanner|scanner[\\/]dist[\\/]index\.js)/;
14
+ const capture = {
15
+ encoding: 'utf-8',
16
+ stdio: ['ignore', 'pipe', 'ignore'],
17
+ timeout: 5000,
18
+ };
19
+ function processCmdline(pid, platform, exec = execFileSync) {
20
+ if (!Number.isSafeInteger(pid) || pid <= 0)
21
+ return null;
22
+ if (platform === 'win32') {
23
+ try {
24
+ return exec('powershell.exe', [
25
+ '-NoProfile',
26
+ '-NonInteractive',
27
+ '-Command',
28
+ `(Get-CimInstance Win32_Process -Filter "ProcessId = ${pid}").CommandLine`,
29
+ ], capture).trim();
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ // Linux: /proc/<pid>/cmdline is NUL-separated argv, cheap and exact.
36
+ if (platform === 'linux') {
37
+ try {
38
+ return readFileSync(`/proc/${pid}/cmdline`, 'utf-8').replace(/\0/g, ' ').trim();
39
+ }
40
+ catch {
41
+ // /proc unavailable or unreadable, fall back to ps below.
42
+ }
43
+ }
44
+ try {
45
+ return exec('ps', ['-o', 'args=', '-p', String(pid)], capture).trim();
46
+ }
47
+ catch {
48
+ return null; // No such process, or ps unavailable, cannot confirm identity.
49
+ }
50
+ }
51
+ export function pidIsScanner(pid, platform = process.platform, exec = execFileSync, identity) {
52
+ const cmdline = processCmdline(pid, platform, exec);
53
+ if (cmdline === null)
54
+ return false;
55
+ if (!identity)
56
+ return SCANNER_CMD_PATTERN.test(cmdline);
57
+ // Recovery may signal only the exact verified runtime, running as this owner.
58
+ if (cmdline !== `${identity.binaryPath} start`)
59
+ return false;
60
+ try {
61
+ return exec('ps', ['-o', 'uid=', '-p', String(pid)], capture).trim() === String(identity.uid);
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ //# sourceMappingURL=scannerPid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scannerPid.js","sourceRoot":"","sources":["../src/scannerPid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;;;;GASG;AACH,MAAM,mBAAmB,GAAG,mDAAmD,CAAC;AAChF,MAAM,OAAO,GAAG;IACd,QAAQ,EAAE,OAAgB;IAC1B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAA0B;IAC5D,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,SAAS,cAAc,CACrB,GAAW,EACX,QAAyB,EACzB,IAAI,GAAG,YAAY;IAEnB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,IAAI,CACT,gBAAgB,EAChB;gBACE,YAAY;gBACZ,iBAAiB;gBACjB,UAAU;gBACV,uDAAuD,GAAG,gBAAgB;aAC3E,EACD,OAAO,CACR,CAAC,IAAI,EAAE,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,qEAAqE;IACrE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,SAAS,GAAG,UAAU,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,+DAA+D;IAC9E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,GAAW,EACX,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAC3B,IAAI,GAAG,YAAY,EACnB,QAA8C;IAE9C,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,CAAC,QAAQ;QAAE,OAAO,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,8EAA8E;IAC9E,IAAI,OAAO,KAAK,GAAG,QAAQ,CAAC,UAAU,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -1,7 +1,41 @@
1
1
  export declare const WINDOWS_SERVICE_BUDGET_MS = 120000;
2
+ /** Every scanner supervision timing, named once. Budgets come from measured cold starts. */
3
+ export declare const SCANNER_STARTUP_BUDGET_MS = 60000, SCANNER_RAPID_FAILURE_LIMIT = 3, SCANNER_HANDOFF_BUDGET_MS = 150000, SCANNER_RECEIPT_STALE_MS = 360000, SCANNER_MAC_COMMAND_BUDGET_MS = 360000, SCANNER_STOP_BUDGET_MS = 10000, SCANNER_REMOVAL_BUDGET_MS = 180000;
4
+ /**
5
+ * One rule for every caller: did this attempt reach its local running state? It
6
+ * judges only what the machine can prove, never the network. A clean exit keeps
7
+ * the progress it made, and a pause counts only where a pause was expected.
8
+ */
9
+ export declare function scannerAttemptHealthy(receipt: {
10
+ recordedAt?: number;
11
+ snapshot?: {
12
+ version?: string | null;
13
+ lifecycle?: {
14
+ pid?: number | null;
15
+ state?: string;
16
+ };
17
+ startupTimings?: {
18
+ localReadyAt?: number | null;
19
+ };
20
+ };
21
+ } | null, attempt: {
22
+ pid?: number | null;
23
+ startedAt: number;
24
+ version?: string;
25
+ } | null, paused?: boolean): boolean;
2
26
  export interface ServiceDefinition {
3
27
  /** Test isolation; production always uses mnemonik-scanner.service. */
4
28
  unitName?: string;
29
+ /** Publish the selected release after authorizing the system service. */
30
+ replacement?: {
31
+ pointer: {
32
+ after: string;
33
+ };
34
+ state?: {
35
+ before: string | null;
36
+ after: string;
37
+ };
38
+ };
5
39
  binaryPath: string;
6
40
  arguments: readonly ['start'];
7
41
  workingDirectory: string;
@@ -1 +1 @@
1
- {"version":3,"file":"scannerSupervisor.d.ts","sourceRoot":"","sources":["../src/scannerSupervisor.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,SAAU,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,IAAI,CAAC;IACjB,OAAO,EAAE;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,cAAc,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACrF,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,gBAAgB,CAAA;CAAE,GAC9C;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"scannerSupervisor.d.ts","sourceRoot":"","sources":["../src/scannerSupervisor.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,SAAU,CAAC;AACjD,4FAA4F;AAC5F,eAAO,MAAM,yBAAyB,QAAS,EAC7C,2BAA2B,IAAI,EAC/B,yBAAyB,SAAU,EACnC,wBAAwB,SAAU,EAClC,6BAA6B,SAAU,EACvC,sBAAsB,QAAS,EAC/B,yBAAyB,SAAU,CAAC;AAEtC;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,SAAS,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACpD,cAAc,CAAC,EAAE;YAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC;KACnD,CAAC;CACH,GAAG,IAAI,EACR,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAC5E,MAAM,UAAQ,GACb,OAAO,CAeT;AAED,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,WAAW,CAAC,EAAE;QACZ,OAAO,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3B,KAAK,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;KAClD,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,IAAI,CAAC;IACjB,OAAO,EAAE;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,cAAc,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACrF,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,gBAAgB,CAAA;CAAE,GAC9C;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -1,2 +1,23 @@
1
1
  export const WINDOWS_SERVICE_BUDGET_MS = 120_000;
2
+ /** Every scanner supervision timing, named once. Budgets come from measured cold starts. */
3
+ export const SCANNER_STARTUP_BUDGET_MS = 60_000, SCANNER_RAPID_FAILURE_LIMIT = 3, SCANNER_HANDOFF_BUDGET_MS = 150_000, SCANNER_RECEIPT_STALE_MS = 360_000, SCANNER_MAC_COMMAND_BUDGET_MS = 360_000, SCANNER_STOP_BUDGET_MS = 10_000, SCANNER_REMOVAL_BUDGET_MS = 180_000;
4
+ /**
5
+ * One rule for every caller: did this attempt reach its local running state? It
6
+ * judges only what the machine can prove, never the network. A clean exit keeps
7
+ * the progress it made, and a pause counts only where a pause was expected.
8
+ */
9
+ export function scannerAttemptHealthy(receipt, attempt, paused = false) {
10
+ const life = receipt?.snapshot?.lifecycle;
11
+ const readyAt = receipt?.snapshot?.startupTimings?.localReadyAt;
12
+ const state = life?.state;
13
+ return (!!receipt &&
14
+ !!attempt &&
15
+ (receipt.recordedAt ?? 0) > attempt.startedAt &&
16
+ (attempt.version === undefined || receipt.snapshot?.version === attempt.version) &&
17
+ (life?.pid === attempt.pid || state === 'stopped') &&
18
+ ((paused && state === 'paused') ||
19
+ ((readyAt ?? 0) > attempt.startedAt &&
20
+ (state === 'running' || state === 'starting' || state === 'stopped')) ||
21
+ (readyAt === undefined && state === 'running')));
22
+ }
2
23
  //# sourceMappingURL=scannerSupervisor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scannerSupervisor.js","sourceRoot":"","sources":["../src/scannerSupervisor.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"scannerSupervisor.js","sourceRoot":"","sources":["../src/scannerSupervisor.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC;AACjD,4FAA4F;AAC5F,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,EAC7C,2BAA2B,GAAG,CAAC,EAC/B,yBAAyB,GAAG,OAAO,EACnC,wBAAwB,GAAG,OAAO,EAClC,6BAA6B,GAAG,OAAO,EACvC,sBAAsB,GAAG,MAAM,EAC/B,yBAAyB,GAAG,OAAO,CAAC;AAEtC;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAOQ,EACR,OAA4E,EAC5E,MAAM,GAAG,KAAK;IAEd,MAAM,IAAI,GAAG,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,CAAC;IAChE,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC;IAC1B,OAAO,CACL,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO;QACT,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS;QAC7C,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC;QAChF,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,KAAK,KAAK,SAAS,CAAC;QAClD,CAAC,CAAC,MAAM,IAAI,KAAK,KAAK,QAAQ,CAAC;YAC7B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS;gBACjC,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC;YACvE,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAClD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Native removal also works when the installed scanner or its unit file is damaged. */
2
+ export declare function uninstallSystemdUnit(unitPath: string, run: (file: string, args: string[]) => Promise<string>, options?: {
3
+ now?: () => number;
4
+ sleep?: (ms: number) => Promise<void>;
5
+ recordedPid?: number | null;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=systemdControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemdControl.d.ts","sourceRoot":"","sources":["../src/systemdControl.ts"],"names":[],"mappings":"AAOA,wFAAwF;AACxF,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,EACtD,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,GACL,OAAO,CAAC,IAAI,CAAC,CAmFf"}
@@ -0,0 +1,85 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { rm } from 'node:fs/promises';
3
+ import { basename, dirname, join } from 'node:path';
4
+ import { setTimeout as delay } from 'node:timers/promises';
5
+ import { processesAlive } from './launchdControl.js';
6
+ import { SCANNER_STOP_BUDGET_MS } from './scannerSupervisor.js';
7
+ /** Native removal also works when the installed scanner or its unit file is damaged. */
8
+ export async function uninstallSystemdUnit(unitPath, run, options = {}) {
9
+ try {
10
+ const unit = basename(unitPath);
11
+ if (!/^mnemonik-scanner(?:-test-[0-9]+)?\.service$/.test(unit))
12
+ throw new Error('invalid_test_unit');
13
+ const command = (args) => run('systemctl', ['--user', ...args]);
14
+ const inspect = async () => {
15
+ const output = await command([
16
+ 'show',
17
+ unit,
18
+ '--property=LoadState,ActiveState,MainPID,UnitFileState',
19
+ ]);
20
+ const state = Object.fromEntries(output
21
+ .trim()
22
+ .split('\n')
23
+ .map((line) => {
24
+ const split = line.indexOf('=');
25
+ return [line.slice(0, split), line.slice(split + 1)];
26
+ }));
27
+ if (!state.LoadState ||
28
+ !state.ActiveState ||
29
+ !/^\d+$/.test(state.MainPID) ||
30
+ state.UnitFileState === undefined)
31
+ throw new Error('systemd_inspection_failed');
32
+ return state;
33
+ };
34
+ const before = await inspect();
35
+ const pids = new Set();
36
+ if (Number(before.MainPID))
37
+ pids.add(Number(before.MainPID));
38
+ const recordedPid = options.recordedPid;
39
+ if (typeof recordedPid === 'number' && Number.isInteger(recordedPid) && recordedPid > 0)
40
+ pids.add(recordedPid);
41
+ if (before.LoadState !== 'not-found' ||
42
+ before.ActiveState !== 'inactive' ||
43
+ Number(before.MainPID))
44
+ await command(['stop', unit]);
45
+ try {
46
+ await command(['disable', '--now', unit]);
47
+ }
48
+ catch (error) {
49
+ // Missing backing files can make disable fail before removing its enable link.
50
+ if (existsSync(unitPath) ||
51
+ !new RegExp(`Unit file ${unit.replaceAll('.', '\\.')} does not exist\\.?\\s*$`).test(error.message))
52
+ throw error;
53
+ await rm(join(dirname(unitPath), 'default.target.wants', unit), { force: true });
54
+ await command(['daemon-reload']);
55
+ }
56
+ if ((await inspect()).ActiveState === 'failed')
57
+ await command(['reset-failed', unit]);
58
+ const now = options.now ?? Date.now;
59
+ const wait = async (removed) => {
60
+ const deadline = now() + SCANNER_STOP_BUDGET_MS;
61
+ do {
62
+ const state = await inspect();
63
+ if (Number(state.MainPID))
64
+ pids.add(Number(state.MainPID));
65
+ const alive = await processesAlive(pids, run);
66
+ if (state.ActiveState === 'inactive' &&
67
+ Number(state.MainPID) === 0 &&
68
+ !alive &&
69
+ ['', 'disabled', 'static', 'indirect', 'not-found'].includes(state.UnitFileState) &&
70
+ (!removed || state.LoadState === 'not-found'))
71
+ return;
72
+ await (options.sleep ?? delay)(100);
73
+ } while (now() <= deadline);
74
+ throw new Error('systemd_stop_unverified');
75
+ };
76
+ await wait(false);
77
+ await rm(unitPath, { force: true });
78
+ await command(['daemon-reload']);
79
+ await wait(true);
80
+ }
81
+ catch (cause) {
82
+ throw new Error('scanner_stop_failed', { cause });
83
+ }
84
+ }
85
+ //# sourceMappingURL=systemdControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemdControl.js","sourceRoot":"","sources":["../src/systemdControl.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnemonik/shared",
3
- "version": "7.104.9",
3
+ "version": "7.104.10",
4
4
  "description": "Shared constants and utilities for Mnemonik packages",
5
5
  "repository": {
6
6
  "type": "git",
package/src/index.ts CHANGED
@@ -92,4 +92,27 @@ export type {
92
92
 
93
93
  export { apiOrigin } from './apiOrigin.js';
94
94
 
95
- export { WINDOWS_SERVICE_BUDGET_MS } from './scannerSupervisor.js';
95
+ export {
96
+ WINDOWS_SERVICE_BUDGET_MS,
97
+ SCANNER_STARTUP_BUDGET_MS,
98
+ SCANNER_RAPID_FAILURE_LIMIT,
99
+ SCANNER_HANDOFF_BUDGET_MS,
100
+ SCANNER_RECEIPT_STALE_MS,
101
+ SCANNER_MAC_COMMAND_BUDGET_MS,
102
+ SCANNER_STOP_BUDGET_MS,
103
+ SCANNER_REMOVAL_BUDGET_MS,
104
+ scannerAttemptHealthy,
105
+ } from './scannerSupervisor.js';
106
+
107
+ export {
108
+ printLaunchdRegistration,
109
+ stopLaunchdRegistrations,
110
+ removeMacScanner,
111
+ authorizeMacService,
112
+ macScannerPlist,
113
+ macScannerLauncher,
114
+ } from './launchdControl.js';
115
+
116
+ export { uninstallSystemdUnit } from './systemdControl.js';
117
+
118
+ export { pidIsScanner } from './scannerPid.js';
@@ -0,0 +1,187 @@
1
+ import { setTimeout as delay } from 'node:timers/promises';
2
+ import { mkdir, readFile, rm, writeFile, lstat } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { SCANNER_STOP_BUDGET_MS } from './scannerSupervisor.js';
5
+
6
+ type Run = (file: string, args: string[]) => Promise<string>;
7
+
8
+ /** Print one registration, or null when the domain holds none and says so plainly. */
9
+ export async function printLaunchdRegistration(
10
+ domain: string,
11
+ label: string,
12
+ run: Run
13
+ ): Promise<string | null> {
14
+ try {
15
+ return await run('launchctl', ['print', `${domain}/${label}`]);
16
+ } catch (error) {
17
+ // An unavailable GUI login is normal over SSH. Other errors prove nothing.
18
+ const failure = error as Error & { code?: number; killed?: boolean; signal?: string | null };
19
+ if (/Could not find (?:service|domain)\b/i.test(failure.message)) return null;
20
+ const unsupportedDomain =
21
+ /Could not print domain:\s*125:\s*Domain does not support specified action\s*$/.test(
22
+ failure.message
23
+ );
24
+ if (
25
+ domain.startsWith('gui/') &&
26
+ unsupportedDomain &&
27
+ ((failure.code === 125 && !failure.killed && !failure.signal) ||
28
+ /^supervisor_command_failed killed=false code=125 signal=null:/.test(failure.message))
29
+ )
30
+ return null;
31
+ throw error;
32
+ }
33
+ }
34
+
35
+ /** Are any of these processes still alive? ps exits 1 when none of them exist. */
36
+ export async function processesAlive(pids: Iterable<number>, run: Run): Promise<boolean> {
37
+ const list = [...pids];
38
+ if (!list.length) return false;
39
+ try {
40
+ return (await run('ps', ['-p', list.join(','), '-o', 'pid='])).trim() !== '';
41
+ } catch (error) {
42
+ const failure = error as Error & { code?: number; killed?: boolean; signal?: string | null };
43
+ if (
44
+ (failure.code === 1 && !failure.killed && !failure.signal) ||
45
+ /^supervisor_command_failed killed=false code=1 signal=null:/.test(failure.message)
46
+ )
47
+ return false;
48
+ throw error;
49
+ }
50
+ }
51
+
52
+ export const macScannerLauncher = '/Library/Application Support/Mnemonik/scanner-launcher';
53
+ export const macScannerPlist = '/Library/LaunchDaemons/ai.mnemonik.scanner.plist';
54
+ export async function authorizeMacService(run: Run, env = process.env) {
55
+ let interrupted = false;
56
+ const interrupt = () => {
57
+ interrupted = true;
58
+ };
59
+ process.on('SIGINT', interrupt);
60
+ try {
61
+ // sudo reads /dev/tty itself, including when the service protocol uses stdin.
62
+ await run('sudo', [...(env.SUDO_ASKPASS ? ['-A'] : []), '-v']);
63
+ } catch (error) {
64
+ throw new Error(
65
+ !interrupted &&
66
+ /terminal is required|a password is required|no tty present|no askpass program/iu.test(
67
+ (error as Error).message
68
+ )
69
+ ? 'mac_authorization_required'
70
+ : 'mac_authorization_failed'
71
+ );
72
+ } finally {
73
+ process.removeListener('SIGINT', interrupt);
74
+ }
75
+ }
76
+
77
+ /** Native removal also works when the selected scanner executable is missing or old. */
78
+ export async function removeMacScanner(
79
+ state: string,
80
+ home: string,
81
+ uid: number,
82
+ run: Run,
83
+ options: {
84
+ now?: () => number;
85
+ sleep?: (ms: number) => Promise<void>;
86
+ plist?: string;
87
+ launcher?: string;
88
+ remove?: boolean;
89
+ environment?: NodeJS.ProcessEnv;
90
+ } = {}
91
+ ) {
92
+ const exists = (path: string) =>
93
+ lstat(path).then(
94
+ () => true,
95
+ (error: NodeJS.ErrnoException) => {
96
+ if (error.code === 'ENOENT') return false;
97
+ throw error;
98
+ }
99
+ );
100
+ const receipt = await readFile(join(state, 'scanner/status.json'), 'utf8').catch(
101
+ (error: NodeJS.ErrnoException) => {
102
+ if (error.code === 'ENOENT') return null;
103
+ throw error;
104
+ }
105
+ );
106
+ const recordedPid = receipt ? JSON.parse(receipt).snapshot?.lifecycle?.pid : undefined;
107
+ const system = (await printLaunchdRegistration('system', 'ai.mnemonik.scanner', run)) !== null;
108
+ const plist = options.plist ?? macScannerPlist;
109
+ const present = await exists(plist);
110
+ const launcher = options.launcher ?? macScannerLauncher;
111
+ const launcherPresent = await exists(launcher);
112
+ if (system || present || launcherPresent) await authorizeMacService(run, options.environment);
113
+ const privileged: Run = (file, args) =>
114
+ file === 'launchctl' && args[0] === 'bootout'
115
+ ? run('sudo', ['-n', '/bin/launchctl', ...args])
116
+ : run(file, args);
117
+ await stopLaunchdRegistrations(['system'], 'ai.mnemonik.scanner', privileged, {
118
+ ...options,
119
+ });
120
+ const legacy = [`user/${uid}`, `gui/${uid}`];
121
+ await stopLaunchdRegistrations(legacy, 'ai.mnemonik.scanner.replacement', run, options);
122
+ await stopLaunchdRegistrations(legacy, 'ai.mnemonik.scanner', run, { ...options, recordedPid });
123
+ // Nothing is being replaced any more, so the last attempt must not outlive the
124
+ // job it describes: its dead pid would read as an interrupted replacement.
125
+ await rm(join(state, 'scanner/service-replacement'), { recursive: true, force: true });
126
+ if (options.remove === false) {
127
+ await mkdir(join(state, 'scanner/service-replacement'), { recursive: true });
128
+ await writeFile(
129
+ join(state, 'scanner/service-replacement/result.json'),
130
+ JSON.stringify({ stopped: true })
131
+ );
132
+ return;
133
+ }
134
+ if (present || launcherPresent) await run('sudo', ['-n', '/bin/rm', '-f', plist, launcher]);
135
+ for (const label of ['ai.mnemonik.scanner', 'ai.mnemonik.scanner.replacement'])
136
+ await rm(join(home, 'Library/LaunchAgents', `${label}.plist`), { force: true });
137
+ await rm(join(state, 'scanner/assets'), { recursive: true, force: true });
138
+ await rm(join(state, 'scanner/service-supervisor.json'), { force: true });
139
+ await rm(join(state, 'scanner/service-migrated'), { force: true });
140
+ await rm(join(state, 'scanner/system-service.plist'), { force: true });
141
+ }
142
+
143
+ /** Stop every registration and verify its processes exited before callers remove software. */
144
+ export async function stopLaunchdRegistrations(
145
+ domains: string[],
146
+ label: string,
147
+ run: Run,
148
+ options: {
149
+ now?: () => number;
150
+ sleep?: (ms: number) => Promise<void>;
151
+ recordedPid?: number | null;
152
+ } = {}
153
+ ): Promise<void> {
154
+ const now = options.now ?? Date.now;
155
+ const sleep = options.sleep ?? delay;
156
+ const inspect = (domain: string) => printLaunchdRegistration(domain, label, run);
157
+ const pids = new Set<number>();
158
+ const recordedPid = options.recordedPid;
159
+ if (typeof recordedPid === 'number' && Number.isInteger(recordedPid) && recordedPid > 0)
160
+ pids.add(recordedPid);
161
+ const registrations = [];
162
+ // Inspect every domain before stopping any service: an unknown domain error
163
+ // must not turn a harmless preflight failure into a partially stopped scanner.
164
+ for (const domain of domains) {
165
+ const output = await inspect(domain);
166
+ if (output === null) continue;
167
+ const pid = Number(/\bpid = (\d+)/.exec(output)?.[1]);
168
+ if (pid) pids.add(pid);
169
+ registrations.push(domain);
170
+ }
171
+ for (const domain of registrations) await run('launchctl', ['bootout', `${domain}/${label}`]);
172
+ const deadline = now() + SCANNER_STOP_BUDGET_MS;
173
+ do {
174
+ let registered = false;
175
+ for (const domain of domains) {
176
+ const output = await inspect(domain);
177
+ if (output !== null) {
178
+ registered = true;
179
+ const pid = Number(/\bpid = (\d+)/.exec(output)?.[1]);
180
+ if (pid) pids.add(pid);
181
+ }
182
+ }
183
+ if (!registered && !(await processesAlive(pids, run))) return;
184
+ await sleep(100);
185
+ } while (now() <= deadline);
186
+ throw new Error('scanner_stop_failed');
187
+ }
@@ -478,6 +478,14 @@ export class RuntimeReader {
478
478
  }
479
479
  return { directory, manifest: m, entry: join(directory, m.entry), reference: ref };
480
480
  }
481
+ verifyRetainedRuntime(artifact: Artifact, reference: Reference): Promise<Verified> {
482
+ versionName(reference.version);
483
+ return this.verifyAt(
484
+ artifact,
485
+ reference,
486
+ join(dirname(this.pointerPath(artifact)), reference.version)
487
+ );
488
+ }
481
489
  async verifyRuntime(artifact: Artifact): Promise<Verified> {
482
490
  return this.operation(async () => {
483
491
  const p = await this.pointer(artifact);
@@ -0,0 +1,74 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+
4
+ /**
5
+ * PID-reuse guard shared by the CLI lock paths (index.ts) and doctor.
6
+ *
7
+ * `process.kill(pid, 0)` only proves that *some* process is alive at that
8
+ * PID, not that it is ours. After a reboot or plain PID recycling the number
9
+ * in daemon.pid can belong to an unrelated process, SIGTERMing it from
10
+ * `stop`, or refusing to `start` because of it, would be wrong. So a live PID
11
+ * only counts as the scanner when its command line matches the daemon's
12
+ * signature (same pattern doctor uses to find daemon processes via `ps`).
13
+ */
14
+ const SCANNER_CMD_PATTERN = /(mnemonik-scanner|scanner[\\/]dist[\\/]index\.js)/;
15
+ const capture = {
16
+ encoding: 'utf-8' as const,
17
+ stdio: ['ignore', 'pipe', 'ignore'] as ('ignore' | 'pipe')[],
18
+ timeout: 5000,
19
+ };
20
+
21
+ function processCmdline(
22
+ pid: number,
23
+ platform: NodeJS.Platform,
24
+ exec = execFileSync
25
+ ): string | null {
26
+ if (!Number.isSafeInteger(pid) || pid <= 0) return null;
27
+ if (platform === 'win32') {
28
+ try {
29
+ return exec(
30
+ 'powershell.exe',
31
+ [
32
+ '-NoProfile',
33
+ '-NonInteractive',
34
+ '-Command',
35
+ `(Get-CimInstance Win32_Process -Filter "ProcessId = ${pid}").CommandLine`,
36
+ ],
37
+ capture
38
+ ).trim();
39
+ } catch {
40
+ return null;
41
+ }
42
+ }
43
+ // Linux: /proc/<pid>/cmdline is NUL-separated argv, cheap and exact.
44
+ if (platform === 'linux') {
45
+ try {
46
+ return readFileSync(`/proc/${pid}/cmdline`, 'utf-8').replace(/\0/g, ' ').trim();
47
+ } catch {
48
+ // /proc unavailable or unreadable, fall back to ps below.
49
+ }
50
+ }
51
+ try {
52
+ return exec('ps', ['-o', 'args=', '-p', String(pid)], capture).trim();
53
+ } catch {
54
+ return null; // No such process, or ps unavailable, cannot confirm identity.
55
+ }
56
+ }
57
+
58
+ export function pidIsScanner(
59
+ pid: number,
60
+ platform = process.platform,
61
+ exec = execFileSync,
62
+ identity?: { binaryPath: string; uid: number }
63
+ ): boolean {
64
+ const cmdline = processCmdline(pid, platform, exec);
65
+ if (cmdline === null) return false;
66
+ if (!identity) return SCANNER_CMD_PATTERN.test(cmdline);
67
+ // Recovery may signal only the exact verified runtime, running as this owner.
68
+ if (cmdline !== `${identity.binaryPath} start`) return false;
69
+ try {
70
+ return exec('ps', ['-o', 'uid=', '-p', String(pid)], capture).trim() === String(identity.uid);
71
+ } catch {
72
+ return false;
73
+ }
74
+ }
@@ -1,8 +1,54 @@
1
1
  export const WINDOWS_SERVICE_BUDGET_MS = 120_000;
2
+ /** Every scanner supervision timing, named once. Budgets come from measured cold starts. */
3
+ export const SCANNER_STARTUP_BUDGET_MS = 60_000,
4
+ SCANNER_RAPID_FAILURE_LIMIT = 3,
5
+ SCANNER_HANDOFF_BUDGET_MS = 150_000,
6
+ SCANNER_RECEIPT_STALE_MS = 360_000,
7
+ SCANNER_MAC_COMMAND_BUDGET_MS = 360_000,
8
+ SCANNER_STOP_BUDGET_MS = 10_000,
9
+ SCANNER_REMOVAL_BUDGET_MS = 180_000;
10
+
11
+ /**
12
+ * One rule for every caller: did this attempt reach its local running state? It
13
+ * judges only what the machine can prove, never the network. A clean exit keeps
14
+ * the progress it made, and a pause counts only where a pause was expected.
15
+ */
16
+ export function scannerAttemptHealthy(
17
+ receipt: {
18
+ recordedAt?: number;
19
+ snapshot?: {
20
+ version?: string | null;
21
+ lifecycle?: { pid?: number | null; state?: string };
22
+ startupTimings?: { localReadyAt?: number | null };
23
+ };
24
+ } | null,
25
+ attempt: { pid?: number | null; startedAt: number; version?: string } | null,
26
+ paused = false
27
+ ): boolean {
28
+ const life = receipt?.snapshot?.lifecycle;
29
+ const readyAt = receipt?.snapshot?.startupTimings?.localReadyAt;
30
+ const state = life?.state;
31
+ return (
32
+ !!receipt &&
33
+ !!attempt &&
34
+ (receipt.recordedAt ?? 0) > attempt.startedAt &&
35
+ (attempt.version === undefined || receipt.snapshot?.version === attempt.version) &&
36
+ (life?.pid === attempt.pid || state === 'stopped') &&
37
+ ((paused && state === 'paused') ||
38
+ ((readyAt ?? 0) > attempt.startedAt &&
39
+ (state === 'running' || state === 'starting' || state === 'stopped')) ||
40
+ (readyAt === undefined && state === 'running'))
41
+ );
42
+ }
2
43
 
3
44
  export interface ServiceDefinition {
4
45
  /** Test isolation; production always uses mnemonik-scanner.service. */
5
46
  unitName?: string;
47
+ /** Publish the selected release after authorizing the system service. */
48
+ replacement?: {
49
+ pointer: { after: string };
50
+ state?: { before: string | null; after: string };
51
+ };
6
52
  binaryPath: string;
7
53
  arguments: readonly ['start'];
8
54
  workingDirectory: string;
@@ -0,0 +1,100 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { rm } from 'node:fs/promises';
3
+ import { basename, dirname, join } from 'node:path';
4
+ import { setTimeout as delay } from 'node:timers/promises';
5
+ import { processesAlive } from './launchdControl.js';
6
+ import { SCANNER_STOP_BUDGET_MS } from './scannerSupervisor.js';
7
+
8
+ /** Native removal also works when the installed scanner or its unit file is damaged. */
9
+ export async function uninstallSystemdUnit(
10
+ unitPath: string,
11
+ run: (file: string, args: string[]) => Promise<string>,
12
+ options: {
13
+ now?: () => number;
14
+ sleep?: (ms: number) => Promise<void>;
15
+ recordedPid?: number | null;
16
+ } = {}
17
+ ): Promise<void> {
18
+ try {
19
+ const unit = basename(unitPath);
20
+ if (!/^mnemonik-scanner(?:-test-[0-9]+)?\.service$/.test(unit))
21
+ throw new Error('invalid_test_unit');
22
+ const command = (args: string[]) => run('systemctl', ['--user', ...args]);
23
+ const inspect = async () => {
24
+ const output = await command([
25
+ 'show',
26
+ unit,
27
+ '--property=LoadState,ActiveState,MainPID,UnitFileState',
28
+ ]);
29
+ const state = Object.fromEntries(
30
+ output
31
+ .trim()
32
+ .split('\n')
33
+ .map((line) => {
34
+ const split = line.indexOf('=');
35
+ return [line.slice(0, split), line.slice(split + 1)];
36
+ })
37
+ );
38
+ if (
39
+ !state.LoadState ||
40
+ !state.ActiveState ||
41
+ !/^\d+$/.test(state.MainPID) ||
42
+ state.UnitFileState === undefined
43
+ )
44
+ throw new Error('systemd_inspection_failed');
45
+ return state;
46
+ };
47
+ const before = await inspect();
48
+ const pids = new Set<number>();
49
+ if (Number(before.MainPID)) pids.add(Number(before.MainPID));
50
+ const recordedPid = options.recordedPid;
51
+ if (typeof recordedPid === 'number' && Number.isInteger(recordedPid) && recordedPid > 0)
52
+ pids.add(recordedPid);
53
+ if (
54
+ before.LoadState !== 'not-found' ||
55
+ before.ActiveState !== 'inactive' ||
56
+ Number(before.MainPID)
57
+ )
58
+ await command(['stop', unit]);
59
+ try {
60
+ await command(['disable', '--now', unit]);
61
+ } catch (error) {
62
+ // Missing backing files can make disable fail before removing its enable link.
63
+ if (
64
+ existsSync(unitPath) ||
65
+ !new RegExp(`Unit file ${unit.replaceAll('.', '\\.')} does not exist\\.?\\s*$`).test(
66
+ (error as Error).message
67
+ )
68
+ )
69
+ throw error;
70
+ await rm(join(dirname(unitPath), 'default.target.wants', unit), { force: true });
71
+ await command(['daemon-reload']);
72
+ }
73
+ if ((await inspect()).ActiveState === 'failed') await command(['reset-failed', unit]);
74
+ const now = options.now ?? Date.now;
75
+ const wait = async (removed: boolean) => {
76
+ const deadline = now() + SCANNER_STOP_BUDGET_MS;
77
+ do {
78
+ const state = await inspect();
79
+ if (Number(state.MainPID)) pids.add(Number(state.MainPID));
80
+ const alive = await processesAlive(pids, run);
81
+ if (
82
+ state.ActiveState === 'inactive' &&
83
+ Number(state.MainPID) === 0 &&
84
+ !alive &&
85
+ ['', 'disabled', 'static', 'indirect', 'not-found'].includes(state.UnitFileState) &&
86
+ (!removed || state.LoadState === 'not-found')
87
+ )
88
+ return;
89
+ await (options.sleep ?? delay)(100);
90
+ } while (now() <= deadline);
91
+ throw new Error('systemd_stop_unverified');
92
+ };
93
+ await wait(false);
94
+ await rm(unitPath, { force: true });
95
+ await command(['daemon-reload']);
96
+ await wait(true);
97
+ } catch (cause) {
98
+ throw new Error('scanner_stop_failed', { cause });
99
+ }
100
+ }