@yu_robotics/remote-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +94 -0
- package/bin/remote-cli.js +2 -0
- package/dist/client/MessageHandler.d.ts +92 -0
- package/dist/client/MessageHandler.d.ts.map +1 -0
- package/dist/client/MessageHandler.js +496 -0
- package/dist/client/MessageHandler.js.map +1 -0
- package/dist/client/WebSocketClient.d.ts +109 -0
- package/dist/client/WebSocketClient.d.ts.map +1 -0
- package/dist/client/WebSocketClient.js +234 -0
- package/dist/client/WebSocketClient.js.map +1 -0
- package/dist/commands/config.d.ts +35 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +195 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +25 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +112 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/start.d.ts +20 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +108 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +37 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +71 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +23 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +52 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/config/ConfigManager.d.ts +109 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +262 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/executor/ClaudeExecutor.d.ts +89 -0
- package/dist/executor/ClaudeExecutor.d.ts.map +1 -0
- package/dist/executor/ClaudeExecutor.js +365 -0
- package/dist/executor/ClaudeExecutor.js.map +1 -0
- package/dist/executor/ClaudePersistentExecutor.d.ts +175 -0
- package/dist/executor/ClaudePersistentExecutor.d.ts.map +1 -0
- package/dist/executor/ClaudePersistentExecutor.js +958 -0
- package/dist/executor/ClaudePersistentExecutor.js.map +1 -0
- package/dist/executor/index.d.ts +20 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +48 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/hooks/ClaudeCodeHooks.d.ts +281 -0
- package/dist/hooks/ClaudeCodeHooks.d.ts.map +1 -0
- package/dist/hooks/ClaudeCodeHooks.js +350 -0
- package/dist/hooks/ClaudeCodeHooks.js.map +1 -0
- package/dist/hooks/FeishuNotificationAdapter.d.ts +87 -0
- package/dist/hooks/FeishuNotificationAdapter.d.ts.map +1 -0
- package/dist/hooks/FeishuNotificationAdapter.js +280 -0
- package/dist/hooks/FeishuNotificationAdapter.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +333 -0
- package/dist/index.js.map +1 -0
- package/dist/security/DirectoryGuard.d.ts +54 -0
- package/dist/security/DirectoryGuard.d.ts.map +1 -0
- package/dist/security/DirectoryGuard.js +143 -0
- package/dist/security/DirectoryGuard.js.map +1 -0
- package/dist/types/config.d.ts +46 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +22 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +110 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/FeishuMessageFormatter.d.ts +84 -0
- package/dist/utils/FeishuMessageFormatter.d.ts.map +1 -0
- package/dist/utils/FeishuMessageFormatter.js +395 -0
- package/dist/utils/FeishuMessageFormatter.js.map +1 -0
- package/dist/utils/stripAnsi.d.ts +21 -0
- package/dist/utils/stripAnsi.d.ts.map +1 -0
- package/dist/utils/stripAnsi.js +30 -0
- package/dist/utils/stripAnsi.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WebSocketClient = void 0;
|
|
7
|
+
const ws_1 = __importDefault(require("ws"));
|
|
8
|
+
const uuid_1 = require("uuid");
|
|
9
|
+
/**
|
|
10
|
+
* WebSocket Client
|
|
11
|
+
* Responsible for establishing and maintaining WebSocket connection with router server
|
|
12
|
+
*/
|
|
13
|
+
class WebSocketClient {
|
|
14
|
+
serverUrl;
|
|
15
|
+
deviceId;
|
|
16
|
+
ws = null;
|
|
17
|
+
reconnectInterval;
|
|
18
|
+
heartbeatInterval;
|
|
19
|
+
reconnectTimer = null;
|
|
20
|
+
heartbeatTimer = null;
|
|
21
|
+
manualDisconnect = false;
|
|
22
|
+
connected = false;
|
|
23
|
+
messageHandlers = [];
|
|
24
|
+
errorHandlers = [];
|
|
25
|
+
closeHandlers = [];
|
|
26
|
+
connectHandlers = [];
|
|
27
|
+
constructor(serverUrl, deviceId, options = {}) {
|
|
28
|
+
this.serverUrl = serverUrl;
|
|
29
|
+
this.deviceId = deviceId;
|
|
30
|
+
this.reconnectInterval = options.reconnectInterval ?? 5000;
|
|
31
|
+
this.heartbeatInterval = options.heartbeatInterval ?? 15000;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Connect to server
|
|
35
|
+
*/
|
|
36
|
+
async connect() {
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
this.manualDisconnect = false;
|
|
39
|
+
try {
|
|
40
|
+
this.ws = new ws_1.default(this.serverUrl);
|
|
41
|
+
const onOpen = () => {
|
|
42
|
+
this.connected = true;
|
|
43
|
+
this.startHeartbeat();
|
|
44
|
+
this.sendRegistration();
|
|
45
|
+
this.connectHandlers.forEach(handler => handler());
|
|
46
|
+
resolve();
|
|
47
|
+
};
|
|
48
|
+
const onError = (error) => {
|
|
49
|
+
this.errorHandlers.forEach(handler => handler(error));
|
|
50
|
+
if (!this.connected) {
|
|
51
|
+
reject(error);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const onClose = (code, reason) => {
|
|
55
|
+
this.connected = false;
|
|
56
|
+
this.stopHeartbeat();
|
|
57
|
+
const reasonStr = reason.toString();
|
|
58
|
+
this.closeHandlers.forEach(handler => handler(code, reasonStr));
|
|
59
|
+
if (!this.manualDisconnect) {
|
|
60
|
+
this.scheduleReconnect();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const onMessage = (data) => {
|
|
64
|
+
try {
|
|
65
|
+
const message = JSON.parse(data.toString());
|
|
66
|
+
this.messageHandlers.forEach(handler => handler(message));
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
// Ignore malformed messages
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
this.ws.on('open', onOpen);
|
|
73
|
+
this.ws.on('error', onError);
|
|
74
|
+
this.ws.on('close', onClose);
|
|
75
|
+
this.ws.on('message', onMessage);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
reject(error);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Disconnect
|
|
84
|
+
*/
|
|
85
|
+
disconnect() {
|
|
86
|
+
this.manualDisconnect = true;
|
|
87
|
+
this.connected = false;
|
|
88
|
+
this.stopHeartbeat();
|
|
89
|
+
this.clearReconnectTimer();
|
|
90
|
+
if (this.ws) {
|
|
91
|
+
this.ws.close();
|
|
92
|
+
this.ws = null;
|
|
93
|
+
}
|
|
94
|
+
// Clear all handlers
|
|
95
|
+
this.messageHandlers = [];
|
|
96
|
+
this.errorHandlers = [];
|
|
97
|
+
this.closeHandlers = [];
|
|
98
|
+
this.connectHandlers = [];
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Send message
|
|
102
|
+
* @param message Message object
|
|
103
|
+
*/
|
|
104
|
+
send(message) {
|
|
105
|
+
if (!this.connected || !this.ws) {
|
|
106
|
+
throw new Error('Not connected to server');
|
|
107
|
+
}
|
|
108
|
+
this.ws.send(JSON.stringify(message));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Check if connected
|
|
112
|
+
*/
|
|
113
|
+
isConnected() {
|
|
114
|
+
return this.connected;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get connection status
|
|
118
|
+
*/
|
|
119
|
+
getStatus() {
|
|
120
|
+
return {
|
|
121
|
+
connected: this.connected,
|
|
122
|
+
serverUrl: this.serverUrl,
|
|
123
|
+
deviceId: this.deviceId
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Register message handler
|
|
128
|
+
* @param handler Message handler function
|
|
129
|
+
*/
|
|
130
|
+
onMessage(handler) {
|
|
131
|
+
this.messageHandlers.push(handler);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Register error handler
|
|
135
|
+
* @param handler Error handler function
|
|
136
|
+
*/
|
|
137
|
+
onError(handler) {
|
|
138
|
+
this.errorHandlers.push(handler);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Register close handler
|
|
142
|
+
* @param handler Close handler function
|
|
143
|
+
*/
|
|
144
|
+
onClose(handler) {
|
|
145
|
+
this.closeHandlers.push(handler);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Register connect handler
|
|
149
|
+
* @param handler Connect handler function
|
|
150
|
+
*/
|
|
151
|
+
onConnect(handler) {
|
|
152
|
+
this.connectHandlers.push(handler);
|
|
153
|
+
}
|
|
154
|
+
on(event, handler) {
|
|
155
|
+
switch (event) {
|
|
156
|
+
case 'connected':
|
|
157
|
+
this.onConnect(handler);
|
|
158
|
+
break;
|
|
159
|
+
case 'disconnected':
|
|
160
|
+
this.onClose(() => handler());
|
|
161
|
+
break;
|
|
162
|
+
case 'error':
|
|
163
|
+
this.onError(handler);
|
|
164
|
+
break;
|
|
165
|
+
case 'message':
|
|
166
|
+
this.onMessage(handler);
|
|
167
|
+
break;
|
|
168
|
+
default:
|
|
169
|
+
console.warn(`Unknown event: ${event}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Send device registration message
|
|
174
|
+
*/
|
|
175
|
+
sendRegistration() {
|
|
176
|
+
if (this.ws && this.connected) {
|
|
177
|
+
this.ws.send(JSON.stringify({
|
|
178
|
+
type: 'binding_request',
|
|
179
|
+
messageId: (0, uuid_1.v4)(),
|
|
180
|
+
timestamp: Date.now(),
|
|
181
|
+
data: {
|
|
182
|
+
deviceId: this.deviceId
|
|
183
|
+
}
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Start heartbeat
|
|
189
|
+
*/
|
|
190
|
+
startHeartbeat() {
|
|
191
|
+
this.stopHeartbeat();
|
|
192
|
+
this.heartbeatTimer = setInterval(() => {
|
|
193
|
+
if (this.ws && this.connected) {
|
|
194
|
+
this.ws.send(JSON.stringify({
|
|
195
|
+
type: 'heartbeat',
|
|
196
|
+
timestamp: Date.now()
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
}, this.heartbeatInterval);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Stop heartbeat
|
|
203
|
+
*/
|
|
204
|
+
stopHeartbeat() {
|
|
205
|
+
if (this.heartbeatTimer) {
|
|
206
|
+
clearInterval(this.heartbeatTimer);
|
|
207
|
+
this.heartbeatTimer = null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Schedule reconnection
|
|
212
|
+
*/
|
|
213
|
+
scheduleReconnect() {
|
|
214
|
+
this.clearReconnectTimer();
|
|
215
|
+
if (!this.manualDisconnect) {
|
|
216
|
+
this.reconnectTimer = setTimeout(() => {
|
|
217
|
+
this.connect().catch(error => {
|
|
218
|
+
console.error('Reconnection failed:', error);
|
|
219
|
+
});
|
|
220
|
+
}, this.reconnectInterval);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Clear reconnect timer
|
|
225
|
+
*/
|
|
226
|
+
clearReconnectTimer() {
|
|
227
|
+
if (this.reconnectTimer) {
|
|
228
|
+
clearTimeout(this.reconnectTimer);
|
|
229
|
+
this.reconnectTimer = null;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
exports.WebSocketClient = WebSocketClient;
|
|
234
|
+
//# sourceMappingURL=WebSocketClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocketClient.js","sourceRoot":"","sources":["../../src/client/WebSocketClient.ts"],"names":[],"mappings":";;;;;;AAAA,4CAA2B;AAC3B,+BAAoC;AAsBpC;;;GAGG;AACH,MAAa,eAAe;IAClB,SAAS,CAAS;IAClB,QAAQ,CAAS;IACjB,EAAE,GAAqB,IAAI,CAAC;IAC5B,iBAAiB,CAAS;IAC1B,iBAAiB,CAAS;IAC1B,cAAc,GAA0B,IAAI,CAAC;IAC7C,cAAc,GAA0B,IAAI,CAAC;IAC7C,gBAAgB,GAAG,KAAK,CAAC;IACzB,SAAS,GAAG,KAAK,CAAC;IAClB,eAAe,GAAkC,EAAE,CAAC;IACpD,aAAa,GAAkC,EAAE,CAAC;IAClD,aAAa,GAAkD,EAAE,CAAC;IAClE,eAAe,GAAsB,EAAE,CAAC;IAEhD,YAAY,SAAiB,EAAE,QAAgB,EAAE,UAAkC,EAAE;QACnF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC;QAC3D,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,KAAK,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAE9B,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,GAAG,IAAI,YAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAExC,MAAM,MAAM,GAAG,GAAG,EAAE;oBAClB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;oBACtB,IAAI,CAAC,cAAc,EAAE,CAAC;oBACtB,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACxB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;oBACnD,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC;gBAEF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;oBAC/B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;oBACtD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACpB,MAAM,CAAC,KAAK,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC,CAAC;gBAEF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE;oBAC/C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;oBACvB,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACpC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;oBAEhE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC3B,CAAC;gBACH,CAAC,CAAC;gBAEF,MAAM,SAAS,GAAG,CAAC,IAAoB,EAAE,EAAE;oBACzC,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;wBAC5C,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC5D,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,4BAA4B;oBAC9B,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC3B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC7B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC7B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,OAAY;QACf,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,OAA+B;QACvC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,OAA+B;QACrC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,OAA+C;QACrD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,OAAmB;QAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAWD,EAAE,CAAC,KAAa,EAAE,OAAiC;QACjD,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,WAAW;gBACd,IAAI,CAAC,SAAS,CAAC,OAAqB,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,cAAc;gBACjB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9B,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,OAAO,CAAC,OAAiC,CAAC,CAAC;gBAChD,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,SAAS,CAAC,OAAiC,CAAC,CAAC;gBAClD,MAAM;YACR;gBACE,OAAO,CAAC,IAAI,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC1B,IAAI,EAAE,iBAAiB;gBACvB,SAAS,EAAE,IAAA,SAAM,GAAE;gBACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,IAAI,EAAE;oBACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB;aACF,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;oBAC1B,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;gBACpC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;oBAC3B,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;gBAC/C,CAAC,CAAC,CAAC;YACL,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;CACF;AA7PD,0CA6PC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config command action types
|
|
3
|
+
*/
|
|
4
|
+
export type ConfigAction = 'add-dir' | 'remove-dir' | 'list-dirs' | 'set' | 'get' | 'show';
|
|
5
|
+
/**
|
|
6
|
+
* Config command options
|
|
7
|
+
*/
|
|
8
|
+
export interface ConfigCommandOptions {
|
|
9
|
+
/** Action to perform */
|
|
10
|
+
action: ConfigAction;
|
|
11
|
+
/** Directory path (for add-dir/remove-dir) */
|
|
12
|
+
directory?: string;
|
|
13
|
+
/** Configuration key (for set/get) */
|
|
14
|
+
key?: string;
|
|
15
|
+
/** Configuration value (for set) */
|
|
16
|
+
value?: string;
|
|
17
|
+
/** Output as JSON */
|
|
18
|
+
json?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Config command result
|
|
22
|
+
*/
|
|
23
|
+
export interface ConfigCommandResult {
|
|
24
|
+
success: boolean;
|
|
25
|
+
directories?: string[];
|
|
26
|
+
config?: any;
|
|
27
|
+
value?: any;
|
|
28
|
+
json?: boolean;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Manage configuration
|
|
33
|
+
*/
|
|
34
|
+
export declare function configCommand(options: ConfigCommandOptions): Promise<ConfigCommandResult>;
|
|
35
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA6B9B"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configCommand = configCommand;
|
|
4
|
+
const ConfigManager_1 = require("../config/ConfigManager");
|
|
5
|
+
/**
|
|
6
|
+
* Protected configuration keys that cannot be modified
|
|
7
|
+
*/
|
|
8
|
+
const PROTECTED_KEYS = ['deviceId', 'openId', 'service'];
|
|
9
|
+
/**
|
|
10
|
+
* Manage configuration
|
|
11
|
+
*/
|
|
12
|
+
async function configCommand(options) {
|
|
13
|
+
try {
|
|
14
|
+
const config = await ConfigManager_1.ConfigManager.initialize();
|
|
15
|
+
switch (options.action) {
|
|
16
|
+
case 'add-dir':
|
|
17
|
+
return await handleAddDirectory(config, options);
|
|
18
|
+
case 'remove-dir':
|
|
19
|
+
return await handleRemoveDirectory(config, options);
|
|
20
|
+
case 'list-dirs':
|
|
21
|
+
return handleListDirectories(config);
|
|
22
|
+
case 'set':
|
|
23
|
+
return await handleSetConfig(config, options);
|
|
24
|
+
case 'get':
|
|
25
|
+
return handleGetConfig(config, options);
|
|
26
|
+
case 'show':
|
|
27
|
+
return handleShowConfig(config, options);
|
|
28
|
+
default:
|
|
29
|
+
return {
|
|
30
|
+
success: false,
|
|
31
|
+
error: `Invalid action: ${options.action}`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return {
|
|
37
|
+
success: false,
|
|
38
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Add directory to allowed list
|
|
44
|
+
*/
|
|
45
|
+
async function handleAddDirectory(config, options) {
|
|
46
|
+
const { directory } = options;
|
|
47
|
+
if (!directory || directory.trim() === '') {
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
error: 'Invalid directory path',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const allConfig = config.getAll();
|
|
54
|
+
const currentDirs = allConfig.security?.allowedDirectories || [];
|
|
55
|
+
// Check if directory already exists
|
|
56
|
+
if (currentDirs.includes(directory)) {
|
|
57
|
+
return {
|
|
58
|
+
success: false,
|
|
59
|
+
error: `Directory already exists in allowed list: ${directory}`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Add directory
|
|
63
|
+
const newDirs = [...currentDirs, directory];
|
|
64
|
+
await config.set('security.allowedDirectories', newDirs);
|
|
65
|
+
return {
|
|
66
|
+
success: true,
|
|
67
|
+
directories: newDirs,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Remove directory from allowed list
|
|
72
|
+
*/
|
|
73
|
+
async function handleRemoveDirectory(config, options) {
|
|
74
|
+
const { directory } = options;
|
|
75
|
+
if (!directory) {
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
error: 'Directory path is required',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const allConfig = config.getAll();
|
|
82
|
+
const currentDirs = allConfig.security?.allowedDirectories || [];
|
|
83
|
+
// Check if directory exists
|
|
84
|
+
if (!currentDirs.includes(directory)) {
|
|
85
|
+
return {
|
|
86
|
+
success: false,
|
|
87
|
+
error: `Directory not found in allowed list: ${directory}`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Prevent removing last directory
|
|
91
|
+
if (currentDirs.length === 1) {
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
error: 'Cannot remove last directory. At least one directory must be allowed.',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Remove directory
|
|
98
|
+
const newDirs = currentDirs.filter((dir) => dir !== directory);
|
|
99
|
+
await config.set('security.allowedDirectories', newDirs);
|
|
100
|
+
return {
|
|
101
|
+
success: true,
|
|
102
|
+
directories: newDirs,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* List allowed directories
|
|
107
|
+
*/
|
|
108
|
+
function handleListDirectories(config) {
|
|
109
|
+
const allConfig = config.getAll();
|
|
110
|
+
const directories = allConfig.security?.allowedDirectories || [];
|
|
111
|
+
return {
|
|
112
|
+
success: true,
|
|
113
|
+
directories,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Set configuration value
|
|
118
|
+
*/
|
|
119
|
+
async function handleSetConfig(config, options) {
|
|
120
|
+
const { key, value } = options;
|
|
121
|
+
if (!key || !value) {
|
|
122
|
+
return {
|
|
123
|
+
success: false,
|
|
124
|
+
error: 'Both key and value are required',
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// Check if key is protected
|
|
128
|
+
if (PROTECTED_KEYS.some((protected_key) => key.startsWith(protected_key))) {
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
error: `Cannot modify protected key: ${key}`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// Validate specific keys
|
|
135
|
+
if (key === 'serverUrl') {
|
|
136
|
+
if (!isValidUrl(value)) {
|
|
137
|
+
return {
|
|
138
|
+
success: false,
|
|
139
|
+
error: 'Invalid server URL format',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
await config.set(key, value);
|
|
144
|
+
return {
|
|
145
|
+
success: true,
|
|
146
|
+
value,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get configuration value
|
|
151
|
+
*/
|
|
152
|
+
function handleGetConfig(config, options) {
|
|
153
|
+
const { key } = options;
|
|
154
|
+
if (!key) {
|
|
155
|
+
return {
|
|
156
|
+
success: false,
|
|
157
|
+
error: 'Key is required',
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
const value = config.get(key);
|
|
161
|
+
if (value === undefined) {
|
|
162
|
+
return {
|
|
163
|
+
success: false,
|
|
164
|
+
error: `Configuration key not found: ${key}`,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
success: true,
|
|
169
|
+
value,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Show all configuration
|
|
174
|
+
*/
|
|
175
|
+
function handleShowConfig(config, options) {
|
|
176
|
+
const allConfig = config.getAll();
|
|
177
|
+
return {
|
|
178
|
+
success: true,
|
|
179
|
+
config: allConfig,
|
|
180
|
+
json: options.json,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Validate URL format
|
|
185
|
+
*/
|
|
186
|
+
function isValidUrl(url) {
|
|
187
|
+
try {
|
|
188
|
+
const parsed = new URL(url);
|
|
189
|
+
return parsed.protocol === 'http:' || parsed.protocol === 'https:';
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;AA2CA,sCA+BC;AA1ED,2DAAwD;AAmCxD;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEzD;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,OAA6B;IAE7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,6BAAa,CAAC,UAAU,EAAE,CAAC;QAEhD,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,SAAS;gBACZ,OAAO,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnD,KAAK,YAAY;gBACf,OAAO,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACtD,KAAK,WAAW;gBACd,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;YACvC,KAAK,KAAK;gBACR,OAAO,MAAM,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAChD,KAAK,KAAK;gBACR,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC1C,KAAK,MAAM;gBACT,OAAO,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC3C;gBACE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,mBAAmB,OAAO,CAAC,MAAM,EAAE;iBAC3C,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,MAAqB,EACrB,OAA6B;IAE7B,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE9B,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1C,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,wBAAwB;SAChC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,kBAAkB,IAAI,EAAE,CAAC;IAEjE,oCAAoC;IACpC,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,6CAA6C,SAAS,EAAE;SAChE,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,MAAM,OAAO,GAAG,CAAC,GAAG,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,MAAM,CAAC,GAAG,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;IAEzD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,OAAO;KACrB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAClC,MAAqB,EACrB,OAA6B;IAE7B,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE9B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,4BAA4B;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,kBAAkB,IAAI,EAAE,CAAC;IAEjE,4BAA4B;IAC5B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,wCAAwC,SAAS,EAAE;SAC3D,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,uEAAuE;SAC/E,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IAC/D,MAAM,MAAM,CAAC,GAAG,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;IAEzD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,OAAO;KACrB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAAqB;IAClD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,kBAAkB,IAAI,EAAE,CAAC;IAEjE,OAAO;QACL,OAAO,EAAE,IAAI;QACb,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,MAAqB,EACrB,OAA6B;IAE7B,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE/B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,iCAAiC;SACzC,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QAC1E,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,gCAAgC,GAAG,EAAE;SAC7C,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,2BAA2B;aACnC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE7B,OAAO;QACL,OAAO,EAAE,IAAI;QACb,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,MAAqB,EACrB,OAA6B;IAE7B,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAExB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,iBAAiB;SACzB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,gCAAgC,GAAG,EAAE;SAC7C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,MAAqB,EACrB,OAA6B;IAE7B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAElC,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init command options
|
|
3
|
+
*/
|
|
4
|
+
export interface InitCommandOptions {
|
|
5
|
+
/** Server URL */
|
|
6
|
+
serverUrl: string;
|
|
7
|
+
/** Force re-initialization */
|
|
8
|
+
force?: boolean;
|
|
9
|
+
/** Allowed directories */
|
|
10
|
+
allowedDirs?: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Init command result
|
|
14
|
+
*/
|
|
15
|
+
export interface InitCommandResult {
|
|
16
|
+
success: boolean;
|
|
17
|
+
bindingCode?: string;
|
|
18
|
+
deviceId?: string;
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Initialize the CLI and request binding code from server
|
|
23
|
+
*/
|
|
24
|
+
export declare function initCommand(options: InitCommandOptions): Promise<InitCommandResult>;
|
|
25
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAiG5B"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initCommand = initCommand;
|
|
7
|
+
const ConfigManager_1 = require("../config/ConfigManager");
|
|
8
|
+
const node_machine_id_1 = require("node-machine-id");
|
|
9
|
+
const axios_1 = __importDefault(require("axios"));
|
|
10
|
+
const ora_1 = __importDefault(require("ora"));
|
|
11
|
+
const os_1 = __importDefault(require("os"));
|
|
12
|
+
/**
|
|
13
|
+
* Initialize the CLI and request binding code from server
|
|
14
|
+
*/
|
|
15
|
+
async function initCommand(options) {
|
|
16
|
+
const spinner = (0, ora_1.default)('Initializing remote CLI...').start();
|
|
17
|
+
try {
|
|
18
|
+
// Validate server URL
|
|
19
|
+
if (!isValidUrl(options.serverUrl)) {
|
|
20
|
+
spinner.fail('Invalid server URL');
|
|
21
|
+
return {
|
|
22
|
+
success: false,
|
|
23
|
+
error: 'Invalid server URL format',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const config = await ConfigManager_1.ConfigManager.initialize();
|
|
27
|
+
// Check if already initialized
|
|
28
|
+
if (config.has('deviceId') && !options.force) {
|
|
29
|
+
const existingDeviceId = config.get('deviceId');
|
|
30
|
+
spinner.fail('Device already initialized');
|
|
31
|
+
return {
|
|
32
|
+
success: false,
|
|
33
|
+
error: `Device already initialized with ID: ${existingDeviceId}. Use --force to re-initialize.`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// Generate device ID from machine ID
|
|
37
|
+
let deviceId;
|
|
38
|
+
try {
|
|
39
|
+
const machine = await (0, node_machine_id_1.machineId)();
|
|
40
|
+
deviceId = `dev_${os_1.default.platform()}_${machine.substring(0, 12)}`;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
spinner.fail('Failed to generate device ID');
|
|
44
|
+
return {
|
|
45
|
+
success: false,
|
|
46
|
+
error: error instanceof Error ? error.message : 'Failed to generate device ID',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Request binding code from server
|
|
50
|
+
spinner.text = 'Requesting binding code from server...';
|
|
51
|
+
let response;
|
|
52
|
+
try {
|
|
53
|
+
response = await axios_1.default.post(`${options.serverUrl}/api/bind/request`, {
|
|
54
|
+
deviceId,
|
|
55
|
+
deviceName: os_1.default.hostname(),
|
|
56
|
+
platform: os_1.default.platform(),
|
|
57
|
+
}, {
|
|
58
|
+
timeout: 10000,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
spinner.fail('Failed to connect to server');
|
|
63
|
+
return {
|
|
64
|
+
success: false,
|
|
65
|
+
error: error instanceof Error ? error.message : 'Network error',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// Check server response
|
|
69
|
+
if (!response.data.success) {
|
|
70
|
+
spinner.fail('Server error');
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
error: response.data.error || 'Server returned error',
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const { bindingCode } = response.data;
|
|
77
|
+
// Save configuration
|
|
78
|
+
await config.set('deviceId', deviceId);
|
|
79
|
+
await config.set('serverUrl', options.serverUrl);
|
|
80
|
+
// Set allowed directories
|
|
81
|
+
const allowedDirs = options.allowedDirs || [
|
|
82
|
+
os_1.default.homedir(),
|
|
83
|
+
];
|
|
84
|
+
await config.set('security.allowedDirectories', allowedDirs);
|
|
85
|
+
spinner.succeed('Initialization successful!');
|
|
86
|
+
return {
|
|
87
|
+
success: true,
|
|
88
|
+
bindingCode,
|
|
89
|
+
deviceId,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
spinner.fail('Initialization failed');
|
|
94
|
+
return {
|
|
95
|
+
success: false,
|
|
96
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Validate URL format
|
|
102
|
+
*/
|
|
103
|
+
function isValidUrl(url) {
|
|
104
|
+
try {
|
|
105
|
+
const parsed = new URL(url);
|
|
106
|
+
return parsed.protocol === 'http:' || parsed.protocol === 'https:';
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Start command options
|
|
3
|
+
*/
|
|
4
|
+
export interface StartCommandOptions {
|
|
5
|
+
/** Run as daemon */
|
|
6
|
+
daemon?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Start command result
|
|
10
|
+
*/
|
|
11
|
+
export interface StartCommandResult {
|
|
12
|
+
success: boolean;
|
|
13
|
+
daemonMode?: boolean;
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Start the remote CLI service
|
|
18
|
+
*/
|
|
19
|
+
export declare function startCommand(options: StartCommandOptions): Promise<StartCommandResult>;
|
|
20
|
+
//# sourceMappingURL=start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,oBAAoB;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA6G7B"}
|