@qodalis/cli-server-node 1.0.0-beta.3 → 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 +32 -4
- package/dist/src/create-cli-server.d.ts.map +1 -1
- package/dist/src/create-cli-server.js +19 -11
- package/dist/src/create-cli-server.js.map +1 -1
- package/dist/src/extensions/cli-builder.d.ts +21 -1
- package/dist/src/extensions/cli-builder.d.ts.map +1 -1
- package/dist/src/extensions/cli-builder.js +31 -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 +4 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -5
- 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/processors/index.d.ts +0 -1
- package/dist/src/processors/index.d.ts.map +1 -1
- package/dist/src/processors/index.js +1 -3
- package/dist/src/processors/index.js.map +1 -1
- package/dist/src/server.js +8 -8
- 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 +18 -0
- package/dist/src/services/cli-event-socket-manager.d.ts.map +1 -1
- package/dist/src/services/cli-event-socket-manager.js +47 -2
- package/dist/src/services/cli-event-socket-manager.js.map +1 -1
- package/dist/src/services/cli-log-socket-manager.d.ts +53 -0
- package/dist/src/services/cli-log-socket-manager.d.ts.map +1 -0
- package/dist/src/services/cli-log-socket-manager.js +185 -0
- package/dist/src/services/cli-log-socket-manager.js.map +1 -0
- 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/services/index.d.ts +2 -1
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +3 -1
- package/dist/src/services/index.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
- package/dist/src/processors/cli-uuid-command-processor.d.ts +0 -10
- package/dist/src/processors/cli-uuid-command-processor.d.ts.map +0 -1
- package/dist/src/processors/cli-uuid-command-processor.js +0 -27
- package/dist/src/processors/cli-uuid-command-processor.js.map +0 -1
|
@@ -4,10 +4,18 @@ 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();
|
|
16
|
+
_clientMeta = new Map();
|
|
10
17
|
_shellManager = new cli_shell_session_manager_1.CliShellSessionManager();
|
|
18
|
+
_nextClientId = 1;
|
|
11
19
|
static EVENT_PATHS = new Set([
|
|
12
20
|
'/ws/v1/qcli/events',
|
|
13
21
|
'/ws/qcli/events',
|
|
@@ -48,16 +56,29 @@ class CliEventSocketManager {
|
|
|
48
56
|
});
|
|
49
57
|
return;
|
|
50
58
|
}
|
|
51
|
-
//
|
|
59
|
+
// Unrecognized path; leave for other upgrade handlers
|
|
52
60
|
});
|
|
53
|
-
this._wss.on('connection', (ws) => {
|
|
61
|
+
this._wss.on('connection', (ws, request) => {
|
|
54
62
|
this._clients.add(ws);
|
|
63
|
+
const id = `evt-${this._nextClientId++}`;
|
|
64
|
+
this._clientMeta.set(ws, {
|
|
65
|
+
id,
|
|
66
|
+
connectedAt: new Date(),
|
|
67
|
+
remoteAddress: request.socket.remoteAddress ?? 'unknown',
|
|
68
|
+
});
|
|
69
|
+
logger.info('Client connected (id=%s)', id);
|
|
55
70
|
ws.send(JSON.stringify({ type: 'connected' }));
|
|
56
71
|
ws.on('close', () => {
|
|
72
|
+
const meta = this._clientMeta.get(ws);
|
|
73
|
+
logger.info('Client disconnected (id=%s)', meta?.id ?? 'unknown');
|
|
57
74
|
this._clients.delete(ws);
|
|
75
|
+
this._clientMeta.delete(ws);
|
|
58
76
|
});
|
|
59
77
|
ws.on('error', () => {
|
|
78
|
+
const meta = this._clientMeta.get(ws);
|
|
79
|
+
logger.info('Client disconnected (id=%s)', meta?.id ?? 'unknown');
|
|
60
80
|
this._clients.delete(ws);
|
|
81
|
+
this._clientMeta.delete(ws);
|
|
61
82
|
});
|
|
62
83
|
});
|
|
63
84
|
}
|
|
@@ -76,6 +97,7 @@ class CliEventSocketManager {
|
|
|
76
97
|
* Broadcast a disconnect event to all connected clients and close sockets.
|
|
77
98
|
*/
|
|
78
99
|
async broadcastDisconnect() {
|
|
100
|
+
logger.info('Broadcasting disconnect to %d clients', this._clients.size);
|
|
79
101
|
const message = JSON.stringify({ type: 'disconnect' });
|
|
80
102
|
const promises = [];
|
|
81
103
|
for (const ws of this._clients) {
|
|
@@ -90,12 +112,35 @@ class CliEventSocketManager {
|
|
|
90
112
|
}
|
|
91
113
|
await Promise.all(promises);
|
|
92
114
|
this._clients.clear();
|
|
115
|
+
this._clientMeta.clear();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Return information about all currently connected event clients.
|
|
119
|
+
*/
|
|
120
|
+
getClients() {
|
|
121
|
+
const result = [];
|
|
122
|
+
for (const ws of this._clients) {
|
|
123
|
+
if (ws.readyState === ws_1.WebSocket.OPEN) {
|
|
124
|
+
const meta = this._clientMeta.get(ws);
|
|
125
|
+
if (meta) {
|
|
126
|
+
result.push({
|
|
127
|
+
id: meta.id,
|
|
128
|
+
connectedAt: meta.connectedAt.toISOString(),
|
|
129
|
+
remoteAddress: meta.remoteAddress,
|
|
130
|
+
type: 'events',
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
93
136
|
}
|
|
137
|
+
/** Terminates all connections and closes the WebSocket server. */
|
|
94
138
|
dispose() {
|
|
95
139
|
for (const ws of this._clients) {
|
|
96
140
|
ws.terminate();
|
|
97
141
|
}
|
|
98
142
|
this._clients.clear();
|
|
143
|
+
this._clientMeta.clear();
|
|
99
144
|
this._wss?.close();
|
|
100
145
|
}
|
|
101
146
|
}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Server } from 'http';
|
|
2
|
+
/** Information about a connected WebSocket log-streaming client. */
|
|
3
|
+
export interface CliLogWebSocketClientInfo {
|
|
4
|
+
id: string;
|
|
5
|
+
connectedAt: string;
|
|
6
|
+
remoteAddress: string;
|
|
7
|
+
levelFilter: string | null;
|
|
8
|
+
type: 'logs';
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Manages WebSocket connections for streaming log messages to clients.
|
|
12
|
+
*
|
|
13
|
+
* Parity with CliLogSocketManager in the .NET and Python servers.
|
|
14
|
+
* Handles `/ws/v1/qcli/logs` and `/ws/qcli/logs` upgrade paths.
|
|
15
|
+
*/
|
|
16
|
+
export declare class CliLogSocketManager {
|
|
17
|
+
private _wss;
|
|
18
|
+
private readonly _clients;
|
|
19
|
+
private _nextClientId;
|
|
20
|
+
private static readonly LOG_PATHS;
|
|
21
|
+
/**
|
|
22
|
+
* Check whether a log at `logLevel` passes the `filterLevel` gate.
|
|
23
|
+
*/
|
|
24
|
+
static shouldSendLog(filterLevel: string | null, logLevel: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Format a log message as a JSON string matching the cross-server schema.
|
|
27
|
+
*/
|
|
28
|
+
static formatLogMessage(level: string, message: string, category?: string | null): string;
|
|
29
|
+
/**
|
|
30
|
+
* Attach to an HTTP server and handle WebSocket upgrades on log paths.
|
|
31
|
+
*
|
|
32
|
+
* If you already have a `CliEventSocketManager` attached, call this
|
|
33
|
+
* method on the same `server` — Node's `upgrade` event supports
|
|
34
|
+
* multiple listeners, and each manager only handles its own paths.
|
|
35
|
+
*/
|
|
36
|
+
attach(server: Server): void;
|
|
37
|
+
/**
|
|
38
|
+
* Broadcast a log message to all connected clients whose filter allows it.
|
|
39
|
+
*/
|
|
40
|
+
broadcastLog(level: string, message: string, category?: string | null): void;
|
|
41
|
+
/**
|
|
42
|
+
* Send a disconnect message to all clients and close connections.
|
|
43
|
+
*/
|
|
44
|
+
broadcastDisconnect(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Return information about all currently connected log clients.
|
|
47
|
+
*/
|
|
48
|
+
getClients(): CliLogWebSocketClientInfo[];
|
|
49
|
+
/** Terminates all connections and closes the WebSocket server. */
|
|
50
|
+
dispose(): void;
|
|
51
|
+
private _handleConnection;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=cli-log-socket-manager.d.ts.map
|
|
@@ -0,0 +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;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"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CliLogSocketManager = void 0;
|
|
4
|
+
const ws_1 = require("ws");
|
|
5
|
+
const url_1 = require("url");
|
|
6
|
+
const logger_1 = require("../utils/logger");
|
|
7
|
+
const logger = (0, logger_1.createLogger)('LogSocket');
|
|
8
|
+
/**
|
|
9
|
+
* Level ordering from lowest to highest severity.
|
|
10
|
+
* Matches the Python/C# implementations.
|
|
11
|
+
*/
|
|
12
|
+
const LEVEL_ORDER = {
|
|
13
|
+
verbose: 0,
|
|
14
|
+
debug: 1,
|
|
15
|
+
information: 2,
|
|
16
|
+
warning: 3,
|
|
17
|
+
error: 4,
|
|
18
|
+
fatal: 5,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Maps short/uppercase log levels (used by LogRingBuffer) to the
|
|
22
|
+
* standard level names used across all three servers.
|
|
23
|
+
*/
|
|
24
|
+
const LEVEL_ALIASES = {
|
|
25
|
+
info: 'information',
|
|
26
|
+
warn: 'warning',
|
|
27
|
+
err: 'error',
|
|
28
|
+
};
|
|
29
|
+
function normalizeLevel(level) {
|
|
30
|
+
const lower = level.toLowerCase();
|
|
31
|
+
return LEVEL_ALIASES[lower] ?? lower;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Manages WebSocket connections for streaming log messages to clients.
|
|
35
|
+
*
|
|
36
|
+
* Parity with CliLogSocketManager in the .NET and Python servers.
|
|
37
|
+
* Handles `/ws/v1/qcli/logs` and `/ws/qcli/logs` upgrade paths.
|
|
38
|
+
*/
|
|
39
|
+
class CliLogSocketManager {
|
|
40
|
+
_wss = null;
|
|
41
|
+
_clients = new Map();
|
|
42
|
+
_nextClientId = 1;
|
|
43
|
+
static LOG_PATHS = new Set([
|
|
44
|
+
'/ws/v1/qcli/logs',
|
|
45
|
+
'/ws/qcli/logs',
|
|
46
|
+
]);
|
|
47
|
+
/**
|
|
48
|
+
* Check whether a log at `logLevel` passes the `filterLevel` gate.
|
|
49
|
+
*/
|
|
50
|
+
static shouldSendLog(filterLevel, logLevel) {
|
|
51
|
+
if (!filterLevel)
|
|
52
|
+
return true;
|
|
53
|
+
const filterOrd = LEVEL_ORDER[normalizeLevel(filterLevel)];
|
|
54
|
+
const logOrd = LEVEL_ORDER[normalizeLevel(logLevel)];
|
|
55
|
+
// Unknown levels always pass
|
|
56
|
+
if (filterOrd === undefined || logOrd === undefined)
|
|
57
|
+
return true;
|
|
58
|
+
return logOrd >= filterOrd;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Format a log message as a JSON string matching the cross-server schema.
|
|
62
|
+
*/
|
|
63
|
+
static formatLogMessage(level, message, category) {
|
|
64
|
+
return JSON.stringify({
|
|
65
|
+
type: 'log',
|
|
66
|
+
timestamp: new Date().toISOString(),
|
|
67
|
+
level: normalizeLevel(level),
|
|
68
|
+
message,
|
|
69
|
+
category: category ?? null,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Attach to an HTTP server and handle WebSocket upgrades on log paths.
|
|
74
|
+
*
|
|
75
|
+
* If you already have a `CliEventSocketManager` attached, call this
|
|
76
|
+
* method on the same `server` — Node's `upgrade` event supports
|
|
77
|
+
* multiple listeners, and each manager only handles its own paths.
|
|
78
|
+
*/
|
|
79
|
+
attach(server) {
|
|
80
|
+
this._wss = new ws_1.WebSocketServer({ noServer: true });
|
|
81
|
+
server.on('upgrade', (request, socket, head) => {
|
|
82
|
+
const parsed = new url_1.URL(request.url ?? '', 'http://localhost');
|
|
83
|
+
const pathname = parsed.pathname;
|
|
84
|
+
if (!CliLogSocketManager.LOG_PATHS.has(pathname))
|
|
85
|
+
return;
|
|
86
|
+
this._wss.handleUpgrade(request, socket, head, (ws) => {
|
|
87
|
+
const levelFilter = parsed.searchParams.get('level') || null;
|
|
88
|
+
this._handleConnection(ws, request, levelFilter);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Broadcast a log message to all connected clients whose filter allows it.
|
|
94
|
+
*/
|
|
95
|
+
broadcastLog(level, message, category) {
|
|
96
|
+
if (this._clients.size === 0)
|
|
97
|
+
return;
|
|
98
|
+
let formatted = null;
|
|
99
|
+
for (const entry of this._clients.values()) {
|
|
100
|
+
if (entry.ws.readyState !== ws_1.WebSocket.OPEN)
|
|
101
|
+
continue;
|
|
102
|
+
if (!CliLogSocketManager.shouldSendLog(entry.levelFilter, level))
|
|
103
|
+
continue;
|
|
104
|
+
// Lazy-format only when there's at least one recipient
|
|
105
|
+
if (!formatted) {
|
|
106
|
+
formatted = CliLogSocketManager.formatLogMessage(level, message, category);
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
entry.ws.send(formatted);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// ignore send errors; cleanup happens on close/error events
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Send a disconnect message to all clients and close connections.
|
|
118
|
+
*/
|
|
119
|
+
async broadcastDisconnect() {
|
|
120
|
+
logger.info('Broadcasting disconnect to %d log clients', this._clients.size);
|
|
121
|
+
const disconnectMsg = JSON.stringify({ type: 'disconnect' });
|
|
122
|
+
const promises = [];
|
|
123
|
+
for (const entry of this._clients.values()) {
|
|
124
|
+
if (entry.ws.readyState === ws_1.WebSocket.OPEN) {
|
|
125
|
+
promises.push(new Promise((resolve) => {
|
|
126
|
+
entry.ws.send(disconnectMsg, () => {
|
|
127
|
+
entry.ws.close(1000, 'Server shutting down');
|
|
128
|
+
resolve();
|
|
129
|
+
});
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
await Promise.all(promises);
|
|
134
|
+
this._clients.clear();
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Return information about all currently connected log clients.
|
|
138
|
+
*/
|
|
139
|
+
getClients() {
|
|
140
|
+
const result = [];
|
|
141
|
+
for (const entry of this._clients.values()) {
|
|
142
|
+
if (entry.ws.readyState === ws_1.WebSocket.OPEN) {
|
|
143
|
+
result.push({
|
|
144
|
+
id: entry.id,
|
|
145
|
+
connectedAt: entry.connectedAt.toISOString(),
|
|
146
|
+
remoteAddress: entry.remoteAddress,
|
|
147
|
+
levelFilter: entry.levelFilter,
|
|
148
|
+
type: 'logs',
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
/** Terminates all connections and closes the WebSocket server. */
|
|
155
|
+
dispose() {
|
|
156
|
+
for (const entry of this._clients.values()) {
|
|
157
|
+
entry.ws.terminate();
|
|
158
|
+
}
|
|
159
|
+
this._clients.clear();
|
|
160
|
+
this._wss?.close();
|
|
161
|
+
}
|
|
162
|
+
_handleConnection(ws, request, levelFilter) {
|
|
163
|
+
const id = `log-${this._nextClientId++}`;
|
|
164
|
+
const entry = {
|
|
165
|
+
id,
|
|
166
|
+
ws,
|
|
167
|
+
connectedAt: new Date(),
|
|
168
|
+
remoteAddress: request.socket.remoteAddress ?? 'unknown',
|
|
169
|
+
levelFilter,
|
|
170
|
+
};
|
|
171
|
+
this._clients.set(id, entry);
|
|
172
|
+
ws.send(JSON.stringify({ type: 'connected' }));
|
|
173
|
+
logger.info('Log client connected (id=%s, level=%s)', id, levelFilter ?? 'all');
|
|
174
|
+
ws.on('close', () => {
|
|
175
|
+
logger.info('Log client disconnected (id=%s)', id);
|
|
176
|
+
this._clients.delete(id);
|
|
177
|
+
});
|
|
178
|
+
ws.on('error', () => {
|
|
179
|
+
logger.info('Log client disconnected (id=%s)', id);
|
|
180
|
+
this._clients.delete(id);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.CliLogSocketManager = CliLogSocketManager;
|
|
185
|
+
//# sourceMappingURL=cli-log-socket-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-log-socket-manager.js","sourceRoot":"","sources":["../../../src/services/cli-log-socket-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import { CliServerResponse } from '../models';
|
|
2
|
+
/** Fluent interface for building a structured CLI server response with typed output blocks. */
|
|
2
3
|
export interface ICliResponseBuilder {
|
|
4
|
+
/** Appends a text output block with an optional style. */
|
|
3
5
|
writeText(text: string, style?: 'success' | 'error' | 'info' | 'warning'): void;
|
|
6
|
+
/** Appends a table output block. */
|
|
4
7
|
writeTable(headers: string[], rows: string[][]): void;
|
|
8
|
+
/** Appends a list output block. */
|
|
5
9
|
writeList(items: string[], ordered?: boolean): void;
|
|
10
|
+
/** Appends a JSON output block. */
|
|
6
11
|
writeJson(value: any): void;
|
|
12
|
+
/** Appends a key-value pairs output block. */
|
|
7
13
|
writeKeyValue(entries: Record<string, string>): void;
|
|
14
|
+
/** Sets the exit code for the response. */
|
|
8
15
|
setExitCode(code: number): void;
|
|
16
|
+
/** Builds and returns the final structured response. */
|
|
9
17
|
build(): CliServerResponse;
|
|
10
18
|
}
|
|
19
|
+
/** Default implementation of {@link ICliResponseBuilder} that accumulates output blocks. */
|
|
11
20
|
export declare class CliResponseBuilder implements ICliResponseBuilder {
|
|
12
21
|
private _exitCode;
|
|
13
22
|
private _outputs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-response-builder.d.ts","sourceRoot":"","sources":["../../../src/services/cli-response-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAChC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAChF,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC;IACtD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACpD,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACrD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,IAAI,iBAAiB,CAAC;CAC9B;AAED,qBAAa,kBAAmB,YAAW,mBAAmB;IAC1D,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAyB;IAEzC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI;IAI/E,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI;IAIrD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,UAAQ,GAAG,IAAI;IAIjD,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAI3B,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAOpD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,KAAK,IAAI,iBAAiB;CAM7B"}
|
|
1
|
+
{"version":3,"file":"cli-response-builder.d.ts","sourceRoot":"","sources":["../../../src/services/cli-response-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,+FAA+F;AAC/F,MAAM,WAAW,mBAAmB;IAChC,0DAA0D;IAC1D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAChF,oCAAoC;IACpC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC;IACtD,mCAAmC;IACnC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACpD,mCAAmC;IACnC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;IAC5B,8CAA8C;IAC9C,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACrD,2CAA2C;IAC3C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,wDAAwD;IACxD,KAAK,IAAI,iBAAiB,CAAC;CAC9B;AAED,4FAA4F;AAC5F,qBAAa,kBAAmB,YAAW,mBAAmB;IAC1D,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAyB;IAEzC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI;IAI/E,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI;IAIrD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,UAAQ,GAAG,IAAI;IAIjD,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAI3B,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAOpD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,KAAK,IAAI,iBAAiB;CAM7B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CliResponseBuilder = void 0;
|
|
4
|
+
/** Default implementation of {@link ICliResponseBuilder} that accumulates output blocks. */
|
|
4
5
|
class CliResponseBuilder {
|
|
5
6
|
_exitCode = 0;
|
|
6
7
|
_outputs = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-response-builder.js","sourceRoot":"","sources":["../../../src/services/cli-response-builder.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"cli-response-builder.js","sourceRoot":"","sources":["../../../src/services/cli-response-builder.ts"],"names":[],"mappings":";;;AAqBA,4FAA4F;AAC5F,MAAa,kBAAkB;IACnB,SAAS,GAAG,CAAC,CAAC;IACd,QAAQ,GAAsB,EAAE,CAAC;IAEzC,SAAS,CAAC,IAAY,EAAE,KAAgD;QACpE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,UAAU,CAAC,OAAiB,EAAE,IAAgB;QAC1C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,SAAS,CAAC,KAAe,EAAE,OAAO,GAAG,KAAK;QACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,SAAS,CAAC,KAAU;QAChB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,aAAa,CAAC,OAA+B;QACzC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;SAC3E,CAAC,CAAC;IACP,CAAC;IAED,WAAW,CAAC,IAAY;QACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK;QACD,OAAO;YACH,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,OAAO,EAAE,IAAI,CAAC,QAAQ;SACzB,CAAC;IACN,CAAC;CACJ;AArCD,gDAqCC"}
|
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
import { WebSocket } from 'ws';
|
|
2
|
+
/** Manages interactive PTY shell sessions over WebSocket connections. */
|
|
2
3
|
export declare class CliShellSessionManager {
|
|
4
|
+
/**
|
|
5
|
+
* Creates a PTY shell session bridged to the given WebSocket.
|
|
6
|
+
* @param ws - WebSocket connection for the shell session.
|
|
7
|
+
* @param cols - Initial terminal width in columns.
|
|
8
|
+
* @param rows - Initial terminal height in rows.
|
|
9
|
+
* @param command - Optional command to execute instead of an interactive shell.
|
|
10
|
+
*/
|
|
3
11
|
handleSession(ws: WebSocket, cols: number, rows: number, command?: string): Promise<void>;
|
|
12
|
+
/** Determines the shell binary and arguments based on the platform and optional command. */
|
|
4
13
|
private getShellInfo;
|
|
14
|
+
/** Detects the best available shell on Unix systems by checking $SHELL and common paths. */
|
|
5
15
|
private detectShell;
|
|
16
|
+
/** Sends a JSON message to the WebSocket if the connection is open. */
|
|
6
17
|
private send;
|
|
7
18
|
}
|
|
8
19
|
//# sourceMappingURL=cli-shell-session-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-shell-session-manager.d.ts","sourceRoot":"","sources":["../../../src/services/cli-shell-session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-shell-session-manager.d.ts","sourceRoot":"","sources":["../../../src/services/cli-shell-session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAuC/B,yEAAyE;AACzE,qBAAa,sBAAsB;IAC/B;;;;;;OAMG;IACG,aAAa,CACf,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IA4FhB,4FAA4F;IAC5F,OAAO,CAAC,YAAY;IAcpB,4FAA4F;IAC5F,OAAO,CAAC,WAAW;IAwBnB,uEAAuE;IACvE,OAAO,CAAC,IAAI;CAKf"}
|
|
@@ -37,8 +37,12 @@ exports.CliShellSessionManager = void 0;
|
|
|
37
37
|
const ws_1 = require("ws");
|
|
38
38
|
const os = __importStar(require("os"));
|
|
39
39
|
const path = __importStar(require("path"));
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
const logger_1 = require("../utils/logger");
|
|
41
|
+
const logger = (0, logger_1.createLogger)('ShellSession');
|
|
42
|
+
/**
|
|
43
|
+
* Lazy-loads node-pty to avoid import failures when the native add-on is unavailable.
|
|
44
|
+
* @throws {Error} If node-pty cannot be loaded.
|
|
45
|
+
*/
|
|
42
46
|
let _pty;
|
|
43
47
|
function getPty() {
|
|
44
48
|
if (!_pty) {
|
|
@@ -52,10 +56,27 @@ function getPty() {
|
|
|
52
56
|
}
|
|
53
57
|
return _pty;
|
|
54
58
|
}
|
|
59
|
+
/** Manages interactive PTY shell sessions over WebSocket connections. */
|
|
55
60
|
class CliShellSessionManager {
|
|
61
|
+
/**
|
|
62
|
+
* Creates a PTY shell session bridged to the given WebSocket.
|
|
63
|
+
* @param ws - WebSocket connection for the shell session.
|
|
64
|
+
* @param cols - Initial terminal width in columns.
|
|
65
|
+
* @param rows - Initial terminal height in rows.
|
|
66
|
+
* @param command - Optional command to execute instead of an interactive shell.
|
|
67
|
+
*/
|
|
56
68
|
async handleSession(ws, cols, rows, command) {
|
|
57
69
|
const { shell, args } = this.getShellInfo(command);
|
|
58
|
-
|
|
70
|
+
let nodePty;
|
|
71
|
+
try {
|
|
72
|
+
nodePty = getPty();
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
logger.error('node-pty unavailable: %s', err.message ?? err);
|
|
76
|
+
this.send(ws, { type: 'error', message: err.message });
|
|
77
|
+
ws.close();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
59
80
|
let ptyProcess;
|
|
60
81
|
try {
|
|
61
82
|
ptyProcess = nodePty.spawn(shell, args, {
|
|
@@ -67,10 +88,12 @@ class CliShellSessionManager {
|
|
|
67
88
|
});
|
|
68
89
|
}
|
|
69
90
|
catch (err) {
|
|
91
|
+
logger.error('Shell session error: %s', err.message ?? err);
|
|
70
92
|
this.send(ws, { type: 'error', message: err.message });
|
|
71
93
|
ws.close();
|
|
72
94
|
return;
|
|
73
95
|
}
|
|
96
|
+
logger.info('Shell session started (shell=%s, cols=%d, rows=%d)', shell, cols, rows);
|
|
74
97
|
const detectedOs = os.platform() === 'win32'
|
|
75
98
|
? 'win32'
|
|
76
99
|
: os.platform() === 'darwin'
|
|
@@ -85,6 +108,7 @@ class CliShellSessionManager {
|
|
|
85
108
|
this.send(ws, { type: 'stdout', data });
|
|
86
109
|
});
|
|
87
110
|
ptyProcess.onExit(({ exitCode }) => {
|
|
111
|
+
logger.info('Shell session ended');
|
|
88
112
|
this.send(ws, { type: 'exit', code: exitCode });
|
|
89
113
|
if (ws.readyState === ws_1.WebSocket.OPEN) {
|
|
90
114
|
ws.close();
|
|
@@ -104,6 +128,7 @@ class CliShellSessionManager {
|
|
|
104
128
|
}
|
|
105
129
|
catch {
|
|
106
130
|
// Ignore malformed messages
|
|
131
|
+
logger.debug('Ignoring malformed WebSocket message');
|
|
107
132
|
}
|
|
108
133
|
});
|
|
109
134
|
ws.on('close', () => {
|
|
@@ -112,17 +137,21 @@ class CliShellSessionManager {
|
|
|
112
137
|
}
|
|
113
138
|
catch {
|
|
114
139
|
// Already exited
|
|
140
|
+
logger.debug('Process already exited, cleanup skipped');
|
|
115
141
|
}
|
|
116
142
|
});
|
|
117
|
-
ws.on('error', () => {
|
|
143
|
+
ws.on('error', (error) => {
|
|
144
|
+
logger.error('Shell session error: %s', error.message ?? error);
|
|
118
145
|
try {
|
|
119
146
|
ptyProcess.kill();
|
|
120
147
|
}
|
|
121
148
|
catch {
|
|
122
149
|
// Already exited
|
|
150
|
+
logger.debug('Process already exited, cleanup skipped');
|
|
123
151
|
}
|
|
124
152
|
});
|
|
125
153
|
}
|
|
154
|
+
/** Determines the shell binary and arguments based on the platform and optional command. */
|
|
126
155
|
getShellInfo(command) {
|
|
127
156
|
if (os.platform() === 'win32') {
|
|
128
157
|
const shell = 'powershell.exe';
|
|
@@ -135,6 +164,7 @@ class CliShellSessionManager {
|
|
|
135
164
|
? { shell, args: ['-c', command] }
|
|
136
165
|
: { shell, args: [] };
|
|
137
166
|
}
|
|
167
|
+
/** Detects the best available shell on Unix systems by checking $SHELL and common paths. */
|
|
138
168
|
detectShell() {
|
|
139
169
|
const envShell = process.env.SHELL;
|
|
140
170
|
if (envShell) {
|
|
@@ -143,7 +173,7 @@ class CliShellSessionManager {
|
|
|
143
173
|
return envShell;
|
|
144
174
|
}
|
|
145
175
|
catch {
|
|
146
|
-
// SHELL
|
|
176
|
+
// $SHELL binary not accessible; try common paths
|
|
147
177
|
}
|
|
148
178
|
}
|
|
149
179
|
const candidates = ['/bin/bash', '/usr/bin/bash', '/bin/sh'];
|
|
@@ -158,6 +188,7 @@ class CliShellSessionManager {
|
|
|
158
188
|
}
|
|
159
189
|
return '/bin/sh';
|
|
160
190
|
}
|
|
191
|
+
/** Sends a JSON message to the WebSocket if the connection is open. */
|
|
161
192
|
send(ws, msg) {
|
|
162
193
|
if (ws.readyState === ws_1.WebSocket.OPEN) {
|
|
163
194
|
ws.send(JSON.stringify(msg));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-shell-session-manager.js","sourceRoot":"","sources":["../../../src/services/cli-shell-session-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAA+B;AAC/B,uCAAyB;AACzB,2CAA6B;
|
|
1
|
+
{"version":3,"file":"cli-shell-session-manager.js","sourceRoot":"","sources":["../../../src/services/cli-shell-session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { ICliCommandRegistry, CliCommandRegistry } from './cli-command-registry';
|
|
2
2
|
export { ICliResponseBuilder, CliResponseBuilder } from './cli-response-builder';
|
|
3
3
|
export { ICliCommandExecutorService, CliCommandExecutorService } from './cli-command-executor-service';
|
|
4
|
-
export { CliEventSocketManager } from './cli-event-socket-manager';
|
|
4
|
+
export { CliEventSocketManager, CliWebSocketClientInfo } from './cli-event-socket-manager';
|
|
5
5
|
export { CliShellSessionManager } from './cli-shell-session-manager';
|
|
6
|
+
export { CliLogSocketManager, CliLogWebSocketClientInfo } from './cli-log-socket-manager';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CliShellSessionManager = exports.CliEventSocketManager = exports.CliCommandExecutorService = exports.CliResponseBuilder = exports.CliCommandRegistry = void 0;
|
|
3
|
+
exports.CliLogSocketManager = exports.CliShellSessionManager = exports.CliEventSocketManager = exports.CliCommandExecutorService = exports.CliResponseBuilder = exports.CliCommandRegistry = void 0;
|
|
4
4
|
var cli_command_registry_1 = require("./cli-command-registry");
|
|
5
5
|
Object.defineProperty(exports, "CliCommandRegistry", { enumerable: true, get: function () { return cli_command_registry_1.CliCommandRegistry; } });
|
|
6
6
|
var cli_response_builder_1 = require("./cli-response-builder");
|
|
@@ -11,4 +11,6 @@ var cli_event_socket_manager_1 = require("./cli-event-socket-manager");
|
|
|
11
11
|
Object.defineProperty(exports, "CliEventSocketManager", { enumerable: true, get: function () { return cli_event_socket_manager_1.CliEventSocketManager; } });
|
|
12
12
|
var cli_shell_session_manager_1 = require("./cli-shell-session-manager");
|
|
13
13
|
Object.defineProperty(exports, "CliShellSessionManager", { enumerable: true, get: function () { return cli_shell_session_manager_1.CliShellSessionManager; } });
|
|
14
|
+
var cli_log_socket_manager_1 = require("./cli-log-socket-manager");
|
|
15
|
+
Object.defineProperty(exports, "CliLogSocketManager", { enumerable: true, get: function () { return cli_log_socket_manager_1.CliLogSocketManager; } });
|
|
14
16
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":";;;AAAA,+DAAiF;AAAnD,0HAAA,kBAAkB,OAAA;AAChD,+DAAiF;AAAnD,0HAAA,kBAAkB,OAAA;AAChD,+EAAuG;AAAlE,yIAAA,yBAAyB,OAAA;AAC9D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":";;;AAAA,+DAAiF;AAAnD,0HAAA,kBAAkB,OAAA;AAChD,+DAAiF;AAAnD,0HAAA,kBAAkB,OAAA;AAChD,+EAAuG;AAAlE,yIAAA,yBAAyB,OAAA;AAC9D,uEAA2F;AAAlF,iIAAA,qBAAqB,OAAA;AAC9B,yEAAqE;AAA5D,mIAAA,sBAAsB,OAAA;AAC/B,mEAA0F;AAAjF,6HAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple structured logger with category prefixes.
|
|
3
|
+
*/
|
|
4
|
+
export interface Logger {
|
|
5
|
+
debug(message: string, ...args: unknown[]): void;
|
|
6
|
+
info(message: string, ...args: unknown[]): void;
|
|
7
|
+
warn(message: string, ...args: unknown[]): void;
|
|
8
|
+
error(message: string, ...args: unknown[]): void;
|
|
9
|
+
}
|
|
10
|
+
export declare function createLogger(category: string): Logger;
|
|
11
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,MAAM;IACnB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACpD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQrD"}
|