perplexity-user-mcp 0.8.37 → 0.8.39
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/README.md +203 -9
- package/dist/checks/vault.d.ts +41 -0
- package/dist/checks/vault.mjs +23 -0
- package/dist/{chunk-Q2VY4R5F.mjs → chunk-2FPGJKCA.mjs} +2 -2
- package/dist/{chunk-ZQFUZPLO.mjs → chunk-452DK6OS.mjs} +2 -2
- package/dist/{chunk-OF4DMAPJ.mjs → chunk-B65IJQZJ.mjs} +1 -1
- package/dist/{chunk-H4BUAPPO.mjs → chunk-C3HPFFTD.mjs} +4 -4
- package/dist/{chunk-LZPLNZ5U.mjs → chunk-D254EFYB.mjs} +1 -1
- package/dist/{chunk-Z7DAACGZ.mjs → chunk-DQQISMYN.mjs} +2 -2
- package/dist/{chunk-3B276PGG.mjs → chunk-FKQ3HP4Q.mjs} +1 -1
- package/dist/{chunk-7JL36EBH.mjs → chunk-HNSPNCFH.mjs} +1 -1
- package/dist/{chunk-6EP2BLTV.mjs → chunk-KJFX2ZXR.mjs} +1 -1
- package/dist/{chunk-SVPRB62V.mjs → chunk-NJX4RBO6.mjs} +1 -1
- package/dist/{chunk-X45O6YD3.mjs → chunk-RK4EBZJ3.mjs} +28 -9
- package/dist/{chunk-TQLCLE4L.mjs → chunk-S677V2JU.mjs} +57 -12
- package/dist/{chunk-S5VD7WTU.mjs → chunk-T6ARJK2P.mjs} +6 -6
- package/dist/{chunk-HTUAQRKH.mjs → chunk-TDXETAQT.mjs} +1 -1
- package/dist/{chunk-LKJMLGFP.mjs → chunk-U7QPUNRH.mjs} +2 -2
- package/dist/{chunk-PE23RMXY.mjs → chunk-V4U3JM4R.mjs} +1 -1
- package/dist/chunk-WDIW33DA.mjs +77 -0
- package/dist/{chunk-KCXM2M4B.mjs → chunk-XTRJSV72.mjs} +1 -1
- package/dist/cli.d.ts +348 -2
- package/dist/cli.mjs +259 -3
- package/dist/client.mjs +6 -6
- package/dist/cloud-sync.mjs +8 -8
- package/dist/config.mjs +3 -3
- package/dist/daemon/attach.mjs +17 -17
- package/dist/daemon/audit.mjs +2 -2
- package/dist/daemon/client-http.mjs +17 -17
- package/dist/daemon/index.mjs +18 -18
- package/dist/daemon/install-tunnel.mjs +2 -2
- package/dist/daemon/launcher.mjs +16 -16
- package/dist/daemon/lockfile.mjs +2 -2
- package/dist/daemon/server.mjs +11 -11
- package/dist/daemon/token.mjs +2 -2
- package/dist/daemon/tunnel-providers/index.mjs +3 -3
- package/dist/doctor.mjs +2 -2
- package/dist/export.mjs +4 -4
- package/dist/health-check.d.ts +1 -1
- package/dist/health-check.mjs +3 -3
- package/dist/history-store.mjs +2 -2
- package/dist/impit-login-runner.d.ts +1 -1
- package/dist/impit-login-runner.mjs +4 -4
- package/dist/index.d.ts +5 -1
- package/dist/index.mjs +96 -24
- package/dist/login-runner.d.ts +1 -1
- package/dist/login-runner.mjs +3 -3
- package/dist/logout.d.ts +1 -1
- package/dist/logout.mjs +2 -2
- package/dist/manual-login-runner.d.ts +1 -1
- package/dist/manual-login-runner.mjs +3 -3
- package/dist/{native-deps-YNKXITRY.mjs → native-deps-IE4B55EL.mjs} +4 -4
- package/dist/profiles.mjs +1 -1
- package/dist/refresh.mjs +4 -4
- package/dist/reinit-watcher.d.ts +12 -1
- package/dist/reinit-watcher.mjs +4 -2
- package/dist/vault.d-BSJWDLhp.d.ts +37 -0
- package/dist/vault.mjs +4 -2
- package/dist/viewers.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-U3DGFLXZ.mjs +0 -43
- package/dist/vault.d-BtRSLZiM.d.ts +0 -8
- /package/dist/{chunk-XKSWCEGI.mjs → chunk-HJIXH6CL.mjs} +0 -0
package/dist/cli.mjs
CHANGED
|
@@ -63,6 +63,7 @@ var KNOWN_COMMANDS = /* @__PURE__ */ new Set([
|
|
|
63
63
|
"status",
|
|
64
64
|
"doctor",
|
|
65
65
|
"install-browser",
|
|
66
|
+
"setup-vault",
|
|
66
67
|
"install-speed-boost",
|
|
67
68
|
"uninstall-speed-boost",
|
|
68
69
|
"speed-boost-status",
|
|
@@ -97,6 +98,215 @@ function normalizeExportFormat(value) {
|
|
|
97
98
|
if (value === "markdown" || value === "pdf" || value === "docx") return value;
|
|
98
99
|
return null;
|
|
99
100
|
}
|
|
101
|
+
async function probeVaultState({ profile } = {}) {
|
|
102
|
+
let keychainAvailable = false;
|
|
103
|
+
let keychainHasKey = false;
|
|
104
|
+
try {
|
|
105
|
+
const mod = await import("keytar");
|
|
106
|
+
const keytar = mod.default ?? mod;
|
|
107
|
+
if (keytar && typeof keytar.getPassword === "function") {
|
|
108
|
+
keychainAvailable = true;
|
|
109
|
+
try {
|
|
110
|
+
const hex = await keytar.getPassword("perplexity-user-mcp", "vault-master-key");
|
|
111
|
+
keychainHasKey = !!hex;
|
|
112
|
+
} catch {
|
|
113
|
+
keychainHasKey = false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
} catch {
|
|
117
|
+
keychainAvailable = false;
|
|
118
|
+
}
|
|
119
|
+
const envPassphraseSet = !!process.env.PERPLEXITY_VAULT_PASSPHRASE;
|
|
120
|
+
const hasTty = process.stdin?.isTTY === true && process.env.PERPLEXITY_MCP_STDIO !== "1";
|
|
121
|
+
let vaultExists = false;
|
|
122
|
+
let vaultDecryptsOk = null;
|
|
123
|
+
let decryptError = null;
|
|
124
|
+
if (profile) {
|
|
125
|
+
try {
|
|
126
|
+
const { getProfilePaths } = await import("./profiles.mjs");
|
|
127
|
+
const { existsSync: existsSync2 } = await import("fs");
|
|
128
|
+
vaultExists = existsSync2(getProfilePaths(profile).vault);
|
|
129
|
+
if (vaultExists && (keychainAvailable || envPassphraseSet)) {
|
|
130
|
+
const { Vault, __resetKeyCache } = await import("./vault.mjs");
|
|
131
|
+
__resetKeyCache();
|
|
132
|
+
try {
|
|
133
|
+
await new Vault().get(profile, "cookies");
|
|
134
|
+
vaultDecryptsOk = true;
|
|
135
|
+
} catch (err) {
|
|
136
|
+
vaultDecryptsOk = false;
|
|
137
|
+
decryptError = err instanceof Error ? err.message : String(err);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
} catch (err) {
|
|
141
|
+
decryptError = err instanceof Error ? err.message : String(err);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
platform: process.platform,
|
|
146
|
+
keychainAvailable,
|
|
147
|
+
keychainHasKey,
|
|
148
|
+
envPassphraseSet,
|
|
149
|
+
hasTty,
|
|
150
|
+
vaultExists,
|
|
151
|
+
vaultDecryptsOk,
|
|
152
|
+
decryptError
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async function checkVaultUnseal() {
|
|
156
|
+
const state = await probeVaultState();
|
|
157
|
+
if (state.keychainAvailable || state.envPassphraseSet || state.hasTty) {
|
|
158
|
+
return {
|
|
159
|
+
ok: true,
|
|
160
|
+
hasKeychain: state.keychainAvailable,
|
|
161
|
+
envPass: state.envPassphraseSet,
|
|
162
|
+
hasTty: state.hasTty
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const isLinux = state.platform === "linux";
|
|
166
|
+
const isMac = state.platform === "darwin";
|
|
167
|
+
const isWin = state.platform === "win32";
|
|
168
|
+
const hint = isLinux ? "Install libsecret + gnome-keyring (Debian/Ubuntu: `sudo apt install libsecret-1-0 gnome-keyring`; Fedora: `sudo dnf install libsecret gnome-keyring`), OR run `npx perplexity-user-mcp setup-vault` to generate a passphrase and get persistence snippets for your shell / MCP-client config." : isMac ? "Keychain Access should be available on macOS \u2014 keytar usually loads here. If you still see this, run `npx perplexity-user-mcp setup-vault` for a generated passphrase + persistence snippets." : isWin ? "Credential Manager is always available on Windows \u2014 keytar usually loads here. If you still see this, run `npx perplexity-user-mcp setup-vault` for a generated passphrase + persistence snippets." : "Run `npx perplexity-user-mcp setup-vault` for a generated passphrase + persistence snippets.";
|
|
169
|
+
return {
|
|
170
|
+
ok: false,
|
|
171
|
+
hasKeychain: false,
|
|
172
|
+
envPass: false,
|
|
173
|
+
hasTty: false,
|
|
174
|
+
reason: "no_unseal_material",
|
|
175
|
+
hint
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
async function generatePassphrase() {
|
|
179
|
+
const { randomBytes } = await import("crypto");
|
|
180
|
+
return randomBytes(32).toString("base64url");
|
|
181
|
+
}
|
|
182
|
+
function buildPersistenceSnippets(passphrase) {
|
|
183
|
+
const platform = process.platform;
|
|
184
|
+
const snippets = [];
|
|
185
|
+
snippets.push({
|
|
186
|
+
title: "MCP client env block (preferred \u2014 scoped to one client only)",
|
|
187
|
+
detail: "Edit your MCP client's config (Cursor: ~/.cursor/mcp.json, Claude Desktop: claude_desktop_config.json, Codex CLI: ~/.codex/config.toml, etc.). Add an `env` field next to `command`/`args`:",
|
|
188
|
+
code: `{
|
|
189
|
+
"mcpServers": {
|
|
190
|
+
"Perplexity": {
|
|
191
|
+
"command": "npx",
|
|
192
|
+
"args": ["-y", "perplexity-user-mcp"],
|
|
193
|
+
"env": {
|
|
194
|
+
"PERPLEXITY_VAULT_PASSPHRASE": "${passphrase}"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}`
|
|
199
|
+
});
|
|
200
|
+
if (platform === "win32") {
|
|
201
|
+
snippets.push({
|
|
202
|
+
title: "Windows \u2014 PowerShell user environment (persistent)",
|
|
203
|
+
detail: "Sets the variable for your user account; persists across reboots. Open PowerShell and run:",
|
|
204
|
+
code: `[Environment]::SetEnvironmentVariable("PERPLEXITY_VAULT_PASSPHRASE", "${passphrase}", "User")`
|
|
205
|
+
});
|
|
206
|
+
snippets.push({
|
|
207
|
+
title: "Windows \u2014 cmd.exe (persistent)",
|
|
208
|
+
detail: "Equivalent for cmd.exe users:",
|
|
209
|
+
code: `setx PERPLEXITY_VAULT_PASSPHRASE "${passphrase}"`
|
|
210
|
+
});
|
|
211
|
+
} else if (platform === "darwin") {
|
|
212
|
+
snippets.push({
|
|
213
|
+
title: "macOS \u2014 zsh (default since Catalina)",
|
|
214
|
+
detail: "Append to ~/.zshrc and restart your terminal:",
|
|
215
|
+
code: `echo 'export PERPLEXITY_VAULT_PASSPHRASE='\\''${passphrase}'\\''' >> ~/.zshrc`
|
|
216
|
+
});
|
|
217
|
+
snippets.push({
|
|
218
|
+
title: "macOS \u2014 bash (legacy)",
|
|
219
|
+
detail: "If you use bash instead, append to ~/.bash_profile:",
|
|
220
|
+
code: `echo 'export PERPLEXITY_VAULT_PASSPHRASE='\\''${passphrase}'\\''' >> ~/.bash_profile`
|
|
221
|
+
});
|
|
222
|
+
} else {
|
|
223
|
+
snippets.push({
|
|
224
|
+
title: "Linux \u2014 bash",
|
|
225
|
+
detail: "Append to ~/.bashrc and restart your terminal (or `source ~/.bashrc`):",
|
|
226
|
+
code: `echo 'export PERPLEXITY_VAULT_PASSPHRASE='\\''${passphrase}'\\''' >> ~/.bashrc`
|
|
227
|
+
});
|
|
228
|
+
snippets.push({
|
|
229
|
+
title: "Linux \u2014 zsh",
|
|
230
|
+
detail: "If you use zsh, append to ~/.zshrc:",
|
|
231
|
+
code: `echo 'export PERPLEXITY_VAULT_PASSPHRASE='\\''${passphrase}'\\''' >> ~/.zshrc`
|
|
232
|
+
});
|
|
233
|
+
snippets.push({
|
|
234
|
+
title: "Linux \u2014 systemd unit (for daemon deployments)",
|
|
235
|
+
detail: "If you run perplexity-user-mcp as a systemd service, add to the [Service] block:",
|
|
236
|
+
code: `Environment=PERPLEXITY_VAULT_PASSPHRASE=${passphrase}`
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
return snippets;
|
|
240
|
+
}
|
|
241
|
+
function renderSetupVaultReport({ state, recommendation, passphrase, snippets }) {
|
|
242
|
+
const lines = [];
|
|
243
|
+
const tick = "\u2713";
|
|
244
|
+
const cross = "\u2717";
|
|
245
|
+
const warn = "!";
|
|
246
|
+
lines.push("Vault setup status:");
|
|
247
|
+
lines.push(` ${state.keychainAvailable ? tick : cross} OS keychain ${state.keychainAvailable ? "available" : "unavailable"}${state.keychainHasKey ? " (master key persisted)" : state.keychainAvailable ? " (no master key yet \u2014 will be generated on first login)" : ""}`);
|
|
248
|
+
lines.push(` ${state.envPassphraseSet ? tick : cross} PERPLEXITY_VAULT_PASSPHRASE ${state.envPassphraseSet ? "is set" : "is not set"}`);
|
|
249
|
+
if (state.vaultExists) {
|
|
250
|
+
if (state.vaultDecryptsOk === true) {
|
|
251
|
+
lines.push(` ${tick} vault.enc decrypts cleanly with the active unseal material`);
|
|
252
|
+
} else if (state.vaultDecryptsOk === false) {
|
|
253
|
+
lines.push(` ${cross} vault.enc cannot be decrypted \u2014 ${state.decryptError ?? "unknown error"}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (state.keychainAvailable && state.envPassphraseSet) {
|
|
257
|
+
lines.push(` ${warn} both keychain and env var are set \u2014 keychain wins at runtime; the env var is a fallback`);
|
|
258
|
+
}
|
|
259
|
+
lines.push("");
|
|
260
|
+
lines.push(`Recommendation: ${recommendation.message}`);
|
|
261
|
+
if (passphrase) {
|
|
262
|
+
lines.push("");
|
|
263
|
+
lines.push("Generated passphrase (256 bits, base64url):");
|
|
264
|
+
lines.push(` ${passphrase}`);
|
|
265
|
+
lines.push("");
|
|
266
|
+
lines.push("\u26A0 Save this somewhere safe \u2014 losing it means losing access to vaults written under it.");
|
|
267
|
+
lines.push("");
|
|
268
|
+
lines.push("Pick ONE persistence method below:");
|
|
269
|
+
snippets.forEach((s, i) => {
|
|
270
|
+
lines.push("");
|
|
271
|
+
lines.push(`${i + 1}. ${s.title}`);
|
|
272
|
+
if (s.detail) lines.push(` ${s.detail}`);
|
|
273
|
+
lines.push("");
|
|
274
|
+
const indent = " ";
|
|
275
|
+
lines.push(s.code.split("\n").map((l) => indent + l).join("\n"));
|
|
276
|
+
});
|
|
277
|
+
lines.push("");
|
|
278
|
+
lines.push("After applying ONE of those, run `npx perplexity-user-mcp doctor` to verify the unseal-verify check passes.");
|
|
279
|
+
}
|
|
280
|
+
return lines.join("\n");
|
|
281
|
+
}
|
|
282
|
+
function recommendVaultSetup(state) {
|
|
283
|
+
if (state.vaultExists && state.vaultDecryptsOk === false) {
|
|
284
|
+
return {
|
|
285
|
+
status: "decrypt_broken",
|
|
286
|
+
message: "Existing vault.enc cannot be decrypted with any available unseal material. The blob was likely written under a since-rotated keychain key or PERPLEXITY_VAULT_PASSPHRASE. Run `npx perplexity-user-mcp logout --purge --profile <name>` and log in again to write a fresh vault. (v0.8.40+ self-heals this on the next login by quarantining the bad blob.)",
|
|
287
|
+
generatePassphrase: false
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
if (state.keychainAvailable) {
|
|
291
|
+
return {
|
|
292
|
+
status: "ok_keychain",
|
|
293
|
+
message: state.keychainHasKey ? "OS keychain holds the master key \u2014 nothing to do." : "OS keychain is available; the master key will be generated and persisted there on your first login. Nothing to do.",
|
|
294
|
+
generatePassphrase: false
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
if (state.envPassphraseSet) {
|
|
298
|
+
return {
|
|
299
|
+
status: "ok_envvar",
|
|
300
|
+
message: "PERPLEXITY_VAULT_PASSPHRASE is set; the vault will use it. (For better UX, install an OS keychain so the env var becomes optional \u2014 see https://github.com/Automations-Project/VSCode-Perplexity-MCP for platform docs.)",
|
|
301
|
+
generatePassphrase: false
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
return {
|
|
305
|
+
status: "setup_needed",
|
|
306
|
+
message: "No keychain available and no PERPLEXITY_VAULT_PASSPHRASE set. Generating a strong passphrase and showing persistence snippets below.",
|
|
307
|
+
generatePassphrase: true
|
|
308
|
+
};
|
|
309
|
+
}
|
|
100
310
|
async function openTarget(target) {
|
|
101
311
|
if (process.platform === "win32") {
|
|
102
312
|
const escaped = String(target).replace(/'/g, "''");
|
|
@@ -410,9 +620,40 @@ Config written to ${config.configPath}`;
|
|
|
410
620
|
const body = flags.json ? JSON.stringify({ ok: true, active, profiles }) : profiles.length === 0 ? "No profiles yet. Run `add-account` to create one." : profiles.map((p) => `${p.name === active ? "* " : " "}${p.name} [${p.tier ?? "?"}] mode=${p.loginMode ?? "?"} lastLogin=${p.lastLogin ?? "never"}`).join("\n");
|
|
411
621
|
return { code: 0, stdout: body + "\n", stderr: "" };
|
|
412
622
|
}
|
|
623
|
+
if (command === "setup-vault") {
|
|
624
|
+
const profile = flags.profile ?? (await import("./profiles.mjs")).getActiveName() ?? null;
|
|
625
|
+
const state = await probeVaultState({ profile });
|
|
626
|
+
const recommendation = recommendVaultSetup(state);
|
|
627
|
+
let passphrase = null;
|
|
628
|
+
let snippets = [];
|
|
629
|
+
if (recommendation.generatePassphrase && !flags["probe-only"]) {
|
|
630
|
+
passphrase = await generatePassphrase();
|
|
631
|
+
snippets = buildPersistenceSnippets(passphrase);
|
|
632
|
+
}
|
|
633
|
+
if (flags.json) {
|
|
634
|
+
const body = JSON.stringify({
|
|
635
|
+
ok: true,
|
|
636
|
+
state,
|
|
637
|
+
recommendation: { status: recommendation.status, message: recommendation.message },
|
|
638
|
+
passphrase: passphrase ?? null,
|
|
639
|
+
snippets: snippets.map((s) => ({ title: s.title, detail: s.detail, code: s.code }))
|
|
640
|
+
});
|
|
641
|
+
return { code: 0, stdout: body + "\n", stderr: "" };
|
|
642
|
+
}
|
|
643
|
+
const report = renderSetupVaultReport({ state, recommendation, passphrase, snippets });
|
|
644
|
+
return { code: 0, stdout: report + "\n", stderr: "" };
|
|
645
|
+
}
|
|
413
646
|
if (command === "add-account") {
|
|
414
647
|
const name = flags.name ?? (await import("./profiles.mjs")).suggestNextDefaultName();
|
|
415
648
|
const mode = flags.mode ?? "manual";
|
|
649
|
+
if (!flags["skip-vault-check"]) {
|
|
650
|
+
const unseal = await checkVaultUnseal();
|
|
651
|
+
if (!unseal.ok) {
|
|
652
|
+
const msg2 = `No vault unseal path configured. ${unseal.hint}`;
|
|
653
|
+
const body = flags.json ? JSON.stringify({ ok: false, reason: unseal.reason, hint: unseal.hint }) : "";
|
|
654
|
+
return { code: 1, stdout: body + (body ? "\n" : ""), stderr: msg2 + "\n" };
|
|
655
|
+
}
|
|
656
|
+
}
|
|
416
657
|
try {
|
|
417
658
|
const { createProfile } = await import("./profiles.mjs");
|
|
418
659
|
const profile = createProfile(name, { loginMode: mode });
|
|
@@ -461,6 +702,14 @@ Config written to ${config.configPath}`;
|
|
|
461
702
|
const { fork } = await import("child_process");
|
|
462
703
|
const mode = flags.mode ?? "manual";
|
|
463
704
|
const profile = flags.profile ?? (await import("./profiles.mjs")).getActiveName() ?? "default";
|
|
705
|
+
if (!flags["plain-cookies"] && !flags["skip-vault-check"]) {
|
|
706
|
+
const unseal = await checkVaultUnseal();
|
|
707
|
+
if (!unseal.ok) {
|
|
708
|
+
const msg2 = `No vault unseal path configured for profile '${profile}'. ${unseal.hint}`;
|
|
709
|
+
const body = flags.json ? JSON.stringify({ ok: false, reason: unseal.reason, hint: unseal.hint, profile }) : "";
|
|
710
|
+
return { code: 1, stdout: body + (body ? "\n" : ""), stderr: msg2 + "\n" };
|
|
711
|
+
}
|
|
712
|
+
}
|
|
464
713
|
const env = { ...process.env, PERPLEXITY_PROFILE: profile };
|
|
465
714
|
if (mode === "auto") {
|
|
466
715
|
if (!flags.email) return { code: 1, stdout: "", stderr: "`--email` required for --mode auto.\n" };
|
|
@@ -512,7 +761,7 @@ Config written to ${config.configPath}`;
|
|
|
512
761
|
return { code: browserResult.code, stdout: (flags.json ? browserResult.last : `login finished (${browserResult.code})`) + "\n", stderr: "" };
|
|
513
762
|
}
|
|
514
763
|
if (command === "install-speed-boost") {
|
|
515
|
-
const { installImpit, getImpitStatus } = await import("./native-deps-
|
|
764
|
+
const { installImpit, getImpitStatus } = await import("./native-deps-IE4B55EL.mjs");
|
|
516
765
|
const before = getImpitStatus();
|
|
517
766
|
if (before.installed && !flags.force) {
|
|
518
767
|
const msg2 = flags.json ? JSON.stringify({ ok: true, alreadyInstalled: true, version: before.version, runtimeDir: before.runtimeDir }) : `Speed Boost (impit ${before.version ?? "?"}) already installed at ${before.runtimeDir}.
|
|
@@ -533,7 +782,7 @@ All impit-eligible tools (sync, hydrate, retrieve, export, models, login) will u
|
|
|
533
782
|
return { code: 0, stdout: out + "\n", stderr: "" };
|
|
534
783
|
}
|
|
535
784
|
if (command === "uninstall-speed-boost") {
|
|
536
|
-
const { uninstallImpit, getImpitStatus } = await import("./native-deps-
|
|
785
|
+
const { uninstallImpit, getImpitStatus } = await import("./native-deps-IE4B55EL.mjs");
|
|
537
786
|
const before = getImpitStatus();
|
|
538
787
|
const log = (line) => process.stderr.write(`[speed-boost] ${line}
|
|
539
788
|
`);
|
|
@@ -547,7 +796,7 @@ All impit-eligible tools (sync, hydrate, retrieve, export, models, login) will u
|
|
|
547
796
|
return { code: 0, stdout: out + "\n", stderr: "" };
|
|
548
797
|
}
|
|
549
798
|
if (command === "speed-boost-status") {
|
|
550
|
-
const { getImpitStatus } = await import("./native-deps-
|
|
799
|
+
const { getImpitStatus } = await import("./native-deps-IE4B55EL.mjs");
|
|
551
800
|
const status = getImpitStatus();
|
|
552
801
|
if (flags.json) {
|
|
553
802
|
return { code: 0, stdout: JSON.stringify(status) + "\n", stderr: "" };
|
|
@@ -758,6 +1007,13 @@ Usage:
|
|
|
758
1007
|
npx perplexity-user-mcp status [--profile X] [--all]
|
|
759
1008
|
npx perplexity-user-mcp doctor [--profile X] [--probe] [--all] [--report]
|
|
760
1009
|
npx perplexity-user-mcp install-browser
|
|
1010
|
+
npx perplexity-user-mcp setup-vault [--profile X] [--json] [--probe-only]
|
|
1011
|
+
Probe the vault unseal chain (OS keychain / PERPLEXITY_VAULT_PASSPHRASE)
|
|
1012
|
+
and, when neither is configured, generate a strong passphrase and print
|
|
1013
|
+
cross-platform persistence snippets (PowerShell / setx / zsh / bash /
|
|
1014
|
+
systemd / MCP-client env block). Read-only \u2014 never writes any file.
|
|
1015
|
+
Cross-platform: Windows, macOS, Linux. Add --probe-only to skip
|
|
1016
|
+
passphrase generation and just report state.
|
|
761
1017
|
npx perplexity-user-mcp install-speed-boost [--force] [--json]
|
|
762
1018
|
npx perplexity-user-mcp uninstall-speed-boost [--json]
|
|
763
1019
|
npx perplexity-user-mcp speed-boost-status [--json]
|
package/dist/client.mjs
CHANGED
|
@@ -7,13 +7,13 @@ import {
|
|
|
7
7
|
readCachedAccountInfoFromDisk,
|
|
8
8
|
retrieveThreadViaImpit,
|
|
9
9
|
searchPerplexityViaImpit
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-C3HPFFTD.mjs";
|
|
11
|
+
import "./chunk-DQQISMYN.mjs";
|
|
12
|
+
import "./chunk-D254EFYB.mjs";
|
|
13
|
+
import "./chunk-U7QPUNRH.mjs";
|
|
14
|
+
import "./chunk-S677V2JU.mjs";
|
|
15
15
|
import "./chunk-MTDFKNXX.mjs";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-HJIXH6CL.mjs";
|
|
17
17
|
import "./chunk-4UEJOM6W.mjs";
|
|
18
18
|
export {
|
|
19
19
|
PerplexityClient,
|
package/dist/cloud-sync.mjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
hydrateCloudHistoryEntry,
|
|
3
3
|
syncCloudHistory
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-2FPGJKCA.mjs";
|
|
5
|
+
import "./chunk-C3HPFFTD.mjs";
|
|
6
|
+
import "./chunk-DQQISMYN.mjs";
|
|
7
|
+
import "./chunk-B65IJQZJ.mjs";
|
|
8
|
+
import "./chunk-D254EFYB.mjs";
|
|
9
|
+
import "./chunk-U7QPUNRH.mjs";
|
|
10
|
+
import "./chunk-S677V2JU.mjs";
|
|
11
11
|
import "./chunk-MTDFKNXX.mjs";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-HJIXH6CL.mjs";
|
|
13
13
|
import "./chunk-4UEJOM6W.mjs";
|
|
14
14
|
export {
|
|
15
15
|
hydrateCloudHistoryEntry,
|
package/dist/config.mjs
CHANGED
|
@@ -22,10 +22,10 @@ import {
|
|
|
22
22
|
getSavedCookies,
|
|
23
23
|
hasStoredLogin,
|
|
24
24
|
resolveBrowserExecutable
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
25
|
+
} from "./chunk-U7QPUNRH.mjs";
|
|
26
|
+
import "./chunk-S677V2JU.mjs";
|
|
27
27
|
import "./chunk-MTDFKNXX.mjs";
|
|
28
|
-
import "./chunk-
|
|
28
|
+
import "./chunk-HJIXH6CL.mjs";
|
|
29
29
|
import "./chunk-4UEJOM6W.mjs";
|
|
30
30
|
export {
|
|
31
31
|
ASI_ACCESS_ENDPOINT,
|
package/dist/daemon/attach.mjs
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import {
|
|
2
2
|
attachToDaemon
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-NJX4RBO6.mjs";
|
|
4
|
+
import "../chunk-RK4EBZJ3.mjs";
|
|
5
|
+
import "../chunk-XTRJSV72.mjs";
|
|
6
6
|
import "../chunk-6YMQVLFX.mjs";
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
14
|
-
import "../chunk-
|
|
15
|
-
import "../chunk-
|
|
16
|
-
import "../chunk-
|
|
17
|
-
import "../chunk-
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-
|
|
7
|
+
import "../chunk-FKQ3HP4Q.mjs";
|
|
8
|
+
import "../chunk-KJFX2ZXR.mjs";
|
|
9
|
+
import "../chunk-T6ARJK2P.mjs";
|
|
10
|
+
import "../chunk-V4U3JM4R.mjs";
|
|
11
|
+
import "../chunk-TDXETAQT.mjs";
|
|
12
|
+
import "../chunk-WDIW33DA.mjs";
|
|
13
|
+
import "../chunk-2FPGJKCA.mjs";
|
|
14
|
+
import "../chunk-C3HPFFTD.mjs";
|
|
15
|
+
import "../chunk-DQQISMYN.mjs";
|
|
16
|
+
import "../chunk-B65IJQZJ.mjs";
|
|
17
|
+
import "../chunk-D254EFYB.mjs";
|
|
18
|
+
import "../chunk-U7QPUNRH.mjs";
|
|
19
|
+
import "../chunk-S677V2JU.mjs";
|
|
20
20
|
import "../chunk-MTDFKNXX.mjs";
|
|
21
|
-
import "../chunk-
|
|
21
|
+
import "../chunk-HJIXH6CL.mjs";
|
|
22
22
|
import "../chunk-4UEJOM6W.mjs";
|
|
23
23
|
export {
|
|
24
24
|
attachToDaemon
|
package/dist/daemon/audit.mjs
CHANGED
|
@@ -2,8 +2,8 @@ import {
|
|
|
2
2
|
appendAuditEntry,
|
|
3
3
|
getAuditLogPath,
|
|
4
4
|
readAuditTail
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-V4U3JM4R.mjs";
|
|
6
|
+
import "../chunk-HJIXH6CL.mjs";
|
|
7
7
|
import "../chunk-4UEJOM6W.mjs";
|
|
8
8
|
export {
|
|
9
9
|
appendAuditEntry,
|
|
@@ -2,25 +2,25 @@ import {
|
|
|
2
2
|
exportHistoryViaDaemon,
|
|
3
3
|
hydrateCloudHistoryEntryViaDaemon,
|
|
4
4
|
syncCloudHistoryViaDaemon
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
5
|
+
} from "../chunk-452DK6OS.mjs";
|
|
6
|
+
import "../chunk-RK4EBZJ3.mjs";
|
|
7
|
+
import "../chunk-XTRJSV72.mjs";
|
|
8
8
|
import "../chunk-6YMQVLFX.mjs";
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
14
|
-
import "../chunk-
|
|
15
|
-
import "../chunk-
|
|
16
|
-
import "../chunk-
|
|
17
|
-
import "../chunk-
|
|
18
|
-
import "../chunk-
|
|
19
|
-
import "../chunk-
|
|
20
|
-
import "../chunk-
|
|
21
|
-
import "../chunk-
|
|
9
|
+
import "../chunk-FKQ3HP4Q.mjs";
|
|
10
|
+
import "../chunk-KJFX2ZXR.mjs";
|
|
11
|
+
import "../chunk-T6ARJK2P.mjs";
|
|
12
|
+
import "../chunk-V4U3JM4R.mjs";
|
|
13
|
+
import "../chunk-TDXETAQT.mjs";
|
|
14
|
+
import "../chunk-WDIW33DA.mjs";
|
|
15
|
+
import "../chunk-2FPGJKCA.mjs";
|
|
16
|
+
import "../chunk-C3HPFFTD.mjs";
|
|
17
|
+
import "../chunk-DQQISMYN.mjs";
|
|
18
|
+
import "../chunk-B65IJQZJ.mjs";
|
|
19
|
+
import "../chunk-D254EFYB.mjs";
|
|
20
|
+
import "../chunk-U7QPUNRH.mjs";
|
|
21
|
+
import "../chunk-S677V2JU.mjs";
|
|
22
22
|
import "../chunk-MTDFKNXX.mjs";
|
|
23
|
-
import "../chunk-
|
|
23
|
+
import "../chunk-HJIXH6CL.mjs";
|
|
24
24
|
import "../chunk-4UEJOM6W.mjs";
|
|
25
25
|
export {
|
|
26
26
|
exportHistoryViaDaemon,
|
package/dist/daemon/index.mjs
CHANGED
|
@@ -2,10 +2,10 @@ import {
|
|
|
2
2
|
exportHistoryViaDaemon,
|
|
3
3
|
hydrateCloudHistoryEntryViaDaemon,
|
|
4
4
|
syncCloudHistoryViaDaemon
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-452DK6OS.mjs";
|
|
6
6
|
import {
|
|
7
7
|
attachToDaemon
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-NJX4RBO6.mjs";
|
|
9
9
|
import {
|
|
10
10
|
disableDaemonTunnel,
|
|
11
11
|
enableDaemonTunnel,
|
|
@@ -21,8 +21,8 @@ import {
|
|
|
21
21
|
rotateDaemonToken,
|
|
22
22
|
startDaemon,
|
|
23
23
|
stopDaemon
|
|
24
|
-
} from "../chunk-
|
|
25
|
-
import "../chunk-
|
|
24
|
+
} from "../chunk-RK4EBZJ3.mjs";
|
|
25
|
+
import "../chunk-XTRJSV72.mjs";
|
|
26
26
|
import {
|
|
27
27
|
extractTunnelUrl,
|
|
28
28
|
startTunnel
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
getTunnelBinaryPath,
|
|
33
33
|
installCloudflared,
|
|
34
34
|
resolvePinnedAssetKey
|
|
35
|
-
} from "../chunk-
|
|
35
|
+
} from "../chunk-FKQ3HP4Q.mjs";
|
|
36
36
|
import {
|
|
37
37
|
acquire,
|
|
38
38
|
getLockfilePath,
|
|
@@ -40,32 +40,32 @@ import {
|
|
|
40
40
|
read,
|
|
41
41
|
release,
|
|
42
42
|
replace
|
|
43
|
-
} from "../chunk-
|
|
43
|
+
} from "../chunk-KJFX2ZXR.mjs";
|
|
44
44
|
import {
|
|
45
45
|
startDaemonServer
|
|
46
|
-
} from "../chunk-
|
|
46
|
+
} from "../chunk-T6ARJK2P.mjs";
|
|
47
47
|
import {
|
|
48
48
|
appendAuditEntry,
|
|
49
49
|
getAuditLogPath,
|
|
50
50
|
readAuditTail
|
|
51
|
-
} from "../chunk-
|
|
51
|
+
} from "../chunk-V4U3JM4R.mjs";
|
|
52
52
|
import {
|
|
53
53
|
ensureToken,
|
|
54
54
|
generateBearerToken,
|
|
55
55
|
getTokenPath,
|
|
56
56
|
readToken,
|
|
57
57
|
rotateToken
|
|
58
|
-
} from "../chunk-
|
|
59
|
-
import "../chunk-
|
|
60
|
-
import "../chunk-
|
|
61
|
-
import "../chunk-
|
|
62
|
-
import "../chunk-
|
|
63
|
-
import "../chunk-
|
|
64
|
-
import "../chunk-
|
|
65
|
-
import "../chunk-
|
|
66
|
-
import "../chunk-
|
|
58
|
+
} from "../chunk-TDXETAQT.mjs";
|
|
59
|
+
import "../chunk-WDIW33DA.mjs";
|
|
60
|
+
import "../chunk-2FPGJKCA.mjs";
|
|
61
|
+
import "../chunk-C3HPFFTD.mjs";
|
|
62
|
+
import "../chunk-DQQISMYN.mjs";
|
|
63
|
+
import "../chunk-B65IJQZJ.mjs";
|
|
64
|
+
import "../chunk-D254EFYB.mjs";
|
|
65
|
+
import "../chunk-U7QPUNRH.mjs";
|
|
66
|
+
import "../chunk-S677V2JU.mjs";
|
|
67
67
|
import "../chunk-MTDFKNXX.mjs";
|
|
68
|
-
import "../chunk-
|
|
68
|
+
import "../chunk-HJIXH6CL.mjs";
|
|
69
69
|
import "../chunk-4UEJOM6W.mjs";
|
|
70
70
|
export {
|
|
71
71
|
acquire,
|
|
@@ -3,8 +3,8 @@ import {
|
|
|
3
3
|
getTunnelBinaryPath,
|
|
4
4
|
installCloudflared,
|
|
5
5
|
resolvePinnedAssetKey
|
|
6
|
-
} from "../chunk-
|
|
7
|
-
import "../chunk-
|
|
6
|
+
} from "../chunk-FKQ3HP4Q.mjs";
|
|
7
|
+
import "../chunk-HJIXH6CL.mjs";
|
|
8
8
|
import "../chunk-4UEJOM6W.mjs";
|
|
9
9
|
export {
|
|
10
10
|
getPinnedCloudflaredVersion,
|
package/dist/daemon/launcher.mjs
CHANGED
|
@@ -13,24 +13,24 @@ import {
|
|
|
13
13
|
rotateDaemonToken,
|
|
14
14
|
startDaemon,
|
|
15
15
|
stopDaemon
|
|
16
|
-
} from "../chunk-
|
|
17
|
-
import "../chunk-
|
|
16
|
+
} from "../chunk-RK4EBZJ3.mjs";
|
|
17
|
+
import "../chunk-XTRJSV72.mjs";
|
|
18
18
|
import "../chunk-6YMQVLFX.mjs";
|
|
19
|
-
import "../chunk-
|
|
20
|
-
import "../chunk-
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
23
|
-
import "../chunk-
|
|
24
|
-
import "../chunk-
|
|
25
|
-
import "../chunk-
|
|
26
|
-
import "../chunk-
|
|
27
|
-
import "../chunk-
|
|
28
|
-
import "../chunk-
|
|
29
|
-
import "../chunk-
|
|
30
|
-
import "../chunk-
|
|
31
|
-
import "../chunk-
|
|
19
|
+
import "../chunk-FKQ3HP4Q.mjs";
|
|
20
|
+
import "../chunk-KJFX2ZXR.mjs";
|
|
21
|
+
import "../chunk-T6ARJK2P.mjs";
|
|
22
|
+
import "../chunk-V4U3JM4R.mjs";
|
|
23
|
+
import "../chunk-TDXETAQT.mjs";
|
|
24
|
+
import "../chunk-WDIW33DA.mjs";
|
|
25
|
+
import "../chunk-2FPGJKCA.mjs";
|
|
26
|
+
import "../chunk-C3HPFFTD.mjs";
|
|
27
|
+
import "../chunk-DQQISMYN.mjs";
|
|
28
|
+
import "../chunk-B65IJQZJ.mjs";
|
|
29
|
+
import "../chunk-D254EFYB.mjs";
|
|
30
|
+
import "../chunk-U7QPUNRH.mjs";
|
|
31
|
+
import "../chunk-S677V2JU.mjs";
|
|
32
32
|
import "../chunk-MTDFKNXX.mjs";
|
|
33
|
-
import "../chunk-
|
|
33
|
+
import "../chunk-HJIXH6CL.mjs";
|
|
34
34
|
import "../chunk-4UEJOM6W.mjs";
|
|
35
35
|
export {
|
|
36
36
|
disableDaemonTunnel,
|
package/dist/daemon/lockfile.mjs
CHANGED
package/dist/daemon/server.mjs
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveRequestResource,
|
|
3
3
|
startDaemonServer
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-T6ARJK2P.mjs";
|
|
5
|
+
import "../chunk-V4U3JM4R.mjs";
|
|
6
|
+
import "../chunk-TDXETAQT.mjs";
|
|
7
|
+
import "../chunk-2FPGJKCA.mjs";
|
|
8
|
+
import "../chunk-C3HPFFTD.mjs";
|
|
9
|
+
import "../chunk-DQQISMYN.mjs";
|
|
10
|
+
import "../chunk-B65IJQZJ.mjs";
|
|
11
|
+
import "../chunk-D254EFYB.mjs";
|
|
12
|
+
import "../chunk-U7QPUNRH.mjs";
|
|
13
|
+
import "../chunk-S677V2JU.mjs";
|
|
14
14
|
import "../chunk-MTDFKNXX.mjs";
|
|
15
|
-
import "../chunk-
|
|
15
|
+
import "../chunk-HJIXH6CL.mjs";
|
|
16
16
|
import "../chunk-4UEJOM6W.mjs";
|
|
17
17
|
export {
|
|
18
18
|
resolveRequestResource,
|