alvin-bot 5.7.0 → 5.8.1
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 +25 -0
- package/README.md +25 -31
- 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 _0x58defa=_0x5602,_0x39ed66=_0x5602;(function(_0x394e8b,_0x3a5937){const _0x2579b7=_0x5602,_0xca630e=_0x5602,_0xa83825=_0x394e8b();while(!![]){try{const _0x45e498=-parseInt(_0x2579b7(0x1ea))/(0x12f*-0x1b+-0x1ace+0x3ac4*0x1)*(parseInt(_0xca630e(0x213))/(-0x925+-0x1b79+0x24a0))+-parseInt(_0x2579b7(0x211))/(-0x16*0xbc+0x1870+-0x845)+parseInt(_0xca630e(0x223))/(-0x10*-0x1af+-0x11b7+-0x935)+parseInt(_0xca630e(0x28b))/(-0x293*-0x5+0x847*0x2+-0x8*0x3ad)*(-parseInt(_0xca630e(0x1e8))/(0xfa1*0x1+0x1534+-0xc45*0x3))+-parseInt(_0x2579b7(0x21e))/(0x1*0x1615+-0x1a04+0x6*0xa9)*(parseInt(_0xca630e(0x251))/(-0x135a+-0x1de0+0x3142))+-parseInt(_0x2579b7(0x1f5))/(0x343*-0x2+0xe2*0x11+-0x873)+parseInt(_0xca630e(0x275))/(0x1a09+0x180+0x1b7f*-0x1);if(_0x45e498===_0x3a5937)break;else _0xa83825['push'](_0xa83825['shift']());}catch(_0x658cb7){_0xa83825['push'](_0xa83825['shift']());}}}(_0x5162,0xe150e+-0x303a3*-0x1+-0x9868f));const _0x6a4441=(function(){let _0x29dd2a=!![];return function(_0x2ffc94,_0x3814bd){const _0x20eb91=_0x29dd2a?function(){const _0x266bb9=_0x5602;if(_0x3814bd){const _0x354456=_0x3814bd[_0x266bb9(0x23c)](_0x2ffc94,arguments);return _0x3814bd=null,_0x354456;}}:function(){};return _0x29dd2a=![],_0x20eb91;};}()),_0x4acec5=_0x6a4441(this,function(){const _0x17c885=_0x5602,_0xd3457f=_0x5602;return _0x4acec5['toString']()['search'](_0x17c885(0x205)+'+$')[_0x17c885(0x279)]()['constructo'+'r'](_0x4acec5)['search'](_0xd3457f(0x205)+'+$');});_0x4acec5();function _0x5602(_0x91bd50,_0x2e19b5){_0x91bd50=_0x91bd50-(0x16e4+-0x583*0x2+0x353*-0x3);const _0x54a9c7=_0x5162();let _0x2a6350=_0x54a9c7[_0x91bd50];if(_0x5602['FMEYHi']===undefined){var _0x638222=function(_0x17a538){const _0x3d893b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4a2364='',_0x50faac='',_0x3ca376=_0x4a2364+_0x638222;for(let _0x59ea9b=-0x1*-0x1e93+0x1*-0x624+0x825*-0x3,_0x3626ef,_0x4fdcda,_0x3cb2b1=0x24a3+0x550+-0x29f3;_0x4fdcda=_0x17a538['charAt'](_0x3cb2b1++);~_0x4fdcda&&(_0x3626ef=_0x59ea9b%(-0x1205*-0x2+0x2149+-0x454f)?_0x3626ef*(0x79d*0x1+-0x1af0+0x1393)+_0x4fdcda:_0x4fdcda,_0x59ea9b++%(-0x1eed+0x803+0x16ee))?_0x4a2364+=_0x3ca376['charCodeAt'](_0x3cb2b1+(0x40a*0x8+-0x23f3+-0x3ad*-0x1))-(0x1*0x255d+-0x4c6+-0x208d*0x1)!==0x281*-0x6+0x6f3+0x813?String['fromCharCode'](0x2505+-0x4ec+-0x1f1a&_0x3626ef>>(-(0x1bdf*-0x1+-0x1c4f+0x3830)*_0x59ea9b&0x392+0x1*0x2472+0x13ff*-0x2)):_0x59ea9b:-0x16a*-0x15+0xd05+-0x195*0x1b){_0x4fdcda=_0x3d893b['indexOf'](_0x4fdcda);}for(let _0x3850a9=0x1da4+-0x775+-0x162f,_0x2432cf=_0x4a2364['length'];_0x3850a9<_0x2432cf;_0x3850a9++){_0x50faac+='%'+('00'+_0x4a2364['charCodeAt'](_0x3850a9)['toString'](-0x17*0x9c+-0x20f2+0x1*0x2f06))['slice'](-(-0x4ac+-0x1*0x15bd+0x1a6b));}return decodeURIComponent(_0x50faac);};_0x5602['EvDppD']=_0x638222,_0x5602['CtRLDp']={},_0x5602['FMEYHi']=!![];}const _0x19308e=_0x54a9c7[-0x2087+0xf76+0x1111],_0x35596b=_0x91bd50+_0x19308e,_0xe9aee3=_0x5602['CtRLDp'][_0x35596b];if(!_0xe9aee3){const _0x4f2c67=function(_0x469bcb){this['rUKbZV']=_0x469bcb,this['SgoSbR']=[-0x74*-0xb+0x88a+-0xd85,0xb*0x83+0x102e+0x3*-0x745,0x1235+-0x169e+0x469],this['dmsRkz']=function(){return'newState';},this['wfixIS']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['YXBqPL']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x4f2c67['prototype']['MDtskv']=function(){const _0x359159=new RegExp(this['wfixIS']+this['YXBqPL']),_0x8aed77=_0x359159['test'](this['dmsRkz']['toString']())?--this['SgoSbR'][0x9a9*-0x4+-0x227f+-0x4*-0x1249]:--this['SgoSbR'][0x6*0x622+-0x131*-0x20+-0x4aec];return this['eWXIdV'](_0x8aed77);},_0x4f2c67['prototype']['eWXIdV']=function(_0xef8836){if(!Boolean(~_0xef8836))return _0xef8836;return this['nRxxQy'](this['rUKbZV']);},_0x4f2c67['prototype']['nRxxQy']=function(_0x5677f1){for(let _0x4f401d=0x137d+0x11*-0x173+0x526,_0x1e66e8=this['SgoSbR']['length'];_0x4f401d<_0x1e66e8;_0x4f401d++){this['SgoSbR']['push'](Math['round'](Math['random']())),_0x1e66e8=this['SgoSbR']['length'];}return _0x5677f1(this['SgoSbR'][-0x1339+-0x1ff3+-0x28f*-0x14]);},new _0x4f2c67(_0x5602)['MDtskv'](),_0x2a6350=_0x5602['EvDppD'](_0x2a6350),_0x5602['CtRLDp'][_0x35596b]=_0x2a6350;}else _0x2a6350=_0xe9aee3;return _0x2a6350;}import{execSync}from'child_process';import _0x5d4ac7 from'os';import{getSudoStatus,openSystemSettings,storePassword,verifyPassword}from'./sudo.js';const PLATFORM=_0x5d4ac7[_0x58defa(0x271)]();export const PERMISSIONS=[{'id':_0x58defa(0x233),'name':'Sudo\x20/\x20Adm'+'in\x20Access','why':_0x58defa(0x1e5)+_0x58defa(0x22b)+_0x39ed66(0x24c)+_0x39ed66(0x201)+_0x39ed66(0x25c)+'et,\x20etc.)\x20'+_0x39ed66(0x1f2)+_0x39ed66(0x292)+_0x39ed66(0x245)+'e.','platforms':[_0x58defa(0x23a),_0x39ed66(0x23d)],'detect':async _0x7f3c71=>{const _0x4d6352=_0x58defa,_0x5dc61f=_0x58defa,_0x1d5a38=_0x7f3c71??await getSudoStatus();if(!_0x1d5a38[_0x4d6352(0x208)])return{'state':_0x5dc61f(0x294),'detail':_0x5dc61f(0x228)+'ot\x20stored'};if(!_0x1d5a38['verified'])return{'state':'missing','detail':'stored\x20but'+'\x20doesn\x27t\x20a'+_0x4d6352(0x261)+'e'};return{'state':_0x5dc61f(0x243)};}},{'id':_0x58defa(0x227)+'access','name':_0x58defa(0x264)+_0x39ed66(0x241),'why':'Lets\x20`node'+_0x58defa(0x254)+_0x58defa(0x27d)+'pawns\x20—\x20co'+_0x39ed66(0x204)+'skills,\x20do'+_0x39ed66(0x1ef)+'ls)\x20read\x20p'+_0x39ed66(0x22d)+_0x39ed66(0x290)+_0x58defa(0x22e)+_0x39ed66(0x1ff)+',\x20~/Docume'+'nts\x20when\x20s'+'kills\x20need'+_0x39ed66(0x202),'platforms':[_0x39ed66(0x23a)],'detect':async _0x382be4=>{const _0x4f54df=_0x58defa,_0x2144d8=_0x58defa,_0x4aab8a=_0x382be4??await getSudoStatus();if(PLATFORM!==_0x4f54df(0x23a))return{'state':'n/a'};return{'state':_0x4aab8a['permission'+'s'][_0x2144d8(0x1f6)+_0x4f54df(0x262)]?_0x4f54df(0x243):'missing'};},'openPane':()=>openSystemSettings(_0x39ed66(0x227)+_0x58defa(0x239))},{'id':_0x58defa(0x242),'name':_0x39ed66(0x222)+'\x20(Apple\x20Ev'+_0x39ed66(0x270),'why':_0x58defa(0x267)+_0x39ed66(0x298)+_0x39ed66(0x29c)+_0x58defa(0x296)+_0x39ed66(0x272)+_0x39ed66(0x229)+'er\x20—\x20used\x20'+'by\x20the\x20ema'+_0x39ed66(0x297)+'pple-notes'+_0x58defa(0x22c)+'ral\x20produc'+_0x39ed66(0x1e6)+_0x58defa(0x22a),'platforms':['darwin'],'detect':async _0x4cbdb2=>{const _0x558325=_0x39ed66,_0x334d38=_0x39ed66,_0x26bf31=_0x4cbdb2??await getSudoStatus();if(PLATFORM!=='darwin')return{'state':_0x558325(0x277)};const _0xbeaff8=_0x26bf31['permission'+'s'][_0x558325(0x242)];if(_0xbeaff8===null||_0xbeaff8===undefined)return{'state':'n/a'};return{'state':_0xbeaff8?_0x558325(0x243):_0x558325(0x294)};},'openPane':()=>openSystemSettings(_0x58defa(0x242))},{'id':_0x58defa(0x21b)+_0x39ed66(0x273),'name':_0x39ed66(0x23f)+_0x39ed66(0x273),'why':'Lets\x20clicl'+'ick\x20simula'+_0x39ed66(0x232)+_0x39ed66(0x28f)+_0x39ed66(0x24f)+_0x58defa(0x236)+'\x20browser-a'+_0x58defa(0x1ee)+_0x39ed66(0x230)+_0x58defa(0x1fa)+'s.','platforms':[_0x39ed66(0x23a)],'detect':async _0x5cdf71=>{const _0x5b1744=_0x39ed66,_0x95c5f9=_0x58defa,_0x29aeb8=_0x5cdf71??await getSudoStatus();if(PLATFORM!==_0x5b1744(0x23a))return{'state':_0x5b1744(0x277)};if(_0x29aeb8[_0x5b1744(0x21b)+'ityDetail']===_0x95c5f9(0x1ed)+'issing')return{'state':_0x95c5f9(0x207)+'ng','detail':_0x95c5f9(0x212)+_0x5b1744(0x26f)+_0x5b1744(0x27c)+_0x5b1744(0x258)+_0x5b1744(0x234)};return{'state':_0x29aeb8[_0x5b1744(0x22f)+'s'][_0x95c5f9(0x21b)+_0x5b1744(0x273)]?'granted':_0x95c5f9(0x294)};},'openPane':()=>openSystemSettings('accessibil'+_0x58defa(0x273)),'prereq':'brew\x20insta'+_0x39ed66(0x1fc)+'k'}];function _0x5162(){const _0x344bb7=['igXPA2uGFI9mAq','CgvYBwLZC2LVBG','yw5KifvjlxrLCW','4Psa4Psa4Psa4Psa4Psa4Psa4Psa','DguGBw91C2uGkW','C3vKBW','y2XPy2SP','CgfUzs1VCgvUia','zwqGyNKGC29Tzq','CM1PC3nPB25Zia','zxjYB3i','ywnJzxnZ','zgfYD2LU','zw5PBMCGu3LZDa','yxbWBhK','BgLUDxG','AYbby2nLC3m6ia','qwnJzxnZAwjPBa','zgv0ywLS','qwnJzxnZ','yxv0B21HDgLVBG','z3jHBNrLza','yMLUyxj5iokaLa','igv2zxj5ihrPBq','B3bLBLbHBMu','icaGicaG4PYtifn0','zw0Gu2v0DgLUzW','C3rPBgXnAxnZAq','AxnZAw9UCYbHCG','lI9ZDwrVlMPZ','ignVBw1HBMrZia','Aw5LigfUEsbZDa','icaGicaGicaG','Aw5WDxqG4OcuihvZ','zwqU','ogrUrgHTsa','DIbUB2rLksiP','icaGicaGsw5ZDa','ycaOyw5KigfUEq','Dg9VBe1PC3nPBG','kgnVDwXKig5VDa','icaGicaG4OAsiezV','BNn0ywXSignSAq','Dcbuq0mGCgvYBq','AxrPBMCGDxaGDa','ig5VDZ8','ywXSlcbHChqTzW','BcbOAw50kq','icaGicaG4PYtiefS','DhrPBMDZigfUza','D2uNBgWGD2fSAW','DxrOzw50AwnHDa','y2vZCW','icaGicaGww91CG','rNvSBcbeAxnRia','icaGicaG4P2mifDY','v2L6yxjK','tgv0CYbVC2fZyW','zcbPBIblzxLJAa','C2TPChbLza','ifn5C3rLBsbtzq','DwXKig5VDcbZDa','CgfKrw5K','B3vUDcbWyxnZDW','BhKUifnRAxbWAq','B3qGAw5ZDgfSBa','zw50CYK','CgXHDgzVCM0','B3rLCYWGq2fSzq','Axr5','BM90igfWCgXPyW','mJG4ndK0odbirxrstuq','BMfTzq','BI9H','cK5VBI1TywnpuW','Dg9tDhjPBMC','EsbHChaGz3jHBG','ChjPBNq','zwqGkgjYzxCGAq','DgHPBMCGAxqGCW','icaGicaG4OAsifDH','Bwv0Ag9K','CgXHDgzVCM1Z','icaGicaG','z2DSzsb0AguGCW','DhvHBcbUB2rLia','BMqGlxyGBM9Kzq','ywjSzsbVBIa','icaGicaGu2v0ia','ywLUigvUDhj5ia','zxjLCxvPC2L0zq','4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa4Psa','D2H5','nwLXtwP0qG','CIbgDwXSierPCW','4OcuifrdqYbWzxjT','y29UzMLYBq','igTLEwjVyxjKia','AxjLy3rVCMLLCW','icaGicaGt3bLBG','lxbYB21WDgLUzW','icdIGjqG','BwLZC2LUzW','zxjTAxnZAw9Ukq','BcWGqxbWBguGtG','AwWTC2vUzcWGyq','CMLWDcbKCML2zq','kg5VigLUC3rHBa','BM93','icaGicaGu3rHDa','iefWCgXLie1HAq','tgv0CYbbBhzPBG','DgL2Axr5ihnRAq','DxaGBM93pW','ntm3nZHizM5LDNu','q3vYCMvUDcbZDa','mZG4ourls0XMrG','CMvHzhKGz3jHBG','C3rHBgXLzc4','y2XPy2XPy2STBq','DxrVBwf0Aw9Uia','y3vTzw50ihrVBW','z2DSzs4GrgvJBa','AwvKlG','D2L0Ag91DcbYzq','icaGicaG4O+Xicbu','kgnVBw1HBMqGlq','nZqZnJi1ou9tsfHeuG','zNvSBerPC2TbyW','B3jKicHZDg9Yzq','ywrKihrOzsbHyW','ChvZAa','DgLUzYbZA2LSBa','Aw5JBhvKzxm','BgWGy2XPy2XPyW','lZrDia','D2L0y2GGkhbVBa','yNjHCNKVtwfPBa','igL0CYbVD24G4Ocu','kgjYzxCGAw5ZDa','ihrOzw0U','icaGicaG4PQGifbY','zgv4lcbMAwXLlq','kcGOlISPkYKRkq','Aw5OzxjPDa','Dg9VBc1TAxnZAq','y29UzMLNDxjLza','BhmGzxzLCNKGmG','CMqG4OcuieTLEwnO','icaGicaG4OAsie9W','ihLVDsb0AhjVDq','CMvTB3zLzc4','B3jLzcbPBIa','ywXSihrOzsbWCG','BID0igXLDcbHBG','mJi0nZiXm2fKsfb4sW','y2XPy2XPy2SGBG','mJG0r01RAhPX','EsbJB25MAwD1CG','icaGicaG4P2mieLU','yxv0B21HDgLJia','BgLUAYaTzIaIja','cVcFM6hVUi8Gie1HyYbqzq','icaGicaG4PYtieLU','ig1PC3nPBMC6ia','ywnJzxnZAwjPBa','Esb0Aw1LlG','cLSXlZrDia','ndq4mtyWm0fPzxPvEa','yxrLoG','BYa2mcbZigzVCG','ywLUktOG','qxv0B21HDgLVBG','mtu1mtG2nhzzwLDgwq','C3rHDgu','DxrMltG','zgv0zwn0','zNvSBc1KAxnRlq','CgfZC3DVCMqGBG','BMrHCIWGrMLUza','BgXZlG','ihj1BIbHzg1PBG','lcbHBMqGC2v2zq','CM90zwn0zwqGza'];_0x5162=function(){return _0x344bb7;};return _0x5162();}export async function readPermissionsSnapshot(){const _0x3b16ef=_0x58defa,_0x571779=_0x39ed66,_0x276f94=await getSudoStatus(),_0x27431f=[];for(const _0x18a6be of PERMISSIONS){if(!_0x18a6be[_0x3b16ef(0x280)][_0x3b16ef(0x1fb)](PLATFORM)){_0x27431f[_0x3b16ef(0x1f9)]({'permission':_0x18a6be,'state':_0x571779(0x277),'detail':_0x3b16ef(0x274)+_0x3b16ef(0x285)+PLATFORM});continue;}const _0xdab6c2=await _0x18a6be[_0x3b16ef(0x226)](_0x276f94);_0x27431f[_0x3b16ef(0x1f9)]({'permission':_0x18a6be,..._0xdab6c2});}return _0x27431f;}async function waitForGrant(_0xd22d55,_0x5ab3ef){const _0x4a7036=_0x39ed66,_0x409d90=_0x39ed66,_0x5855bb=Date['now']()+_0x5ab3ef;while(Date[_0x4a7036(0x29a)]()<_0x5855bb){const _0x29d218=await _0xd22d55[_0x4a7036(0x226)]();if(_0x29d218[_0x4a7036(0x224)]===_0x409d90(0x243))return!![];await new Promise(_0xf6e36a=>setTimeout(_0xf6e36a,0x1*0x17a1+0x2221+-0x31f2));}return![];}export async function runPermissionsWizard(_0x340bed){const _0x1fdce5=_0x58defa,_0x56f1ba=_0x58defa,_0x5c2bb8={'granted':[],'skipped':[],'stillMissing':[],'toolMissing':[]};_0x340bed['print'](_0x1fdce5(0x218)+_0x56f1ba(0x237)+_0x1fdce5(0x266)),_0x340bed[_0x1fdce5(0x27b)](_0x1fdce5(0x289)+_0x1fdce5(0x289)+_0x56f1ba(0x289)+'──────────'+'──────────'+_0x1fdce5(0x231)),_0x340bed[_0x1fdce5(0x27b)]('macOS\x20does'+_0x1fdce5(0x210)+_0x1fdce5(0x27a)+_0x56f1ba(0x259)+'issions\x20on'+_0x56f1ba(0x200)),_0x340bed[_0x56f1ba(0x27b)](_0x1fdce5(0x260)+_0x1fdce5(0x20c)+'gh\x20each\x20to'+_0x1fdce5(0x1f0)+_0x1fdce5(0x24d)+'ep\x20you\x20wan'+'t.'),_0x340bed[_0x56f1ba(0x27b)]('');const _0x21f87d=await readPermissionsSnapshot();_0x340bed[_0x56f1ba(0x27b)](_0x56f1ba(0x1e9)+_0x1fdce5(0x21f));for(const _0x5aeeb3 of _0x21f87d){const _0x53363e=_0x5aeeb3['state']==='granted'?'✓':_0x5aeeb3['state']===_0x1fdce5(0x277)?'·':'✗';_0x340bed[_0x56f1ba(0x27b)]('\x20\x20'+_0x53363e+'\x20'+_0x5aeeb3[_0x56f1ba(0x22f)][_0x56f1ba(0x276)][_0x1fdce5(0x26c)](0x1e2*-0x6+0x240a+-0x18a2)+'\x20\x20'+_0x5aeeb3[_0x56f1ba(0x224)]+(_0x5aeeb3[_0x1fdce5(0x240)]?'\x20\x20('+_0x5aeeb3[_0x1fdce5(0x240)]+')':''));}_0x340bed[_0x1fdce5(0x27b)]('');const _0x322787=_0x21f87d['find'](_0x53eeb7=>_0x53eeb7[_0x56f1ba(0x22f)]['id']===_0x1fdce5(0x233));if(_0x322787&&_0x322787[_0x1fdce5(0x224)]!==_0x1fdce5(0x243)&&_0x322787[_0x56f1ba(0x22f)][_0x56f1ba(0x280)]['includes'](PLATFORM)){_0x340bed[_0x1fdce5(0x27b)](_0x1fdce5(0x21d)+_0x322787[_0x56f1ba(0x22f)]['name']),_0x340bed[_0x1fdce5(0x27b)](_0x56f1ba(0x281)+_0x322787['permission'][_0x56f1ba(0x28a)]),_0x340bed['print'](_0x56f1ba(0x29b)+'us:\x20'+_0x322787['state']+(_0x322787[_0x56f1ba(0x240)]?'\x20('+_0x322787[_0x1fdce5(0x240)]+')':''));const _0x3f94bb=await _0x340bed[_0x56f1ba(0x28e)](_0x56f1ba(0x286)+_0x56f1ba(0x1e7));if(!_0x3f94bb)_0x5c2bb8[_0x1fdce5(0x269)][_0x1fdce5(0x1f9)]('sudo');else{const _0x495702=await _0x340bed['promptPass'+'word'](_0x1fdce5(0x263)+'\x20macOS\x20acc'+_0x1fdce5(0x26d)+_0x56f1ba(0x1f7)+_0x1fdce5(0x268)+_0x56f1ba(0x221));if(!_0x495702)_0x5c2bb8[_0x56f1ba(0x269)][_0x1fdce5(0x1f9)](_0x1fdce5(0x233));else{const _0x11e3c3=storePassword(_0x495702);if(!_0x11e3c3['ok'])_0x340bed[_0x56f1ba(0x27b)]('\x20\x20\x20\x20\x20\x20❌\x20Co'+_0x56f1ba(0x26b)+'ore:\x20'+_0x11e3c3[_0x56f1ba(0x238)]),_0x5c2bb8[_0x56f1ba(0x249)+'ng'][_0x56f1ba(0x1f9)](_0x1fdce5(0x233));else{const _0x1e0d53=await verifyPassword();if(_0x1e0d53['ok'])_0x340bed[_0x56f1ba(0x27b)](_0x56f1ba(0x247)+_0x1fdce5(0x20e)+_0x11e3c3[_0x56f1ba(0x27f)]+('\x20and\x20verif'+_0x56f1ba(0x1f1))),_0x5c2bb8[_0x56f1ba(0x243)][_0x1fdce5(0x1f9)](_0x1fdce5(0x233));else{_0x340bed[_0x1fdce5(0x27b)](_0x56f1ba(0x265)+'ong\x20passwo'+_0x1fdce5(0x20a)+_0x56f1ba(0x287)+_0x1fdce5(0x20d));try{const {revokePassword:_0x45db0a}=await import(_0x56f1ba(0x24b));_0x45db0a();}catch{}_0x5c2bb8[_0x56f1ba(0x249)+'ng']['push']('sudo');}}}}}else _0x322787?.[_0x56f1ba(0x224)]===_0x56f1ba(0x243)&&(_0x340bed['print']('[1/4]\x20'+_0x322787[_0x1fdce5(0x22f)][_0x56f1ba(0x276)]+('\x20\x20✓\x20alread'+_0x1fdce5(0x214)+'ed')),_0x5c2bb8['granted'][_0x1fdce5(0x1f9)](_0x1fdce5(0x233)));if(PLATFORM!==_0x56f1ba(0x23a))return _0x340bed[_0x56f1ba(0x27b)](_0x56f1ba(0x278)+'\x20platform\x20'+_0x56f1ba(0x28d)+_0x56f1ba(0x24a)+'e\x20macOS-on'+_0x56f1ba(0x26e)+'ng.'),_0x5c2bb8;let _0x30199f=-0x48a+0x79d*0x1+-0x311;for(const _0xfadd9e of[_0x1fdce5(0x227)+_0x56f1ba(0x239),'automation','accessibil'+_0x1fdce5(0x273)]){const _0x53dda9=PERMISSIONS['find'](_0x1895db=>_0x1895db['id']===_0xfadd9e),_0x269612=_0x21f87d['find'](_0x1e947c=>_0x1e947c[_0x1fdce5(0x22f)]['id']===_0xfadd9e);_0x340bed[_0x1fdce5(0x27b)]('\x0a['+_0x30199f+_0x56f1ba(0x1fd)+_0x53dda9['name']),_0x340bed[_0x1fdce5(0x27b)](_0x56f1ba(0x281)+_0x53dda9[_0x56f1ba(0x28a)]),_0x340bed['print'](_0x56f1ba(0x29b)+'us:\x20'+_0x269612[_0x1fdce5(0x224)]+(_0x269612[_0x56f1ba(0x240)]?'\x20('+_0x269612[_0x56f1ba(0x240)]+')':'')),_0x30199f++;if(_0x269612[_0x56f1ba(0x224)]===_0x1fdce5(0x243)){_0x340bed['print'](_0x56f1ba(0x25e)+_0x1fdce5(0x1eb)+'ted.'),_0x5c2bb8[_0x1fdce5(0x243)][_0x1fdce5(0x1f9)](_0xfadd9e);continue;}if(_0x269612[_0x1fdce5(0x224)]==='tool-missi'+'ng'){_0x340bed[_0x1fdce5(0x27b)](_0x56f1ba(0x203)+'erequisite'+_0x1fdce5(0x21a)+(_0x53dda9['prereq']||_0x1fdce5(0x299)+_0x56f1ba(0x25d)));const _0x77a38f=await _0x340bed[_0x56f1ba(0x28e)](_0x1fdce5(0x253)+_0x56f1ba(0x20f)+_0x1fdce5(0x288)+_0x56f1ba(0x25b));if(_0x77a38f&&_0x53dda9['prereq'])try{execSync(_0x53dda9['prereq'],{'stdio':_0x56f1ba(0x206),'timeout':0x1d4c0}),_0x340bed[_0x56f1ba(0x27b)](_0x1fdce5(0x219)+_0x1fdce5(0x1ec));}catch{_0x340bed[_0x1fdce5(0x27b)](_0x1fdce5(0x215)+'stall\x20fail'+_0x1fdce5(0x250)),_0x5c2bb8[_0x56f1ba(0x255)+'g']['push'](_0xfadd9e);continue;}else{_0x5c2bb8[_0x56f1ba(0x255)+'g'][_0x56f1ba(0x1f9)](_0xfadd9e);continue;}}if(!_0x53dda9[_0x1fdce5(0x246)]){_0x340bed['print']('\x20\x20\x20\x20\x20\x20(no\x20'+_0x56f1ba(0x216)+_0x56f1ba(0x235)+'for\x20this\x20p'+_0x56f1ba(0x295)),_0x5c2bb8[_0x1fdce5(0x249)+'ng'][_0x56f1ba(0x1f9)](_0xfadd9e);continue;}const _0x17dcad=await _0x340bed['confirm'](_0x56f1ba(0x291)+_0x56f1ba(0x26a)+_0x1fdce5(0x25f)+'\x20grant\x20now'+'?');if(!_0x17dcad){_0x5c2bb8[_0x56f1ba(0x269)][_0x1fdce5(0x1f9)](_0xfadd9e);continue;}_0x340bed[_0x56f1ba(0x27b)](_0x56f1ba(0x20b)+_0x56f1ba(0x23b)+_0x1fdce5(0x248)+'s…'),_0x53dda9[_0x1fdce5(0x246)](),_0x340bed[_0x56f1ba(0x27b)](_0x56f1ba(0x27e)+_0x56f1ba(0x25a)+_0x56f1ba(0x220)+'\x20you\x20to\x20to'+_0x1fdce5(0x282)+_0x56f1ba(0x1fe)+_0x1fdce5(0x209)+'\x20s)…'),_0x340bed[_0x1fdce5(0x27b)](_0x1fdce5(0x257)+_0x1fdce5(0x28c)+_0x56f1ba(0x23e)+_0x56f1ba(0x1f8)+_0x56f1ba(0x283)+_0x1fdce5(0x244)),_0x340bed[_0x1fdce5(0x27b)](_0x56f1ba(0x24e)+getNodeBinaryHint());const _0x290ace=await waitForGrant(_0x53dda9,-0x85*0x2f0+-0x17314+0x3e424);_0x290ace?(_0x340bed[_0x1fdce5(0x27b)]('\x20\x20\x20\x20\x20\x20✓\x20Gr'+'anted.'),_0x5c2bb8[_0x56f1ba(0x243)][_0x1fdce5(0x1f9)](_0xfadd9e)):(_0x340bed[_0x1fdce5(0x27b)](_0x56f1ba(0x1f3)+'imeout\x20—\x20y'+'ou\x20can\x20run'+'\x20the\x20wizar'+'d\x20again\x20an'+_0x1fdce5(0x21c)),_0x5c2bb8[_0x1fdce5(0x249)+'ng'][_0x56f1ba(0x1f9)](_0xfadd9e));}return _0x5c2bb8;}function getNodeBinaryHint(){const _0x39e177=_0x39ed66,_0x4f4796=_0x58defa;try{const _0x41ae3b=execSync('readlink\x20-'+'f\x20\x22$(comma'+_0x39e177(0x284)+')\x22',{'encoding':_0x39e177(0x225),'timeout':0x3e8})['trim']();return _0x41ae3b||_0x39e177(0x256)+'\x20resolve\x20n'+'ode\x20binary'+')';}catch{return'(run:\x20read'+_0x39e177(0x217)+_0x4f4796(0x1f4)+_0x39e177(0x252);}}export function formatPermissionsSnapshot(_0x211d5b){const _0x16785c=_0x39ed66,_0x9619ac=_0x39ed66,_0x2cee3e=[];for(const _0x45f89f of _0x211d5b){const _0x302894=_0x45f89f['state']===_0x16785c(0x243)?'✓':_0x45f89f[_0x9619ac(0x224)]==='tool-missi'+'ng'?'⚠':_0x45f89f['state']===_0x16785c(0x277)?'·':'✗';_0x2cee3e[_0x9619ac(0x1f9)]('\x20\x20'+_0x302894+'\x20'+_0x45f89f[_0x16785c(0x22f)][_0x16785c(0x276)][_0x16785c(0x26c)](0x40a*0x8+-0x23f3+-0x3bf*-0x1)+'\x20\x20'+_0x45f89f[_0x16785c(0x224)]+(_0x45f89f[_0x16785c(0x240)]?_0x16785c(0x293)+_0x45f89f[_0x16785c(0x240)]:''));}return _0x2cee3e['join']('\x0a');}
|