perplexity-user-mcp 0.8.36

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 (125) hide show
  1. package/README.md +192 -0
  2. package/dist/attachments.d.ts +20 -0
  3. package/dist/attachments.mjs +43 -0
  4. package/dist/checks/browser.d.ts +100 -0
  5. package/dist/checks/browser.mjs +89 -0
  6. package/dist/checks/config.d.ts +91 -0
  7. package/dist/checks/config.mjs +88 -0
  8. package/dist/checks/ide.d.ts +89 -0
  9. package/dist/checks/ide.mjs +80 -0
  10. package/dist/checks/mcp.d.ts +61 -0
  11. package/dist/checks/mcp.mjs +56 -0
  12. package/dist/checks/native-deps.d.ts +131 -0
  13. package/dist/checks/native-deps.mjs +115 -0
  14. package/dist/checks/network.d.ts +71 -0
  15. package/dist/checks/network.mjs +70 -0
  16. package/dist/checks/probe.d.ts +93 -0
  17. package/dist/checks/probe.mjs +82 -0
  18. package/dist/checks/profiles.d.ts +99 -0
  19. package/dist/checks/profiles.mjs +90 -0
  20. package/dist/checks/runtime.d.ts +89 -0
  21. package/dist/checks/runtime.mjs +90 -0
  22. package/dist/checks/vault.d.ts +101 -0
  23. package/dist/checks/vault.mjs +90 -0
  24. package/dist/chunk-3B276PGG.mjs +115 -0
  25. package/dist/chunk-4UEJOM6W.mjs +9 -0
  26. package/dist/chunk-6EP2BLTV.mjs +205 -0
  27. package/dist/chunk-6YMQVLFX.mjs +146 -0
  28. package/dist/chunk-7JL36EBH.mjs +118 -0
  29. package/dist/chunk-DPGMKSSA.mjs +57 -0
  30. package/dist/chunk-H4BUAPPO.mjs +1950 -0
  31. package/dist/chunk-HMKLWVXB.mjs +109 -0
  32. package/dist/chunk-HTUAQRKH.mjs +125 -0
  33. package/dist/chunk-HU5B4FXS.mjs +139 -0
  34. package/dist/chunk-KCXM2M4B.mjs +1006 -0
  35. package/dist/chunk-LKJMLGFP.mjs +237 -0
  36. package/dist/chunk-LZPLNZ5U.mjs +67 -0
  37. package/dist/chunk-MTDFKNXX.mjs +19 -0
  38. package/dist/chunk-OF4DMAPJ.mjs +511 -0
  39. package/dist/chunk-PE23RMXY.mjs +43 -0
  40. package/dist/chunk-Q2VY4R5F.mjs +175 -0
  41. package/dist/chunk-S5VD7WTU.mjs +2540 -0
  42. package/dist/chunk-SVPRB62V.mjs +106 -0
  43. package/dist/chunk-TQLCLE4L.mjs +345 -0
  44. package/dist/chunk-U3DGFLXZ.mjs +43 -0
  45. package/dist/chunk-X45O6YD3.mjs +688 -0
  46. package/dist/chunk-XKSWCEGI.mjs +168 -0
  47. package/dist/chunk-Z7DAACGZ.mjs +534 -0
  48. package/dist/chunk-ZQFUZPLO.mjs +257 -0
  49. package/dist/cli.d.ts +952 -0
  50. package/dist/cli.mjs +827 -0
  51. package/dist/client.d.ts +355 -0
  52. package/dist/client.mjs +27 -0
  53. package/dist/cloud-sync.d-Cqt6y18U.d.ts +42 -0
  54. package/dist/cloud-sync.d.ts +42 -0
  55. package/dist/cloud-sync.mjs +17 -0
  56. package/dist/config.d.ts +186 -0
  57. package/dist/config.mjs +54 -0
  58. package/dist/daemon/attach.d.ts +36 -0
  59. package/dist/daemon/attach.mjs +25 -0
  60. package/dist/daemon/audit.d.ts +23 -0
  61. package/dist/daemon/audit.mjs +12 -0
  62. package/dist/daemon/client-http.d.ts +42 -0
  63. package/dist/daemon/client-http.mjs +29 -0
  64. package/dist/daemon/index.d.ts +14 -0
  65. package/dist/daemon/index.mjs +110 -0
  66. package/dist/daemon/install-tunnel.d.ts +46 -0
  67. package/dist/daemon/install-tunnel.mjs +14 -0
  68. package/dist/daemon/launcher.d.ts +163 -0
  69. package/dist/daemon/launcher.mjs +50 -0
  70. package/dist/daemon/lockfile.d.ts +29 -0
  71. package/dist/daemon/lockfile.mjs +18 -0
  72. package/dist/daemon/server.d.ts +159 -0
  73. package/dist/daemon/server.mjs +20 -0
  74. package/dist/daemon/token.d.ts +17 -0
  75. package/dist/daemon/token.mjs +17 -0
  76. package/dist/daemon/tunnel-providers/index.d.ts +330 -0
  77. package/dist/daemon/tunnel-providers/index.mjs +57 -0
  78. package/dist/daemon/tunnel.d.ts +23 -0
  79. package/dist/daemon/tunnel.mjs +9 -0
  80. package/dist/doctor-report.d.ts +24 -0
  81. package/dist/doctor-report.mjs +14 -0
  82. package/dist/doctor.d-CXmUqOXX.d.ts +43 -0
  83. package/dist/doctor.d.ts +44 -0
  84. package/dist/doctor.mjs +16 -0
  85. package/dist/export.d.ts +19 -0
  86. package/dist/export.mjs +15 -0
  87. package/dist/health-check.d.ts +108 -0
  88. package/dist/health-check.mjs +92 -0
  89. package/dist/history-store.d-BzjBF2m3.d.ts +65 -0
  90. package/dist/history-store.d.ts +65 -0
  91. package/dist/history-store.mjs +48 -0
  92. package/dist/impit-login-runner.d.ts +469 -0
  93. package/dist/impit-login-runner.mjs +685 -0
  94. package/dist/index.d.ts +159 -0
  95. package/dist/index.mjs +236 -0
  96. package/dist/login-runner.d.ts +333 -0
  97. package/dist/login-runner.mjs +320 -0
  98. package/dist/logout.d.ts +28 -0
  99. package/dist/logout.mjs +45 -0
  100. package/dist/manual-login-runner.d.ts +150 -0
  101. package/dist/manual-login-runner.mjs +146 -0
  102. package/dist/native-deps-BNThFHxa.d.ts +175 -0
  103. package/dist/native-deps-YNKXITRY.mjs +139 -0
  104. package/dist/profiles.d-DqS1oZWr.d.ts +41 -0
  105. package/dist/profiles.d.ts +41 -0
  106. package/dist/profiles.mjs +33 -0
  107. package/dist/redact.d.ts +159 -0
  108. package/dist/redact.mjs +11 -0
  109. package/dist/refresh.d.ts +118 -0
  110. package/dist/refresh.mjs +21 -0
  111. package/dist/reinit-watcher.d.ts +15 -0
  112. package/dist/reinit-watcher.mjs +8 -0
  113. package/dist/session-metadata-B9aV_n5g.d.ts +148 -0
  114. package/dist/tty-prompt.d.ts +44 -0
  115. package/dist/tty-prompt.mjs +39 -0
  116. package/dist/vault.d-BtRSLZiM.d.ts +8 -0
  117. package/dist/vault.d.ts +37 -0
  118. package/dist/vault.mjs +21 -0
  119. package/dist/viewer-detect.d-HWGnyFAA.d.ts +4 -0
  120. package/dist/viewer-detect.d.ts +4 -0
  121. package/dist/viewer-detect.mjs +37 -0
  122. package/dist/viewers.d-BGCK6sw6.d.ts +10 -0
  123. package/dist/viewers.d.ts +18 -0
  124. package/dist/viewers.mjs +122 -0
  125. package/package.json +152 -0
