@helmisatria/mcp-chrome-bridge 1.0.30

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 (129) hide show
  1. package/README.md +183 -0
  2. package/dist/README.md +25 -0
  3. package/dist/agent/attachment-service.d.ts +83 -0
  4. package/dist/agent/attachment-service.js +370 -0
  5. package/dist/agent/attachment-service.js.map +1 -0
  6. package/dist/agent/ccr-detector.d.ts +59 -0
  7. package/dist/agent/ccr-detector.js +311 -0
  8. package/dist/agent/ccr-detector.js.map +1 -0
  9. package/dist/agent/chat-service.d.ts +50 -0
  10. package/dist/agent/chat-service.js +439 -0
  11. package/dist/agent/chat-service.js.map +1 -0
  12. package/dist/agent/db/client.d.ts +26 -0
  13. package/dist/agent/db/client.js +244 -0
  14. package/dist/agent/db/client.js.map +1 -0
  15. package/dist/agent/db/index.d.ts +5 -0
  16. package/dist/agent/db/index.js +22 -0
  17. package/dist/agent/db/index.js.map +1 -0
  18. package/dist/agent/db/schema.d.ts +711 -0
  19. package/dist/agent/db/schema.js +121 -0
  20. package/dist/agent/db/schema.js.map +1 -0
  21. package/dist/agent/directory-picker.d.ts +11 -0
  22. package/dist/agent/directory-picker.js +149 -0
  23. package/dist/agent/directory-picker.js.map +1 -0
  24. package/dist/agent/engines/claude.d.ts +79 -0
  25. package/dist/agent/engines/claude.js +1338 -0
  26. package/dist/agent/engines/claude.js.map +1 -0
  27. package/dist/agent/engines/codex.d.ts +48 -0
  28. package/dist/agent/engines/codex.js +822 -0
  29. package/dist/agent/engines/codex.js.map +1 -0
  30. package/dist/agent/engines/types.d.ts +133 -0
  31. package/dist/agent/engines/types.js +3 -0
  32. package/dist/agent/engines/types.js.map +1 -0
  33. package/dist/agent/message-service.d.ts +56 -0
  34. package/dist/agent/message-service.js +198 -0
  35. package/dist/agent/message-service.js.map +1 -0
  36. package/dist/agent/open-project.d.ts +25 -0
  37. package/dist/agent/open-project.js +469 -0
  38. package/dist/agent/open-project.js.map +1 -0
  39. package/dist/agent/project-service.d.ts +49 -0
  40. package/dist/agent/project-service.js +254 -0
  41. package/dist/agent/project-service.js.map +1 -0
  42. package/dist/agent/project-types.d.ts +27 -0
  43. package/dist/agent/project-types.js +3 -0
  44. package/dist/agent/project-types.js.map +1 -0
  45. package/dist/agent/session-service.d.ts +198 -0
  46. package/dist/agent/session-service.js +292 -0
  47. package/dist/agent/session-service.js.map +1 -0
  48. package/dist/agent/storage.d.ts +27 -0
  49. package/dist/agent/storage.js +73 -0
  50. package/dist/agent/storage.js.map +1 -0
  51. package/dist/agent/stream-manager.d.ts +42 -0
  52. package/dist/agent/stream-manager.js +243 -0
  53. package/dist/agent/stream-manager.js.map +1 -0
  54. package/dist/agent/tool-bridge.d.ts +44 -0
  55. package/dist/agent/tool-bridge.js +50 -0
  56. package/dist/agent/tool-bridge.js.map +1 -0
  57. package/dist/agent/types.d.ts +6 -0
  58. package/dist/agent/types.js +3 -0
  59. package/dist/agent/types.js.map +1 -0
  60. package/dist/cli.d.ts +2 -0
  61. package/dist/cli.js +224 -0
  62. package/dist/cli.js.map +1 -0
  63. package/dist/constant/index.d.ts +60 -0
  64. package/dist/constant/index.js +80 -0
  65. package/dist/constant/index.js.map +1 -0
  66. package/dist/file-handler.d.ts +41 -0
  67. package/dist/file-handler.js +295 -0
  68. package/dist/file-handler.js.map +1 -0
  69. package/dist/index.d.ts +2 -0
  70. package/dist/index.js +35 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/mcp/mcp-server-stdio.d.ts +72 -0
  73. package/dist/mcp/mcp-server-stdio.js +143 -0
  74. package/dist/mcp/mcp-server-stdio.js.map +1 -0
  75. package/dist/mcp/mcp-server.d.ts +36 -0
  76. package/dist/mcp/mcp-server.js +26 -0
  77. package/dist/mcp/mcp-server.js.map +1 -0
  78. package/dist/mcp/register-tools.d.ts +2 -0
  79. package/dist/mcp/register-tools.js +148 -0
  80. package/dist/mcp/register-tools.js.map +1 -0
  81. package/dist/mcp/stdio-config.json +3 -0
  82. package/dist/native-messaging-host.d.ts +42 -0
  83. package/dist/native-messaging-host.js +312 -0
  84. package/dist/native-messaging-host.js.map +1 -0
  85. package/dist/run_host.bat +194 -0
  86. package/dist/run_host.sh +264 -0
  87. package/dist/scripts/browser-config.d.ts +28 -0
  88. package/dist/scripts/browser-config.js +229 -0
  89. package/dist/scripts/browser-config.js.map +1 -0
  90. package/dist/scripts/build.d.ts +1 -0
  91. package/dist/scripts/build.js +126 -0
  92. package/dist/scripts/build.js.map +1 -0
  93. package/dist/scripts/constant.d.ts +4 -0
  94. package/dist/scripts/constant.js +8 -0
  95. package/dist/scripts/constant.js.map +1 -0
  96. package/dist/scripts/doctor.d.ts +70 -0
  97. package/dist/scripts/doctor.js +930 -0
  98. package/dist/scripts/doctor.js.map +1 -0
  99. package/dist/scripts/postinstall.d.ts +2 -0
  100. package/dist/scripts/postinstall.js +246 -0
  101. package/dist/scripts/postinstall.js.map +1 -0
  102. package/dist/scripts/register-dev.d.ts +1 -0
  103. package/dist/scripts/register-dev.js +5 -0
  104. package/dist/scripts/register-dev.js.map +1 -0
  105. package/dist/scripts/register.d.ts +2 -0
  106. package/dist/scripts/register.js +28 -0
  107. package/dist/scripts/register.js.map +1 -0
  108. package/dist/scripts/report.d.ts +96 -0
  109. package/dist/scripts/report.js +686 -0
  110. package/dist/scripts/report.js.map +1 -0
  111. package/dist/scripts/utils.d.ts +64 -0
  112. package/dist/scripts/utils.js +443 -0
  113. package/dist/scripts/utils.js.map +1 -0
  114. package/dist/server/index.d.ts +35 -0
  115. package/dist/server/index.js +312 -0
  116. package/dist/server/index.js.map +1 -0
  117. package/dist/server/routes/agent.d.ts +21 -0
  118. package/dist/server/routes/agent.js +971 -0
  119. package/dist/server/routes/agent.js.map +1 -0
  120. package/dist/server/routes/index.d.ts +4 -0
  121. package/dist/server/routes/index.js +9 -0
  122. package/dist/server/routes/index.js.map +1 -0
  123. package/dist/trace-analyzer.d.ts +14 -0
  124. package/dist/trace-analyzer.js +113 -0
  125. package/dist/trace-analyzer.js.map +1 -0
  126. package/dist/util/logger.d.ts +1 -0
  127. package/dist/util/logger.js +43 -0
  128. package/dist/util/logger.js.map +1 -0
  129. package/package.json +91 -0
