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