mcard-js 2.1.25 → 2.1.26
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/dist/scripts/docker-startup.js +2 -2
- package/dist/scripts/docker-startup.js.map +1 -1
- package/dist/src/ptr/node/clm/builtins/server-scripts/websocket-server-worker.d.ts +8 -0
- package/dist/src/ptr/node/clm/builtins/server-scripts/websocket-server-worker.d.ts.map +1 -0
- package/dist/src/ptr/node/clm/builtins/server-scripts/websocket-server-worker.js +81 -0
- package/dist/src/ptr/node/clm/builtins/server-scripts/websocket-server-worker.js.map +1 -0
- package/dist/src/ptr/node/clm/builtins/static-server.d.ts +2 -2
- package/dist/src/ptr/node/clm/builtins/static-server.d.ts.map +1 -1
- package/dist/src/ptr/node/clm/builtins/static-server.js +81 -4
- package/dist/src/ptr/node/clm/builtins/static-server.js.map +1 -1
- package/dist/src/ptr/node/clm/builtins/websocket-server.d.ts +2 -3
- package/dist/src/ptr/node/clm/builtins/websocket-server.d.ts.map +1 -1
- package/dist/src/ptr/node/clm/builtins/websocket-server.js +71 -155
- package/dist/src/ptr/node/clm/builtins/websocket-server.js.map +1 -1
- package/dist/src/ptr/node/clm/index.d.ts +4 -4
- package/dist/src/ptr/node/clm/index.d.ts.map +1 -1
- package/dist/src/ptr/node/clm/index.js +4 -4
- package/dist/src/ptr/node/clm/index.js.map +1 -1
- package/dist/src/ptr/node/clm/operations/handle.d.ts +14 -0
- package/dist/src/ptr/node/clm/operations/handle.d.ts.map +1 -0
- package/dist/src/ptr/node/clm/operations/handle.js +177 -0
- package/dist/src/ptr/node/clm/operations/handle.js.map +1 -0
- package/dist/src/ptr/node/clm/operations/index.d.ts +28 -0
- package/dist/src/ptr/node/clm/operations/index.d.ts.map +1 -0
- package/dist/src/ptr/node/clm/operations/index.js +94 -0
- package/dist/src/ptr/node/clm/operations/index.js.map +1 -0
- package/dist/src/ptr/node/clm/operations/server-scripts/websocket-server-worker.d.ts +8 -0
- package/dist/src/ptr/node/clm/operations/server-scripts/websocket-server-worker.d.ts.map +1 -0
- package/dist/src/ptr/node/clm/operations/server-scripts/websocket-server-worker.js +81 -0
- package/dist/src/ptr/node/clm/operations/server-scripts/websocket-server-worker.js.map +1 -0
- package/dist/src/ptr/node/clm/operations/static-server.d.ts +35 -0
- package/dist/src/ptr/node/clm/operations/static-server.d.ts.map +1 -0
- package/dist/src/ptr/node/clm/operations/static-server.js +252 -0
- package/dist/src/ptr/node/clm/operations/static-server.js.map +1 -0
- package/dist/src/ptr/node/clm/operations/websocket-server.d.ts +35 -0
- package/dist/src/ptr/node/clm/operations/websocket-server.d.ts.map +1 -0
- package/dist/src/ptr/node/clm/operations/websocket-server.js +265 -0
- package/dist/src/ptr/node/clm/operations/websocket-server.js.map +1 -0
- package/dist/src/ptr/node/clm/runner.js +4 -4
- package/dist/src/ptr/node/clm/runner.js.map +1 -1
- package/dist/src/ptr/node/clm/utils.js +1 -1
- package/dist/src/ptr/node/clm/utils.js.map +1 -1
- package/package.json +4 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { executeStaticServer } from '../src/ptr/node/clm/
|
|
2
|
-
import { executeWebSocketServer } from '../src/ptr/node/clm/
|
|
1
|
+
import { executeStaticServer } from '../src/ptr/node/clm/operations/static-server.js';
|
|
2
|
+
import { executeWebSocketServer } from '../src/ptr/node/clm/operations/websocket-server.js';
|
|
3
3
|
async function main() {
|
|
4
4
|
console.log("🚀 Starting MCard Polyglot Services...");
|
|
5
5
|
// 1. Static Server
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-startup.js","sourceRoot":"","sources":["../../scripts/docker-startup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"docker-startup.js","sourceRoot":"","sources":["../../scripts/docker-startup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AACtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AAG5F,KAAK,UAAU,IAAI;IACf,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAEtD,mBAAmB;IACnB,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC;QAC3C,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,aAAa;KAC1B,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEtB,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,4BAA4B,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,eAAe,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,2BAA2B,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,sBAAsB;IACtB,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,kDAAkD;IAClD,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC;QAC1C,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,SAAS;KAClB,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEtB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,8BAA8B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAE5D,qBAAqB;IACrB,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone WebSocket Server Worker Script.
|
|
3
|
+
*
|
|
4
|
+
* This script is spawned by the WebSocket Server builtin to run the actual server process.
|
|
5
|
+
* It reads configuration from environment variables and uses the 'ws' library.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=websocket-server-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-server-worker.d.ts","sourceRoot":"","sources":["../../../../../../../src/ptr/node/clm/builtins/server-scripts/websocket-server-worker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone WebSocket Server Worker Script.
|
|
3
|
+
*
|
|
4
|
+
* This script is spawned by the WebSocket Server builtin to run the actual server process.
|
|
5
|
+
* It reads configuration from environment variables and uses the 'ws' library.
|
|
6
|
+
*/
|
|
7
|
+
import { WebSocketServer } from 'ws';
|
|
8
|
+
// Read configuration from environment variables
|
|
9
|
+
const PORT = parseInt(process.env.PORT || '8765', 10);
|
|
10
|
+
const HOST = process.env.HOST || 'localhost';
|
|
11
|
+
console.log(`Starting WebSocket Server on ${HOST}:${PORT}`);
|
|
12
|
+
try {
|
|
13
|
+
const wss = new WebSocketServer({ port: PORT, host: HOST });
|
|
14
|
+
wss.on('listening', () => {
|
|
15
|
+
console.log(`WebSocket CLM Execution Server running on ws://${HOST}:${PORT}/`);
|
|
16
|
+
});
|
|
17
|
+
wss.on('connection', (ws) => {
|
|
18
|
+
console.log('Client connected');
|
|
19
|
+
ws.on('message', (message) => {
|
|
20
|
+
try {
|
|
21
|
+
// Determine if message is Buffer or string
|
|
22
|
+
const msgStr = message.toString();
|
|
23
|
+
const data = JSON.parse(msgStr);
|
|
24
|
+
const msgId = data.messageId;
|
|
25
|
+
const type = data.type;
|
|
26
|
+
if (type === 'ping') {
|
|
27
|
+
ws.send(JSON.stringify({
|
|
28
|
+
messageId: msgId,
|
|
29
|
+
type: 'pong',
|
|
30
|
+
timestamp: data.timestamp
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
else if (type === 'clm_execute') {
|
|
34
|
+
// Stub for CLM execution in pure JS Node server
|
|
35
|
+
// In a real scenario, this would import the mcard-js library dynamically
|
|
36
|
+
console.log('Received CLM execution request');
|
|
37
|
+
ws.send(JSON.stringify({
|
|
38
|
+
messageId: msgId,
|
|
39
|
+
success: true,
|
|
40
|
+
result: { status: "simulated_success", output: "Node.js CLM Runner (Stub)" },
|
|
41
|
+
executionTime: 0,
|
|
42
|
+
logs: ["Executed on Node.js WebSocket Server"]
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// Echo
|
|
47
|
+
ws.send(JSON.stringify({
|
|
48
|
+
messageId: msgId,
|
|
49
|
+
type: 'echo',
|
|
50
|
+
original: msgStr
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
console.error('Error processing message:', e);
|
|
56
|
+
ws.send(JSON.stringify({ error: 'Invalid JSON or Internal Error: ' + e.toString() }));
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
wss.on('error', (e) => {
|
|
61
|
+
console.error('Server error:', e);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
});
|
|
64
|
+
// Handle graceful shutdown
|
|
65
|
+
const cleanup = () => {
|
|
66
|
+
console.log('Stopping WebSocket server...');
|
|
67
|
+
wss.close(() => {
|
|
68
|
+
console.log('WebSocket server stopped.');
|
|
69
|
+
process.exit(0);
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
process.on('SIGTERM', cleanup);
|
|
73
|
+
process.on('SIGINT', cleanup);
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
console.error('Failed to create server:', e);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
// Keep process alive if server is close
|
|
80
|
+
setInterval(() => { }, 1000);
|
|
81
|
+
//# sourceMappingURL=websocket-server-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-server-worker.js","sourceRoot":"","sources":["../../../../../../../src/ptr/node/clm/builtins/server-scripts/websocket-server-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Static Server builtin for CLM execution.
|
|
3
3
|
*
|
|
4
4
|
* Provides deploy, status, and stop actions for HTTP static file servers.
|
|
5
|
-
*
|
|
5
|
+
* Uses Node.js 'http' module.
|
|
6
6
|
*/
|
|
7
7
|
/**
|
|
8
8
|
* Configuration for static server builtin.
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
export interface StaticServerConfig {
|
|
11
11
|
action?: 'deploy' | 'status' | 'stop';
|
|
12
12
|
root_dir?: string;
|
|
13
|
-
port?: number;
|
|
13
|
+
port?: number | string;
|
|
14
14
|
host?: string;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-server.d.ts","sourceRoot":"","sources":["../../../../../../src/ptr/node/clm/builtins/static-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"static-server.d.ts","sourceRoot":"","sources":["../../../../../../src/ptr/node/clm/builtins/static-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,iBAAiB,CAAC;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAsCD;;GAEG;AACH,wBAAsB,mBAAmB,CACrC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,kBAAkB,CAAC,CA8N7B"}
|
|
@@ -2,11 +2,21 @@
|
|
|
2
2
|
* Static Server builtin for CLM execution.
|
|
3
3
|
*
|
|
4
4
|
* Provides deploy, status, and stop actions for HTTP static file servers.
|
|
5
|
-
*
|
|
5
|
+
* Uses Node.js 'http' module.
|
|
6
6
|
*/
|
|
7
7
|
import { execSync, spawn } from 'child_process';
|
|
8
8
|
import * as fs from 'fs';
|
|
9
9
|
import * as path from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Resolve environment variables in config values like '${VAR}'.
|
|
12
|
+
*/
|
|
13
|
+
function resolveConfigValue(val) {
|
|
14
|
+
if (typeof val === 'string' && val.startsWith('${') && val.endsWith('}')) {
|
|
15
|
+
const envVar = val.slice(2, -1);
|
|
16
|
+
return process.env[envVar] || val;
|
|
17
|
+
}
|
|
18
|
+
return val;
|
|
19
|
+
}
|
|
10
20
|
/**
|
|
11
21
|
* Check if a port is in use using lsof (handles both IPv4 and IPv6).
|
|
12
22
|
*/
|
|
@@ -37,7 +47,10 @@ function getPidOnPort(port) {
|
|
|
37
47
|
*/
|
|
38
48
|
export async function executeStaticServer(config, context, chapterDir) {
|
|
39
49
|
const action = context.action || config.action || 'status';
|
|
40
|
-
|
|
50
|
+
// Default to HTTP_PORT from .env matching the project configuration
|
|
51
|
+
const defaultPort = parseInt(process.env.HTTP_PORT || '8080', 10);
|
|
52
|
+
const rawPort = context.port || config.port || defaultPort;
|
|
53
|
+
const port = parseInt(String(resolveConfigValue(rawPort)), 10);
|
|
41
54
|
const host = context.host || config.host || 'localhost';
|
|
42
55
|
let rootDir = context.root_dir || config.root_dir || '.';
|
|
43
56
|
// Resolve root_dir - find project root by looking for package.json or .git
|
|
@@ -74,9 +87,73 @@ export async function executeStaticServer(config, context, chapterDir) {
|
|
|
74
87
|
if (!fs.existsSync(rootDir) || !fs.statSync(rootDir).isDirectory()) {
|
|
75
88
|
return { success: false, error: `Directory not found: ${rootDir}` };
|
|
76
89
|
}
|
|
90
|
+
// Node.js HTTP static server script
|
|
91
|
+
const serverCode = `
|
|
92
|
+
const http = require('http');
|
|
93
|
+
const fs = require('fs');
|
|
94
|
+
const path = require('path');
|
|
95
|
+
|
|
96
|
+
const port = ${port};
|
|
97
|
+
const host = '${host}';
|
|
98
|
+
const rootDir = '${rootDir.replace(/\\/g, '\\\\')}';
|
|
99
|
+
|
|
100
|
+
const mimeTypes = {
|
|
101
|
+
'.html': 'text/html',
|
|
102
|
+
'.js': 'text/javascript',
|
|
103
|
+
'.css': 'text/css',
|
|
104
|
+
'.json': 'application/json',
|
|
105
|
+
'.png': 'image/png',
|
|
106
|
+
'.jpg': 'image/jpg',
|
|
107
|
+
'.gif': 'image/gif',
|
|
108
|
+
'.svg': 'image/svg+xml',
|
|
109
|
+
'.wav': 'audio/wav',
|
|
110
|
+
'.mp4': 'video/mp4',
|
|
111
|
+
'.woff': 'application/font-woff',
|
|
112
|
+
'.ttf': 'application/font-ttf',
|
|
113
|
+
'.eot': 'application/vnd.ms-fontobject',
|
|
114
|
+
'.otf': 'application/font-otf',
|
|
115
|
+
'.wasm': 'application/wasm'
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const server = http.createServer((req, res) => {
|
|
119
|
+
let filePath = path.join(rootDir, req.url === '/' ? 'index.html' : req.url);
|
|
120
|
+
|
|
121
|
+
// Prevent directory traversal
|
|
122
|
+
if (!filePath.startsWith(rootDir)) {
|
|
123
|
+
res.writeHead(403);
|
|
124
|
+
res.end('Forbidden');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const extname = String(path.extname(filePath)).toLowerCase();
|
|
129
|
+
const contentType = mimeTypes[extname] || 'application/octet-stream';
|
|
130
|
+
|
|
131
|
+
fs.readFile(filePath, (error, content) => {
|
|
132
|
+
if (error) {
|
|
133
|
+
if(error.code == 'ENOENT') {
|
|
134
|
+
res.writeHead(404);
|
|
135
|
+
res.end('404 Not Found');
|
|
136
|
+
} else {
|
|
137
|
+
res.writeHead(500);
|
|
138
|
+
res.end('Sorry, check with the site admin for error: '+error.code+' ..\\n');
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
res.writeHead(200, { 'Content-Type': contentType });
|
|
142
|
+
res.end(content, 'utf-8');
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
server.listen(port, host, () => {
|
|
148
|
+
console.log('Server running at http://' + host + ':' + port + '/');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
// Keep process alive
|
|
152
|
+
setInterval(() => {}, 1000);
|
|
153
|
+
`;
|
|
77
154
|
try {
|
|
78
|
-
// Spawn
|
|
79
|
-
const child = spawn(
|
|
155
|
+
// Spawn Node.js server as detached background process
|
|
156
|
+
const child = spawn(process.execPath, ['-e', serverCode], {
|
|
80
157
|
detached: true,
|
|
81
158
|
stdio: 'ignore'
|
|
82
159
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-server.js","sourceRoot":"","sources":["../../../../../../src/ptr/node/clm/builtins/static-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AA4B7B;;GAEG;AACH,SAAS,WAAW,CAAC,IAAY;IAC7B,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACpG,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAC9B,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACpG,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACrC,MAA0B,EAC1B,OAA4B,EAC5B,UAAkB;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"static-server.js","sourceRoot":"","sources":["../../../../../../src/ptr/node/clm/builtins/static-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
* WebSocket Server builtin for CLM execution.
|
|
3
3
|
*
|
|
4
4
|
* Provides deploy, status, and stop actions for WebSocket servers.
|
|
5
|
-
* Uses
|
|
6
|
-
* Matches the Python implementation for cross-runtime consistency.
|
|
5
|
+
* Uses Node.js 'ws' library.
|
|
7
6
|
*/
|
|
8
7
|
/**
|
|
9
8
|
* Configuration for WebSocket server builtin.
|
|
10
9
|
*/
|
|
11
10
|
export interface WebSocketServerConfig {
|
|
12
11
|
action?: 'deploy' | 'status' | 'stop';
|
|
13
|
-
port?: number;
|
|
12
|
+
port?: number | string;
|
|
14
13
|
host?: string;
|
|
15
14
|
}
|
|
16
15
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-server.d.ts","sourceRoot":"","sources":["../../../../../../src/ptr/node/clm/builtins/websocket-server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"websocket-server.d.ts","sourceRoot":"","sources":["../../../../../../src/ptr/node/clm/builtins/websocket-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,iBAAiB,CAAC;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAsCD;;GAEG;AACH,wBAAsB,sBAAsB,CACxC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,CAAC,CAiPhC"}
|
|
@@ -2,12 +2,21 @@
|
|
|
2
2
|
* WebSocket Server builtin for CLM execution.
|
|
3
3
|
*
|
|
4
4
|
* Provides deploy, status, and stop actions for WebSocket servers.
|
|
5
|
-
* Uses
|
|
6
|
-
* Matches the Python implementation for cross-runtime consistency.
|
|
5
|
+
* Uses Node.js 'ws' library.
|
|
7
6
|
*/
|
|
8
7
|
import { execSync, spawn } from 'child_process';
|
|
9
8
|
import * as fs from 'fs';
|
|
10
9
|
import * as path from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Resolve environment variables in config values like '${VAR}'.
|
|
12
|
+
*/
|
|
13
|
+
function resolveConfigValue(val) {
|
|
14
|
+
if (typeof val === 'string' && val.startsWith('${') && val.endsWith('}')) {
|
|
15
|
+
const envVar = val.slice(2, -1);
|
|
16
|
+
return process.env[envVar] || val;
|
|
17
|
+
}
|
|
18
|
+
return val;
|
|
19
|
+
}
|
|
11
20
|
/**
|
|
12
21
|
* Check if a port is in use using lsof (handles both IPv4 and IPv6).
|
|
13
22
|
*/
|
|
@@ -38,7 +47,10 @@ function getPidOnPort(port) {
|
|
|
38
47
|
*/
|
|
39
48
|
export async function executeWebSocketServer(config, context, chapterDir) {
|
|
40
49
|
const action = context.action || config.action || 'status';
|
|
41
|
-
|
|
50
|
+
// Default to WS_PORT from .env matching the project configuration
|
|
51
|
+
const defaultPort = parseInt(process.env.WS_PORT || '8765', 10);
|
|
52
|
+
const rawPort = context.port || config.port || defaultPort;
|
|
53
|
+
const port = parseInt(String(resolveConfigValue(rawPort)), 10);
|
|
42
54
|
const host = context.host || config.host || 'localhost';
|
|
43
55
|
// Resolve project root
|
|
44
56
|
let projectRoot = chapterDir;
|
|
@@ -66,161 +78,65 @@ export async function executeWebSocketServer(config, context, chapterDir) {
|
|
|
66
78
|
status: 'already_running'
|
|
67
79
|
};
|
|
68
80
|
}
|
|
69
|
-
// Python WebSocket server script with CLM execution support
|
|
70
|
-
const wsServerCode = `
|
|
71
|
-
import asyncio
|
|
72
|
-
import json
|
|
73
|
-
import sys
|
|
74
|
-
import time
|
|
75
|
-
import yaml
|
|
76
|
-
|
|
77
|
-
try:
|
|
78
|
-
import websockets
|
|
79
|
-
except ImportError:
|
|
80
|
-
print("websockets module not found")
|
|
81
|
-
sys.exit(1)
|
|
82
|
-
|
|
83
|
-
# Import PTR components for CLM execution
|
|
84
|
-
try:
|
|
85
|
-
from mcard.ptr.clm.loader import CLMChapterLoader
|
|
86
|
-
except ImportError:
|
|
87
|
-
print("Warning: mcard.ptr not available, CLM execution disabled")
|
|
88
|
-
CLMChapterLoader = None
|
|
89
|
-
|
|
90
|
-
connected_clients = set()
|
|
91
|
-
|
|
92
|
-
async def execute_clm(clm_yaml, input_data):
|
|
93
|
-
"""Execute CLM code and return result"""
|
|
94
|
-
if not CLMChapterLoader:
|
|
95
|
-
return {"error": "CLM execution not available - mcard.ptr not installed"}
|
|
96
|
-
|
|
97
|
-
import tempfile
|
|
98
|
-
import os
|
|
99
|
-
|
|
100
|
-
try:
|
|
101
|
-
start_time = time.time()
|
|
102
|
-
|
|
103
|
-
# Parse YAML to get metadata
|
|
104
|
-
clm_data = yaml.safe_load(clm_yaml)
|
|
105
|
-
|
|
106
|
-
# Write YAML to temporary file
|
|
107
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
108
|
-
f.write(clm_yaml)
|
|
109
|
-
temp_path = f.name
|
|
110
|
-
|
|
111
|
-
try:
|
|
112
|
-
# Load chapter from YAML file
|
|
113
|
-
chapter = CLMChapterLoader.load_from_yaml(temp_path)
|
|
114
|
-
|
|
115
|
-
# Execute chapter's action directly with provided input
|
|
116
|
-
result, state, logs = chapter.action.execute(input_data, {})
|
|
117
|
-
|
|
118
|
-
execution_time = (time.time() - start_time) * 1000 # ms
|
|
119
|
-
|
|
120
|
-
return {
|
|
121
|
-
"success": True,
|
|
122
|
-
"result": result,
|
|
123
|
-
"executionTime": execution_time,
|
|
124
|
-
"chapter": clm_data.get("chapter", {}).get("title", "Unknown"),
|
|
125
|
-
"concept": clm_data.get("clm", {}).get("abstract", {}).get("concept", "Unknown"),
|
|
126
|
-
"logs": logs
|
|
127
|
-
}
|
|
128
|
-
finally:
|
|
129
|
-
# Clean up temp file
|
|
130
|
-
if os.path.exists(temp_path):
|
|
131
|
-
os.unlink(temp_path)
|
|
132
|
-
|
|
133
|
-
except Exception as e:
|
|
134
|
-
return {
|
|
135
|
-
"success": False,
|
|
136
|
-
"error": str(e),
|
|
137
|
-
"executionTime": 0
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
async def handler(websocket):
|
|
141
|
-
connected_clients.add(websocket)
|
|
142
|
-
try:
|
|
143
|
-
async for message in websocket:
|
|
144
|
-
try:
|
|
145
|
-
data = json.loads(message)
|
|
146
|
-
msg_type = data.get("type")
|
|
147
|
-
message_id = data.get("messageId")
|
|
148
|
-
|
|
149
|
-
if msg_type == "clm_execute":
|
|
150
|
-
# Execute CLM
|
|
151
|
-
clm_code = data.get("clm", "")
|
|
152
|
-
input_data = data.get("input", {})
|
|
153
|
-
|
|
154
|
-
result = await execute_clm(clm_code, input_data)
|
|
155
|
-
|
|
156
|
-
# Send response with same messageId
|
|
157
|
-
response = {
|
|
158
|
-
"messageId": message_id,
|
|
159
|
-
**result
|
|
160
|
-
}
|
|
161
|
-
await websocket.send(json.dumps(response))
|
|
162
|
-
|
|
163
|
-
elif msg_type == "ping":
|
|
164
|
-
# Respond to ping
|
|
165
|
-
await websocket.send(json.dumps({
|
|
166
|
-
"messageId": message_id,
|
|
167
|
-
"type": "pong",
|
|
168
|
-
"timestamp": data.get("timestamp")
|
|
169
|
-
}))
|
|
170
|
-
else:
|
|
171
|
-
# Echo unknown messages
|
|
172
|
-
response = json.dumps({
|
|
173
|
-
"messageId": message_id,
|
|
174
|
-
"type": "echo",
|
|
175
|
-
"original": message,
|
|
176
|
-
"clients": len(connected_clients)
|
|
177
|
-
})
|
|
178
|
-
await websocket.send(response)
|
|
179
|
-
|
|
180
|
-
except json.JSONDecodeError:
|
|
181
|
-
await websocket.send(json.dumps({
|
|
182
|
-
"error": "Invalid JSON"
|
|
183
|
-
}))
|
|
184
|
-
except Exception as e:
|
|
185
|
-
await websocket.send(json.dumps({
|
|
186
|
-
"error": str(e)
|
|
187
|
-
}))
|
|
188
|
-
|
|
189
|
-
except websockets.exceptions.ConnectionClosed:
|
|
190
|
-
pass
|
|
191
|
-
finally:
|
|
192
|
-
connected_clients.discard(websocket)
|
|
193
|
-
|
|
194
|
-
async def main():
|
|
195
|
-
async with websockets.serve(handler, "${host}", ${port}):
|
|
196
|
-
print("WebSocket CLM Execution Server running on ws://${host}:${port}/")
|
|
197
|
-
print("Ready to handle CLM execution requests")
|
|
198
|
-
await asyncio.Future()
|
|
199
|
-
|
|
200
|
-
if __name__ == "__main__":
|
|
201
|
-
try:
|
|
202
|
-
asyncio.run(main())
|
|
203
|
-
except KeyboardInterrupt:
|
|
204
|
-
pass
|
|
205
|
-
`;
|
|
206
81
|
try {
|
|
207
|
-
//
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
82
|
+
// Locate the worker script
|
|
83
|
+
// In development (src), it's in ./server-scripts/websocket-server-worker.ts
|
|
84
|
+
// In production (dist), it's in ./server-scripts/websocket-server-worker.js
|
|
85
|
+
// Current file is .../builtins/websocket-server.ts
|
|
86
|
+
const currentDir = path.dirname(new URL(import.meta.url).pathname);
|
|
87
|
+
// Construct path to worker script
|
|
88
|
+
// We look for .js first (production), then fallback (though .ts won't run directly without loader)
|
|
89
|
+
let workerScript = path.join(currentDir, 'server-scripts', 'websocket-server-worker.js');
|
|
90
|
+
// Verify if exists, otherwise try checking source location if running via tsx/ts-node (dev mode)
|
|
91
|
+
if (!fs.existsSync(workerScript)) {
|
|
92
|
+
// Try .ts for dev mode
|
|
93
|
+
const workerScriptTs = path.join(currentDir, 'server-scripts', 'websocket-server-worker.ts');
|
|
94
|
+
if (fs.existsSync(workerScriptTs)) {
|
|
95
|
+
workerScript = workerScriptTs;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
return { success: false, error: `Worker script not found: ${workerScript}` };
|
|
99
|
+
}
|
|
214
100
|
}
|
|
215
101
|
// Create log file for WebSocket server output
|
|
216
102
|
const logFile = path.join(projectRoot, `.websocket_server_${port}.log`);
|
|
217
103
|
// Open log file with file descriptor for stdio
|
|
218
104
|
const logFd = fs.openSync(logFile, 'a');
|
|
219
|
-
// Spawn
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
105
|
+
// Spawn Node.js WebSocket server as detached background process
|
|
106
|
+
// Passing environment variables for configuration
|
|
107
|
+
const env = { ...process.env, PORT: String(port), HOST: host };
|
|
108
|
+
// If running a .ts file (dev mode with tsx), we might need to use the loader
|
|
109
|
+
// But easiest way for now is to rely on compilation.
|
|
110
|
+
// If checking fails, we assume standard node execution on the resolved path.
|
|
111
|
+
// For tsx support (dev), we'd need to spawn with tsx if the extension is .ts
|
|
112
|
+
const isTs = workerScript.endsWith('.ts');
|
|
113
|
+
const execArgv = isTs && process.execArgv.includes('--loader') ? process.execArgv : [];
|
|
114
|
+
// Better: use process.execPath and let it handle it, or use 'tsx' if available?
|
|
115
|
+
// "spawn(process.execPath...)" runs 'node'. 'node file.ts' fails.
|
|
116
|
+
// We should rely on the build step having run, OR use tsx if we are in dev.
|
|
117
|
+
let child;
|
|
118
|
+
if (isTs) {
|
|
119
|
+
// Dev mode: assume tsx is available or we are in a ts-node env
|
|
120
|
+
// We'll try to use 'npx tsx' or similar if we really had to, but the requirement is "native implementation".
|
|
121
|
+
// Since we are compiling, we should target the .js file.
|
|
122
|
+
// However, the `demo:clm` command uses `tsx`.
|
|
123
|
+
// If we run `tsx examples/run-clm.ts`, we are in dev mode.
|
|
124
|
+
// We should assume proper environment.
|
|
125
|
+
// For robustness, let's try to detect if we should use tsx
|
|
126
|
+
child = spawn('npx', ['tsx', workerScript], {
|
|
127
|
+
detached: true,
|
|
128
|
+
stdio: ['ignore', logFd, logFd],
|
|
129
|
+
env
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Production mode: node running .js
|
|
134
|
+
child = spawn(process.execPath, [workerScript], {
|
|
135
|
+
detached: true,
|
|
136
|
+
stdio: ['ignore', logFd, logFd],
|
|
137
|
+
env
|
|
138
|
+
});
|
|
139
|
+
}
|
|
224
140
|
// Log any errors from the child process
|
|
225
141
|
child.on('error', (err) => {
|
|
226
142
|
console.error(`[WebSocket Server] Process error: ${err}`);
|
|
@@ -238,14 +154,14 @@ if __name__ == "__main__":
|
|
|
238
154
|
catch { }
|
|
239
155
|
});
|
|
240
156
|
child.unref();
|
|
241
|
-
// Close file descriptor in parent process
|
|
157
|
+
// Close file descriptor in parent process
|
|
242
158
|
try {
|
|
243
159
|
fs.closeSync(logFd);
|
|
244
160
|
}
|
|
245
161
|
catch { }
|
|
246
162
|
// Save PID
|
|
247
163
|
fs.writeFileSync(pidFile, String(child.pid));
|
|
248
|
-
// Wait for server to start
|
|
164
|
+
// Wait for server to start
|
|
249
165
|
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
250
166
|
if (isPortInUse(port)) {
|
|
251
167
|
console.log(`[WebSocket Server] Successfully started on port ${port}`);
|
|
@@ -270,7 +186,7 @@ if __name__ == "__main__":
|
|
|
270
186
|
success: false,
|
|
271
187
|
error: "Server started but not responding. Check log file for details.",
|
|
272
188
|
logFile,
|
|
273
|
-
details: errorDetails.slice(-500)
|
|
189
|
+
details: errorDetails.slice(-500)
|
|
274
190
|
};
|
|
275
191
|
}
|
|
276
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-server.js","sourceRoot":"","sources":["../../../../../../src/ptr/node/clm/builtins/websocket-server.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"websocket-server.js","sourceRoot":"","sources":["../../../../../../src/ptr/node/clm/builtins/websocket-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
*/
|
|
18
18
|
export type { CLMSpec, RuntimeConfig, CLMExample, ExecutionResult, RuntimeResult, MultiRuntimeResult, VerificationResult, RunExamplesSummary, ExampleRunResult, ExecutionReport, SummaryReport, CLMBannerLines, } from './types.js';
|
|
19
19
|
export { resultsEqual, asObject, buildBaseContext, buildExecutionResult, isRecursiveCLM, isMultiRuntime, } from './utils.js';
|
|
20
|
-
export { isNetworkBuiltin, isLoaderBuiltin, isHandleBuiltin, getHandleBuiltinType, isStaticServerBuiltin, isWebSocketServerBuiltin, } from './
|
|
21
|
-
export { executeHandleVersion, executeHandlePrune, } from './
|
|
22
|
-
export { executeStaticServer, type StaticServerConfig, type StaticServerResult, } from './
|
|
23
|
-
export { executeWebSocketServer, type WebSocketServerConfig, type WebSocketServerResult, } from './
|
|
20
|
+
export { isNetworkBuiltin, isLoaderBuiltin, isHandleBuiltin, getHandleBuiltinType, isStaticServerBuiltin, isWebSocketServerBuiltin, } from './operations/index.js';
|
|
21
|
+
export { executeHandleVersion, executeHandlePrune, } from './operations/handle.js';
|
|
22
|
+
export { executeStaticServer, type StaticServerConfig, type StaticServerResult, } from './operations/static-server.js';
|
|
23
|
+
export { executeWebSocketServer, type WebSocketServerConfig, type WebSocketServerResult, } from './operations/websocket-server.js';
|
|
24
24
|
export { CLMLoader } from './loader.js';
|
|
25
25
|
export { CLMRunner } from './runner.js';
|
|
26
26
|
export { executeMultiRuntime } from './multiruntime.js';
|