gravity-core 1.0.21 → 1.0.23
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/mcp-server.js +1 -1
- package/dist/native-host.js +35 -99
- package/dist/native-host.js.map +1 -1
- package/extension/manifest.json +1 -1
- package/package.json +2 -1
package/dist/mcp-server.js
CHANGED
package/dist/native-host.js
CHANGED
|
@@ -10,80 +10,17 @@
|
|
|
10
10
|
* MCP Server ← WebSocket → Native Host ← Native Messaging → Extension ← CDP → Browser
|
|
11
11
|
*/
|
|
12
12
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
13
|
+
// @ts-ignore - no types available
|
|
14
|
+
import nativeMessage from 'chrome-native-messaging';
|
|
13
15
|
const WS_PORT = 9224;
|
|
14
16
|
let wsServer = null;
|
|
15
17
|
let wsClient = null;
|
|
16
|
-
/**
|
|
17
|
-
* Read native messaging message from stdin
|
|
18
|
-
*/
|
|
19
|
-
function readNativeMessage() {
|
|
20
|
-
return new Promise((resolve, reject) => {
|
|
21
|
-
const headerBuffer = Buffer.alloc(4);
|
|
22
|
-
let headerBytesRead = 0;
|
|
23
|
-
const readHeader = () => {
|
|
24
|
-
const chunk = process.stdin.read(4 - headerBytesRead);
|
|
25
|
-
if (chunk) {
|
|
26
|
-
chunk.copy(headerBuffer, headerBytesRead);
|
|
27
|
-
headerBytesRead += chunk.length;
|
|
28
|
-
if (headerBytesRead === 4) {
|
|
29
|
-
const messageLength = headerBuffer.readUInt32LE(0);
|
|
30
|
-
readMessage(messageLength);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
process.stdin.once('readable', readHeader);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
process.stdin.once('readable', readHeader);
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
const readMessage = (length) => {
|
|
41
|
-
const messageBuffer = Buffer.alloc(length);
|
|
42
|
-
let messageBytesRead = 0;
|
|
43
|
-
const readChunk = () => {
|
|
44
|
-
const chunk = process.stdin.read(length - messageBytesRead);
|
|
45
|
-
if (chunk) {
|
|
46
|
-
chunk.copy(messageBuffer, messageBytesRead);
|
|
47
|
-
messageBytesRead += chunk.length;
|
|
48
|
-
if (messageBytesRead === length) {
|
|
49
|
-
try {
|
|
50
|
-
const message = JSON.parse(messageBuffer.toString('utf-8'));
|
|
51
|
-
resolve(message);
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
reject(error);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
process.stdin.once('readable', readChunk);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
process.stdin.once('readable', readChunk);
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
readChunk();
|
|
66
|
-
};
|
|
67
|
-
readHeader();
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Send native messaging message to stdout
|
|
72
|
-
*/
|
|
73
|
-
function sendNativeMessage(message) {
|
|
74
|
-
const messageStr = JSON.stringify(message);
|
|
75
|
-
const messageBuffer = Buffer.from(messageStr, 'utf-8');
|
|
76
|
-
const headerBuffer = Buffer.alloc(4);
|
|
77
|
-
headerBuffer.writeUInt32LE(messageBuffer.length, 0);
|
|
78
|
-
process.stdout.write(headerBuffer);
|
|
79
|
-
process.stdout.write(messageBuffer);
|
|
80
|
-
}
|
|
81
18
|
/**
|
|
82
19
|
* Start WebSocket server for MCP connections
|
|
83
20
|
*/
|
|
84
21
|
function startWebSocketServer() {
|
|
85
22
|
wsServer = new WebSocketServer({ port: WS_PORT });
|
|
86
|
-
console.error(
|
|
23
|
+
console.error('[Native Host] WebSocket server listening on port', WS_PORT);
|
|
87
24
|
wsServer.on('connection', (ws) => {
|
|
88
25
|
console.error('[Native Host] MCP server connected');
|
|
89
26
|
wsClient = ws;
|
|
@@ -91,8 +28,8 @@ function startWebSocketServer() {
|
|
|
91
28
|
try {
|
|
92
29
|
const message = JSON.parse(data.toString());
|
|
93
30
|
console.error('[Native Host] MCP → Extension:', message.type || message.method);
|
|
94
|
-
// Forward to extension via native messaging
|
|
95
|
-
|
|
31
|
+
// Forward to extension via native messaging (stdout)
|
|
32
|
+
output.write(message);
|
|
96
33
|
}
|
|
97
34
|
catch (error) {
|
|
98
35
|
console.error('[Native Host] Error processing WebSocket message:', error.message);
|
|
@@ -112,41 +49,43 @@ function startWebSocketServer() {
|
|
|
112
49
|
});
|
|
113
50
|
}
|
|
114
51
|
/**
|
|
115
|
-
*
|
|
52
|
+
* Setup Native Messaging streams
|
|
116
53
|
*/
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if (wsClient && wsClient.readyState === WebSocket.OPEN) {
|
|
125
|
-
wsClient.send(JSON.stringify(message));
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
console.error('[Native Host] No MCP client connected, message dropped');
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
console.error('[Native Host] Error reading from extension:', error.message);
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
54
|
+
const input = new nativeMessage.Input();
|
|
55
|
+
const output = new nativeMessage.Output();
|
|
56
|
+
const transform = new nativeMessage.Transform((msg, push, done) => {
|
|
57
|
+
console.error('[Native Host] Extension → MCP:', msg.type);
|
|
58
|
+
// Forward to MCP server via WebSocket
|
|
59
|
+
if (wsClient && wsClient.readyState === WebSocket.OPEN) {
|
|
60
|
+
wsClient.send(JSON.stringify(msg));
|
|
135
61
|
}
|
|
136
|
-
|
|
62
|
+
else {
|
|
63
|
+
console.error('[Native Host] No MCP client connected, message dropped');
|
|
64
|
+
}
|
|
65
|
+
done();
|
|
66
|
+
});
|
|
137
67
|
/**
|
|
138
68
|
* Main entry point
|
|
139
69
|
*/
|
|
140
|
-
|
|
70
|
+
function main() {
|
|
141
71
|
console.error('[Native Host] Starting Gravity Native Host...');
|
|
142
72
|
// Start WebSocket server
|
|
143
73
|
startWebSocketServer();
|
|
144
|
-
//
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
74
|
+
// Setup Native Messaging pipeline
|
|
75
|
+
process.stdin
|
|
76
|
+
.pipe(input)
|
|
77
|
+
.pipe(transform)
|
|
78
|
+
.pipe(output)
|
|
79
|
+
.pipe(process.stdout);
|
|
80
|
+
console.error('[Native Host] Ready and waiting for messages...');
|
|
81
|
+
// Handle stdin close
|
|
82
|
+
process.stdin.on('end', () => {
|
|
83
|
+
console.error('[Native Host] Extension disconnected (stdin closed)');
|
|
84
|
+
if (wsServer) {
|
|
85
|
+
wsServer.close();
|
|
86
|
+
}
|
|
87
|
+
process.exit(0);
|
|
88
|
+
});
|
|
150
89
|
}
|
|
151
90
|
// Handle graceful shutdown
|
|
152
91
|
process.on('SIGINT', () => {
|
|
@@ -163,8 +102,5 @@ process.on('SIGTERM', () => {
|
|
|
163
102
|
}
|
|
164
103
|
process.exit(0);
|
|
165
104
|
});
|
|
166
|
-
main()
|
|
167
|
-
console.error('[Native Host] Fatal error:', error);
|
|
168
|
-
process.exit(1);
|
|
169
|
-
});
|
|
105
|
+
main();
|
|
170
106
|
//# sourceMappingURL=native-host.js.map
|
package/dist/native-host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-host.js","sourceRoot":"","sources":["../src/native-host.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"native-host.js","sourceRoot":"","sources":["../src/native-host.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,kCAAkC;AAClC,OAAO,aAAa,MAAM,yBAAyB,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,IAAI,QAAQ,GAA2B,IAAI,CAAC;AAC5C,IAAI,QAAQ,GAAqB,IAAI,CAAC;AAEtC;;GAEG;AACH,SAAS,oBAAoB;IAC3B,QAAQ,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAElD,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,OAAO,CAAC,CAAC;IAE3E,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAa,EAAE,EAAE;QAC1C,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpD,QAAQ,GAAG,EAAE,CAAC;QAEd,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE;YAChC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;gBAEhF,qDAAqD;gBACrD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,mDAAmD,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACpF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YACvD,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;QACpC,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;AACxC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;AAC1C,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC,GAAQ,EAAE,IAAwB,EAAE,IAAgB,EAAE,EAAE;IACrG,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAE1D,sCAAsC;IACtC,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,EAAE,CAAC;AACT,CAAC,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,IAAI;IACX,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAE/D,yBAAyB;IACzB,oBAAoB,EAAE,CAAC;IAEvB,kCAAkC;IAClC,OAAO,CAAC,KAAK;SACV,IAAI,CAAC,KAAK,CAAC;SACX,IAAI,CAAC,SAAS,CAAC;SACf,IAAI,CAAC,MAAM,CAAC;SACZ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAEjE,qBAAqB;IACrB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;QAC3B,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,2BAA2B;AAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAChD,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAChD,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,IAAI,EAAE,CAAC"}
|
package/extension/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gravity-core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.23",
|
|
4
4
|
"description": "Gravity - AI-powered CSS layout diagnostics for any IDE. Connect your browser to get real-time layout issue detection.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"node": ">=16.0.0"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
+
"chrome-native-messaging": "^0.2.0",
|
|
49
50
|
"ws": "^8.18.0"
|
|
50
51
|
},
|
|
51
52
|
"devDependencies": {
|