@helmisatria/mcp-chrome-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/README.md +183 -0
- package/dist/README.md +25 -0
- package/dist/agent/attachment-service.d.ts +83 -0
- package/dist/agent/attachment-service.js +370 -0
- package/dist/agent/attachment-service.js.map +1 -0
- package/dist/agent/ccr-detector.d.ts +59 -0
- package/dist/agent/ccr-detector.js +311 -0
- package/dist/agent/ccr-detector.js.map +1 -0
- package/dist/agent/chat-service.d.ts +50 -0
- package/dist/agent/chat-service.js +439 -0
- package/dist/agent/chat-service.js.map +1 -0
- package/dist/agent/db/client.d.ts +26 -0
- package/dist/agent/db/client.js +244 -0
- package/dist/agent/db/client.js.map +1 -0
- package/dist/agent/db/index.d.ts +5 -0
- package/dist/agent/db/index.js +22 -0
- package/dist/agent/db/index.js.map +1 -0
- package/dist/agent/db/schema.d.ts +711 -0
- package/dist/agent/db/schema.js +121 -0
- package/dist/agent/db/schema.js.map +1 -0
- package/dist/agent/directory-picker.d.ts +11 -0
- package/dist/agent/directory-picker.js +149 -0
- package/dist/agent/directory-picker.js.map +1 -0
- package/dist/agent/engines/claude.d.ts +79 -0
- package/dist/agent/engines/claude.js +1338 -0
- package/dist/agent/engines/claude.js.map +1 -0
- package/dist/agent/engines/codex.d.ts +48 -0
- package/dist/agent/engines/codex.js +822 -0
- package/dist/agent/engines/codex.js.map +1 -0
- package/dist/agent/engines/types.d.ts +133 -0
- package/dist/agent/engines/types.js +3 -0
- package/dist/agent/engines/types.js.map +1 -0
- package/dist/agent/message-service.d.ts +56 -0
- package/dist/agent/message-service.js +198 -0
- package/dist/agent/message-service.js.map +1 -0
- package/dist/agent/open-project.d.ts +25 -0
- package/dist/agent/open-project.js +469 -0
- package/dist/agent/open-project.js.map +1 -0
- package/dist/agent/project-service.d.ts +49 -0
- package/dist/agent/project-service.js +254 -0
- package/dist/agent/project-service.js.map +1 -0
- package/dist/agent/project-types.d.ts +27 -0
- package/dist/agent/project-types.js +3 -0
- package/dist/agent/project-types.js.map +1 -0
- package/dist/agent/session-service.d.ts +198 -0
- package/dist/agent/session-service.js +292 -0
- package/dist/agent/session-service.js.map +1 -0
- package/dist/agent/storage.d.ts +27 -0
- package/dist/agent/storage.js +73 -0
- package/dist/agent/storage.js.map +1 -0
- package/dist/agent/stream-manager.d.ts +42 -0
- package/dist/agent/stream-manager.js +243 -0
- package/dist/agent/stream-manager.js.map +1 -0
- package/dist/agent/tool-bridge.d.ts +44 -0
- package/dist/agent/tool-bridge.js +50 -0
- package/dist/agent/tool-bridge.js.map +1 -0
- package/dist/agent/types.d.ts +6 -0
- package/dist/agent/types.js +3 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +224 -0
- package/dist/cli.js.map +1 -0
- package/dist/constant/index.d.ts +60 -0
- package/dist/constant/index.js +80 -0
- package/dist/constant/index.js.map +1 -0
- package/dist/file-handler.d.ts +41 -0
- package/dist/file-handler.js +295 -0
- package/dist/file-handler.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 +72 -0
- package/dist/mcp/mcp-server-stdio.js +143 -0
- package/dist/mcp/mcp-server-stdio.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +36 -0
- package/dist/mcp/mcp-server.js +26 -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 +148 -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 +42 -0
- package/dist/native-messaging-host.js +312 -0
- package/dist/native-messaging-host.js.map +1 -0
- package/dist/run_host.bat +194 -0
- package/dist/run_host.sh +264 -0
- package/dist/scripts/browser-config.d.ts +28 -0
- package/dist/scripts/browser-config.js +229 -0
- package/dist/scripts/browser-config.js.map +1 -0
- package/dist/scripts/build.d.ts +1 -0
- package/dist/scripts/build.js +126 -0
- package/dist/scripts/build.js.map +1 -0
- package/dist/scripts/constant.d.ts +4 -0
- package/dist/scripts/constant.js +8 -0
- package/dist/scripts/constant.js.map +1 -0
- package/dist/scripts/doctor.d.ts +70 -0
- package/dist/scripts/doctor.js +930 -0
- package/dist/scripts/doctor.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +2 -0
- package/dist/scripts/postinstall.js +246 -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 +28 -0
- package/dist/scripts/register.js.map +1 -0
- package/dist/scripts/report.d.ts +96 -0
- package/dist/scripts/report.js +686 -0
- package/dist/scripts/report.js.map +1 -0
- package/dist/scripts/utils.d.ts +64 -0
- package/dist/scripts/utils.js +443 -0
- package/dist/scripts/utils.js.map +1 -0
- package/dist/server/index.d.ts +35 -0
- package/dist/server/index.js +312 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/agent.d.ts +21 -0
- package/dist/server/routes/agent.js +971 -0
- package/dist/server/routes/agent.js.map +1 -0
- package/dist/server/routes/index.d.ts +4 -0
- package/dist/server/routes/index.js +9 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/trace-analyzer.d.ts +14 -0
- package/dist/trace-analyzer.js +113 -0
- package/dist/trace-analyzer.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 +91 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentStreamManager = void 0;
|
|
4
|
+
const WEBSOCKET_OPEN_STATE = 1;
|
|
5
|
+
/**
|
|
6
|
+
* AgentStreamManager manages SSE/WebSocket connections keyed by sessionId.
|
|
7
|
+
*
|
|
8
|
+
* 中文说明:此实现参考 other/cweb 中的 StreamManager,但适配 Fastify/Node HTTP,
|
|
9
|
+
* 使用 ServerResponse 直接写入 SSE 数据,避免在 Node 环境中额外引入 Web Streams 依赖。
|
|
10
|
+
*/
|
|
11
|
+
class AgentStreamManager {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.sseClients = new Map();
|
|
14
|
+
this.webSocketClients = new Map();
|
|
15
|
+
this.heartbeatTimer = null;
|
|
16
|
+
}
|
|
17
|
+
addSseStream(sessionId, res) {
|
|
18
|
+
if (!this.sseClients.has(sessionId)) {
|
|
19
|
+
this.sseClients.set(sessionId, new Set());
|
|
20
|
+
}
|
|
21
|
+
this.sseClients.get(sessionId).add(res);
|
|
22
|
+
this.ensureHeartbeatTimer();
|
|
23
|
+
}
|
|
24
|
+
removeSseStream(sessionId, res) {
|
|
25
|
+
const clients = this.sseClients.get(sessionId);
|
|
26
|
+
if (!clients) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
clients.delete(res);
|
|
30
|
+
if (clients.size === 0) {
|
|
31
|
+
this.sseClients.delete(sessionId);
|
|
32
|
+
}
|
|
33
|
+
this.stopHeartbeatTimerIfIdle();
|
|
34
|
+
}
|
|
35
|
+
addWebSocket(sessionId, socket) {
|
|
36
|
+
if (!this.webSocketClients.has(sessionId)) {
|
|
37
|
+
this.webSocketClients.set(sessionId, new Set());
|
|
38
|
+
}
|
|
39
|
+
this.webSocketClients.get(sessionId).add(socket);
|
|
40
|
+
this.ensureHeartbeatTimer();
|
|
41
|
+
}
|
|
42
|
+
removeWebSocket(sessionId, socket) {
|
|
43
|
+
const sockets = this.webSocketClients.get(sessionId);
|
|
44
|
+
if (!sockets) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
sockets.delete(socket);
|
|
48
|
+
if (sockets.size === 0) {
|
|
49
|
+
this.webSocketClients.delete(sessionId);
|
|
50
|
+
}
|
|
51
|
+
this.stopHeartbeatTimerIfIdle();
|
|
52
|
+
}
|
|
53
|
+
publish(event) {
|
|
54
|
+
const payload = JSON.stringify(event);
|
|
55
|
+
const ssePayload = `data: ${payload}\n\n`;
|
|
56
|
+
// Heartbeat events are broadcast to all connections to keep them alive.
|
|
57
|
+
if (event.type === 'heartbeat') {
|
|
58
|
+
this.broadcastToAll(ssePayload, payload);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// For all other event types, require a sessionId for routing.
|
|
62
|
+
const targetSessionId = this.extractSessionId(event);
|
|
63
|
+
if (!targetSessionId) {
|
|
64
|
+
// Drop events without sessionId to prevent cross-session leakage.
|
|
65
|
+
console.warn('[AgentStreamManager] Dropping event without sessionId:', event.type);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Session-scoped routing: only send to clients subscribed to this session.
|
|
69
|
+
this.sendToSession(targetSessionId, ssePayload, payload);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract sessionId from event based on event type.
|
|
73
|
+
*/
|
|
74
|
+
extractSessionId(event) {
|
|
75
|
+
var _a, _b, _c, _d, _e;
|
|
76
|
+
switch (event.type) {
|
|
77
|
+
case 'message':
|
|
78
|
+
return (_a = event.data) === null || _a === void 0 ? void 0 : _a.sessionId;
|
|
79
|
+
case 'status':
|
|
80
|
+
return (_b = event.data) === null || _b === void 0 ? void 0 : _b.sessionId;
|
|
81
|
+
case 'connected':
|
|
82
|
+
return (_c = event.data) === null || _c === void 0 ? void 0 : _c.sessionId;
|
|
83
|
+
case 'error':
|
|
84
|
+
return (_d = event.data) === null || _d === void 0 ? void 0 : _d.sessionId;
|
|
85
|
+
case 'usage':
|
|
86
|
+
return (_e = event.data) === null || _e === void 0 ? void 0 : _e.sessionId;
|
|
87
|
+
case 'heartbeat':
|
|
88
|
+
return undefined;
|
|
89
|
+
default:
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Send event to a specific session's clients only.
|
|
95
|
+
*/
|
|
96
|
+
sendToSession(sessionId, ssePayload, wsPayload) {
|
|
97
|
+
// SSE clients
|
|
98
|
+
const sseClients = this.sseClients.get(sessionId);
|
|
99
|
+
if (sseClients) {
|
|
100
|
+
const deadClients = [];
|
|
101
|
+
for (const res of sseClients) {
|
|
102
|
+
if (this.isResponseDead(res)) {
|
|
103
|
+
deadClients.push(res);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
res.write(ssePayload);
|
|
108
|
+
}
|
|
109
|
+
catch (_a) {
|
|
110
|
+
deadClients.push(res);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
for (const res of deadClients) {
|
|
114
|
+
this.removeSseStream(sessionId, res);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// WebSocket clients
|
|
118
|
+
const wsSockets = this.webSocketClients.get(sessionId);
|
|
119
|
+
if (wsSockets) {
|
|
120
|
+
const deadSockets = [];
|
|
121
|
+
for (const socket of wsSockets) {
|
|
122
|
+
if (this.isSocketDead(socket)) {
|
|
123
|
+
deadSockets.push(socket);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
socket.send(wsPayload);
|
|
128
|
+
}
|
|
129
|
+
catch (_b) {
|
|
130
|
+
deadSockets.push(socket);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
for (const socket of deadSockets) {
|
|
134
|
+
this.removeWebSocket(sessionId, socket);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Broadcast event to all connected clients (used for heartbeat).
|
|
140
|
+
*/
|
|
141
|
+
broadcastToAll(ssePayload, wsPayload) {
|
|
142
|
+
const deadSse = [];
|
|
143
|
+
for (const [sessionId, clients] of this.sseClients.entries()) {
|
|
144
|
+
for (const res of clients) {
|
|
145
|
+
if (this.isResponseDead(res)) {
|
|
146
|
+
deadSse.push({ sessionId, res });
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
res.write(ssePayload);
|
|
151
|
+
}
|
|
152
|
+
catch (_a) {
|
|
153
|
+
deadSse.push({ sessionId, res });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
for (const { sessionId, res } of deadSse) {
|
|
158
|
+
this.removeSseStream(sessionId, res);
|
|
159
|
+
}
|
|
160
|
+
const deadSockets = [];
|
|
161
|
+
for (const [sessionId, sockets] of this.webSocketClients.entries()) {
|
|
162
|
+
for (const socket of sockets) {
|
|
163
|
+
if (this.isSocketDead(socket)) {
|
|
164
|
+
deadSockets.push({ sessionId, socket });
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
socket.send(wsPayload);
|
|
169
|
+
}
|
|
170
|
+
catch (_b) {
|
|
171
|
+
deadSockets.push({ sessionId, socket });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
for (const { sessionId, socket } of deadSockets) {
|
|
176
|
+
this.removeWebSocket(sessionId, socket);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
isResponseDead(res) {
|
|
180
|
+
return res.writableEnded || res.destroyed;
|
|
181
|
+
}
|
|
182
|
+
isSocketDead(socket) {
|
|
183
|
+
return socket.readyState !== undefined && socket.readyState !== WEBSOCKET_OPEN_STATE;
|
|
184
|
+
}
|
|
185
|
+
closeAll() {
|
|
186
|
+
var _a;
|
|
187
|
+
for (const [sessionId, clients] of this.sseClients.entries()) {
|
|
188
|
+
for (const res of clients) {
|
|
189
|
+
try {
|
|
190
|
+
res.end();
|
|
191
|
+
}
|
|
192
|
+
catch (_b) {
|
|
193
|
+
// Ignore errors during shutdown.
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
this.sseClients.delete(sessionId);
|
|
197
|
+
}
|
|
198
|
+
for (const [sessionId, sockets] of this.webSocketClients.entries()) {
|
|
199
|
+
for (const socket of sockets) {
|
|
200
|
+
try {
|
|
201
|
+
(_a = socket.close) === null || _a === void 0 ? void 0 : _a.call(socket);
|
|
202
|
+
}
|
|
203
|
+
catch (_c) {
|
|
204
|
+
// Ignore errors during shutdown.
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
this.webSocketClients.delete(sessionId);
|
|
208
|
+
}
|
|
209
|
+
this.stopHeartbeatTimer();
|
|
210
|
+
}
|
|
211
|
+
ensureHeartbeatTimer() {
|
|
212
|
+
var _a, _b;
|
|
213
|
+
if (this.heartbeatTimer) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
this.heartbeatTimer = setInterval(() => {
|
|
217
|
+
if (this.sseClients.size === 0 && this.webSocketClients.size === 0) {
|
|
218
|
+
this.stopHeartbeatTimer();
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const event = {
|
|
222
|
+
type: 'heartbeat',
|
|
223
|
+
data: { timestamp: new Date().toISOString() },
|
|
224
|
+
};
|
|
225
|
+
this.publish(event);
|
|
226
|
+
}, 30000);
|
|
227
|
+
// Allow Node process to exit naturally even if heartbeat is active.
|
|
228
|
+
(_b = (_a = this.heartbeatTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
229
|
+
}
|
|
230
|
+
stopHeartbeatTimerIfIdle() {
|
|
231
|
+
if (this.sseClients.size === 0 && this.webSocketClients.size === 0) {
|
|
232
|
+
this.stopHeartbeatTimer();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
stopHeartbeatTimer() {
|
|
236
|
+
if (this.heartbeatTimer) {
|
|
237
|
+
clearInterval(this.heartbeatTimer);
|
|
238
|
+
this.heartbeatTimer = null;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
exports.AgentStreamManager = AgentStreamManager;
|
|
243
|
+
//# sourceMappingURL=stream-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-manager.js","sourceRoot":"","sources":["../../src/agent/stream-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
export interface CliToolInvocation {
|
|
3
|
+
/**
|
|
4
|
+
* The MCP server identifier (if provided by CLI).
|
|
5
|
+
* When omitted, this bridge defaults to the local chrome MCP server.
|
|
6
|
+
*/
|
|
7
|
+
server?: string;
|
|
8
|
+
/**
|
|
9
|
+
* The MCP tool name to invoke.
|
|
10
|
+
*/
|
|
11
|
+
tool: string;
|
|
12
|
+
/**
|
|
13
|
+
* JSON-serializable arguments for the tool call.
|
|
14
|
+
*/
|
|
15
|
+
args?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface AgentToolBridgeOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Base URL of the local MCP HTTP endpoint (e.g. http://127.0.0.1:12306/mcp).
|
|
20
|
+
* If omitted, DEFAULT_SERVER_PORT from chrome-mcp-shared is used.
|
|
21
|
+
*/
|
|
22
|
+
mcpUrl?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* AgentToolBridge maps CLI tool events (Codex, etc.) to MCP tool calls
|
|
26
|
+
* against the local chrome MCP server via the official MCP SDK client.
|
|
27
|
+
*
|
|
28
|
+
* 中文说明:该桥接层负责将 CLI 上报的工具调用统一转为标准 MCP CallTool 请求,
|
|
29
|
+
* 复用现有 /mcp HTTP server,而不是在本项目内自研额外协议。
|
|
30
|
+
*/
|
|
31
|
+
export declare class AgentToolBridge {
|
|
32
|
+
private readonly client;
|
|
33
|
+
private readonly transport;
|
|
34
|
+
constructor(options?: AgentToolBridgeOptions);
|
|
35
|
+
/**
|
|
36
|
+
* Connects the MCP client over Streamable HTTP if not already connected.
|
|
37
|
+
*/
|
|
38
|
+
ensureConnected(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Invoke an MCP tool based on a CLI tool event.
|
|
41
|
+
* Returns the raw result from MCP client.callTool().
|
|
42
|
+
*/
|
|
43
|
+
callTool(invocation: CliToolInvocation): Promise<CallToolResult>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentToolBridge = void 0;
|
|
4
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
|
|
5
|
+
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
6
|
+
const index_js_2 = require("../constant/index.js");
|
|
7
|
+
/**
|
|
8
|
+
* AgentToolBridge maps CLI tool events (Codex, etc.) to MCP tool calls
|
|
9
|
+
* against the local chrome MCP server via the official MCP SDK client.
|
|
10
|
+
*
|
|
11
|
+
* 中文说明:该桥接层负责将 CLI 上报的工具调用统一转为标准 MCP CallTool 请求,
|
|
12
|
+
* 复用现有 /mcp HTTP server,而不是在本项目内自研额外协议。
|
|
13
|
+
*/
|
|
14
|
+
class AgentToolBridge {
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
const url = options.mcpUrl || `http://127.0.0.1:${process.env.MCP_HTTP_PORT || index_js_2.NATIVE_SERVER_PORT}/mcp`;
|
|
17
|
+
this.transport = new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(url));
|
|
18
|
+
this.client = new index_js_1.Client({
|
|
19
|
+
name: 'chrome-mcp-agent-bridge',
|
|
20
|
+
version: '1.0.0',
|
|
21
|
+
}, {});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Connects the MCP client over Streamable HTTP if not already connected.
|
|
25
|
+
*/
|
|
26
|
+
async ensureConnected() {
|
|
27
|
+
// Client.connect is idempotent; repeated calls reuse the same transport session.
|
|
28
|
+
if (this.transport._sessionId) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
await this.client.connect(this.transport);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Invoke an MCP tool based on a CLI tool event.
|
|
35
|
+
* Returns the raw result from MCP client.callTool().
|
|
36
|
+
*/
|
|
37
|
+
async callTool(invocation) {
|
|
38
|
+
var _a;
|
|
39
|
+
await this.ensureConnected();
|
|
40
|
+
const args = (_a = invocation.args) !== null && _a !== void 0 ? _a : {};
|
|
41
|
+
const result = await this.client.callTool({
|
|
42
|
+
name: invocation.tool,
|
|
43
|
+
arguments: args,
|
|
44
|
+
});
|
|
45
|
+
// The SDK returns a compatible structure; cast to satisfy strict typing.
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.AgentToolBridge = AgentToolBridge;
|
|
50
|
+
//# sourceMappingURL=tool-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-bridge.js","sourceRoot":"","sources":["../../src/agent/tool-bridge.ts"],"names":[],"mappings":";;;AAAA,wEAAmE;AACnE,0FAAmG;AAEnG,mDAA0D;AA0B1D;;;;;;GAMG;AACH,MAAa,eAAe;IAI1B,YAAY,UAAkC,EAAE;QAC9C,MAAM,GAAG,GACP,OAAO,CAAC,MAAM,IAAI,oBAAoB,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,6BAAkB,MAAM,CAAC;QAE9F,IAAI,CAAC,SAAS,GAAG,IAAI,iDAA6B,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAM,CACtB;YACE,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,OAAO;SACjB,EACD,EAAE,CACH,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,iFAAiF;QACjF,IAAK,IAAI,CAAC,SAAiB,CAAC,UAAU,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,UAA6B;;QAC1C,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE7B,MAAM,IAAI,GAAG,MAAA,UAAU,CAAC,IAAI,mCAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxC,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,yEAAyE;QACzE,OAAO,MAAmC,CAAC;IAC7C,CAAC;CACF;AA7CD,0CA6CC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-export agent types from shared package for backward compatibility.
|
|
3
|
+
* All types are now defined in packages/shared/src/agent-types.ts to ensure
|
|
4
|
+
* consistency between native-server and chrome-extension.
|
|
5
|
+
*/
|
|
6
|
+
export { type AgentRole, type AgentMessage, type StreamTransport, type AgentStatusEvent, type AgentConnectedEvent, type AgentHeartbeatEvent, type RealtimeEvent, type AgentAttachment, type AgentCliPreference, type AgentActRequest, type AgentActResponse, type AgentProject, type AgentEngineInfo, type AgentStoredMessage, } from 'chrome-mcp-shared';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":""}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const commander_1 = require("commander");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const utils_1 = require("./scripts/utils");
|
|
41
|
+
const browser_config_1 = require("./scripts/browser-config");
|
|
42
|
+
const doctor_1 = require("./scripts/doctor");
|
|
43
|
+
const report_1 = require("./scripts/report");
|
|
44
|
+
commander_1.program
|
|
45
|
+
.version(require('../package.json').version)
|
|
46
|
+
.description('Mcp Chrome Bridge - Local service for communicating with Chrome extension');
|
|
47
|
+
// Register Native Messaging host
|
|
48
|
+
commander_1.program
|
|
49
|
+
.command('register')
|
|
50
|
+
.description('Register Native Messaging host')
|
|
51
|
+
.option('-f, --force', 'Force re-registration')
|
|
52
|
+
.option('-s, --system', 'Use system-level installation (requires administrator/sudo privileges)')
|
|
53
|
+
.option('-b, --browser <browser>', 'Register for specific browser (chrome, chromium, or all)')
|
|
54
|
+
.option('-d, --detect', 'Auto-detect installed browsers')
|
|
55
|
+
.action(async (options) => {
|
|
56
|
+
try {
|
|
57
|
+
// Write Node.js path for run_host scripts
|
|
58
|
+
(0, utils_1.writeNodePathFile)(__dirname);
|
|
59
|
+
// Determine which browsers to register
|
|
60
|
+
let targetBrowsers;
|
|
61
|
+
if (options.browser) {
|
|
62
|
+
if (options.browser.toLowerCase() === 'all') {
|
|
63
|
+
targetBrowsers = [browser_config_1.BrowserType.CHROME, browser_config_1.BrowserType.CHROMIUM];
|
|
64
|
+
console.log((0, utils_1.colorText)('Registering for all supported browsers...', 'blue'));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const browserType = (0, browser_config_1.parseBrowserType)(options.browser);
|
|
68
|
+
if (!browserType) {
|
|
69
|
+
console.error((0, utils_1.colorText)(`Invalid browser: ${options.browser}. Use 'chrome', 'chromium', or 'all'`, 'red'));
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
targetBrowsers = [browserType];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else if (options.detect) {
|
|
76
|
+
targetBrowsers = (0, browser_config_1.detectInstalledBrowsers)();
|
|
77
|
+
if (targetBrowsers.length === 0) {
|
|
78
|
+
console.log((0, utils_1.colorText)('No supported browsers detected, will register for Chrome and Chromium', 'yellow'));
|
|
79
|
+
targetBrowsers = undefined; // Will use default behavior
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// If neither option specified, tryRegisterUserLevelHost will detect browsers
|
|
83
|
+
// Detect if running with root/administrator privileges
|
|
84
|
+
const isRoot = process.getuid && process.getuid() === 0; // Unix/Linux/Mac
|
|
85
|
+
let isAdmin = false;
|
|
86
|
+
if (process.platform === 'win32') {
|
|
87
|
+
try {
|
|
88
|
+
isAdmin = require('is-admin')(); // Windows requires additional package
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.warn((0, utils_1.colorText)('Warning: Unable to detect administrator privileges on Windows', 'yellow'));
|
|
92
|
+
isAdmin = false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const hasElevatedPermissions = isRoot || isAdmin;
|
|
96
|
+
// If --system option is specified or running with root/administrator privileges
|
|
97
|
+
if (options.system || hasElevatedPermissions) {
|
|
98
|
+
// TODO: Update registerWithElevatedPermissions to support multiple browsers
|
|
99
|
+
await (0, utils_1.registerWithElevatedPermissions)();
|
|
100
|
+
console.log((0, utils_1.colorText)('System-level Native Messaging host registered successfully!', 'green'));
|
|
101
|
+
console.log((0, utils_1.colorText)('You can now use connectNative in Chrome extension to connect to this service.', 'blue'));
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Regular user-level installation
|
|
105
|
+
console.log((0, utils_1.colorText)('Registering user-level Native Messaging host...', 'blue'));
|
|
106
|
+
const success = await (0, utils_1.tryRegisterUserLevelHost)(targetBrowsers);
|
|
107
|
+
if (success) {
|
|
108
|
+
console.log((0, utils_1.colorText)('Native Messaging host registered successfully!', 'green'));
|
|
109
|
+
console.log((0, utils_1.colorText)('You can now use connectNative in Chrome extension to connect to this service.', 'blue'));
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log((0, utils_1.colorText)('User-level registration failed, please try the following methods:', 'yellow'));
|
|
113
|
+
console.log((0, utils_1.colorText)(' 1. sudo mcp-chrome-bridge register', 'yellow'));
|
|
114
|
+
console.log((0, utils_1.colorText)(' 2. mcp-chrome-bridge register --system', 'yellow'));
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error((0, utils_1.colorText)(`Registration failed: ${error.message}`, 'red'));
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
// Fix execution permissions
|
|
125
|
+
commander_1.program
|
|
126
|
+
.command('fix-permissions')
|
|
127
|
+
.description('Fix execution permissions for native host files')
|
|
128
|
+
.action(async () => {
|
|
129
|
+
try {
|
|
130
|
+
console.log((0, utils_1.colorText)('Fixing execution permissions...', 'blue'));
|
|
131
|
+
await (0, utils_1.ensureExecutionPermissions)();
|
|
132
|
+
console.log((0, utils_1.colorText)('✓ Execution permissions fixed successfully!', 'green'));
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.error((0, utils_1.colorText)(`Failed to fix permissions: ${error.message}`, 'red'));
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
// Update port in stdio-config.json
|
|
140
|
+
commander_1.program
|
|
141
|
+
.command('update-port <port>')
|
|
142
|
+
.description('Update the port number in stdio-config.json')
|
|
143
|
+
.action(async (port) => {
|
|
144
|
+
try {
|
|
145
|
+
const portNumber = parseInt(port, 10);
|
|
146
|
+
if (isNaN(portNumber) || portNumber < 1 || portNumber > 65535) {
|
|
147
|
+
console.error((0, utils_1.colorText)('Error: Port must be a valid number between 1 and 65535', 'red'));
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
const configPath = path.join(__dirname, 'mcp', 'stdio-config.json');
|
|
151
|
+
if (!fs.existsSync(configPath)) {
|
|
152
|
+
console.error((0, utils_1.colorText)(`Error: Configuration file not found at ${configPath}`, 'red'));
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
const configData = fs.readFileSync(configPath, 'utf8');
|
|
156
|
+
const config = JSON.parse(configData);
|
|
157
|
+
const currentUrl = new URL(config.url);
|
|
158
|
+
currentUrl.port = portNumber.toString();
|
|
159
|
+
config.url = currentUrl.toString();
|
|
160
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 4));
|
|
161
|
+
console.log((0, utils_1.colorText)(`✓ Port updated successfully to ${portNumber}`, 'green'));
|
|
162
|
+
console.log((0, utils_1.colorText)(`Updated URL: ${config.url}`, 'blue'));
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error((0, utils_1.colorText)(`Failed to update port: ${error.message}`, 'red'));
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
// Diagnose installation and environment issues
|
|
170
|
+
commander_1.program
|
|
171
|
+
.command('doctor')
|
|
172
|
+
.description('Diagnose installation and environment issues')
|
|
173
|
+
.option('--json', 'Output diagnostics as JSON')
|
|
174
|
+
.option('--fix', 'Attempt to fix common issues automatically')
|
|
175
|
+
.option('-b, --browser <browser>', 'Target browser (chrome, chromium, or all)')
|
|
176
|
+
.action(async (options) => {
|
|
177
|
+
try {
|
|
178
|
+
const exitCode = await (0, doctor_1.runDoctor)({
|
|
179
|
+
json: Boolean(options.json),
|
|
180
|
+
fix: Boolean(options.fix),
|
|
181
|
+
browser: options.browser,
|
|
182
|
+
});
|
|
183
|
+
process.exit(exitCode);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
console.error((0, utils_1.colorText)(`Doctor failed: ${error.message}`, 'red'));
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
// Export diagnostic report for GitHub Issues
|
|
191
|
+
commander_1.program
|
|
192
|
+
.command('report')
|
|
193
|
+
.description('Export a diagnostic report for GitHub Issues')
|
|
194
|
+
.option('--json', 'Output report as JSON (default: Markdown)')
|
|
195
|
+
.option('--output <file>', 'Write report to file instead of stdout')
|
|
196
|
+
.option('--copy', 'Copy report to clipboard')
|
|
197
|
+
.option('--no-redact', 'Disable redaction of usernames/paths/tokens')
|
|
198
|
+
.option('--include-logs <mode>', 'Include wrapper logs: none | tail | full', 'tail')
|
|
199
|
+
.option('--log-lines <n>', 'Lines to include when --include-logs=tail', '200')
|
|
200
|
+
.option('-b, --browser <browser>', 'Target browser (chrome, chromium, or all)')
|
|
201
|
+
.action(async (options) => {
|
|
202
|
+
try {
|
|
203
|
+
const exitCode = await (0, report_1.runReport)({
|
|
204
|
+
json: Boolean(options.json),
|
|
205
|
+
output: options.output,
|
|
206
|
+
copy: Boolean(options.copy),
|
|
207
|
+
redact: options.redact,
|
|
208
|
+
includeLogs: options.includeLogs,
|
|
209
|
+
logLines: options.logLines ? parseInt(options.logLines, 10) : undefined,
|
|
210
|
+
browser: options.browser,
|
|
211
|
+
});
|
|
212
|
+
process.exit(exitCode);
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
console.error((0, utils_1.colorText)(`Report failed: ${error.message}`, 'red'));
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
commander_1.program.parse(process.argv);
|
|
220
|
+
// If no command provided, show help
|
|
221
|
+
if (!process.argv.slice(2).length) {
|
|
222
|
+
commander_1.program.outputHelp();
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|