@@ -0,0 +1,237 @@
1
+ import {
2
+ Vault
3
+ } from "./chunk-TQLCLE4L.mjs";
4
+ import {
5
+ getActiveName,
6
+ getProfilePaths
7
+ } from "./chunk-XKSWCEGI.mjs";
8
+
9
+ // src/config.ts
10
+ import { existsSync } from "fs";
11
+ import { join } from "path";
12
+ import { homedir } from "os";
13
+ var PERPLEXITY_URL = "https://www.perplexity.ai";
14
+ var AUTH_SESSION_ENDPOINT = `${PERPLEXITY_URL}/api/auth/session`;
15
+ var QUERY_ENDPOINT = `${PERPLEXITY_URL}/rest/sse/perplexity_ask`;
16
+ var MODELS_CONFIG_ENDPOINT = `${PERPLEXITY_URL}/rest/models/config?config_schema=v1&version=2.18&source=default`;
17
+ var ASI_ACCESS_ENDPOINT = `${PERPLEXITY_URL}/rest/billing/asi-access-decision?version=2.18&source=default`;
18
+ var RATE_LIMIT_ENDPOINT = `${PERPLEXITY_URL}/rest/rate-limit/status?version=2.18&source=default`;
19
+ var EXPERIMENTS_ENDPOINT = `${PERPLEXITY_URL}/rest/experiments/attributes?version=2.18&source=default`;
20
+ var USER_INFO_ENDPOINT = `${PERPLEXITY_URL}/rest/user/info?version=2.18&source=default`;
21
+ var THREAD_ENDPOINT = (slug) => `${PERPLEXITY_URL}/rest/thread/${slug}`;
22
+ var CONFIG_DIR = process.env.PERPLEXITY_CONFIG_DIR || join(homedir(), ".perplexity-mcp");
23
+ function activeName() {
24
+ return process.env.PERPLEXITY_PROFILE || getActiveName() || "default";
25
+ }
26
+ function getCookiesFile() {
27
+ return getProfilePaths(activeName()).dir + "/cookies.json";
28
+ }
29
+ function getBrowserDataDir() {
30
+ return getProfilePaths(activeName()).browserData;
31
+ }
32
+ var COOKIES_FILE = getCookiesFile();
33
+ var STORAGE_STATE_FILE = join(CONFIG_DIR, "storage-state.json");
34
+ var BROWSER_DATA_DIR = getBrowserDataDir();
35
+ function findBrowser() {
36
+ const overridePath = process.env.PERPLEXITY_BROWSER_PATH || process.env.PERPLEXITY_CHROME_PATH;
37
+ if (overridePath && existsSync(overridePath)) {
38
+ const overrideChannel = process.env.PERPLEXITY_BROWSER_CHANNEL;
39
+ const channel = overrideChannel && ["chrome", "msedge", "chromium"].includes(overrideChannel) ? overrideChannel : "chrome";
40
+ return { path: overridePath, channel };
41
+ }
42
+ const chromeCandidates = process.platform === "win32" ? [
43
+ join(process.env.PROGRAMFILES || "", "Google", "Chrome", "Application", "chrome.exe"),
44
+ join(process.env["PROGRAMFILES(X86)"] || "", "Google", "Chrome", "Application", "chrome.exe"),
45
+ join(process.env.LOCALAPPDATA || "", "Google", "Chrome", "Application", "chrome.exe")
46
+ ] : process.platform === "darwin" ? [
47
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
48
+ ] : [
49
+ "/usr/bin/google-chrome",
50
+ "/usr/bin/google-chrome-stable",
51
+ "/usr/local/bin/google-chrome",
52
+ "/snap/bin/google-chrome",
53
+ "/opt/google/chrome/chrome"
54
+ ];
55
+ for (const p of chromeCandidates) if (p && existsSync(p)) return { path: p, channel: "chrome" };
56
+ const edgeCandidates = process.platform === "win32" ? [
57
+ join(process.env.PROGRAMFILES || "", "Microsoft", "Edge", "Application", "msedge.exe"),
58
+ join(process.env["PROGRAMFILES(X86)"] || "", "Microsoft", "Edge", "Application", "msedge.exe")
59
+ ] : process.platform === "darwin" ? [
60
+ "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"
61
+ ] : [
62
+ "/usr/bin/microsoft-edge",
63
+ "/usr/bin/microsoft-edge-stable",
64
+ "/opt/microsoft/msedge/msedge"
65
+ ];
66
+ for (const p of edgeCandidates) if (p && existsSync(p)) return { path: p, channel: "msedge" };
67
+ if (process.platform !== "win32") {
68
+ const chromiumCandidates = process.platform === "darwin" ? ["/Applications/Chromium.app/Contents/MacOS/Chromium"] : ["/usr/bin/chromium-browser", "/usr/bin/chromium", "/snap/bin/chromium"];
69
+ for (const p of chromiumCandidates) if (existsSync(p)) return { path: p, channel: "chromium" };
70
+ }
71
+ const braveCandidates = process.platform === "win32" ? [
72
+ join(process.env.PROGRAMFILES || "", "BraveSoftware", "Brave-Browser", "Application", "brave.exe"),
73
+ join(process.env["PROGRAMFILES(X86)"] || "", "BraveSoftware", "Brave-Browser", "Application", "brave.exe"),
74
+ join(process.env.LOCALAPPDATA || "", "BraveSoftware", "Brave-Browser", "Application", "brave.exe")
75
+ ] : process.platform === "darwin" ? [
76
+ "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser"
77
+ ] : [
78
+ "/usr/bin/brave-browser",
79
+ "/usr/bin/brave",
80
+ "/snap/bin/brave",
81
+ "/opt/brave.com/brave/brave-browser"
82
+ ];
83
+ for (const p of braveCandidates) if (p && existsSync(p)) return { path: p, channel: "chromium" };
84
+ return null;
85
+ }
86
+ async function getOrCreateContext(browser, options = {}) {
87
+ const existing = browser.contexts()[0];
88
+ if (existing) return existing;
89
+ return browser.newContext(options);
90
+ }
91
+ function findChromeExecutable() {
92
+ return findBrowser()?.path ?? null;
93
+ }
94
+ async function resolveBrowserExecutable() {
95
+ const systemBrowser = findBrowser();
96
+ if (systemBrowser) {
97
+ const isBrave = /brave/i.test(systemBrowser.path);
98
+ const source = systemBrowser.channel === "chrome" ? "system-chrome" : systemBrowser.channel === "msedge" ? "system-edge" : isBrave ? "system-brave" : "system-chromium";
99
+ return { path: systemBrowser.path, channel: systemBrowser.channel, source };
100
+ }
101
+ let bundledPath = null;
102
+ try {
103
+ const { chromium } = await import("patchright");
104
+ bundledPath = chromium.executablePath();
105
+ } catch {
106
+ }
107
+ if (bundledPath && existsSync(bundledPath)) {
108
+ return { path: bundledPath, channel: "chromium", source: "bundled-chromium" };
109
+ }
110
+ const lines = [
111
+ "No usable browser found for Perplexity MCP.",
112
+ "",
113
+ "Pick one of the following:",
114
+ " 1. Install Google Chrome (recommended for best Cloudflare compatibility):",
115
+ " https://www.google.com/chrome/",
116
+ " 2. Install Microsoft Edge, Brave, or Chromium \u2014 all are supported.",
117
+ " 3. Download patchright's bundled Chromium:",
118
+ " npx patchright install chromium",
119
+ "",
120
+ "You can also set PERPLEXITY_BROWSER_PATH + PERPLEXITY_BROWSER_CHANNEL",
121
+ "(or the legacy PERPLEXITY_CHROME_PATH) to an explicit executable."
122
+ ];
123
+ throw new Error(lines.join("\n"));
124
+ }
125
+ var DEFAULT_HEADERS = {
126
+ accept: "text/event-stream",
127
+ "accept-language": "en-US,en;q=0.9",
128
+ "cache-control": "no-cache",
129
+ "content-type": "application/json",
130
+ origin: PERPLEXITY_URL,
131
+ referer: `${PERPLEXITY_URL}/`,
132
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
133
+ "sec-ch-ua": '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
134
+ "sec-ch-ua-mobile": "?0",
135
+ "sec-ch-ua-platform": '"Windows"',
136
+ "sec-fetch-dest": "empty",
137
+ "sec-fetch-mode": "cors",
138
+ "sec-fetch-site": "same-origin"
139
+ };
140
+ var SUPPORTED_BLOCK_USE_CASES = [
141
+ "answer_modes",
142
+ "media_items",
143
+ "knowledge_cards",
144
+ "inline_entity_cards",
145
+ "place_widgets",
146
+ "finance_widgets",
147
+ "prediction_market_widgets",
148
+ "sports_widgets",
149
+ "flight_status_widgets",
150
+ "news_widgets",
151
+ "shopping_widgets",
152
+ "jobs_widgets",
153
+ "search_result_widgets",
154
+ "inline_images",
155
+ "inline_assets",
156
+ "placeholder_cards",
157
+ "diff_blocks",
158
+ "inline_knowledge_cards",
159
+ "entity_group_v2",
160
+ "refinement_filters",
161
+ "canvas_mode",
162
+ "maps_preview",
163
+ "answer_tabs",
164
+ "price_comparison_widgets",
165
+ "preserve_latex",
166
+ "generic_onboarding_widgets",
167
+ "in_context_suggestions",
168
+ "inline_claims"
169
+ ];
170
+ var _vault = new Vault();
171
+ async function getSavedCookies() {
172
+ if (process.env.PERPLEXITY_SESSION_TOKEN) {
173
+ const cookies = [{
174
+ name: "__Secure-next-auth.session-token",
175
+ value: process.env.PERPLEXITY_SESSION_TOKEN,
176
+ domain: ".perplexity.ai",
177
+ path: "/",
178
+ secure: true,
179
+ httpOnly: true,
180
+ sameSite: "Lax"
181
+ }];
182
+ if (process.env.PERPLEXITY_CSRF_TOKEN) {
183
+ cookies.push({
184
+ name: "next-auth.csrf-token",
185
+ value: process.env.PERPLEXITY_CSRF_TOKEN,
186
+ domain: ".perplexity.ai",
187
+ path: "/",
188
+ secure: false,
189
+ httpOnly: false,
190
+ sameSite: "Lax"
191
+ });
192
+ }
193
+ return cookies;
194
+ }
195
+ const raw = await _vault.get(activeName(), "cookies").catch((err) => {
196
+ const msg = err instanceof Error ? err.message : String(err);
197
+ console.error(`[vault] getSavedCookies failed for profile ${activeName()}: ${msg}`);
198
+ return null;
199
+ });
200
+ if (!raw) return [];
201
+ try {
202
+ const parsed = JSON.parse(raw);
203
+ return Array.isArray(parsed) ? parsed : [];
204
+ } catch {
205
+ return [];
206
+ }
207
+ }
208
+ async function hasStoredLogin() {
209
+ const raw = await _vault.get(activeName(), "cookies").catch(() => null);
210
+ return !!raw;
211
+ }
212
+
213
+ export {
214
+ PERPLEXITY_URL,
215
+ AUTH_SESSION_ENDPOINT,
216
+ QUERY_ENDPOINT,
217
+ MODELS_CONFIG_ENDPOINT,
218
+ ASI_ACCESS_ENDPOINT,
219
+ RATE_LIMIT_ENDPOINT,
220
+ EXPERIMENTS_ENDPOINT,
221
+ USER_INFO_ENDPOINT,
222
+ THREAD_ENDPOINT,
223
+ CONFIG_DIR,
224
+ getCookiesFile,
225
+ getBrowserDataDir,
226
+ COOKIES_FILE,
227
+ STORAGE_STATE_FILE,
228
+ BROWSER_DATA_DIR,
229
+ findBrowser,
230
+ getOrCreateContext,
231
+ findChromeExecutable,
232
+ resolveBrowserExecutable,
233
+ DEFAULT_HEADERS,
234
+ SUPPORTED_BLOCK_USE_CASES,
235
+ getSavedCookies,
236
+ hasStoredLogin
237
+ };
@@ -0,0 +1,67 @@
1
+ import {
2
+ PERPLEXITY_URL
3
+ } from "./chunk-LKJMLGFP.mjs";
4
+
5
+ // src/export.js
6
+ import { Buffer } from "buffer";
7
+ var FORMAT_TO_API = {
8
+ pdf: "pdf",
9
+ markdown: "md",
10
+ docx: "docx"
11
+ };
12
+ var FORMAT_TO_CONTENT_TYPE = {
13
+ pdf: "application/pdf",
14
+ markdown: "text/markdown; charset=utf-8",
15
+ docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
16
+ };
17
+ function resolveExportApiFormat(format) {
18
+ const resolved = FORMAT_TO_API[format];
19
+ if (!resolved) {
20
+ throw new Error(`Unsupported export format '${format}'.`);
21
+ }
22
+ return resolved;
23
+ }
24
+ async function exportThread(options) {
25
+ const {
26
+ entryUuid,
27
+ format,
28
+ fetchImpl = globalThis.fetch,
29
+ baseUrl = PERPLEXITY_URL,
30
+ headers = {}
31
+ } = options;
32
+ if (!entryUuid) {
33
+ throw new Error("entryUuid is required for export.");
34
+ }
35
+ const apiFormat = resolveExportApiFormat(format);
36
+ const response = await fetchImpl(`${baseUrl}/rest/entry/export?version=2.18&source=default`, {
37
+ method: "POST",
38
+ headers: {
39
+ accept: "application/json",
40
+ "content-type": "application/json",
41
+ ...headers
42
+ },
43
+ body: JSON.stringify({
44
+ entry_uuid: entryUuid,
45
+ format: apiFormat
46
+ })
47
+ });
48
+ if (!response.ok) {
49
+ throw new Error(`Perplexity export failed (${response.status}).`);
50
+ }
51
+ const payload = await response.json();
52
+ const buffer = Buffer.from(String(payload?.file_content_64 ?? ""), "base64");
53
+ if (buffer.length === 0) {
54
+ throw new Error("Perplexity export returned an empty file.");
55
+ }
56
+ return {
57
+ buffer,
58
+ filename: String(payload?.filename ?? `${entryUuid}.${apiFormat}`),
59
+ contentType: FORMAT_TO_CONTENT_TYPE[format] ?? "application/octet-stream"
60
+ };
61
+ }
62
+
63
+ export {
64
+ FORMAT_TO_CONTENT_TYPE,
65
+ resolveExportApiFormat,
66
+ exportThread
67
+ };
@@ -0,0 +1,19 @@
1
+ // src/safe-write.js
2
+ import { writeFileSync, renameSync, rmSync } from "fs";
3
+ function safeAtomicWriteFileSync(path, data, opts) {
4
+ const tmp = `${path}.tmp`;
5
+ try {
6
+ writeFileSync(tmp, data, opts);
7
+ renameSync(tmp, path);
8
+ } catch (err) {
9
+ try {
10
+ rmSync(tmp, { force: true });
11
+ } catch {
12
+ }
13
+ throw err;
14
+ }
15
+ }
16
+
17
+ export {
18
+ safeAtomicWriteFileSync
19
+ };