@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.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +94 -0
  3. package/bin/remote-cli.js +2 -0
  4. package/dist/client/MessageHandler.d.ts +92 -0
  5. package/dist/client/MessageHandler.d.ts.map +1 -0
  6. package/dist/client/MessageHandler.js +496 -0
  7. package/dist/client/MessageHandler.js.map +1 -0
  8. package/dist/client/WebSocketClient.d.ts +109 -0
  9. package/dist/client/WebSocketClient.d.ts.map +1 -0
  10. package/dist/client/WebSocketClient.js +234 -0
  11. package/dist/client/WebSocketClient.js.map +1 -0
  12. package/dist/commands/config.d.ts +35 -0
  13. package/dist/commands/config.d.ts.map +1 -0
  14. package/dist/commands/config.js +195 -0
  15. package/dist/commands/config.js.map +1 -0
  16. package/dist/commands/init.d.ts +25 -0
  17. package/dist/commands/init.d.ts.map +1 -0
  18. package/dist/commands/init.js +112 -0
  19. package/dist/commands/init.js.map +1 -0
  20. package/dist/commands/start.d.ts +20 -0
  21. package/dist/commands/start.d.ts.map +1 -0
  22. package/dist/commands/start.js +108 -0
  23. package/dist/commands/start.js.map +1 -0
  24. package/dist/commands/status.d.ts +37 -0
  25. package/dist/commands/status.d.ts.map +1 -0
  26. package/dist/commands/status.js +71 -0
  27. package/dist/commands/status.js.map +1 -0
  28. package/dist/commands/stop.d.ts +23 -0
  29. package/dist/commands/stop.d.ts.map +1 -0
  30. package/dist/commands/stop.js +52 -0
  31. package/dist/commands/stop.js.map +1 -0
  32. package/dist/config/ConfigManager.d.ts +109 -0
  33. package/dist/config/ConfigManager.d.ts.map +1 -0
  34. package/dist/config/ConfigManager.js +262 -0
  35. package/dist/config/ConfigManager.js.map +1 -0
  36. package/dist/executor/ClaudeExecutor.d.ts +89 -0
  37. package/dist/executor/ClaudeExecutor.d.ts.map +1 -0
  38. package/dist/executor/ClaudeExecutor.js +365 -0
  39. package/dist/executor/ClaudeExecutor.js.map +1 -0
  40. package/dist/executor/ClaudePersistentExecutor.d.ts +175 -0
  41. package/dist/executor/ClaudePersistentExecutor.d.ts.map +1 -0
  42. package/dist/executor/ClaudePersistentExecutor.js +958 -0
  43. package/dist/executor/ClaudePersistentExecutor.js.map +1 -0
  44. package/dist/executor/index.d.ts +20 -0
  45. package/dist/executor/index.d.ts.map +1 -0
  46. package/dist/executor/index.js +48 -0
  47. package/dist/executor/index.js.map +1 -0
  48. package/dist/hooks/ClaudeCodeHooks.d.ts +281 -0
  49. package/dist/hooks/ClaudeCodeHooks.d.ts.map +1 -0
  50. package/dist/hooks/ClaudeCodeHooks.js +350 -0
  51. package/dist/hooks/ClaudeCodeHooks.js.map +1 -0
  52. package/dist/hooks/FeishuNotificationAdapter.d.ts +87 -0
  53. package/dist/hooks/FeishuNotificationAdapter.d.ts.map +1 -0
  54. package/dist/hooks/FeishuNotificationAdapter.js +280 -0
  55. package/dist/hooks/FeishuNotificationAdapter.js.map +1 -0
  56. package/dist/hooks/index.d.ts +4 -0
  57. package/dist/hooks/index.d.ts.map +1 -0
  58. package/dist/hooks/index.js +10 -0
  59. package/dist/hooks/index.js.map +1 -0
  60. package/dist/index.d.ts +3 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +333 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/security/DirectoryGuard.d.ts +54 -0
  65. package/dist/security/DirectoryGuard.d.ts.map +1 -0
  66. package/dist/security/DirectoryGuard.js +143 -0
  67. package/dist/security/DirectoryGuard.js.map +1 -0
  68. package/dist/types/config.d.ts +46 -0
  69. package/dist/types/config.d.ts.map +1 -0
  70. package/dist/types/config.js +22 -0
  71. package/dist/types/config.js.map +1 -0
  72. package/dist/types/index.d.ts +110 -0
  73. package/dist/types/index.d.ts.map +1 -0
  74. package/dist/types/index.js +3 -0
  75. package/dist/types/index.js.map +1 -0
  76. package/dist/utils/FeishuMessageFormatter.d.ts +84 -0
  77. package/dist/utils/FeishuMessageFormatter.d.ts.map +1 -0
  78. package/dist/utils/FeishuMessageFormatter.js +395 -0
  79. package/dist/utils/FeishuMessageFormatter.js.map +1 -0
  80. package/dist/utils/stripAnsi.d.ts +21 -0
  81. package/dist/utils/stripAnsi.d.ts.map +1 -0
  82. package/dist/utils/stripAnsi.js +30 -0
  83. package/dist/utils/stripAnsi.js.map +1 -0
  84. 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":"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"}
@@ -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":"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"}
@@ -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"}