@etm-professional-control/winccoa-mcp-server 1.0.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 (49) hide show
  1. package/.env.example +72 -0
  2. package/README.md +92 -0
  3. package/build/config/server.config.d.ts +52 -0
  4. package/build/config/server.config.d.ts.map +1 -0
  5. package/build/config/server.config.js +87 -0
  6. package/build/config/server.config.js.map +1 -0
  7. package/build/index_http.d.ts +2 -0
  8. package/build/index_http.d.ts.map +1 -0
  9. package/build/index_http.js +299 -0
  10. package/build/index_http.js.map +1 -0
  11. package/build/index_stdio.d.ts +2 -0
  12. package/build/index_stdio.d.ts.map +1 -0
  13. package/build/index_stdio.js +27 -0
  14. package/build/index_stdio.js.map +1 -0
  15. package/build/server.d.ts +12 -0
  16. package/build/server.d.ts.map +1 -0
  17. package/build/server.js +211 -0
  18. package/build/server.js.map +1 -0
  19. package/build/tool_loader.d.ts +14 -0
  20. package/build/tool_loader.d.ts.map +1 -0
  21. package/build/tool_loader.js +63 -0
  22. package/build/tool_loader.js.map +1 -0
  23. package/build/tools/datapoints/dp_basic.d.ts +8 -0
  24. package/build/tools/datapoints/dp_basic.d.ts.map +1 -0
  25. package/build/tools/datapoints/dp_basic.js +148 -0
  26. package/build/tools/datapoints/dp_basic.js.map +1 -0
  27. package/build/tools/datapoints/dp_create.d.ts +8 -0
  28. package/build/tools/datapoints/dp_create.d.ts.map +1 -0
  29. package/build/tools/datapoints/dp_create.js +99 -0
  30. package/build/tools/datapoints/dp_create.js.map +1 -0
  31. package/build/tools/datapoints/dp_set.d.ts +8 -0
  32. package/build/tools/datapoints/dp_set.d.ts.map +1 -0
  33. package/build/tools/datapoints/dp_set.js +55 -0
  34. package/build/tools/datapoints/dp_set.js.map +1 -0
  35. package/build/tools/datapoints/dp_types.d.ts +8 -0
  36. package/build/tools/datapoints/dp_types.d.ts.map +1 -0
  37. package/build/tools/datapoints/dp_types.js +45 -0
  38. package/build/tools/datapoints/dp_types.js.map +1 -0
  39. package/build/utils/helpers.d.ts +35 -0
  40. package/build/utils/helpers.d.ts.map +1 -0
  41. package/build/utils/helpers.js +96 -0
  42. package/build/utils/helpers.js.map +1 -0
  43. package/config/demo-project-instructions.md +36 -0
  44. package/config/server.config.d.ts +78 -0
  45. package/config/server.config.d.ts.map +1 -0
  46. package/package.json +67 -0
  47. package/src/fields/default.md +56 -0
  48. package/src/fields/oil.md +56 -0
  49. package/src/fields/transport.md +79 -0
