instar 1.3.1594 → 1.3.1595
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/core/DesktopHelperPermissionNotice.d.ts +38 -0
- package/dist/core/DesktopHelperPermissionNotice.d.ts.map +1 -0
- package/dist/core/DesktopHelperPermissionNotice.js +65 -0
- package/dist/core/DesktopHelperPermissionNotice.js.map +1 -0
- package/dist/core/DesktopHelperRetention.d.ts +89 -0
- package/dist/core/DesktopHelperRetention.d.ts.map +1 -0
- package/dist/core/DesktopHelperRetention.js +299 -0
- package/dist/core/DesktopHelperRetention.js.map +1 -0
- package/dist/core/DesktopHost.d.ts +5 -0
- package/dist/core/DesktopHost.d.ts.map +1 -1
- package/dist/core/DesktopHost.js.map +1 -1
- package/dist/core/DesktopProbeReadiness.d.ts +4 -0
- package/dist/core/DesktopProbeReadiness.d.ts.map +1 -1
- package/dist/core/DesktopProbeReadiness.js +16 -5
- package/dist/core/DesktopProbeReadiness.js.map +1 -1
- package/dist/core/MacDesktopHost.d.ts +18 -1
- package/dist/core/MacDesktopHost.d.ts.map +1 -1
- package/dist/core/MacDesktopHost.js +102 -14
- package/dist/core/MacDesktopHost.js.map +1 -1
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/native/instar-desktop-host +0 -0
- package/dist/native/instar-desktop-host.json +1 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +1 -1
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +2 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +44 -5
- package/dist/server/AgentServer.js.map +1 -1
- package/package.json +1 -1
- package/scripts/build-native-desktop-host.mjs +11 -0
- package/scripts/check-native-desktop-release.mjs +4 -0
- package/src/data/builtin-manifest.json +3 -3
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/src/scaffold/templates.ts +1 -1
- package/upgrades/1.3.1595.md +25 -0
- package/upgrades/side-effects/desktop-grant-survives-update.md +73 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tells the operator, once, that a Mac's desktop helper needs its macOS
|
|
3
|
+
* permission again. Without this the machine only reads "not ready", and only
|
|
4
|
+
* to someone who looks. Signal only: it never grants, blocks or restarts.
|
|
5
|
+
*/
|
|
6
|
+
import type { DesktopProbe } from './DesktopHost.js';
|
|
7
|
+
export interface DesktopHelperPermissionNoticeDeps {
|
|
8
|
+
machineLabel: string;
|
|
9
|
+
machineId: string;
|
|
10
|
+
probe(): Promise<DesktopProbe & {
|
|
11
|
+
ready: boolean;
|
|
12
|
+
}>;
|
|
13
|
+
sourceHash(): string | null;
|
|
14
|
+
/** True for the first agent on this Mac to raise this notice. */
|
|
15
|
+
claim(): boolean;
|
|
16
|
+
/** Gives the notice back so a later check, or a sibling agent, can raise it. */
|
|
17
|
+
release(): void;
|
|
18
|
+
raise(item: {
|
|
19
|
+
id: string;
|
|
20
|
+
conditionKey: string;
|
|
21
|
+
title: string;
|
|
22
|
+
body: string;
|
|
23
|
+
}): Promise<unknown>;
|
|
24
|
+
clear(conditionKey: string, resolution: string): void;
|
|
25
|
+
}
|
|
26
|
+
export declare class DesktopHelperPermissionNotice {
|
|
27
|
+
private readonly deps;
|
|
28
|
+
private timer;
|
|
29
|
+
private raisedKey;
|
|
30
|
+
private running;
|
|
31
|
+
constructor(deps: DesktopHelperPermissionNoticeDeps);
|
|
32
|
+
start(): void;
|
|
33
|
+
stop(): void;
|
|
34
|
+
/** One check. Public so tests drive it without a clock. */
|
|
35
|
+
check(): Promise<void>;
|
|
36
|
+
private tick;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=DesktopHelperPermissionNotice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesktopHelperPermissionNotice.d.ts","sourceRoot":"","sources":["../../src/core/DesktopHelperPermissionNotice.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMrD,MAAM,WAAW,iCAAiC;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,IAAI,OAAO,CAAC,YAAY,GAAG;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpD,UAAU,IAAI,MAAM,GAAG,IAAI,CAAC;IAC5B,iEAAiE;IACjE,KAAK,IAAI,OAAO,CAAC;IACjB,gFAAgF;IAChF,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjG,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACvD;AAED,qBAAa,6BAA6B;IAK5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,OAAO,CAAS;IAExB,YAA6B,IAAI,EAAE,iCAAiC,EAAI;IAExE,KAAK,IAAI,IAAI,CAGZ;IAED,IAAI,IAAI,IAAI,CAGX;IAED,2DAA2D;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAuB3B;YAEa,IAAI;CAYnB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { desktopProbeUnavailableReason } from './DesktopProbeReadiness.js';
|
|
2
|
+
const FIRST_CHECK_MS = 60_000;
|
|
3
|
+
const RECHECK_MS = 15 * 60_000;
|
|
4
|
+
export class DesktopHelperPermissionNotice {
|
|
5
|
+
deps;
|
|
6
|
+
timer = null;
|
|
7
|
+
raisedKey = null;
|
|
8
|
+
running = false;
|
|
9
|
+
constructor(deps) {
|
|
10
|
+
this.deps = deps;
|
|
11
|
+
}
|
|
12
|
+
start() {
|
|
13
|
+
this.timer = setTimeout(() => void this.tick(), FIRST_CHECK_MS);
|
|
14
|
+
this.timer.unref?.();
|
|
15
|
+
}
|
|
16
|
+
stop() {
|
|
17
|
+
if (this.timer)
|
|
18
|
+
clearTimeout(this.timer);
|
|
19
|
+
this.timer = null;
|
|
20
|
+
}
|
|
21
|
+
/** One check. Public so tests drive it without a clock. */
|
|
22
|
+
async check() {
|
|
23
|
+
const probe = await this.deps.probe();
|
|
24
|
+
const hash = this.deps.sourceHash();
|
|
25
|
+
if (!hash)
|
|
26
|
+
return;
|
|
27
|
+
const conditionKey = `desktop-helper-permission:${this.deps.machineId}:${hash.slice(0, 16)}`;
|
|
28
|
+
if (probe.screenPermission && probe.inputPermission) {
|
|
29
|
+
// Unconditional: the item outlives this process, and closing none is a no-op.
|
|
30
|
+
this.deps.clear(conditionKey, 'macOS permission is back for this helper');
|
|
31
|
+
this.raisedKey = null;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (!probe.helperChange || this.raisedKey === conditionKey || !this.deps.claim())
|
|
35
|
+
return;
|
|
36
|
+
try {
|
|
37
|
+
await this.deps.raise({
|
|
38
|
+
id: conditionKey, conditionKey,
|
|
39
|
+
title: `${this.deps.machineLabel}: Remote Desktop needs its Mac permission again`,
|
|
40
|
+
body: desktopProbeUnavailableReason(probe),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
this.deps.release();
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
this.raisedKey = conditionKey;
|
|
48
|
+
}
|
|
49
|
+
async tick() {
|
|
50
|
+
if (this.running)
|
|
51
|
+
return;
|
|
52
|
+
this.running = true;
|
|
53
|
+
try {
|
|
54
|
+
await this.check();
|
|
55
|
+
}
|
|
56
|
+
catch { // @silent-fallback-ok — a failed check repeats at the next tick; the helper reason stays on /desktop/diagnostics.
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
this.running = false;
|
|
60
|
+
this.timer = setTimeout(() => void this.tick(), RECHECK_MS);
|
|
61
|
+
this.timer.unref?.();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=DesktopHelperPermissionNotice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesktopHelperPermissionNotice.js","sourceRoot":"","sources":["../../src/core/DesktopHelperPermissionNotice.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAE3E,MAAM,cAAc,GAAG,MAAM,CAAC;AAC9B,MAAM,UAAU,GAAG,EAAE,GAAG,MAAM,CAAC;AAe/B,MAAM,OAAO,6BAA6B;IAKX,IAAI;IAJzB,KAAK,GAAyC,IAAI,CAAC;IACnD,SAAS,GAAkB,IAAI,CAAC;IAChC,OAAO,GAAG,KAAK,CAAC;IAExB,YAA6B,IAAuC;oBAAvC,IAAI;IAAsC,CAAC;IAExE,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,YAAY,GAAG,6BAA6B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC7F,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YACpD,8EAA8E;YAC9E,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,0CAA0C,CAAC,CAAC;YAC1E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,KAAK,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO;QACzF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;gBACpB,EAAE,EAAE,YAAY,EAAE,YAAY;gBAC9B,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,iDAAiD;gBACjF,IAAI,EAAE,6BAA6B,CAAC,KAAK,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC,CAAC,kHAAkH;QAC5H,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export declare const HELPER_MANIFEST_SUFFIX = ".json";
|
|
2
|
+
export declare const RETAINED_HELPER_NAME = "instar-desktop-host";
|
|
3
|
+
export type DesktopHelperFallback = 'disabled' | 'no-manifest' | 'not-release-build' | 'older-than-retained' | 'same-version-different-source' | 'retained-unsafe' | 'retained-unrunnable' | 'copy-failed';
|
|
4
|
+
export interface DesktopHelperRecord {
|
|
5
|
+
sourceHash: string;
|
|
6
|
+
binarySha256: string;
|
|
7
|
+
packageVersion: string;
|
|
8
|
+
/** The source hash this Mac last proved it holds the helper's own grant for. */
|
|
9
|
+
grantedSourceHash: string | null;
|
|
10
|
+
replacedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export interface DesktopHelperResolution {
|
|
13
|
+
path: string;
|
|
14
|
+
source: 'retained' | 'packaged';
|
|
15
|
+
reason?: DesktopHelperFallback;
|
|
16
|
+
}
|
|
17
|
+
/** Why a missing permission needs a person. `same-program` means a grant was
|
|
18
|
+
* removed by someone or something else, so no update story applies. */
|
|
19
|
+
export type DesktopHelperPermissionChange = {
|
|
20
|
+
kind: 'source-changed';
|
|
21
|
+
version: string;
|
|
22
|
+
helperPath: string;
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'first-grant';
|
|
25
|
+
version: string;
|
|
26
|
+
helperPath: string;
|
|
27
|
+
};
|
|
28
|
+
export interface DesktopHelperRetentionOptions {
|
|
29
|
+
packagedBinary: string;
|
|
30
|
+
packageVersion: string;
|
|
31
|
+
/** Default `~/.instar/desktop-helper`. */
|
|
32
|
+
root?: string;
|
|
33
|
+
enabled?: boolean;
|
|
34
|
+
log?: (message: string) => void;
|
|
35
|
+
}
|
|
36
|
+
export declare function helperManifestPath(binary: string): string;
|
|
37
|
+
/** Plain numeric comparison: instar versions are dotted integers. */
|
|
38
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
39
|
+
export declare class DesktopHelperRetention {
|
|
40
|
+
private readonly options;
|
|
41
|
+
readonly root: string;
|
|
42
|
+
readonly retainedPath: string;
|
|
43
|
+
private readonly recordPath;
|
|
44
|
+
private readonly enabled;
|
|
45
|
+
private readonly log;
|
|
46
|
+
/** Verifying means hashing, so it reruns only when the kept file changes. */
|
|
47
|
+
private verified;
|
|
48
|
+
private broken;
|
|
49
|
+
/** A failed copy waits before it is tried again, because probes run twice a second. */
|
|
50
|
+
private copyRetryAt;
|
|
51
|
+
private copyRetryMs;
|
|
52
|
+
private grantNoteFailed;
|
|
53
|
+
constructor(options: DesktopHelperRetentionOptions);
|
|
54
|
+
private packaged;
|
|
55
|
+
private packagedSourceHash;
|
|
56
|
+
/** A local development build is thin. Only a release build may take the Mac's
|
|
57
|
+
* one kept copy, so a test checkout can never replace what is granted. */
|
|
58
|
+
private isReleaseBuild;
|
|
59
|
+
private readRecord;
|
|
60
|
+
private writeRecord;
|
|
61
|
+
/** The kept copy runs with the Mac's permissions, so it must be a plain file
|
|
62
|
+
* this user owns that nobody else can write, in a folder with the same rule. */
|
|
63
|
+
private safeToRun;
|
|
64
|
+
/** The rename means a helper already running keeps its old file, and macOS
|
|
65
|
+
* never sees a signed program change underneath a live process. */
|
|
66
|
+
private install;
|
|
67
|
+
/** Which helper to launch. Synchronous and cheap on the repeat path. Never
|
|
68
|
+
* throws: a probe that rejects reads as a lost grant and revokes a session. */
|
|
69
|
+
resolve(): DesktopHelperResolution;
|
|
70
|
+
private resolveKept;
|
|
71
|
+
private matchesRecord;
|
|
72
|
+
private resolveFully;
|
|
73
|
+
/** The kept copy would not run at all, so stop using it until a restart. */
|
|
74
|
+
markBroken(): void;
|
|
75
|
+
/** The kept copy holds its own grant for its current source. Failing to write
|
|
76
|
+
* that down costs nothing but a repeat at the next probe, so it never throws. */
|
|
77
|
+
noteGranted(): void;
|
|
78
|
+
/** Null when the missing permission has nothing to do with an update. */
|
|
79
|
+
permissionChange(): DesktopHelperPermissionChange | null;
|
|
80
|
+
/** The source hash this notice is about. Stable across agents on this Mac. */
|
|
81
|
+
currentSourceHash(): string | null;
|
|
82
|
+
private noticePath;
|
|
83
|
+
/** True for the first caller on this Mac for this helper. One Mac, one item.
|
|
84
|
+
* Creating the marker is atomic, so agents restarting together cannot both win. */
|
|
85
|
+
claimNotice(): boolean;
|
|
86
|
+
/** Hands the notice back when raising it failed, or once it is resolved. */
|
|
87
|
+
releaseNotice(): void;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=DesktopHelperRetention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesktopHelperRetention.d.ts","sourceRoot":"","sources":["../../src/core/DesktopHelperRetention.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DesktopHelperRetention: one kept copy of the Mac desktop helper per Mac, at
|
|
3
|
+
* one path that updates never touch.
|
|
4
|
+
*
|
|
5
|
+
* macOS ties a Screen Recording or Accessibility grant to the exact program.
|
|
6
|
+
* For an ad-hoc signed helper that means its hash, and for a helper with no app
|
|
7
|
+
* bundle it means its path too. So the installed copy is a poor place to hold a
|
|
8
|
+
* grant: each agent on a Mac has its own, and an update can replace its bytes.
|
|
9
|
+
* The kept copy changes only when the helper's SOURCE changes (the build writes
|
|
10
|
+
* a source hash beside the binary), so a rebuild of unchanged source on a newer
|
|
11
|
+
* toolchain cannot cost a grant, and every agent on a Mac shares one macOS
|
|
12
|
+
* entry. A Developer ID identity later keeps that same entry across source
|
|
13
|
+
* changes too, because the path never moves.
|
|
14
|
+
*
|
|
15
|
+
* When the source really does change, the old grant cannot follow it. This
|
|
16
|
+
* module records that fact so the machine can say so plainly.
|
|
17
|
+
*
|
|
18
|
+
* Every failure falls back to the installed copy with a named reason: this
|
|
19
|
+
* module may never make a Mac less reachable than it already was.
|
|
20
|
+
*/
|
|
21
|
+
import crypto from 'node:crypto';
|
|
22
|
+
import fs from 'node:fs';
|
|
23
|
+
import os from 'node:os';
|
|
24
|
+
import path from 'node:path';
|
|
25
|
+
import { SafeFsExecutor } from './SafeFsExecutor.js';
|
|
26
|
+
export const HELPER_MANIFEST_SUFFIX = '.json';
|
|
27
|
+
export const RETAINED_HELPER_NAME = 'instar-desktop-host';
|
|
28
|
+
const RECORD_NAME = 'retained.json';
|
|
29
|
+
const FAT_MAGIC = 0xcafebabe;
|
|
30
|
+
const COPY_RETRY_FIRST_MS = 60_000;
|
|
31
|
+
const COPY_RETRY_MAX_MS = 60 * 60_000;
|
|
32
|
+
export function helperManifestPath(binary) {
|
|
33
|
+
return `${binary}${HELPER_MANIFEST_SUFFIX}`;
|
|
34
|
+
}
|
|
35
|
+
/** Plain numeric comparison: instar versions are dotted integers. */
|
|
36
|
+
export function compareVersions(a, b) {
|
|
37
|
+
const parts = (value) => value.split('.').map(part => Number.parseInt(part, 10) || 0);
|
|
38
|
+
const left = parts(a);
|
|
39
|
+
const right = parts(b);
|
|
40
|
+
for (let i = 0; i < Math.max(left.length, right.length); i++) {
|
|
41
|
+
const difference = (left[i] ?? 0) - (right[i] ?? 0);
|
|
42
|
+
if (difference !== 0)
|
|
43
|
+
return Math.sign(difference);
|
|
44
|
+
}
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
function sha256(file) {
|
|
48
|
+
return crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex');
|
|
49
|
+
}
|
|
50
|
+
export class DesktopHelperRetention {
|
|
51
|
+
options;
|
|
52
|
+
root;
|
|
53
|
+
retainedPath;
|
|
54
|
+
recordPath;
|
|
55
|
+
enabled;
|
|
56
|
+
log;
|
|
57
|
+
/** Verifying means hashing, so it reruns only when the kept file changes. */
|
|
58
|
+
verified = null;
|
|
59
|
+
broken = false;
|
|
60
|
+
/** A failed copy waits before it is tried again, because probes run twice a second. */
|
|
61
|
+
copyRetryAt = 0;
|
|
62
|
+
copyRetryMs = COPY_RETRY_FIRST_MS;
|
|
63
|
+
grantNoteFailed = false;
|
|
64
|
+
constructor(options) {
|
|
65
|
+
this.options = options;
|
|
66
|
+
this.root = options.root ?? path.join(os.homedir(), '.instar', 'desktop-helper');
|
|
67
|
+
this.retainedPath = path.join(this.root, RETAINED_HELPER_NAME);
|
|
68
|
+
this.recordPath = path.join(this.root, RECORD_NAME);
|
|
69
|
+
this.enabled = options.enabled !== false;
|
|
70
|
+
this.log = options.log ?? (message => console.warn(message));
|
|
71
|
+
}
|
|
72
|
+
packaged(reason) {
|
|
73
|
+
return { path: this.options.packagedBinary, source: 'packaged', reason };
|
|
74
|
+
}
|
|
75
|
+
packagedSourceHash() {
|
|
76
|
+
try {
|
|
77
|
+
const parsed = JSON.parse(fs.readFileSync(helperManifestPath(this.options.packagedBinary), 'utf8'));
|
|
78
|
+
return typeof parsed.sourceHash === 'string' && /^[a-f0-9]{64}$/.test(parsed.sourceHash) ? parsed.sourceHash : null;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null; // @silent-fallback-ok — resolve() reports this as the named reason no-manifest.
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** A local development build is thin. Only a release build may take the Mac's
|
|
85
|
+
* one kept copy, so a test checkout can never replace what is granted. */
|
|
86
|
+
isReleaseBuild() {
|
|
87
|
+
let handle = null;
|
|
88
|
+
try {
|
|
89
|
+
handle = fs.openSync(this.options.packagedBinary, 'r');
|
|
90
|
+
const head = Buffer.alloc(4);
|
|
91
|
+
return fs.readSync(handle, head, 0, 4, 0) === 4 && head.readUInt32BE(0) === FAT_MAGIC;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false; // @silent-fallback-ok — resolve() reports this as not-release-build.
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
if (handle !== null)
|
|
98
|
+
fs.closeSync(handle);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
readRecord() {
|
|
102
|
+
try {
|
|
103
|
+
const value = JSON.parse(fs.readFileSync(this.recordPath, 'utf8'));
|
|
104
|
+
if (typeof value.sourceHash !== 'string' || typeof value.binarySha256 !== 'string'
|
|
105
|
+
|| typeof value.packageVersion !== 'string')
|
|
106
|
+
return null;
|
|
107
|
+
return {
|
|
108
|
+
sourceHash: value.sourceHash, binarySha256: value.binarySha256, packageVersion: value.packageVersion,
|
|
109
|
+
grantedSourceHash: typeof value.grantedSourceHash === 'string' ? value.grantedSourceHash : null,
|
|
110
|
+
replacedAt: typeof value.replacedAt === 'string' ? value.replacedAt : '',
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null; // @silent-fallback-ok — no readable record means the copy is reinstalled from the package.
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
writeRecord(record) {
|
|
118
|
+
const temporary = `${this.recordPath}.${process.pid}.tmp`;
|
|
119
|
+
fs.writeFileSync(temporary, `${JSON.stringify(record, null, 2)}\n`, { mode: 0o600 });
|
|
120
|
+
fs.renameSync(temporary, this.recordPath);
|
|
121
|
+
}
|
|
122
|
+
/** The kept copy runs with the Mac's permissions, so it must be a plain file
|
|
123
|
+
* this user owns that nobody else can write, in a folder with the same rule. */
|
|
124
|
+
safeToRun() {
|
|
125
|
+
try {
|
|
126
|
+
const uid = process.getuid?.();
|
|
127
|
+
for (const candidate of [this.root, this.retainedPath]) {
|
|
128
|
+
const stat = fs.lstatSync(candidate);
|
|
129
|
+
if (stat.isSymbolicLink() || stat.uid !== uid || (stat.mode & 0o022) !== 0)
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
return fs.lstatSync(this.retainedPath).isFile();
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false; // @silent-fallback-ok — an unreadable copy is unsafe; resolve() names retained-unsafe.
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** The rename means a helper already running keeps its old file, and macOS
|
|
139
|
+
* never sees a signed program change underneath a live process. */
|
|
140
|
+
install(sourceHash, grantedSourceHash) {
|
|
141
|
+
fs.mkdirSync(this.root, { recursive: true, mode: 0o700 });
|
|
142
|
+
const temporary = `${this.retainedPath}.${process.pid}.tmp`;
|
|
143
|
+
fs.copyFileSync(this.options.packagedBinary, temporary);
|
|
144
|
+
fs.chmodSync(temporary, 0o700);
|
|
145
|
+
fs.renameSync(temporary, this.retainedPath);
|
|
146
|
+
this.writeRecord({
|
|
147
|
+
sourceHash, binarySha256: sha256(this.retainedPath), packageVersion: this.options.packageVersion,
|
|
148
|
+
grantedSourceHash,
|
|
149
|
+
replacedAt: new Date().toISOString(),
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/** Which helper to launch. Synchronous and cheap on the repeat path. Never
|
|
153
|
+
* throws: a probe that rejects reads as a lost grant and revokes a session. */
|
|
154
|
+
resolve() {
|
|
155
|
+
if (!this.enabled)
|
|
156
|
+
return this.packaged('disabled');
|
|
157
|
+
if (this.broken)
|
|
158
|
+
return this.packaged('retained-unrunnable');
|
|
159
|
+
if (Date.now() < this.copyRetryAt)
|
|
160
|
+
return this.packaged('copy-failed');
|
|
161
|
+
try {
|
|
162
|
+
return this.resolveKept();
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
this.verified = null;
|
|
166
|
+
this.log(`[instar] could not check the Mac desktop helper copy: ${error instanceof Error ? error.message : String(error)}`);
|
|
167
|
+
return this.packaged('retained-unsafe'); // @silent-fallback-ok — logged above; diagnostics name the reason.
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
resolveKept() {
|
|
171
|
+
try {
|
|
172
|
+
const stat = fs.statSync(this.retainedPath);
|
|
173
|
+
if (this.verified && this.verified.size === stat.size && this.verified.mtimeMs === stat.mtimeMs
|
|
174
|
+
&& this.verified.ino === stat.ino)
|
|
175
|
+
return this.verified.resolution;
|
|
176
|
+
}
|
|
177
|
+
catch { /* @silent-fallback-ok — no kept copy yet; the full path below creates it. */ }
|
|
178
|
+
const resolution = this.resolveFully();
|
|
179
|
+
if (resolution.source === 'retained') {
|
|
180
|
+
const stat = fs.statSync(this.retainedPath);
|
|
181
|
+
this.verified = { size: stat.size, mtimeMs: stat.mtimeMs, ino: stat.ino, resolution };
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
this.verified = null;
|
|
185
|
+
}
|
|
186
|
+
return resolution;
|
|
187
|
+
}
|
|
188
|
+
matchesRecord(record) {
|
|
189
|
+
try {
|
|
190
|
+
return sha256(this.retainedPath) === record.binarySha256;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return false; // @silent-fallback-ok — unreadable bytes are damaged bytes; resolveFully restores them.
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
resolveFully() {
|
|
197
|
+
const sourceHash = this.packagedSourceHash();
|
|
198
|
+
if (!sourceHash)
|
|
199
|
+
return this.packaged('no-manifest');
|
|
200
|
+
if (!this.isReleaseBuild())
|
|
201
|
+
return this.packaged('not-release-build');
|
|
202
|
+
const record = this.readRecord();
|
|
203
|
+
const fileExists = fs.existsSync(this.retainedPath);
|
|
204
|
+
if (record && record.sourceHash !== sourceHash) {
|
|
205
|
+
const order = compareVersions(this.options.packageVersion, record.packageVersion);
|
|
206
|
+
// Agents on one Mac update minutes apart. The older one must not swap
|
|
207
|
+
// the helper back and cost the newer one its grant.
|
|
208
|
+
if (order < 0)
|
|
209
|
+
return this.packaged('older-than-retained');
|
|
210
|
+
if (order === 0)
|
|
211
|
+
return this.packaged('same-version-different-source');
|
|
212
|
+
}
|
|
213
|
+
const intact = !!record && record.sourceHash === sourceHash && fileExists
|
|
214
|
+
&& this.safeToRun() && this.matchesRecord(record);
|
|
215
|
+
if (intact)
|
|
216
|
+
return { path: this.retainedPath, source: 'retained' };
|
|
217
|
+
if (record?.sourceHash === sourceHash && fileExists) {
|
|
218
|
+
this.log('[instar] retained Mac desktop helper failed its integrity check; restoring it from this package');
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
// A real source change keeps the old proof, which is how the Mac can say
|
|
222
|
+
// the helper changed. Restoring a damaged copy writes bytes macOS has not
|
|
223
|
+
// seen, so the proof is gone and the Mac must say it needs a grant.
|
|
224
|
+
this.install(sourceHash, record && record.sourceHash !== sourceHash ? record.grantedSourceHash : null);
|
|
225
|
+
this.copyRetryAt = 0;
|
|
226
|
+
this.copyRetryMs = COPY_RETRY_FIRST_MS;
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
this.copyRetryAt = Date.now() + this.copyRetryMs;
|
|
230
|
+
this.copyRetryMs = Math.min(this.copyRetryMs * 2, COPY_RETRY_MAX_MS);
|
|
231
|
+
this.log(`[instar] could not keep a Mac desktop helper copy: ${error instanceof Error ? error.message : String(error)}`);
|
|
232
|
+
return this.packaged('copy-failed'); // @silent-fallback-ok — logged above; diagnostics name copy-failed.
|
|
233
|
+
}
|
|
234
|
+
return this.safeToRun() ? { path: this.retainedPath, source: 'retained' } : this.packaged('retained-unsafe');
|
|
235
|
+
}
|
|
236
|
+
/** The kept copy would not run at all, so stop using it until a restart. */
|
|
237
|
+
markBroken() {
|
|
238
|
+
this.broken = true;
|
|
239
|
+
this.verified = null;
|
|
240
|
+
this.log('[instar] retained Mac desktop helper would not run; using the installed copy');
|
|
241
|
+
}
|
|
242
|
+
/** The kept copy holds its own grant for its current source. Failing to write
|
|
243
|
+
* that down costs nothing but a repeat at the next probe, so it never throws. */
|
|
244
|
+
noteGranted() {
|
|
245
|
+
const record = this.readRecord();
|
|
246
|
+
if (!record || record.grantedSourceHash === record.sourceHash)
|
|
247
|
+
return;
|
|
248
|
+
try {
|
|
249
|
+
this.writeRecord({ ...record, grantedSourceHash: record.sourceHash });
|
|
250
|
+
this.releaseNotice();
|
|
251
|
+
this.grantNoteFailed = false;
|
|
252
|
+
}
|
|
253
|
+
catch (error) { // @silent-fallback-ok — logged once below; the next probe writes the grant again.
|
|
254
|
+
if (!this.grantNoteFailed) {
|
|
255
|
+
this.log(`[instar] could not record the Mac desktop helper grant: ${error instanceof Error ? error.message : String(error)}`);
|
|
256
|
+
}
|
|
257
|
+
this.grantNoteFailed = true;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/** Null when the missing permission has nothing to do with an update. */
|
|
261
|
+
permissionChange() {
|
|
262
|
+
const record = this.readRecord();
|
|
263
|
+
if (!record)
|
|
264
|
+
return null;
|
|
265
|
+
const base = { version: record.packageVersion, helperPath: this.retainedPath };
|
|
266
|
+
if (!record.grantedSourceHash)
|
|
267
|
+
return { kind: 'first-grant', ...base };
|
|
268
|
+
return record.grantedSourceHash === record.sourceHash ? null : { kind: 'source-changed', ...base };
|
|
269
|
+
}
|
|
270
|
+
/** The source hash this notice is about. Stable across agents on this Mac. */
|
|
271
|
+
currentSourceHash() {
|
|
272
|
+
return this.readRecord()?.sourceHash ?? null;
|
|
273
|
+
}
|
|
274
|
+
noticePath() {
|
|
275
|
+
const hash = this.currentSourceHash();
|
|
276
|
+
return hash ? path.join(this.root, `notice-${hash.slice(0, 16)}`) : null;
|
|
277
|
+
}
|
|
278
|
+
/** True for the first caller on this Mac for this helper. One Mac, one item.
|
|
279
|
+
* Creating the marker is atomic, so agents restarting together cannot both win. */
|
|
280
|
+
claimNotice() {
|
|
281
|
+
const marker = this.noticePath();
|
|
282
|
+
if (!marker)
|
|
283
|
+
return false;
|
|
284
|
+
try {
|
|
285
|
+
fs.writeFileSync(marker, '', { flag: 'wx', mode: 0o600 });
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
return false; // @silent-fallback-ok — the marker exists, so another agent holds this notice.
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/** Hands the notice back when raising it failed, or once it is resolved. */
|
|
293
|
+
releaseNotice() {
|
|
294
|
+
const marker = this.noticePath();
|
|
295
|
+
if (marker)
|
|
296
|
+
SafeFsExecutor.safeRmSync(marker, { force: true, operation: 'src/core/DesktopHelperRetention.ts:releaseNotice' });
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=DesktopHelperRetention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesktopHelperRetention.js","sourceRoot":"","sources":["../../src/core/DesktopHelperRetention.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { DesktopHelperPermissionChange } from './DesktopHelperRetention.js';
|
|
1
2
|
/** Machine-local capture and input boundary. A Windows or Linux companion
|
|
2
3
|
* implements this contract only after its own permission and live-session proof. */
|
|
3
4
|
export type DesktopButton = 'left' | 'right' | 'middle';
|
|
@@ -56,6 +57,10 @@ export interface DesktopProbe {
|
|
|
56
57
|
* itself; `inherited` depends on what started this server's process tree. */
|
|
57
58
|
screenGrant?: 'own' | 'inherited' | 'none';
|
|
58
59
|
inputGrant?: 'own' | 'inherited' | 'none';
|
|
60
|
+
/** macOS only: which copy of the helper ran, and why a person is needed. */
|
|
61
|
+
helperSource?: 'retained' | 'packaged';
|
|
62
|
+
helperFallback?: string;
|
|
63
|
+
helperChange?: DesktopHelperPermissionChange;
|
|
59
64
|
}
|
|
60
65
|
export type DesktopPlatform = 'macos' | 'windows';
|
|
61
66
|
export interface DesktopDisplay {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DesktopHost.d.ts","sourceRoot":"","sources":["../../src/core/DesktopHost.ts"],"names":[],"mappings":"AAAA;oFACoF;AACpF,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE;AACxC,iEAAiE;GAC/D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAChF;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAAC,GAAG,EAAE,UAAU,CAAA;CAAE;AAChD,gFAAgF;GAC9E;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAMxD;sEACsE;AACtE,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAIC,CAAC;AAG5C,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CAE5D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,aAAa,CAExE;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAkB/D;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;iFAC6E;IAC7E,WAAW,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,MAAM,CAAC;IAC3C,UAAU,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"DesktopHost.d.ts","sourceRoot":"","sources":["../../src/core/DesktopHost.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DesktopHost.js","sourceRoot":"","sources":["../../src/core/DesktopHost.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DesktopHost.js","sourceRoot":"","sources":["../../src/core/DesktopHost.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/** A probe reports the helper's view of a desktop session, not whether the
|
|
2
|
+
* machine or the Instar agent is online or whether a screen is actually locked. */
|
|
3
|
+
import type { DesktopHelperPermissionChange } from './DesktopHelperRetention.js';
|
|
1
4
|
/** One sentence on what is wrong, then the one thing that fixes it. */
|
|
2
5
|
export declare function desktopProbeUnavailableReason(probe: {
|
|
3
6
|
sessionActive: boolean;
|
|
@@ -8,5 +11,6 @@ export declare function desktopProbeUnavailableReason(probe: {
|
|
|
8
11
|
onConsole?: boolean;
|
|
9
12
|
loginDone?: boolean;
|
|
10
13
|
screenLocked?: boolean;
|
|
14
|
+
helperChange?: DesktopHelperPermissionChange;
|
|
11
15
|
}): string;
|
|
12
16
|
//# sourceMappingURL=DesktopProbeReadiness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DesktopProbeReadiness.d.ts","sourceRoot":"","sources":["../../src/core/DesktopProbeReadiness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DesktopProbeReadiness.d.ts","sourceRoot":"","sources":["../../src/core/DesktopProbeReadiness.ts"],"names":[],"mappings":"AAAA;mFACmF;AACnF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAcjF,uEAAuE;AACvE,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,6BAA6B,CAAC;CAC9C,GAAG,MAAM,CAiCT"}
|
|
@@ -1,13 +1,22 @@
|
|
|
1
|
-
/** A probe reports the helper's view of a desktop session, not whether the
|
|
2
|
-
* machine or the Instar agent is online or whether a screen is actually locked. */
|
|
3
1
|
const PERMISSION_STEP = 'System Settings → Privacy & Security';
|
|
2
|
+
/** macOS ties these permissions to the exact program, so a changed helper loses
|
|
3
|
+
* them and nothing on the Mac can restore them without a person. Say that. */
|
|
4
|
+
function helperChangeReason(change, missing) {
|
|
5
|
+
const why = change.kind === 'source-changed'
|
|
6
|
+
? `Instar's Mac desktop helper changed in update ${change.version}, and macOS ties ${missing} to the exact program, so the old permission no longer applies.`
|
|
7
|
+
: `Instar now keeps one permanent copy of its Mac desktop helper, so later updates that leave the helper unchanged cannot remove its permission. macOS needs to allow that copy once.`;
|
|
8
|
+
return `${why} This will not fix itself. Someone at this Mac needs to allow it again: ${PERMISSION_STEP} → ${missing}. `
|
|
9
|
+
+ `Turn instar-desktop-host off and on. If it is not listed or that does not work, remove it with the minus button and add ${change.helperPath} with the plus button. Then tap Retry.`;
|
|
10
|
+
}
|
|
4
11
|
/** One sentence on what is wrong, then the one thing that fixes it. */
|
|
5
12
|
export function desktopProbeUnavailableReason(probe) {
|
|
6
13
|
const missing = [!probe.screenPermission && 'Screen Recording',
|
|
7
14
|
!probe.inputPermission && 'Accessibility'].filter(Boolean).join(' and ');
|
|
8
|
-
const permissionStep = missing
|
|
9
|
-
?
|
|
10
|
-
:
|
|
15
|
+
const permissionStep = missing && probe.helperChange
|
|
16
|
+
? helperChangeReason(probe.helperChange, missing)
|
|
17
|
+
: missing
|
|
18
|
+
? `It also needs a one-time ${missing} permission at the Mac: ${PERMISSION_STEP} → ${missing} → turn on instar-desktop-host.`
|
|
19
|
+
: '';
|
|
11
20
|
if (!probe.sessionActive) {
|
|
12
21
|
if (probe.consoleSessionPresent === false) {
|
|
13
22
|
return 'Nobody is signed in at this Mac’s screen, so the desktop helper cannot see a console session. Sign in at the Mac. The Instar agent is online.';
|
|
@@ -26,6 +35,8 @@ export function desktopProbeUnavailableReason(probe) {
|
|
|
26
35
|
}
|
|
27
36
|
if (probe.displayCount === 0)
|
|
28
37
|
return 'No active display is available to capture on this machine. Wake its screen or connect a display.';
|
|
38
|
+
if (missing && probe.helperChange)
|
|
39
|
+
return helperChangeReason(probe.helperChange, missing);
|
|
29
40
|
if (!probe.screenPermission) {
|
|
30
41
|
return `Screen capture permission is unavailable to the desktop helper. Turn it on once at the Mac: ${PERMISSION_STEP} → Screen Recording → instar-desktop-host, then tap Retry.`;
|
|
31
42
|
}
|