@alsania-io/mcpnyx 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +251 -0
- package/dist/gateways/configToSse.d.ts +16 -0
- package/dist/gateways/configToSse.d.ts.map +1 -0
- package/dist/gateways/configToSse.js +144 -0
- package/dist/gateways/configToSse.js.map +1 -0
- package/dist/gateways/configToStreamableHttp.d.ts +16 -0
- package/dist/gateways/configToStreamableHttp.d.ts.map +1 -0
- package/dist/gateways/configToStreamableHttp.js +287 -0
- package/dist/gateways/configToStreamableHttp.js.map +1 -0
- package/dist/gateways/configToWs.d.ts +14 -0
- package/dist/gateways/configToWs.d.ts.map +1 -0
- package/dist/gateways/configToWs.js +145 -0
- package/dist/gateways/configToWs.js.map +1 -0
- package/dist/gateways/sseToSse.d.ts +16 -0
- package/dist/gateways/sseToSse.d.ts.map +1 -0
- package/dist/gateways/sseToSse.js +224 -0
- package/dist/gateways/sseToSse.js.map +1 -0
- package/dist/gateways/sseToStdio.d.ts +8 -0
- package/dist/gateways/sseToStdio.d.ts.map +1 -0
- package/dist/gateways/sseToStdio.js +130 -0
- package/dist/gateways/sseToStdio.js.map +1 -0
- package/dist/gateways/sseToWs.d.ts +14 -0
- package/dist/gateways/sseToWs.d.ts.map +1 -0
- package/dist/gateways/sseToWs.js +212 -0
- package/dist/gateways/sseToWs.js.map +1 -0
- package/dist/gateways/stdioToSse.d.ts +16 -0
- package/dist/gateways/stdioToSse.d.ts.map +1 -0
- package/dist/gateways/stdioToSse.js +134 -0
- package/dist/gateways/stdioToSse.js.map +1 -0
- package/dist/gateways/stdioToStatefulStreamableHttp.d.ts +15 -0
- package/dist/gateways/stdioToStatefulStreamableHttp.d.ts.map +1 -0
- package/dist/gateways/stdioToStatefulStreamableHttp.js +189 -0
- package/dist/gateways/stdioToStatefulStreamableHttp.js.map +1 -0
- package/dist/gateways/stdioToStatelessStreamableHttp.d.ts +14 -0
- package/dist/gateways/stdioToStatelessStreamableHttp.d.ts.map +1 -0
- package/dist/gateways/stdioToStatelessStreamableHttp.js +132 -0
- package/dist/gateways/stdioToStatelessStreamableHttp.js.map +1 -0
- package/dist/gateways/stdioToWs.d.ts +13 -0
- package/dist/gateways/stdioToWs.d.ts.map +1 -0
- package/dist/gateways/stdioToWs.js +115 -0
- package/dist/gateways/stdioToWs.js.map +1 -0
- package/dist/gateways/streamableHttpToSse.d.ts +16 -0
- package/dist/gateways/streamableHttpToSse.d.ts.map +1 -0
- package/dist/gateways/streamableHttpToSse.js +219 -0
- package/dist/gateways/streamableHttpToSse.js.map +1 -0
- package/dist/gateways/streamableHttpToStdio.d.ts +8 -0
- package/dist/gateways/streamableHttpToStdio.d.ts.map +1 -0
- package/dist/gateways/streamableHttpToStdio.js +124 -0
- package/dist/gateways/streamableHttpToStdio.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +424 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +78 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +59 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/corsOrigin.d.ts +6 -0
- package/dist/lib/corsOrigin.d.ts.map +1 -0
- package/dist/lib/corsOrigin.js +24 -0
- package/dist/lib/corsOrigin.js.map +1 -0
- package/dist/lib/getLogger.d.ts +6 -0
- package/dist/lib/getLogger.d.ts.map +1 -0
- package/dist/lib/getLogger.js +55 -0
- package/dist/lib/getLogger.js.map +1 -0
- package/dist/lib/getVersion.d.ts +2 -0
- package/dist/lib/getVersion.d.ts.map +1 -0
- package/dist/lib/getVersion.js +17 -0
- package/dist/lib/getVersion.js.map +1 -0
- package/dist/lib/headers.d.ts +9 -0
- package/dist/lib/headers.d.ts.map +1 -0
- package/dist/lib/headers.js +32 -0
- package/dist/lib/headers.js.map +1 -0
- package/dist/lib/mcpServerManager.d.ts +24 -0
- package/dist/lib/mcpServerManager.d.ts.map +1 -0
- package/dist/lib/mcpServerManager.js +347 -0
- package/dist/lib/mcpServerManager.js.map +1 -0
- package/dist/lib/onSignals.d.ts +14 -0
- package/dist/lib/onSignals.d.ts.map +1 -0
- package/dist/lib/onSignals.js +28 -0
- package/dist/lib/onSignals.js.map +1 -0
- package/dist/lib/serializeCorsOrigin.d.ts +5 -0
- package/dist/lib/serializeCorsOrigin.d.ts.map +1 -0
- package/dist/lib/serializeCorsOrigin.js +7 -0
- package/dist/lib/serializeCorsOrigin.js.map +1 -0
- package/dist/lib/sessionAccessCounter.d.ts +12 -0
- package/dist/lib/sessionAccessCounter.d.ts.map +1 -0
- package/dist/lib/sessionAccessCounter.js +78 -0
- package/dist/lib/sessionAccessCounter.js.map +1 -0
- package/dist/server/websocket.d.ts +22 -0
- package/dist/server/websocket.d.ts.map +1 -0
- package/dist/server/websocket.js +103 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export class SessionAccessCounter {
|
|
2
|
+
timeout;
|
|
3
|
+
cleanup;
|
|
4
|
+
logger;
|
|
5
|
+
sessions = new Map();
|
|
6
|
+
constructor(timeout, cleanup, logger) {
|
|
7
|
+
this.timeout = timeout;
|
|
8
|
+
this.cleanup = cleanup;
|
|
9
|
+
this.logger = logger;
|
|
10
|
+
}
|
|
11
|
+
inc(sessionId, reason) {
|
|
12
|
+
this.logger.info(`SessionAccessCounter.inc() ${sessionId}, caused by ${reason}`);
|
|
13
|
+
const session = this.sessions.get(sessionId);
|
|
14
|
+
if (!session) {
|
|
15
|
+
// New session
|
|
16
|
+
this.logger.info(`Session access count 0 -> 1 for ${sessionId} (new session)`);
|
|
17
|
+
this.sessions.set(sessionId, { accessCount: 1 });
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if ('timeout' in session) {
|
|
21
|
+
// Clear pending cleanup and reactivate
|
|
22
|
+
this.logger.info(`Session access count 0 -> 1, clearing cleanup timeout for ${sessionId}`);
|
|
23
|
+
clearTimeout(session.timeout);
|
|
24
|
+
this.sessions.set(sessionId, { accessCount: 1 });
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// Increment active session
|
|
28
|
+
this.logger.info(`Session access count ${session.accessCount} -> ${session.accessCount + 1} for ${sessionId}`);
|
|
29
|
+
session.accessCount++;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
dec(sessionId, reason) {
|
|
33
|
+
this.logger.info(`SessionAccessCounter.dec() ${sessionId}, caused by ${reason}`);
|
|
34
|
+
const session = this.sessions.get(sessionId);
|
|
35
|
+
if (!session) {
|
|
36
|
+
this.logger.error(`Called dec() on non-existent session ${sessionId}, ignoring`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if ('timeout' in session) {
|
|
40
|
+
this.logger.error(`Called dec() on session ${sessionId} that is already pending cleanup, ignoring`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (session.accessCount <= 0) {
|
|
44
|
+
throw new Error(`Invalid access count ${session.accessCount} for session ${sessionId}`);
|
|
45
|
+
}
|
|
46
|
+
session.accessCount--;
|
|
47
|
+
this.logger.info(`Session access count ${session.accessCount + 1} -> ${session.accessCount} for ${sessionId}`);
|
|
48
|
+
if (session.accessCount === 0) {
|
|
49
|
+
this.logger.info(`Session access count reached 0, setting cleanup timeout for ${sessionId}`);
|
|
50
|
+
this.sessions.set(sessionId, {
|
|
51
|
+
timeout: setTimeout(() => {
|
|
52
|
+
this.logger.info(`Session ${sessionId} timed out, cleaning up`);
|
|
53
|
+
this.sessions.delete(sessionId);
|
|
54
|
+
this.cleanup(sessionId);
|
|
55
|
+
}, this.timeout),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
clear(sessionId, runCleanup, reason) {
|
|
60
|
+
this.logger.info(`SessionAccessCounter.clear() ${sessionId}, caused by ${reason}`);
|
|
61
|
+
const session = this.sessions.get(sessionId);
|
|
62
|
+
if (!session) {
|
|
63
|
+
this.logger.info(`Attempted to clear non-existent session ${sessionId}`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Clear any pending timeout
|
|
67
|
+
if ('timeout' in session) {
|
|
68
|
+
clearTimeout(session.timeout);
|
|
69
|
+
}
|
|
70
|
+
// Remove from tracking
|
|
71
|
+
this.sessions.delete(sessionId);
|
|
72
|
+
// Run cleanup if requested
|
|
73
|
+
if (runCleanup) {
|
|
74
|
+
this.cleanup(sessionId);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=sessionAccessCounter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionAccessCounter.js","sourceRoot":"","sources":["../../src/lib/sessionAccessCounter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Transport, TransportSendOptions } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
2
|
+
import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { Server } from 'http';
|
|
4
|
+
export declare class WebSocketServerTransport implements Transport {
|
|
5
|
+
private wss;
|
|
6
|
+
private clients;
|
|
7
|
+
onclose?: () => void;
|
|
8
|
+
onerror?: (err: Error) => void;
|
|
9
|
+
private messageHandler?;
|
|
10
|
+
onconnection?: (clientId: string) => void;
|
|
11
|
+
ondisconnection?: (clientId: string) => void;
|
|
12
|
+
set onmessage(handler: ((message: JSONRPCMessage) => void) | undefined);
|
|
13
|
+
constructor({ path, server }: {
|
|
14
|
+
path: string;
|
|
15
|
+
server: Server;
|
|
16
|
+
});
|
|
17
|
+
start(): Promise<void>;
|
|
18
|
+
send(msg: JSONRPCMessage, options?: TransportSendOptions | string): Promise<void>;
|
|
19
|
+
broadcast(msg: JSONRPCMessage): Promise<void>;
|
|
20
|
+
close(): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/server/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,qBAAa,wBAAyB,YAAW,SAAS;IACxD,OAAO,CAAC,GAAG,CAAmB;IAC9B,OAAO,CAAC,OAAO,CAAqC;IAEpD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,OAAO,CAAC,cAAc,CAAC,CAAkD;IACzE,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7C,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,SAAS,EAgBrE;gBAEW,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAOxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BtB,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjF,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { WebSocket, WebSocketServer } from 'ws';
|
|
3
|
+
export class WebSocketServerTransport {
|
|
4
|
+
wss;
|
|
5
|
+
clients = new Map();
|
|
6
|
+
onclose;
|
|
7
|
+
onerror;
|
|
8
|
+
messageHandler;
|
|
9
|
+
onconnection;
|
|
10
|
+
ondisconnection;
|
|
11
|
+
set onmessage(handler) {
|
|
12
|
+
this.messageHandler = handler
|
|
13
|
+
? (msg, clientId) => {
|
|
14
|
+
// @ts-ignore
|
|
15
|
+
if (msg.id === undefined) {
|
|
16
|
+
console.log('Broadcast message:', msg);
|
|
17
|
+
return handler(msg);
|
|
18
|
+
}
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
return handler({
|
|
21
|
+
...msg,
|
|
22
|
+
// @ts-ignore
|
|
23
|
+
id: clientId + ':' + msg.id,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
: undefined;
|
|
27
|
+
}
|
|
28
|
+
constructor({ path, server }) {
|
|
29
|
+
this.wss = new WebSocketServer({
|
|
30
|
+
path,
|
|
31
|
+
server,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async start() {
|
|
35
|
+
this.wss.on('connection', (ws) => {
|
|
36
|
+
const clientId = uuidv4();
|
|
37
|
+
this.clients.set(clientId, ws);
|
|
38
|
+
this.onconnection?.(clientId);
|
|
39
|
+
ws.on('message', (data) => {
|
|
40
|
+
try {
|
|
41
|
+
const msg = JSON.parse(data.toString());
|
|
42
|
+
this.messageHandler?.(msg, clientId);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
this.onerror?.(new Error(`Failed to parse message: ${err}`));
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
ws.on('close', () => {
|
|
49
|
+
this.clients.delete(clientId);
|
|
50
|
+
this.ondisconnection?.(clientId);
|
|
51
|
+
});
|
|
52
|
+
ws.on('error', (err) => {
|
|
53
|
+
this.onerror?.(err);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async send(msg, options) {
|
|
58
|
+
// decide if they passed a raw clientId (legacy) or options object
|
|
59
|
+
const clientId = typeof options === 'string' ? options : undefined;
|
|
60
|
+
// if your protocol mangles IDs to include clientId, strip it off
|
|
61
|
+
const [cId, rawId] = clientId?.split(':') ?? [];
|
|
62
|
+
if (rawId !== undefined) {
|
|
63
|
+
// @ts-ignore
|
|
64
|
+
msg.id = parseInt(rawId, 10);
|
|
65
|
+
}
|
|
66
|
+
const payload = JSON.stringify(msg);
|
|
67
|
+
if (cId) {
|
|
68
|
+
// send only to the one client
|
|
69
|
+
const ws = this.clients.get(cId);
|
|
70
|
+
if (ws?.readyState === WebSocket.OPEN) {
|
|
71
|
+
ws.send(payload);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
this.clients.delete(cId);
|
|
75
|
+
this.ondisconnection?.(cId);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// broadcast to everyone
|
|
80
|
+
for (const [id, ws] of this.clients) {
|
|
81
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
82
|
+
ws.send(payload);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this.clients.delete(id);
|
|
86
|
+
this.ondisconnection?.(id);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async broadcast(msg) {
|
|
92
|
+
return this.send(msg);
|
|
93
|
+
}
|
|
94
|
+
async close() {
|
|
95
|
+
return new Promise((resolve) => {
|
|
96
|
+
this.wss.close(() => {
|
|
97
|
+
this.clients.clear();
|
|
98
|
+
resolve();
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/server/websocket.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;CAChC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/package.json",
|
|
3
|
+
"name": "@alsania-io/mcpnyx",
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"description": "MCPNyx - Advanced MCP proxy server for Nyx extension. Run multiple MCP stdio-based and SSE-based servers through a unified SSE/HTTP/WebSocket endpoint.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"mcp",
|
|
8
|
+
"model-context-protocol",
|
|
9
|
+
"sse",
|
|
10
|
+
"http",
|
|
11
|
+
"websocket",
|
|
12
|
+
"stream",
|
|
13
|
+
"nyx",
|
|
14
|
+
"alsania",
|
|
15
|
+
"gateway",
|
|
16
|
+
"proxy",
|
|
17
|
+
"bridge"
|
|
18
|
+
],
|
|
19
|
+
"author": "Alsania I/O <sigma@alsania.dev>",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/alsania-io/mcpnyx.git"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/alsania-io/mcpnyx/issues"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://alsania-io.com",
|
|
29
|
+
"type": "module",
|
|
30
|
+
"main": "dist/index.js",
|
|
31
|
+
"bin": {
|
|
32
|
+
"mcpnyx": "dist/index.js",
|
|
33
|
+
"nyxmcp": "dist/index.js"
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"README.md",
|
|
38
|
+
"LICENSE"
|
|
39
|
+
],
|
|
40
|
+
"scripts": {
|
|
41
|
+
"clean": "rm -rf ./dist && rm -rf ./node_modules",
|
|
42
|
+
"format": "prettier --write .",
|
|
43
|
+
"format:check": "prettier --check .",
|
|
44
|
+
"test": "echo \"No tests yet\" && exit 0",
|
|
45
|
+
"lint": "eslint src/**/*.ts",
|
|
46
|
+
"lint:fix": "eslint src/**/*.ts --fix",
|
|
47
|
+
"build": "tsc",
|
|
48
|
+
"start": "node dist/index.js",
|
|
49
|
+
"dev": "tsx src/index.ts",
|
|
50
|
+
"prepare": "husky install"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@genkit-ai/mcp": "^1.22.0",
|
|
54
|
+
"@modelcontextprotocol/sdk": "^1.20.2",
|
|
55
|
+
"body-parser": "^2.2.0",
|
|
56
|
+
"cors": "^2.8.5",
|
|
57
|
+
"express": "^5.1.0",
|
|
58
|
+
"uuid": "^13.0.0",
|
|
59
|
+
"ws": "^8.18.3",
|
|
60
|
+
"yargs": "^18.0.0",
|
|
61
|
+
"zod": "^3.25.76"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@types/cors": "^2.8.17",
|
|
65
|
+
"@types/express": "^5.0.5",
|
|
66
|
+
"@types/node": "^24.9.2",
|
|
67
|
+
"@types/uuid": "^10.0.0",
|
|
68
|
+
"@types/ws": "^8.18.1",
|
|
69
|
+
"@types/yargs": "^17.0.34",
|
|
70
|
+
"@typescript-eslint/eslint-plugin": "^8.46.2",
|
|
71
|
+
"@typescript-eslint/parser": "^8.46.2",
|
|
72
|
+
"eslint": "^9.39.0",
|
|
73
|
+
"husky": "^9.1.7",
|
|
74
|
+
"lint-staged": "^16.2.6",
|
|
75
|
+
"prettier": "^3.6.2",
|
|
76
|
+
"ts-node": "^10.9.2",
|
|
77
|
+
"tsx": "^4.20.6",
|
|
78
|
+
"typescript": "^5.9.3"
|
|
79
|
+
},
|
|
80
|
+
"engines": {
|
|
81
|
+
"node": ">=18.0.0"
|
|
82
|
+
},
|
|
83
|
+
"lint-staged": {
|
|
84
|
+
"*.{ts,tsx}": [
|
|
85
|
+
"prettier --write",
|
|
86
|
+
"eslint --fix"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
"prettier": {
|
|
90
|
+
"tabWidth": 2,
|
|
91
|
+
"trailingComma": "all",
|
|
92
|
+
"singleQuote": true,
|
|
93
|
+
"printWidth": 120
|
|
94
|
+
}
|
|
95
|
+
}
|