@gtkx/mcp 0.20.0 → 1.0.0-rc.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.
Files changed (73) hide show
  1. package/README.md +122 -55
  2. package/bin/gtkx-mcp.js +8 -1
  3. package/dist/app-router.d.ts +35 -0
  4. package/dist/app-router.d.ts.map +1 -0
  5. package/dist/app-router.js +130 -0
  6. package/dist/app-router.js.map +1 -0
  7. package/dist/connection-registry.d.ts +12 -0
  8. package/dist/connection-registry.d.ts.map +1 -0
  9. package/dist/connection-registry.js +38 -0
  10. package/dist/connection-registry.js.map +1 -0
  11. package/dist/internal.d.ts +4 -0
  12. package/dist/internal.d.ts.map +1 -0
  13. package/dist/internal.js +4 -0
  14. package/dist/internal.js.map +1 -0
  15. package/dist/protocol/errors.d.ts +24 -87
  16. package/dist/protocol/errors.d.ts.map +1 -1
  17. package/dist/protocol/errors.js +27 -91
  18. package/dist/protocol/errors.js.map +1 -1
  19. package/dist/protocol/schemas.d.ts +89 -0
  20. package/dist/protocol/schemas.d.ts.map +1 -0
  21. package/dist/protocol/schemas.js +56 -0
  22. package/dist/protocol/schemas.js.map +1 -0
  23. package/dist/reference.d.ts +13 -0
  24. package/dist/reference.d.ts.map +1 -0
  25. package/dist/reference.js +250 -0
  26. package/dist/reference.js.map +1 -0
  27. package/dist/server.d.ts +14 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +220 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/socket-server.d.ts +4 -38
  32. package/dist/socket-server.d.ts.map +1 -1
  33. package/dist/socket-server.js +26 -109
  34. package/dist/socket-server.js.map +1 -1
  35. package/dist/tool.d.ts +22 -0
  36. package/dist/tool.d.ts.map +1 -0
  37. package/dist/tool.js +36 -0
  38. package/dist/tool.js.map +1 -0
  39. package/dist/transport.d.ts +41 -0
  40. package/dist/transport.d.ts.map +1 -0
  41. package/dist/transport.js +121 -0
  42. package/dist/transport.js.map +1 -0
  43. package/package.json +17 -11
  44. package/src/app-router.ts +172 -0
  45. package/src/connection-registry.ts +42 -0
  46. package/src/internal.ts +17 -0
  47. package/src/protocol/errors.ts +44 -100
  48. package/src/protocol/schemas.ts +148 -0
  49. package/src/reference.ts +340 -0
  50. package/src/server.ts +281 -0
  51. package/src/socket-server.ts +30 -154
  52. package/src/tool.ts +66 -0
  53. package/src/transport.ts +165 -0
  54. package/dist/cli.d.ts +0 -3
  55. package/dist/cli.d.ts.map +0 -1
  56. package/dist/cli.js +0 -399
  57. package/dist/cli.js.map +0 -1
  58. package/dist/connection-manager.d.ts +0 -48
  59. package/dist/connection-manager.d.ts.map +0 -1
  60. package/dist/connection-manager.js +0 -185
  61. package/dist/connection-manager.js.map +0 -1
  62. package/dist/index.d.ts +0 -5
  63. package/dist/index.d.ts.map +0 -1
  64. package/dist/index.js +0 -5
  65. package/dist/index.js.map +0 -1
  66. package/dist/protocol/types.d.ts +0 -132
  67. package/dist/protocol/types.d.ts.map +0 -1
  68. package/dist/protocol/types.js +0 -46
  69. package/dist/protocol/types.js.map +0 -1
  70. package/src/cli.ts +0 -449
  71. package/src/connection-manager.ts +0 -247
  72. package/src/index.ts +0 -27
  73. package/src/protocol/types.ts +0 -153
