axhub-mcp-bridge 1.0.35 → 1.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,311 @@
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
+ exports.WebSocketBridge = void 0;
7
+ const ws_1 = require("ws");
8
+ const logger_1 = __importDefault(require("../utils/logger"));
9
+ class WebSocketBridge {
10
+ constructor() {
11
+ this.wss = null;
12
+ this.clients = new Map();
13
+ this.heartbeatInterval = null;
14
+ this.onFigmaMessageCallback = null;
15
+ this.onClientConnectCallback = null;
16
+ this.onClientDisconnectCallback = null;
17
+ logger_1.default.log('[WS Bridge] Initializing WebSocket Bridge');
18
+ }
19
+ /**
20
+ * Initialize WebSocket server on existing HTTP server
21
+ */
22
+ initialize(server) {
23
+ this.wss = new ws_1.WebSocketServer({
24
+ server,
25
+ path: '/ws'
26
+ });
27
+ this.wss.on('connection', (ws, req) => {
28
+ this.handleConnection(ws, req);
29
+ });
30
+ // Start heartbeat
31
+ this.startHeartbeat();
32
+ logger_1.default.log('[WS Bridge] WebSocket server initialized on /ws');
33
+ }
34
+ /**
35
+ * Handle new WebSocket connection
36
+ * All WebSocket connections are from Figma plugin
37
+ */
38
+ handleConnection(ws, req) {
39
+ const clientId = this.generateClientId();
40
+ // All WebSocket connections are from Figma plugin
41
+ const clientType = 'figma';
42
+ logger_1.default.log('[WS Bridge] New connection from Figma plugin', { clientId, url: req.url, host: req.headers.host });
43
+ const clientInfo = {
44
+ ws,
45
+ id: clientId,
46
+ type: clientType,
47
+ alive: true,
48
+ };
49
+ this.clients.set(clientId, clientInfo);
50
+ // Send connection confirmation
51
+ this.sendToClient(clientId, {
52
+ type: 'ws:connected',
53
+ payload: { clientId, clientType: clientInfo.type }
54
+ });
55
+ logger_1.default.log('[WS Bridge] Client registered', {
56
+ clientId,
57
+ type: clientInfo.type,
58
+ totalClients: this.clients.size,
59
+ url: req.url,
60
+ host: req.headers.host,
61
+ allClientTypes: Array.from(this.clients.values()).map(c => ({ id: c.id, type: c.type }))
62
+ });
63
+ // Notify extension about client connection
64
+ if (this.onClientConnectCallback) {
65
+ const stats = this.getStats();
66
+ this.onClientConnectCallback(clientId, { total: stats.total, figma: stats.figma });
67
+ }
68
+ // Handle messages
69
+ ws.on('message', (data) => {
70
+ this.handleMessage(clientId, data);
71
+ });
72
+ // Handle pong (heartbeat response)
73
+ ws.on('pong', () => {
74
+ const client = this.clients.get(clientId);
75
+ if (client) {
76
+ client.alive = true;
77
+ }
78
+ });
79
+ // Handle close
80
+ ws.on('close', () => {
81
+ logger_1.default.log('[WS Bridge] Client disconnected', { clientId });
82
+ const stats = this.getStats();
83
+ this.clients.delete(clientId);
84
+ // Notify extension about client disconnection
85
+ if (this.onClientDisconnectCallback) {
86
+ const newStats = this.getStats();
87
+ this.onClientDisconnectCallback(clientId, { total: newStats.total, figma: newStats.figma });
88
+ }
89
+ });
90
+ // Handle errors
91
+ ws.on('error', (error) => {
92
+ logger_1.default.error('[WS Bridge] Client error', { clientId, error: error.message });
93
+ });
94
+ }
95
+ /**
96
+ * Handle incoming message from client
97
+ */
98
+ handleMessage(fromClientId, data) {
99
+ var _a;
100
+ try {
101
+ const message = JSON.parse(data.toString());
102
+ const fromClient = this.clients.get(fromClientId);
103
+ if (!fromClient) {
104
+ logger_1.default.warn('[WS Bridge] Message from unknown client', { fromClientId });
105
+ return;
106
+ }
107
+ logger_1.default.log('[WS Bridge] Received message', {
108
+ from: fromClient.type,
109
+ clientId: fromClientId,
110
+ type: message.type,
111
+ target: message.target,
112
+ hasRequestId: !!message.___requestId
113
+ });
114
+ // Handle special message types
115
+ if (message.type === 'ws:register') {
116
+ // Update client type
117
+ const newType = (_a = message.payload) === null || _a === void 0 ? void 0 : _a.clientType;
118
+ if (newType === 'figma' || newType === 'extension') {
119
+ fromClient.type = newType;
120
+ logger_1.default.log('[WS Bridge] Client type updated', { clientId: fromClientId, type: newType });
121
+ this.sendToClient(fromClientId, {
122
+ type: 'ws:registered',
123
+ payload: { clientId: fromClientId, clientType: newType }
124
+ });
125
+ }
126
+ return;
127
+ }
128
+ // Route message based on target
129
+ this.routeMessage(fromClient, message);
130
+ }
131
+ catch (error) {
132
+ logger_1.default.error('[WS Bridge] Failed to parse message', {
133
+ fromClientId,
134
+ error: error.message
135
+ });
136
+ }
137
+ }
138
+ /**
139
+ * Register callback for Figma messages
140
+ * This allows native-messaging-host to receive messages from Figma plugin
141
+ */
142
+ onFigmaMessage(callback) {
143
+ this.onFigmaMessageCallback = callback;
144
+ }
145
+ /**
146
+ * Register callback for client connection events
147
+ */
148
+ onClientConnect(callback) {
149
+ this.onClientConnectCallback = callback;
150
+ }
151
+ /**
152
+ * Register callback for client disconnection events
153
+ */
154
+ onClientDisconnect(callback) {
155
+ this.onClientDisconnectCallback = callback;
156
+ }
157
+ /**
158
+ * Route message from Figma plugin
159
+ * Messages from Figma should be forwarded to Extension via Native Messaging
160
+ */
161
+ routeMessage(fromClient, message) {
162
+ // All WebSocket clients are Figma plugins
163
+ // Messages from Figma should be forwarded to Extension via Native Messaging
164
+ logger_1.default.log('[WS Bridge] Message from Figma plugin', {
165
+ clientId: fromClient.id,
166
+ messageType: message.type
167
+ });
168
+ // If target is 'broadcast', send to all other Figma clients
169
+ if (message.target === 'broadcast') {
170
+ this.broadcastMessage(fromClient.id, message);
171
+ return;
172
+ }
173
+ // Forward to Extension via Native Messaging callback
174
+ if (this.onFigmaMessageCallback) {
175
+ this.onFigmaMessageCallback(message);
176
+ logger_1.default.log('[WS Bridge] Message forwarded to Extension via Native Messaging');
177
+ }
178
+ else {
179
+ logger_1.default.warn('[WS Bridge] No callback registered for Figma messages');
180
+ }
181
+ }
182
+ /**
183
+ * Broadcast message to all clients except sender
184
+ */
185
+ broadcastMessage(exceptClientId, message) {
186
+ let sent = 0;
187
+ for (const [clientId, client] of this.clients.entries()) {
188
+ if (clientId !== exceptClientId) {
189
+ this.sendToClient(clientId, message);
190
+ sent++;
191
+ }
192
+ }
193
+ logger_1.default.log('[WS Bridge] Broadcast message', { type: message.type, recipients: sent });
194
+ }
195
+ /**
196
+ * Send message to specific client
197
+ */
198
+ sendToClient(clientId, message) {
199
+ const client = this.clients.get(clientId);
200
+ if (!client) {
201
+ logger_1.default.warn('[WS Bridge] Cannot send to unknown client', { clientId });
202
+ return;
203
+ }
204
+ if (client.ws.readyState === ws_1.WebSocket.OPEN) {
205
+ try {
206
+ client.ws.send(JSON.stringify(message));
207
+ }
208
+ catch (error) {
209
+ logger_1.default.error('[WS Bridge] Failed to send message', {
210
+ clientId,
211
+ error: error.message
212
+ });
213
+ }
214
+ }
215
+ }
216
+ /**
217
+ * Start heartbeat to detect dead connections
218
+ */
219
+ startHeartbeat() {
220
+ this.heartbeatInterval = setInterval(() => {
221
+ for (const [clientId, client] of this.clients.entries()) {
222
+ if (!client.alive) {
223
+ logger_1.default.log('[WS Bridge] Terminating dead connection', { clientId });
224
+ client.ws.terminate();
225
+ this.clients.delete(clientId);
226
+ continue;
227
+ }
228
+ client.alive = false;
229
+ client.ws.ping();
230
+ }
231
+ }, 30000); // 30 seconds
232
+ }
233
+ /**
234
+ * Stop heartbeat
235
+ */
236
+ stopHeartbeat() {
237
+ if (this.heartbeatInterval) {
238
+ clearInterval(this.heartbeatInterval);
239
+ this.heartbeatInterval = null;
240
+ }
241
+ }
242
+ /**
243
+ * Generate unique client ID
244
+ */
245
+ generateClientId() {
246
+ return `client_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
247
+ }
248
+ /**
249
+ * Get connection stats
250
+ * All WebSocket clients are Figma plugins
251
+ */
252
+ getStats() {
253
+ const details = [];
254
+ for (const [clientId, client] of this.clients.entries()) {
255
+ details.push({
256
+ id: clientId,
257
+ type: client.type,
258
+ alive: client.alive,
259
+ readyState: client.ws.readyState
260
+ });
261
+ }
262
+ logger_1.default.log('[WS Bridge] Stats calculated', {
263
+ total: this.clients.size,
264
+ figma: this.clients.size,
265
+ details
266
+ });
267
+ return {
268
+ total: this.clients.size,
269
+ figma: this.clients.size,
270
+ details
271
+ };
272
+ }
273
+ /**
274
+ * Send message to all Figma clients
275
+ * All WebSocket clients are Figma plugins
276
+ */
277
+ sendToClientType(type, message) {
278
+ let sent = 0;
279
+ logger_1.default.log('[WS Bridge] Sending message to Figma clients', { messageType: message.type, clientCount: this.clients.size });
280
+ for (const [clientId, client] of this.clients.entries()) {
281
+ // All clients are figma type
282
+ logger_1.default.log('[WS Bridge] Sending to client', { clientId, clientType: client.type, messageType: message.type });
283
+ this.sendToClient(clientId, message);
284
+ sent++;
285
+ }
286
+ if (sent === 0) {
287
+ logger_1.default.warn('[WS Bridge] No Figma clients connected', { totalClients: this.clients.size });
288
+ }
289
+ return sent;
290
+ }
291
+ /**
292
+ * Cleanup
293
+ */
294
+ destroy() {
295
+ this.stopHeartbeat();
296
+ // Close all client connections
297
+ for (const client of this.clients.values()) {
298
+ client.ws.close();
299
+ }
300
+ this.clients.clear();
301
+ if (this.wss) {
302
+ this.wss.close();
303
+ this.wss = null;
304
+ }
305
+ logger_1.default.log('[WS Bridge] WebSocket bridge destroyed');
306
+ }
307
+ }
308
+ exports.WebSocketBridge = WebSocketBridge;
309
+ const websocketBridge = new WebSocketBridge();
310
+ exports.default = websocketBridge;
311
+ //# sourceMappingURL=websocket-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-bridge.js","sourceRoot":"","sources":["../../src/server/websocket-bridge.ts"],"names":[],"mappings":"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"}
package/dist/shared.d.ts CHANGED
@@ -15,7 +15,17 @@ export declare enum NativeMessageType {
15
15
  ERROR_FROM_NATIVE_HOST = "error_from_native_host",
16
16
  CONNECT_NATIVE = "connectNative",
17
17
  PING_NATIVE = "ping_native",
18
- DISCONNECT_NATIVE = "disconnect_native"
18
+ DISCONNECT_NATIVE = "disconnect_native",
19
+ START_WEBSOCKET = "start_websocket",
20
+ STOP_WEBSOCKET = "stop_websocket",
21
+ WEBSOCKET_STARTED = "websocket_started",
22
+ WEBSOCKET_STOPPED = "websocket_stopped",
23
+ WEBSOCKET_STATUS = "websocket_status",
24
+ FIGMA_MESSAGE = "figma_message",
25
+ FIGMA_REQUEST = "figma_request",
26
+ FIGMA_RESPONSE = "figma_response",
27
+ WEBSOCKET_CLIENT_CONNECTED = "websocket_client_connected",
28
+ WEBSOCKET_CLIENT_DISCONNECTED = "websocket_client_disconnected"
19
29
  }
20
30
  export interface NativeMessage<P = any, E = any> {
21
31
  type?: NativeMessageType;
@@ -32,6 +42,8 @@ export declare const TOOL_NAMES: {
32
42
  GET_AXURE_INTERACTIONS: string;
33
43
  GET_AXURE_PAGE_TEXT: string;
34
44
  GET_AXURE_IMAGE: string;
45
+ GET_PAGE_THEME: string;
46
+ DOWNLOAD_PAGE_DATA: string;
35
47
  };
36
48
  };
37
49
  import { type Tool } from '@modelcontextprotocol/sdk/types.js';
package/dist/shared.js CHANGED
@@ -23,6 +23,19 @@ var NativeMessageType;
23
23
  NativeMessageType["CONNECT_NATIVE"] = "connectNative";
24
24
  NativeMessageType["PING_NATIVE"] = "ping_native";
25
25
  NativeMessageType["DISCONNECT_NATIVE"] = "disconnect_native";
26
+ // WebSocket server control
27
+ NativeMessageType["START_WEBSOCKET"] = "start_websocket";
28
+ NativeMessageType["STOP_WEBSOCKET"] = "stop_websocket";
29
+ NativeMessageType["WEBSOCKET_STARTED"] = "websocket_started";
30
+ NativeMessageType["WEBSOCKET_STOPPED"] = "websocket_stopped";
31
+ NativeMessageType["WEBSOCKET_STATUS"] = "websocket_status";
32
+ // Figma bridge messages (relayed through native host)
33
+ NativeMessageType["FIGMA_MESSAGE"] = "figma_message";
34
+ NativeMessageType["FIGMA_REQUEST"] = "figma_request";
35
+ NativeMessageType["FIGMA_RESPONSE"] = "figma_response";
36
+ // WebSocket client connection events
37
+ NativeMessageType["WEBSOCKET_CLIENT_CONNECTED"] = "websocket_client_connected";
38
+ NativeMessageType["WEBSOCKET_CLIENT_DISCONNECTED"] = "websocket_client_disconnected";
26
39
  })(NativeMessageType || (exports.NativeMessageType = NativeMessageType = {}));
27
40
  // export const DEFAULT_SERVER_PORT = 12308;
28
41
  // export const HOST_NAME = 'com.axhub.nativehost';
@@ -35,6 +48,8 @@ exports.TOOL_NAMES = {
35
48
  GET_AXURE_INTERACTIONS: 'get_axure_interactions',
36
49
  GET_AXURE_PAGE_TEXT: 'get_axure_text',
37
50
  GET_AXURE_IMAGE: 'get_axure_image',
51
+ GET_PAGE_THEME: 'get_page_theme',
52
+ DOWNLOAD_PAGE_DATA: 'download_page_data',
38
53
  },
39
54
  };
40
55
  exports.TOOL_SCHEMAS = [
@@ -184,5 +199,37 @@ exports.TOOL_SCHEMAS = [
184
199
  required: ['imageUrl'],
185
200
  },
186
201
  },
202
+ {
203
+ name: exports.TOOL_NAMES.BROWSER.GET_PAGE_THEME,
204
+ description: 'Extract design theme tokens from any web page including colors, typography, spacing, radius, line widths, and shadows. Works with any webpage, not limited to Axure prototypes.',
205
+ inputSchema: {
206
+ type: 'object',
207
+ properties: {
208
+ url: {
209
+ type: 'string',
210
+ description: 'URL of the page to extract theme from (optional, uses current active tab if not provided)',
211
+ },
212
+ },
213
+ required: [],
214
+ },
215
+ },
216
+ {
217
+ name: exports.TOOL_NAMES.BROWSER.DOWNLOAD_PAGE_DATA,
218
+ description: 'Download complete page data package (including theme, DOM structure, styles, screenshot, and images) as a zip file and return the local file path. This tool is useful for AI to analyze page structure and design.',
219
+ inputSchema: {
220
+ type: 'object',
221
+ properties: {
222
+ url: {
223
+ type: 'string',
224
+ description: 'URL of the page to download data from (optional, uses current active tab if not provided)',
225
+ },
226
+ filename: {
227
+ type: 'string',
228
+ description: 'Custom filename for the downloaded zip file (optional, default: cursor-export-{timestamp}.zip)',
229
+ },
230
+ },
231
+ required: [],
232
+ },
233
+ },
187
234
  ];
188
235
  //# sourceMappingURL=shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":";AAAA,qDAAqD;AACrD,sEAAsE;;;AAEtE,IAAY,iBAgCX;AAhCD,WAAY,iBAAiB;IAC3B,oCAAe,CAAA;IACf,wCAAmB,CAAA;IACnB,kCAAa,CAAA;IACb,wCAAmB,CAAA;IACnB,kCAAa,CAAA;IACb,kCAAa,CAAA;IACb,oCAAe,CAAA;IACf,kDAA6B,CAAA;IAC7B,oEAA+C,CAAA;IAC/C,4CAAuB,CAAA;IACvB,8DAAyC,CAAA;IACzC,oDAAoD;IACpD,sDAAiC,CAAA;IACjC,sDAAiC,CAAA;IACjC,sEAAiD,CAAA;IACjD,qDAAgC,CAAA;IAChC,gDAA2B,CAAA;IAC3B,4DAAuC,CAAA;IACvC,2BAA2B;IAC3B,wDAAmC,CAAA;IACnC,sDAAiC,CAAA;IACjC,4DAAuC,CAAA;IACvC,4DAAuC,CAAA;IACvC,0DAAqC,CAAA;IACrC,sDAAsD;IACtD,oDAA+B,CAAA;IAC/B,oDAA+B,CAAA;IAC/B,sDAAiC,CAAA;IACjC,qCAAqC;IACrC,8EAAyD,CAAA;IACzD,oFAA+D,CAAA;AACjE,CAAC,EAhCW,iBAAiB,iCAAjB,iBAAiB,QAgC5B;AASD,4CAA4C;AAC5C,mDAAmD;AAEtC,QAAA,UAAU,GAAG;IACxB,OAAO,EAAE;QACP,sBAAsB,EAAE,cAAc;QACtC,iBAAiB,EAAE,mBAAmB;QACtC,yBAAyB,EAAE,sBAAsB;QACjD,cAAc,EAAE,gBAAgB;QAChC,sBAAsB,EAAE,wBAAwB;QAChD,mBAAmB,EAAE,gBAAgB;QACrC,eAAe,EAAE,iBAAiB;QAClC,cAAc,EAAE,gBAAgB;QAChC,kBAAkB,EAAE,oBAAoB;KACzC;CACF,CAAC;AAKW,QAAA,YAAY,GAAW;IAClC;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,sBAAsB;QAC/C,WAAW,EAAE,+EAA+E;QAC5F,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iDAAiD;iBAC/D;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yDAAyD;iBACvE;aACF;YACD,QAAQ,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC;SAClC;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,iBAAiB;QAC1C,WAAW,EAAE,2EAA2E;QACxF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qGAAqG;iBACnH;aACF;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,yBAAyB;QAClD,WAAW,EAAE,gFAAgF;QAC7F,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;iBACnD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8CAA8C;iBAC5D;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2FAA2F;iBACzG;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2EAA2E;iBACzF;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4EAA4E;iBAC1F;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,qDAAqD;iBACnE;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,cAAc;QACvC,WAAW,EAAE,4FAA4F;QACzG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;iBACnD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uDAAuD;iBACrE;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iHAAiH;iBAC/H;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,sBAAsB;QAC/C,WAAW,EAAE,yEAAyE;QACtF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;iBACnD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gDAAgD;iBAC9D;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,mBAAmB;QAC5C,WAAW,EAAE,2DAA2D;QACxE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;iBACnD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qDAAqD;iBACnE;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,eAAe;QACxC,WAAW,EAAE,iGAAiG;QAC9G,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sEAAsE;iBACpF;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0FAA0F;iBACxG;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,uEAAuE;iBACrF;aACF;YACD,QAAQ,EAAE,CAAC,UAAU,CAAC;SACvB;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,cAAc;QACvC,WAAW,EAAE,iLAAiL;QAC9L,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2FAA2F;iBACzG;aACF;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IACD;QACE,IAAI,EAAE,kBAAU,CAAC,OAAO,CAAC,kBAAkB;QAC3C,WAAW,EAAE,qNAAqN;QAClO,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2FAA2F;iBACzG;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gGAAgG;iBAC9G;aACF;YACD,QAAQ,EAAE,EAAE;SACb;KACF;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ declare class Logger {
2
+ private logFilePath;
3
+ constructor();
4
+ private formatMessage;
5
+ log(message: string, data?: any): void;
6
+ error(message: string, data?: any): void;
7
+ warn(message: string, data?: any): void;
8
+ debug(message: string, data?: any): void;
9
+ close(): void;
10
+ }
11
+ export declare const logger: Logger;
12
+ export default logger;
@@ -0,0 +1,85 @@
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
+ exports.logger = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ class Logger {
10
+ constructor() {
11
+ // Determine log directory - use dist/logs in production, src/logs in development
12
+ const isDist = __dirname.includes('/dist/');
13
+ const baseDir = isDist
14
+ ? path_1.default.join(__dirname, '..', '..')
15
+ : path_1.default.join(__dirname, '..');
16
+ const logDir = path_1.default.join(baseDir, 'dist', 'logs');
17
+ // Create log directory if it doesn't exist
18
+ if (!fs_1.default.existsSync(logDir)) {
19
+ fs_1.default.mkdirSync(logDir, { recursive: true });
20
+ }
21
+ // Generate log file name with timestamp
22
+ const timestamp = new Date()
23
+ .toISOString()
24
+ .replace(/:/g, '')
25
+ .replace(/\./g, '_')
26
+ .replace(/T/, '_')
27
+ .slice(0, 15); // Format: YYYYMMDD_HHMMSS
28
+ const logFileName = `native_host_${timestamp}.log`;
29
+ this.logFilePath = path_1.default.join(logDir, logFileName);
30
+ this.log('Logger initialized', { logFile: this.logFilePath });
31
+ }
32
+ formatMessage(level, message, data) {
33
+ const timestamp = new Date().toISOString();
34
+ let formattedMessage = `[${timestamp}] [${level}] ${message}`;
35
+ if (data !== undefined) {
36
+ try {
37
+ formattedMessage += ' ' + JSON.stringify(data, null, 2);
38
+ }
39
+ catch (error) {
40
+ formattedMessage += ' [Unable to stringify data]';
41
+ }
42
+ }
43
+ return formattedMessage + '\n';
44
+ }
45
+ log(message, data) {
46
+ try {
47
+ // Use synchronous write to ensure logs are immediately written
48
+ fs_1.default.appendFileSync(this.logFilePath, this.formatMessage('INFO', message, data));
49
+ }
50
+ catch (error) {
51
+ // Silently fail to avoid breaking the application
52
+ }
53
+ }
54
+ error(message, data) {
55
+ try {
56
+ fs_1.default.appendFileSync(this.logFilePath, this.formatMessage('ERROR', message, data));
57
+ }
58
+ catch (error) {
59
+ // Silently fail
60
+ }
61
+ }
62
+ warn(message, data) {
63
+ try {
64
+ fs_1.default.appendFileSync(this.logFilePath, this.formatMessage('WARN', message, data));
65
+ }
66
+ catch (error) {
67
+ // Silently fail
68
+ }
69
+ }
70
+ debug(message, data) {
71
+ try {
72
+ fs_1.default.appendFileSync(this.logFilePath, this.formatMessage('DEBUG', message, data));
73
+ }
74
+ catch (error) {
75
+ // Silently fail
76
+ }
77
+ }
78
+ close() {
79
+ // No-op for sync logging
80
+ }
81
+ }
82
+ // Export singleton instance
83
+ exports.logger = new Logger();
84
+ exports.default = exports.logger;
85
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "axhub-mcp-bridge",
3
- "version": "1.0.35",
3
+ "version": "1.0.36",
4
4
  "description": "Chrome Native-Messaging host (Node)",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -16,7 +16,10 @@
16
16
  "lint:fix": "eslint 'src/**/*.{js,ts}' --fix",
17
17
  "format": "prettier --write 'src/**/*.{js,ts,json}'",
18
18
  "register:dev": "node dist/scripts/register-dev.js",
19
- "postinstall": "node dist/scripts/postinstall.js"
19
+ "postinstall": "node dist/scripts/postinstall.js",
20
+ "inspector": "npx -y @modelcontextprotocol/inspector@latest node dist/mcp/mcp-server-stdio.js",
21
+ "inspector:cli": "npx -y @modelcontextprotocol/inspector@latest --cli node dist/mcp/mcp-server-stdio.js",
22
+ "inspector:http": "npx -y @modelcontextprotocol/inspector@latest http://127.0.0.1:12307/mcp"
20
23
  },
21
24
  "files": [
22
25
  "dist"
@@ -33,7 +36,8 @@
33
36
  "fastify": "^5.3.2",
34
37
  "is-admin": "^4.0.0",
35
38
  "pino": "^9.6.0",
36
- "uuid": "^11.1.0"
39
+ "uuid": "^11.1.0",
40
+ "ws": "^8.18.3"
37
41
  },
38
42
  "devDependencies": {
39
43
  "@jest/globals": "^29.7.0",
@@ -41,6 +45,7 @@
41
45
  "@types/jest": "^29.5.14",
42
46
  "@types/node": "^22.15.3",
43
47
  "@types/supertest": "^6.0.3",
48
+ "@types/ws": "^8.18.1",
44
49
  "@typescript-eslint/parser": "^8.31.1",
45
50
  "cross-env": "^7.0.3",
46
51
  "husky": "^9.1.7",
@@ -59,7 +64,7 @@
59
64
  }
60
65
  },
61
66
  "lint-staged": {
62
- "*.{js,ts}": [
67
+ "*.{js,ts}": [
63
68
  "eslint --fix",
64
69
  "prettier --write"
65
70
  ],
@@ -67,4 +72,4 @@
67
72
  "prettier --write"
68
73
  ]
69
74
  }
70
- }
75
+ }