gitnexus-mcp 0.1.0 → 0.1.1
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/bridge/protocol.d.ts +14 -7
- package/dist/bridge/protocol.d.ts.map +1 -1
- package/dist/bridge/protocol.js +1 -1
- package/dist/bridge/protocol.js.map +1 -1
- package/dist/bridge/websocket-server.d.ts +13 -46
- package/dist/bridge/websocket-server.d.ts.map +1 -1
- package/dist/bridge/websocket-server.js +239 -82
- package/dist/bridge/websocket-server.js.map +1 -1
- package/package.json +6 -4
|
@@ -3,20 +3,27 @@
|
|
|
3
3
|
*
|
|
4
4
|
* JSON-RPC-like protocol for communication between bridge and browser.
|
|
5
5
|
*/
|
|
6
|
-
export interface
|
|
7
|
-
id: string;
|
|
8
|
-
method: string;
|
|
9
|
-
params: Record<string, any>;
|
|
10
|
-
}
|
|
11
|
-
export interface ToolCallResponse {
|
|
6
|
+
export interface BridgeMessage {
|
|
12
7
|
id: string;
|
|
8
|
+
type?: 'register_peer' | 'tool_call' | 'tool_result' | 'agent_info' | 'handshake' | 'handshake_ack' | 'context';
|
|
9
|
+
method?: string;
|
|
10
|
+
params?: any;
|
|
13
11
|
result?: any;
|
|
14
12
|
error?: {
|
|
15
13
|
code?: number;
|
|
16
14
|
message: string;
|
|
17
15
|
};
|
|
16
|
+
agentName?: string;
|
|
17
|
+
peerId?: string;
|
|
18
18
|
}
|
|
19
|
-
export type
|
|
19
|
+
export type ToolCallRequest = BridgeMessage & {
|
|
20
|
+
method: string;
|
|
21
|
+
};
|
|
22
|
+
export type ToolCallResponse = BridgeMessage & ({
|
|
23
|
+
result: any;
|
|
24
|
+
} | {
|
|
25
|
+
error: any;
|
|
26
|
+
});
|
|
20
27
|
/**
|
|
21
28
|
* Check if message is a request (has method)
|
|
22
29
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,eAAe,GAAG,WAAW,GAAG,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;IAChH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACjE,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,CAAC;IAAE,MAAM,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,GAAG,CAAA;CAAE,CAAC,CAAC;AAElF;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,GAAG,IAAI,eAAe,CAEpE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,GAAG,IAAI,gBAAgB,CAEtE"}
|
package/dist/bridge/protocol.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAkB;IAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/bridge/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAkB;IAC1C,OAAO,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAkB;IAC3C,OAAO,QAAQ,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC;AAC3C,CAAC"}
|
|
@@ -1,20 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket Bridge
|
|
3
|
-
*
|
|
4
|
-
* WebSocket server that connects to the GitNexus browser tab.
|
|
5
|
-
* Relays tool calls from MCP server to browser and returns results.
|
|
6
|
-
*/
|
|
7
|
-
export interface BridgeMessage {
|
|
8
|
-
id: string;
|
|
9
|
-
method?: string;
|
|
10
|
-
params?: any;
|
|
11
|
-
result?: any;
|
|
12
|
-
error?: {
|
|
13
|
-
message: string;
|
|
14
|
-
};
|
|
15
|
-
type?: 'context' | string;
|
|
16
|
-
agentName?: string;
|
|
17
|
-
}
|
|
18
1
|
/**
|
|
19
2
|
* Codebase context sent from the GitNexus browser app
|
|
20
3
|
*/
|
|
@@ -36,50 +19,34 @@ export interface CodebaseContext {
|
|
|
36
19
|
folderTree: string;
|
|
37
20
|
}
|
|
38
21
|
export declare class WebSocketBridge {
|
|
39
|
-
private port;
|
|
40
22
|
private wss;
|
|
41
23
|
private client;
|
|
24
|
+
private browserClient;
|
|
25
|
+
private peerClients;
|
|
42
26
|
private pendingRequests;
|
|
43
27
|
private requestId;
|
|
44
28
|
private started;
|
|
45
29
|
private _context;
|
|
46
30
|
private contextListeners;
|
|
47
31
|
private agentName;
|
|
32
|
+
private isHub;
|
|
33
|
+
private port;
|
|
48
34
|
constructor(port?: number, agentName?: string);
|
|
49
35
|
private detectAgent;
|
|
50
|
-
/**
|
|
51
|
-
* Start the WebSocket server (handles port-in-use gracefully)
|
|
52
|
-
*/
|
|
53
36
|
start(): Promise<boolean>;
|
|
54
|
-
private
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
37
|
+
private startAsHub;
|
|
38
|
+
private handleHubMessage;
|
|
39
|
+
private handleHubDisconnect;
|
|
40
|
+
private broadcastToPeers;
|
|
41
|
+
private startAsPeer;
|
|
42
|
+
private handlePeerMessage;
|
|
43
|
+
private handleResponseLocal;
|
|
58
44
|
get isConnected(): boolean;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
*/
|
|
62
|
-
get context(): CodebaseContext | null;
|
|
63
|
-
/**
|
|
64
|
-
* Listen for context changes
|
|
65
|
-
*/
|
|
66
|
-
onContextChange(listener: (context: CodebaseContext | null) => void): () => boolean;
|
|
45
|
+
get context(): any;
|
|
46
|
+
onContextChange(listener: (context: any) => void): () => boolean;
|
|
67
47
|
private notifyContextListeners;
|
|
68
|
-
/**
|
|
69
|
-
* Check if server started successfully
|
|
70
|
-
*/
|
|
71
|
-
get isStarted(): boolean;
|
|
72
|
-
/**
|
|
73
|
-
* Call a tool in the browser
|
|
74
|
-
*/
|
|
75
48
|
callTool(method: string, params: any): Promise<any>;
|
|
76
|
-
/**
|
|
77
|
-
* Close the WebSocket server
|
|
78
|
-
*/
|
|
79
49
|
close(): void;
|
|
80
|
-
/**
|
|
81
|
-
* MCP server calls this on shutdown
|
|
82
|
-
*/
|
|
83
50
|
disconnect(): void;
|
|
84
51
|
}
|
|
85
52
|
//# sourceMappingURL=websocket-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-server.d.ts","sourceRoot":"","sources":["../../src/bridge/websocket-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"websocket-server.d.ts","sourceRoot":"","sources":["../../src/bridge/websocket-server.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAiBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,MAAM,CAA0B;IAGxC,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,WAAW,CAAqC;IAGxD,OAAO,CAAC,eAAe,CAAuF;IAC9G,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,gBAAgB,CAAiD;IACzE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,GAAE,MAAc,EAAE,SAAS,CAAC,EAAE,MAAM;IAKpD,OAAO,CAAC,WAAW;IAOb,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;YAcjB,UAAU;IA2BxB,OAAO,CAAC,gBAAgB;IAyFxB,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,gBAAgB;YAYV,WAAW;IA+DzB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,mBAAmB;IAc3B,IAAI,WAAW,IAAI,OAAO,CAMzB;IAED,IAAI,OAAO,IAAI,GAAG,CAEjB;IAED,eAAe,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI;IAKhD,OAAO,CAAC,sBAAsB;IAIxB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IA8CzD,KAAK;IAKL,UAAU;CAGX"}
|
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket Bridge
|
|
3
|
-
*
|
|
4
|
-
* WebSocket server that connects to the GitNexus browser tab.
|
|
5
|
-
* Relays tool calls from MCP server to browser and returns results.
|
|
6
|
-
*/
|
|
7
1
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
8
2
|
import { createServer as createNetServer } from 'net';
|
|
3
|
+
import { isRequest, isResponse } from './protocol.js';
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
9
5
|
/**
|
|
10
|
-
* Check if a
|
|
6
|
+
* Check if a Port is available
|
|
11
7
|
*/
|
|
12
8
|
async function isPortAvailable(port) {
|
|
13
9
|
return new Promise((resolve) => {
|
|
@@ -21,93 +17,245 @@ async function isPortAvailable(port) {
|
|
|
21
17
|
});
|
|
22
18
|
}
|
|
23
19
|
export class WebSocketBridge {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
wss = null; // Used if we are the Hub
|
|
21
|
+
client = null; // Used if we are a Peer (connecting to Hub), OR if we are Hub (clients connecting to us)
|
|
22
|
+
// Hub State
|
|
23
|
+
browserClient = null;
|
|
24
|
+
peerClients = new Map();
|
|
25
|
+
// Common State
|
|
27
26
|
pendingRequests = new Map();
|
|
28
27
|
requestId = 0;
|
|
29
28
|
started = false;
|
|
30
|
-
_context = null;
|
|
29
|
+
_context = null; // CodebaseContext
|
|
31
30
|
contextListeners = new Set();
|
|
32
31
|
agentName;
|
|
32
|
+
isHub = false;
|
|
33
|
+
port = 54319;
|
|
33
34
|
constructor(port = 54319, agentName) {
|
|
34
35
|
this.port = port;
|
|
35
36
|
this.agentName = agentName || process.env.GITNEXUS_AGENT || this.detectAgent();
|
|
36
37
|
}
|
|
37
38
|
detectAgent() {
|
|
38
|
-
// Try to detect agent from environment clues
|
|
39
39
|
if (process.env.CURSOR_SESSION_ID)
|
|
40
40
|
return 'Cursor';
|
|
41
41
|
if (process.env.CLAUDE_CODE)
|
|
42
42
|
return 'Claude Code';
|
|
43
43
|
if (process.env.WINDSURF_SESSION)
|
|
44
44
|
return 'Windsurf';
|
|
45
|
-
return 'Unknown';
|
|
45
|
+
return 'Unknown Agent';
|
|
46
46
|
}
|
|
47
|
-
/**
|
|
48
|
-
* Start the WebSocket server (handles port-in-use gracefully)
|
|
49
|
-
*/
|
|
50
47
|
async start() {
|
|
51
48
|
const available = await isPortAvailable(this.port);
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
-
// This is OK - we can still run MCP server for stdio communication
|
|
55
|
-
console.error(`Port ${this.port} in use. Browser bridge running elsewhere.`);
|
|
56
|
-
return false;
|
|
49
|
+
if (available) {
|
|
50
|
+
return this.startAsHub();
|
|
57
51
|
}
|
|
52
|
+
else {
|
|
53
|
+
return this.startAsPeer();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// -------------------------------------------------------------------------
|
|
57
|
+
// Hub Implementation (Master)
|
|
58
|
+
// -------------------------------------------------------------------------
|
|
59
|
+
async startAsHub() {
|
|
60
|
+
console.error(`Starting as MCP Hub on port ${this.port}`);
|
|
61
|
+
this.isHub = true;
|
|
58
62
|
return new Promise((resolve) => {
|
|
59
63
|
this.wss = new WebSocketServer({ port: this.port });
|
|
60
|
-
this.wss.on('connection', (ws) => {
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
this.wss.on('connection', (ws, req) => {
|
|
65
|
+
// Security: Origin check could go here if req.headers.origin available
|
|
66
|
+
ws.on('message', (data) => this.handleHubMessage(ws, data));
|
|
67
|
+
ws.on('close', () => this.handleHubDisconnect(ws));
|
|
68
|
+
ws.on('error', (err) => console.error('Hub client error:', err));
|
|
69
|
+
});
|
|
70
|
+
this.wss.on('listening', () => {
|
|
71
|
+
this.started = true;
|
|
72
|
+
resolve(true);
|
|
73
|
+
});
|
|
74
|
+
this.wss.on('error', (err) => {
|
|
75
|
+
console.error('Hub server error:', err);
|
|
76
|
+
resolve(false);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
handleHubMessage(ws, data) {
|
|
81
|
+
try {
|
|
82
|
+
const msg = JSON.parse(data.toString());
|
|
83
|
+
if (msg.type === 'handshake') {
|
|
84
|
+
// Peer verifying we are GitNexus
|
|
85
|
+
ws.send(JSON.stringify({ type: 'handshake_ack', id: msg.id }));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (msg.type === 'register_peer') {
|
|
89
|
+
// Peer registering itself
|
|
90
|
+
const peerId = uuidv4();
|
|
91
|
+
this.peerClients.set(peerId, ws);
|
|
92
|
+
ws.peerId = peerId;
|
|
93
|
+
ws.agentName = msg.agentName;
|
|
94
|
+
console.error(`Peer connected: ${msg.agentName} (${peerId})`);
|
|
95
|
+
// Forward current context to new peer if available
|
|
96
|
+
if (this._context) {
|
|
97
|
+
ws.send(JSON.stringify({ type: 'context', params: this._context }));
|
|
98
|
+
}
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Handle Context updates (from Browser)
|
|
102
|
+
if (msg.type === 'context') {
|
|
103
|
+
// Browser identified itself (implicitly)
|
|
104
|
+
if (this.browserClient !== ws) {
|
|
105
|
+
if (this.browserClient)
|
|
106
|
+
this.browserClient.close();
|
|
107
|
+
this.browserClient = ws;
|
|
108
|
+
console.error('Browser connected to Hub');
|
|
64
109
|
}
|
|
65
|
-
this.
|
|
66
|
-
// Clear context until browser sends an update
|
|
67
|
-
this._context = null;
|
|
110
|
+
this._context = msg.params;
|
|
68
111
|
this.notifyContextListeners();
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
112
|
+
// Broadcast context to all peers
|
|
113
|
+
this.broadcastToPeers(msg);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// Handle Tool Calls (Peer/Hub -> Browser)
|
|
117
|
+
if (isRequest(msg)) {
|
|
118
|
+
// If it came from a ws client (Peer), validation needed?
|
|
119
|
+
// We assume it's destined for the Browser
|
|
120
|
+
if (this.browserClient && this.browserClient.readyState === WebSocket.OPEN) {
|
|
121
|
+
// Attach agent info if missing (for UI)
|
|
122
|
+
if (!msg.agentName && ws.agentName) {
|
|
123
|
+
msg.agentName = ws.agentName;
|
|
73
124
|
}
|
|
74
|
-
|
|
75
|
-
|
|
125
|
+
// Attach peerId so we can route response back
|
|
126
|
+
if (!msg.peerId && ws.peerId) {
|
|
127
|
+
msg.peerId = ws.peerId;
|
|
128
|
+
}
|
|
129
|
+
this.browserClient.send(JSON.stringify(msg));
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Browser not connected, fail
|
|
133
|
+
if (msg.id) {
|
|
134
|
+
ws.send(JSON.stringify({
|
|
135
|
+
id: msg.id,
|
|
136
|
+
error: { message: "Browser not connected. Open GitNexus." }
|
|
137
|
+
}));
|
|
76
138
|
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
139
|
+
}
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Handle Tool Results (Browser -> Peer/Hub)
|
|
143
|
+
if (isResponse(msg)) {
|
|
144
|
+
// Route to the correct peer
|
|
145
|
+
if (msg.peerId && this.peerClients.has(msg.peerId)) {
|
|
146
|
+
const peer = this.peerClients.get(msg.peerId);
|
|
147
|
+
if (peer?.readyState === WebSocket.OPEN) {
|
|
148
|
+
peer.send(JSON.stringify(msg));
|
|
83
149
|
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// It might be for Us (the Hub)
|
|
153
|
+
this.handleResponseLocal(msg);
|
|
154
|
+
}
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
console.error('Hub: Failed to parse message', e);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
handleHubDisconnect(ws) {
|
|
163
|
+
if (ws === this.browserClient) {
|
|
164
|
+
console.error('Browser disconnected from Hub');
|
|
165
|
+
this.browserClient = null;
|
|
166
|
+
this._context = null;
|
|
167
|
+
this.notifyContextListeners();
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
const peerId = ws.peerId;
|
|
171
|
+
if (peerId) {
|
|
172
|
+
this.peerClients.delete(peerId);
|
|
173
|
+
console.error(`Peer disconnected: ${peerId}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
broadcastToPeers(msg) {
|
|
178
|
+
for (const client of this.peerClients.values()) {
|
|
179
|
+
if (client.readyState === WebSocket.OPEN) {
|
|
180
|
+
client.send(JSON.stringify(msg));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// -------------------------------------------------------------------------
|
|
185
|
+
// Peer Implementation (Spoke)
|
|
186
|
+
// -------------------------------------------------------------------------
|
|
187
|
+
async startAsPeer() {
|
|
188
|
+
console.error(`Port ${this.port} busy. Attempting to connect as Peer...`);
|
|
189
|
+
return new Promise((resolve) => {
|
|
190
|
+
const ws = new WebSocket(`ws://localhost:${this.port}`);
|
|
191
|
+
const timeout = setTimeout(() => {
|
|
192
|
+
console.error('Handshake timeout. Port is busy by unknown app.');
|
|
193
|
+
ws.close();
|
|
194
|
+
resolve(false);
|
|
195
|
+
}, 1000);
|
|
196
|
+
ws.on('open', () => {
|
|
197
|
+
// Send Handshake
|
|
198
|
+
ws.send(JSON.stringify({ type: 'handshake', id: 'init' }));
|
|
88
199
|
});
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
200
|
+
ws.on('message', (data) => {
|
|
201
|
+
try {
|
|
202
|
+
const msg = JSON.parse(data.toString());
|
|
203
|
+
// Handshake success?
|
|
204
|
+
if (msg.type === 'handshake_ack') {
|
|
205
|
+
clearTimeout(timeout);
|
|
206
|
+
console.error('Handshake successful. Joining as Peer.');
|
|
207
|
+
// Register ourselves
|
|
208
|
+
ws.send(JSON.stringify({
|
|
209
|
+
type: 'register_peer',
|
|
210
|
+
agentName: this.agentName
|
|
211
|
+
}));
|
|
212
|
+
this.client = ws;
|
|
213
|
+
this.started = true;
|
|
214
|
+
resolve(true);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
// Normal messages from Hub
|
|
218
|
+
this.handlePeerMessage(msg);
|
|
219
|
+
}
|
|
220
|
+
catch (e) {
|
|
221
|
+
// ignore garbage
|
|
222
|
+
}
|
|
92
223
|
});
|
|
93
|
-
|
|
94
|
-
console.error('
|
|
224
|
+
ws.on('error', (err) => {
|
|
225
|
+
console.error('Peer connection error:', err);
|
|
95
226
|
resolve(false);
|
|
96
227
|
});
|
|
228
|
+
// If connection fails immediately
|
|
229
|
+
ws.on('close', () => {
|
|
230
|
+
if (!this.started)
|
|
231
|
+
resolve(false);
|
|
232
|
+
else {
|
|
233
|
+
this.client = null;
|
|
234
|
+
this._context = null;
|
|
235
|
+
this.notifyContextListeners();
|
|
236
|
+
}
|
|
237
|
+
});
|
|
97
238
|
});
|
|
98
239
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (msg.type === 'context' && msg.params) {
|
|
240
|
+
handlePeerMessage(msg) {
|
|
241
|
+
if (msg.type === 'context') {
|
|
102
242
|
this._context = msg.params;
|
|
103
243
|
this.notifyContextListeners();
|
|
104
244
|
return;
|
|
105
245
|
}
|
|
106
|
-
|
|
246
|
+
if (isResponse(msg)) {
|
|
247
|
+
this.handleResponseLocal(msg);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// -------------------------------------------------------------------------
|
|
251
|
+
// Shared / Public API
|
|
252
|
+
// -------------------------------------------------------------------------
|
|
253
|
+
handleResponseLocal(msg) {
|
|
107
254
|
if (msg.id && this.pendingRequests.has(msg.id)) {
|
|
108
255
|
const { resolve, reject } = this.pendingRequests.get(msg.id);
|
|
109
256
|
this.pendingRequests.delete(msg.id);
|
|
110
257
|
if (msg.error) {
|
|
258
|
+
// We'll reject the promise so caller knows
|
|
111
259
|
reject(new Error(msg.error.message));
|
|
112
260
|
}
|
|
113
261
|
else {
|
|
@@ -115,21 +263,17 @@ export class WebSocketBridge {
|
|
|
115
263
|
}
|
|
116
264
|
}
|
|
117
265
|
}
|
|
118
|
-
/**
|
|
119
|
-
* Check if browser is connected
|
|
120
|
-
*/
|
|
121
266
|
get isConnected() {
|
|
122
|
-
|
|
267
|
+
if (this.isHub) {
|
|
268
|
+
return this.browserClient !== null && this.browserClient.readyState === WebSocket.OPEN;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
return this.client !== null && this.client.readyState === WebSocket.OPEN;
|
|
272
|
+
}
|
|
123
273
|
}
|
|
124
|
-
/**
|
|
125
|
-
* Latest context received from browser (if any)
|
|
126
|
-
*/
|
|
127
274
|
get context() {
|
|
128
275
|
return this._context;
|
|
129
276
|
}
|
|
130
|
-
/**
|
|
131
|
-
* Listen for context changes
|
|
132
|
-
*/
|
|
133
277
|
onContextChange(listener) {
|
|
134
278
|
this.contextListeners.add(listener);
|
|
135
279
|
return () => this.contextListeners.delete(listener);
|
|
@@ -137,25 +281,43 @@ export class WebSocketBridge {
|
|
|
137
281
|
notifyContextListeners() {
|
|
138
282
|
this.contextListeners.forEach((listener) => listener(this._context));
|
|
139
283
|
}
|
|
140
|
-
/**
|
|
141
|
-
* Check if server started successfully
|
|
142
|
-
*/
|
|
143
|
-
get isStarted() {
|
|
144
|
-
return this.started;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Call a tool in the browser
|
|
148
|
-
*/
|
|
149
284
|
async callTool(method, params) {
|
|
150
285
|
if (!this.isConnected) {
|
|
151
|
-
|
|
286
|
+
if (this.isHub)
|
|
287
|
+
throw new Error('GitNexus Browser not connected.');
|
|
288
|
+
else
|
|
289
|
+
throw new Error('GitNexus Hub disonnected.');
|
|
152
290
|
}
|
|
153
291
|
const id = `req_${++this.requestId}`;
|
|
154
292
|
return new Promise((resolve, reject) => {
|
|
155
293
|
this.pendingRequests.set(id, { resolve, reject });
|
|
156
|
-
const msg = {
|
|
157
|
-
|
|
158
|
-
|
|
294
|
+
const msg = {
|
|
295
|
+
id,
|
|
296
|
+
method,
|
|
297
|
+
params,
|
|
298
|
+
agentName: this.agentName,
|
|
299
|
+
// type is implicitly request because of method
|
|
300
|
+
};
|
|
301
|
+
if (this.isHub) {
|
|
302
|
+
// Send directly to browser
|
|
303
|
+
if (this.browserClient && this.browserClient.readyState === WebSocket.OPEN) {
|
|
304
|
+
this.browserClient.send(JSON.stringify(msg));
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
this.pendingRequests.delete(id);
|
|
308
|
+
reject(new Error('Browser not connected'));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
// Send to Hub (who forwards to browser)
|
|
313
|
+
if (this.client && this.client.readyState === WebSocket.OPEN) {
|
|
314
|
+
this.client.send(JSON.stringify(msg));
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
this.pendingRequests.delete(id);
|
|
318
|
+
reject(new Error('Hub disconnected'));
|
|
319
|
+
}
|
|
320
|
+
}
|
|
159
321
|
setTimeout(() => {
|
|
160
322
|
if (this.pendingRequests.has(id)) {
|
|
161
323
|
this.pendingRequests.delete(id);
|
|
@@ -164,15 +326,10 @@ export class WebSocketBridge {
|
|
|
164
326
|
}, 30000);
|
|
165
327
|
});
|
|
166
328
|
}
|
|
167
|
-
/**
|
|
168
|
-
* Close the WebSocket server
|
|
169
|
-
*/
|
|
170
329
|
close() {
|
|
171
330
|
this.wss?.close();
|
|
331
|
+
this.client?.close();
|
|
172
332
|
}
|
|
173
|
-
/**
|
|
174
|
-
* MCP server calls this on shutdown
|
|
175
|
-
*/
|
|
176
333
|
disconnect() {
|
|
177
334
|
this.close();
|
|
178
335
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-server.js","sourceRoot":"","sources":["../../src/bridge/websocket-server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"websocket-server.js","sourceRoot":"","sources":["../../src/bridge/websocket-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gitnexus-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "MCP server for GitNexus code intelligence - connect Cursor, Claude, and other AI agents to your codebase",
|
|
5
5
|
"author": "Abhigyan Patwari",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,15 +31,17 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
34
|
+
"uuid": "^13.0.0",
|
|
34
35
|
"ws": "^8.16.0"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|
|
37
38
|
"@types/node": "^20.0.0",
|
|
39
|
+
"@types/uuid": "^10.0.0",
|
|
38
40
|
"@types/ws": "^8.5.10",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
+
"tsx": "^4.0.0",
|
|
42
|
+
"typescript": "^5.4.0"
|
|
41
43
|
},
|
|
42
44
|
"engines": {
|
|
43
45
|
"node": ">=18.0.0"
|
|
44
46
|
}
|
|
45
|
-
}
|
|
47
|
+
}
|