@ai2qa/local-agent 0.1.0

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 (83) hide show
  1. package/README.md +254 -0
  2. package/bin/ai2qa-agent +12 -0
  3. package/dist/browser/connection.d.ts +80 -0
  4. package/dist/browser/connection.d.ts.map +1 -0
  5. package/dist/browser/connection.js +165 -0
  6. package/dist/browser/connection.js.map +1 -0
  7. package/dist/config.d.ts +58 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +231 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/index.d.ts +10 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +189 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/server.d.ts +56 -0
  16. package/dist/server.d.ts.map +1 -0
  17. package/dist/server.js +387 -0
  18. package/dist/server.js.map +1 -0
  19. package/dist/tools/click.d.ts +12 -0
  20. package/dist/tools/click.d.ts.map +1 -0
  21. package/dist/tools/click.js +61 -0
  22. package/dist/tools/click.js.map +1 -0
  23. package/dist/tools/evaluate.d.ts +9 -0
  24. package/dist/tools/evaluate.d.ts.map +1 -0
  25. package/dist/tools/evaluate.js +77 -0
  26. package/dist/tools/evaluate.js.map +1 -0
  27. package/dist/tools/fill.d.ts +9 -0
  28. package/dist/tools/fill.d.ts.map +1 -0
  29. package/dist/tools/fill.js +48 -0
  30. package/dist/tools/fill.js.map +1 -0
  31. package/dist/tools/hover.d.ts +9 -0
  32. package/dist/tools/hover.d.ts.map +1 -0
  33. package/dist/tools/hover.js +44 -0
  34. package/dist/tools/hover.js.map +1 -0
  35. package/dist/tools/index.d.ts +18 -0
  36. package/dist/tools/index.d.ts.map +1 -0
  37. package/dist/tools/index.js +51 -0
  38. package/dist/tools/index.js.map +1 -0
  39. package/dist/tools/knowledge.d.ts +56 -0
  40. package/dist/tools/knowledge.d.ts.map +1 -0
  41. package/dist/tools/knowledge.js +98 -0
  42. package/dist/tools/knowledge.js.map +1 -0
  43. package/dist/tools/navigate.d.ts +9 -0
  44. package/dist/tools/navigate.d.ts.map +1 -0
  45. package/dist/tools/navigate.js +48 -0
  46. package/dist/tools/navigate.js.map +1 -0
  47. package/dist/tools/press-key.d.ts +9 -0
  48. package/dist/tools/press-key.d.ts.map +1 -0
  49. package/dist/tools/press-key.js +38 -0
  50. package/dist/tools/press-key.js.map +1 -0
  51. package/dist/tools/report.d.ts +29 -0
  52. package/dist/tools/report.d.ts.map +1 -0
  53. package/dist/tools/report.js +92 -0
  54. package/dist/tools/report.js.map +1 -0
  55. package/dist/tools/screenshot.d.ts +9 -0
  56. package/dist/tools/screenshot.d.ts.map +1 -0
  57. package/dist/tools/screenshot.js +54 -0
  58. package/dist/tools/screenshot.js.map +1 -0
  59. package/dist/tools/snapshot.d.ts +13 -0
  60. package/dist/tools/snapshot.d.ts.map +1 -0
  61. package/dist/tools/snapshot.js +134 -0
  62. package/dist/tools/snapshot.js.map +1 -0
  63. package/dist/tools/types.d.ts +329 -0
  64. package/dist/tools/types.d.ts.map +1 -0
  65. package/dist/tools/types.js +102 -0
  66. package/dist/tools/types.js.map +1 -0
  67. package/dist/tools/wait.d.ts +9 -0
  68. package/dist/tools/wait.d.ts.map +1 -0
  69. package/dist/tools/wait.js +64 -0
  70. package/dist/tools/wait.js.map +1 -0
  71. package/dist/transports/index.d.ts +8 -0
  72. package/dist/transports/index.d.ts.map +1 -0
  73. package/dist/transports/index.js +14 -0
  74. package/dist/transports/index.js.map +1 -0
  75. package/dist/transports/stdio.d.ts +8 -0
  76. package/dist/transports/stdio.d.ts.map +1 -0
  77. package/dist/transports/stdio.js +12 -0
  78. package/dist/transports/stdio.js.map +1 -0
  79. package/dist/transports/websocket.d.ts +87 -0
  80. package/dist/transports/websocket.d.ts.map +1 -0
  81. package/dist/transports/websocket.js +200 -0
  82. package/dist/transports/websocket.js.map +1 -0
  83. package/package.json +53 -0
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Transports Index
3
+ *
4
+ * Exports all available MCP transport implementations.
5
+ */
6
+ export { StdioServerTransport } from './stdio.js';
7
+ export { WebSocketTransport, createWebSocketTransport, type WebSocketTransportConfig, } from './websocket.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transports/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACH,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,wBAAwB,GAChC,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Transports Index
4
+ *
5
+ * Exports all available MCP transport implementations.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.createWebSocketTransport = exports.WebSocketTransport = exports.StdioServerTransport = void 0;
9
+ var stdio_js_1 = require("./stdio.js");
10
+ Object.defineProperty(exports, "StdioServerTransport", { enumerable: true, get: function () { return stdio_js_1.StdioServerTransport; } });
11
+ var websocket_js_1 = require("./websocket.js");
12
+ Object.defineProperty(exports, "WebSocketTransport", { enumerable: true, get: function () { return websocket_js_1.WebSocketTransport; } });
13
+ Object.defineProperty(exports, "createWebSocketTransport", { enumerable: true, get: function () { return websocket_js_1.createWebSocketTransport; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transports/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,uCAAkD;AAAzC,gHAAA,oBAAoB,OAAA;AAC7B,+CAIwB;AAHpB,kHAAA,kBAAkB,OAAA;AAClB,wHAAA,wBAAwB,OAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Stdio Transport Re-export
3
+ *
4
+ * Re-exports the MCP SDK's stdio transport for convenience.
5
+ * Used for local AI tool integration (Claude Code, Cursor, etc.)
6
+ */
7
+ export { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Stdio Transport Re-export
4
+ *
5
+ * Re-exports the MCP SDK's stdio transport for convenience.
6
+ * Used for local AI tool integration (Claude Code, Cursor, etc.)
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.StdioServerTransport = void 0;
10
+ var stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
11
+ Object.defineProperty(exports, "StdioServerTransport", { enumerable: true, get: function () { return stdio_js_1.StdioServerTransport; } });
12
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,sEAAiF;AAAxE,gHAAA,oBAAoB,OAAA"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * WebSocket Transport for MCP Server
3
+ *
4
+ * Enables the local agent to connect to AI2QA cloud via WebSocket.
5
+ * The agent initiates an outbound connection to the cloud gateway,
6
+ * which then routes commands from the orchestrator to this agent.
7
+ */
8
+ import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
9
+ import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
10
+ /** WebSocket transport configuration */
11
+ export interface WebSocketTransportConfig {
12
+ /** AI2QA cloud WebSocket URL */
13
+ readonly url: string;
14
+ /** Authentication token (JWT) */
15
+ readonly token: string;
16
+ /** Agent identifier */
17
+ readonly agentId: string;
18
+ /** Reconnection settings */
19
+ readonly reconnect?: {
20
+ enabled: boolean;
21
+ maxAttempts: number;
22
+ delayMs: number;
23
+ maxDelayMs: number;
24
+ };
25
+ }
26
+ /** Connection state */
27
+ type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';
28
+ /**
29
+ * WebSocket Transport for MCP
30
+ *
31
+ * Implements the MCP Transport interface over WebSocket,
32
+ * allowing the local agent to communicate with AI2QA cloud.
33
+ */
34
+ export declare class WebSocketTransport implements Transport {
35
+ private ws;
36
+ private state;
37
+ private reconnectAttempts;
38
+ private reconnectTimer;
39
+ private readonly config;
40
+ private readonly reconnectConfig;
41
+ onmessage?: (message: JSONRPCMessage) => void;
42
+ onclose?: () => void;
43
+ onerror?: (error: Error) => void;
44
+ constructor(config: WebSocketTransportConfig);
45
+ /**
46
+ * Start the WebSocket connection.
47
+ */
48
+ start(): Promise<void>;
49
+ /**
50
+ * Send a JSON-RPC message over WebSocket.
51
+ */
52
+ send(message: JSONRPCMessage): Promise<void>;
53
+ /**
54
+ * Close the WebSocket connection.
55
+ */
56
+ close(): Promise<void>;
57
+ /**
58
+ * Get current connection state.
59
+ */
60
+ getState(): ConnectionState;
61
+ /**
62
+ * Check if connected.
63
+ */
64
+ isConnected(): boolean;
65
+ /**
66
+ * Establish WebSocket connection.
67
+ */
68
+ private connect;
69
+ /**
70
+ * Handle incoming WebSocket message.
71
+ */
72
+ private handleMessage;
73
+ /**
74
+ * Schedule a reconnection attempt.
75
+ */
76
+ private scheduleReconnect;
77
+ /**
78
+ * Cancel pending reconnection.
79
+ */
80
+ private cancelReconnect;
81
+ }
82
+ /**
83
+ * Factory function for creating WebSocket transport.
84
+ */
85
+ export declare function createWebSocketTransport(config: WebSocketTransportConfig): WebSocketTransport;
86
+ export {};
87
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/transports/websocket.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGpE,wCAAwC;AACxC,MAAM,WAAW,wBAAwB;IACrC,gCAAgC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4BAA4B;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC;CACL;AAED,uBAAuB;AACvB,KAAK,eAAe,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAUpF;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,SAAS;IAChD,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkD;IAGlF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;gBAErB,MAAM,EAAE,wBAAwB;IAK5C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B;;OAEG;IACH,QAAQ,IAAI,eAAe;IAI3B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;YACW,OAAO;IA0DrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;OAEG;IACH,OAAO,CAAC,eAAe;CAM1B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,wBAAwB,GAAG,kBAAkB,CAE7F"}
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ /**
3
+ * WebSocket Transport for MCP Server
4
+ *
5
+ * Enables the local agent to connect to AI2QA cloud via WebSocket.
6
+ * The agent initiates an outbound connection to the cloud gateway,
7
+ * which then routes commands from the orchestrator to this agent.
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.WebSocketTransport = void 0;
14
+ exports.createWebSocketTransport = createWebSocketTransport;
15
+ const ws_1 = __importDefault(require("ws"));
16
+ /** Default reconnection settings */
17
+ const DEFAULT_RECONNECT = {
18
+ enabled: true,
19
+ maxAttempts: 10,
20
+ delayMs: 1000,
21
+ maxDelayMs: 30000,
22
+ };
23
+ /**
24
+ * WebSocket Transport for MCP
25
+ *
26
+ * Implements the MCP Transport interface over WebSocket,
27
+ * allowing the local agent to communicate with AI2QA cloud.
28
+ */
29
+ class WebSocketTransport {
30
+ ws = null;
31
+ state = 'disconnected';
32
+ reconnectAttempts = 0;
33
+ reconnectTimer = null;
34
+ config;
35
+ reconnectConfig;
36
+ // MCP Transport callbacks
37
+ onmessage;
38
+ onclose;
39
+ onerror;
40
+ constructor(config) {
41
+ this.config = config;
42
+ this.reconnectConfig = config.reconnect ?? DEFAULT_RECONNECT;
43
+ }
44
+ /**
45
+ * Start the WebSocket connection.
46
+ */
47
+ async start() {
48
+ if (this.state !== 'disconnected') {
49
+ throw new Error(`Cannot start: transport is ${this.state}`);
50
+ }
51
+ await this.connect();
52
+ }
53
+ /**
54
+ * Send a JSON-RPC message over WebSocket.
55
+ */
56
+ async send(message) {
57
+ if (!this.ws || this.ws.readyState !== ws_1.default.OPEN) {
58
+ throw new Error('WebSocket is not connected');
59
+ }
60
+ const data = JSON.stringify(message);
61
+ this.ws.send(data);
62
+ }
63
+ /**
64
+ * Close the WebSocket connection.
65
+ */
66
+ async close() {
67
+ this.cancelReconnect();
68
+ this.state = 'disconnected';
69
+ if (this.ws) {
70
+ this.ws.close(1000, 'Client closing');
71
+ this.ws = null;
72
+ }
73
+ this.onclose?.();
74
+ }
75
+ /**
76
+ * Get current connection state.
77
+ */
78
+ getState() {
79
+ return this.state;
80
+ }
81
+ /**
82
+ * Check if connected.
83
+ */
84
+ isConnected() {
85
+ return this.state === 'connected' && this.ws?.readyState === ws_1.default.OPEN;
86
+ }
87
+ /**
88
+ * Establish WebSocket connection.
89
+ */
90
+ async connect() {
91
+ return new Promise((resolve, reject) => {
92
+ this.state = this.reconnectAttempts > 0 ? 'reconnecting' : 'connecting';
93
+ console.error(`[WebSocketTransport] Connecting to ${this.config.url}...`);
94
+ // Build URL with auth params
95
+ const url = new URL(this.config.url);
96
+ url.searchParams.set('agentId', this.config.agentId);
97
+ this.ws = new ws_1.default(url.toString(), {
98
+ headers: {
99
+ 'Authorization': `Bearer ${this.config.token}`,
100
+ },
101
+ });
102
+ this.ws.onopen = () => {
103
+ console.error('[WebSocketTransport] Connected to cloud');
104
+ this.state = 'connected';
105
+ this.reconnectAttempts = 0;
106
+ resolve();
107
+ };
108
+ this.ws.onmessage = (event) => {
109
+ this.handleMessage(event.data);
110
+ };
111
+ this.ws.onerror = (event) => {
112
+ const error = new Error(`WebSocket error: ${event.message || 'Unknown error'}`);
113
+ console.error('[WebSocketTransport] Error:', error.message);
114
+ if (this.state === 'connecting') {
115
+ reject(error);
116
+ }
117
+ else {
118
+ this.onerror?.(error);
119
+ }
120
+ };
121
+ this.ws.onclose = (event) => {
122
+ console.error(`[WebSocketTransport] Disconnected: code=${event.code}, reason=${event.reason || 'none'}`);
123
+ const wasConnected = this.state === 'connected';
124
+ const wasConnecting = this.state === 'connecting';
125
+ this.state = 'disconnected';
126
+ this.ws = null;
127
+ // Attempt reconnection if enabled and not intentionally closed
128
+ if (wasConnected && event.code !== 1000 && this.reconnectConfig.enabled) {
129
+ this.scheduleReconnect();
130
+ }
131
+ else if (wasConnecting) {
132
+ reject(new Error(`Connection closed: ${event.reason || 'Unknown reason'}`));
133
+ }
134
+ else {
135
+ this.onclose?.();
136
+ }
137
+ };
138
+ });
139
+ }
140
+ /**
141
+ * Handle incoming WebSocket message.
142
+ */
143
+ handleMessage(data) {
144
+ try {
145
+ const text = typeof data === 'string' ? data : data.toString();
146
+ const message = JSON.parse(text);
147
+ // Log for debugging (remove in production)
148
+ const msgInfo = 'method' in message ? message.method : ('id' in message ? `id:${message.id}` : 'response');
149
+ console.error(`[WebSocketTransport] Received: ${msgInfo}`);
150
+ this.onmessage?.(message);
151
+ }
152
+ catch (err) {
153
+ const error = err instanceof Error ? err : new Error(String(err));
154
+ console.error('[WebSocketTransport] Failed to parse message:', error.message);
155
+ this.onerror?.(error);
156
+ }
157
+ }
158
+ /**
159
+ * Schedule a reconnection attempt.
160
+ */
161
+ scheduleReconnect() {
162
+ if (this.reconnectAttempts >= this.reconnectConfig.maxAttempts) {
163
+ console.error('[WebSocketTransport] Max reconnection attempts reached');
164
+ this.onclose?.();
165
+ return;
166
+ }
167
+ // Exponential backoff with jitter
168
+ const baseDelay = this.reconnectConfig.delayMs * Math.pow(2, this.reconnectAttempts);
169
+ const jitter = Math.random() * 1000;
170
+ const delay = Math.min(baseDelay + jitter, this.reconnectConfig.maxDelayMs);
171
+ this.reconnectAttempts++;
172
+ console.error(`[WebSocketTransport] Reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts}/${this.reconnectConfig.maxAttempts})`);
173
+ this.reconnectTimer = setTimeout(async () => {
174
+ try {
175
+ await this.connect();
176
+ }
177
+ catch (err) {
178
+ console.error('[WebSocketTransport] Reconnection failed:', err);
179
+ this.scheduleReconnect();
180
+ }
181
+ }, delay);
182
+ }
183
+ /**
184
+ * Cancel pending reconnection.
185
+ */
186
+ cancelReconnect() {
187
+ if (this.reconnectTimer) {
188
+ clearTimeout(this.reconnectTimer);
189
+ this.reconnectTimer = null;
190
+ }
191
+ }
192
+ }
193
+ exports.WebSocketTransport = WebSocketTransport;
194
+ /**
195
+ * Factory function for creating WebSocket transport.
196
+ */
197
+ function createWebSocketTransport(config) {
198
+ return new WebSocketTransport(config);
199
+ }
200
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/transports/websocket.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@ai2qa/local-agent",
3
+ "version": "0.1.0",
4
+ "description": "Universal MCP Server for AI2QA - enables local AI tools and cloud orchestration to control browsers",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "ai2qa-agent": "./bin/ai2qa-agent"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/index.js",
14
+ "start:sidecar": "node dist/index.js --sidecar",
15
+ "lint": "eslint src/**/*.ts",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest",
18
+ "clean": "rm -rf dist"
19
+ },
20
+ "keywords": [
21
+ "ai2qa",
22
+ "mcp",
23
+ "browser-automation",
24
+ "playwright",
25
+ "testing"
26
+ ],
27
+ "author": "AI2QA",
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "@anthropic-ai/sdk": "^0.39.0",
31
+ "@modelcontextprotocol/sdk": "^1.0.0",
32
+ "playwright": "^1.40.0",
33
+ "zod": "^3.22.0",
34
+ "ws": "^8.16.0",
35
+ "commander": "^12.0.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^20.10.0",
39
+ "@types/ws": "^8.5.10",
40
+ "typescript": "^5.3.0",
41
+ "vitest": "^1.0.0",
42
+ "eslint": "^8.55.0",
43
+ "@typescript-eslint/eslint-plugin": "^6.13.0",
44
+ "@typescript-eslint/parser": "^6.13.0"
45
+ },
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ },
49
+ "files": [
50
+ "dist",
51
+ "bin"
52
+ ]
53
+ }