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.
@@ -3,20 +3,27 @@
3
3
  *
4
4
  * JSON-RPC-like protocol for communication between bridge and browser.
5
5
  */
6
- export interface ToolCallRequest {
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 BridgeMessage = ToolCallRequest | ToolCallResponse;
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,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAE/D;;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"}
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"}
@@ -7,7 +7,7 @@
7
7
  * Check if message is a request (has method)
8
8
  */
9
9
  export function isRequest(msg) {
10
- return 'method' in msg;
10
+ return typeof msg.method === 'string';
11
11
  }
12
12
  /**
13
13
  * Check if message is a response (has result or error)
@@ -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,QAAQ,IAAI,GAAG,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAkB;IAC3C,OAAO,QAAQ,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC;AAC3C,CAAC"}
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 handleMessage;
55
- /**
56
- * Check if browser is connected
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
- * Latest context received from browser (if any)
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":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;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;AAsBD,qBAAa,eAAe;IAUd,OAAO,CAAC,IAAI;IATxB,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,eAAe,CAA2C;IAClE,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,gBAAgB,CAA6D;IACrF,OAAO,CAAC,SAAS,CAAS;gBAEN,IAAI,GAAE,MAAc,EAAE,SAAS,CAAC,EAAE,MAAM;IAI5D,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAyD/B,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,eAAe,GAAG,IAAI,CAEpC;IAED;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI;IAKnE,OAAO,CAAC,sBAAsB;IAI9B;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAuBzD;;OAEG;IACH,KAAK;IAIL;;OAEG;IACH,UAAU;CAGX"}
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 port is available
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
- port;
25
- wss = null;
26
- client = null;
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 (!available) {
53
- // Port already in use - another instance is handling browser connections
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
- // Only allow one browser connection at a time
62
- if (this.client) {
63
- this.client.close();
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.client = ws;
66
- // Clear context until browser sends an update
67
- this._context = null;
110
+ this._context = msg.params;
68
111
  this.notifyContextListeners();
69
- ws.on('message', (data) => {
70
- try {
71
- const msg = JSON.parse(data.toString());
72
- this.handleMessage(msg);
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
- catch (error) {
75
- console.error('Failed to parse message:', error);
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
- ws.on('close', () => {
79
- if (this.client === ws) {
80
- this.client = null;
81
- this._context = null;
82
- this.notifyContextListeners();
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
- ws.on('error', (error) => {
86
- console.error('WebSocket error:', error);
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
- this.wss.on('listening', () => {
90
- this.started = true;
91
- resolve(true);
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
- this.wss.on('error', (error) => {
94
- console.error('WebSocket server error:', 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
- handleMessage(msg) {
100
- // Browser can proactively send codebase context
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
- // This is a response to a pending request
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
- return this.client !== null && this.client.readyState === WebSocket.OPEN;
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
- throw new Error('GitNexus browser not connected. Open GitNexus and enable MCP toggle.');
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 = { id, method, params, agentName: this.agentName };
157
- this.client.send(JSON.stringify(msg));
158
- // Timeout after 30 seconds
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,KAAK,CAAC;AAsCtD;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,eAAe;IAUN;IATZ,GAAG,GAA2B,IAAI,CAAC;IACnC,MAAM,GAAqB,IAAI,CAAC;IAChC,eAAe,GAAiC,IAAI,GAAG,EAAE,CAAC;IAC1D,SAAS,GAAG,CAAC,CAAC;IACd,OAAO,GAAG,KAAK,CAAC;IAChB,QAAQ,GAA2B,IAAI,CAAC;IACxC,gBAAgB,GAAmD,IAAI,GAAG,EAAE,CAAC;IAC7E,SAAS,CAAS;IAE1B,YAAoB,OAAe,KAAK,EAAE,SAAkB;QAAxC,SAAI,GAAJ,IAAI,CAAgB;QACtC,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;IACjF,CAAC;IAEO,WAAW;QACjB,6CAA6C;QAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;YAAE,OAAO,QAAQ,CAAC;QACnD,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW;YAAE,OAAO,aAAa,CAAC;QAClD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;YAAE,OAAO,UAAU,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,yEAAyE;YACzE,mEAAmE;YACnE,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,4CAA4C,CAAC,CAAC;YAC7E,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAEpD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE;gBAC/B,8CAA8C;gBAC9C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtB,CAAC;gBACD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjB,8CAA8C;gBAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAE9B,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;oBACxB,IAAI,CAAC;wBACH,MAAM,GAAG,GAAkB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;wBACvD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;oBAC1B,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBAClB,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;wBACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;wBACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;wBACrB,IAAI,CAAC,sBAAsB,EAAE,CAAC;oBAChC,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;gBAC3C,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC7B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;gBAChD,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,GAAkB;QACtC,gDAAgD;QAChD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAyB,CAAC;YAC9C,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,0CAA0C;QAC1C,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;YAC9D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEpC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAmD;QACjE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IAEO,sBAAsB;QAC5B,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,MAAW;QACxC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,EAAE,GAAG,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAErC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAElD,MAAM,GAAG,GAAkB,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7E,IAAI,CAAC,MAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAEvC,2BAA2B;YAC3B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACjC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAChC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC,EAAE,KAAK,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF"}
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.0",
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
- "typescript": "^5.4.0",
40
- "tsx": "^4.0.0"
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
+ }