@qodalis/cli-server-node 1.0.0-beta.4 → 1.0.0-beta.5
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 +145 -23
- package/dist/src/abstractions/index.d.ts +1 -1
- package/dist/src/abstractions/index.d.ts.map +1 -1
- package/dist/src/abstractions/index.js +4 -1
- package/dist/src/abstractions/index.js.map +1 -1
- package/dist/src/controllers/cli-controller.d.ts +6 -0
- package/dist/src/controllers/cli-controller.d.ts.map +1 -1
- package/dist/src/controllers/cli-controller.js +71 -1
- package/dist/src/controllers/cli-controller.js.map +1 -1
- package/dist/src/controllers/cli-version-controller.d.ts +4 -0
- package/dist/src/controllers/cli-version-controller.d.ts.map +1 -1
- package/dist/src/controllers/cli-version-controller.js +11 -3
- package/dist/src/controllers/cli-version-controller.js.map +1 -1
- package/dist/src/controllers/filesystem-controller.d.ts.map +1 -1
- package/dist/src/controllers/filesystem-controller.js +51 -7
- package/dist/src/controllers/filesystem-controller.js.map +1 -1
- package/dist/src/create-cli-server.d.ts +31 -4
- package/dist/src/create-cli-server.d.ts.map +1 -1
- package/dist/src/create-cli-server.js +18 -11
- package/dist/src/create-cli-server.js.map +1 -1
- package/dist/src/extensions/cli-builder.d.ts +19 -1
- package/dist/src/extensions/cli-builder.d.ts.map +1 -1
- package/dist/src/extensions/cli-builder.js +26 -0
- package/dist/src/extensions/cli-builder.js.map +1 -1
- package/dist/src/filesystem/filesystem-options.d.ts +1 -0
- package/dist/src/filesystem/filesystem-options.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/models/cli-server-command-descriptor.d.ts +2 -1
- package/dist/src/models/cli-server-command-descriptor.d.ts.map +1 -1
- package/dist/src/models/cli-server-output.d.ts +1 -22
- package/dist/src/models/cli-server-output.d.ts.map +1 -1
- package/dist/src/models/cli-server-response.d.ts +1 -5
- package/dist/src/models/cli-server-response.d.ts.map +1 -1
- package/dist/src/processors/cli-base64-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-base64-command-processor.d.ts.map +1 -1
- package/dist/src/processors/cli-base64-command-processor.js +3 -0
- package/dist/src/processors/cli-base64-command-processor.js.map +1 -1
- package/dist/src/processors/cli-echo-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-echo-command-processor.d.ts.map +1 -1
- package/dist/src/processors/cli-echo-command-processor.js +1 -0
- package/dist/src/processors/cli-echo-command-processor.js.map +1 -1
- package/dist/src/processors/cli-hash-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-hash-command-processor.d.ts.map +1 -1
- package/dist/src/processors/cli-hash-command-processor.js +1 -0
- package/dist/src/processors/cli-hash-command-processor.js.map +1 -1
- package/dist/src/processors/cli-http-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-http-command-processor.d.ts.map +1 -1
- package/dist/src/processors/cli-http-command-processor.js +85 -6
- package/dist/src/processors/cli-http-command-processor.js.map +1 -1
- package/dist/src/processors/cli-status-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-status-command-processor.d.ts.map +1 -1
- package/dist/src/processors/cli-status-command-processor.js +1 -0
- package/dist/src/processors/cli-status-command-processor.js.map +1 -1
- package/dist/src/processors/cli-system-command-processor.d.ts +1 -0
- package/dist/src/processors/cli-system-command-processor.d.ts.map +1 -1
- package/dist/src/processors/cli-system-command-processor.js +1 -0
- package/dist/src/processors/cli-system-command-processor.js.map +1 -1
- package/dist/src/server.js +8 -6
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/cli-command-executor-service.d.ts +24 -3
- package/dist/src/services/cli-command-executor-service.d.ts.map +1 -1
- package/dist/src/services/cli-command-executor-service.js +35 -3
- package/dist/src/services/cli-command-executor-service.js.map +1 -1
- package/dist/src/services/cli-command-registry.d.ts +11 -0
- package/dist/src/services/cli-command-registry.d.ts.map +1 -1
- package/dist/src/services/cli-command-registry.js +5 -0
- package/dist/src/services/cli-command-registry.js.map +1 -1
- package/dist/src/services/cli-event-socket-manager.d.ts +6 -0
- package/dist/src/services/cli-event-socket-manager.d.ts.map +1 -1
- package/dist/src/services/cli-event-socket-manager.js +16 -2
- package/dist/src/services/cli-event-socket-manager.js.map +1 -1
- package/dist/src/services/cli-log-socket-manager.d.ts +2 -0
- package/dist/src/services/cli-log-socket-manager.d.ts.map +1 -1
- package/dist/src/services/cli-log-socket-manager.js +7 -0
- package/dist/src/services/cli-log-socket-manager.js.map +1 -1
- package/dist/src/services/cli-response-builder.d.ts +9 -0
- package/dist/src/services/cli-response-builder.d.ts.map +1 -1
- package/dist/src/services/cli-response-builder.js +1 -0
- package/dist/src/services/cli-response-builder.js.map +1 -1
- package/dist/src/services/cli-shell-session-manager.d.ts +11 -0
- package/dist/src/services/cli-shell-session-manager.d.ts.map +1 -1
- package/dist/src/services/cli-shell-session-manager.js +36 -5
- package/dist/src/services/cli-shell-session-manager.js.map +1 -1
- package/dist/src/utils/logger.d.ts +11 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +13 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/package.json +12 -3
- package/dist/src/controllers/cli-controller-v2.d.ts +0 -4
- package/dist/src/controllers/cli-controller-v2.d.ts.map +0 -1
- package/dist/src/controllers/cli-controller-v2.js +0 -46
- package/dist/src/controllers/cli-controller-v2.js.map +0 -1
|
@@ -3,19 +3,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CliHttpCommandProcessor = void 0;
|
|
4
4
|
const cli_command_processor_1 = require("../abstractions/cli-command-processor");
|
|
5
5
|
const cli_command_parameter_descriptor_1 = require("../abstractions/cli-command-parameter-descriptor");
|
|
6
|
+
/** Sub-processor that performs HTTP GET requests. */
|
|
6
7
|
class HttpGetProcessor extends cli_command_processor_1.CliCommandProcessor {
|
|
7
8
|
command = 'get';
|
|
8
9
|
description = 'Performs an HTTP GET request';
|
|
9
10
|
parameters = [
|
|
10
11
|
new cli_command_parameter_descriptor_1.CliCommandParameterDescriptor('headers', 'Show response headers', false, 'boolean'),
|
|
11
12
|
];
|
|
12
|
-
async handleAsync(command) {
|
|
13
|
+
async handleAsync(command, signal) {
|
|
13
14
|
const url = command.value;
|
|
14
15
|
if (!url)
|
|
15
16
|
return 'Usage: http get <url>';
|
|
16
|
-
return doRequest(url, 'GET', undefined, 'headers' in (command.args ?? {}));
|
|
17
|
+
return doRequest(url, 'GET', undefined, 'headers' in (command.args ?? {}), signal);
|
|
18
|
+
}
|
|
19
|
+
async handleStreamAsync(command, emit, signal) {
|
|
20
|
+
const url = command.value;
|
|
21
|
+
if (!url) {
|
|
22
|
+
emit({ type: 'text', value: 'Usage: http get <url>' });
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
25
|
+
return doStreamRequest(url, 'GET', undefined, 'headers' in (command.args ?? {}), emit, signal);
|
|
17
26
|
}
|
|
18
27
|
}
|
|
28
|
+
/** Sub-processor that performs HTTP POST requests. */
|
|
19
29
|
class HttpPostProcessor extends cli_command_processor_1.CliCommandProcessor {
|
|
20
30
|
command = 'post';
|
|
21
31
|
description = 'Performs an HTTP POST request';
|
|
@@ -23,21 +33,42 @@ class HttpPostProcessor extends cli_command_processor_1.CliCommandProcessor {
|
|
|
23
33
|
new cli_command_parameter_descriptor_1.CliCommandParameterDescriptor('body', 'Request body (JSON string)', false, 'string', ['-b']),
|
|
24
34
|
new cli_command_parameter_descriptor_1.CliCommandParameterDescriptor('headers', 'Show response headers', false, 'boolean'),
|
|
25
35
|
];
|
|
26
|
-
async handleAsync(command) {
|
|
36
|
+
async handleAsync(command, signal) {
|
|
27
37
|
const url = command.value;
|
|
28
38
|
if (!url)
|
|
29
39
|
return "Usage: http post <url> --body '{\"key\":\"value\"}'";
|
|
30
40
|
const body = command.args?.body;
|
|
31
|
-
return doRequest(url, 'POST', body, 'headers' in (command.args ?? {}));
|
|
41
|
+
return doRequest(url, 'POST', body, 'headers' in (command.args ?? {}), signal);
|
|
42
|
+
}
|
|
43
|
+
async handleStreamAsync(command, emit, signal) {
|
|
44
|
+
const url = command.value;
|
|
45
|
+
if (!url) {
|
|
46
|
+
emit({ type: 'text', value: "Usage: http post <url> --body '{\"key\":\"value\"}'" });
|
|
47
|
+
return 1;
|
|
48
|
+
}
|
|
49
|
+
const body = command.args?.body;
|
|
50
|
+
return doStreamRequest(url, 'POST', body, 'headers' in (command.args ?? {}), emit, signal);
|
|
32
51
|
}
|
|
33
52
|
}
|
|
34
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Executes an HTTP request and formats the response as a human-readable string.
|
|
55
|
+
* @param url - Target URL.
|
|
56
|
+
* @param method - HTTP method (GET, POST, etc.).
|
|
57
|
+
* @param body - Optional JSON request body.
|
|
58
|
+
* @param showHeaders - Whether to include response headers in output.
|
|
59
|
+
* @returns Formatted response string (truncated to 5000 chars).
|
|
60
|
+
*/
|
|
61
|
+
async function doRequest(url, method, body, showHeaders, signal) {
|
|
35
62
|
try {
|
|
63
|
+
const timeoutSignal = AbortSignal.timeout(30000);
|
|
64
|
+
const combinedSignal = signal
|
|
65
|
+
? AbortSignal.any([signal, timeoutSignal])
|
|
66
|
+
: timeoutSignal;
|
|
36
67
|
const init = {
|
|
37
68
|
method,
|
|
38
69
|
headers: body ? { 'Content-Type': 'application/json' } : undefined,
|
|
39
70
|
body: body ?? undefined,
|
|
40
|
-
signal:
|
|
71
|
+
signal: combinedSignal,
|
|
41
72
|
};
|
|
42
73
|
const resp = await fetch(url, init);
|
|
43
74
|
const contentType = resp.headers.get('content-type') ?? 'unknown';
|
|
@@ -66,6 +97,54 @@ async function doRequest(url, method, body, showHeaders) {
|
|
|
66
97
|
return `Error: ${err.message ?? err}`;
|
|
67
98
|
}
|
|
68
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Executes an HTTP request and emits output incrementally via the `emit` callback.
|
|
102
|
+
* @param url - Target URL.
|
|
103
|
+
* @param method - HTTP method (GET, POST, etc.).
|
|
104
|
+
* @param body - Optional JSON request body.
|
|
105
|
+
* @param showHeaders - Whether to include response headers in output.
|
|
106
|
+
* @param emit - Callback to send a single output chunk.
|
|
107
|
+
* @returns Exit code (0 for success, 1 for error).
|
|
108
|
+
*/
|
|
109
|
+
async function doStreamRequest(url, method, body, showHeaders, emit, signal) {
|
|
110
|
+
try {
|
|
111
|
+
emit({ type: 'text', value: `Fetching ${method} ${url}...`, style: 'info' });
|
|
112
|
+
const timeoutSignal = AbortSignal.timeout(30000);
|
|
113
|
+
const combinedSignal = signal
|
|
114
|
+
? AbortSignal.any([signal, timeoutSignal])
|
|
115
|
+
: timeoutSignal;
|
|
116
|
+
const init = {
|
|
117
|
+
method,
|
|
118
|
+
headers: body ? { 'Content-Type': 'application/json' } : undefined,
|
|
119
|
+
body: body ?? undefined,
|
|
120
|
+
signal: combinedSignal,
|
|
121
|
+
};
|
|
122
|
+
const resp = await fetch(url, init);
|
|
123
|
+
const contentType = resp.headers.get('content-type') ?? 'unknown';
|
|
124
|
+
emit({ type: 'text', value: `Status: ${resp.status}` });
|
|
125
|
+
emit({ type: 'text', value: `Content-Type: ${contentType}` });
|
|
126
|
+
if (showHeaders) {
|
|
127
|
+
emit({ type: 'text', value: 'Headers:' });
|
|
128
|
+
resp.headers.forEach((value, key) => {
|
|
129
|
+
emit({ type: 'text', value: ` ${key}: ${value}` });
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
let respBody = await resp.text();
|
|
133
|
+
if (contentType.includes('json')) {
|
|
134
|
+
try {
|
|
135
|
+
respBody = JSON.stringify(JSON.parse(respBody), null, 2);
|
|
136
|
+
}
|
|
137
|
+
catch { /* keep raw */ }
|
|
138
|
+
}
|
|
139
|
+
emit({ type: 'text', value: respBody.substring(0, 5000) });
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
emit({ type: 'text', value: `Error: ${err.message ?? err}`, style: 'error' });
|
|
144
|
+
return 1;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Command processor for server-side HTTP requests with `get` and `post` sub-commands. */
|
|
69
148
|
class CliHttpCommandProcessor extends cli_command_processor_1.CliCommandProcessor {
|
|
70
149
|
command = 'http';
|
|
71
150
|
description = 'Makes HTTP requests from the server';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-http-command-processor.js","sourceRoot":"","sources":["../../../src/processors/cli-http-command-processor.ts"],"names":[],"mappings":";;;AAAA,iFAA4E;AAC5E,uGAAiG;
|
|
1
|
+
{"version":3,"file":"cli-http-command-processor.js","sourceRoot":"","sources":["../../../src/processors/cli-http-command-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CliCommandProcessor, CliProcessCommand } from '../abstractions';
|
|
2
|
+
/** Command processor that reports server status including uptime, OS, and Node.js version. */
|
|
2
3
|
export declare class CliStatusCommandProcessor extends CliCommandProcessor {
|
|
3
4
|
command: string;
|
|
4
5
|
description: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-status-command-processor.d.ts","sourceRoot":"","sources":["../../../src/processors/cli-status-command-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzE,qBAAa,yBAA0B,SAAQ,mBAAmB;IAC9D,OAAO,SAAY;IACnB,WAAW,SAAqC;IAE1C,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAIlE"}
|
|
1
|
+
{"version":3,"file":"cli-status-command-processor.d.ts","sourceRoot":"","sources":["../../../src/processors/cli-status-command-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzE,8FAA8F;AAC9F,qBAAa,yBAA0B,SAAQ,mBAAmB;IAC9D,OAAO,SAAY;IACnB,WAAW,SAAqC;IAE1C,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAIlE"}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.CliStatusCommandProcessor = void 0;
|
|
7
7
|
const abstractions_1 = require("../abstractions");
|
|
8
8
|
const os_1 = __importDefault(require("os"));
|
|
9
|
+
/** Command processor that reports server status including uptime, OS, and Node.js version. */
|
|
9
10
|
class CliStatusCommandProcessor extends abstractions_1.CliCommandProcessor {
|
|
10
11
|
command = 'status';
|
|
11
12
|
description = 'Shows server status information';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-status-command-processor.js","sourceRoot":"","sources":["../../../src/processors/cli-status-command-processor.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAyE;AACzE,4CAAoB;AAEpB,MAAa,yBAA0B,SAAQ,kCAAmB;IAC9D,OAAO,GAAG,QAAQ,CAAC;IACnB,WAAW,GAAG,iCAAiC,CAAC;IAEhD,KAAK,CAAC,WAAW,CAAC,QAA2B;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5C,OAAO,4BAA4B,MAAM,UAAU,YAAE,CAAC,IAAI,EAAE,IAAI,YAAE,CAAC,OAAO,EAAE,WAAW,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7G,CAAC;CACJ;AARD,8DAQC"}
|
|
1
|
+
{"version":3,"file":"cli-status-command-processor.js","sourceRoot":"","sources":["../../../src/processors/cli-status-command-processor.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAyE;AACzE,4CAAoB;AAEpB,8FAA8F;AAC9F,MAAa,yBAA0B,SAAQ,kCAAmB;IAC9D,OAAO,GAAG,QAAQ,CAAC;IACnB,WAAW,GAAG,iCAAiC,CAAC;IAEhD,KAAK,CAAC,WAAW,CAAC,QAA2B;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5C,OAAO,4BAA4B,MAAM,UAAU,YAAE,CAAC,IAAI,EAAE,IAAI,YAAE,CAAC,OAAO,EAAE,WAAW,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7G,CAAC;CACJ;AARD,8DAQC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CliCommandProcessor } from '../abstractions/cli-command-processor';
|
|
2
2
|
import { CliProcessCommand } from '../abstractions/cli-process-command';
|
|
3
|
+
/** Command processor that displays detailed system information (hostname, OS, CPU, memory, uptime). */
|
|
3
4
|
export declare class CliSystemCommandProcessor extends CliCommandProcessor {
|
|
4
5
|
command: string;
|
|
5
6
|
description: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-system-command-processor.d.ts","sourceRoot":"","sources":["../../../src/processors/cli-system-command-processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAIxE,qBAAa,yBAA0B,SAAQ,mBAAmB;IAC9D,OAAO,SAAY;IACnB,WAAW,SAAqC;IAE1C,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAoBjE"}
|
|
1
|
+
{"version":3,"file":"cli-system-command-processor.d.ts","sourceRoot":"","sources":["../../../src/processors/cli-system-command-processor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAIxE,uGAAuG;AACvG,qBAAa,yBAA0B,SAAQ,mBAAmB;IAC9D,OAAO,SAAY;IACnB,WAAW,SAAqC;IAE1C,WAAW,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAoBjE"}
|
|
@@ -7,6 +7,7 @@ exports.CliSystemCommandProcessor = void 0;
|
|
|
7
7
|
const os_1 = __importDefault(require("os"));
|
|
8
8
|
const cli_command_processor_1 = require("../abstractions/cli-command-processor");
|
|
9
9
|
const startTime = Date.now();
|
|
10
|
+
/** Command processor that displays detailed system information (hostname, OS, CPU, memory, uptime). */
|
|
10
11
|
class CliSystemCommandProcessor extends cli_command_processor_1.CliCommandProcessor {
|
|
11
12
|
command = 'system';
|
|
12
13
|
description = 'Shows server system information';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-system-command-processor.js","sourceRoot":"","sources":["../../../src/processors/cli-system-command-processor.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,iFAA4E;AAG5E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7B,MAAa,yBAA0B,SAAQ,2CAAmB;IAC9D,OAAO,GAAG,QAAQ,CAAC;IACnB,WAAW,GAAG,iCAAiC,CAAC;IAEhD,KAAK,CAAC,WAAW,CAAC,OAA0B;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,UAAU,GAAG,EAAE,CAAC;QAEhC,MAAM,QAAQ,GAAG,CAAC,YAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,CAAC,YAAE,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE/D,MAAM,KAAK,GAAG;YACV,kBAAkB,YAAE,CAAC,QAAQ,EAAE,EAAE;YACjC,kBAAkB,YAAE,CAAC,IAAI,EAAE,IAAI,YAAE,CAAC,OAAO,EAAE,EAAE;YAC7C,kBAAkB,YAAE,CAAC,IAAI,EAAE,EAAE;YAC7B,kBAAkB,YAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE;YACpC,kBAAkB,OAAO,cAAc,QAAQ,WAAW;YAC1D,kBAAkB,OAAO,CAAC,OAAO,EAAE;YACnC,kBAAkB,KAAK,KAAK,OAAO,KAAK,OAAO,GAAG;SACrD,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACJ;AAxBD,8DAwBC"}
|
|
1
|
+
{"version":3,"file":"cli-system-command-processor.js","sourceRoot":"","sources":["../../../src/processors/cli-system-command-processor.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,iFAA4E;AAG5E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7B,uGAAuG;AACvG,MAAa,yBAA0B,SAAQ,2CAAmB;IAC9D,OAAO,GAAG,QAAQ,CAAC;IACnB,WAAW,GAAG,iCAAiC,CAAC;IAEhD,KAAK,CAAC,WAAW,CAAC,OAA0B;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,UAAU,GAAG,EAAE,CAAC;QAEhC,MAAM,QAAQ,GAAG,CAAC,YAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,CAAC,YAAE,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE/D,MAAM,KAAK,GAAG;YACV,kBAAkB,YAAE,CAAC,QAAQ,EAAE,EAAE;YACjC,kBAAkB,YAAE,CAAC,IAAI,EAAE,IAAI,YAAE,CAAC,OAAO,EAAE,EAAE;YAC7C,kBAAkB,YAAE,CAAC,IAAI,EAAE,EAAE;YAC7B,kBAAkB,YAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE;YACpC,kBAAkB,OAAO,cAAc,QAAQ,WAAW;YAC1D,kBAAkB,OAAO,CAAC,OAAO,EAAE;YACnC,kBAAkB,KAAK,KAAK,OAAO,KAAK,OAAO,GAAG;SACrD,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACJ;AAxBD,8DAwBC"}
|
package/dist/src/server.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const create_cli_server_1 = require("./create-cli-server");
|
|
5
|
+
const logger_1 = require("./utils/logger");
|
|
6
|
+
const logger = (0, logger_1.createLogger)('Server');
|
|
5
7
|
const cli_echo_command_processor_1 = require("./processors/cli-echo-command-processor");
|
|
6
8
|
const cli_status_command_processor_1 = require("./processors/cli-status-command-processor");
|
|
7
9
|
const cli_system_command_processor_1 = require("./processors/cli-system-command-processor");
|
|
@@ -23,15 +25,15 @@ const { app, eventSocketManager } = (0, create_cli_server_1.createCliServer)({
|
|
|
23
25
|
},
|
|
24
26
|
});
|
|
25
27
|
const server = app.listen(port, () => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
logger.info(`CLI server (Node.js) listening on http://localhost:${port}`);
|
|
29
|
+
logger.info(` Commands: http://localhost:${port}/api/v1/qcli/commands`);
|
|
30
|
+
logger.info(` Execute: http://localhost:${port}/api/v1/qcli/execute`);
|
|
31
|
+
logger.info(` Capabilities: http://localhost:${port}/api/v1/qcli/capabilities`);
|
|
32
|
+
logger.info(` Events: ws://localhost:${port}/ws/v1/qcli/events`);
|
|
31
33
|
});
|
|
32
34
|
eventSocketManager.attach(server);
|
|
33
35
|
process.on('SIGINT', async () => {
|
|
34
|
-
|
|
36
|
+
logger.info('Shutting down...');
|
|
35
37
|
await eventSocketManager.broadcastDisconnect();
|
|
36
38
|
server.close();
|
|
37
39
|
process.exit(0);
|
package/dist/src/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";;;AAEA,2DAAsD;AACtD,wFAAkF;AAClF,4FAAsF;AACtF,4FAAsF;AACtF,wFAAkF;AAClF,wFAAkF;AAClF,4FAAsF;AACtF,kFAAmE;AAEnE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;AAEtC,MAAM,EAAE,GAAG,EAAE,kBAAkB,EAAE,GAAG,IAAA,mCAAe,EAAC;IAChD,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;QACnB,OAAO;aACF,YAAY,CAAC,IAAI,oDAAuB,EAAE,CAAC;aAC3C,YAAY,CAAC,IAAI,wDAAyB,EAAE,CAAC;aAC7C,YAAY,CAAC,IAAI,wDAAyB,EAAE,CAAC;aAC7C,YAAY,CAAC,IAAI,oDAAuB,EAAE,CAAC;aAC3C,YAAY,CAAC,IAAI,oDAAuB,EAAE,CAAC;aAC3C,YAAY,CAAC,IAAI,wDAAyB,EAAE,CAAC;aAC7C,SAAS,CAAC,IAAI,yCAAa,EAAE,CAAC,CAAC;IACxC,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACjC,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";;;AAEA,2DAAsD;AACtD,2CAA8C;AAE9C,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,QAAQ,CAAC,CAAC;AACtC,wFAAkF;AAClF,4FAAsF;AACtF,4FAAsF;AACtF,wFAAkF;AAClF,wFAAkF;AAClF,4FAAsF;AACtF,kFAAmE;AAEnE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;AAEtC,MAAM,EAAE,GAAG,EAAE,kBAAkB,EAAE,GAAG,IAAA,mCAAe,EAAC;IAChD,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;QACnB,OAAO;aACF,YAAY,CAAC,IAAI,oDAAuB,EAAE,CAAC;aAC3C,YAAY,CAAC,IAAI,wDAAyB,EAAE,CAAC;aAC7C,YAAY,CAAC,IAAI,wDAAyB,EAAE,CAAC;aAC7C,YAAY,CAAC,IAAI,oDAAuB,EAAE,CAAC;aAC3C,YAAY,CAAC,IAAI,oDAAuB,EAAE,CAAC;aAC3C,YAAY,CAAC,IAAI,wDAAyB,EAAE,CAAC;aAC7C,SAAS,CAAC,IAAI,yCAAa,EAAE,CAAC,CAAC;IACxC,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACjC,MAAM,CAAC,IAAI,CAAC,sDAAsD,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,CAAC,IAAI,CAAC,oCAAoC,IAAI,uBAAuB,CAAC,CAAC;IAC7E,MAAM,CAAC,IAAI,CAAC,oCAAoC,IAAI,sBAAsB,CAAC,CAAC;IAC5E,MAAM,CAAC,IAAI,CAAC,oCAAoC,IAAI,2BAA2B,CAAC,CAAC;IACjF,MAAM,CAAC,IAAI,CAAC,kCAAkC,IAAI,oBAAoB,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC;AAEH,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAElC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;IAC5B,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAChC,MAAM,kBAAkB,CAAC,mBAAmB,EAAE,CAAC;IAC/C,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;IAC7B,MAAM,kBAAkB,CAAC,mBAAmB,EAAE,CAAC;IAC/C,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
|
@@ -1,12 +1,33 @@
|
|
|
1
|
-
import { CliProcessCommand } from '../abstractions';
|
|
1
|
+
import { CliProcessCommand, ICliCommandProcessor, ICliProcessorFilter } from '../abstractions';
|
|
2
2
|
import { CliServerResponse } from '../models';
|
|
3
3
|
import { ICliCommandRegistry } from './cli-command-registry';
|
|
4
|
+
/** Service contract for executing parsed CLI commands. */
|
|
4
5
|
export interface ICliCommandExecutorService {
|
|
5
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Executes a parsed command by routing it to the appropriate processor.
|
|
8
|
+
* @param command - Parsed command to execute.
|
|
9
|
+
* @param signal - Optional AbortSignal to cancel the operation.
|
|
10
|
+
* @returns Structured response with exit code and outputs.
|
|
11
|
+
*/
|
|
12
|
+
executeAsync(command: CliProcessCommand, signal?: AbortSignal): Promise<CliServerResponse>;
|
|
13
|
+
/**
|
|
14
|
+
* Adds a processor filter that can block command execution at runtime.
|
|
15
|
+
* @param filter - The filter to add.
|
|
16
|
+
*/
|
|
17
|
+
addFilter(filter: ICliProcessorFilter): void;
|
|
18
|
+
/**
|
|
19
|
+
* Returns true if any registered filter blocks the given processor.
|
|
20
|
+
* @param processor - The processor to check.
|
|
21
|
+
*/
|
|
22
|
+
isBlocked(processor: ICliCommandProcessor): boolean;
|
|
6
23
|
}
|
|
24
|
+
/** Default executor that resolves processors from the registry and delegates command handling. */
|
|
7
25
|
export declare class CliCommandExecutorService implements ICliCommandExecutorService {
|
|
8
26
|
private readonly _registry;
|
|
27
|
+
private readonly _filters;
|
|
9
28
|
constructor(_registry: ICliCommandRegistry);
|
|
10
|
-
|
|
29
|
+
addFilter(filter: ICliProcessorFilter): void;
|
|
30
|
+
isBlocked(processor: ICliCommandProcessor): boolean;
|
|
31
|
+
executeAsync(command: CliProcessCommand, signal?: AbortSignal): Promise<CliServerResponse>;
|
|
11
32
|
}
|
|
12
33
|
//# sourceMappingURL=cli-command-executor-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-command-executor-service.d.ts","sourceRoot":"","sources":["../../../src/services/cli-command-executor-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-command-executor-service.d.ts","sourceRoot":"","sources":["../../../src/services/cli-command-executor-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAK7D,0DAA0D;AAC1D,MAAM,WAAW,0BAA0B;IACvC;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE3F;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE7C;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,oBAAoB,GAAG,OAAO,CAAC;CACvD;AAED,kGAAkG;AAClG,qBAAa,yBAA0B,YAAW,0BAA0B;IAG5D,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;gBAEzB,SAAS,EAAE,mBAAmB;IAE3D,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAI5C,SAAS,CAAC,SAAS,EAAE,oBAAoB,GAAG,OAAO;IAI7C,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA8DnG"}
|
|
@@ -1,12 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CliCommandExecutorService = void 0;
|
|
4
|
+
const logger_1 = require("../utils/logger");
|
|
5
|
+
const logger = (0, logger_1.createLogger)('CommandExecutor');
|
|
6
|
+
/** Default executor that resolves processors from the registry and delegates command handling. */
|
|
4
7
|
class CliCommandExecutorService {
|
|
5
8
|
_registry;
|
|
9
|
+
_filters = [];
|
|
6
10
|
constructor(_registry) {
|
|
7
11
|
this._registry = _registry;
|
|
8
12
|
}
|
|
9
|
-
|
|
13
|
+
addFilter(filter) {
|
|
14
|
+
this._filters.push(filter);
|
|
15
|
+
}
|
|
16
|
+
isBlocked(processor) {
|
|
17
|
+
return this._filters.some(f => !f.isAllowed(processor));
|
|
18
|
+
}
|
|
19
|
+
async executeAsync(command, signal) {
|
|
20
|
+
logger.debug('Executing command: %s', command.command);
|
|
10
21
|
const processor = this._registry.findProcessor(command.command, command.chainCommands?.length ? command.chainCommands : undefined);
|
|
11
22
|
if (!processor) {
|
|
12
23
|
return {
|
|
@@ -20,14 +31,35 @@ class CliCommandExecutorService {
|
|
|
20
31
|
],
|
|
21
32
|
};
|
|
22
33
|
}
|
|
23
|
-
|
|
24
|
-
|
|
34
|
+
if (this.isBlocked(processor)) {
|
|
35
|
+
logger.warn('Command blocked by filter (plugin disabled): %s', command.command);
|
|
25
36
|
return {
|
|
37
|
+
exitCode: 1,
|
|
38
|
+
outputs: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text',
|
|
41
|
+
value: `Command '${command.command}' is currently disabled.`,
|
|
42
|
+
style: 'error',
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
if (processor.handleStructuredAsync) {
|
|
49
|
+
const response = await processor.handleStructuredAsync(command, signal);
|
|
50
|
+
logger.debug('Command completed: %s (exitCode=%d)', command.command, response.exitCode);
|
|
51
|
+
return response;
|
|
52
|
+
}
|
|
53
|
+
const result = await processor.handleAsync(command, signal);
|
|
54
|
+
const response = {
|
|
26
55
|
exitCode: 0,
|
|
27
56
|
outputs: [{ type: 'text', value: result }],
|
|
28
57
|
};
|
|
58
|
+
logger.debug('Command completed: %s (exitCode=%d)', command.command, response.exitCode);
|
|
59
|
+
return response;
|
|
29
60
|
}
|
|
30
61
|
catch (err) {
|
|
62
|
+
logger.error('Command execution failed: %s - %s', command.command, err.message ?? err);
|
|
31
63
|
return {
|
|
32
64
|
exitCode: 1,
|
|
33
65
|
outputs: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-command-executor-service.js","sourceRoot":"","sources":["../../../src/services/cli-command-executor-service.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"cli-command-executor-service.js","sourceRoot":"","sources":["../../../src/services/cli-command-executor-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
import { ICliCommandProcessor } from '../abstractions';
|
|
2
|
+
/** Registry that stores and looks up CLI command processors by command name. */
|
|
2
3
|
export interface ICliCommandRegistry {
|
|
4
|
+
/** All registered top-level processors. */
|
|
3
5
|
readonly processors: ReadonlyArray<ICliCommandProcessor>;
|
|
6
|
+
/** Registers a command processor. */
|
|
4
7
|
register(processor: ICliCommandProcessor): void;
|
|
8
|
+
/**
|
|
9
|
+
* Finds a processor by command name, optionally resolving a sub-command chain.
|
|
10
|
+
* @param command - Top-level command name.
|
|
11
|
+
* @param chainCommands - Optional sub-command chain to resolve.
|
|
12
|
+
* @returns Matching processor, or undefined if not found.
|
|
13
|
+
*/
|
|
5
14
|
findProcessor(command: string, chainCommands?: string[]): ICliCommandProcessor | undefined;
|
|
6
15
|
}
|
|
16
|
+
/** Default in-memory implementation of {@link ICliCommandRegistry}. */
|
|
7
17
|
export declare class CliCommandRegistry implements ICliCommandRegistry {
|
|
8
18
|
private _processors;
|
|
9
19
|
get processors(): ReadonlyArray<ICliCommandProcessor>;
|
|
10
20
|
register(processor: ICliCommandProcessor): void;
|
|
11
21
|
findProcessor(command: string, chainCommands?: string[]): ICliCommandProcessor | undefined;
|
|
22
|
+
/** Walks the sub-processor tree to resolve a chain of sub-commands. */
|
|
12
23
|
private resolveChain;
|
|
13
24
|
}
|
|
14
25
|
//# sourceMappingURL=cli-command-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-command-registry.d.ts","sourceRoot":"","sources":["../../../src/services/cli-command-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-command-registry.d.ts","sourceRoot":"","sources":["../../../src/services/cli-command-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAKvD,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAChC,2CAA2C;IAC3C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACzD,qCAAqC;IACrC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAChD;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,oBAAoB,GAAG,SAAS,CAAC;CAC9F;AAED,uEAAuE;AACvE,qBAAa,kBAAmB,YAAW,mBAAmB;IAC1D,OAAO,CAAC,WAAW,CAAgD;IAEnE,IAAI,UAAU,IAAI,aAAa,CAAC,oBAAoB,CAAC,CAEpD;IAED,QAAQ,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI;IAK/C,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,oBAAoB,GAAG,SAAS;IAS1F,uEAAuE;IACvE,OAAO,CAAC,YAAY;CAkBvB"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CliCommandRegistry = void 0;
|
|
4
|
+
const logger_1 = require("../utils/logger");
|
|
5
|
+
const logger = (0, logger_1.createLogger)('CommandRegistry');
|
|
6
|
+
/** Default in-memory implementation of {@link ICliCommandRegistry}. */
|
|
4
7
|
class CliCommandRegistry {
|
|
5
8
|
_processors = new Map();
|
|
6
9
|
get processors() {
|
|
@@ -8,6 +11,7 @@ class CliCommandRegistry {
|
|
|
8
11
|
}
|
|
9
12
|
register(processor) {
|
|
10
13
|
this._processors.set(processor.command.toLowerCase(), processor);
|
|
14
|
+
logger.debug('Registered processor: %s', processor.command);
|
|
11
15
|
}
|
|
12
16
|
findProcessor(command, chainCommands) {
|
|
13
17
|
const processor = this._processors.get(command.toLowerCase());
|
|
@@ -16,6 +20,7 @@ class CliCommandRegistry {
|
|
|
16
20
|
}
|
|
17
21
|
return this.resolveChain(processor, chainCommands);
|
|
18
22
|
}
|
|
23
|
+
/** Walks the sub-processor tree to resolve a chain of sub-commands. */
|
|
19
24
|
resolveChain(processor, chainCommands) {
|
|
20
25
|
let current = processor;
|
|
21
26
|
for (const sub of chainCommands) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-command-registry.js","sourceRoot":"","sources":["../../../src/services/cli-command-registry.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"cli-command-registry.js","sourceRoot":"","sources":["../../../src/services/cli-command-registry.ts"],"names":[],"mappings":";;;AACA,4CAA+C;AAE/C,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,iBAAiB,CAAC,CAAC;AAiB/C,uEAAuE;AACvE,MAAa,kBAAkB;IACnB,WAAW,GAAsC,IAAI,GAAG,EAAE,CAAC;IAEnE,IAAI,UAAU;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,QAAQ,CAAC,SAA+B;QACpC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,aAAa,CAAC,OAAe,EAAE,aAAwB;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,SAAS,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;YACvC,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACvD,CAAC;IAED,uEAAuE;IAC/D,YAAY,CAChB,SAA+B,EAC/B,aAAuB;QAEvB,IAAI,OAAO,GAAG,SAAS,CAAC;QAExB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CACvD,CAAC;YACF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,CAAC;YACD,OAAO,GAAG,KAAK,CAAC;QACpB,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ;AAxCD,gDAwCC"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import type { Server } from 'http';
|
|
2
|
+
/** Information about a connected WebSocket event client. */
|
|
2
3
|
export interface CliWebSocketClientInfo {
|
|
3
4
|
id: string;
|
|
4
5
|
connectedAt: string;
|
|
5
6
|
remoteAddress: string;
|
|
6
7
|
type: 'events';
|
|
7
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Manages WebSocket connections for server-push events and interactive shell sessions.
|
|
11
|
+
* Handles upgrades on `/ws/v1/qcli/events` and `/ws/v1/qcli/shell` paths.
|
|
12
|
+
*/
|
|
8
13
|
export declare class CliEventSocketManager {
|
|
9
14
|
private _wss;
|
|
10
15
|
private readonly _clients;
|
|
@@ -30,6 +35,7 @@ export declare class CliEventSocketManager {
|
|
|
30
35
|
* Return information about all currently connected event clients.
|
|
31
36
|
*/
|
|
32
37
|
getClients(): CliWebSocketClientInfo[];
|
|
38
|
+
/** Terminates all connections and closes the WebSocket server. */
|
|
33
39
|
dispose(): void;
|
|
34
40
|
}
|
|
35
41
|
//# sourceMappingURL=cli-event-socket-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-event-socket-manager.d.ts","sourceRoot":"","sources":["../../../src/services/cli-event-socket-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-event-socket-manager.d.ts","sourceRoot":"","sources":["../../../src/services/cli-event-socket-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,MAAM,CAAC;AAOpD,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,QAAQ,CAAC;CAClB;AAQD;;;GAGG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqC;IACjE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgC;IAC9D,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAGhC;IAEH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAGhC;IAEH;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IA8D5B;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IASxD;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB1C;;OAEG;IACH,UAAU,IAAI,sBAAsB,EAAE;IAkBtC,kEAAkE;IAClE,OAAO,IAAI,IAAI;CAQlB"}
|
|
@@ -4,6 +4,12 @@ exports.CliEventSocketManager = void 0;
|
|
|
4
4
|
const ws_1 = require("ws");
|
|
5
5
|
const url_1 = require("url");
|
|
6
6
|
const cli_shell_session_manager_1 = require("./cli-shell-session-manager");
|
|
7
|
+
const logger_1 = require("../utils/logger");
|
|
8
|
+
const logger = (0, logger_1.createLogger)('EventSocket');
|
|
9
|
+
/**
|
|
10
|
+
* Manages WebSocket connections for server-push events and interactive shell sessions.
|
|
11
|
+
* Handles upgrades on `/ws/v1/qcli/events` and `/ws/v1/qcli/shell` paths.
|
|
12
|
+
*/
|
|
7
13
|
class CliEventSocketManager {
|
|
8
14
|
_wss = null;
|
|
9
15
|
_clients = new Set();
|
|
@@ -50,21 +56,27 @@ class CliEventSocketManager {
|
|
|
50
56
|
});
|
|
51
57
|
return;
|
|
52
58
|
}
|
|
53
|
-
//
|
|
59
|
+
// Unrecognized path; leave for other upgrade handlers
|
|
54
60
|
});
|
|
55
61
|
this._wss.on('connection', (ws, request) => {
|
|
56
62
|
this._clients.add(ws);
|
|
63
|
+
const id = `evt-${this._nextClientId++}`;
|
|
57
64
|
this._clientMeta.set(ws, {
|
|
58
|
-
id
|
|
65
|
+
id,
|
|
59
66
|
connectedAt: new Date(),
|
|
60
67
|
remoteAddress: request.socket.remoteAddress ?? 'unknown',
|
|
61
68
|
});
|
|
69
|
+
logger.info('Client connected (id=%s)', id);
|
|
62
70
|
ws.send(JSON.stringify({ type: 'connected' }));
|
|
63
71
|
ws.on('close', () => {
|
|
72
|
+
const meta = this._clientMeta.get(ws);
|
|
73
|
+
logger.info('Client disconnected (id=%s)', meta?.id ?? 'unknown');
|
|
64
74
|
this._clients.delete(ws);
|
|
65
75
|
this._clientMeta.delete(ws);
|
|
66
76
|
});
|
|
67
77
|
ws.on('error', () => {
|
|
78
|
+
const meta = this._clientMeta.get(ws);
|
|
79
|
+
logger.info('Client disconnected (id=%s)', meta?.id ?? 'unknown');
|
|
68
80
|
this._clients.delete(ws);
|
|
69
81
|
this._clientMeta.delete(ws);
|
|
70
82
|
});
|
|
@@ -85,6 +97,7 @@ class CliEventSocketManager {
|
|
|
85
97
|
* Broadcast a disconnect event to all connected clients and close sockets.
|
|
86
98
|
*/
|
|
87
99
|
async broadcastDisconnect() {
|
|
100
|
+
logger.info('Broadcasting disconnect to %d clients', this._clients.size);
|
|
88
101
|
const message = JSON.stringify({ type: 'disconnect' });
|
|
89
102
|
const promises = [];
|
|
90
103
|
for (const ws of this._clients) {
|
|
@@ -121,6 +134,7 @@ class CliEventSocketManager {
|
|
|
121
134
|
}
|
|
122
135
|
return result;
|
|
123
136
|
}
|
|
137
|
+
/** Terminates all connections and closes the WebSocket server. */
|
|
124
138
|
dispose() {
|
|
125
139
|
for (const ws of this._clients) {
|
|
126
140
|
ws.terminate();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-event-socket-manager.js","sourceRoot":"","sources":["../../../src/services/cli-event-socket-manager.ts"],"names":[],"mappings":";;;AAAA,2BAAgD;AAEhD,6BAA0B;AAC1B,2EAAqE;
|
|
1
|
+
{"version":3,"file":"cli-event-socket-manager.js","sourceRoot":"","sources":["../../../src/services/cli-event-socket-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Server } from 'http';
|
|
2
|
+
/** Information about a connected WebSocket log-streaming client. */
|
|
2
3
|
export interface CliLogWebSocketClientInfo {
|
|
3
4
|
id: string;
|
|
4
5
|
connectedAt: string;
|
|
@@ -45,6 +46,7 @@ export declare class CliLogSocketManager {
|
|
|
45
46
|
* Return information about all currently connected log clients.
|
|
46
47
|
*/
|
|
47
48
|
getClients(): CliLogWebSocketClientInfo[];
|
|
49
|
+
/** Terminates all connections and closes the WebSocket server. */
|
|
48
50
|
dispose(): void;
|
|
49
51
|
private _handleConnection;
|
|
50
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-log-socket-manager.d.ts","sourceRoot":"","sources":["../../../src/services/cli-log-socket-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-log-socket-manager.d.ts","sourceRoot":"","sources":["../../../src/services/cli-log-socket-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,MAAM,CAAC;AAMpD,oEAAoE;AACpE,MAAM,WAAW,yBAAyB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CAChB;AAsCD;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC5B,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAG9B;IAEH;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAY3E;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAUzF;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgB5B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAsB5E;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB1C;;OAEG;IACH,UAAU,IAAI,yBAAyB,EAAE;IAgBzC,kEAAkE;IAClE,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,iBAAiB;CAyB5B"}
|
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CliLogSocketManager = void 0;
|
|
4
4
|
const ws_1 = require("ws");
|
|
5
5
|
const url_1 = require("url");
|
|
6
|
+
const logger_1 = require("../utils/logger");
|
|
7
|
+
const logger = (0, logger_1.createLogger)('LogSocket');
|
|
6
8
|
/**
|
|
7
9
|
* Level ordering from lowest to highest severity.
|
|
8
10
|
* Matches the Python/C# implementations.
|
|
@@ -115,6 +117,7 @@ class CliLogSocketManager {
|
|
|
115
117
|
* Send a disconnect message to all clients and close connections.
|
|
116
118
|
*/
|
|
117
119
|
async broadcastDisconnect() {
|
|
120
|
+
logger.info('Broadcasting disconnect to %d log clients', this._clients.size);
|
|
118
121
|
const disconnectMsg = JSON.stringify({ type: 'disconnect' });
|
|
119
122
|
const promises = [];
|
|
120
123
|
for (const entry of this._clients.values()) {
|
|
@@ -148,6 +151,7 @@ class CliLogSocketManager {
|
|
|
148
151
|
}
|
|
149
152
|
return result;
|
|
150
153
|
}
|
|
154
|
+
/** Terminates all connections and closes the WebSocket server. */
|
|
151
155
|
dispose() {
|
|
152
156
|
for (const entry of this._clients.values()) {
|
|
153
157
|
entry.ws.terminate();
|
|
@@ -166,10 +170,13 @@ class CliLogSocketManager {
|
|
|
166
170
|
};
|
|
167
171
|
this._clients.set(id, entry);
|
|
168
172
|
ws.send(JSON.stringify({ type: 'connected' }));
|
|
173
|
+
logger.info('Log client connected (id=%s, level=%s)', id, levelFilter ?? 'all');
|
|
169
174
|
ws.on('close', () => {
|
|
175
|
+
logger.info('Log client disconnected (id=%s)', id);
|
|
170
176
|
this._clients.delete(id);
|
|
171
177
|
});
|
|
172
178
|
ws.on('error', () => {
|
|
179
|
+
logger.info('Log client disconnected (id=%s)', id);
|
|
173
180
|
this._clients.delete(id);
|
|
174
181
|
});
|
|
175
182
|
}
|