mcp-perplexity-pro 1.1.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 (96) hide show
  1. package/README.md +638 -0
  2. package/bin/mcp-perplexity-pro +8 -0
  3. package/bin/mcp-perplexity-pro-stdio +9 -0
  4. package/dist/claude-code-bridge.d.ts +3 -0
  5. package/dist/claude-code-bridge.d.ts.map +1 -0
  6. package/dist/claude-code-bridge.js +111 -0
  7. package/dist/claude-code-bridge.js.map +1 -0
  8. package/dist/http-index.d.ts +3 -0
  9. package/dist/http-index.d.ts.map +1 -0
  10. package/dist/http-index.js +38 -0
  11. package/dist/http-index.js.map +1 -0
  12. package/dist/http-server.d.ts +33 -0
  13. package/dist/http-server.d.ts.map +1 -0
  14. package/dist/http-server.js +362 -0
  15. package/dist/http-server.js.map +1 -0
  16. package/dist/http-streaming-server.d.ts +4 -0
  17. package/dist/http-streaming-server.d.ts.map +1 -0
  18. package/dist/http-streaming-server.js +514 -0
  19. package/dist/http-streaming-server.js.map +1 -0
  20. package/dist/index.d.ts +3 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +43 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/launcher.d.ts +3 -0
  25. package/dist/launcher.d.ts.map +1 -0
  26. package/dist/launcher.js +209 -0
  27. package/dist/launcher.js.map +1 -0
  28. package/dist/mcp-server.d.ts +5 -0
  29. package/dist/mcp-server.d.ts.map +1 -0
  30. package/dist/mcp-server.js +329 -0
  31. package/dist/mcp-server.js.map +1 -0
  32. package/dist/models.d.ts +45 -0
  33. package/dist/models.d.ts.map +1 -0
  34. package/dist/models.js +284 -0
  35. package/dist/models.js.map +1 -0
  36. package/dist/perplexity-api.d.ts +59 -0
  37. package/dist/perplexity-api.d.ts.map +1 -0
  38. package/dist/perplexity-api.js +455 -0
  39. package/dist/perplexity-api.js.map +1 -0
  40. package/dist/port-utils.d.ts +31 -0
  41. package/dist/port-utils.d.ts.map +1 -0
  42. package/dist/port-utils.js +114 -0
  43. package/dist/port-utils.js.map +1 -0
  44. package/dist/project-manager.d.ts +91 -0
  45. package/dist/project-manager.d.ts.map +1 -0
  46. package/dist/project-manager.js +422 -0
  47. package/dist/project-manager.js.map +1 -0
  48. package/dist/simple-streaming.d.ts +26 -0
  49. package/dist/simple-streaming.d.ts.map +1 -0
  50. package/dist/simple-streaming.js +75 -0
  51. package/dist/simple-streaming.js.map +1 -0
  52. package/dist/sse-index.d.ts +3 -0
  53. package/dist/sse-index.d.ts.map +1 -0
  54. package/dist/sse-index.js +38 -0
  55. package/dist/sse-index.js.map +1 -0
  56. package/dist/sse-server.d.ts +4 -0
  57. package/dist/sse-server.d.ts.map +1 -0
  58. package/dist/sse-server.js +208 -0
  59. package/dist/sse-server.js.map +1 -0
  60. package/dist/stdio-bridge.d.ts +21 -0
  61. package/dist/stdio-bridge.d.ts.map +1 -0
  62. package/dist/stdio-bridge.js +157 -0
  63. package/dist/stdio-bridge.js.map +1 -0
  64. package/dist/stdio-server.d.ts +7 -0
  65. package/dist/stdio-server.d.ts.map +1 -0
  66. package/dist/stdio-server.js +396 -0
  67. package/dist/stdio-server.js.map +1 -0
  68. package/dist/storage.d.ts +65 -0
  69. package/dist/storage.d.ts.map +1 -0
  70. package/dist/storage.js +328 -0
  71. package/dist/storage.js.map +1 -0
  72. package/dist/streaming-wrapper.d.ts +63 -0
  73. package/dist/streaming-wrapper.d.ts.map +1 -0
  74. package/dist/streaming-wrapper.js +452 -0
  75. package/dist/streaming-wrapper.js.map +1 -0
  76. package/dist/tools/async.d.ts +28 -0
  77. package/dist/tools/async.d.ts.map +1 -0
  78. package/dist/tools/async.js +167 -0
  79. package/dist/tools/async.js.map +1 -0
  80. package/dist/tools/chat.d.ts +29 -0
  81. package/dist/tools/chat.d.ts.map +1 -0
  82. package/dist/tools/chat.js +233 -0
  83. package/dist/tools/chat.js.map +1 -0
  84. package/dist/tools/projects.d.ts +19 -0
  85. package/dist/tools/projects.d.ts.map +1 -0
  86. package/dist/tools/projects.js +219 -0
  87. package/dist/tools/projects.js.map +1 -0
  88. package/dist/tools/query.d.ts +13 -0
  89. package/dist/tools/query.d.ts.map +1 -0
  90. package/dist/tools/query.js +178 -0
  91. package/dist/tools/query.js.map +1 -0
  92. package/dist/types.d.ts +330 -0
  93. package/dist/types.d.ts.map +1 -0
  94. package/dist/types.js +90 -0
  95. package/dist/types.js.map +1 -0
  96. package/package.json +89 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/tools/async.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { ChatPerplexityParams, ReadChatParams, Config, PerplexityResponse, ErrorResponse, ChatMetadata, Conversation } from '../types.js';
