@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.
- package/README.md +183 -0
- package/dist/README.md +25 -0
- package/dist/agent/attachment-service.d.ts +83 -0
- package/dist/agent/attachment-service.js +370 -0
- package/dist/agent/attachment-service.js.map +1 -0
- package/dist/agent/ccr-detector.d.ts +59 -0
- package/dist/agent/ccr-detector.js +311 -0
- package/dist/agent/ccr-detector.js.map +1 -0
- package/dist/agent/chat-service.d.ts +50 -0
- package/dist/agent/chat-service.js +439 -0
- package/dist/agent/chat-service.js.map +1 -0
- package/dist/agent/db/client.d.ts +26 -0
- package/dist/agent/db/client.js +244 -0
- package/dist/agent/db/client.js.map +1 -0
- package/dist/agent/db/index.d.ts +5 -0
- package/dist/agent/db/index.js +22 -0
- package/dist/agent/db/index.js.map +1 -0
- package/dist/agent/db/schema.d.ts +711 -0
- package/dist/agent/db/schema.js +121 -0
- package/dist/agent/db/schema.js.map +1 -0
- package/dist/agent/directory-picker.d.ts +11 -0
- package/dist/agent/directory-picker.js +149 -0
- package/dist/agent/directory-picker.js.map +1 -0
- package/dist/agent/engines/claude.d.ts +79 -0
- package/dist/agent/engines/claude.js +1338 -0
- package/dist/agent/engines/claude.js.map +1 -0
- package/dist/agent/engines/codex.d.ts +48 -0
- package/dist/agent/engines/codex.js +822 -0
- package/dist/agent/engines/codex.js.map +1 -0
- package/dist/agent/engines/types.d.ts +133 -0
- package/dist/agent/engines/types.js +3 -0
- package/dist/agent/engines/types.js.map +1 -0
- package/dist/agent/message-service.d.ts +56 -0
- package/dist/agent/message-service.js +198 -0
- package/dist/agent/message-service.js.map +1 -0
- package/dist/agent/open-project.d.ts +25 -0
- package/dist/agent/open-project.js +469 -0
- package/dist/agent/open-project.js.map +1 -0
- package/dist/agent/project-service.d.ts +49 -0
- package/dist/agent/project-service.js +254 -0
- package/dist/agent/project-service.js.map +1 -0
- package/dist/agent/project-types.d.ts +27 -0
- package/dist/agent/project-types.js +3 -0
- package/dist/agent/project-types.js.map +1 -0
- package/dist/agent/session-service.d.ts +198 -0
- package/dist/agent/session-service.js +292 -0
- package/dist/agent/session-service.js.map +1 -0
- package/dist/agent/storage.d.ts +27 -0
- package/dist/agent/storage.js +73 -0
- package/dist/agent/storage.js.map +1 -0
- package/dist/agent/stream-manager.d.ts +42 -0
- package/dist/agent/stream-manager.js +243 -0
- package/dist/agent/stream-manager.js.map +1 -0
- package/dist/agent/tool-bridge.d.ts +44 -0
- package/dist/agent/tool-bridge.js +50 -0
- package/dist/agent/tool-bridge.js.map +1 -0
- package/dist/agent/types.d.ts +6 -0
- package/dist/agent/types.js +3 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +224 -0
- package/dist/cli.js.map +1 -0
- package/dist/constant/index.d.ts +60 -0
- package/dist/constant/index.js +80 -0
- package/dist/constant/index.js.map +1 -0
- package/dist/file-handler.d.ts +41 -0
- package/dist/file-handler.js +295 -0
- package/dist/file-handler.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/mcp-server-stdio.d.ts +72 -0
- package/dist/mcp/mcp-server-stdio.js +143 -0
- package/dist/mcp/mcp-server-stdio.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +36 -0
- package/dist/mcp/mcp-server.js +26 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/mcp/register-tools.d.ts +2 -0
- package/dist/mcp/register-tools.js +148 -0
- package/dist/mcp/register-tools.js.map +1 -0
- package/dist/mcp/stdio-config.json +3 -0
- package/dist/native-messaging-host.d.ts +42 -0
- package/dist/native-messaging-host.js +312 -0
- package/dist/native-messaging-host.js.map +1 -0
- package/dist/run_host.bat +194 -0
- package/dist/run_host.sh +264 -0
- package/dist/scripts/browser-config.d.ts +28 -0
- package/dist/scripts/browser-config.js +229 -0
- package/dist/scripts/browser-config.js.map +1 -0
- package/dist/scripts/build.d.ts +1 -0
- package/dist/scripts/build.js +126 -0
- package/dist/scripts/build.js.map +1 -0
- package/dist/scripts/constant.d.ts +4 -0
- package/dist/scripts/constant.js +8 -0
- package/dist/scripts/constant.js.map +1 -0
- package/dist/scripts/doctor.d.ts +70 -0
- package/dist/scripts/doctor.js +930 -0
- package/dist/scripts/doctor.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +2 -0
- package/dist/scripts/postinstall.js +246 -0
- package/dist/scripts/postinstall.js.map +1 -0
- package/dist/scripts/register-dev.d.ts +1 -0
- package/dist/scripts/register-dev.js +5 -0
- package/dist/scripts/register-dev.js.map +1 -0
- package/dist/scripts/register.d.ts +2 -0
- package/dist/scripts/register.js +28 -0
- package/dist/scripts/register.js.map +1 -0
- package/dist/scripts/report.d.ts +96 -0
- package/dist/scripts/report.js +686 -0
- package/dist/scripts/report.js.map +1 -0
- package/dist/scripts/utils.d.ts +64 -0
- package/dist/scripts/utils.js +443 -0
- package/dist/scripts/utils.js.map +1 -0
- package/dist/server/index.d.ts +35 -0
- package/dist/server/index.js +312 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/agent.d.ts +21 -0
- package/dist/server/routes/agent.js +971 -0
- package/dist/server/routes/agent.js.map +1 -0
- package/dist/server/routes/index.d.ts +4 -0
- package/dist/server/routes/index.js +9 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/trace-analyzer.d.ts +14 -0
- package/dist/trace-analyzer.js +113 -0
- package/dist/trace-analyzer.js.map +1 -0
- package/dist/util/logger.d.ts +1 -0
- package/dist/util/logger.js +43 -0
- package/dist/util/logger.js.map +1 -0
- 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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"}
|
package/dist/index.d.ts
ADDED
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;
|