alvin-bot 5.7.0 → 5.8.0
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/CHANGELOG.md +13 -0
- package/dist/claude.js +1 -102
- package/dist/config.js +1 -96
- package/dist/engine.js +1 -90
- package/dist/find-claude-binary.js +1 -98
- package/dist/handlers/async-agent-chunk-handler.js +1 -50
- package/dist/handlers/background-bypass.js +1 -75
- package/dist/handlers/commands.js +1 -2336
- package/dist/handlers/cron-progress.js +1 -52
- package/dist/handlers/document.js +1 -194
- package/dist/handlers/message.js +1 -959
- package/dist/handlers/photo.js +1 -154
- package/dist/handlers/platform-message.js +1 -360
- package/dist/handlers/stuck-timer.js +1 -54
- package/dist/handlers/video.js +1 -237
- package/dist/handlers/voice.js +1 -148
- package/dist/i18n.js +1 -805
- package/dist/index.js +1 -697
- package/dist/init-data-dir.js +1 -98
- package/dist/middleware/auth.js +1 -233
- package/dist/migrate.js +1 -162
- package/dist/paths.js +1 -146
- package/dist/platforms/discord.js +1 -175
- package/dist/platforms/index.js +1 -130
- package/dist/platforms/signal.js +1 -205
- package/dist/platforms/slack-slash-parser.js +1 -32
- package/dist/platforms/slack.js +1 -501
- package/dist/platforms/telegram.js +1 -111
- package/dist/platforms/types.js +1 -8
- package/dist/platforms/whatsapp-auth-helpers.js +1 -53
- package/dist/platforms/whatsapp.js +1 -707
- package/dist/providers/claude-sdk-provider.js +1 -565
- package/dist/providers/codex-cli-provider.js +1 -134
- package/dist/providers/index.js +1 -7
- package/dist/providers/ollama-provider.js +1 -32
- package/dist/providers/openai-compatible.js +1 -406
- package/dist/providers/registry.js +1 -352
- package/dist/providers/runtime-header.js +1 -45
- package/dist/providers/tool-executor.js +1 -475
- package/dist/providers/types.js +1 -227
- package/dist/services/access.js +1 -144
- package/dist/services/allowed-users-gate.js +1 -56
- package/dist/services/alvin-dispatch.js +1 -174
- package/dist/services/alvin-mcp-tools.js +1 -104
- package/dist/services/asset-index.js +1 -224
- package/dist/services/async-agent-parser.js +1 -418
- package/dist/services/async-agent-watcher.js +1 -583
- package/dist/services/auto-diagnostic.js +1 -228
- package/dist/services/broadcast.js +1 -52
- package/dist/services/browser-manager.js +1 -562
- package/dist/services/browser-webfetch.js +1 -127
- package/dist/services/browser.js +1 -121
- package/dist/services/cdp-bootstrap.js +1 -357
- package/dist/services/compaction.js +1 -144
- package/dist/services/critical-notify.js +1 -203
- package/dist/services/cron-resolver.js +1 -58
- package/dist/services/cron-scheduling.js +1 -310
- package/dist/services/cron.js +1 -861
- package/dist/services/custom-tools.js +1 -317
- package/dist/services/delivery-queue.js +1 -173
- package/dist/services/delivery-registry.js +1 -21
- package/dist/services/disk-cleanup.js +1 -203
- package/dist/services/elevenlabs.js +1 -58
- package/dist/services/embeddings/auto-detect.js +1 -74
- package/dist/services/embeddings/fts5.js +1 -108
- package/dist/services/embeddings/gemini.js +1 -65
- package/dist/services/embeddings/index.js +1 -496
- package/dist/services/embeddings/ollama.js +1 -78
- package/dist/services/embeddings/openai.js +1 -49
- package/dist/services/embeddings/provider.js +1 -22
- package/dist/services/embeddings/vector-base.js +1 -113
- package/dist/services/embeddings-migration.js +1 -193
- package/dist/services/embeddings.js +1 -9
- package/dist/services/env-file.js +1 -50
- package/dist/services/exec-guard.js +1 -71
- package/dist/services/fallback-order.js +1 -154
- package/dist/services/file-permissions.js +1 -93
- package/dist/services/heartbeat-file.js +1 -65
- package/dist/services/heartbeat.js +1 -313
- package/dist/services/hooks.js +1 -44
- package/dist/services/imagegen.js +1 -72
- package/dist/services/language-detect.js +1 -154
- package/dist/services/markdown.js +1 -63
- package/dist/services/mcp.js +1 -263
- package/dist/services/memory-extractor.js +1 -178
- package/dist/services/memory-inject-mode.js +1 -43
- package/dist/services/memory-layers.js +1 -156
- package/dist/services/memory.js +1 -146
- package/dist/services/ollama-manager.js +1 -339
- package/dist/services/permissions-wizard.js +1 -291
- package/dist/services/personality.js +1 -376
- package/dist/services/plugins.js +1 -171
- package/dist/services/preflight.js +1 -292
- package/dist/services/process-manager.js +1 -291
- package/dist/services/release-highlights.js +1 -79
- package/dist/services/reminders.js +1 -97
- package/dist/services/restart.js +1 -48
- package/dist/services/security-audit.js +1 -74
- package/dist/services/self-diagnosis.js +1 -272
- package/dist/services/self-search.js +1 -129
- package/dist/services/session-persistence.js +1 -237
- package/dist/services/session.js +1 -282
- package/dist/services/skills.js +1 -290
- package/dist/services/ssrf-guard.js +1 -162
- package/dist/services/standing-orders.js +1 -29
- package/dist/services/steer-channel.js +1 -46
- package/dist/services/stop-controller.js +1 -52
- package/dist/services/subagent-dedup.js +1 -86
- package/dist/services/subagent-delivery.js +1 -452
- package/dist/services/subagent-stats.js +1 -123
- package/dist/services/subagents.js +1 -814
- package/dist/services/sudo.js +1 -329
- package/dist/services/telegram.js +1 -158
- package/dist/services/timing-safe-bearer.js +1 -51
- package/dist/services/tool-discovery.js +1 -214
- package/dist/services/trends.js +1 -580
- package/dist/services/updater.js +1 -291
- package/dist/services/usage-tracker.js +1 -144
- package/dist/services/users.js +1 -271
- package/dist/services/voice.js +1 -104
- package/dist/services/watchdog-brake.js +1 -154
- package/dist/services/watchdog.js +1 -311
- package/dist/services/workspaces.js +1 -276
- package/dist/tui/index.js +1 -667
- package/dist/util/console-formatter.js +1 -109
- package/dist/util/debounce.js +1 -24
- package/dist/util/telegram-error-filter.js +1 -62
- package/dist/version.js +1 -24
- package/dist/web/bind-strategy.js +1 -42
- package/dist/web/canvas.js +1 -30
- package/dist/web/doctor-api.js +1 -604
- package/dist/web/openai-compat.js +1 -252
- package/dist/web/server.js +1 -1902
- package/dist/web/setup-api.js +1 -1101
- package/package.json +5 -2
- package/dist/.metadata_never_index +0 -0
|
@@ -1,291 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Permissions Wizard (5.1.0).
|
|
3
|
-
*
|
|
4
|
-
* Reality check up front: on macOS, TCC (Transparency, Consent, Control)
|
|
5
|
-
* permissions are architecturally NOT grantable by an app — no API, no
|
|
6
|
-
* AppleScript, no sudo trick, no signed-entitlement bypass for a normal
|
|
7
|
-
* Node CLI. The user has to toggle the switches in System Settings.
|
|
8
|
-
*
|
|
9
|
-
* What this wizard DOES do — make the toggling experience painless:
|
|
10
|
-
*
|
|
11
|
-
* 1. Detect every permission's current state
|
|
12
|
-
* 2. For each missing one: open the EXACT right Settings pane
|
|
13
|
-
* 3. Wait for the user to toggle (poll detect every 2 s)
|
|
14
|
-
* 4. Verify and move to the next
|
|
15
|
-
* 5. End with a clear summary of granted / skipped / still-missing
|
|
16
|
-
*
|
|
17
|
-
* Covered permissions (macOS):
|
|
18
|
-
* - sudo password (not TCC; stored in Keychain so brew/apt commands
|
|
19
|
-
* don't re-prompt — separate from TCC but bundled here for
|
|
20
|
-
* "one upfront onboarding" UX)
|
|
21
|
-
* - Full Disk Access (TCC — for protected dirs like ~/Library/Mail,
|
|
22
|
-
* ~/Documents when needed by skills/codex)
|
|
23
|
-
* - Automation (TCC — for osascript driving Apple Mail/Notes/Calendar)
|
|
24
|
-
* - Accessibility (TCC — for cliclick mouse/keyboard automation)
|
|
25
|
-
*
|
|
26
|
-
* On Linux: only sudo applies. The wizard reports a no-op for TCC steps.
|
|
27
|
-
*
|
|
28
|
-
* Opt-out: set ALVIN_DISABLE_SELF_PRESERVATION=true to silence everything,
|
|
29
|
-
* but this wizard never runs unless explicitly invoked — no startup hook.
|
|
30
|
-
*/
|
|
31
|
-
import { execSync } from "child_process";
|
|
32
|
-
import os from "os";
|
|
33
|
-
import { getSudoStatus, openSystemSettings, storePassword, verifyPassword, } from "./sudo.js";
|
|
34
|
-
const PLATFORM = os.platform();
|
|
35
|
-
export const PERMISSIONS = [
|
|
36
|
-
{
|
|
37
|
-
id: "sudo",
|
|
38
|
-
name: "Sudo / Admin Access",
|
|
39
|
-
why: "Lets Alvin run admin commands (brew install, apt-get, etc.) without re-prompting every time.",
|
|
40
|
-
platforms: ["darwin", "linux"],
|
|
41
|
-
detect: async (status) => {
|
|
42
|
-
const s = status ?? (await getSudoStatus());
|
|
43
|
-
if (!s.configured)
|
|
44
|
-
return { state: "missing", detail: "password not stored" };
|
|
45
|
-
if (!s.verified)
|
|
46
|
-
return { state: "missing", detail: "stored but doesn't authenticate" };
|
|
47
|
-
return { state: "granted" };
|
|
48
|
-
},
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
id: "full-disk-access",
|
|
52
|
-
name: "Full Disk Access",
|
|
53
|
-
why: "Lets `node` (and anything it spawns — codex, file-skills, document tools) read protected directories like ~/Library/Mail, ~/Documents when skills need them.",
|
|
54
|
-
platforms: ["darwin"],
|
|
55
|
-
detect: async (status) => {
|
|
56
|
-
const s = status ?? (await getSudoStatus());
|
|
57
|
-
if (PLATFORM !== "darwin")
|
|
58
|
-
return { state: "n/a" };
|
|
59
|
-
return { state: s.permissions.fullDiskAccess ? "granted" : "missing" };
|
|
60
|
-
},
|
|
61
|
-
openPane: () => openSystemSettings("full-disk-access"),
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
id: "automation",
|
|
65
|
-
name: "Automation (Apple Events)",
|
|
66
|
-
why: "Lets osascript drive Apple Mail, Apple Notes, Calendar, Finder — used by the email-send, apple-notes, and several productivity skills.",
|
|
67
|
-
platforms: ["darwin"],
|
|
68
|
-
detect: async (status) => {
|
|
69
|
-
const s = status ?? (await getSudoStatus());
|
|
70
|
-
if (PLATFORM !== "darwin")
|
|
71
|
-
return { state: "n/a" };
|
|
72
|
-
const a = s.permissions.automation;
|
|
73
|
-
if (a === null || a === undefined)
|
|
74
|
-
return { state: "n/a" };
|
|
75
|
-
return { state: a ? "granted" : "missing" };
|
|
76
|
-
},
|
|
77
|
-
openPane: () => openSystemSettings("automation"),
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
id: "accessibility",
|
|
81
|
-
name: "Accessibility",
|
|
82
|
-
why: "Lets cliclick simulate mouse + keyboard input — used by some browser-automation and UI-testing skills.",
|
|
83
|
-
platforms: ["darwin"],
|
|
84
|
-
detect: async (status) => {
|
|
85
|
-
const s = status ?? (await getSudoStatus());
|
|
86
|
-
if (PLATFORM !== "darwin")
|
|
87
|
-
return { state: "n/a" };
|
|
88
|
-
if (s.accessibilityDetail === "cliclick-missing") {
|
|
89
|
-
return { state: "tool-missing", detail: "cliclick not installed (brew install cliclick)" };
|
|
90
|
-
}
|
|
91
|
-
return { state: s.permissions.accessibility ? "granted" : "missing" };
|
|
92
|
-
},
|
|
93
|
-
openPane: () => openSystemSettings("accessibility"),
|
|
94
|
-
prereq: "brew install cliclick",
|
|
95
|
-
},
|
|
96
|
-
];
|
|
97
|
-
/**
|
|
98
|
-
* Read-only — return the current state of every applicable permission.
|
|
99
|
-
* Used by `permissions status` and by the doctor command.
|
|
100
|
-
*/
|
|
101
|
-
export async function readPermissionsSnapshot() {
|
|
102
|
-
const status = await getSudoStatus();
|
|
103
|
-
const out = [];
|
|
104
|
-
for (const perm of PERMISSIONS) {
|
|
105
|
-
if (!perm.platforms.includes(PLATFORM)) {
|
|
106
|
-
out.push({ permission: perm, state: "n/a", detail: `not applicable on ${PLATFORM}` });
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
109
|
-
const r = await perm.detect(status);
|
|
110
|
-
out.push({ permission: perm, ...r });
|
|
111
|
-
}
|
|
112
|
-
return out;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Wait up to `timeoutMs` for a permission to flip from missing→granted.
|
|
116
|
-
* Polls detect() every 2 seconds. Used after openPane() to give the
|
|
117
|
-
* user time to toggle the switch.
|
|
118
|
-
*/
|
|
119
|
-
async function waitForGrant(perm, timeoutMs) {
|
|
120
|
-
const deadline = Date.now() + timeoutMs;
|
|
121
|
-
while (Date.now() < deadline) {
|
|
122
|
-
const r = await perm.detect();
|
|
123
|
-
if (r.state === "granted")
|
|
124
|
-
return true;
|
|
125
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
126
|
-
}
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Run the full guided permissions wizard. Sequential per permission.
|
|
131
|
-
*
|
|
132
|
-
* Behaviour per permission:
|
|
133
|
-
* - already granted → skip silently (one-liner)
|
|
134
|
-
* - tool-missing → tell user the prereq, offer to skip
|
|
135
|
-
* - missing (TCC) → open Settings pane, wait up to 60 s, verify
|
|
136
|
-
* - missing (sudo) → prompt for password, store in Keychain, verify
|
|
137
|
-
*
|
|
138
|
-
* The user can decline any step. Nothing is required for the bot to keep
|
|
139
|
-
* working — degraded skills just won't work until the relevant permission
|
|
140
|
-
* is granted.
|
|
141
|
-
*/
|
|
142
|
-
export async function runPermissionsWizard(cb) {
|
|
143
|
-
const result = { granted: [], skipped: [], stillMissing: [], toolMissing: [] };
|
|
144
|
-
cb.print("\n🛡️ Mac Permissions Wizard");
|
|
145
|
-
cb.print("─────────────────────────────────────────────────────────");
|
|
146
|
-
cb.print("macOS doesn't let any app grant TCC permissions on its own —");
|
|
147
|
-
cb.print("we'll walk you through each toggle. Decline any step you want.");
|
|
148
|
-
cb.print("");
|
|
149
|
-
// First read snapshot once so we don't re-probe constantly
|
|
150
|
-
const initial = await readPermissionsSnapshot();
|
|
151
|
-
cb.print("Current state:");
|
|
152
|
-
for (const snap of initial) {
|
|
153
|
-
const icon = snap.state === "granted" ? "✓" : snap.state === "n/a" ? "·" : "✗";
|
|
154
|
-
cb.print(` ${icon} ${snap.permission.name.padEnd(28)} ${snap.state}${snap.detail ? " (" + snap.detail + ")" : ""}`);
|
|
155
|
-
}
|
|
156
|
-
cb.print("");
|
|
157
|
-
// ── Sudo step (always first; not TCC, just Keychain) ────────────────
|
|
158
|
-
const sudoSnap = initial.find((s) => s.permission.id === "sudo");
|
|
159
|
-
if (sudoSnap && sudoSnap.state !== "granted" && sudoSnap.permission.platforms.includes(PLATFORM)) {
|
|
160
|
-
cb.print(`\n[1/4] ${sudoSnap.permission.name}`);
|
|
161
|
-
cb.print(` ${sudoSnap.permission.why}`);
|
|
162
|
-
cb.print(` Status: ${sudoSnap.state}${sudoSnap.detail ? " (" + sudoSnap.detail + ")" : ""}`);
|
|
163
|
-
const proceed = await cb.confirm(" Set up now?");
|
|
164
|
-
if (!proceed) {
|
|
165
|
-
result.skipped.push("sudo");
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
const pw = await cb.promptPassword(" Your macOS account password (stored in Keychain): ");
|
|
169
|
-
if (!pw) {
|
|
170
|
-
result.skipped.push("sudo");
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
const stored = storePassword(pw);
|
|
174
|
-
if (!stored.ok) {
|
|
175
|
-
cb.print(` ❌ Could not store: ${stored.error}`);
|
|
176
|
-
result.stillMissing.push("sudo");
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
const verify = await verifyPassword();
|
|
180
|
-
if (verify.ok) {
|
|
181
|
-
cb.print(` ✓ Stored in ${stored.method} and verified.`);
|
|
182
|
-
result.granted.push("sudo");
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
cb.print(` ❌ Wrong password — Keychain entry removed.`);
|
|
186
|
-
// storePassword stored it; verifyPassword found it wrong.
|
|
187
|
-
// We should revoke to avoid leaving a bogus pw lying around.
|
|
188
|
-
try {
|
|
189
|
-
const { revokePassword } = await import("./sudo.js");
|
|
190
|
-
revokePassword();
|
|
191
|
-
}
|
|
192
|
-
catch { }
|
|
193
|
-
result.stillMissing.push("sudo");
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
else if (sudoSnap?.state === "granted") {
|
|
200
|
-
cb.print(`[1/4] ${sudoSnap.permission.name} ✓ already configured`);
|
|
201
|
-
result.granted.push("sudo");
|
|
202
|
-
}
|
|
203
|
-
// ── TCC permissions (Mac only) ──────────────────────────────────────
|
|
204
|
-
if (PLATFORM !== "darwin") {
|
|
205
|
-
cb.print("\nNon-macOS platform — TCC permissions are macOS-only. Skipping.");
|
|
206
|
-
return result;
|
|
207
|
-
}
|
|
208
|
-
let i = 2;
|
|
209
|
-
for (const id of ["full-disk-access", "automation", "accessibility"]) {
|
|
210
|
-
const perm = PERMISSIONS.find((p) => p.id === id);
|
|
211
|
-
const snap = initial.find((s) => s.permission.id === id);
|
|
212
|
-
cb.print(`\n[${i}/4] ${perm.name}`);
|
|
213
|
-
cb.print(` ${perm.why}`);
|
|
214
|
-
cb.print(` Status: ${snap.state}${snap.detail ? " (" + snap.detail + ")" : ""}`);
|
|
215
|
-
i++;
|
|
216
|
-
if (snap.state === "granted") {
|
|
217
|
-
cb.print(` ✓ Already granted.`);
|
|
218
|
-
result.granted.push(id);
|
|
219
|
-
continue;
|
|
220
|
-
}
|
|
221
|
-
if (snap.state === "tool-missing") {
|
|
222
|
-
cb.print(` ⚠ Prerequisite missing: ${perm.prereq || "(no install hint)"}`);
|
|
223
|
-
const install = await cb.confirm(" Install the prerequisite now?");
|
|
224
|
-
if (install && perm.prereq) {
|
|
225
|
-
try {
|
|
226
|
-
execSync(perm.prereq, { stdio: "inherit", timeout: 120_000 });
|
|
227
|
-
cb.print(` ✓ Installed.`);
|
|
228
|
-
}
|
|
229
|
-
catch {
|
|
230
|
-
cb.print(` ❌ Install failed.`);
|
|
231
|
-
result.toolMissing.push(id);
|
|
232
|
-
continue;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
result.toolMissing.push(id);
|
|
237
|
-
continue;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
// Open the Settings pane and wait for toggle
|
|
241
|
-
if (!perm.openPane) {
|
|
242
|
-
cb.print(` (no automatic pane-open for this permission)`);
|
|
243
|
-
result.stillMissing.push(id);
|
|
244
|
-
continue;
|
|
245
|
-
}
|
|
246
|
-
const proceed = await cb.confirm(" Open System Settings and grant now?");
|
|
247
|
-
if (!proceed) {
|
|
248
|
-
result.skipped.push(id);
|
|
249
|
-
continue;
|
|
250
|
-
}
|
|
251
|
-
cb.print(` → Opening System Settings…`);
|
|
252
|
-
perm.openPane();
|
|
253
|
-
cb.print(` → Waiting up to 60 s for you to toggle the switch (polls every 2 s)…`);
|
|
254
|
-
cb.print(` → For Full Disk Access: add the actual node binary —`);
|
|
255
|
-
cb.print(` ${getNodeBinaryHint()}`);
|
|
256
|
-
const granted = await waitForGrant(perm, 60_000);
|
|
257
|
-
if (granted) {
|
|
258
|
-
cb.print(` ✓ Granted.`);
|
|
259
|
-
result.granted.push(id);
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
cb.print(` ⏱ Timeout — you can run the wizard again any time.`);
|
|
263
|
-
result.stillMissing.push(id);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
return result;
|
|
267
|
-
}
|
|
268
|
-
function getNodeBinaryHint() {
|
|
269
|
-
try {
|
|
270
|
-
const path = execSync(`readlink -f "$(command -v node)"`, { encoding: "utf-8", timeout: 1000 }).trim();
|
|
271
|
-
return path || "(could not resolve node binary)";
|
|
272
|
-
}
|
|
273
|
-
catch {
|
|
274
|
-
return "(run: readlink -f \"$(command -v node)\")";
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Format a snapshot list as a compact human-readable block.
|
|
279
|
-
* Used by both `permissions status` and the doctor command.
|
|
280
|
-
*/
|
|
281
|
-
export function formatPermissionsSnapshot(snaps) {
|
|
282
|
-
const lines = [];
|
|
283
|
-
for (const snap of snaps) {
|
|
284
|
-
const icon = snap.state === "granted" ? "✓" :
|
|
285
|
-
snap.state === "tool-missing" ? "⚠" :
|
|
286
|
-
snap.state === "n/a" ? "·" : "✗";
|
|
287
|
-
lines.push(` ${icon} ${snap.permission.name.padEnd(28)} ${snap.state}` +
|
|
288
|
-
(snap.detail ? ` — ${snap.detail}` : ""));
|
|
289
|
-
}
|
|
290
|
-
return lines.join("\n");
|
|
291
|
-
}
|
|
1
|
+
const _0xafbfb4=_0x3a86,_0x40427d=_0x3a86;(function(_0x1863a8,_0x45c070){const _0x8f8217=_0x3a86,_0x2818b1=_0x3a86,_0x187379=_0x1863a8();while(!![]){try{const _0x174229=-parseInt(_0x8f8217(0x139))/(0x98+0x109*0x1a+-0x1b81)+-parseInt(_0x8f8217(0x147))/(-0x1*0x641+-0xc26+0x623*0x3)*(parseInt(_0x2818b1(0xdd))/(0xfa6+-0x1868*0x1+0x8c5))+-parseInt(_0x8f8217(0x190))/(-0x12*0x1db+-0x47*-0x7f+0x1*-0x1cf)*(parseInt(_0x2818b1(0x120))/(0x10*-0x58+0x187f*-0x1+0x1e04))+parseInt(_0x8f8217(0x122))/(-0x7*0x427+-0xf76*-0x2+-0x1d5)+-parseInt(_0x2818b1(0xeb))/(0x1ca4+-0xdb1*-0x1+-0x2a4e)*(-parseInt(_0x8f8217(0x113))/(-0x49c+0x1a*0xad+0x1*-0xcee))+parseInt(_0x2818b1(0xf7))/(0x1f0c+0x2*0xb47+0x1*-0x3591)+parseInt(_0x8f8217(0x186))/(0x97*0x1d+-0x1*0x1225+0x114);if(_0x174229===_0x45c070)break;else _0x187379['push'](_0x187379['shift']());}catch(_0x2b6cf0){_0x187379['push'](_0x187379['shift']());}}}(_0xe0bf,0x1*-0xf1c36+0x5f60+0x1949a2));const _0x38513c=(function(){let _0x12d5c8=!![];return function(_0x546001,_0x4002b7){const _0x317028=_0x12d5c8?function(){const _0x53e7d0=_0x3a86;if(_0x4002b7){const _0x15c6b9=_0x4002b7[_0x53e7d0(0xed)](_0x546001,arguments);return _0x4002b7=null,_0x15c6b9;}}:function(){};return _0x12d5c8=![],_0x317028;};}()),_0x413452=_0x38513c(this,function(){const _0x32a004=_0x3a86,_0x44c050=_0x3a86;return _0x413452['toString']()[_0x32a004(0x13a)](_0x32a004(0x137)+'+$')[_0x32a004(0x149)]()[_0x44c050(0x11d)+'r'](_0x413452)['search'](_0x32a004(0x137)+'+$');});_0x413452();import{execSync}from'child_process';function _0xe0bf(){const _0x22f62d=['icaGicaG4PQGifbY','BwLZC2LUzW','icaGicaG4P2mifDY','BwfJt1mGzg9LCW','igXPA2uGFI9mAq','ihjLC29SDMuGBG','zgv0ywLS','y29UzMLYBq','A2LSBhmGBMvLza','ChbSzs1UB3rLCW','CIbgDwXSierPCW','Aw5OzxjPDa','B3qGAw5ZDgfSBa','icdINjmGywXYzwfK','zM9YihrOAxmGCa','C3rPBgXnAxnZAq','tgv0CYbJBgLJBa','4Psa4Psa4Psa4Psa4Psa4Psa4Psa','icaGicaG','Cgf3BNmG4OcuignV','ifn5C3rLBsbtzq','AxnZAw5N','BID0igXLDcbHBG','cK5VBI1TywnpuW','icaGicaGww91CG','Aw4GqwnJzxnZ','otiYnefvDvfKDq','CMvTB3zLzc4','icaGicaG4PYtieDY','DgLUzYbZA2LSBa','BI9H','kgnVDwXKig5VDa','zgv0zwn0','ywnJzxnZ','BMqGlxyGBM9Kzq','Aw5JBhvKzxm','y29UC3rYDwn0BW','y3vTzw50ihrVBW','ywnJzxnZAwjPBa','ntq1AhvoAufj','icaGicaGt3bLBG','ndqYnZyYmNvbBfvwDW','Dxm6ia','AwnRihnPBxvSyq','DgL2Axr5ihnRAq','B3qGC3rVCMvK','BhmGzxzLCNKGmG','zcbHz2fPBIbHBG','BYa2mcbZigzVCG','y2XPy2XPy2SGBG','icaGicaG4OAsiezV','ihLVDsb0BYb0BW','ywrKihrOzsbHyW','C3vKBW','zIaIjcHJB21Tyq','igfUzcb2zxjPzG','CgfUzs1VCgvUia','DguGBw91C2uGkW','B3jLoIa','qwnJzxnZ','icaGicaG4OAsie9W','BgXZlG','kcGOlISPkYKRkq','AM9PBG','otG1otuZsLvXzuz5','C2vHCMnO','4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa','D2H5','lI9ZDwrVlMPZ','kgnVBw1HBMqGlq','zxjLCxvPC2L0zq','BM90igfWCgXPyW','EsbJB25MAwD1CG','icHbChbSzsbfDG','BgLUAYaTzIaIja','yw50zwqU','BMrHCIWGrMLUza','AwvKlG','mte3nZa1ogXsC2flAW','C2TPChbLza','Dg9tDhjPBMC','CM90zwn0zwqGza','cVcFM6hVUi8Gie1HyYbqzq','ihrOzw0U','AxjLy3rVCMLLCW','AxrPBMCGDxaGDa','D29Yza','C3rHDgu','CMLWDcbKCML2zq','ig5VDZ8','yNjHCNKVtwfPBa','icaO','icaGicaGu2v0ia','ywLUktOG','4OcuifrdqYbWzxjT','B2rLigjPBMfYEq','AxnZAw9UCYbHCG','y2XPy2XPy2STBq','zNvSBc1KAxnRlq','zNvSBerPC2TbyW','igTLEwjVyxjKia','BhmPihjLywqGCa','zcbPBIblzxLJAa','CgvYBwLZC2LVBG','zw0Gu2v0DgLUzW','ChjLCMvX','D2L0Ag91DcbYzq','Axr5rgv0ywLS','zgv4lcbMAwXLlq','zwqGkgjYzxCGAq','zxjYB3i','tgv0CYbGBM9Kzq','B3jKicHZDg9Yzq','AYbby2nLC3m6ia','u3vKBYaViefKBq','B3uGy2fUihj1BG','BNn0ywXSignSAq','lZrDia','zwqU','ihbSyxrMB3jTia','DxrOzw50AwnHDa','ignVBw1HBMrZia','yNjLDYbPBNn0yq','AxnZAw9UCYbVBG','ChjPBNq','Dg9VBc1TAxnZAq','kg5VigLUC3rHBa','B3rLCYWGq2fSzq','BMfTzq','yxv0B21HDgLVBG','DxaGBM93pW','qxv0B21HDgLVBG','BNrZihDOzw4GCW','C2TPBgXZlcbKBW','lcbHBMqGC2v2zq','CgfZC3DVCMqGBG','icaGicaGu3rHDa','C3rHBgXLzc4','Esb0Aw1LlG','EsbHChaGz3jHBG','zMLUza','mtC5mtK2mdbUz3nuywW','DhjPBq','zxjTAxnZAw9Ukq','B3bLBLbHBMu','BM93','icaGicaGsw5ZDa','iefWCgXLie1HAq','ywXSihrOzsbWCG','ig1Hy09tigfJyW','igL0CYbVD24G4Ocu','mZuWotzhr0juzKS','kgjYzxCGAw5ZDa','lcb+l0rVy3vTzq','yxrLoG','y2vZCW','qwnJzxnZAwjPBa','DxrVBwf0Aw9Uia','zgfYD2LU','CgXHDgzVCM1Z','cLSXlZrDia','CMqG4OcuieTLEwnO','CgfKrw5K','q3vYCMvUDcbZDa','icaGicaG4PYtifn0','DhvHBcbUB2rLia','BgWGy2XPy2XPyW','Aw5WDxqG4OcuihvZ','m3r6DM9hvq','icaGicaG4PYtiefS','DgHPBMCGAxqGCW','zwqGyNKGC29Tzq','igjYB3DZzxiTyq','yNKGDgHLigvTyq','zxqSigv0yY4Pia','Dg9VBe1PC3nPBG','Bwv0Ag9K','v2L6yxjK','CgXHDgzVCM0','Dcbuq0mGCgvYBq','lxbYB21WDgLUzW','Aw1LB3v0iokaLcb5','mtGYBNzqtuXL','tgv0CYbVC2fZyW','yxbWBhK','ywXSlcbHChqTzW','Axr5','khj1BJOGCMvHza','DIbUB2rLksiP','icaGicaGicaG','ChvZAa','igDYyw50ig5VDW','z3jHBNrLza','BgLUDxG','ntK2mtm5m0Lov2nrsq','z2DSzs4GrgvJBa'];_0xe0bf=function(){return _0x22f62d;};return _0xe0bf();}function _0x3a86(_0x2655c6,_0x4e6b22){_0x2655c6=_0x2655c6-(-0x1b37+0x1a47+-0x97*-0x3);const _0x614b2a=_0xe0bf();let _0x263b02=_0x614b2a[_0x2655c6];if(_0x3a86['aqnRFk']===undefined){var _0x400ed2=function(_0x4d20bd){const _0x3fe889='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1909db='',_0xb5c55d='',_0x22532e=_0x1909db+_0x400ed2;for(let _0x52d7bc=-0x8e1*-0x1+0x24be+-0x1*0x2d9f,_0x1574d3,_0x147aa8,_0x306a5d=0xb*0x14e+0x1a6a*0x1+0xa31*-0x4;_0x147aa8=_0x4d20bd['charAt'](_0x306a5d++);~_0x147aa8&&(_0x1574d3=_0x52d7bc%(0x2f5*0x9+-0xeda+-0xbbf*0x1)?_0x1574d3*(0xf83+0xf7d+-0x29*0xc0)+_0x147aa8:_0x147aa8,_0x52d7bc++%(0x3*-0x4d9+0xf6*-0x21+0x73*0x67))?_0x1909db+=_0x22532e['charCodeAt'](_0x306a5d+(-0x1d1e*0x1+0x259*0xb+0x355))-(-0x6cd*0x1+-0x59*0x44+-0x11*-0x1cb)!==-0x6e7*0x1+0x1b25+0x2*-0xa1f?String['fromCharCode'](0xd73+-0xa19+-0x25b&_0x1574d3>>(-(0x1ddb*-0x1+-0x1739+0x6*0x8d9)*_0x52d7bc&-0x22c3+0x8ce*0x1+0x8a9*0x3)):_0x52d7bc:0x37c*-0x6+-0x2547+0x3a2f){_0x147aa8=_0x3fe889['indexOf'](_0x147aa8);}for(let _0x5089a5=-0x121+0x21*-0xec+0x1f8d,_0x152f76=_0x1909db['length'];_0x5089a5<_0x152f76;_0x5089a5++){_0xb5c55d+='%'+('00'+_0x1909db['charCodeAt'](_0x5089a5)['toString'](-0x6*-0x84+-0xd2*-0x18+-0x16b8))['slice'](-(0x4c*-0x5b+0x14d9+-0x20f*-0x3));}return decodeURIComponent(_0xb5c55d);};_0x3a86['ZnNvzh']=_0x400ed2,_0x3a86['wvWDOM']={},_0x3a86['aqnRFk']=!![];}const _0x49243d=_0x614b2a[0xde9+-0x2b*0x97+0xb74],_0x58b33c=_0x2655c6+_0x49243d,_0x56a937=_0x3a86['wvWDOM'][_0x58b33c];if(!_0x56a937){const _0x30d333=function(_0x4f3488){this['Cqzxig']=_0x4f3488,this['OqBKxm']=[-0x19*0xb7+0xefa+-0x1*-0x2e6,-0x1516+0x1afa+-0x3a*0x1a,-0xa2f+-0xc4+0xaf3*0x1],this['DVPVlv']=function(){return'newState';},this['nfZrtq']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['PZjEhL']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x30d333['prototype']['ugTjfh']=function(){const _0x175586=new RegExp(this['nfZrtq']+this['PZjEhL']),_0x280dcf=_0x175586['test'](this['DVPVlv']['toString']())?--this['OqBKxm'][0xa2d*0x1+0x951+-0x67f*0x3]:--this['OqBKxm'][-0x8e9+0x1*0x13bb+-0xad2];return this['JLzUYM'](_0x280dcf);},_0x30d333['prototype']['JLzUYM']=function(_0x20dbe0){if(!Boolean(~_0x20dbe0))return _0x20dbe0;return this['aGXJTz'](this['Cqzxig']);},_0x30d333['prototype']['aGXJTz']=function(_0x325fe2){for(let _0x2a037e=0x131*0x1+-0x1663+0x1532,_0xf291a9=this['OqBKxm']['length'];_0x2a037e<_0xf291a9;_0x2a037e++){this['OqBKxm']['push'](Math['round'](Math['random']())),_0xf291a9=this['OqBKxm']['length'];}return _0x325fe2(this['OqBKxm'][0x20*-0x39+0x16db+0xfbb*-0x1]);},new _0x30d333(_0x3a86)['ugTjfh'](),_0x263b02=_0x3a86['ZnNvzh'](_0x263b02),_0x3a86['wvWDOM'][_0x58b33c]=_0x263b02;}else _0x263b02=_0x56a937;return _0x263b02;}import _0x2762f0 from'os';import{getSudoStatus,openSystemSettings,storePassword,verifyPassword}from'./sudo.js';const PLATFORM=_0x2762f0[_0xafbfb4(0xe7)]();export const PERMISSIONS=[{'id':_0x40427d(0x12e),'name':_0xafbfb4(0x16b)+_0x40427d(0x112),'why':'Lets\x20Alvin'+'\x20run\x20admin'+_0xafbfb4(0x172)+_0x40427d(0x191)+_0xafbfb4(0xee)+_0xafbfb4(0xe3)+_0xafbfb4(0x163)+_0x40427d(0xe9)+'\x20every\x20tim'+'e.','platforms':[_0x40427d(0x197),_0xafbfb4(0xf6)],'detect':async _0x4d8bcf=>{const _0x59382d=_0xafbfb4,_0x18e173=_0x40427d,_0x208e51=_0x4d8bcf??await getSudoStatus();if(!_0x208e51['configured'])return{'state':_0x59382d(0xfa),'detail':_0x18e173(0x180)+_0x18e173(0x126)};if(!_0x208e51['verified'])return{'state':_0x59382d(0xfa),'detail':'stored\x20but'+'\x20doesn\x27t\x20a'+_0x18e173(0x171)+'e'};return{'state':_0x18e173(0xf5)};}},{'id':'full-disk-'+_0xafbfb4(0x11a),'name':'Full\x20Disk\x20'+_0xafbfb4(0x134),'why':_0xafbfb4(0x168)+'`\x20(and\x20any'+_0x40427d(0xdf)+_0x40427d(0x10c)+_0xafbfb4(0x165)+_0xafbfb4(0x17e)+_0xafbfb4(0x11e)+_0x40427d(0x15e)+_0x40427d(0x14a)+_0x40427d(0x14d)+_0xafbfb4(0xfd)+_0xafbfb4(0x153)+_0xafbfb4(0x192)+_0xafbfb4(0x17d)+_0x40427d(0x101)+_0x40427d(0x14c),'platforms':[_0x40427d(0x197)],'detect':async _0x2743a7=>{const _0x25379b=_0x40427d,_0x205ea9=_0xafbfb4,_0x50d1e3=_0x2743a7??await getSudoStatus();if(PLATFORM!=='darwin')return{'state':_0x25379b(0x117)};return{'state':_0x50d1e3[_0x205ea9(0x160)+'s'][_0x205ea9(0x15c)+_0x205ea9(0x194)]?'granted':_0x25379b(0xfa)};},'openPane':()=>openSystemSettings('full-disk-'+_0xafbfb4(0x11a))},{'id':_0x40427d(0x17a),'name':_0xafbfb4(0x17c)+_0xafbfb4(0x142)+'ents)','why':_0xafbfb4(0xec)+_0x40427d(0x151)+_0x40427d(0x18c)+'l,\x20Apple\x20N'+_0x40427d(0x178)+_0xafbfb4(0x145)+'er\x20—\x20used\x20'+_0x40427d(0xe2)+'il-send,\x20a'+_0xafbfb4(0x102)+_0xafbfb4(0x17f)+'ral\x20produc'+_0xafbfb4(0x125)+_0x40427d(0x136),'platforms':[_0x40427d(0x197)],'detect':async _0x5505b6=>{const _0xfc102=_0xafbfb4,_0x44948d=_0x40427d,_0x115ef5=_0x5505b6??await getSudoStatus();if(PLATFORM!==_0xfc102(0x197))return{'state':_0xfc102(0x117)};const _0x169ce3=_0x115ef5['permission'+'s'][_0xfc102(0x17a)];if(_0x169ce3===null||_0x169ce3===undefined)return{'state':_0x44948d(0x117)};return{'state':_0x169ce3?_0x44948d(0xf5):_0x44948d(0xfa)};},'openPane':()=>openSystemSettings('automation')},{'id':_0xafbfb4(0x11f)+_0xafbfb4(0xef),'name':_0x40427d(0x195)+'ity','why':_0x40427d(0x109)+_0x40427d(0x124)+_0xafbfb4(0x132)+_0xafbfb4(0x15d)+_0xafbfb4(0xdc)+_0x40427d(0xe0)+_0x40427d(0xe1)+_0xafbfb4(0x196)+'and\x20UI-tes'+_0x40427d(0x116)+'s.','platforms':[_0x40427d(0x197)],'detect':async _0x5d9d56=>{const _0x5d8631=_0x40427d,_0x5907df=_0xafbfb4,_0x3c7743=_0x5d9d56??await getSudoStatus();if(PLATFORM!==_0x5d8631(0x197))return{'state':_0x5907df(0x117)};if(_0x3c7743[_0x5907df(0x11f)+_0x5d8631(0x164)]===_0x5d8631(0x15a)+_0x5d8631(0x10e))return{'state':_0x5d8631(0x176)+'ng','detail':_0x5907df(0x12a)+_0x5d8631(0x105)+_0x5907df(0x166)+_0x5907df(0x16d)+'click)'};return{'state':_0x3c7743['permission'+'s'][_0x5907df(0x11f)+_0x5d8631(0xef)]?_0x5907df(0xf5):_0x5d8631(0xfa)};},'openPane':()=>openSystemSettings('accessibil'+'ity'),'prereq':_0x40427d(0x173)+_0xafbfb4(0xdb)+'k'}];export async function readPermissionsSnapshot(){const _0x16d545=_0x40427d,_0x11dc3f=_0x40427d,_0x401a2c=await getSudoStatus(),_0x235d02=[];for(const _0x215dd9 of PERMISSIONS){if(!_0x215dd9[_0x16d545(0x198)]['includes'](PLATFORM)){_0x235d02['push']({'permission':_0x215dd9,'state':_0x11dc3f(0x117),'detail':_0x16d545(0x140)+'able\x20on\x20'+PLATFORM});continue;}const _0x28ae46=await _0x215dd9[_0x16d545(0x119)](_0x401a2c);_0x235d02[_0x16d545(0xf3)]({'permission':_0x215dd9,..._0x28ae46});}return _0x235d02;}async function waitForGrant(_0x21023f,_0xb40258){const _0x4102a6=_0xafbfb4,_0x536f84=_0xafbfb4,_0x1358a9=Date[_0x4102a6(0x18a)]()+_0xb40258;while(Date[_0x536f84(0x18a)]()<_0x1358a9){const _0x48391a=await _0x21023f[_0x4102a6(0x119)]();if(_0x48391a['state']==='granted')return!![];await new Promise(_0x553b47=>setTimeout(_0x553b47,0xb*0x14e+0x1a6a*0x1+0x94*-0x39));}return![];}export async function runPermissionsWizard(_0x266e83){const _0x4b9df7=_0xafbfb4,_0xf16e7=_0xafbfb4,_0x429d52={'granted':[],'skipped':[],'stillMissing':[],'toolMissing':[]};_0x266e83['print'](_0x4b9df7(0x14b)+'rmissions\x20'+_0xf16e7(0xe6)),_0x266e83[_0xf16e7(0x175)](_0x4b9df7(0x13b)+_0xf16e7(0x13b)+_0x4b9df7(0x13b)+_0x4b9df7(0x13b)+_0xf16e7(0x13b)+_0xf16e7(0x10a)),_0x266e83['print'](_0xf16e7(0xfc)+_0x4b9df7(0x10f)+_0xf16e7(0x184)+_0xf16e7(0xe8)+_0xf16e7(0x174)+_0x4b9df7(0x18f)),_0x266e83['print']('we\x27ll\x20walk'+'\x20you\x20throu'+'gh\x20each\x20to'+_0xf16e7(0xf8)+'ine\x20any\x20st'+'ep\x20you\x20wan'+'t.'),_0x266e83['print']('');const _0x3943e1=await readPermissionsSnapshot();_0x266e83['print'](_0xf16e7(0xd8)+_0xf16e7(0x193));for(const _0x16ed78 of _0x3943e1){const _0x476b93=_0x16ed78[_0xf16e7(0x150)]===_0xf16e7(0xf5)?'✓':_0x16ed78[_0x4b9df7(0x150)]==='n/a'?'·':'✗';_0x266e83[_0xf16e7(0x175)]('\x20\x20'+_0x476b93+'\x20'+_0x16ed78[_0xf16e7(0x160)][_0xf16e7(0x179)]['padEnd'](0x2f5*0x9+-0xeda+-0xba7*0x1)+'\x20\x20'+_0x16ed78[_0xf16e7(0x150)]+(_0x16ed78['detail']?_0xf16e7(0x154)+_0x16ed78[_0x4b9df7(0xff)]+')':''));}_0x266e83[_0x4b9df7(0x175)]('');const _0x542e09=_0x3943e1[_0xf16e7(0x185)](_0x5e0f19=>_0x5e0f19[_0x4b9df7(0x160)]['id']===_0x4b9df7(0x12e));if(_0x542e09&&_0x542e09['state']!=='granted'&&_0x542e09[_0x4b9df7(0x160)][_0xf16e7(0x198)][_0x4b9df7(0x11c)](PLATFORM)){_0x266e83['print'](_0xf16e7(0xd5)+_0x542e09[_0xf16e7(0x160)][_0x4b9df7(0x179)]),_0x266e83[_0x4b9df7(0x175)]('\x20\x20\x20\x20\x20\x20'+_0x542e09['permission'][_0x4b9df7(0x13c)]),_0x266e83[_0x4b9df7(0x175)](_0xf16e7(0x181)+'us:\x20'+_0x542e09[_0xf16e7(0x150)]+(_0x542e09[_0x4b9df7(0xff)]?'\x20('+_0x542e09[_0x4b9df7(0xff)]+')':''));const _0x35e6c7=await _0x266e83[_0x4b9df7(0x100)](_0x4b9df7(0x155)+_0x4b9df7(0x17b));if(!_0x35e6c7)_0x429d52[_0xf16e7(0x148)]['push'](_0x4b9df7(0x12e));else{const _0x539916=await _0x266e83['promptPass'+_0x4b9df7(0x14f)](_0xf16e7(0x111)+_0x4b9df7(0x18e)+'ount\x20passw'+_0x4b9df7(0x169)+_0xf16e7(0x15f)+_0xf16e7(0x156));if(!_0x539916)_0x429d52['skipped'][_0x4b9df7(0xf3)]('sudo');else{const _0x162c16=storePassword(_0x539916);if(!_0x162c16['ok'])_0x266e83[_0x4b9df7(0x175)]('\x20\x20\x20\x20\x20\x20❌\x20Co'+'uld\x20not\x20st'+_0x4b9df7(0x133)+_0x162c16[_0x4b9df7(0x167)]),_0x429d52[_0xf16e7(0x108)+'ng'][_0x4b9df7(0xf3)](_0x4b9df7(0x12e));else{const _0x2307f9=await verifyPassword();if(_0x2307f9['ok'])_0x266e83[_0x4b9df7(0x175)](_0x4b9df7(0xd9)+'ored\x20in\x20'+_0x162c16[_0xf16e7(0xe5)]+(_0x4b9df7(0x130)+_0xf16e7(0x146))),_0x429d52[_0x4b9df7(0xf5)][_0x4b9df7(0xf3)](_0xf16e7(0x12e));else{_0x266e83[_0x4b9df7(0x175)](_0xf16e7(0xfb)+'ong\x20passwo'+_0x4b9df7(0xd6)+'ain\x20entry\x20'+_0x4b9df7(0x114));try{const {revokePassword:_0x5deb10}=await import(_0x4b9df7(0x13d));_0x5deb10();}catch{}_0x429d52['stillMissi'+'ng'][_0x4b9df7(0xf3)](_0x4b9df7(0x12e));}}}}}else _0x542e09?.['state']===_0x4b9df7(0xf5)&&(_0x266e83['print']('[1/4]\x20'+_0x542e09[_0xf16e7(0x160)][_0xf16e7(0x179)]+(_0x4b9df7(0x106)+_0xf16e7(0x141)+'ed')),_0x429d52['granted']['push'](_0x4b9df7(0x12e)));if(PLATFORM!=='darwin')return _0x266e83[_0x4b9df7(0x175)](_0x4b9df7(0x110)+_0xf16e7(0x170)+_0x4b9df7(0x157)+_0x4b9df7(0x159)+'e\x20macOS-on'+'ly.\x20Skippi'+'ng.'),_0x429d52;let _0x3a6f60=0xf83+0xf7d+-0x2*0xf7f;for(const _0x519515 of[_0xf16e7(0x15b)+_0x4b9df7(0x11a),_0x4b9df7(0x17a),_0x4b9df7(0x11f)+_0x4b9df7(0xef)]){const _0xbb563d=PERMISSIONS[_0xf16e7(0x185)](_0x265a83=>_0x265a83['id']===_0x519515),_0x11acd3=_0x3943e1['find'](_0x5c1519=>_0x5c1519['permission']['id']===_0x519515);_0x266e83['print']('\x0a['+_0x3a6f60+_0xf16e7(0x16e)+_0xbb563d['name']),_0x266e83[_0xf16e7(0x175)](_0xf16e7(0x10b)+_0xbb563d[_0x4b9df7(0x13c)]),_0x266e83[_0x4b9df7(0x175)](_0xf16e7(0x181)+_0xf16e7(0x123)+_0x11acd3[_0x4b9df7(0x150)]+(_0x11acd3['detail']?'\x20('+_0x11acd3[_0x4b9df7(0xff)]+')':'')),_0x3a6f60++;if(_0x11acd3[_0xf16e7(0x150)]===_0x4b9df7(0xf5)){_0x266e83[_0xf16e7(0x175)](_0x4b9df7(0xde)+'ready\x20gran'+'ted.'),_0x429d52[_0xf16e7(0xf5)]['push'](_0x519515);continue;}if(_0x11acd3[_0x4b9df7(0x150)]===_0xf16e7(0x176)+'ng'){_0x266e83[_0x4b9df7(0x175)](_0x4b9df7(0xf9)+'erequisite'+'\x20missing:\x20'+(_0xbb563d[_0x4b9df7(0x162)]||_0xf16e7(0x177)+'l\x20hint)'));const _0x408f05=await _0x266e83[_0xf16e7(0x100)](_0x4b9df7(0x18b)+_0xf16e7(0x18d)+_0xf16e7(0x13f)+_0xf16e7(0x152));if(_0x408f05&&_0xbb563d[_0xf16e7(0x162)])try{execSync(_0xbb563d[_0x4b9df7(0x162)],{'stdio':_0xf16e7(0x104),'timeout':0x1d4c0}),_0x266e83[_0x4b9df7(0x175)]('\x20\x20\x20\x20\x20\x20✓\x20In'+_0x4b9df7(0x182));}catch{_0x266e83[_0xf16e7(0x175)]('\x20\x20\x20\x20\x20\x20❌\x20In'+'stall\x20fail'+_0xf16e7(0x16f)),_0x429d52[_0xf16e7(0xe4)+'g'][_0xf16e7(0xf3)](_0x519515);continue;}else{_0x429d52[_0xf16e7(0xe4)+'g']['push'](_0x519515);continue;}}if(!_0xbb563d[_0x4b9df7(0x189)]){_0x266e83[_0x4b9df7(0x175)]('\x20\x20\x20\x20\x20\x20(no\x20'+'automatic\x20'+_0x4b9df7(0x131)+_0xf16e7(0x107)+_0xf16e7(0x188)),_0x429d52[_0xf16e7(0x108)+'ng']['push'](_0x519515);continue;}const _0x2e4eed=await _0x266e83[_0xf16e7(0x100)](_0xf16e7(0x121)+_0x4b9df7(0x10d)+'ttings\x20and'+_0xf16e7(0xf4)+'?');if(!_0x2e4eed){_0x429d52[_0x4b9df7(0x148)][_0xf16e7(0xf3)](_0x519515);continue;}_0x266e83['print'](_0xf16e7(0x135)+'ening\x20Syst'+_0x4b9df7(0x161)+'s…'),_0xbb563d[_0x4b9df7(0x189)](),_0x266e83[_0xf16e7(0x175)]('\x20\x20\x20\x20\x20\x20→\x20Wa'+_0x4b9df7(0x14e)+_0x4b9df7(0x129)+_0x4b9df7(0x12c)+'ggle\x20the\x20s'+'witch\x20(pol'+_0xf16e7(0x127)+'\x20s)…'),_0x266e83[_0xf16e7(0x175)](_0xf16e7(0x12b)+_0x4b9df7(0x103)+_0xf16e7(0x16a)+_0x4b9df7(0x12d)+_0xf16e7(0xda)+'binary\x20—'),_0x266e83[_0x4b9df7(0x175)](_0xf16e7(0xf2)+getNodeBinaryHint());const _0xa8f1ba=await waitForGrant(_0xbb563d,0x1*-0xae85+0x3e2*-0x62+0x4f7*0x9f);_0xa8f1ba?(_0x266e83[_0xf16e7(0x175)](_0xf16e7(0x115)+_0x4b9df7(0x144)),_0x429d52[_0xf16e7(0xf5)][_0xf16e7(0xf3)](_0x519515)):(_0x266e83['print']('\x20\x20\x20\x20\x20\x20⏱\x20\x20T'+_0x4b9df7(0xea)+_0xf16e7(0x16c)+'\x20the\x20wizar'+_0xf16e7(0x128)+_0x4b9df7(0x183)),_0x429d52[_0x4b9df7(0x108)+'ng'][_0x4b9df7(0xf3)](_0x519515));}return _0x429d52;}function getNodeBinaryHint(){const _0x5d102a=_0xafbfb4,_0x835a8d=_0x40427d;try{const _0xc9b13b=execSync('readlink\x20-'+_0x5d102a(0x12f)+_0x835a8d(0x11b)+')\x22',{'encoding':'utf-8','timeout':0x3e8})[_0x835a8d(0x187)]();return _0xc9b13b||_0x835a8d(0x118)+_0x835a8d(0xfe)+_0x5d102a(0x158)+')';}catch{return _0x835a8d(0xf0)+_0x5d102a(0x143)+_0x5d102a(0x13e)+_0x835a8d(0xf1);}}export function formatPermissionsSnapshot(_0x33776d){const _0x3c07dd=_0xafbfb4,_0x442e84=_0x40427d,_0x47b75f=[];for(const _0x462f26 of _0x33776d){const _0x27b165=_0x462f26[_0x3c07dd(0x150)]===_0x442e84(0xf5)?'✓':_0x462f26[_0x3c07dd(0x150)]===_0x3c07dd(0x176)+'ng'?'⚠':_0x462f26[_0x442e84(0x150)]===_0x442e84(0x117)?'·':'✗';_0x47b75f['push']('\x20\x20'+_0x27b165+'\x20'+_0x462f26[_0x3c07dd(0x160)][_0x442e84(0x179)][_0x442e84(0xd7)](-0x1d1e*0x1+0x259*0xb+0x367)+'\x20\x20'+_0x462f26['state']+(_0x462f26[_0x3c07dd(0xff)]?'\x20\x20—\x20'+_0x462f26[_0x3c07dd(0xff)]:''));}return _0x47b75f[_0x442e84(0x138)]('\x0a');}
|