package/dist/cli.js DELETED
@@ -1,399 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire } from "node:module";
3
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
- import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
6
- import { z } from "zod";
7
- import { ConnectionManager } from "./connection-manager.js";
8
- import { DEFAULT_SOCKET_PATH } from "./protocol/types.js";
9
- import { SocketServer } from "./socket-server.js";
10
- const require = createRequire(import.meta.url);
11
- const { version } = require("../package.json");
12
- const AppIdSchema = z.object({
13
- appId: z.string().optional().describe("App ID to query. If not specified, uses the first connected app."),
14
- });
15
- const ListAppsInputSchema = z.object({
16
- waitForApps: z
17
- .boolean()
18
- .optional()
19
- .describe("If true, wait for at least one app to register before returning. Useful when app is still starting."),
20
- timeout: z.number().optional().describe("Timeout in milliseconds when waitForApps is true (default: 10000)"),
21
- });
22
- const GetWidgetTreeInputSchema = AppIdSchema;
23
- const QueryWidgetsInputSchema = AppIdSchema.extend({
24
- by: z.enum(["role", "text", "testId", "labelText"]).describe("Query type"),
25
- value: z.union([z.string(), z.number()]).describe("Value to search for"),
26
- options: z
27
- .object({
28
- name: z.string().optional(),
29
- exact: z.boolean().optional(),
30
- timeout: z.number().optional(),
31
- })
32
- .optional()
33
- .describe("Additional query options"),
34
- });
35
- const WidgetIdSchema = AppIdSchema.extend({
36
- widgetId: z.string().describe("Widget ID"),
37
- });
38
- const GetWidgetPropsInputSchema = WidgetIdSchema;
39
- const ClickInputSchema = WidgetIdSchema;
40
- const TypeInputSchema = WidgetIdSchema.extend({
41
- text: z.string().describe("Text to type"),
42
- clear: z.boolean().optional().describe("Clear existing text before typing"),
43
- });
44
- const FireEventInputSchema = WidgetIdSchema.extend({
45
- signal: z.string().describe("GTK signal name to emit"),
46
- args: z.array(z.unknown()).optional().describe("Arguments to pass to the signal"),
47
- });
48
- const TakeScreenshotInputSchema = AppIdSchema.extend({
49
- windowId: z.string().optional().describe("Window ID to capture. If not specified, captures the first window."),
50
- });
51
- const tools = [
52
- {
53
- name: "gtkx_list_apps",
54
- description: "List all connected GTKX applications",
55
- inputSchema: {
56
- type: "object",
57
- properties: {
58
- waitForApps: {
59
- type: "boolean",
60
- description: "If true, wait for at least one app to register before returning. Useful when app is still starting.",
61
- },
62
- timeout: {
63
- type: "number",
64
- description: "Timeout in milliseconds when waitForApps is true (default: 10000)",
65
- },
66
- },
67
- required: [],
68
- },
69
- },
70
- {
71
- name: "gtkx_get_widget_tree",
72
- description: "Get the widget hierarchy for a connected GTKX app. Returns a tree of all widgets with their IDs, types, roles, and properties.",
73
- inputSchema: {
74
- type: "object",
75
- properties: {
76
- appId: {
77
- type: "string",
78
- description: "App ID to query. If not specified, uses the first connected app.",
79
- },
80
- },
81
- required: [],
82
- },
83
- },
84
- {
85
- name: "gtkx_query_widgets",
86
- description: "Find widgets by role, text, testId, or label. Returns matching widgets with their IDs and properties.",
87
- inputSchema: {
88
- type: "object",
89
- properties: {
90
- appId: {
91
- type: "string",
92
- description: "App ID to query. If not specified, uses the first connected app.",
93
- },
94
- by: {
95
- type: "string",
96
- enum: ["role", "text", "testId", "labelText"],
97
- description: "Query type",
98
- },
99
- value: {
100
- oneOf: [{ type: "string" }, { type: "number" }],
101
- description: "Value to search for",
102
- },
103
- options: {
104
- type: "object",
105
- properties: {
106
- name: { type: "string" },
107
- exact: { type: "boolean" },
108
- timeout: { type: "number" },
109
- },
110
- description: "Additional query options",
111
- },
112
- },
113
- required: ["by", "value"],
114
- },
115
- },
116
- {
117
- name: "gtkx_get_widget_props",
118
- description: "Get all properties of a specific widget by its ID",
119
- inputSchema: {
120
- type: "object",
121
- properties: {
122
- appId: {
123
- type: "string",
124
- description: "App ID to query. If not specified, uses the first connected app.",
125
- },
126
- widgetId: {
127
- type: "string",
128
- description: "Widget ID to get properties for",
129
- },
130
- },
131
- required: ["widgetId"],
132
- },
133
- },
134
- {
135
- name: "gtkx_click",
136
- description: "Click a widget. Works with buttons, checkboxes, and other interactive widgets.",
137
- inputSchema: {
138
- type: "object",
139
- properties: {
140
- appId: {
141
- type: "string",
142
- description: "App ID to query. If not specified, uses the first connected app.",
143
- },
144
- widgetId: {
145
- type: "string",
146
- description: "Widget ID to click",
147
- },
148
- },
149
- required: ["widgetId"],
150
- },
151
- },
152
- {
153
- name: "gtkx_type",
154
- description: "Type text into an editable widget like Entry or TextView",
155
- inputSchema: {
156
- type: "object",
157
- properties: {
158
- appId: {
159
- type: "string",
160
- description: "App ID to query. If not specified, uses the first connected app.",
161
- },
162
- widgetId: {
163
- type: "string",
164
- description: "Widget ID to type into",
165
- },
166
- text: {
167
- type: "string",
168
- description: "Text to type",
169
- },
170
- clear: {
171
- type: "boolean",
172
- description: "Clear existing text before typing",
173
- },
174
- },
175
- required: ["widgetId", "text"],
176
- },
177
- },
178
- {
179
- name: "gtkx_fire_event",
180
- description: "Emit a GTK signal on a widget. Use this for custom interactions.",
181
- inputSchema: {
182
- type: "object",
183
- properties: {
184
- appId: {
185
- type: "string",
186
- description: "App ID to query. If not specified, uses the first connected app.",
187
- },
188
- widgetId: {
189
- type: "string",
190
- description: "Widget ID to emit event on",
191
- },
192
- signal: {
193
- type: "string",
194
- description: "GTK signal name to emit",
195
- },
196
- args: {
197
- type: "array",
198
- items: {},
199
- description: "Arguments to pass to the signal",
200
- },
201
- },
202
- required: ["widgetId", "signal"],
203
- },
204
- },
205
- {
206
- name: "gtkx_take_screenshot",
207
- description: "Capture a screenshot of a window. Returns base64-encoded PNG image data.",
208
- inputSchema: {
209
- type: "object",
210
- properties: {
211
- appId: {
212
- type: "string",
213
- description: "App ID to query. If not specified, uses the first connected app.",
214
- },
215
- windowId: {
216
- type: "string",
217
- description: "Window ID to capture. If not specified, captures the first window.",
218
- },
219
- },
220
- required: [],
221
- },
222
- },
223
- ];
224
- async function main() {
225
- const socketServer = new SocketServer(DEFAULT_SOCKET_PATH);
226
- const connectionManager = new ConnectionManager(socketServer);
227
- socketServer.on("error", (error) => {
228
- const code = error.code;
229
- if (code !== "EPIPE" && code !== "ECONNRESET") {
230
- console.error("[gtkx] Socket error:", error.message);
231
- }
232
- });
233
- await socketServer.start();
234
- console.error(`[gtkx] Socket server listening on ${DEFAULT_SOCKET_PATH}`);
235
- connectionManager.on("appRegistered", (appInfo) => {
236
- console.error(`[gtkx] App registered: ${appInfo.appId} (PID: ${appInfo.pid})`);
237
- });
238
- connectionManager.on("appUnregistered", (appId) => {
239
- console.error(`[gtkx] App unregistered: ${appId}`);
240
- });
241
- const server = new Server({
242
- name: "gtkx-mcp",
243
- version,
244
- }, {
245
- capabilities: {
246
- tools: {},
247
- },
248
- });
249
- server.setRequestHandler(ListToolsRequestSchema, async () => {
250
- return { tools };
251
- });
252
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
253
- const { name, arguments: args } = request.params;
254
- try {
255
- switch (name) {
256
- case "gtkx_list_apps": {
257
- const input = ListAppsInputSchema.parse(args);
258
- if (input.waitForApps && !connectionManager.hasConnectedApps()) {
259
- try {
260
- await connectionManager.waitForApp(input.timeout);
261
- }
262
- catch (error) {
263
- return {
264
- content: [
265
- {
266
- type: "text",
267
- text: error instanceof Error ? error.message : "Timeout waiting for app",
268
- },
269
- ],
270
- isError: true,
271
- };
272
- }
273
- }
274
- const apps = connectionManager.getApps();
275
- const appsWithWindows = await Promise.all(apps.map(async (app) => {
276
- try {
277
- const result = await connectionManager.sendToApp(app.appId, "app.getWindows", {});
278
- return { ...app, windows: result.windows };
279
- }
280
- catch {
281
- return app;
282
- }
283
- }));
284
- return {
285
- content: [{ type: "text", text: JSON.stringify(appsWithWindows, null, 2) }],
286
- };
287
- }
288
- case "gtkx_get_widget_tree": {
289
- const input = GetWidgetTreeInputSchema.parse(args);
290
- const result = await connectionManager.sendToApp(input.appId, "widget.getTree", {});
291
- return {
292
- content: [{ type: "text", text: result.tree }],
293
- };
294
- }
295
- case "gtkx_query_widgets": {
296
- const input = QueryWidgetsInputSchema.parse(args);
297
- const result = await connectionManager.sendToApp(input.appId, "widget.query", {
298
- queryType: input.by,
299
- value: input.value,
300
- options: input.options,
301
- });
302
- return {
303
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
304
- };
305
- }
306
- case "gtkx_get_widget_props": {
307
- const input = GetWidgetPropsInputSchema.parse(args);
308
- const result = await connectionManager.sendToApp(input.appId, "widget.getProps", {
309
- widgetId: input.widgetId,
310
- });
311
- return {
312
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
313
- };
314
- }
315
- case "gtkx_click": {
316
- const input = ClickInputSchema.parse(args);
317
- await connectionManager.sendToApp(input.appId, "widget.click", {
318
- widgetId: input.widgetId,
319
- });
320
- return {
321
- content: [{ type: "text", text: "Click successful" }],
322
- };
323
- }
324
- case "gtkx_type": {
325
- const input = TypeInputSchema.parse(args);
326
- await connectionManager.sendToApp(input.appId, "widget.type", {
327
- widgetId: input.widgetId,
328
- text: input.text,
329
- clear: input.clear,
330
- });
331
- return {
332
- content: [{ type: "text", text: "Type successful" }],
333
- };
334
- }
335
- case "gtkx_fire_event": {
336
- const input = FireEventInputSchema.parse(args);
337
- await connectionManager.sendToApp(input.appId, "widget.fireEvent", {
338
- widgetId: input.widgetId,
339
- signal: input.signal,
340
- args: input.args,
341
- });
342
- return {
343
- content: [{ type: "text", text: "Event fired successfully" }],
344
- };
345
- }
346
- case "gtkx_take_screenshot": {
347
- const input = TakeScreenshotInputSchema.parse(args);
348
- const result = await connectionManager.sendToApp(input.appId, "widget.screenshot", {
349
- windowId: input.windowId,
350
- });
351
- return {
352
- content: [
353
- {
354
- type: "image",
355
- data: result.data,
356
- mimeType: result.mimeType,
357
- },
358
- ],
359
- };
360
- }
361
- default:
362
- return {
363
- content: [{ type: "text", text: `Unknown tool: ${name}` }],
364
- isError: true,
365
- };
366
- }
367
- }
368
- catch (error) {
369
- const message = error instanceof Error ? error.message : String(error);
370
- return {
371
- content: [{ type: "text", text: message }],
372
- isError: true,
373
- };
374
- }
375
- });
376
- const transport = new StdioServerTransport();
377
- await server.connect(transport);
378
- let isShuttingDown = false;
379
- const shutdown = async () => {
380
- if (isShuttingDown)
381
- return;
382
- isShuttingDown = true;
383
- try {
384
- connectionManager.cleanup();
385
- await socketServer.stop();
386
- await server.close();
387
- }
388
- finally {
389
- process.exit(0);
390
- }
391
- };
392
- process.on("SIGINT", shutdown);
393
- process.on("SIGTERM", shutdown);
394
- }
395
- main().catch((error) => {
396
- console.error("[gtkx] Fatal error:", error);
397
- process.exit(1);
398
- });
399
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- import EventEmitter from "node:events";
2
- import { type AppInfo } from "./protocol/types.js";
3
- import type { AppConnection, SocketServer } from "./socket-server.js";
4
- type ConnectionManagerEventMap = {
5
- appRegistered: [AppInfo];
6
- appUnregistered: [string];
7
- };
8
- type RegisteredApp = {
9
- info: AppInfo;
10
- connection: AppConnection;
11
- };
12
- /**
13
- * Manages connections between the MCP server and GTKX applications.
14
- *
15
- * Handles app registration, request routing, and connection lifecycle.
16
- */
17
- export declare class ConnectionManager extends EventEmitter<ConnectionManagerEventMap> {
18
- private socketServer;
19
- private static readonly DEFAULT_WAIT_TIMEOUT;
20
- private apps;
21
- private connectionToApp;
22
- private pendingRequests;
23
- private requestTimeout;
24
- constructor(socketServer: SocketServer, options?: {
25
- requestTimeout?: number;
26
- });
27
- getApps(): AppInfo[];
28
- getApp(appId: string): AppInfo | undefined;
29
- hasConnectedApps(): boolean;
30
- getDefaultApp(): RegisteredApp | undefined;
31
- /**
32
- * Waits for at least one app to connect and register.
33
- *
34
- * @param timeout - Maximum time to wait in milliseconds (default: 10000)
35
- * @returns Promise that resolves with the first registered app info
36
- * @throws Error if timeout is reached before any app registers
37
- */
38
- waitForApp(timeout?: number): Promise<AppInfo>;
39
- sendToApp<T>(appId: string | undefined, method: string, params?: unknown): Promise<T>;
40
- cleanup(): void;
41
- private handleRequest;
42
- private handleResponse;
43
- private handleRegister;
44
- private handleUnregister;
45
- private handleDisconnection;
46
- }
47
- export {};
48
- //# sourceMappingURL=connection-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../src/connection-manager.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AASvC,OAAO,EAAE,KAAK,OAAO,EAA2D,MAAM,qBAAqB,CAAC;AAC5G,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEtE,KAAK,yBAAyB,GAAG;IAC7B,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC;IACzB,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;CAC7B,CAAC;AAQF,KAAK,aAAa,GAAG;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,aAAa,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,YAAY,CAAC,yBAAyB,CAAC;IAStE,OAAO,CAAC,YAAY;IARxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAErD,OAAO,CAAC,IAAI,CAAyC;IACrD,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,cAAc,CAAS;gBAGnB,YAAY,EAAE,YAAY,EAClC,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAO;IAkB7C,OAAO,IAAI,OAAO,EAAE;IAIpB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI1C,gBAAgB,IAAI,OAAO;IAI3B,aAAa,IAAI,aAAa,GAAG,SAAS;IAK1C;;;;;;OAMG;IACH,UAAU,CAAC,OAAO,GAAE,MAA+C,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BhF,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAuC3F,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,mBAAmB;CAQ9B"}
@@ -1,185 +0,0 @@
1
- import EventEmitter from "node:events";
2
- import { appNotFoundError, invalidRequestError, ipcTimeoutError, McpError, noAppConnectedError, } from "./protocol/errors.js";
3
- import { RegisterParamsSchema } from "./protocol/types.js";
4
- /**
5
- * Manages connections between the MCP server and GTKX applications.
6
- *
7
- * Handles app registration, request routing, and connection lifecycle.
8
- */
9
- export class ConnectionManager extends EventEmitter {
10
- socketServer;
11
- static DEFAULT_WAIT_TIMEOUT = 10000;
12
- apps = new Map();
13
- connectionToApp = new Map();
14
- pendingRequests = new Map();
15
- requestTimeout;
16
- constructor(socketServer, options = {}) {
17
- super();
18
- this.socketServer = socketServer;
19
- this.requestTimeout = options.requestTimeout ?? 30000;
20
- this.socketServer.on("request", (connection, request) => {
21
- this.handleRequest(connection, request);
22
- });
23
- this.socketServer.on("response", (_connection, response) => {
24
- this.handleResponse(response);
25
- });
26
- this.socketServer.on("disconnection", (connection) => {
27
- this.handleDisconnection(connection);
28
- });
29
- }
30
- getApps() {
31
- return Array.from(this.apps.values()).map((app) => app.info);
32
- }
33
- getApp(appId) {
34
- return this.apps.get(appId)?.info;
35
- }
36
- hasConnectedApps() {
37
- return this.apps.size > 0;
38
- }
39
- getDefaultApp() {
40
- const first = this.apps.values().next();
41
- return first.done ? undefined : first.value;
42
- }
43
- /**
44
- * Waits for at least one app to connect and register.
45
- *
46
- * @param timeout - Maximum time to wait in milliseconds (default: 10000)
47
- * @returns Promise that resolves with the first registered app info
48
- * @throws Error if timeout is reached before any app registers
49
- */
50
- waitForApp(timeout = ConnectionManager.DEFAULT_WAIT_TIMEOUT) {
51
- const defaultApp = this.getDefaultApp();
52
- if (defaultApp) {
53
- return Promise.resolve(defaultApp.info);
54
- }
55
- return new Promise((resolve, reject) => {
56
- const timeoutId = setTimeout(() => {
57
- this.off("appRegistered", onRegister);
58
- reject(new Error(`Timeout waiting for app registration after ${timeout}ms. ` +
59
- "Make sure your GTKX app is running with 'gtkx dev'."));
60
- }, timeout);
61
- const onRegister = (appInfo) => {
62
- clearTimeout(timeoutId);
63
- this.off("appRegistered", onRegister);
64
- resolve(appInfo);
65
- };
66
- this.on("appRegistered", onRegister);
67
- });
68
- }
69
- async sendToApp(appId, method, params) {
70
- const app = appId ? this.apps.get(appId) : this.getDefaultApp();
71
- if (!app) {
72
- if (appId) {
73
- throw appNotFoundError(appId);
74
- }
75
- throw noAppConnectedError();
76
- }
77
- const requestId = crypto.randomUUID();
78
- const request = {
79
- id: requestId,
80
- method,
81
- params,
82
- };
83
- return new Promise((resolve, reject) => {
84
- const timeout = setTimeout(() => {
85
- this.pendingRequests.delete(requestId);
86
- reject(ipcTimeoutError(this.requestTimeout));
87
- }, this.requestTimeout);
88
- this.pendingRequests.set(requestId, {
89
- resolve: resolve,
90
- reject,
91
- timeout,
92
- });
93
- const sent = this.socketServer.send(app.connection.id, request);
94
- if (!sent) {
95
- clearTimeout(timeout);
96
- this.pendingRequests.delete(requestId);
97
- reject(appNotFoundError(app.info.appId));
98
- return;
99
- }
100
- });
101
- }
102
- cleanup() {
103
- for (const pending of this.pendingRequests.values()) {
104
- clearTimeout(pending.timeout);
105
- pending.reject(new Error("Connection manager shutting down"));
106
- }
107
- this.pendingRequests.clear();
108
- }
109
- handleRequest(connection, request) {
110
- if (request.method === "app.register") {
111
- this.handleRegister(connection, request);
112
- return;
113
- }
114
- if (request.method === "app.unregister") {
115
- this.handleUnregister(connection, request);
116
- return;
117
- }
118
- }
119
- handleResponse(response) {
120
- const pending = this.pendingRequests.get(response.id);
121
- if (!pending) {
122
- return;
123
- }
124
- clearTimeout(pending.timeout);
125
- this.pendingRequests.delete(response.id);
126
- if (response.error) {
127
- const err = response.error;
128
- pending.reject(new McpError(err.code, err.message, err.data));
129
- }
130
- else {
131
- pending.resolve(response.result);
132
- }
133
- }
134
- handleRegister(connection, request) {
135
- const parseResult = RegisterParamsSchema.safeParse(request.params);
136
- if (!parseResult.success) {
137
- const response = {
138
- id: request.id,
139
- error: invalidRequestError(parseResult.error.message).toIpcError(),
140
- };
141
- this.socketServer.send(connection.id, response);
142
- return;
143
- }
144
- const params = parseResult.data;
145
- const appInfo = {
146
- appId: params.appId,
147
- pid: params.pid,
148
- windows: [],
149
- };
150
- const registeredApp = {
151
- info: appInfo,
152
- connection,
153
- };
154
- this.apps.set(params.appId, registeredApp);
155
- this.connectionToApp.set(connection.id, params.appId);
156
- const response = {
157
- id: request.id,
158
- result: { success: true },
159
- };
160
- this.socketServer.send(connection.id, response);
161
- this.emit("appRegistered", appInfo);
162
- }
163
- handleUnregister(connection, request) {
164
- const appId = this.connectionToApp.get(connection.id);
165
- if (appId) {
166
- this.apps.delete(appId);
167
- this.connectionToApp.delete(connection.id);
168
- this.emit("appUnregistered", appId);
169
- }
170
- const response = {
171
- id: request.id,
172
- result: { success: true },
173
- };
174
- this.socketServer.send(connection.id, response);
175
- }
176
- handleDisconnection(connection) {
177
- const appId = this.connectionToApp.get(connection.id);
178
- if (appId) {
179
- this.apps.delete(appId);
180
- this.connectionToApp.delete(connection.id);
181
- this.emit("appUnregistered", appId);
182
- }
183
- }
184
- }
185
- //# sourceMappingURL=connection-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../src/connection-manager.ts"],"names":[],"mappings":"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"}