2
+ /**
3
+ * Handles the chat_perplexity tool - conversational interface with storage
4
+ */
5
+ export declare function handleChatPerplexity(params: ChatPerplexityParams, config: Config): Promise<(PerplexityResponse & {
6
+ chat_id: string;
7
+ selected_model: string;
8
+ model_selection_reason: string;
9
+ conversation_length: number;
10
+ }) | ErrorResponse>;
11
+ /**
12
+ * Handles the list_chats_perplexity tool - lists all conversations
13
+ */
14
+ export declare function handleListChats(config: Config): Promise<ChatMetadata[] | ErrorResponse>;
15
+ /**
16
+ * Handles the read_chat_perplexity tool - retrieves conversation history
17
+ */
18
+ export declare function handleReadChat(params: ReadChatParams, config: Config): Promise<Conversation | ErrorResponse>;
19
+ /**
20
+ * Gets storage statistics for the project
21
+ */
22
+ export declare function handleStorageStats(config: Config): Promise<{
23
+ total_conversations: number;
24
+ total_messages: number;
25
+ storage_size_bytes: number;
26
+ last_activity: string | null;
27
+ storage_path: string;
28
+ } | ErrorResponse>;
29
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/tools/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EACd,MAAM,EACN,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,YAAY,EACb,MAAM,aAAa,CAAC;AAKrB;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CACN,CAAC,kBAAkB,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAAC,GACF,aAAa,CAChB,CA6JA;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,aAAa,CAAC,CA2B7F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,GAAG,aAAa,CAAC,CA2BvC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAC7D;IACE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB,GACD,aAAa,CAChB,CAiCA"}
@@ -0,0 +1,233 @@
1
+ import { PerplexityApiClient } from '../perplexity-api.js';
2
+ import { StorageManager, StorageError } from '../storage.js';
3
+ import { selectOptimalModel } from '../models.js';
4
+ /**
5
+ * Handles the chat_perplexity tool - conversational interface with storage
6
+ */
7
+ export async function handleChatPerplexity(params, config) {
8
+ try {
9
+ const apiClient = new PerplexityApiClient(config);
10
+ // Detect project and create project-aware config
11
+ const { detectProjectWithSuggestions } = await import('./projects.js');
12
+ const projectName = await detectProjectWithSuggestions(params.project_name, config);
13
+ // Create project-specific storage config with chat subdirectory
14
+ const projectConfig = {
15
+ ...config,
16
+ project_root: config.project_root,
17
+ storage_path: `projects/${projectName}/chat`,
18
+ };
19
+ const storageManager = new StorageManager(projectConfig);
20
+ let conversation;
21
+ let chatId;
22
+ let isNewChat = false;
23
+ // Handle existing vs new conversation
24
+ if (params.chat_id) {
25
+ // Continue existing conversation
26
+ conversation = await storageManager.getConversation(params.chat_id);
27
+ chatId = params.chat_id;
28
+ }
29
+ else {
30
+ // Create new conversation
31
+ if (!params.title) {
32
+ return {
33
+ error: {
34
+ type: 'validation_error',
35
+ message: 'Title is required for new conversations',
36
+ details: {
37
+ suggestion: 'Provide a title parameter when starting a new conversation',
38
+ },
39
+ },
40
+ };
41
+ }
42
+ // Select model for the conversation
43
+ const selectedModel = selectOptimalModel(params.message, params.model, config.default_model);
44
+ // Create new conversation with the user's first message
45
+ const userMessage = { role: 'user', content: params.message };
46
+ chatId = await storageManager.createConversation(params.title, selectedModel, userMessage);
47
+ conversation = await storageManager.getConversation(chatId);
48
+ isNewChat = true;
49
+ }
50
+ // Add user message to existing conversation
51
+ if (!isNewChat) {
52
+ const userMessage = { role: 'user', content: params.message };
53
+ await storageManager.addMessage(chatId, userMessage);
54
+ conversation = await storageManager.getConversation(chatId);
55
+ }
56
+ // Select model (use conversation's model or allow override)
57
+ const selectedModel = params.model || conversation.metadata.model;
58
+ // Prepare the API request with conversation history
59
+ const request = {
60
+ model: selectedModel,
61
+ messages: conversation.messages,
62
+ temperature: params.temperature ?? 0.2,
63
+ ...(params.max_tokens && { max_tokens: params.max_tokens }),
64
+ };
65
+ const response = await apiClient.chatCompletion(request);
66
+ // Add assistant's response to conversation
67
+ if (response.choices[0]?.message?.content) {
68
+ const assistantMessage = {
69
+ role: 'assistant',
70
+ content: response.choices[0].message.content,
71
+ };
72
+ await storageManager.addMessage(chatId, assistantMessage);
73
+ }
74
+ // Get updated conversation for final message count
75
+ const updatedConversation = await storageManager.getConversation(chatId);
76
+ // Save conversation report if requested
77
+ let reportSaved = false;
78
+ let reportPath;
79
+ if (params.save_report && response.choices[0]?.message?.content) {
80
+ try {
81
+ // Create a formatted conversation export for potential saving
82
+ // Note: conversationData would be used if save_report was implemented
83
+ // const conversationData = {
84
+ // chat_id: chatId,
85
+ // title: updatedConversation.metadata.title,
86
+ // model: selectedModel,
87
+ // created_at: updatedConversation.metadata.created_at,
88
+ // updated_at: updatedConversation.metadata.updated_at,
89
+ // message_count: updatedConversation.messages.length,
90
+ // conversation: updatedConversation.messages.map((msg, index) => ({
91
+ // message_number: index + 1,
92
+ // role: msg.role,
93
+ // content: msg.content,
94
+ // timestamp: 'N/A' // Messages don't have individual timestamps
95
+ // }))
96
+ // };
97
+ const reportContent = `# Chat Export: ${updatedConversation.metadata.title}\n\n` +
98
+ `**Chat ID:** ${chatId}\n` +
99
+ `**Model:** ${selectedModel}\n` +
100
+ `**Created:** ${new Date(updatedConversation.metadata.created_at).toLocaleString()}\n` +
101
+ `**Messages:** ${updatedConversation.messages.length}\n\n` +
102
+ '## Conversation\n\n' +
103
+ updatedConversation.messages
104
+ .map((msg, index) => `### Message ${index + 1} (${msg.role})\n\n${msg.content}\n`)
105
+ .join('\n');
106
+ const reportId = await storageManager.saveReport(reportContent, `Chat: ${updatedConversation.metadata.title}`);
107
+ reportSaved = true;
108
+ reportPath = `projects/${params.project_name || 'default-project'}/chat/reports/${reportId}`;
109
+ }
110
+ catch (storageError) {
111
+ // Don't fail the entire request if saving fails
112
+ console.warn('Failed to save chat report:', storageError);
113
+ }
114
+ }
115
+ return {
116
+ ...response,
117
+ chat_id: chatId,
118
+ selected_model: selectedModel,
119
+ model_selection_reason: params.model
120
+ ? 'user_specified'
121
+ : isNewChat
122
+ ? 'auto_selected'
123
+ : 'conversation_default',
124
+ conversation_length: updatedConversation.messages.length,
125
+ ...(params.save_report && { report_saved: reportSaved }),
126
+ ...(reportPath && { report_path: reportPath }),
127
+ };
128
+ }
129
+ catch (error) {
130
+ if (error instanceof StorageError) {
131
+ return StorageManager.handleError(error);
132
+ }
133
+ return PerplexityApiClient.handleError(error, {
134
+ model: params.model || config.default_model,
135
+ query: params.message,
136
+ });
137
+ }
138
+ }
139
+ /**
140
+ * Handles the list_chats_perplexity tool - lists all conversations
141
+ */
142
+ export async function handleListChats(config) {
143
+ try {
144
+ // Use default project for listing chats
145
+ const { detectProjectWithSuggestions } = await import('./projects.js');
146
+ const projectName = await detectProjectWithSuggestions(undefined, config);
147
+ const projectConfig = {
148
+ ...config,
149
+ storage_path: `projects/${projectName}/chat`,
150
+ };
151
+ const storageManager = new StorageManager(projectConfig);
152
+ return await storageManager.listConversations();
153
+ }
154
+ catch (error) {
155
+ if (error instanceof StorageError) {
156
+ return StorageManager.handleError(error);
157
+ }
158
+ return {
159
+ error: {
160
+ type: 'storage_error',
161
+ message: error instanceof Error ? error.message : 'Unknown error listing conversations',
162
+ details: {
163
+ suggestion: 'Check storage configuration and file permissions',
164
+ },
165
+ },
166
+ };
167
+ }
168
+ }
169
+ /**
170
+ * Handles the read_chat_perplexity tool - retrieves conversation history
171
+ */
172
+ export async function handleReadChat(params, config) {
173
+ try {
174
+ // Use default project for reading chats
175
+ const { detectProjectWithSuggestions } = await import('./projects.js');
176
+ const projectName = await detectProjectWithSuggestions(undefined, config);
177
+ const projectConfig = {
178
+ ...config,
179
+ storage_path: `projects/${projectName}/chat`,
180
+ };
181
+ const storageManager = new StorageManager(projectConfig);
182
+ return await storageManager.getConversation(params.chat_id);
183
+ }
184
+ catch (error) {
185
+ if (error instanceof StorageError) {
186
+ return StorageManager.handleError(error);
187
+ }
188
+ return {
189
+ error: {
190
+ type: 'storage_error',
191
+ message: error instanceof Error ? error.message : 'Unknown error reading conversation',
192
+ details: {
193
+ suggestion: 'Check that the conversation ID exists and is accessible',
194
+ },
195
+ },
196
+ };
197
+ }
198
+ }
199
+ /**
200
+ * Gets storage statistics for the project
201
+ */
202
+ export async function handleStorageStats(config) {
203
+ try {
204
+ // Use default project for storage stats
205
+ const { detectProjectWithSuggestions } = await import('./projects.js');
206
+ const projectName = await detectProjectWithSuggestions(undefined, config);
207
+ const projectConfig = {
208
+ ...config,
209
+ storage_path: `projects/${projectName}/chat`,
210
+ };
211
+ const storageManager = new StorageManager(projectConfig);
212
+ const stats = await storageManager.getStorageStats();
213
+ return {
214
+ ...stats,
215
+ storage_path: `projects/${projectName}/chat`,
216
+ };
217
+ }
218
+ catch (error) {
219
+ if (error instanceof StorageError) {
220
+ return StorageManager.handleError(error);
221
+ }
222
+ return {
223
+ error: {
224
+ type: 'storage_error',
225
+ message: error instanceof Error ? error.message : 'Unknown error getting storage statistics',
226
+ details: {
227
+ suggestion: 'Check storage configuration and file permissions',
228
+ },
229
+ },
230
+ };
231
+ }
232
+ }
233
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/tools/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { Config, ListProjectsParams, DeleteProjectParams } from '../types.js';
3
+ /**
4
+ * Lists all existing projects with optional detailed statistics
5
+ */
6
+ export declare function handleListProjects(args: ListProjectsParams, config: Config): Promise<CallToolResult>;
7
+ /**
8
+ * Helper function to handle project detection with user-friendly error messages
9
+ */
10
+ export declare function detectProjectWithSuggestions(explicitProject: string | undefined, config: Config): Promise<string>;
11
+ /**
12
+ * Deletes a project and all its data permanently
13
+ */
14
+ export declare function handleDeleteProject(args: DeleteProjectParams, config: Config): Promise<CallToolResult>;
15
+ /**
16
+ * Gets project-aware storage path for a given project
17
+ */
18
+ export declare function getProjectStoragePath(config: Config, projectName: string): string;
19
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEnF;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,CAAC,CA8GzB;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,CAAC,CA0FzB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAGjF"}
@@ -0,0 +1,219 @@
1
+ import { ProjectManager, ProjectDetectionError } from '../project-manager.js';
2
+ /**
3
+ * Lists all existing projects with optional detailed statistics
4
+ */
5
+ export async function handleListProjects(args, config) {
6
+ try {
7
+ const projectManager = new ProjectManager(config.project_root);
8
+ if (args.detailed) {
9
+ const projectsInfo = await projectManager.getProjectsInfo();
10
+ if (projectsInfo.length === 0) {
11
+ return {
12
+ content: [
13
+ {
14
+ type: 'text',
15
+ text: `📁 **No Projects Found**
16
+
17
+ No project folders exist yet in your storage directory.
18
+
19
+ **Next Steps:**
20
+ - Use any Perplexity tool with a \`project_name\` parameter to create your first project
21
+ - Or run from a project directory for auto-detection
22
+
23
+ **Storage Location:** \`${config.project_root}/projects/\``,
24
+ },
25
+ ],
26
+ };
27
+ }
28
+ let response = `📁 **Project Directory Overview** (${projectsInfo.length} project${projectsInfo.length === 1 ? '' : 's'})\n\n`;
29
+ projectsInfo.forEach((project, index) => {
30
+ const lastUsed = project.lastUsed
31
+ ? `Last used: ${new Date(project.lastUsed).toLocaleDateString()}`
32
+ : 'Never used';
33
+ response += `**${index + 1}. \`${project.name}\`**
34
+ - 💬 ${project.chatCount} conversation${project.chatCount === 1 ? '' : 's'}
35
+ - 📊 ${project.reportCount} research report${project.reportCount === 1 ? '' : 's'}
36
+ - ⏳ ${project.jobCount} async job${project.jobCount === 1 ? '' : 's'}
37
+ - 🕒 ${lastUsed}
38
+
39
+ `;
40
+ });
41
+ response += `**Storage Location:** \`${config.project_root}/projects/\`
42
+
43
+ **Quick Actions:**
44
+ - Use \`project_name: "project-name"\` in any tool to work with a specific project
45
+ - Projects are automatically organized and isolated from each other`;
46
+ return {
47
+ content: [
48
+ {
49
+ type: 'text',
50
+ text: response,
51
+ },
52
+ ],
53
+ };
54
+ }
55
+ else {
56
+ // Simple list view
57
+ const projectNames = await projectManager.listExistingProjects();
58
+ if (projectNames.length === 0) {
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: `📁 **No Projects Found**
64
+
65
+ No project folders exist yet in your storage directory.
66
+
67
+ **To create your first project:**
68
+ 1. Use any Perplexity tool with \`project_name: "my-project"\`
69
+ 2. Or run from a project directory for auto-detection
70
+
71
+ **Storage Location:** \`${config.project_root}/projects/\``,
72
+ },
73
+ ],
74
+ };
75
+ }
76
+ let response = `📁 **Available Projects** (${projectNames.length} total)\n\n`;
77
+ projectNames.forEach((name, index) => {
78
+ response += `${index + 1}. \`${name}\`\n`;
79
+ });
80
+ response += `\n**Usage:**
81
+ - Add \`project_name: "project-name"\` to any tool to work with that project
82
+ - Use \`list_projects_perplexity: {detailed: true}\` for detailed statistics
83
+
84
+ **Storage Location:** \`${config.project_root}/projects/\``;
85
+ return {
86
+ content: [
87
+ {
88
+ type: 'text',
89
+ text: response,
90
+ },
91
+ ],
92
+ };
93
+ }
94
+ }
95
+ catch (error) {
96
+ return {
97
+ content: [
98
+ {
99
+ type: 'text',
100
+ text: `❌ **Error listing projects:** ${error instanceof Error ? error.message : 'Unknown error occurred'}`,
101
+ },
102
+ ],
103
+ };
104
+ }
105
+ }
106
+ /**
107
+ * Helper function to handle project detection with user-friendly error messages
108
+ */
109
+ export async function detectProjectWithSuggestions(explicitProject, config) {
110
+ const projectManager = new ProjectManager(config.project_root);
111
+ try {
112
+ return await projectManager.detectProject(explicitProject, config.session_id);
113
+ }
114
+ catch (error) {
115
+ if (error instanceof ProjectDetectionError) {
116
+ // Use a default project name instead of throwing an error
117
+ return 'default-project';
118
+ }
119
+ throw error;
120
+ }
121
+ }
122
+ /**
123
+ * Deletes a project and all its data permanently
124
+ */
125
+ export async function handleDeleteProject(args, config) {
126
+ const projectManager = new ProjectManager(config.project_root);
127
+ // Safety check: require confirmation
128
+ if (!args.confirm) {
129
+ return {
130
+ content: [
131
+ {
132
+ type: 'text',
133
+ text: `⚠️ **Deletion Requires Confirmation**
134
+
135
+ To delete project "${args.project_name}" and ALL its data permanently, you must set \`confirm: true\`.
136
+
137
+ **This will permanently delete:**
138
+ - All conversations and chat history
139
+ - All research reports
140
+ - All async job results
141
+ - The entire project directory
142
+
143
+ **Usage:**
144
+ \`\`\`
145
+ delete_project_perplexity: {
146
+ project_name: "${args.project_name}",
147
+ confirm: true
148
+ }
149
+ \`\`\`
150
+
151
+ **⚠️ This action cannot be undone!**`,
152
+ },
153
+ ],
154
+ };
155
+ }
156
+ try {
157
+ const result = await projectManager.deleteProject(args.project_name);
158
+ if (result.deleted) {
159
+ let response = `✅ **Project Successfully Deleted**
160
+
161
+ ${result.message}
162
+
163
+ `;
164
+ if (result.stats && result.stats.totalFiles > 0) {
165
+ response += `**What was deleted:**
166
+ - 💬 ${result.stats.chatCount} conversation${result.stats.chatCount === 1 ? '' : 's'}
167
+ - 📊 ${result.stats.reportCount} research report${result.stats.reportCount === 1 ? '' : 's'}
168
+ - ⏳ ${result.stats.jobCount} async job${result.stats.jobCount === 1 ? '' : 's'}
169
+ - 📁 ${result.stats.totalFiles} total file${result.stats.totalFiles === 1 ? '' : 's'}
170
+
171
+ `;
172
+ }
173
+ response += `The project has been completely removed from your storage directory.`;
174
+ return {
175
+ content: [
176
+ {
177
+ type: 'text',
178
+ text: response,
179
+ },
180
+ ],
181
+ };
182
+ }
183
+ else {
184
+ return {
185
+ content: [
186
+ {
187
+ type: 'text',
188
+ text: `❌ **Deletion Failed**
189
+
190
+ ${result.message}
191
+
192
+ **Troubleshooting:**
193
+ - Check that the project name is spelled correctly
194
+ - Use \`list_projects_perplexity\` to see available projects
195
+ - Ensure you have write permissions to the storage directory`,
196
+ },
197
+ ],
198
+ };
199
+ }
200
+ }
201
+ catch (error) {
202
+ return {
203
+ content: [
204
+ {
205
+ type: 'text',
206
+ text: `❌ **Error deleting project:** ${error instanceof Error ? error.message : 'Unknown error occurred'}`,
207
+ },
208
+ ],
209
+ };
210
+ }
211
+ }
212
+ /**
213
+ * Gets project-aware storage path for a given project
214
+ */
215
+ export function getProjectStoragePath(config, projectName) {
216
+ const projectManager = new ProjectManager(config.project_root);
217
+ return projectManager.getProjectStoragePath(projectName);
218
+ }
219
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { AskPerplexityParams, ResearchPerplexityParams, Config, PerplexityResponse, StreamingCallbacks, ErrorResponse, MCPResponse } from '../types.js';
2
+ /**
3
+ * Handles the ask_perplexity tool - stateless queries with optional streaming
4
+ */
5
+ export declare function handleAskPerplexity(params: AskPerplexityParams, config: Config, streamingCallbacks?: StreamingCallbacks): Promise<MCPResponse>;
6
+ /**
7
+ * Handles the research_perplexity tool - deep research with optional saving
8
+ */
9
+ export declare function handleResearchPerplexity(params: ResearchPerplexityParams, config: Config): Promise<(PerplexityResponse & {
10
+ report_saved?: boolean;
11
+ report_path?: string;
12
+ }) | ErrorResponse>;
13
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,MAAM,EACN,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,WAAW,EACZ,MAAM,aAAa,CAAC;AAKrB;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,kBAAkB,GACtC,OAAO,CAAC,WAAW,CAAC,CA0GtB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,wBAAwB,EAChC,MAAM,EAAE,MAAM,GACb,OAAO,CACR,CAAC,kBAAkB,GAAG;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,aAAa,CACxF,CA4FA"}