axhub-mcp-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/dist/README.md +25 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +158 -0
- package/dist/cli.js.map +1 -0
- package/dist/constant/index.d.ts +38 -0
- package/dist/constant/index.js +47 -0
- package/dist/constant/index.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 +50 -0
- package/dist/mcp/mcp-server-stdio.js +135 -0
- package/dist/mcp/mcp-server-stdio.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +25 -0
- package/dist/mcp/mcp-server.js +23 -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 +51 -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 +38 -0
- package/dist/native-messaging-host.js +241 -0
- package/dist/native-messaging-host.js.map +1 -0
- package/dist/run_host.bat +95 -0
- package/dist/run_host.sh +141 -0
- package/dist/scripts/build.d.ts +1 -0
- package/dist/scripts/build.js +119 -0
- package/dist/scripts/build.js.map +1 -0
- package/dist/scripts/constant.d.ts +11 -0
- package/dist/scripts/constant.js +45 -0
- package/dist/scripts/constant.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +2 -0
- package/dist/scripts/postinstall.js +231 -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 +22 -0
- package/dist/scripts/register.js.map +1 -0
- package/dist/scripts/utils.d.ts +36 -0
- package/dist/scripts/utils.js +353 -0
- package/dist/scripts/utils.js.map +1 -0
- package/dist/server/index.d.ts +24 -0
- package/dist/server/index.js +266 -0
- package/dist/server/index.js.map +1 -0
- package/dist/shared.d.ts +62 -0
- package/dist/shared.js +209 -0
- package/dist/shared.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 +70 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Server } from './server';
|
|
2
|
+
export declare class NativeMessagingHost {
|
|
3
|
+
private associatedServer;
|
|
4
|
+
private pendingRequests;
|
|
5
|
+
setServer(serverInstance: Server): void;
|
|
6
|
+
start(): void;
|
|
7
|
+
private setupMessageHandling;
|
|
8
|
+
private handleMessage;
|
|
9
|
+
/**
|
|
10
|
+
* Send request to Chrome and wait for response
|
|
11
|
+
* @param messagePayload Data to send to Chrome
|
|
12
|
+
* @param timeoutMs Timeout for waiting response (milliseconds)
|
|
13
|
+
* @returns Promise, resolves to Chrome's returned payload on success, rejects on failure
|
|
14
|
+
*/
|
|
15
|
+
sendRequestToExtensionAndWait(messagePayload: any, messageType?: string, timeoutMs?: number): Promise<any>;
|
|
16
|
+
/**
|
|
17
|
+
* Start Fastify server (now accepts Server instance)
|
|
18
|
+
*/
|
|
19
|
+
private startServer;
|
|
20
|
+
/**
|
|
21
|
+
* Stop Fastify server
|
|
22
|
+
*/
|
|
23
|
+
private stopServer;
|
|
24
|
+
/**
|
|
25
|
+
* Send message to Chrome extension
|
|
26
|
+
*/
|
|
27
|
+
sendMessage(message: any): void;
|
|
28
|
+
/**
|
|
29
|
+
* Send error message to Chrome extension (mainly for sending non-request-response type errors)
|
|
30
|
+
*/
|
|
31
|
+
private sendError;
|
|
32
|
+
/**
|
|
33
|
+
* Clean up resources
|
|
34
|
+
*/
|
|
35
|
+
private cleanup;
|
|
36
|
+
}
|
|
37
|
+
declare const nativeMessagingHostInstance: NativeMessagingHost;
|
|
38
|
+
export default nativeMessagingHostInstance;
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NativeMessagingHost = void 0;
|
|
4
|
+
const process_1 = require("process");
|
|
5
|
+
const uuid_1 = require("uuid");
|
|
6
|
+
const shared_1 = require("./shared");
|
|
7
|
+
const constant_1 = require("./constant");
|
|
8
|
+
class NativeMessagingHost {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.associatedServer = null;
|
|
11
|
+
this.pendingRequests = new Map();
|
|
12
|
+
}
|
|
13
|
+
setServer(serverInstance) {
|
|
14
|
+
this.associatedServer = serverInstance;
|
|
15
|
+
}
|
|
16
|
+
// add message handler to wait for start server
|
|
17
|
+
start() {
|
|
18
|
+
try {
|
|
19
|
+
this.setupMessageHandling();
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
setupMessageHandling() {
|
|
26
|
+
let buffer = Buffer.alloc(0);
|
|
27
|
+
let expectedLength = -1;
|
|
28
|
+
process_1.stdin.on('readable', () => {
|
|
29
|
+
let chunk;
|
|
30
|
+
while ((chunk = process_1.stdin.read()) !== null) {
|
|
31
|
+
buffer = Buffer.concat([buffer, chunk]);
|
|
32
|
+
if (expectedLength === -1 && buffer.length >= 4) {
|
|
33
|
+
expectedLength = buffer.readUInt32LE(0);
|
|
34
|
+
buffer = buffer.slice(4);
|
|
35
|
+
}
|
|
36
|
+
if (expectedLength !== -1 && buffer.length >= expectedLength) {
|
|
37
|
+
const messageBuffer = buffer.slice(0, expectedLength);
|
|
38
|
+
buffer = buffer.slice(expectedLength);
|
|
39
|
+
try {
|
|
40
|
+
const message = JSON.parse(messageBuffer.toString());
|
|
41
|
+
this.handleMessage(message);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
this.sendError(`Failed to parse message: ${error.message}`);
|
|
45
|
+
}
|
|
46
|
+
expectedLength = -1; // reset to get next data
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
process_1.stdin.on('end', () => {
|
|
51
|
+
this.cleanup();
|
|
52
|
+
});
|
|
53
|
+
process_1.stdin.on('error', () => {
|
|
54
|
+
this.cleanup();
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async handleMessage(message) {
|
|
58
|
+
var _a;
|
|
59
|
+
if (!message || typeof message !== 'object') {
|
|
60
|
+
this.sendError('Invalid message format');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (message.responseToRequestId) {
|
|
64
|
+
const requestId = message.responseToRequestId;
|
|
65
|
+
const pending = this.pendingRequests.get(requestId);
|
|
66
|
+
if (pending) {
|
|
67
|
+
clearTimeout(pending.timeoutId);
|
|
68
|
+
if (message.error) {
|
|
69
|
+
pending.reject(new Error(message.error));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
pending.resolve(message.payload);
|
|
73
|
+
}
|
|
74
|
+
this.pendingRequests.delete(requestId);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// just ignore
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Handle directive messages from Chrome
|
|
82
|
+
try {
|
|
83
|
+
switch (message.type) {
|
|
84
|
+
case shared_1.NativeMessageType.START:
|
|
85
|
+
await this.startServer(((_a = message.payload) === null || _a === void 0 ? void 0 : _a.port) || 3000);
|
|
86
|
+
break;
|
|
87
|
+
case shared_1.NativeMessageType.STOP:
|
|
88
|
+
await this.stopServer();
|
|
89
|
+
break;
|
|
90
|
+
// Keep ping/pong for simple liveness detection, but this differs from request-response pattern
|
|
91
|
+
case 'ping_from_extension':
|
|
92
|
+
this.sendMessage({ type: 'pong_to_extension' });
|
|
93
|
+
break;
|
|
94
|
+
default:
|
|
95
|
+
// Double check when message type is not supported
|
|
96
|
+
if (!message.responseToRequestId) {
|
|
97
|
+
this.sendError(`Unknown message type or non-response message: ${message.type || 'no type'}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
this.sendError(`Failed to handle directive message: ${error.message}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Send request to Chrome and wait for response
|
|
107
|
+
* @param messagePayload Data to send to Chrome
|
|
108
|
+
* @param timeoutMs Timeout for waiting response (milliseconds)
|
|
109
|
+
* @returns Promise, resolves to Chrome's returned payload on success, rejects on failure
|
|
110
|
+
*/
|
|
111
|
+
sendRequestToExtensionAndWait(messagePayload, messageType = 'request_data', timeoutMs = constant_1.TIMEOUTS.DEFAULT_REQUEST_TIMEOUT) {
|
|
112
|
+
return new Promise((resolve, reject) => {
|
|
113
|
+
const requestId = (0, uuid_1.v4)(); // Generate unique request ID
|
|
114
|
+
const timeoutId = setTimeout(() => {
|
|
115
|
+
this.pendingRequests.delete(requestId); // Remove from Map after timeout
|
|
116
|
+
reject(new Error(`Request timed out after ${timeoutMs}ms`));
|
|
117
|
+
}, timeoutMs);
|
|
118
|
+
// Store request's resolve/reject functions and timeout ID
|
|
119
|
+
this.pendingRequests.set(requestId, { resolve, reject, timeoutId });
|
|
120
|
+
// Send message with requestId to Chrome
|
|
121
|
+
this.sendMessage({
|
|
122
|
+
type: messageType, // Define a request type, e.g. 'request_data'
|
|
123
|
+
payload: messagePayload,
|
|
124
|
+
requestId: requestId, // <--- Key: include request ID
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Start Fastify server (now accepts Server instance)
|
|
130
|
+
*/
|
|
131
|
+
async startServer(port) {
|
|
132
|
+
if (!this.associatedServer) {
|
|
133
|
+
this.sendError('Internal error: server instance not set');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
if (this.associatedServer.isRunning) {
|
|
138
|
+
this.sendMessage({
|
|
139
|
+
type: shared_1.NativeMessageType.ERROR,
|
|
140
|
+
payload: { message: 'Server is already running' },
|
|
141
|
+
});
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
await this.associatedServer.start(port, this);
|
|
145
|
+
this.sendMessage({
|
|
146
|
+
type: shared_1.NativeMessageType.SERVER_STARTED,
|
|
147
|
+
payload: { port },
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
this.sendError(`Failed to start server: ${error.message}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Stop Fastify server
|
|
156
|
+
*/
|
|
157
|
+
async stopServer() {
|
|
158
|
+
if (!this.associatedServer) {
|
|
159
|
+
this.sendError('Internal error: server instance not set');
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
// Check status through associatedServer
|
|
164
|
+
if (!this.associatedServer.isRunning) {
|
|
165
|
+
this.sendMessage({
|
|
166
|
+
type: shared_1.NativeMessageType.ERROR,
|
|
167
|
+
payload: { message: 'Server is not running' },
|
|
168
|
+
});
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
await this.associatedServer.stop();
|
|
172
|
+
// this.serverStarted = false; // Server should update its own status after successful stop
|
|
173
|
+
this.sendMessage({ type: shared_1.NativeMessageType.SERVER_STOPPED }); // Distinguish from previous 'stopped'
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
this.sendError(`Failed to stop server: ${error.message}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Send message to Chrome extension
|
|
181
|
+
*/
|
|
182
|
+
sendMessage(message) {
|
|
183
|
+
try {
|
|
184
|
+
const messageString = JSON.stringify(message);
|
|
185
|
+
const messageBuffer = Buffer.from(messageString);
|
|
186
|
+
const headerBuffer = Buffer.alloc(4);
|
|
187
|
+
headerBuffer.writeUInt32LE(messageBuffer.length, 0);
|
|
188
|
+
// Ensure atomic write
|
|
189
|
+
process_1.stdout.write(Buffer.concat([headerBuffer, messageBuffer]), (err) => {
|
|
190
|
+
if (err) {
|
|
191
|
+
// Consider how to handle write failure, may affect request completion
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// Message sent successfully, no action needed
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
// Catch JSON.stringify or Buffer operation errors
|
|
200
|
+
// If preparation stage fails, associated request may never be sent
|
|
201
|
+
// Need to consider whether to reject corresponding Promise (if called within sendRequestToExtensionAndWait)
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Send error message to Chrome extension (mainly for sending non-request-response type errors)
|
|
206
|
+
*/
|
|
207
|
+
sendError(errorMessage) {
|
|
208
|
+
this.sendMessage({
|
|
209
|
+
type: shared_1.NativeMessageType.ERROR_FROM_NATIVE_HOST, // Use more explicit type
|
|
210
|
+
payload: { message: errorMessage },
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Clean up resources
|
|
215
|
+
*/
|
|
216
|
+
cleanup() {
|
|
217
|
+
// Reject all pending requests
|
|
218
|
+
this.pendingRequests.forEach((pending) => {
|
|
219
|
+
clearTimeout(pending.timeoutId);
|
|
220
|
+
pending.reject(new Error('Native host is shutting down or Chrome disconnected.'));
|
|
221
|
+
});
|
|
222
|
+
this.pendingRequests.clear();
|
|
223
|
+
if (this.associatedServer && this.associatedServer.isRunning) {
|
|
224
|
+
this.associatedServer
|
|
225
|
+
.stop()
|
|
226
|
+
.then(() => {
|
|
227
|
+
process.exit(0);
|
|
228
|
+
})
|
|
229
|
+
.catch(() => {
|
|
230
|
+
process.exit(1);
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
process.exit(0);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
exports.NativeMessagingHost = NativeMessagingHost;
|
|
239
|
+
const nativeMessagingHostInstance = new NativeMessagingHost();
|
|
240
|
+
exports.default = nativeMessagingHostInstance;
|
|
241
|
+
//# sourceMappingURL=native-messaging-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-messaging-host.js","sourceRoot":"","sources":["../src/native-messaging-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
setlocal enabledelayedexpansion
|
|
3
|
+
|
|
4
|
+
REM Setup paths
|
|
5
|
+
set "SCRIPT_DIR=%~dp0"
|
|
6
|
+
if "%SCRIPT_DIR:~-1%"=="\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"
|
|
7
|
+
set "LOG_DIR=%SCRIPT_DIR%\logs"
|
|
8
|
+
set "NODE_SCRIPT=%SCRIPT_DIR%\index.js"
|
|
9
|
+
|
|
10
|
+
if not exist "%LOG_DIR%" md "%LOG_DIR%"
|
|
11
|
+
|
|
12
|
+
REM Generate timestamp
|
|
13
|
+
for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format 'yyyyMMdd_HHmmss'"') do set "TIMESTAMP=%%i"
|
|
14
|
+
set "WRAPPER_LOG=%LOG_DIR%\native_host_wrapper_windows_%TIMESTAMP%.log"
|
|
15
|
+
set "STDERR_LOG=%LOG_DIR%\native_host_stderr_windows_%TIMESTAMP%.log"
|
|
16
|
+
|
|
17
|
+
REM Initial logging
|
|
18
|
+
echo Wrapper script called at %DATE% %TIME% > "%WRAPPER_LOG%"
|
|
19
|
+
echo SCRIPT_DIR: %SCRIPT_DIR% >> "%WRAPPER_LOG%"
|
|
20
|
+
echo LOG_DIR: %LOG_DIR% >> "%WRAPPER_LOG%"
|
|
21
|
+
echo NODE_SCRIPT: %NODE_SCRIPT% >> "%WRAPPER_LOG%"
|
|
22
|
+
echo Initial PATH: %PATH% >> "%WRAPPER_LOG%"
|
|
23
|
+
echo User: %USERNAME% >> "%WRAPPER_LOG%"
|
|
24
|
+
echo Current PWD: %CD% >> "%WRAPPER_LOG%"
|
|
25
|
+
|
|
26
|
+
REM Node.js discovery
|
|
27
|
+
set "NODE_EXEC="
|
|
28
|
+
|
|
29
|
+
REM Priority 1: Installation-time node path
|
|
30
|
+
set "NODE_PATH_FILE=%SCRIPT_DIR%\node_path.txt"
|
|
31
|
+
echo Checking installation-time node path >> "%WRAPPER_LOG%"
|
|
32
|
+
if exist "%NODE_PATH_FILE%" (
|
|
33
|
+
set /p EXPECTED_NODE=<"%NODE_PATH_FILE%"
|
|
34
|
+
if exist "!EXPECTED_NODE!" (
|
|
35
|
+
set "NODE_EXEC=!EXPECTED_NODE!"
|
|
36
|
+
echo Found installation-time node at !NODE_EXEC! >> "%WRAPPER_LOG%"
|
|
37
|
+
)
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
REM Priority 1.5: Fallback to relative path
|
|
41
|
+
if not defined NODE_EXEC (
|
|
42
|
+
set "EXPECTED_NODE=%SCRIPT_DIR%\..\..\..\node.exe"
|
|
43
|
+
echo Checking relative path >> "%WRAPPER_LOG%"
|
|
44
|
+
if exist "%EXPECTED_NODE%" (
|
|
45
|
+
set "NODE_EXEC=%EXPECTED_NODE%"
|
|
46
|
+
echo Found node at relative path: !NODE_EXEC! >> "%WRAPPER_LOG%"
|
|
47
|
+
)
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
REM Priority 2: where command
|
|
51
|
+
if not defined NODE_EXEC (
|
|
52
|
+
echo Trying 'where node.exe' >> "%WRAPPER_LOG%"
|
|
53
|
+
for /f "delims=" %%i in ('where node.exe 2^>nul') do (
|
|
54
|
+
if not defined NODE_EXEC (
|
|
55
|
+
set "NODE_EXEC=%%i"
|
|
56
|
+
echo Found node using 'where': !NODE_EXEC! >> "%WRAPPER_LOG%"
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
REM Priority 3: Common paths
|
|
62
|
+
if not defined NODE_EXEC (
|
|
63
|
+
if exist "%ProgramFiles%\nodejs\node.exe" (
|
|
64
|
+
set "NODE_EXEC=%ProgramFiles%\nodejs\node.exe"
|
|
65
|
+
echo Found node at !NODE_EXEC! >> "%WRAPPER_LOG%"
|
|
66
|
+
) else if exist "%ProgramFiles(x86)%\nodejs\node.exe" (
|
|
67
|
+
set "NODE_EXEC=%ProgramFiles(x86)%\nodejs\node.exe"
|
|
68
|
+
echo Found node at !NODE_EXEC! >> "%WRAPPER_LOG%"
|
|
69
|
+
) else if exist "%LOCALAPPDATA%\Programs\nodejs\node.exe" (
|
|
70
|
+
set "NODE_EXEC=%LOCALAPPDATA%\Programs\nodejs\node.exe"
|
|
71
|
+
echo Found node at !NODE_EXEC! >> "%WRAPPER_LOG%"
|
|
72
|
+
)
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
REM Validation
|
|
76
|
+
if not defined NODE_EXEC (
|
|
77
|
+
echo ERROR: Node.js executable not found! >> "%WRAPPER_LOG%"
|
|
78
|
+
exit /B 1
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
echo Using Node executable: %NODE_EXEC% >> "%WRAPPER_LOG%"
|
|
82
|
+
call "%NODE_EXEC%" -v >> "%WRAPPER_LOG%" 2>>&1
|
|
83
|
+
|
|
84
|
+
if not exist "%NODE_SCRIPT%" (
|
|
85
|
+
echo ERROR: Node.js script not found at %NODE_SCRIPT% >> "%WRAPPER_LOG%"
|
|
86
|
+
exit /B 1
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
echo Executing: "%NODE_EXEC%" "%NODE_SCRIPT%" >> "%WRAPPER_LOG%"
|
|
90
|
+
call "%NODE_EXEC%" "%NODE_SCRIPT%" 2>> "%STDERR_LOG%"
|
|
91
|
+
set "EXIT_CODE=%ERRORLEVEL%"
|
|
92
|
+
|
|
93
|
+
echo Exit code: %EXIT_CODE% >> "%WRAPPER_LOG%"
|
|
94
|
+
endlocal
|
|
95
|
+
exit /B %EXIT_CODE%
|
package/dist/run_host.sh
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Configuration
|
|
4
|
+
ENABLE_LOG_ROTATION="true"
|
|
5
|
+
LOG_RETENTION_COUNT=5
|
|
6
|
+
|
|
7
|
+
# Setup paths
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
9
|
+
LOG_DIR="${SCRIPT_DIR}/logs"
|
|
10
|
+
mkdir -p "${LOG_DIR}"
|
|
11
|
+
|
|
12
|
+
# Log rotation
|
|
13
|
+
if [ "${ENABLE_LOG_ROTATION}" = "true" ]; then
|
|
14
|
+
ls -tp "${LOG_DIR}/native_host_wrapper_macos_"* 2>/dev/null | tail -n +$((LOG_RETENTION_COUNT + 1)) | xargs -I {} rm -- {}
|
|
15
|
+
ls -tp "${LOG_DIR}/native_host_stderr_macos_"* 2>/dev/null | tail -n +$((LOG_RETENTION_COUNT + 1)) | xargs -I {} rm -- {}
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
# Logging setup
|
|
19
|
+
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
|
20
|
+
WRAPPER_LOG="${LOG_DIR}/native_host_wrapper_macos_${TIMESTAMP}.log"
|
|
21
|
+
STDERR_LOG="${LOG_DIR}/native_host_stderr_macos_${TIMESTAMP}.log"
|
|
22
|
+
NODE_SCRIPT="${SCRIPT_DIR}/index.js"
|
|
23
|
+
|
|
24
|
+
# Initial logging
|
|
25
|
+
{
|
|
26
|
+
echo "--- Wrapper script called at $(date) ---"
|
|
27
|
+
echo "SCRIPT_DIR: ${SCRIPT_DIR}"
|
|
28
|
+
echo "LOG_DIR: ${LOG_DIR}"
|
|
29
|
+
echo "NODE_SCRIPT: ${NODE_SCRIPT}"
|
|
30
|
+
echo "Initial PATH: ${PATH}"
|
|
31
|
+
echo "User: $(whoami)"
|
|
32
|
+
echo "Current PWD: $(pwd)"
|
|
33
|
+
} > "${WRAPPER_LOG}"
|
|
34
|
+
|
|
35
|
+
# Node.js discovery
|
|
36
|
+
NODE_EXEC=""
|
|
37
|
+
|
|
38
|
+
# Priority 1: Installation-time node path
|
|
39
|
+
NODE_PATH_FILE="${SCRIPT_DIR}/node_path.txt"
|
|
40
|
+
echo "Searching for Node.js..." >> "${WRAPPER_LOG}"
|
|
41
|
+
echo "[Priority 1] Checking installation-time node path" >> "${WRAPPER_LOG}"
|
|
42
|
+
if [ -f "${NODE_PATH_FILE}" ]; then
|
|
43
|
+
EXPECTED_NODE=$(cat "${NODE_PATH_FILE}" 2>/dev/null | tr -d '\n\r')
|
|
44
|
+
if [ -n "${EXPECTED_NODE}" ] && [ -x "${EXPECTED_NODE}" ]; then
|
|
45
|
+
NODE_EXEC="${EXPECTED_NODE}"
|
|
46
|
+
echo "Found installation-time node at ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
47
|
+
fi
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
# Priority 1.5: Fallback to relative path
|
|
51
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
52
|
+
EXPECTED_NODE="${SCRIPT_DIR}/../../../bin/node"
|
|
53
|
+
echo "[Priority 1.5] Checking relative path" >> "${WRAPPER_LOG}"
|
|
54
|
+
if [ -x "${EXPECTED_NODE}" ]; then
|
|
55
|
+
NODE_EXEC="${EXPECTED_NODE}"
|
|
56
|
+
echo "Found node at relative path: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
57
|
+
fi
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
# Priority 2: NVM
|
|
61
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
62
|
+
echo "[Priority 2] Checking NVM" >> "${WRAPPER_LOG}"
|
|
63
|
+
NVM_DIR="$HOME/.nvm"
|
|
64
|
+
if [ -d "${NVM_DIR}" ]; then
|
|
65
|
+
# Try default version first
|
|
66
|
+
if [ -L "${NVM_DIR}/alias/default" ]; then
|
|
67
|
+
NVM_DEFAULT_VERSION=$(readlink "${NVM_DIR}/alias/default")
|
|
68
|
+
NVM_DEFAULT_NODE="${NVM_DIR}/versions/node/${NVM_DEFAULT_VERSION}/bin/node"
|
|
69
|
+
if [ -x "${NVM_DEFAULT_NODE}" ]; then
|
|
70
|
+
NODE_EXEC="${NVM_DEFAULT_NODE}"
|
|
71
|
+
echo "Found NVM default node: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
72
|
+
fi
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
# Fallback to latest version
|
|
76
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
77
|
+
LATEST_NVM_VERSION_PATH=$(ls -d ${NVM_DIR}/versions/node/v* 2>/dev/null | sort -V | tail -n 1)
|
|
78
|
+
if [ -n "${LATEST_NVM_VERSION_PATH}" ] && [ -x "${LATEST_NVM_VERSION_PATH}/bin/node" ]; then
|
|
79
|
+
NODE_EXEC="${LATEST_NVM_VERSION_PATH}/bin/node"
|
|
80
|
+
echo "Found NVM latest node: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
81
|
+
fi
|
|
82
|
+
fi
|
|
83
|
+
fi
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
# Priority 3: Common paths
|
|
87
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
88
|
+
echo "[Priority 3] Checking common paths" >> "${WRAPPER_LOG}"
|
|
89
|
+
COMMON_NODE_PATHS=(
|
|
90
|
+
"/opt/homebrew/bin/node"
|
|
91
|
+
"/usr/local/bin/node"
|
|
92
|
+
)
|
|
93
|
+
for path_to_node in "${COMMON_NODE_PATHS[@]}"; do
|
|
94
|
+
if [ -x "${path_to_node}" ]; then
|
|
95
|
+
NODE_EXEC="${path_to_node}"
|
|
96
|
+
echo "Found node at: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
97
|
+
break
|
|
98
|
+
fi
|
|
99
|
+
done
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
# Priority 4: command -v
|
|
103
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
104
|
+
echo "[Priority 4] Trying 'command -v node'" >> "${WRAPPER_LOG}"
|
|
105
|
+
if command -v node &>/dev/null; then
|
|
106
|
+
NODE_EXEC=$(command -v node)
|
|
107
|
+
echo "Found node using 'command -v': ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
108
|
+
fi
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
# Priority 5: PATH search
|
|
112
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
113
|
+
echo "[Priority 5] Searching PATH" >> "${WRAPPER_LOG}"
|
|
114
|
+
OLD_IFS=$IFS
|
|
115
|
+
IFS=:
|
|
116
|
+
for path_in_env in $PATH; do
|
|
117
|
+
if [ -x "${path_in_env}/node" ]; then
|
|
118
|
+
NODE_EXEC="${path_in_env}/node"
|
|
119
|
+
echo "Found node in PATH: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
120
|
+
break
|
|
121
|
+
fi
|
|
122
|
+
done
|
|
123
|
+
IFS=$OLD_IFS
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
# Execution
|
|
127
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
128
|
+
{
|
|
129
|
+
echo "ERROR: Node.js executable not found!"
|
|
130
|
+
echo "Searched: installation path, relative path, NVM, common paths, command -v, PATH"
|
|
131
|
+
} >> "${WRAPPER_LOG}"
|
|
132
|
+
exit 1
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
{
|
|
136
|
+
echo "Using Node executable: ${NODE_EXEC}"
|
|
137
|
+
echo "Node version: $(${NODE_EXEC} -v)"
|
|
138
|
+
echo "Executing: ${NODE_EXEC} ${NODE_SCRIPT}"
|
|
139
|
+
} >> "${WRAPPER_LOG}"
|
|
140
|
+
|
|
141
|
+
exec "${NODE_EXEC}" "${NODE_SCRIPT}" 2>> "${STDERR_LOG}"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const child_process_1 = require("child_process");
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const distDir = path_1.default.join(__dirname, '..', '..', 'dist');
|
|
10
|
+
// 清理上次构建
|
|
11
|
+
console.log('清理上次构建...');
|
|
12
|
+
try {
|
|
13
|
+
fs_1.default.rmSync(distDir, { recursive: true, force: true });
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
// 忽略目录不存在的错误
|
|
17
|
+
console.log(err);
|
|
18
|
+
}
|
|
19
|
+
// 创建dist目录
|
|
20
|
+
fs_1.default.mkdirSync(distDir, { recursive: true });
|
|
21
|
+
fs_1.default.mkdirSync(path_1.default.join(distDir, 'logs'), { recursive: true }); // 创建logs目录
|
|
22
|
+
console.log('dist 和 dist/logs 目录已创建/确认存在');
|
|
23
|
+
// 编译TypeScript
|
|
24
|
+
console.log('编译TypeScript...');
|
|
25
|
+
(0, child_process_1.execSync)('tsc', { stdio: 'inherit' });
|
|
26
|
+
// 复制配置文件
|
|
27
|
+
console.log('复制配置文件...');
|
|
28
|
+
const configSourcePath = path_1.default.join(__dirname, '..', 'mcp', 'stdio-config.json');
|
|
29
|
+
const configDestPath = path_1.default.join(distDir, 'mcp', 'stdio-config.json');
|
|
30
|
+
try {
|
|
31
|
+
// 确保目标目录存在
|
|
32
|
+
fs_1.default.mkdirSync(path_1.default.dirname(configDestPath), { recursive: true });
|
|
33
|
+
if (fs_1.default.existsSync(configSourcePath)) {
|
|
34
|
+
fs_1.default.copyFileSync(configSourcePath, configDestPath);
|
|
35
|
+
console.log(`已将 stdio-config.json 复制到 ${configDestPath}`);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.error(`错误: 配置文件未找到: ${configSourcePath}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error('复制配置文件时出错:', error);
|
|
43
|
+
}
|
|
44
|
+
// 复制package.json并更新其内容
|
|
45
|
+
console.log('准备package.json...');
|
|
46
|
+
const packageJson = require('../../package.json');
|
|
47
|
+
// 创建安装说明
|
|
48
|
+
const readmeContent = `# ${packageJson.name}
|
|
49
|
+
|
|
50
|
+
本程序为Chrome扩展的Native Messaging主机端。
|
|
51
|
+
|
|
52
|
+
## 安装说明
|
|
53
|
+
|
|
54
|
+
1. 确保已安装Node.js
|
|
55
|
+
2. 全局安装本程序:
|
|
56
|
+
\`\`\`
|
|
57
|
+
npm install -g ${packageJson.name}
|
|
58
|
+
\`\`\`
|
|
59
|
+
3. 注册Native Messaging主机:
|
|
60
|
+
\`\`\`
|
|
61
|
+
# 用户级别安装(推荐)
|
|
62
|
+
${packageJson.name} register
|
|
63
|
+
|
|
64
|
+
# 如果用户级别安装失败,可以尝试系统级别安装
|
|
65
|
+
${packageJson.name} register --system
|
|
66
|
+
# 或者使用管理员权限
|
|
67
|
+
sudo ${packageJson.name} register
|
|
68
|
+
\`\`\`
|
|
69
|
+
|
|
70
|
+
## 使用方法
|
|
71
|
+
|
|
72
|
+
此应用程序由Chrome扩展自动启动,无需手动运行。
|
|
73
|
+
`;
|
|
74
|
+
fs_1.default.writeFileSync(path_1.default.join(distDir, 'README.md'), readmeContent);
|
|
75
|
+
console.log('复制包装脚本...');
|
|
76
|
+
const scriptsSourceDir = path_1.default.join(__dirname, '.');
|
|
77
|
+
const macOsWrapperSourcePath = path_1.default.join(scriptsSourceDir, 'run_host.sh');
|
|
78
|
+
const windowsWrapperSourcePath = path_1.default.join(scriptsSourceDir, 'run_host.bat');
|
|
79
|
+
const macOsWrapperDestPath = path_1.default.join(distDir, 'run_host.sh');
|
|
80
|
+
const windowsWrapperDestPath = path_1.default.join(distDir, 'run_host.bat');
|
|
81
|
+
try {
|
|
82
|
+
if (fs_1.default.existsSync(macOsWrapperSourcePath)) {
|
|
83
|
+
fs_1.default.copyFileSync(macOsWrapperSourcePath, macOsWrapperDestPath);
|
|
84
|
+
console.log(`已将 ${macOsWrapperSourcePath} 复制到 ${macOsWrapperDestPath}`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.error(`错误: macOS 包装脚本源文件未找到: ${macOsWrapperSourcePath}`);
|
|
88
|
+
}
|
|
89
|
+
if (fs_1.default.existsSync(windowsWrapperSourcePath)) {
|
|
90
|
+
fs_1.default.copyFileSync(windowsWrapperSourcePath, windowsWrapperDestPath);
|
|
91
|
+
console.log(`已将 ${windowsWrapperSourcePath} 复制到 ${windowsWrapperDestPath}`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.error(`错误: Windows 包装脚本源文件未找到: ${windowsWrapperSourcePath}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error('复制包装脚本时出错:', error);
|
|
99
|
+
}
|
|
100
|
+
// 为关键JavaScript文件和macOS包装脚本添加可执行权限
|
|
101
|
+
console.log('添加可执行权限...');
|
|
102
|
+
const filesToMakeExecutable = ['index.js', 'cli.js', 'run_host.sh']; // cli.js 假设在 dist 根目录
|
|
103
|
+
filesToMakeExecutable.forEach((file) => {
|
|
104
|
+
const filePath = path_1.default.join(distDir, file); // filePath 现在是目标路径
|
|
105
|
+
try {
|
|
106
|
+
if (fs_1.default.existsSync(filePath)) {
|
|
107
|
+
fs_1.default.chmodSync(filePath, '755');
|
|
108
|
+
console.log(`已为 ${file} 添加可执行权限 (755)`);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.warn(`警告: ${filePath} 不存在,无法添加可执行权限`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.error(`为 ${file} 添加可执行权限时出错:`, error);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
console.log('✅ 构建完成');
|
|
119
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/scripts/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ExtensionConfig {
|
|
2
|
+
extensionId: string;
|
|
3
|
+
hostName: string;
|
|
4
|
+
description: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function getExtensionConfig(): ExtensionConfig;
|
|
7
|
+
export declare const COMMAND_NAME = "axhub-mcp-bridge";
|
|
8
|
+
export declare const EXTENSION_ID: string;
|
|
9
|
+
export declare const HOST_NAME: string;
|
|
10
|
+
export declare const DESCRIPTION: string;
|
|
11
|
+
export declare const EXTENSION_CONFIG: ExtensionConfig;
|