alvin-bot 5.6.2 → 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.
Files changed (137) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +1 -1
  3. package/dist/claude.js +1 -102
  4. package/dist/config.js +1 -96
  5. package/dist/engine.js +1 -90
  6. package/dist/find-claude-binary.js +1 -98
  7. package/dist/handlers/async-agent-chunk-handler.js +1 -50
  8. package/dist/handlers/background-bypass.js +1 -75
  9. package/dist/handlers/commands.js +1 -2336
  10. package/dist/handlers/cron-progress.js +1 -52
  11. package/dist/handlers/document.js +1 -194
  12. package/dist/handlers/message.js +1 -959
  13. package/dist/handlers/photo.js +1 -154
  14. package/dist/handlers/platform-message.js +1 -360
  15. package/dist/handlers/stuck-timer.js +1 -54
  16. package/dist/handlers/video.js +1 -237
  17. package/dist/handlers/voice.js +1 -148
  18. package/dist/i18n.js +1 -805
  19. package/dist/index.js +1 -697
  20. package/dist/init-data-dir.js +1 -98
  21. package/dist/middleware/auth.js +1 -233
  22. package/dist/migrate.js +1 -162
  23. package/dist/paths.js +1 -146
  24. package/dist/platforms/discord.js +1 -175
  25. package/dist/platforms/index.js +1 -130
  26. package/dist/platforms/signal.js +1 -205
  27. package/dist/platforms/slack-slash-parser.js +1 -32
  28. package/dist/platforms/slack.js +1 -501
  29. package/dist/platforms/telegram.js +1 -111
  30. package/dist/platforms/types.js +1 -8
  31. package/dist/platforms/whatsapp-auth-helpers.js +1 -53
  32. package/dist/platforms/whatsapp.js +1 -707
  33. package/dist/providers/claude-sdk-provider.js +1 -565
  34. package/dist/providers/codex-cli-provider.js +1 -134
  35. package/dist/providers/index.js +1 -7
  36. package/dist/providers/ollama-provider.js +1 -32
  37. package/dist/providers/openai-compatible.js +1 -406
  38. package/dist/providers/registry.js +1 -352
  39. package/dist/providers/runtime-header.js +1 -45
  40. package/dist/providers/tool-executor.js +1 -475
  41. package/dist/providers/types.js +1 -227
  42. package/dist/services/access.js +1 -144
  43. package/dist/services/allowed-users-gate.js +1 -56
  44. package/dist/services/alvin-dispatch.js +1 -130
  45. package/dist/services/alvin-mcp-tools.js +1 -104
  46. package/dist/services/asset-index.js +1 -224
  47. package/dist/services/async-agent-parser.js +1 -418
  48. package/dist/services/async-agent-watcher.js +1 -443
  49. package/dist/services/auto-diagnostic.js +1 -228
  50. package/dist/services/broadcast.js +1 -52
  51. package/dist/services/browser-manager.js +1 -562
  52. package/dist/services/browser-webfetch.js +1 -127
  53. package/dist/services/browser.js +1 -121
  54. package/dist/services/cdp-bootstrap.js +1 -357
  55. package/dist/services/compaction.js +1 -144
  56. package/dist/services/critical-notify.js +1 -203
  57. package/dist/services/cron-resolver.js +1 -58
  58. package/dist/services/cron-scheduling.js +1 -310
  59. package/dist/services/cron.js +1 -861
  60. package/dist/services/custom-tools.js +1 -317
  61. package/dist/services/delivery-queue.js +1 -173
  62. package/dist/services/delivery-registry.js +1 -21
  63. package/dist/services/disk-cleanup.js +1 -203
  64. package/dist/services/elevenlabs.js +1 -58
  65. package/dist/services/embeddings/auto-detect.js +1 -74
  66. package/dist/services/embeddings/fts5.js +1 -108
  67. package/dist/services/embeddings/gemini.js +1 -65
  68. package/dist/services/embeddings/index.js +1 -496
  69. package/dist/services/embeddings/ollama.js +1 -78
  70. package/dist/services/embeddings/openai.js +1 -49
  71. package/dist/services/embeddings/provider.js +1 -22
  72. package/dist/services/embeddings/vector-base.js +1 -113
  73. package/dist/services/embeddings-migration.js +1 -193
  74. package/dist/services/embeddings.js +1 -9
  75. package/dist/services/env-file.js +1 -50
  76. package/dist/services/exec-guard.js +1 -71
  77. package/dist/services/fallback-order.js +1 -154
  78. package/dist/services/file-permissions.js +1 -93
  79. package/dist/services/heartbeat-file.js +1 -65
  80. package/dist/services/heartbeat.js +1 -313
  81. package/dist/services/hooks.js +1 -44
  82. package/dist/services/imagegen.js +1 -72
  83. package/dist/services/language-detect.js +1 -154
  84. package/dist/services/markdown.js +1 -63
  85. package/dist/services/mcp.js +1 -263
  86. package/dist/services/memory-extractor.js +1 -178
  87. package/dist/services/memory-inject-mode.js +1 -43
  88. package/dist/services/memory-layers.js +1 -156
  89. package/dist/services/memory.js +1 -146
  90. package/dist/services/ollama-manager.js +1 -339
  91. package/dist/services/permissions-wizard.js +1 -291
  92. package/dist/services/personality.js +1 -376
  93. package/dist/services/plugins.js +1 -171
  94. package/dist/services/preflight.js +1 -292
  95. package/dist/services/process-manager.js +1 -291
  96. package/dist/services/release-highlights.js +1 -79
  97. package/dist/services/reminders.js +1 -97
  98. package/dist/services/restart.js +1 -48
  99. package/dist/services/security-audit.js +1 -74
  100. package/dist/services/self-diagnosis.js +1 -272
  101. package/dist/services/self-search.js +1 -129
  102. package/dist/services/session-persistence.js +1 -237
  103. package/dist/services/session.js +1 -282
  104. package/dist/services/skills.js +1 -290
  105. package/dist/services/ssrf-guard.js +1 -162
  106. package/dist/services/standing-orders.js +1 -29
  107. package/dist/services/steer-channel.js +1 -46
  108. package/dist/services/stop-controller.js +1 -52
  109. package/dist/services/subagent-dedup.js +1 -0
  110. package/dist/services/subagent-delivery.js +1 -452
  111. package/dist/services/subagent-stats.js +1 -123
  112. package/dist/services/subagents.js +1 -814
  113. package/dist/services/sudo.js +1 -329
  114. package/dist/services/telegram.js +1 -158
  115. package/dist/services/timing-safe-bearer.js +1 -51
  116. package/dist/services/tool-discovery.js +1 -214
  117. package/dist/services/trends.js +1 -580
  118. package/dist/services/updater.js +1 -291
  119. package/dist/services/usage-tracker.js +1 -144
  120. package/dist/services/users.js +1 -271
  121. package/dist/services/voice.js +1 -104
  122. package/dist/services/watchdog-brake.js +1 -154
  123. package/dist/services/watchdog.js +1 -311
  124. package/dist/services/workspaces.js +1 -276
  125. package/dist/tui/index.js +1 -667
  126. package/dist/util/console-formatter.js +1 -109
  127. package/dist/util/debounce.js +1 -24
  128. package/dist/util/telegram-error-filter.js +1 -62
  129. package/dist/version.js +1 -24
  130. package/dist/web/bind-strategy.js +1 -42
  131. package/dist/web/canvas.js +1 -30
  132. package/dist/web/doctor-api.js +1 -604
  133. package/dist/web/openai-compat.js +1 -252
  134. package/dist/web/server.js +1 -1831
  135. package/dist/web/setup-api.js +1 -1101
  136. package/package.json +5 -2
  137. 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');}