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,111 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from 'child_process';
3
+ import { createServer } from 'http';
4
+ import { join, dirname } from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ const projectRoot = dirname(__dirname);
9
+ // Default port for Claude Code
10
+ const DEFAULT_PORT = 8124;
11
+ function log(message) {
12
+ console.error(`[claude-code-bridge] ${message}`);
13
+ }
14
+ /**
15
+ * Check if a port is available
16
+ */
17
+ async function isPortAvailable(port) {
18
+ return new Promise(resolve => {
19
+ const server = createServer();
20
+ server.listen(port, () => {
21
+ server.close(() => resolve(true));
22
+ });
23
+ server.on('error', () => resolve(false));
24
+ });
25
+ }
26
+ /**
27
+ * Simple health check without AbortSignal.timeout (Node 18 compatibility)
28
+ */
29
+ async function checkServerHealth(port) {
30
+ return new Promise(resolve => {
31
+ const timeout = setTimeout(() => {
32
+ resolve(false);
33
+ }, 2000); // 2 second timeout
34
+ fetch(`http://localhost:${port}/health`)
35
+ .then(response => {
36
+ clearTimeout(timeout);
37
+ resolve(response.ok);
38
+ })
39
+ .catch(() => {
40
+ clearTimeout(timeout);
41
+ resolve(false);
42
+ });
43
+ });
44
+ }
45
+ /**
46
+ * Start the HTTP server and return its process
47
+ */
48
+ function startHttpServer(port) {
49
+ return new Promise((resolve, reject) => {
50
+ const serverPath = join(projectRoot, 'dist', 'index.js');
51
+ log(`Starting HTTP server on port ${port}...`);
52
+ const serverProcess = spawn('node', [serverPath, `--port=${port}`], {
53
+ stdio: 'inherit',
54
+ env: { ...process.env },
55
+ cwd: projectRoot,
56
+ });
57
+ serverProcess.on('error', error => {
58
+ reject(new Error(`Failed to start HTTP server: ${error.message}`));
59
+ });
60
+ // Give the server a moment to start up
61
+ setTimeout(() => {
62
+ resolve();
63
+ }, 1000);
64
+ });
65
+ }
66
+ async function main() {
67
+ try {
68
+ // Check if server is already running
69
+ if (await checkServerHealth(DEFAULT_PORT)) {
70
+ log(`Found existing server on port ${DEFAULT_PORT}`);
71
+ // For Claude Code, we need to act as a stdio bridge to the HTTP server
72
+ const { StdioHttpBridge } = await import('./stdio-bridge.js');
73
+ const bridge = new StdioHttpBridge();
74
+ await bridge.start();
75
+ return;
76
+ }
77
+ // Check if port is available
78
+ if (!(await isPortAvailable(DEFAULT_PORT))) {
79
+ throw new Error(`Port ${DEFAULT_PORT} is not available`);
80
+ }
81
+ // Start new HTTP server
82
+ await startHttpServer(DEFAULT_PORT);
83
+ // Wait for server to be healthy
84
+ let attempts = 0;
85
+ const maxAttempts = 10;
86
+ while (attempts < maxAttempts) {
87
+ if (await checkServerHealth(DEFAULT_PORT)) {
88
+ log(`Server is healthy on port ${DEFAULT_PORT}`);
89
+ break;
90
+ }
91
+ attempts++;
92
+ await new Promise(resolve => setTimeout(resolve, 500));
93
+ }
94
+ if (attempts >= maxAttempts) {
95
+ throw new Error('Server failed to become healthy after startup');
96
+ }
97
+ // Act as stdio bridge
98
+ const { StdioHttpBridge } = await import('./stdio-bridge.js');
99
+ const bridge = new StdioHttpBridge();
100
+ await bridge.start();
101
+ }
102
+ catch (error) {
103
+ log(`Error: ${error instanceof Error ? error.message : String(error)}`);
104
+ process.exit(1);
105
+ }
106
+ }
107
+ main().catch(error => {
108
+ log(`Bridge error: ${error}`);
109
+ process.exit(1);
110
+ });
111
+ //# sourceMappingURL=claude-code-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-bridge.js","sourceRoot":"","sources":["../src/claude-code-bridge.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAEvC,+BAA+B;AAC/B,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,SAAS,GAAG,CAAC,OAAe;IAC1B,OAAO,CAAC,KAAK,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAE9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAC3C,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,mBAAmB;QAE7B,KAAK,CAAC,oBAAoB,IAAI,SAAS,CAAC;aACrC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACf,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAEzD,GAAG,CAAC,gCAAgC,IAAI,KAAK,CAAC,CAAC;QAC/C,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE;YAClE,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;YACvB,GAAG,EAAE,WAAW;SACjB,CAAC,CAAC;QAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;YAChC,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,qCAAqC;QACrC,IAAI,MAAM,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1C,GAAG,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;YACrD,uEAAuE;YACvE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,QAAQ,YAAY,mBAAmB,CAAC,CAAC;QAC3D,CAAC;QAED,wBAAwB;QACxB,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC;QAEpC,gCAAgC;QAChC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,OAAO,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC9B,IAAI,MAAM,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC1C,GAAG,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;gBACjD,MAAM;YACR,CAAC;YACD,QAAQ,EAAE,CAAC;YACX,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,sBAAsB;QACtB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACnB,GAAG,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=http-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-index.d.ts","sourceRoot":"","sources":["../src/http-index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ import { createHTTPStreamingServer } from './http-streaming-server.js';
3
+ import { configSchema } from './types.js';
4
+ // Default port
5
+ let PORT = 8125;
6
+ // Parse command-line arguments for --port=XXXX
7
+ for (let i = 2; i < process.argv.length; i++) {
8
+ const arg = process.argv[i];
9
+ if (arg.startsWith('--port=')) {
10
+ const value = parseInt(arg.split('=')[1], 10);
11
+ if (!isNaN(value)) {
12
+ PORT = value;
13
+ }
14
+ else {
15
+ console.error('Invalid value for --port');
16
+ process.exit(1);
17
+ }
18
+ }
19
+ }
20
+ // Load configuration
21
+ const config = {
22
+ api_key: process.env.PERPLEXITY_API_KEY || '',
23
+ default_model: 'sonar-reasoning-pro',
24
+ project_root: process.cwd(),
25
+ storage_path: '.perplexity',
26
+ };
27
+ // Validate configuration
28
+ const validatedConfig = configSchema.parse(config);
29
+ const app = createHTTPStreamingServer(validatedConfig);
30
+ app.listen(PORT, () => {
31
+ console.log(`MCP Perplexity HTTP Streaming Server listening on port ${PORT}`);
32
+ console.log(`Claude Code can connect using: claude mcp add --transport http perplexity-http http://localhost:${PORT}`);
33
+ });
34
+ process.on('SIGINT', () => {
35
+ console.log('Shutting down HTTP streaming server...');
36
+ process.exit(0);
37
+ });
38
+ //# sourceMappingURL=http-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-index.js","sourceRoot":"","sources":["../src/http-index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAe;AACf,IAAI,IAAI,GAAG,IAAI,CAAC;AAEhB,+CAA+C;AAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAClB,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,qBAAqB;AACrB,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE;IAC7C,aAAa,EAAE,qBAAqB;IACpC,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE;IAC3B,YAAY,EAAE,aAAa;CAC5B,CAAC;AAEF,yBAAyB;AACzB,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,GAAG,GAAG,yBAAyB,CAAC,eAAe,CAAC,CAAC;AAEvD,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,0DAA0D,IAAI,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CACT,mGAAmG,IAAI,EAAE,CAC1G,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import { Request, Response } from 'express';
3
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
4
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
5
+ import { configSchema } from './types.js';
6
+ import { z } from 'zod';
7
+ export declare class PerplexityHTTPServer {
8
+ private config;
9
+ server: Server;
10
+ transports: {
11
+ [sessionId: string]: StreamableHTTPServerTransport;
12
+ };
13
+ constructor(config: z.infer<typeof configSchema>);
14
+ handleGetRequest(req: Request, res: Response): Promise<void>;
15
+ handlePostRequest(req: Request, res: Response): Promise<void>;
16
+ cleanup(): Promise<void>;
17
+ private setupHandlers;
18
+ /**
19
+ * Handle a tool call with streaming LoggingMessageNotifications
20
+ */
21
+ private handleStreamingTool;
22
+ /**
23
+ * Send a streaming message notification
24
+ */
25
+ private sendStreamingMessage;
26
+ /**
27
+ * Split text into chunks for streaming
28
+ */
29
+ private chunkText;
30
+ private createErrorResponse;
31
+ private isInitializeRequest;
32
+ }
33
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AASnG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,qBAAa,oBAAoB;IAInB,OAAO,CAAC,MAAM;IAH1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE;QAAE,CAAC,SAAS,EAAE,MAAM,GAAG,6BAA6B,CAAA;KAAE,CAAM;gBAEpD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC;IAiBlD,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAc5C,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAuC7C,OAAO;IAIb,OAAO,CAAC,aAAa;IAyOrB;;OAEG;YACW,mBAAmB;IAyCjC;;OAEG;YACW,oBAAoB;IAiBlC;;OAEG;IACH,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,mBAAmB;CAU5B"}
@@ -0,0 +1,362 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, InitializeRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { randomUUID } from 'crypto';
6
+ import { handleAskPerplexity, handleResearchPerplexity } from './tools/query.js';
7
+ import { handleChatPerplexity } from './tools/chat.js';
8
+ const SESSION_ID_HEADER_NAME = 'mcp-session-id';
9
+ const JSON_RPC = '2.0';
10
+ export class PerplexityHTTPServer {
11
+ config;
12
+ server;
13
+ transports = {};
14
+ constructor(config) {
15
+ this.config = config;
16
+ this.server = new Server({
17
+ name: 'mcp-perplexity-pro',
18
+ version: '1.0.0',
19
+ }, {
20
+ capabilities: {
21
+ tools: {},
22
+ logging: {},
23
+ },
24
+ });
25
+ this.setupHandlers();
26
+ }
27
+ async handleGetRequest(req, res) {
28
+ const sessionId = req.headers['mcp-session-id'];
29
+ if (!sessionId || !this.transports[sessionId]) {
30
+ res.status(400).json(this.createErrorResponse('Bad Request: invalid session ID or method.'));
31
+ return;
32
+ }
33
+ console.log(`Establishing SSE stream for session ${sessionId}`);
34
+ const transport = this.transports[sessionId];
35
+ await transport.handleRequest(req, res);
36
+ return;
37
+ }
38
+ async handlePostRequest(req, res) {
39
+ const sessionId = req.headers[SESSION_ID_HEADER_NAME];
40
+ let transport;
41
+ try {
42
+ // reuse existing transport
43
+ if (sessionId && this.transports[sessionId]) {
44
+ transport = this.transports[sessionId];
45
+ await transport.handleRequest(req, res, req.body);
46
+ return;
47
+ }
48
+ // create new transport
49
+ if (!sessionId && this.isInitializeRequest(req.body)) {
50
+ const transport = new StreamableHTTPServerTransport({
51
+ sessionIdGenerator: () => randomUUID(),
52
+ });
53
+ await this.server.connect(transport);
54
+ await transport.handleRequest(req, res, req.body);
55
+ // session ID will only be available after handling the first request
56
+ const sessionId = transport.sessionId;
57
+ if (sessionId) {
58
+ this.transports[sessionId] = transport;
59
+ }
60
+ return;
61
+ }
62
+ res.status(400).json(this.createErrorResponse('Bad Request: invalid session ID or method.'));
63
+ return;
64
+ }
65
+ catch (error) {
66
+ console.error('Error handling MCP request:', error);
67
+ res.status(500).json(this.createErrorResponse('Internal server error.'));
68
+ return;
69
+ }
70
+ }
71
+ async cleanup() {
72
+ await this.server.close();
73
+ }
74
+ setupHandlers() {
75
+ // List available tools
76
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
77
+ tools: [
78
+ {
79
+ name: 'ask_perplexity',
80
+ description: 'Query Perplexity with automatic model selection based on complexity.',
81
+ inputSchema: {
82
+ type: 'object',
83
+ properties: {
84
+ query: {
85
+ type: 'string',
86
+ description: 'The question or topic to research',
87
+ },
88
+ model: {
89
+ type: 'string',
90
+ description: 'Override default model selection',
91
+ enum: [
92
+ 'sonar',
93
+ 'sonar-pro',
94
+ 'sonar-reasoning',
95
+ 'sonar-reasoning-pro',
96
+ 'sonar-deep-research',
97
+ ],
98
+ },
99
+ max_tokens: {
100
+ type: 'number',
101
+ description: 'Maximum response length',
102
+ minimum: 1,
103
+ },
104
+ temperature: {
105
+ type: 'number',
106
+ description: '0.0-1.0, default 0.2',
107
+ minimum: 0,
108
+ maximum: 1,
109
+ },
110
+ search_domain_filter: {
111
+ type: 'array',
112
+ items: { type: 'string' },
113
+ description: 'Limit search to specific domains',
114
+ },
115
+ return_images: {
116
+ type: 'boolean',
117
+ description: 'Include images in response',
118
+ },
119
+ return_related_questions: {
120
+ type: 'boolean',
121
+ description: 'Include related questions',
122
+ },
123
+ save_report: {
124
+ type: 'boolean',
125
+ description: 'Save response as a report to project directory',
126
+ },
127
+ project_name: {
128
+ type: 'string',
129
+ description: 'Project name for organizing conversations (auto-detected if not provided)',
130
+ },
131
+ },
132
+ required: ['query'],
133
+ },
134
+ },
135
+ {
136
+ name: 'research_perplexity',
137
+ description: 'Conduct comprehensive research using sonar-deep-research model.',
138
+ inputSchema: {
139
+ type: 'object',
140
+ properties: {
141
+ topic: {
142
+ type: 'string',
143
+ description: 'Research topic or question',
144
+ },
145
+ model: {
146
+ type: 'string',
147
+ description: 'Override default model (defaults to sonar-deep-research)',
148
+ enum: [
149
+ 'sonar',
150
+ 'sonar-pro',
151
+ 'sonar-reasoning',
152
+ 'sonar-reasoning-pro',
153
+ 'sonar-deep-research',
154
+ ],
155
+ },
156
+ max_tokens: {
157
+ type: 'number',
158
+ description: 'Maximum response length',
159
+ minimum: 1,
160
+ },
161
+ save_report: {
162
+ type: 'boolean',
163
+ description: 'Save report to project directory',
164
+ },
165
+ project_name: {
166
+ type: 'string',
167
+ description: 'Project name for organizing research reports (auto-detected if not provided)',
168
+ },
169
+ },
170
+ required: ['topic'],
171
+ },
172
+ },
173
+ {
174
+ name: 'chat_perplexity',
175
+ description: 'Maintain conversations with Perplexity stored in project directory.',
176
+ inputSchema: {
177
+ type: 'object',
178
+ properties: {
179
+ message: {
180
+ type: 'string',
181
+ description: 'Your message',
182
+ },
183
+ chat_id: {
184
+ type: 'string',
185
+ description: 'Continue existing conversation',
186
+ },
187
+ title: {
188
+ type: 'string',
189
+ description: 'Required for new chat - conversation title',
190
+ },
191
+ model: {
192
+ type: 'string',
193
+ description: 'Override default model',
194
+ enum: [
195
+ 'sonar',
196
+ 'sonar-pro',
197
+ 'sonar-reasoning',
198
+ 'sonar-reasoning-pro',
199
+ 'sonar-deep-research',
200
+ ],
201
+ },
202
+ max_tokens: {
203
+ type: 'number',
204
+ description: 'Maximum response length',
205
+ minimum: 1,
206
+ },
207
+ temperature: {
208
+ type: 'number',
209
+ description: '0.0-1.0, default 0.2',
210
+ minimum: 0,
211
+ maximum: 1,
212
+ },
213
+ save_report: {
214
+ type: 'boolean',
215
+ description: 'Save conversation to project directory',
216
+ },
217
+ project_name: {
218
+ type: 'string',
219
+ description: 'Project name for organizing conversations (auto-detected if not provided)',
220
+ },
221
+ },
222
+ required: ['message'],
223
+ },
224
+ },
225
+ // ... include other tools as needed
226
+ ],
227
+ }));
228
+ // Handle tool calls with streaming support
229
+ this.server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
230
+ const args = request.params.arguments;
231
+ const toolName = request.params.name;
232
+ if (!args || !toolName) {
233
+ throw new Error('Invalid tool call');
234
+ }
235
+ // Get the transport for streaming
236
+ const sessionId = extra?.sessionId;
237
+ const transport = sessionId ? this.transports[sessionId] : null;
238
+ try {
239
+ switch (toolName) {
240
+ case 'ask_perplexity': {
241
+ if (transport) {
242
+ // Stream the response in real-time
243
+ return await this.handleStreamingTool(transport, 'ask_perplexity', args, handleAskPerplexity);
244
+ }
245
+ else {
246
+ // Fallback to regular response
247
+ return await handleAskPerplexity(args, this.config);
248
+ }
249
+ }
250
+ case 'research_perplexity': {
251
+ if (transport) {
252
+ return await this.handleStreamingTool(transport, 'research_perplexity', args, handleResearchPerplexity);
253
+ }
254
+ else {
255
+ return await handleResearchPerplexity(args, this.config);
256
+ }
257
+ }
258
+ case 'chat_perplexity': {
259
+ if (transport) {
260
+ return await this.handleStreamingTool(transport, 'chat_perplexity', args, handleChatPerplexity);
261
+ }
262
+ else {
263
+ const result = await handleChatPerplexity(args, this.config);
264
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
265
+ }
266
+ }
267
+ // Add other tool handlers here...
268
+ default:
269
+ throw new Error(`Unknown tool: ${toolName}`);
270
+ }
271
+ }
272
+ catch (error) {
273
+ return {
274
+ content: [
275
+ {
276
+ type: 'text',
277
+ text: `Error: ${error instanceof Error ? error.message : String(error)}`,
278
+ },
279
+ ],
280
+ isError: true,
281
+ };
282
+ }
283
+ });
284
+ }
285
+ /**
286
+ * Handle a tool call with streaming LoggingMessageNotifications
287
+ */
288
+ async handleStreamingTool(transport, toolName, args, handler) {
289
+ try {
290
+ // Send initial streaming message
291
+ await this.sendStreamingMessage(transport, `🚀 Starting ${toolName}...`);
292
+ // Execute the tool handler
293
+ const result = await handler(args, this.config);
294
+ // Stream the result content
295
+ if (result && typeof result === 'object' && result.content) {
296
+ for (const contentItem of result.content) {
297
+ if (contentItem.type === 'text') {
298
+ // Split long text into chunks for better streaming experience
299
+ const chunks = this.chunkText(contentItem.text, 500);
300
+ for (const chunk of chunks) {
301
+ await this.sendStreamingMessage(transport, chunk);
302
+ // Small delay to create streaming effect
303
+ await new Promise(resolve => setTimeout(resolve, 100));
304
+ }
305
+ }
306
+ }
307
+ }
308
+ // Send completion message
309
+ await this.sendStreamingMessage(transport, '✅ Complete!');
310
+ return result;
311
+ }
312
+ catch (error) {
313
+ await this.sendStreamingMessage(transport, `❌ Error: ${error instanceof Error ? error.message : String(error)}`);
314
+ throw error;
315
+ }
316
+ }
317
+ /**
318
+ * Send a streaming message notification
319
+ */
320
+ async sendStreamingMessage(transport, data) {
321
+ const message = {
322
+ method: 'notifications/message',
323
+ params: { level: 'info', data: data },
324
+ };
325
+ const rpcNotification = {
326
+ ...message,
327
+ jsonrpc: JSON_RPC,
328
+ };
329
+ await transport.send(rpcNotification);
330
+ }
331
+ /**
332
+ * Split text into chunks for streaming
333
+ */
334
+ chunkText(text, chunkSize) {
335
+ const chunks = [];
336
+ for (let i = 0; i < text.length; i += chunkSize) {
337
+ chunks.push(text.slice(i, i + chunkSize));
338
+ }
339
+ return chunks;
340
+ }
341
+ createErrorResponse(message) {
342
+ return {
343
+ jsonrpc: '2.0',
344
+ error: {
345
+ code: -32000,
346
+ message: message,
347
+ },
348
+ id: randomUUID(),
349
+ };
350
+ }
351
+ isInitializeRequest(body) {
352
+ const isInitial = (data) => {
353
+ const result = InitializeRequestSchema.safeParse(data);
354
+ return result.success;
355
+ };
356
+ if (Array.isArray(body)) {
357
+ return body.some(request => isInitial(request));
358
+ }
359
+ return isInitial(body);
360
+ }
361
+ }
362
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAGL,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAChD,MAAM,QAAQ,GAAG,KAAK,CAAC;AAEvB,MAAM,OAAO,oBAAoB;IAIX;IAHpB,MAAM,CAAS;IACf,UAAU,GAA2D,EAAE,CAAC;IAExE,YAAoB,MAAoC;QAApC,WAAM,GAAN,MAAM,CAA8B;QACtD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CACtB;YACE,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,OAAO;SACjB,EACD;YACE,YAAY,EAAE;gBACZ,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,EAAE;aACZ;SACF,CACF,CAAC;QAEF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAY,EAAE,GAAa;QAChD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QACtE,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,4CAA4C,CAAC,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAExC,OAAO;IACT,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,GAAY,EAAE,GAAa;QACjD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAuB,CAAC;QAC5E,IAAI,SAAwC,CAAC;QAE7C,IAAI,CAAC;YACH,2BAA2B;YAC3B,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5C,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBACvC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,uBAAuB;YACvB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrD,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;oBAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;iBACvC,CAAC,CAAC;gBAEH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACrC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBAElD,qEAAqE;gBACrE,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;gBACtC,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;gBACzC,CAAC;gBAED,OAAO;YACT,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,4CAA4C,CAAC,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAEO,aAAa;QACnB,uBAAuB;QACvB,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACjE,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,gBAAgB;oBACtB,WAAW,EAAE,sEAAsE;oBACnF,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,mCAAmC;6BACjD;4BACD,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,kCAAkC;gCAC/C,IAAI,EAAE;oCACJ,OAAO;oCACP,WAAW;oCACX,iBAAiB;oCACjB,qBAAqB;oCACrB,qBAAqB;iCACtB;6BACF;4BACD,UAAU,EAAE;gCACV,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,yBAAyB;gCACtC,OAAO,EAAE,CAAC;6BACX;4BACD,WAAW,EAAE;gCACX,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,sBAAsB;gCACnC,OAAO,EAAE,CAAC;gCACV,OAAO,EAAE,CAAC;6BACX;4BACD,oBAAoB,EAAE;gCACpB,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACzB,WAAW,EAAE,kCAAkC;6BAChD;4BACD,aAAa,EAAE;gCACb,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,4BAA4B;6BAC1C;4BACD,wBAAwB,EAAE;gCACxB,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,2BAA2B;6BACzC;4BACD,WAAW,EAAE;gCACX,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,gDAAgD;6BAC9D;4BACD,YAAY,EAAE;gCACZ,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,2EAA2E;6BAC9E;yBACF;wBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACpB;iBACF;gBACD;oBACE,IAAI,EAAE,qBAAqB;oBAC3B,WAAW,EAAE,iEAAiE;oBAC9E,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,4BAA4B;6BAC1C;4BACD,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,0DAA0D;gCACvE,IAAI,EAAE;oCACJ,OAAO;oCACP,WAAW;oCACX,iBAAiB;oCACjB,qBAAqB;oCACrB,qBAAqB;iCACtB;6BACF;4BACD,UAAU,EAAE;gCACV,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,yBAAyB;gCACtC,OAAO,EAAE,CAAC;6BACX;4BACD,WAAW,EAAE;gCACX,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,kCAAkC;6BAChD;4BACD,YAAY,EAAE;gCACZ,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,8EAA8E;6BACjF;yBACF;wBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACpB;iBACF;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,WAAW,EAAE,qEAAqE;oBAClF,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,OAAO,EAAE;gCACP,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,cAAc;6BAC5B;4BACD,OAAO,EAAE;gCACP,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,gCAAgC;6BAC9C;4BACD,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,4CAA4C;6BAC1D;4BACD,KAAK,EAAE;gCACL,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,wBAAwB;gCACrC,IAAI,EAAE;oCACJ,OAAO;oCACP,WAAW;oCACX,iBAAiB;oCACjB,qBAAqB;oCACrB,qBAAqB;iCACtB;6BACF;4BACD,UAAU,EAAE;gCACV,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,yBAAyB;gCACtC,OAAO,EAAE,CAAC;6BACX;4BACD,WAAW,EAAE;gCACX,IAAI,EAAE,QAAQ;gCACd,WAAW,EAAE,sBAAsB;gCACnC,OAAO,EAAE,CAAC;gCACV,OAAO,EAAE,CAAC;6BACX;4BACD,WAAW,EAAE;gCACX,IAAI,EAAE,SAAS;gCACf,WAAW,EAAE,wCAAwC;6BACtD;4BACD,YAAY,EAAE;gCACZ,IAAI,EAAE,QAAQ;gCACd,WAAW,EACT,2EAA2E;6BAC9E;yBACF;wBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;qBACtB;iBACF;gBACD,oCAAoC;aACrC;SACF,CAAC,CAAC,CAAC;QAEJ,2CAA2C;QAC3C,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;YACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YAErC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvC,CAAC;YAED,kCAAkC;YAClC,MAAM,SAAS,GAAI,KAAa,EAAE,SAAS,CAAC;YAC5C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAEhE,IAAI,CAAC;gBACH,QAAQ,QAAQ,EAAE,CAAC;oBACjB,KAAK,gBAAgB,CAAC,CAAC,CAAC;wBACtB,IAAI,SAAS,EAAE,CAAC;4BACd,mCAAmC;4BACnC,OAAO,MAAM,IAAI,CAAC,mBAAmB,CACnC,SAAS,EACT,gBAAgB,EAChB,IAAI,EACJ,mBAAmB,CACpB,CAAC;wBACJ,CAAC;6BAAM,CAAC;4BACN,+BAA+B;4BAC/B,OAAO,MAAM,mBAAmB,CAAC,IAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC7D,CAAC;oBACH,CAAC;oBAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;wBAC3B,IAAI,SAAS,EAAE,CAAC;4BACd,OAAO,MAAM,IAAI,CAAC,mBAAmB,CACnC,SAAS,EACT,qBAAqB,EACrB,IAAI,EACJ,wBAAwB,CACzB,CAAC;wBACJ,CAAC;6BAAM,CAAC;4BACN,OAAO,MAAM,wBAAwB,CAAC,IAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;wBAClE,CAAC;oBACH,CAAC;oBAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;wBACvB,IAAI,SAAS,EAAE,CAAC;4BACd,OAAO,MAAM,IAAI,CAAC,mBAAmB,CACnC,SAAS,EACT,iBAAiB,EACjB,IAAI,EACJ,oBAAoB,CACrB,CAAC;wBACJ,CAAC;6BAAM,CAAC;4BACN,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;4BACpE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;wBAChF,CAAC;oBACH,CAAC;oBAED,kCAAkC;oBAClC;wBACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;yBACzE;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC/B,SAAwC,EACxC,QAAgB,EAChB,IAAS,EACT,OAAiB;QAEjB,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,eAAe,QAAQ,KAAK,CAAC,CAAC;YAEzE,2BAA2B;YAC3B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhD,4BAA4B;YAC5B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC3D,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACzC,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAChC,8DAA8D;wBAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;wBACrD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;4BAC3B,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;4BAClD,yCAAyC;4BACzC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;wBACzD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,0BAA0B;YAC1B,MAAM,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAE1D,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,oBAAoB,CAC7B,SAAS,EACT,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACrE,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAChC,SAAwC,EACxC,IAAY;QAEZ,MAAM,OAAO,GAA+B;YAC1C,MAAM,EAAE,uBAAuB;YAC/B,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;SACtC,CAAC;QAEF,MAAM,eAAe,GAAwB;YAC3C,GAAG,OAAO;YACV,OAAO,EAAE,QAAQ;SAClB,CAAC;QAEF,MAAM,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,IAAY,EAAE,SAAiB;QAC/C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,mBAAmB,CAAC,OAAe;QACzC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,KAAK;gBACZ,OAAO,EAAE,OAAO;aACjB;YACD,EAAE,EAAE,UAAU,EAAE;SACjB,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,IAAS;QACnC,MAAM,SAAS,GAAG,CAAC,IAAS,EAAE,EAAE;YAC9B,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACvD,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC,CAAC;QACF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { z } from 'zod';
2
+ import { configSchema } from './types.js';
3
+ export declare function createHTTPStreamingServer(config: z.infer<typeof configSchema>): import("express-serve-static-core").Express;
4
+ //# sourceMappingURL=http-streaming-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-streaming-server.d.ts","sourceRoot":"","sources":["../src/http-streaming-server.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAY1C,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,+CAoiB7E"}