package/.env.example ADDED
@@ -0,0 +1,72 @@
1
+ # MCP Server Configuration for WinCC OA
2
+ # Copy this file to .env and configure for your deployment
3
+
4
+ # ====================
5
+ # REQUIRED SETTINGS
6
+ # ====================
7
+
8
+ # API Token for authentication (REQUIRED - no default for security)
9
+ # Generate a secure token: openssl rand -hex 32
10
+ MCP_API_TOKEN=
11
+
12
+ # ====================
13
+ # SERVER CONFIGURATION
14
+ # ====================
15
+
16
+ # Server Mode: 'http' or 'stdio'
17
+ MCP_MODE=http
18
+
19
+ # HTTP Server Settings
20
+ MCP_HTTP_PORT=3000
21
+ MCP_HTTP_HOST=0.0.0.0
22
+
23
+ # Authentication Type: 'bearer' or 'api-key'
24
+ MCP_AUTH_TYPE=bearer
25
+
26
+ # ====================
27
+ # SECURITY SETTINGS
28
+ # ====================
29
+
30
+ # Rate Limiting
31
+ RATE_LIMIT_ENABLED=true
32
+ RATE_LIMIT_WINDOW_MS=60000
33
+ RATE_LIMIT_MAX=100
34
+
35
+ # IP Filtering (comma-separated lists)
36
+ IP_FILTER_ENABLED=false
37
+ IP_WHITELIST=
38
+ IP_BLACKLIST=
39
+
40
+ # CORS Configuration
41
+ MCP_CORS_ENABLED=false
42
+ MCP_CORS_ORIGINS=*
43
+ MCP_CORS_CREDENTIALS=false
44
+
45
+ # SSL/TLS Configuration
46
+ MCP_SSL_ENABLED=false
47
+ MCP_SSL_CERT_PATH=/path/to/cert.pem
48
+ MCP_SSL_KEY_PATH=/path/to/key.pem
49
+ MCP_SSL_CA_PATH=/path/to/ca.pem
50
+
51
+ # ====================
52
+ # WINCC OA SETTINGS
53
+ # ====================
54
+
55
+ # Field Configuration
56
+ WINCCOA_FIELD=default
57
+
58
+ # Project Instructions (optional)
59
+ # IMPORTANT: Path must be relative to the WinCC OA project directory (not the MCP server directory)
60
+ # For demo/testing: Use the included demo project instructions
61
+ WINCCOA_PROJECT_INSTRUCTIONS=./javascript/mcpServer/config/demo-project-instructions.md
62
+ # For production: Create your own project-specific instructions
63
+ # WINCCOA_PROJECT_INSTRUCTIONS=/path/to/your/project-instructions.md
64
+
65
+
66
+ # ====================
67
+ # TOOLS CONFIGURATION
68
+ # ====================
69
+
70
+ # Tools to load (comma-separated list of relative paths without .js extension)
71
+ # Available tools: datapoints/dp_basic, datapoints/dp_create, datapoints/dp_set, datapoints/dp_types
72
+ TOOLS=datapoints/dp_basic,datapoints/dp_create,datapoints/dp_set,datapoints/dp_types
package/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # WinCC OA MCP Server
2
+
3
+ **AI Integration for Industrial Automation**
4
+
5
+ This Model Context Protocol (MCP) server connects AI assistants to WinCC OA SCADA systems, enabling intelligent automation and monitoring for industrial environments.
6
+
7
+ ## Quick Start
8
+
9
+ **Ask your AI:**
10
+ - "Show me all temperature values in the plant"
11
+ - "Which pumps are currently running?"
12
+ - "Set the setpoint for pump P-101 to 50%"
13
+ - "Create a production report for today"
14
+
15
+ ### 1. Install
16
+
17
+ ```bash
18
+ # In your WinCC OA project directory
19
+ cd <OA_ProjPath>/javascript
20
+ mkdir mcpServer && cd mcpServer
21
+
22
+ # Install packages
23
+ npm install @etm/winccoa-mcp-server
24
+ npm install file:C:/Siemens/Automation/WinCC_OA/3.20/javascript/winccoa-manager
25
+ ```
26
+
27
+ ### 2. Configure
28
+
29
+ ```bash
30
+ # Copy and edit configuration
31
+ cp .env.example .env
32
+ notepad .env # Windows
33
+ ```
34
+
35
+ **Minimal .env setup:**
36
+ ```env
37
+ # Generate with: openssl rand -hex 32
38
+ MCP_API_TOKEN=your-secure-token-here
39
+
40
+ # Choose industry context
41
+ WINCCOA_FIELD=default # or 'oil', 'transport'
42
+
43
+ # Configure available tools
44
+ TOOLS=datapoints/dp_basic,datapoints/dp_set,datapoints/dp_types
45
+ ```
46
+
47
+ ### 3. Start Server
48
+
49
+ Add JavaScript Manager in WinCC OA:
50
+ - **Manager Type:** JavaScript Manager
51
+ - **Script Path:** `mcpServer/index_http.js`
52
+
53
+ ### 4. Connect Claude Desktop
54
+
55
+ Edit `%APPDATA%/Claude/claude_desktop_config.json`:
56
+
57
+ ```json
58
+ {
59
+ "mcpServers": {
60
+ "winccoa": {
61
+ "command": "npx",
62
+ "args": ["mcp-remote", "http://localhost:3000/mcp", "--header", "Authorization: Bearer YOUR_TOKEN_HERE"]
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+ ## Documentation
69
+
70
+ - **[📦 Installation Guide](docs/INSTALLATION.md)** - Complete setup instructions
71
+ - **[⚙️ Configuration](docs/CONFIGURATION.md)** - All .env options and server modes
72
+ - **[🔧 Tools](docs/TOOLS.md)** - Available tools and custom development
73
+ - **[📝 Instructions](docs/INSTRUCTIONS.md)** - Industry templates and project customization
74
+ - **[🔍 Troubleshooting](docs/TROUBLESHOOTING.md)** - Common issues and limitations
75
+
76
+ ## Features
77
+
78
+ ✅ **Secure API** - Token-based authentication
79
+ ✅ **Industry Templates** - Pre-configured for Oil & Gas, Transportation
80
+ ✅ **Custom Tools** - Extend with your own WinCC OA integrations
81
+ ✅ **Project Rules** - Plant-specific AI guidance
82
+ ✅ **Dynamic Loading** - Configure only needed tools
83
+
84
+ ## Support
85
+
86
+ - **Repository:** [GitHub](https://github.com/winccoa/winccoa-ae-js-mcpserver)
87
+ - **Issues:** [Report Bug](https://github.com/winccoa/winccoa-ae-js-mcpserver/issues)
88
+ - **WinCC OA Docs:** [Official Documentation](https://www.winccoa.com/product-information/documentation.html)
89
+
90
+ ## License
91
+
92
+ ISC - See LICENSE.md for details.
@@ -0,0 +1,52 @@
1
+ export function loadSSLConfig(): {
2
+ cert: NonSharedBuffer & string;
3
+ key: NonSharedBuffer & string;
4
+ ca: NonSharedBuffer | undefined;
5
+ } | null;
6
+ export function validateConfig(): string[];
7
+ export namespace serverConfig {
8
+ let mode: string;
9
+ namespace http {
10
+ let port: number;
11
+ let host: string;
12
+ namespace auth {
13
+ let enabled: boolean;
14
+ let type: string;
15
+ let token: string | undefined;
16
+ namespace jwt {
17
+ let enabled_1: boolean;
18
+ export { enabled_1 as enabled };
19
+ export let secret: string | undefined;
20
+ export let expiresIn: string;
21
+ }
22
+ }
23
+ namespace cors {
24
+ let enabled_2: boolean;
25
+ export { enabled_2 as enabled };
26
+ export let origins: string[];
27
+ export let credentials: boolean;
28
+ }
29
+ namespace ssl {
30
+ let enabled_3: boolean;
31
+ export { enabled_3 as enabled };
32
+ export let cert: string | undefined;
33
+ export let key: string | undefined;
34
+ export let ca: string | undefined;
35
+ }
36
+ }
37
+ namespace security {
38
+ namespace rateLimit {
39
+ let enabled_4: boolean;
40
+ export { enabled_4 as enabled };
41
+ export let windowMs: number;
42
+ export let max: number;
43
+ }
44
+ namespace ipFilter {
45
+ let enabled_5: boolean;
46
+ export { enabled_5 as enabled };
47
+ export let whitelist: string[];
48
+ export let blacklist: string[];
49
+ }
50
+ }
51
+ }
52
+ //# sourceMappingURL=server.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.config.d.ts","sourceRoot":"","sources":["../../src/config/server.config.js"],"names":[],"mappings":"AAgEA;;;;SAcC;AAGD,2CAiBC"}
@@ -0,0 +1,87 @@
1
+ import { readFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ // Server deployment configuration
4
+ export const serverConfig = {
5
+ // Server mode configuration
6
+ mode: process.env.MCP_MODE || 'http', // 'http' or 'stdio'
7
+ // HTTP server configuration
8
+ http: {
9
+ port: parseInt(process.env.MCP_HTTP_PORT || '3000'),
10
+ host: process.env.MCP_HTTP_HOST || '0.0.0.0', // Listen on all interfaces for server deployment
11
+ // Authentication configuration
12
+ auth: {
13
+ enabled: true, // Always enabled for security
14
+ type: process.env.MCP_AUTH_TYPE || 'bearer', // 'bearer' or 'api-key'
15
+ token: process.env.MCP_API_TOKEN, // Required - no default
16
+ // Additional auth options for future expansion
17
+ jwt: {
18
+ enabled: process.env.MCP_JWT_ENABLED === 'true',
19
+ secret: process.env.MCP_JWT_SECRET,
20
+ expiresIn: process.env.MCP_JWT_EXPIRES_IN || '24h'
21
+ }
22
+ },
23
+ // CORS configuration for browser-based clients
24
+ cors: {
25
+ enabled: process.env.MCP_CORS_ENABLED === 'true',
26
+ origins: process.env.MCP_CORS_ORIGINS ? process.env.MCP_CORS_ORIGINS.split(',') : ['*'],
27
+ credentials: process.env.MCP_CORS_CREDENTIALS === 'true'
28
+ },
29
+ // SSL/TLS configuration
30
+ ssl: {
31
+ enabled: process.env.MCP_SSL_ENABLED === 'true',
32
+ cert: process.env.MCP_SSL_CERT_PATH,
33
+ key: process.env.MCP_SSL_KEY_PATH,
34
+ ca: process.env.MCP_SSL_CA_PATH
35
+ }
36
+ },
37
+ // Security configuration
38
+ security: {
39
+ // Rate limiting
40
+ rateLimit: {
41
+ enabled: process.env.RATE_LIMIT_ENABLED !== 'false',
42
+ windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS || '60000'), // 1 minute
43
+ max: parseInt(process.env.RATE_LIMIT_MAX || '100') // requests per window
44
+ },
45
+ // IP whitelist/blacklist
46
+ ipFilter: {
47
+ enabled: process.env.IP_FILTER_ENABLED === 'true',
48
+ whitelist: process.env.IP_WHITELIST ? process.env.IP_WHITELIST.split(',') : [],
49
+ blacklist: process.env.IP_BLACKLIST ? process.env.IP_BLACKLIST.split(',') : []
50
+ }
51
+ },
52
+ };
53
+ // Helper function to load SSL certificates
54
+ export function loadSSLConfig() {
55
+ const config = serverConfig.http.ssl;
56
+ if (!config.enabled)
57
+ return null;
58
+ try {
59
+ return {
60
+ cert: readFileSync(config.cert),
61
+ key: readFileSync(config.key),
62
+ ca: config.ca ? readFileSync(config.ca) : undefined
63
+ };
64
+ }
65
+ catch (error) {
66
+ console.error('Failed to load SSL certificates:', error);
67
+ return null;
68
+ }
69
+ }
70
+ // Validate configuration
71
+ export function validateConfig() {
72
+ console.log('🔍 Starting configuration validation...');
73
+ console.log('🔍 process.env.MCP_API_TOKEN:', process.env.MCP_API_TOKEN ? 'SET' : 'NOT SET');
74
+ console.log('🔍 serverConfig.http.auth.token:', serverConfig.http.auth.token ? 'SET' : 'NOT SET');
75
+ const errors = [];
76
+ // Always require API token
77
+ if (!serverConfig.http.auth.token) {
78
+ console.log('❌ MCP_API_TOKEN validation failed');
79
+ errors.push('MCP_API_TOKEN must be set in environment variables or .env file');
80
+ }
81
+ else {
82
+ console.log('✅ MCP_API_TOKEN validation passed');
83
+ }
84
+ console.log('🔍 Validation completed with', errors.length, 'errors');
85
+ return errors;
86
+ }
87
+ //# sourceMappingURL=server.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.config.js","sourceRoot":"","sources":["../../src/config/server.config.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index_http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index_http.d.ts","sourceRoot":"","sources":["../src/index_http.js"],"names":[],"mappings":""}
@@ -0,0 +1,299 @@
1
+ /*******************************************************/
2
+ /* */
3
+ /* This file was initially creates by Martin Kumhera */
4
+ /* and extended by AI with CNS (UNS) functions! */
5
+ /* */
6
+ /*******************************************************/
7
+ // Try to load dotenv if available BEFORE importing config
8
+ try {
9
+ const dotenv = await import('dotenv');
10
+ const path = await import('path');
11
+ const { fileURLToPath } = await import('url');
12
+ const fs = await import('fs');
13
+ // Get the directory of the current script
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = path.dirname(__filename);
16
+ // Check if .env file exists
17
+ const envPath = path.join(__dirname, '.env');
18
+ if (fs.existsSync(envPath)) {
19
+ // Load .env from the script directory
20
+ const result = dotenv.config({ path: envPath });
21
+ console.log(`✓ .env file found and loaded from: ${envPath}`);
22
+ // Debug: Check if dotenv actually loaded the variables
23
+ if (result.error) {
24
+ console.log(`✗ Error loading .env file: ${result.error}`);
25
+ }
26
+ else {
27
+ console.log(`✓ dotenv.config() successful`);
28
+ console.log(`✓ MCP_API_TOKEN after loading: ${process.env.MCP_API_TOKEN ? 'SET' : 'NOT SET'}`);
29
+ if (process.env.MCP_API_TOKEN) {
30
+ console.log(`✓ MCP_API_TOKEN value: ${process.env.MCP_API_TOKEN.substring(0, 8)}...`);
31
+ }
32
+ }
33
+ }
34
+ else {
35
+ console.log(`✗ .env file not found at: ${envPath}`);
36
+ }
37
+ }
38
+ catch (error) {
39
+ // dotenv not available, continue without it
40
+ console.log('dotenv not available, using environment variables directly');
41
+ }
42
+ // Import modules dynamically after dotenv is loaded
43
+ console.log('🔄 Starting module imports...');
44
+ let StreamableHTTPServerTransport, express, initializeServer, serverConfig, loadSSLConfig, validateConfig, https, createRequire, require, cors, rateLimit;
45
+ try {
46
+ console.log('🔄 Importing StreamableHTTPServerTransport...');
47
+ ({ StreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/streamableHttp.js"));
48
+ console.log('✅ StreamableHTTPServerTransport imported');
49
+ console.log('🔄 Importing express...');
50
+ express = (await import('express')).default;
51
+ console.log('✅ Express imported');
52
+ console.log('🔄 Importing server.js...');
53
+ ({ initializeServer } = await import('./server.js'));
54
+ console.log('✅ server.js imported');
55
+ console.log('🔄 Importing server.config.js...');
56
+ ({ serverConfig, loadSSLConfig, validateConfig } = await import('./config/server.config.js'));
57
+ console.log('✅ server.config.js imported');
58
+ console.log('🔍 serverConfig.http.auth.token:', serverConfig.http.auth.token ? 'SET' : 'NOT SET');
59
+ console.log('🔄 Importing https...');
60
+ https = await import('https');
61
+ console.log('✅ https imported');
62
+ ({ createRequire } = await import('module'));
63
+ require = createRequire(import.meta.url);
64
+ cors = require('cors');
65
+ rateLimit = require('express-rate-limit');
66
+ console.log('✅ All modules imported successfully');
67
+ }
68
+ catch (importError) {
69
+ console.error('❌ Error importing modules:', importError);
70
+ process.exit(1);
71
+ }
72
+ let server;
73
+ // ==================== EXPRESS SERVER SETUP ====================
74
+ console.log('🔄 Setting up Express server...');
75
+ const app = express();
76
+ app.use(express.json());
77
+ console.log('✅ Express JSON middleware enabled');
78
+ // Apply CORS if enabled
79
+ if (serverConfig.http.cors.enabled) {
80
+ console.log('🔄 Setting up CORS middleware...');
81
+ app.use(cors({
82
+ origin: serverConfig.http.cors.origins,
83
+ credentials: serverConfig.http.cors.credentials
84
+ }));
85
+ console.log('✅ CORS middleware enabled for origins:', serverConfig.http.cors.origins);
86
+ }
87
+ else {
88
+ console.log('ℹ️ CORS disabled');
89
+ }
90
+ // Apply rate limiting if enabled
91
+ if (serverConfig.security.rateLimit.enabled) {
92
+ console.log('🔄 Setting up rate limiting middleware...');
93
+ const limiter = rateLimit({
94
+ windowMs: serverConfig.security.rateLimit.windowMs,
95
+ max: serverConfig.security.rateLimit.max,
96
+ message: 'Too many requests from this IP, please try again later.'
97
+ });
98
+ app.use('/mcp', limiter);
99
+ console.log('✅ Rate limiting enabled:', serverConfig.security.rateLimit.max, 'requests per', serverConfig.security.rateLimit.windowMs, 'ms');
100
+ }
101
+ else {
102
+ console.log('ℹ️ Rate limiting disabled');
103
+ }
104
+ // IP filtering middleware
105
+ if (serverConfig.security.ipFilter.enabled) {
106
+ console.log('🔄 Setting up IP filtering middleware...');
107
+ app.use((req, res, next) => {
108
+ const clientIp = req.ip || req.connection.remoteAddress;
109
+ console.log('🔍 IP filter check for:', clientIp);
110
+ // Check whitelist
111
+ if (serverConfig.security.ipFilter.whitelist.length > 0) {
112
+ if (!serverConfig.security.ipFilter.whitelist.includes(clientIp)) {
113
+ console.log('❌ IP not whitelisted:', clientIp);
114
+ return res.status(403).json({
115
+ jsonrpc: '2.0',
116
+ error: {
117
+ code: -32003,
118
+ message: 'Forbidden: IP not whitelisted',
119
+ },
120
+ id: null,
121
+ });
122
+ }
123
+ console.log('✅ IP whitelisted:', clientIp);
124
+ }
125
+ // Check blacklist
126
+ if (serverConfig.security.ipFilter.blacklist.includes(clientIp)) {
127
+ console.log('❌ IP blacklisted:', clientIp);
128
+ return res.status(403).json({
129
+ jsonrpc: '2.0',
130
+ error: {
131
+ code: -32003,
132
+ message: 'Forbidden: IP blacklisted',
133
+ },
134
+ id: null,
135
+ });
136
+ }
137
+ next();
138
+ });
139
+ console.log('✅ IP filtering enabled. Whitelist:', serverConfig.security.ipFilter.whitelist, 'Blacklist:', serverConfig.security.ipFilter.blacklist);
140
+ }
141
+ else {
142
+ console.log('ℹ️ IP filtering disabled');
143
+ }
144
+ // Authentication middleware
145
+ function authenticate(req, res, next) {
146
+ console.log('🔍 Authentication check started');
147
+ console.log('🔍 Auth enabled:', serverConfig.http.auth.enabled);
148
+ console.log('🔍 Auth type:', serverConfig.http.auth.type);
149
+ if (!serverConfig.http.auth.enabled) {
150
+ console.log('ℹ️ Authentication disabled, skipping');
151
+ return next();
152
+ }
153
+ let token;
154
+ if (serverConfig.http.auth.type === 'bearer') {
155
+ const authHeader = req.headers['authorization'];
156
+ console.log('🔍 Authorization header:', authHeader ? `${authHeader.substring(0, 20)}...` : 'NOT SET');
157
+ if (authHeader && authHeader.startsWith('Bearer ')) {
158
+ token = authHeader.replace('Bearer ', '');
159
+ console.log('🔍 Bearer token extracted:', token ? `${token.substring(0, 8)}...` : 'NOT FOUND');
160
+ }
161
+ }
162
+ else if (serverConfig.http.auth.type === 'api-key') {
163
+ token = req.headers['x-api-key'] || req.query.apiKey;
164
+ console.log('🔍 API key token:', token ? `${token.substring(0, 8)}...` : 'NOT FOUND');
165
+ }
166
+ // Fallback to body token for backward compatibility
167
+ token = token || req.body?.token;
168
+ console.log('🔍 Final token (after fallback):', token ? `${token.substring(0, 8)}...` : 'NOT FOUND');
169
+ console.log('🔍 Expected token:', serverConfig.http.auth.token ? `${serverConfig.http.auth.token.substring(0, 8)}...` : 'NOT SET');
170
+ if (token !== serverConfig.http.auth.token) {
171
+ console.log('❌ Authentication failed: token mismatch');
172
+ return res.status(401).json({
173
+ jsonrpc: '2.0',
174
+ error: {
175
+ code: -32001,
176
+ message: 'Unauthorized: Invalid or missing token',
177
+ },
178
+ id: null,
179
+ });
180
+ }
181
+ console.log('✅ Authentication successful');
182
+ next();
183
+ }
184
+ app.post('/mcp', authenticate, async (req, res) => {
185
+ console.log('📨 Received POST MCP request');
186
+ console.log('🔍 Request body size:', JSON.stringify(req.body).length, 'bytes');
187
+ console.log('🔍 Request headers:', Object.keys(req.headers));
188
+ try {
189
+ console.log('🔄 Creating StreamableHTTPServerTransport...');
190
+ const transport = new StreamableHTTPServerTransport({
191
+ sessionIdGenerator: undefined,
192
+ });
193
+ res.on('close', () => {
194
+ console.log('📪 Request closed');
195
+ transport.close();
196
+ server.close();
197
+ });
198
+ console.log('🔄 Connecting server to transport...');
199
+ await server.connect(transport);
200
+ console.log('✅ Server connected to transport');
201
+ console.log('🔄 Handling request...');
202
+ await transport.handleRequest(req, res, req.body);
203
+ console.log('✅ Request handled successfully');
204
+ }
205
+ catch (error) {
206
+ console.error('❌ Error handling MCP request:', error);
207
+ console.error('❌ Error stack:', error.stack);
208
+ if (!res.headersSent) {
209
+ res.status(500).json({
210
+ jsonrpc: '2.0',
211
+ error: {
212
+ code: -32603,
213
+ message: 'Internal server error',
214
+ },
215
+ id: null,
216
+ });
217
+ }
218
+ }
219
+ });
220
+ app.get('/mcp', async (req, res) => {
221
+ console.log('📨 Received GET MCP request (not allowed)');
222
+ res.writeHead(405).end(JSON.stringify({
223
+ jsonrpc: "2.0",
224
+ error: {
225
+ code: -32000,
226
+ message: "Method not allowed."
227
+ },
228
+ id: null
229
+ }));
230
+ });
231
+ app.delete('/mcp', async (req, res) => {
232
+ console.log('📨 Received DELETE MCP request (not allowed)');
233
+ res.writeHead(405).end(JSON.stringify({
234
+ jsonrpc: "2.0",
235
+ error: {
236
+ code: -32000,
237
+ message: "Method not allowed."
238
+ },
239
+ id: null
240
+ }));
241
+ });
242
+ // Health check endpoint
243
+ app.get('/health', (req, res) => {
244
+ res.json({
245
+ status: 'ok',
246
+ service: 'WinCC OA MCP Server',
247
+ version: '3.0.0',
248
+ timestamp: new Date().toISOString()
249
+ });
250
+ });
251
+ // Initialize and start the server
252
+ async function start() {
253
+ // Validate configuration
254
+ const configErrors = validateConfig();
255
+ if (configErrors.length > 0) {
256
+ console.error('Configuration errors:');
257
+ configErrors.forEach(error => console.error(` - ${error}`));
258
+ process.exit(1);
259
+ }
260
+ server = await initializeServer();
261
+ const { host, port } = serverConfig.http;
262
+ // Create HTTP or HTTPS server
263
+ let httpServer;
264
+ if (serverConfig.http.ssl.enabled) {
265
+ const sslConfig = loadSSLConfig();
266
+ if (!sslConfig) {
267
+ console.error('SSL is enabled but certificates could not be loaded');
268
+ process.exit(1);
269
+ }
270
+ httpServer = https.createServer(sslConfig, app);
271
+ }
272
+ else {
273
+ httpServer = app;
274
+ }
275
+ httpServer.listen(port, host, () => {
276
+ const protocol = serverConfig.http.ssl.enabled ? 'https' : 'http';
277
+ console.log(`MCP Extended WinCC OA Server with CNS/UNS`);
278
+ console.log(`Server listening on ${protocol}://${host}:${port}`);
279
+ console.log(`Health check: ${protocol}://${host}:${port}/health`);
280
+ if (serverConfig.http.auth.enabled) {
281
+ console.log(`Authentication: ${serverConfig.http.auth.type}`);
282
+ if (serverConfig.http.auth.token) {
283
+ console.log(`API Token: ${serverConfig.http.auth.token.substring(0, 8)}... (first 8 chars shown)`);
284
+ }
285
+ }
286
+ else {
287
+ console.log('⚠️ WARNING: Authentication is disabled!');
288
+ }
289
+ if (serverConfig.http.cors.enabled) {
290
+ console.log('CORS enabled for:', serverConfig.http.cors.origins);
291
+ }
292
+ });
293
+ }
294
+ start().catch((error) => {
295
+ console.error("Failed to start server:", error);
296
+ process.exit(1);
297
+ });
298
+ export {};
299
+ //# sourceMappingURL=index_http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index_http.js","sourceRoot":"","sources":["../src/index_http.js"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,yDAAyD;AACzD,yDAAyD;AACzD,wDAAwD;AACxD,yDAAyD;AACzD,yDAAyD;AAGzD,0DAA0D;AAC1D,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAE9B,0CAA0C;IAC1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3C,4BAA4B;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,sCAAsC;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QAE7D,uDAAuD;QACvD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YAC/F,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,4CAA4C;IAC5C,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;AAC5E,CAAC;AAED,oDAAoD;AACpD,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;AAC7C,IAAI,6BAA6B,EAAE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC;AAE1J,IAAI,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,CAAC,EAAE,6BAA6B,EAAE,GAAG,MAAM,MAAM,CAAC,oDAAoD,CAAC,CAAC,CAAC;IACzG,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAExD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,CAAC,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAElG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAEhC,CAAC,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7C,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvB,SAAS,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;AACrD,CAAC;AAAC,OAAO,WAAW,EAAE,CAAC;IACrB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,WAAW,CAAC,CAAC;IACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,MAAM,CAAC;AAEX,iEAAiE;AAEjE,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AACtB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACxB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AAEjD,wBAAwB;AACxB,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QACX,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;QACtC,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW;KAChD,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACxF,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACnC,CAAC;AAED,iCAAiC;AACjC,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,SAAS,CAAC;QACxB,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ;QAClD,GAAG,EAAE,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG;QACxC,OAAO,EAAE,yDAAyD;KACnE,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC/I,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC5C,CAAC;AAED,0BAA0B;AAC1B,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACxD,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;QAEjD,kBAAkB;QAClB,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;gBAC/C,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACL,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,+BAA+B;qBACzC;oBACD,EAAE,EAAE,IAAI;iBACT,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAED,kBAAkB;QAClB,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC,KAAK;oBACZ,OAAO,EAAE,2BAA2B;iBACrC;gBACD,EAAE,EAAE,IAAI;aACT,CAAC,CAAC;QACL,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACtJ,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAC3C,CAAC;AAED,4BAA4B;AAC5B,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI;IAClC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,KAAK,CAAC;IAEV,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACtG,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnD,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;SAAM,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACrD,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACxF,CAAC;IAED,oDAAoD;IACpD,KAAK,GAAG,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEnI,IAAI,KAAK,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAC1B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,IAAI,EAAE,CAAC,KAAK;gBACZ,OAAO,EAAE,wCAAwC;aAClD;YACD,EAAE,EAAE,IAAI;SACT,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,IAAI,EAAE,CAAC;AACT,CAAC;AAED,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAChD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;YAClD,kBAAkB,EAAE,SAAS;SAC9B,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE/C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAEhD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC,KAAK;oBACZ,OAAO,EAAE,uBAAuB;iBACjC;gBACD,EAAE,EAAE,IAAI;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACjC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;QACpC,OAAO,EAAE,KAAK;QACd,KAAK,EAAE;YACL,IAAI,EAAE,CAAC,KAAK;YACZ,OAAO,EAAE,qBAAqB;SAC/B;QACD,EAAE,EAAE,IAAI;KACT,CAAC,CAAC,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACpC,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;QACpC,OAAO,EAAE,KAAK;QACd,KAAK,EAAE;YACL,IAAI,EAAE,CAAC,KAAK;YACZ,OAAO,EAAE,qBAAqB;SAC/B;QACD,EAAE,EAAE,IAAI;KACT,CAAC,CAAC,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,wBAAwB;AACxB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC9B,GAAG,CAAC,IAAI,CAAC;QACP,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kCAAkC;AAClC,KAAK,UAAU,KAAK;IAClB,yBAAyB;IACzB,MAAM,YAAY,GAAG,cAAc,EAAE,CAAC;IACtC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACvC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAElC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC;IAEzC,8BAA8B;IAC9B,IAAI,UAAU,CAAC;IACf,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,GAAG,CAAC;IACnB,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;QACjC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,MAAM,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC;QAElE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,mBAAmB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9D,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,cAAc,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,2BAA2B,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACtB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index_stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index_stdio.d.ts","sourceRoot":"","sources":["../src/index_stdio.js"],"names":[],"mappings":""}