@orchestrator-claude/mcp-server 3.3.2 → 3.3.3

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.
@@ -0,0 +1,19 @@
1
+ /**
2
+ * PerplexityMcpServer
3
+ *
4
+ * Standalone MCP server for Perplexity AI research tools.
5
+ * Calls the Perplexity API directly (not via Orchestrator REST API).
6
+ *
7
+ * Usage: npx @orchestrator-claude/mcp-server --server perplexity
8
+ * Requires: PERPLEXITY_API_KEY environment variable
9
+ */
10
+ export declare class PerplexityMcpServer {
11
+ private server;
12
+ private client;
13
+ constructor();
14
+ private initializeClient;
15
+ private registerTools;
16
+ start(): Promise<void>;
17
+ close(): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=PerplexityMcpServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerplexityMcpServer.d.ts","sourceRoot":"","sources":["../src/PerplexityMcpServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqBH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAiC;;IAmB/C,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,aAAa;IA6Kf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * PerplexityMcpServer
3
+ *
4
+ * Standalone MCP server for Perplexity AI research tools.
5
+ * Calls the Perplexity API directly (not via Orchestrator REST API).
6
+ *
7
+ * Usage: npx @orchestrator-claude/mcp-server --server perplexity
8
+ * Requires: PERPLEXITY_API_KEY environment variable
9
+ */
10
+ import { z } from 'zod';
11
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
12
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
13
+ import { PerplexityClient } from './external/PerplexityClient.js';
14
+ import { PerplexityConfig } from './external/PerplexityConfig.js';
15
+ function formatError(error) {
16
+ return {
17
+ content: [{ type: 'text', text: JSON.stringify({ error: true, ...error }, null, 2) }],
18
+ isError: true,
19
+ };
20
+ }
21
+ function formatResult(data) {
22
+ return {
23
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
24
+ };
25
+ }
26
+ export class PerplexityMcpServer {
27
+ server;
28
+ client = null;
29
+ constructor() {
30
+ this.server = new McpServer({
31
+ name: 'perplexity',
32
+ version: '1.0.0',
33
+ }, {
34
+ capabilities: {
35
+ tools: {},
36
+ },
37
+ });
38
+ this.initializeClient();
39
+ this.registerTools();
40
+ }
41
+ initializeClient() {
42
+ const configResult = PerplexityConfig.fromEnv();
43
+ if (configResult.isOk()) {
44
+ this.client = PerplexityClient.create(configResult.unwrap());
45
+ console.error('[perplexity] Client initialized with API key.');
46
+ }
47
+ else {
48
+ console.error('[perplexity] Warning: PERPLEXITY_API_KEY not set. Server will use mock responses.');
49
+ }
50
+ }
51
+ registerTools() {
52
+ // search
53
+ this.server.registerTool('search', {
54
+ description: 'Search for information using Perplexity AI',
55
+ inputSchema: z.object({
56
+ query: z.string().describe('The search query'),
57
+ maxResults: z.number().optional().describe('Maximum number of results to return (default: 5)'),
58
+ recency: z
59
+ .enum(['day', 'week', 'month', 'year'])
60
+ .optional()
61
+ .describe('Filter results by recency'),
62
+ }),
63
+ }, async (input) => {
64
+ if (this.client) {
65
+ const options = {};
66
+ if (input.maxResults !== undefined)
67
+ options.maxResults = input.maxResults;
68
+ if (input.recency !== undefined)
69
+ options.recency = input.recency;
70
+ const result = await this.client.search(input.query, options);
71
+ if (result.isOk()) {
72
+ return formatResult(result.unwrap());
73
+ }
74
+ return formatError(result.unwrapErr());
75
+ }
76
+ return formatResult({
77
+ query: input.query,
78
+ results: [
79
+ {
80
+ title: `Result for: ${input.query}`,
81
+ snippet: `This is a mock search result for "${input.query}"`,
82
+ url: `https://example.com/search?q=${encodeURIComponent(input.query)}`,
83
+ relevance: 0.95,
84
+ },
85
+ ],
86
+ totalResults: 1,
87
+ searchTime: 0.5,
88
+ });
89
+ });
90
+ // getTopicContent
91
+ this.server.registerTool('getTopicContent', {
92
+ description: 'Get detailed content about a specific topic',
93
+ inputSchema: z.object({
94
+ topic: z.string().describe('The topic to get content about'),
95
+ depth: z
96
+ .enum(['brief', 'detailed'])
97
+ .optional()
98
+ .describe('Level of detail (default: brief)'),
99
+ }),
100
+ }, async (input) => {
101
+ if (this.client) {
102
+ const result = await this.client.getTopicContent(input.topic);
103
+ if (result.isOk()) {
104
+ return formatResult(result.unwrap());
105
+ }
106
+ return formatError(result.unwrapErr());
107
+ }
108
+ const isBrief = input.depth !== 'detailed';
109
+ return formatResult({
110
+ topic: input.topic,
111
+ content: isBrief
112
+ ? `Brief overview of ${input.topic}`
113
+ : `Detailed analysis of ${input.topic}. This includes comprehensive information about the subject matter, covering key aspects, history, and current developments.`,
114
+ sources: [
115
+ {
116
+ title: `${input.topic} - Wikipedia`,
117
+ url: `https://en.wikipedia.org/wiki/${encodeURIComponent(input.topic)}`,
118
+ },
119
+ ],
120
+ lastUpdated: new Date().toISOString(),
121
+ });
122
+ });
123
+ // isAvailable
124
+ this.server.registerTool('isAvailable', {
125
+ description: 'Check if the Perplexity API is available',
126
+ inputSchema: z.object({}),
127
+ }, async () => {
128
+ if (this.client) {
129
+ const available = await this.client.isAvailable();
130
+ return formatResult({
131
+ available,
132
+ timestamp: new Date().toISOString(),
133
+ });
134
+ }
135
+ return formatResult({
136
+ available: false,
137
+ reason: 'No Perplexity client configured',
138
+ timestamp: new Date().toISOString(),
139
+ });
140
+ });
141
+ // summarize
142
+ this.server.registerTool('summarize', {
143
+ description: 'Get a summarized overview of a topic with key facts',
144
+ inputSchema: z.object({
145
+ topic: z.string().describe('The topic to summarize'),
146
+ includeRecent: z
147
+ .boolean()
148
+ .optional()
149
+ .describe('Include recent news and developments (default: false)'),
150
+ }),
151
+ }, async (input) => {
152
+ if (this.client) {
153
+ const contentResult = await this.client.getTopicContent(input.topic);
154
+ if (contentResult.isErr()) {
155
+ return formatError(contentResult.unwrapErr());
156
+ }
157
+ const content = contentResult.unwrap();
158
+ let recentInfo = null;
159
+ if (input.includeRecent) {
160
+ const searchResult = await this.client.search(`${input.topic} latest news`, {
161
+ recency: 'week',
162
+ maxResults: 3,
163
+ });
164
+ if (searchResult.isOk()) {
165
+ recentInfo = searchResult.unwrap();
166
+ }
167
+ }
168
+ return formatResult({
169
+ topic: input.topic,
170
+ summary: content.content,
171
+ sources: content.sources,
172
+ recentDevelopments: recentInfo?.results ?? [],
173
+ generatedAt: new Date().toISOString(),
174
+ });
175
+ }
176
+ return formatResult({
177
+ topic: input.topic,
178
+ summary: `Summary of ${input.topic}: This is a comprehensive overview covering the main aspects and key points.`,
179
+ sources: [
180
+ {
181
+ title: `${input.topic} Overview`,
182
+ url: `https://example.com/${encodeURIComponent(input.topic)}`,
183
+ },
184
+ ],
185
+ recentDevelopments: input.includeRecent
186
+ ? [
187
+ {
188
+ title: `Latest on ${input.topic}`,
189
+ snippet: 'Recent developments in this area...',
190
+ url: `https://news.example.com/${encodeURIComponent(input.topic)}`,
191
+ },
192
+ ]
193
+ : [],
194
+ generatedAt: new Date().toISOString(),
195
+ });
196
+ });
197
+ }
198
+ async start() {
199
+ const transport = new StdioServerTransport();
200
+ await this.server.connect(transport);
201
+ process.on('SIGINT', async () => {
202
+ await this.server.close();
203
+ process.exit(0);
204
+ });
205
+ }
206
+ async close() {
207
+ await this.server.close();
208
+ }
209
+ }
210
+ //# sourceMappingURL=PerplexityMcpServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerplexityMcpServer.js","sourceRoot":"","sources":["../src/PerplexityMcpServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Perplexity API Client
3
+ *
4
+ * Self-contained client for the Perplexity AI API.
5
+ * Features: rate limiting, exponential backoff retry, request timeout.
6
+ */
7
+ import { type Result } from './Result.js';
8
+ import { PerplexityConfig } from './PerplexityConfig.js';
9
+ export interface PerplexitySearchOptions {
10
+ readonly maxResults?: number;
11
+ readonly recency?: 'day' | 'week' | 'month' | 'year';
12
+ readonly domains?: readonly string[];
13
+ readonly model?: string;
14
+ }
15
+ export interface PerplexitySearchResultItem {
16
+ readonly title: string;
17
+ readonly url: string;
18
+ readonly snippet: string;
19
+ readonly relevance: number;
20
+ }
21
+ export interface PerplexitySearchResult {
22
+ readonly query: string;
23
+ readonly results: readonly PerplexitySearchResultItem[];
24
+ readonly summary: string;
25
+ readonly model: string;
26
+ readonly timestamp: string;
27
+ }
28
+ export interface PerplexityContent {
29
+ readonly topic: string;
30
+ readonly content: string;
31
+ readonly sources: readonly string[];
32
+ readonly patterns: readonly string[];
33
+ readonly recommendations: readonly string[];
34
+ readonly timestamp: string;
35
+ }
36
+ export interface PerplexityError {
37
+ readonly code: string;
38
+ readonly message: string;
39
+ readonly details?: Record<string, unknown>;
40
+ readonly retryAfter?: number;
41
+ }
42
+ export declare class PerplexityClient {
43
+ private readonly config;
44
+ private requestTimestamps;
45
+ constructor(config: PerplexityConfig);
46
+ static create(config: PerplexityConfig): PerplexityClient;
47
+ search(query: string, options?: PerplexitySearchOptions): Promise<Result<PerplexitySearchResult, PerplexityError>>;
48
+ getTopicContent(topic: string): Promise<Result<PerplexityContent, PerplexityError>>;
49
+ isAvailable(): Promise<boolean>;
50
+ private makeRequest;
51
+ private canMakeRequest;
52
+ private recordRequest;
53
+ private getRetryAfterSeconds;
54
+ private sleep;
55
+ private extractResults;
56
+ private extractPatterns;
57
+ private extractRecommendations;
58
+ }
59
+ //# sourceMappingURL=PerplexityClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerplexityClient.d.ts","sourceRoot":"","sources":["../../src/external/PerplexityClient.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,0BAA0B,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAmCD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,iBAAiB,CAAgB;gBAE7B,MAAM,EAAE,gBAAgB;IAIpC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB;IAInD,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;IA4DrD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;IAyDnF,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;YAsBvB,WAAW;IA4EzB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,sBAAsB;CAU/B"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Perplexity API Client
3
+ *
4
+ * Self-contained client for the Perplexity AI API.
5
+ * Features: rate limiting, exponential backoff retry, request timeout.
6
+ */
7
+ import { ok, err } from './Result.js';
8
+ // --- Client ---
9
+ export class PerplexityClient {
10
+ config;
11
+ requestTimestamps = [];
12
+ constructor(config) {
13
+ this.config = config;
14
+ }
15
+ static create(config) {
16
+ return new PerplexityClient(config);
17
+ }
18
+ async search(query, options) {
19
+ if (!query || query.trim() === '') {
20
+ return err({
21
+ code: 'INVALID_QUERY',
22
+ message: 'Search query cannot be empty',
23
+ });
24
+ }
25
+ if (!this.canMakeRequest()) {
26
+ const retryAfter = this.getRetryAfterSeconds();
27
+ return err({
28
+ code: 'RATE_LIMITED',
29
+ message: `Rate limit exceeded. Try again in ${retryAfter} seconds.`,
30
+ retryAfter,
31
+ });
32
+ }
33
+ const request = {
34
+ model: options?.model ?? this.config.model,
35
+ messages: [
36
+ {
37
+ role: 'system',
38
+ content: 'You are a research assistant. Provide factual, well-sourced information. Format your response with clear sections.',
39
+ },
40
+ {
41
+ role: 'user',
42
+ content: query,
43
+ },
44
+ ],
45
+ max_tokens: 1024,
46
+ temperature: 0.2,
47
+ };
48
+ if (options?.recency) {
49
+ request.search_recency_filter = options.recency;
50
+ }
51
+ if (options?.domains && options.domains.length > 0) {
52
+ request.search_domain_filter = [...options.domains];
53
+ }
54
+ const result = await this.makeRequest(request);
55
+ if (result.isErr()) {
56
+ return err(result.unwrapErr());
57
+ }
58
+ const response = result.unwrap();
59
+ const content = response.choices[0]?.message.content ?? '';
60
+ return ok({
61
+ query,
62
+ results: this.extractResults(content, response.citations ?? []),
63
+ summary: content,
64
+ model: response.model,
65
+ timestamp: new Date().toISOString(),
66
+ });
67
+ }
68
+ async getTopicContent(topic) {
69
+ if (!topic || topic.trim() === '') {
70
+ return err({
71
+ code: 'INVALID_QUERY',
72
+ message: 'Topic cannot be empty',
73
+ });
74
+ }
75
+ if (!this.canMakeRequest()) {
76
+ const retryAfter = this.getRetryAfterSeconds();
77
+ return err({
78
+ code: 'RATE_LIMITED',
79
+ message: `Rate limit exceeded. Try again in ${retryAfter} seconds.`,
80
+ retryAfter,
81
+ });
82
+ }
83
+ const request = {
84
+ model: this.config.model,
85
+ messages: [
86
+ {
87
+ role: 'system',
88
+ content: `You are a software engineering expert. Provide detailed technical content about the requested topic.
89
+ Structure your response with:
90
+ 1. Overview
91
+ 2. Key patterns and best practices
92
+ 3. Recommendations
93
+ 4. Code examples if applicable`,
94
+ },
95
+ {
96
+ role: 'user',
97
+ content: `Provide comprehensive information about: ${topic}`,
98
+ },
99
+ ],
100
+ max_tokens: 2048,
101
+ temperature: 0.3,
102
+ };
103
+ const result = await this.makeRequest(request);
104
+ if (result.isErr()) {
105
+ return err(result.unwrapErr());
106
+ }
107
+ const response = result.unwrap();
108
+ const content = response.choices[0]?.message.content ?? '';
109
+ return ok({
110
+ topic,
111
+ content,
112
+ sources: response.citations ?? [],
113
+ patterns: this.extractPatterns(content),
114
+ recommendations: this.extractRecommendations(content),
115
+ timestamp: new Date().toISOString(),
116
+ });
117
+ }
118
+ async isAvailable() {
119
+ try {
120
+ const response = await fetch(`${this.config.baseUrl}/chat/completions`, {
121
+ method: 'POST',
122
+ headers: {
123
+ Authorization: `Bearer ${this.config.apiKey}`,
124
+ 'Content-Type': 'application/json',
125
+ },
126
+ body: JSON.stringify({
127
+ model: this.config.model,
128
+ messages: [{ role: 'user', content: 'test' }],
129
+ max_tokens: 1,
130
+ }),
131
+ signal: AbortSignal.timeout(5000),
132
+ });
133
+ return response.status === 200 || response.status === 401;
134
+ }
135
+ catch {
136
+ return false;
137
+ }
138
+ }
139
+ async makeRequest(request) {
140
+ let lastError = null;
141
+ for (let attempt = 0; attempt < this.config.maxRetries; attempt++) {
142
+ if (attempt > 0) {
143
+ const delay = Math.pow(2, attempt) * 1000;
144
+ await this.sleep(delay);
145
+ }
146
+ try {
147
+ this.recordRequest();
148
+ const response = await fetch(`${this.config.baseUrl}/chat/completions`, {
149
+ method: 'POST',
150
+ headers: {
151
+ Authorization: `Bearer ${this.config.apiKey}`,
152
+ 'Content-Type': 'application/json',
153
+ },
154
+ body: JSON.stringify(request),
155
+ signal: AbortSignal.timeout(this.config.timeout),
156
+ });
157
+ if (response.ok) {
158
+ const data = (await response.json());
159
+ return ok(data);
160
+ }
161
+ if (response.status === 429) {
162
+ lastError = {
163
+ code: 'RATE_LIMITED',
164
+ message: 'API rate limit exceeded',
165
+ retryAfter: parseInt(response.headers.get('Retry-After') ?? '60', 10),
166
+ };
167
+ continue;
168
+ }
169
+ if (response.status >= 500) {
170
+ lastError = {
171
+ code: 'API_ERROR',
172
+ message: `Server error: ${response.status}`,
173
+ details: { status: response.status },
174
+ };
175
+ continue;
176
+ }
177
+ const errorBody = await response.text();
178
+ return err({
179
+ code: 'API_ERROR',
180
+ message: `API error: ${response.status}`,
181
+ details: { status: response.status, body: errorBody },
182
+ });
183
+ }
184
+ catch (error) {
185
+ if (error instanceof Error && error.name === 'TimeoutError') {
186
+ lastError = {
187
+ code: 'TIMEOUT',
188
+ message: `Request timed out after ${this.config.timeout}ms`,
189
+ };
190
+ continue;
191
+ }
192
+ lastError = {
193
+ code: 'NETWORK_ERROR',
194
+ message: error instanceof Error ? error.message : 'Network error',
195
+ };
196
+ continue;
197
+ }
198
+ }
199
+ return err(lastError ?? {
200
+ code: 'API_ERROR',
201
+ message: 'Request failed after max retries',
202
+ });
203
+ }
204
+ canMakeRequest() {
205
+ const now = Date.now();
206
+ const oneMinuteAgo = now - 60000;
207
+ this.requestTimestamps = this.requestTimestamps.filter((ts) => ts > oneMinuteAgo);
208
+ return this.requestTimestamps.length < this.config.rateLimitPerMinute;
209
+ }
210
+ recordRequest() {
211
+ this.requestTimestamps.push(Date.now());
212
+ }
213
+ getRetryAfterSeconds() {
214
+ if (this.requestTimestamps.length === 0)
215
+ return 0;
216
+ const oldestTimestamp = Math.min(...this.requestTimestamps);
217
+ const waitUntil = oldestTimestamp + 60000;
218
+ return Math.ceil((waitUntil - Date.now()) / 1000);
219
+ }
220
+ sleep(ms) {
221
+ return new Promise((resolve) => setTimeout(resolve, ms));
222
+ }
223
+ extractResults(content, citations) {
224
+ return citations.map((url, index) => ({
225
+ title: `Source ${index + 1}`,
226
+ url,
227
+ snippet: content.slice(0, 200),
228
+ relevance: 1 - index * 0.1,
229
+ }));
230
+ }
231
+ extractPatterns(content) {
232
+ const patterns = [];
233
+ const patternMatch = content.match(/pattern[s]?:?\s*([^\n]+)/gi);
234
+ if (patternMatch) {
235
+ patterns.push(...patternMatch.map((m) => m.replace(/pattern[s]?:?\s*/i, '').trim()));
236
+ }
237
+ return patterns;
238
+ }
239
+ extractRecommendations(content) {
240
+ const recommendations = [];
241
+ const recMatch = content.match(/recommend[ation]?[s]?:?\s*([^\n]+)/gi);
242
+ if (recMatch) {
243
+ recommendations.push(...recMatch.map((m) => m.replace(/recommend[ation]?[s]?:?\s*/i, '').trim()));
244
+ }
245
+ return recommendations;
246
+ }
247
+ }
248
+ //# sourceMappingURL=PerplexityClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerplexityClient.js","sourceRoot":"","sources":["../../src/external/PerplexityClient.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAe,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AA0EnD,iBAAiB;AAEjB,MAAM,OAAO,gBAAgB;IACV,MAAM,CAAmB;IAClC,iBAAiB,GAAa,EAAE,CAAC;IAEzC,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,MAAwB;QACpC,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAAa,EACb,OAAiC;QAEjC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClC,OAAO,GAAG,CAAC;gBACT,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,8BAA8B;aACxC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/C,OAAO,GAAG,CAAC;gBACT,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,qCAAqC,UAAU,WAAW;gBACnE,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAyB;YACpC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK;YAC1C,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EACL,oHAAoH;iBACvH;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,KAAK;iBACf;aACF;YACD,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,GAAG;SACjB,CAAC;QAEF,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC;QAClD,CAAC;QAED,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,oBAAoB,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAwB,OAAO,CAAC,CAAC;QAEtE,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAE3D,OAAO,EAAE,CAAC;YACR,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;YAC/D,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa;QACjC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClC,OAAO,GAAG,CAAC;gBACT,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC/C,OAAO,GAAG,CAAC;gBACT,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,qCAAqC,UAAU,WAAW;gBACnE,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAyB;YACpC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE;;;;;+BAKY;iBACtB;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,4CAA4C,KAAK,EAAE;iBAC7D;aACF;YACD,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,GAAG;SACjB,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAwB,OAAO,CAAC,CAAC;QAEtE,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAE3D,OAAO,EAAE,CAAC;YACR,KAAK;YACL,OAAO;YACP,OAAO,EAAE,QAAQ,CAAC,SAAS,IAAI,EAAE;YACjC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YACvC,eAAe,EAAE,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC;YACrD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,mBAAmB,EAAE;gBACtE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;oBAC7C,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;oBACxB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;oBAC7C,UAAU,EAAE,CAAC;iBACd,CAAC;gBACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAI,OAA6B;QACxD,IAAI,SAAS,GAA2B,IAAI,CAAC;QAE7C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAClE,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;gBAC1C,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,CAAC,aAAa,EAAE,CAAC;gBAErB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,mBAAmB,EAAE;oBACtE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;wBAC7C,cAAc,EAAE,kBAAkB;qBACnC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;oBAC7B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;iBACjD,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;oBAC1C,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;gBAClB,CAAC;gBAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,SAAS,GAAG;wBACV,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,yBAAyB;wBAClC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;qBACtE,CAAC;oBACF,SAAS;gBACX,CAAC;gBAED,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;oBAC3B,SAAS,GAAG;wBACV,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,iBAAiB,QAAQ,CAAC,MAAM,EAAE;wBAC3C,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE;qBACrC,CAAC;oBACF,SAAS;gBACX,CAAC;gBAED,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,GAAG,CAAC;oBACT,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,cAAc,QAAQ,CAAC,MAAM,EAAE;oBACxC,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE;iBACtD,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBAC5D,SAAS,GAAG;wBACV,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,2BAA2B,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI;qBAC5D,CAAC;oBACF,SAAS;gBACX,CAAC;gBAED,SAAS,GAAG;oBACV,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAClE,CAAC;gBACF,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CACR,SAAS,IAAI;YACX,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,kCAAkC;SAC5C,CACF,CAAC;IACJ,CAAC;IAEO,cAAc;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,GAAG,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;IACxE,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,eAAe,GAAG,KAAK,CAAC;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEO,cAAc,CACpB,OAAe,EACf,SAAmB;QAEnB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACpC,KAAK,EAAE,UAAU,KAAK,GAAG,CAAC,EAAE;YAC5B,GAAG;YACH,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAC9B,SAAS,EAAE,CAAC,GAAG,KAAK,GAAG,GAAG;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACjE,IAAI,YAAY,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,sBAAsB,CAAC,OAAe;QAC5C,MAAM,eAAe,GAAa,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACvE,IAAI,QAAQ,EAAE,CAAC;YACb,eAAe,CAAC,IAAI,CAClB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAC5E,CAAC;QACJ,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Perplexity API Configuration
3
+ *
4
+ * Self-contained configuration for the Perplexity AI client.
5
+ * Reads from environment variables with sensible defaults.
6
+ */
7
+ import { type Result } from './Result.js';
8
+ export interface PerplexityConfigOptions {
9
+ apiKey?: string;
10
+ baseUrl?: string;
11
+ timeout?: number;
12
+ maxRetries?: number;
13
+ rateLimitPerMinute?: number;
14
+ model?: string;
15
+ }
16
+ export interface PerplexityConfigError {
17
+ code: 'MISSING_API_KEY' | 'INVALID_CONFIG';
18
+ message: string;
19
+ }
20
+ export interface ValidatedPerplexityConfig {
21
+ readonly apiKey: string;
22
+ readonly baseUrl: string;
23
+ readonly timeout: number;
24
+ readonly maxRetries: number;
25
+ readonly rateLimitPerMinute: number;
26
+ readonly model: string;
27
+ }
28
+ export declare class PerplexityConfig {
29
+ private readonly config;
30
+ private constructor();
31
+ static create(options?: PerplexityConfigOptions): Result<PerplexityConfig, PerplexityConfigError>;
32
+ static fromEnv(): Result<PerplexityConfig, PerplexityConfigError>;
33
+ get apiKey(): string;
34
+ get baseUrl(): string;
35
+ get timeout(): number;
36
+ get maxRetries(): number;
37
+ get rateLimitPerMinute(): number;
38
+ get model(): string;
39
+ }
40
+ //# sourceMappingURL=PerplexityConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerplexityConfig.d.ts","sourceRoot":"","sources":["../../src/external/PerplexityConfig.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAQD,qBAAa,gBAAgB;IACP,OAAO,CAAC,QAAQ,CAAC,MAAM;IAA3C,OAAO;IAEP,MAAM,CAAC,MAAM,CACX,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;IAuBlD,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;IAIjE,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;CACF"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Perplexity API Configuration
3
+ *
4
+ * Self-contained configuration for the Perplexity AI client.
5
+ * Reads from environment variables with sensible defaults.
6
+ */
7
+ import { ok, err } from './Result.js';
8
+ const DEFAULT_BASE_URL = 'https://api.perplexity.ai';
9
+ const DEFAULT_TIMEOUT = 30000;
10
+ const DEFAULT_MAX_RETRIES = 3;
11
+ const DEFAULT_RATE_LIMIT = 10;
12
+ const DEFAULT_MODEL = 'sonar';
13
+ export class PerplexityConfig {
14
+ config;
15
+ constructor(config) {
16
+ this.config = config;
17
+ }
18
+ static create(options = {}) {
19
+ const apiKey = options.apiKey ?? process.env.PERPLEXITY_API_KEY;
20
+ if (!apiKey || apiKey.trim() === '') {
21
+ return err({
22
+ code: 'MISSING_API_KEY',
23
+ message: 'Perplexity API key is required. Set PERPLEXITY_API_KEY env var or pass apiKey option.',
24
+ });
25
+ }
26
+ const config = {
27
+ apiKey: apiKey.trim(),
28
+ baseUrl: options.baseUrl ?? process.env.PERPLEXITY_BASE_URL ?? DEFAULT_BASE_URL,
29
+ timeout: options.timeout ?? DEFAULT_TIMEOUT,
30
+ maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,
31
+ rateLimitPerMinute: options.rateLimitPerMinute ?? DEFAULT_RATE_LIMIT,
32
+ model: options.model ?? process.env.PERPLEXITY_MODEL ?? DEFAULT_MODEL,
33
+ };
34
+ return ok(new PerplexityConfig(config));
35
+ }
36
+ static fromEnv() {
37
+ return PerplexityConfig.create({});
38
+ }
39
+ get apiKey() {
40
+ return this.config.apiKey;
41
+ }
42
+ get baseUrl() {
43
+ return this.config.baseUrl;
44
+ }
45
+ get timeout() {
46
+ return this.config.timeout;
47
+ }
48
+ get maxRetries() {
49
+ return this.config.maxRetries;
50
+ }
51
+ get rateLimitPerMinute() {
52
+ return this.config.rateLimitPerMinute;
53
+ }
54
+ get model() {
55
+ return this.config.model;
56
+ }
57
+ }
58
+ //# sourceMappingURL=PerplexityConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerplexityConfig.js","sourceRoot":"","sources":["../../src/external/PerplexityConfig.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAe,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAyBnD,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AACrD,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,aAAa,GAAG,OAAO,CAAC;AAE9B,MAAM,OAAO,gBAAgB;IACU;IAArC,YAAqC,MAAiC;QAAjC,WAAM,GAAN,MAAM,CAA2B;IAAG,CAAC;IAE1E,MAAM,CAAC,MAAM,CACX,UAAmC,EAAE;QAErC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAEhE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACpC,OAAO,GAAG,CAAC;gBACT,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EACL,uFAAuF;aAC1F,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAA8B;YACxC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;YACrB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,gBAAgB;YAC/E,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,eAAe;YAC3C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,mBAAmB;YACrD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,kBAAkB;YACpE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,aAAa;SACtE,CAAC;QAEF,OAAO,EAAE,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,OAAO;QACZ,OAAO,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAChC,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;IACxC,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Minimal Result Type for Perplexity Client
3
+ *
4
+ * Railway-oriented programming pattern for error handling.
5
+ * Subset of the main project's Result type, self-contained for the thin client package.
6
+ */
7
+ export type Result<T, E> = Ok<T, E> | Err<T, E>;
8
+ export declare class Ok<T, E> {
9
+ readonly value: T;
10
+ constructor(value: T);
11
+ isOk(): this is Ok<T, E>;
12
+ isErr(): this is Err<T, E>;
13
+ unwrap(): T;
14
+ unwrapErr(): E;
15
+ }
16
+ export declare class Err<T, E> {
17
+ readonly error: E;
18
+ constructor(error: E);
19
+ isOk(): this is Ok<T, E>;
20
+ isErr(): this is Err<T, E>;
21
+ unwrap(): T;
22
+ unwrapErr(): E;
23
+ }
24
+ export declare const ok: <T, E = never>(value: T) => Result<T, E>;
25
+ export declare const err: <E, T = never>(error: E) => Result<T, E>;
26
+ //# sourceMappingURL=Result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Result.d.ts","sourceRoot":"","sources":["../../src/external/Result.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEhD,qBAAa,EAAE,CAAC,CAAC,EAAE,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;gBAEN,KAAK,EAAE,CAAC;IAIpB,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAIxB,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAI1B,MAAM,IAAI,CAAC;IAIX,SAAS,IAAI,CAAC;CAGf;AAED,qBAAa,GAAG,CAAC,CAAC,EAAE,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;gBAEN,KAAK,EAAE,CAAC;IAIpB,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAIxB,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAI1B,MAAM,IAAI,CAAC;IAIX,SAAS,IAAI,CAAC;CAGf;AAED,eAAO,MAAM,EAAE,GAAI,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAkB,CAAC;AAC1E,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAmB,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Minimal Result Type for Perplexity Client
3
+ *
4
+ * Railway-oriented programming pattern for error handling.
5
+ * Subset of the main project's Result type, self-contained for the thin client package.
6
+ */
7
+ export class Ok {
8
+ value;
9
+ constructor(value) {
10
+ this.value = value;
11
+ }
12
+ isOk() {
13
+ return true;
14
+ }
15
+ isErr() {
16
+ return false;
17
+ }
18
+ unwrap() {
19
+ return this.value;
20
+ }
21
+ unwrapErr() {
22
+ throw new Error('Called unwrapErr on Ok value');
23
+ }
24
+ }
25
+ export class Err {
26
+ error;
27
+ constructor(error) {
28
+ this.error = error;
29
+ }
30
+ isOk() {
31
+ return false;
32
+ }
33
+ isErr() {
34
+ return true;
35
+ }
36
+ unwrap() {
37
+ throw new Error(`Called unwrap on Err value: ${String(this.error)}`);
38
+ }
39
+ unwrapErr() {
40
+ return this.error;
41
+ }
42
+ }
43
+ export const ok = (value) => new Ok(value);
44
+ export const err = (error) => new Err(error);
45
+ //# sourceMappingURL=Result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Result.js","sourceRoot":"","sources":["../../src/external/Result.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,OAAO,EAAE;IACJ,KAAK,CAAI;IAElB,YAAY,KAAQ;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,SAAS;QACP,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;CACF;AAED,MAAM,OAAO,GAAG;IACL,KAAK,CAAI;IAElB,YAAY,KAAQ;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,EAAE,GAAG,CAAe,KAAQ,EAAgB,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,GAAG,GAAG,CAAe,KAAQ,EAAgB,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -2,10 +2,14 @@
2
2
  /**
3
3
  * MCP Thin Client Entry Point
4
4
  *
5
- * This is a thin client that delegates all operations to the Orchestrator REST API.
6
- * It implements the Model Context Protocol (MCP) server interface.
5
+ * Supports multiple server modes via --server flag:
6
+ * --server core → orchestrator-tools (core ~59 tools)
7
+ * --server extended → orchestrator-extended (11 tools)
8
+ * --server perplexity → perplexity (4 tools, calls Perplexity API directly)
9
+ * (default) → uses MCP_TOOL_SET env var, falls back to 'all'
7
10
  */
8
11
  export { OrchestratorMcpServer } from './server.js';
12
+ export { PerplexityMcpServer } from './PerplexityMcpServer.js';
9
13
  export { OrchestratorApiClient } from './client/OrchestratorApiClient.js';
10
14
  export { loadConfig } from './config.js';
11
15
  export type { Config } from './config.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAuCH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAkEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -2,18 +2,44 @@
2
2
  /**
3
3
  * MCP Thin Client Entry Point
4
4
  *
5
- * This is a thin client that delegates all operations to the Orchestrator REST API.
6
- * It implements the Model Context Protocol (MCP) server interface.
5
+ * Supports multiple server modes via --server flag:
6
+ * --server core → orchestrator-tools (core ~59 tools)
7
+ * --server extended → orchestrator-extended (11 tools)
8
+ * --server perplexity → perplexity (4 tools, calls Perplexity API directly)
9
+ * (default) → uses MCP_TOOL_SET env var, falls back to 'all'
7
10
  */
8
11
  import { realpathSync } from 'fs';
9
12
  import { fileURLToPath } from 'url';
10
13
  import { OrchestratorMcpServer } from './server.js';
14
+ import { PerplexityMcpServer } from './PerplexityMcpServer.js';
11
15
  import { loadConfig } from './config.js';
16
+ /**
17
+ * Parse --server <type> from process.argv
18
+ */
19
+ function parseServerArg() {
20
+ const idx = process.argv.indexOf('--server');
21
+ if (idx !== -1 && idx + 1 < process.argv.length) {
22
+ return process.argv[idx + 1];
23
+ }
24
+ return undefined;
25
+ }
12
26
  /**
13
27
  * Main entry point for CLI execution
14
28
  */
15
29
  async function main() {
16
30
  try {
31
+ const serverArg = parseServerArg();
32
+ // Perplexity mode: standalone server that calls Perplexity API directly
33
+ if (serverArg === 'perplexity') {
34
+ console.error('Starting Perplexity MCP Server...');
35
+ const server = new PerplexityMcpServer();
36
+ await server.start();
37
+ return;
38
+ }
39
+ // Override MCP_TOOL_SET from --server arg if provided
40
+ if (serverArg) {
41
+ process.env.MCP_TOOL_SET = serverArg;
42
+ }
17
43
  const config = loadConfig();
18
44
  const server = new OrchestratorMcpServer(config);
19
45
  console.error('Starting Orchestrator MCP Server...');
@@ -37,6 +63,7 @@ if (isEntryPoint) {
37
63
  }
38
64
  // Re-export for library usage
39
65
  export { OrchestratorMcpServer } from './server.js';
66
+ export { PerplexityMcpServer } from './PerplexityMcpServer.js';
40
67
  export { OrchestratorApiClient } from './client/OrchestratorApiClient.js';
41
68
  export { loadConfig } from './config.js';
42
69
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAEjD,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE7E,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,+CAA+C;AAC/C,yDAAyD;AACzD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,YAAY,GAChB,WAAW,KAAK,UAAU;IAC1B,YAAY,CAAC,WAAW,CAAC,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC;AAEzD,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC;AACT,CAAC;AAED,8BAA8B;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;QAEnC,wEAAwE;QACxE,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACzC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,sDAAsD;QACtD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAEjD,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE7E,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,+CAA+C;AAC/C,yDAAyD;AACzD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,YAAY,GAChB,WAAW,KAAK,UAAU;IAC1B,YAAY,CAAC,WAAW,CAAC,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC;AAEzD,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC;AACT,CAAC;AAED,8BAA8B;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orchestrator-claude/mcp-server",
3
- "version": "3.3.2",
3
+ "version": "3.3.3",
4
4
  "description": "MCP Thin Client for Orchestrator - delegates to REST API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",