@@ -0,0 +1,60 @@
1
+ export declare enum NATIVE_MESSAGE_TYPE {
2
+ START = "start",
3
+ STARTED = "started",
4
+ STOP = "stop",
5
+ STOPPED = "stopped",
6
+ PING = "ping",
7
+ PONG = "pong",
8
+ ERROR = "error"
9
+ }
10
+ export declare const NATIVE_SERVER_PORT = 12306;
11
+ export declare const TIMEOUTS: {
12
+ readonly DEFAULT_REQUEST_TIMEOUT: 15000;
13
+ readonly EXTENSION_REQUEST_TIMEOUT: 20000;
14
+ readonly PROCESS_DATA_TIMEOUT: 20000;
15
+ };
16
+ export declare const SERVER_CONFIG: {
17
+ readonly HOST: "127.0.0.1";
18
+ /**
19
+ * CORS origin whitelist - only allow Chrome/Firefox extensions and local debugging.
20
+ * Use RegExp patterns for extension origins, string for exact match.
21
+ */
22
+ readonly CORS_ORIGIN: readonly [RegExp, RegExp, "http://127.0.0.1"];
23
+ readonly LOGGER_ENABLED: false;
24
+ };
25
+ export declare const HTTP_STATUS: {
26
+ readonly OK: 200;
27
+ readonly CREATED: 201;
28
+ readonly NO_CONTENT: 204;
29
+ readonly BAD_REQUEST: 400;
30
+ readonly NOT_FOUND: 404;
31
+ readonly INTERNAL_SERVER_ERROR: 500;
32
+ readonly GATEWAY_TIMEOUT: 504;
33
+ };
34
+ export declare const ERROR_MESSAGES: {
35
+ readonly NATIVE_HOST_NOT_AVAILABLE: "Native host connection not established.";
36
+ readonly SERVER_NOT_RUNNING: "Server is not actively running.";
37
+ readonly REQUEST_TIMEOUT: "Request to extension timed out.";
38
+ readonly INVALID_MCP_REQUEST: "Invalid MCP request or session.";
39
+ readonly INVALID_SESSION_ID: "Invalid or missing MCP session ID.";
40
+ readonly INTERNAL_SERVER_ERROR: "Internal Server Error";
41
+ readonly MCP_SESSION_DELETION_ERROR: "Internal server error during MCP session deletion.";
42
+ readonly MCP_REQUEST_PROCESSING_ERROR: "Internal server error during MCP request processing.";
43
+ readonly INVALID_SSE_SESSION: "Invalid or missing MCP session ID for SSE.";
44
+ };
45
+ /**
46
+ * Environment variables for dynamically resolving the local MCP HTTP endpoint.
47
+ * CHROME_MCP_PORT is the preferred source; MCP_HTTP_PORT is kept for backward compatibility.
48
+ */
49
+ export declare const CHROME_MCP_PORT_ENV = "CHROME_MCP_PORT";
50
+ export declare const MCP_HTTP_PORT_ENV = "MCP_HTTP_PORT";
51
+ /**
52
+ * Get the actual port the Chrome MCP server is listening on.
53
+ * Priority: CHROME_MCP_PORT env > MCP_HTTP_PORT env > NATIVE_SERVER_PORT default
54
+ */
55
+ export declare function getChromeMcpPort(): number;
56
+ /**
57
+ * Get the full URL to the local Chrome MCP HTTP endpoint.
58
+ * This URL is used by Claude/Codex agents to connect to the MCP server.
59
+ */
60
+ export declare function getChromeMcpUrl(): string;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MCP_HTTP_PORT_ENV = exports.CHROME_MCP_PORT_ENV = exports.ERROR_MESSAGES = exports.HTTP_STATUS = exports.SERVER_CONFIG = exports.TIMEOUTS = exports.NATIVE_SERVER_PORT = exports.NATIVE_MESSAGE_TYPE = void 0;
4
+ exports.getChromeMcpPort = getChromeMcpPort;
5
+ exports.getChromeMcpUrl = getChromeMcpUrl;
6
+ var NATIVE_MESSAGE_TYPE;
7
+ (function (NATIVE_MESSAGE_TYPE) {
8
+ NATIVE_MESSAGE_TYPE["START"] = "start";
9
+ NATIVE_MESSAGE_TYPE["STARTED"] = "started";
10
+ NATIVE_MESSAGE_TYPE["STOP"] = "stop";
11
+ NATIVE_MESSAGE_TYPE["STOPPED"] = "stopped";
12
+ NATIVE_MESSAGE_TYPE["PING"] = "ping";
13
+ NATIVE_MESSAGE_TYPE["PONG"] = "pong";
14
+ NATIVE_MESSAGE_TYPE["ERROR"] = "error";
15
+ })(NATIVE_MESSAGE_TYPE || (exports.NATIVE_MESSAGE_TYPE = NATIVE_MESSAGE_TYPE = {}));
16
+ exports.NATIVE_SERVER_PORT = 12306;
17
+ // Timeout constants (in milliseconds)
18
+ exports.TIMEOUTS = {
19
+ DEFAULT_REQUEST_TIMEOUT: 15000,
20
+ EXTENSION_REQUEST_TIMEOUT: 20000,
21
+ PROCESS_DATA_TIMEOUT: 20000,
22
+ };
23
+ // Server configuration
24
+ exports.SERVER_CONFIG = {
25
+ HOST: '127.0.0.1',
26
+ /**
27
+ * CORS origin whitelist - only allow Chrome/Firefox extensions and local debugging.
28
+ * Use RegExp patterns for extension origins, string for exact match.
29
+ */
30
+ CORS_ORIGIN: [/^chrome-extension:\/\//, /^moz-extension:\/\//, 'http://127.0.0.1'],
31
+ LOGGER_ENABLED: false,
32
+ };
33
+ // HTTP Status codes
34
+ exports.HTTP_STATUS = {
35
+ OK: 200,
36
+ CREATED: 201,
37
+ NO_CONTENT: 204,
38
+ BAD_REQUEST: 400,
39
+ NOT_FOUND: 404,
40
+ INTERNAL_SERVER_ERROR: 500,
41
+ GATEWAY_TIMEOUT: 504,
42
+ };
43
+ // Error messages
44
+ exports.ERROR_MESSAGES = {
45
+ NATIVE_HOST_NOT_AVAILABLE: 'Native host connection not established.',
46
+ SERVER_NOT_RUNNING: 'Server is not actively running.',
47
+ REQUEST_TIMEOUT: 'Request to extension timed out.',
48
+ INVALID_MCP_REQUEST: 'Invalid MCP request or session.',
49
+ INVALID_SESSION_ID: 'Invalid or missing MCP session ID.',
50
+ INTERNAL_SERVER_ERROR: 'Internal Server Error',
51
+ MCP_SESSION_DELETION_ERROR: 'Internal server error during MCP session deletion.',
52
+ MCP_REQUEST_PROCESSING_ERROR: 'Internal server error during MCP request processing.',
53
+ INVALID_SSE_SESSION: 'Invalid or missing MCP session ID for SSE.',
54
+ };
55
+ // ============================================================
56
+ // Chrome MCP Server Configuration
57
+ // ============================================================
58
+ /**
59
+ * Environment variables for dynamically resolving the local MCP HTTP endpoint.
60
+ * CHROME_MCP_PORT is the preferred source; MCP_HTTP_PORT is kept for backward compatibility.
61
+ */
62
+ exports.CHROME_MCP_PORT_ENV = 'CHROME_MCP_PORT';
63
+ exports.MCP_HTTP_PORT_ENV = 'MCP_HTTP_PORT';
64
+ /**
65
+ * Get the actual port the Chrome MCP server is listening on.
66
+ * Priority: CHROME_MCP_PORT env > MCP_HTTP_PORT env > NATIVE_SERVER_PORT default
67
+ */
68
+ function getChromeMcpPort() {
69
+ const raw = process.env[exports.CHROME_MCP_PORT_ENV] || process.env[exports.MCP_HTTP_PORT_ENV];
70
+ const port = raw ? Number.parseInt(String(raw), 10) : NaN;
71
+ return Number.isFinite(port) && port > 0 && port <= 65535 ? port : exports.NATIVE_SERVER_PORT;
72
+ }
73
+ /**
74
+ * Get the full URL to the local Chrome MCP HTTP endpoint.
75
+ * This URL is used by Claude/Codex agents to connect to the MCP server.
76
+ */
77
+ function getChromeMcpUrl() {
78
+ return `http://${exports.SERVER_CONFIG.HOST}:${getChromeMcpPort()}/mcp`;
79
+ }
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constant/index.ts"],"names":[],"mappings":";;;AAqEA,4CAIC;AAMD,0CAEC;AAjFD,IAAY,mBAQX;AARD,WAAY,mBAAmB;IAC7B,sCAAe,CAAA;IACf,0CAAmB,CAAA;IACnB,oCAAa,CAAA;IACb,0CAAmB,CAAA;IACnB,oCAAa,CAAA;IACb,oCAAa,CAAA;IACb,sCAAe,CAAA;AACjB,CAAC,EARW,mBAAmB,mCAAnB,mBAAmB,QAQ9B;AAEY,QAAA,kBAAkB,GAAG,KAAK,CAAC;AAExC,sCAAsC;AACzB,QAAA,QAAQ,GAAG;IACtB,uBAAuB,EAAE,KAAK;IAC9B,yBAAyB,EAAE,KAAK;IAChC,oBAAoB,EAAE,KAAK;CACnB,CAAC;AAEX,uBAAuB;AACV,QAAA,aAAa,GAAG;IAC3B,IAAI,EAAE,WAAW;IACjB;;;OAGG;IACH,WAAW,EAAE,CAAC,wBAAwB,EAAE,qBAAqB,EAAE,kBAAkB,CAAU;IAC3F,cAAc,EAAE,KAAK;CACb,CAAC;AAEX,oBAAoB;AACP,QAAA,WAAW,GAAG;IACzB,EAAE,EAAE,GAAG;IACP,OAAO,EAAE,GAAG;IACZ,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,GAAG;IAChB,SAAS,EAAE,GAAG;IACd,qBAAqB,EAAE,GAAG;IAC1B,eAAe,EAAE,GAAG;CACZ,CAAC;AAEX,iBAAiB;AACJ,QAAA,cAAc,GAAG;IAC5B,yBAAyB,EAAE,yCAAyC;IACpE,kBAAkB,EAAE,iCAAiC;IACrD,eAAe,EAAE,iCAAiC;IAClD,mBAAmB,EAAE,iCAAiC;IACtD,kBAAkB,EAAE,oCAAoC;IACxD,qBAAqB,EAAE,uBAAuB;IAC9C,0BAA0B,EAAE,oDAAoD;IAChF,4BAA4B,EAAE,sDAAsD;IACpF,mBAAmB,EAAE,4CAA4C;CACzD,CAAC;AAEX,+DAA+D;AAC/D,kCAAkC;AAClC,+DAA+D;AAE/D;;;GAGG;AACU,QAAA,mBAAmB,GAAG,iBAAiB,CAAC;AACxC,QAAA,iBAAiB,GAAG,eAAe,CAAC;AAEjD;;;GAGG;AACH,SAAgB,gBAAgB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,2BAAmB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAiB,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAAkB,CAAC;AACxF,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe;IAC7B,OAAO,UAAU,qBAAa,CAAC,IAAI,IAAI,gBAAgB,EAAE,MAAM,CAAC;AAClE,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * File handler for managing file uploads through the native messaging host
3
+ */
4
+ export declare class FileHandler {
5
+ private tempDir;
6
+ constructor();
7
+ /**
8
+ * Handle file preparation request from the extension
9
+ */
10
+ handleFileRequest(request: any): Promise<any>;
11
+ /**
12
+ * Download a file from URL and save to temp directory
13
+ */
14
+ private downloadFile;
15
+ /**
16
+ * Save base64 data as a file
17
+ */
18
+ private saveBase64File;
19
+ /**
20
+ * Verify that a file exists and is accessible
21
+ */
22
+ private verifyFile;
23
+ /**
24
+ * Read file content and return as base64 string
25
+ */
26
+ private readBase64File;
27
+ /**
28
+ * Clean up a temporary file
29
+ */
30
+ private cleanupFile;
31
+ /**
32
+ * Generate a filename from URL or create a unique one
33
+ */
34
+ private generateFileName;
35
+ /**
36
+ * Clean up old temporary files (older than 1 hour)
37
+ */
38
+ cleanupOldFiles(): void;
39
+ }
40
+ declare const _default: FileHandler;
41
+ export default _default;
@@ -0,0 +1,295 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.FileHandler = void 0;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const os = __importStar(require("os"));
43
+ const crypto = __importStar(require("crypto"));
44
+ const node_fetch_1 = __importDefault(require("node-fetch"));
45
+ /**
46
+ * File handler for managing file uploads through the native messaging host
47
+ */
48
+ class FileHandler {
49
+ constructor() {
50
+ // Create a temp directory for file operations
51
+ this.tempDir = path.join(os.tmpdir(), 'chrome-mcp-uploads');
52
+ if (!fs.existsSync(this.tempDir)) {
53
+ fs.mkdirSync(this.tempDir, { recursive: true });
54
+ }
55
+ }
56
+ /**
57
+ * Handle file preparation request from the extension
58
+ */
59
+ async handleFileRequest(request) {
60
+ const { action, fileUrl, base64Data, fileName, filePath, traceFilePath, insightName } = request;
61
+ try {
62
+ switch (action) {
63
+ case 'prepareFile':
64
+ if (fileUrl) {
65
+ return await this.downloadFile(fileUrl, fileName);
66
+ }
67
+ else if (base64Data) {
68
+ return await this.saveBase64File(base64Data, fileName);
69
+ }
70
+ else if (filePath) {
71
+ return await this.verifyFile(filePath);
72
+ }
73
+ break;
74
+ case 'readBase64File': {
75
+ if (!filePath)
76
+ return { success: false, error: 'filePath is required' };
77
+ return await this.readBase64File(filePath);
78
+ }
79
+ case 'cleanupFile':
80
+ return await this.cleanupFile(filePath);
81
+ case 'analyzeTrace': {
82
+ const targetPath = traceFilePath || filePath;
83
+ if (!targetPath) {
84
+ return { success: false, error: 'traceFilePath is required' };
85
+ }
86
+ try {
87
+ // With tsconfig moduleResolution=NodeNext, relative ESM imports need explicit .js extension
88
+ const { analyzeTraceFile } = await import('./trace-analyzer.js');
89
+ const res = await analyzeTraceFile(targetPath, insightName);
90
+ return { success: true, ...res };
91
+ }
92
+ catch (e) {
93
+ return { success: false, error: (e === null || e === void 0 ? void 0 : e.message) || String(e) };
94
+ }
95
+ }
96
+ default:
97
+ return {
98
+ success: false,
99
+ error: `Unknown file action: ${action}`,
100
+ };
101
+ }
102
+ }
103
+ catch (error) {
104
+ return {
105
+ success: false,
106
+ error: error instanceof Error ? error.message : String(error),
107
+ };
108
+ }
109
+ }
110
+ /**
111
+ * Download a file from URL and save to temp directory
112
+ */
113
+ async downloadFile(fileUrl, fileName) {
114
+ try {
115
+ const response = await (0, node_fetch_1.default)(fileUrl);
116
+ if (!response.ok) {
117
+ throw new Error(`Failed to download file: ${response.statusText}`);
118
+ }
119
+ // Generate filename if not provided
120
+ const finalFileName = fileName || this.generateFileName(fileUrl);
121
+ const filePath = path.join(this.tempDir, finalFileName);
122
+ // Get the file buffer
123
+ const buffer = await response.buffer();
124
+ // Save to file
125
+ fs.writeFileSync(filePath, buffer);
126
+ return {
127
+ success: true,
128
+ filePath: filePath,
129
+ fileName: finalFileName,
130
+ size: buffer.length,
131
+ };
132
+ }
133
+ catch (error) {
134
+ throw new Error(`Failed to download file from URL: ${error}`);
135
+ }
136
+ }
137
+ /**
138
+ * Save base64 data as a file
139
+ */
140
+ async saveBase64File(base64Data, fileName) {
141
+ try {
142
+ // Remove data URL prefix if present
143
+ const base64Content = base64Data.replace(/^data:.*?;base64,/, '');
144
+ // Convert base64 to buffer
145
+ const buffer = Buffer.from(base64Content, 'base64');
146
+ // Generate filename if not provided
147
+ const finalFileName = fileName || `upload-${Date.now()}.bin`;
148
+ const filePath = path.join(this.tempDir, finalFileName);
149
+ // Save to file
150
+ fs.writeFileSync(filePath, buffer);
151
+ return {
152
+ success: true,
153
+ filePath: filePath,
154
+ fileName: finalFileName,
155
+ size: buffer.length,
156
+ };
157
+ }
158
+ catch (error) {
159
+ throw new Error(`Failed to save base64 file: ${error}`);
160
+ }
161
+ }
162
+ /**
163
+ * Verify that a file exists and is accessible
164
+ */
165
+ async verifyFile(filePath) {
166
+ try {
167
+ // Check if file exists
168
+ if (!fs.existsSync(filePath)) {
169
+ throw new Error(`File does not exist: ${filePath}`);
170
+ }
171
+ // Get file stats
172
+ const stats = fs.statSync(filePath);
173
+ // Check if it's actually a file
174
+ if (!stats.isFile()) {
175
+ throw new Error(`Path is not a file: ${filePath}`);
176
+ }
177
+ // Check if file is readable
178
+ fs.accessSync(filePath, fs.constants.R_OK);
179
+ return {
180
+ success: true,
181
+ filePath: filePath,
182
+ fileName: path.basename(filePath),
183
+ size: stats.size,
184
+ };
185
+ }
186
+ catch (error) {
187
+ throw new Error(`Failed to verify file: ${error}`);
188
+ }
189
+ }
190
+ /**
191
+ * Read file content and return as base64 string
192
+ */
193
+ async readBase64File(filePath) {
194
+ try {
195
+ if (!fs.existsSync(filePath)) {
196
+ throw new Error(`File does not exist: ${filePath}`);
197
+ }
198
+ const stats = fs.statSync(filePath);
199
+ if (!stats.isFile()) {
200
+ throw new Error(`Path is not a file: ${filePath}`);
201
+ }
202
+ const buf = fs.readFileSync(filePath);
203
+ const base64 = buf.toString('base64');
204
+ return {
205
+ success: true,
206
+ filePath,
207
+ fileName: path.basename(filePath),
208
+ size: stats.size,
209
+ base64Data: base64,
210
+ };
211
+ }
212
+ catch (error) {
213
+ return {
214
+ success: false,
215
+ error: `Failed to read file: ${error instanceof Error ? error.message : String(error)}`,
216
+ };
217
+ }
218
+ }
219
+ /**
220
+ * Clean up a temporary file
221
+ */
222
+ async cleanupFile(filePath) {
223
+ try {
224
+ // Only allow cleanup of files in our temp directory
225
+ if (!filePath.startsWith(this.tempDir)) {
226
+ return {
227
+ success: false,
228
+ error: 'Can only cleanup files in temp directory',
229
+ };
230
+ }
231
+ if (fs.existsSync(filePath)) {
232
+ fs.unlinkSync(filePath);
233
+ }
234
+ return {
235
+ success: true,
236
+ message: 'File cleaned up successfully',
237
+ };
238
+ }
239
+ catch (error) {
240
+ return {
241
+ success: false,
242
+ error: `Failed to cleanup file: ${error}`,
243
+ };
244
+ }
245
+ }
246
+ /**
247
+ * Generate a filename from URL or create a unique one
248
+ */
249
+ generateFileName(url) {
250
+ if (url) {
251
+ try {
252
+ const urlObj = new URL(url);
253
+ const pathname = urlObj.pathname;
254
+ const basename = path.basename(pathname);
255
+ if (basename && basename !== '/') {
256
+ // Add random suffix to avoid collisions
257
+ const ext = path.extname(basename);
258
+ const name = path.basename(basename, ext);
259
+ const randomSuffix = crypto.randomBytes(4).toString('hex');
260
+ return `${name}-${randomSuffix}${ext}`;
261
+ }
262
+ }
263
+ catch (_a) {
264
+ // Invalid URL, fall through to generate random name
265
+ }
266
+ }
267
+ // Generate random filename
268
+ return `upload-${crypto.randomBytes(8).toString('hex')}.bin`;
269
+ }
270
+ /**
271
+ * Clean up old temporary files (older than 1 hour)
272
+ */
273
+ cleanupOldFiles() {
274
+ try {
275
+ const now = Date.now();
276
+ const oneHour = 60 * 60 * 1000;
277
+ const files = fs.readdirSync(this.tempDir);
278
+ for (const file of files) {
279
+ const filePath = path.join(this.tempDir, file);
280
+ const stats = fs.statSync(filePath);
281
+ if (now - stats.mtimeMs > oneHour) {
282
+ fs.unlinkSync(filePath);
283
+ // Use stderr to avoid polluting stdout (Native Messaging protocol)
284
+ console.error(`Cleaned up old temp file: ${file}`);
285
+ }
286
+ }
287
+ }
288
+ catch (error) {
289
+ console.error('Error cleaning up old files:', error);
290
+ }
291
+ }
292
+ }
293
+ exports.FileHandler = FileHandler;
294
+ exports.default = new FileHandler();
295
+ //# sourceMappingURL=file-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-handler.js","sourceRoot":"","sources":["../src/file-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const server_1 = __importDefault(require("./server"));
8
+ const native_messaging_host_1 = __importDefault(require("./native-messaging-host"));
9
+ try {
10
+ server_1.default.setNativeHost(native_messaging_host_1.default); // Server needs setNativeHost method
11
+ native_messaging_host_1.default.setServer(server_1.default); // NativeHost needs setServer method
12
+ native_messaging_host_1.default.start();
13
+ }
14
+ catch (error) {
15
+ process.exit(1);
16
+ }
17
+ process.on('error', (error) => {
18
+ process.exit(1);
19
+ });
20
+ // Handle process signals and uncaught exceptions
21
+ process.on('SIGINT', () => {
22
+ process.exit(0);
23
+ });
24
+ process.on('SIGTERM', () => {
25
+ process.exit(0);
26
+ });
27
+ process.on('exit', (code) => {
28
+ });
29
+ process.on('uncaughtException', (error) => {
30
+ process.exit(1);
31
+ });
32
+ process.on('unhandledRejection', (reason) => {
33
+ // Don't exit immediately, let the program continue running
34
+ });
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,sDAAsC;AACtC,oFAAkE;AAElE,IAAI,CAAC;IACH,gBAAc,CAAC,aAAa,CAAC,+BAA2B,CAAC,CAAC,CAAC,oCAAoC;IAC/F,+BAA2B,CAAC,SAAS,CAAC,gBAAc,CAAC,CAAC,CAAC,oCAAoC;IAC3F,+BAA2B,CAAC,KAAK,EAAE,CAAC;AACtC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,iDAAiD;AACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;AAC5B,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,2DAA2D;AAC7D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
4
+ export declare const getStdioMcpServer: () => Server<{
5
+ method: string;
6
+ params?: {
7
+ [x: string]: unknown;
8
+ _meta?: {
9
+ [x: string]: unknown;
10
+ progressToken?: string | number | undefined;
11
+ "io.modelcontextprotocol/related-task"?: {
12
+ taskId: string;
13
+ } | undefined;
14
+ } | undefined;
15
+ } | undefined;
16
+ }, {
17
+ method: string;
18
+ params?: {
19
+ [x: string]: unknown;
20
+ _meta?: {
21
+ [x: string]: unknown;
22
+ progressToken?: string | number | undefined;
23
+ "io.modelcontextprotocol/related-task"?: {
24
+ taskId: string;
25
+ } | undefined;
26
+ } | undefined;
27
+ } | undefined;
28
+ }, {
29
+ [x: string]: unknown;
30
+ _meta?: {
31
+ [x: string]: unknown;
32
+ progressToken?: string | number | undefined;
33
+ "io.modelcontextprotocol/related-task"?: {
34
+ taskId: string;
35
+ } | undefined;
36
+ } | undefined;
37
+ }>;
38
+ export declare const ensureMcpClient: () => Promise<Client<{
39
+ method: string;
40
+ params?: {
41
+ [x: string]: unknown;
42
+ _meta?: {
43
+ [x: string]: unknown;
44
+ progressToken?: string | number | undefined;
45
+ "io.modelcontextprotocol/related-task"?: {
46
+ taskId: string;
47
+ } | undefined;
48
+ } | undefined;
49
+ } | undefined;
50
+ }, {
51
+ method: string;
52
+ params?: {
53
+ [x: string]: unknown;
54
+ _meta?: {
55
+ [x: string]: unknown;
56
+ progressToken?: string | number | undefined;
57
+ "io.modelcontextprotocol/related-task"?: {
58
+ taskId: string;
59
+ } | undefined;
60
+ } | undefined;
61
+ } | undefined;
62
+ }, {
63
+ [x: string]: unknown;
64
+ _meta?: {
65
+ [x: string]: unknown;
66
+ progressToken?: string | number | undefined;
67
+ "io.modelcontextprotocol/related-task"?: {
68
+ taskId: string;
69
+ } | undefined;
70
+ } | undefined;
71
+ }> | undefined>;
72
+ export declare const setupTools: (server: Server) => void;