@mnemonik/shared 7.104.8 → 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 +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/launchdControl.d.ts +25 -0
- package/dist/launchdControl.d.ts.map +1 -0
- package/dist/launchdControl.js +149 -0
- package/dist/launchdControl.js.map +1 -0
- package/dist/runtimeReader.d.ts +1 -0
- package/dist/runtimeReader.d.ts.map +1 -1
- package/dist/runtimeReader.js +4 -0
- package/dist/runtimeReader.js.map +1 -1
- package/dist/scannerPid.d.ts +6 -0
- package/dist/scannerPid.d.ts.map +1 -0
- package/dist/scannerPid.js +67 -0
- package/dist/scannerPid.js.map +1 -0
- package/dist/scannerSupervisor.d.ts +34 -0
- package/dist/scannerSupervisor.d.ts.map +1 -1
- package/dist/scannerSupervisor.js +21 -0
- package/dist/scannerSupervisor.js.map +1 -1
- package/dist/systemdControl.d.ts +7 -0
- package/dist/systemdControl.d.ts.map +1 -0
- package/dist/systemdControl.js +85 -0
- package/dist/systemdControl.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +24 -1
- package/src/launchdControl.ts +187 -0
- package/src/runtimeReader.ts +8 -0
- package/src/scannerPid.ts +74 -0
- package/src/scannerSupervisor.ts +46 -0
- package/src/systemdControl.ts +100 -0
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,
|
|
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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"}
|
package/dist/runtimeReader.d.ts
CHANGED
|
@@ -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":"AAIA,OAAO,EAOL,KAAK,OAAO,EACZ,KAAK,MAAM,EACZ,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AACvE,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,YAAY,CAAC;AACxD,MAAM,MAAM,MAAM,GACd,iBAAiB,GACjB,kBAAkB,GAClB,UAAU,GACV,YAAY,GACZ,iBAAiB,GACjB,WAAW,CAAC;AAChB,qBAAa,YAAa,SAAQ,KAAK;aACT,MAAM,EAAE,MAAM;IAA1C,YAA4B,MAAM,EAAE,MAAM,EAGzC;CACF;AACD,eAAO,MAAM,IAAI,UAAW,MAAM,GAAG,MAAM,KAAG,MACI,CAAC;AACnD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS7C;AACD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AACD,MAAM,WAAW,QAAQ;IACvB,aAAa,EAAE,CAAC,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EACF;QAAE,IAAI,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAC7D;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AACD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AACD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AACD,UAAU,OAAO;IACf,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AACD,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,SAAS,CAAC;CACtB;AACD,eAAO,MAAM,OAAO,MAAO,OAAO,KAAG,OAAyD,CAAC;AAC/F,eAAO,MAAM,WAAW,MAAO,MAAM,KAAG,MAGvC,CAAC;AAKF,qGAAqG;AACrG,qBAAa,aAAa;IAgBtB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO;IACtB,QAAQ,CAAC,OAAO,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE;IACzE,OAAO,CAAC,QAAQ,CAAC,GAAG;IAjBtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAoC;IAE7E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAGzB;IACJ,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoC;IACnE,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,UAAU,CAAuC;IACzD,YACE,KAAK,EAAE,MAAM,EACJ,GAAG,CAAC,EAAE,OAAO,YAAA,EACb,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAO,EAC7D,GAAG,eAA0B,EAG/C;IACD,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAItC;IACD,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,KAAK;YAWC,YAAY;IAqEpB,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,SAAS,UAAQ,EACjB,YAAY,UAAQ,EACpB,SAAS,UAAQ,GAChB,OAAO,CAAC,IAAI,CAAC,CA8Df;IACD,sFAAsF;IAChF,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnD;IACK,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWzC;IACD,kFAAkF;IAClF,UAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1D;IACD,UAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAYxE;YACa,SAAS;IAavB,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAE3F;YACa,UAAU;IAiHxB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAOjF;IACK,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAWzD;CACF;AAED,cAAc,qBAAqB,CAAC"}
|
package/dist/runtimeReader.js
CHANGED
|
@@ -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 @@
|
|
|
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;
|
|
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
package/src/index.ts
CHANGED
|
@@ -92,4 +92,27 @@ export type {
|
|
|
92
92
|
|
|
93
93
|
export { apiOrigin } from './apiOrigin.js';
|
|
94
94
|
|
|
95
|
-
export {
|
|
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
|
+
}
|
package/src/runtimeReader.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/scannerSupervisor.ts
CHANGED
|
@@ -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
|
+
}
|