@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,108 @@
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.startCommand = startCommand;
7
+ const ConfigManager_1 = require("../config/ConfigManager");
8
+ const WebSocketClient_1 = require("../client/WebSocketClient");
9
+ const executor_1 = require("../executor");
10
+ const MessageHandler_1 = require("../client/MessageHandler");
11
+ const DirectoryGuard_1 = require("../security/DirectoryGuard");
12
+ const ora_1 = __importDefault(require("ora"));
13
+ /**
14
+ * Start the remote CLI service
15
+ */
16
+ async function startCommand(options) {
17
+ const spinner = (0, ora_1.default)('Starting remote CLI service...').start();
18
+ try {
19
+ const config = await ConfigManager_1.ConfigManager.initialize();
20
+ // Check if initialized
21
+ if (!config.has('deviceId')) {
22
+ spinner.fail('Device not initialized');
23
+ return {
24
+ success: false,
25
+ error: 'Device not initialized. Please run "remote-cli init" first.',
26
+ };
27
+ }
28
+ // Get configuration
29
+ const allConfig = config.getAll();
30
+ const { deviceId, serverUrl, security, service } = allConfig;
31
+ // Validate configuration
32
+ if (!deviceId) {
33
+ spinner.fail('Missing deviceId');
34
+ return {
35
+ success: false,
36
+ error: 'Configuration error: deviceId is missing',
37
+ };
38
+ }
39
+ if (!serverUrl) {
40
+ spinner.fail('Missing serverUrl');
41
+ return {
42
+ success: false,
43
+ error: 'Configuration error: serverUrl is missing',
44
+ };
45
+ }
46
+ if (!security?.allowedDirectories || security.allowedDirectories.length === 0) {
47
+ spinner.fail('Missing allowedDirectories');
48
+ return {
49
+ success: false,
50
+ error: 'Configuration error: allowedDirectories is missing',
51
+ };
52
+ }
53
+ // Initialize components
54
+ spinner.text = 'Initializing components...';
55
+ const directoryGuard = new DirectoryGuard_1.DirectoryGuard(security.allowedDirectories);
56
+ const executor = (0, executor_1.createClaudeExecutor)(directoryGuard, 'auto');
57
+ // Create WebSocket URL
58
+ const wsUrl = serverUrl.replace(/^http/, 'ws') + '/ws';
59
+ const wsClient = new WebSocketClient_1.WebSocketClient(wsUrl, deviceId);
60
+ const messageHandler = new MessageHandler_1.MessageHandler(wsClient, executor, directoryGuard);
61
+ // Setup event handlers
62
+ wsClient.on('connected', () => {
63
+ console.log('✅ Connected to server');
64
+ });
65
+ wsClient.on('disconnected', () => {
66
+ console.log('⚠️ Disconnected from server');
67
+ });
68
+ wsClient.on('error', (error) => {
69
+ console.error('❌ WebSocket error:', error);
70
+ });
71
+ wsClient.on('message', async (message) => {
72
+ await messageHandler.handleMessage(message);
73
+ });
74
+ // Connect to server
75
+ spinner.text = 'Connecting to server...';
76
+ try {
77
+ await wsClient.connect();
78
+ }
79
+ catch (error) {
80
+ spinner.fail('Connection failed');
81
+ return {
82
+ success: false,
83
+ error: error instanceof Error ? error.message : 'Connection failed',
84
+ };
85
+ }
86
+ // Save service state
87
+ await config.set('service.running', true);
88
+ await config.set('service.startedAt', Date.now());
89
+ if (options.daemon) {
90
+ await config.set('service.pid', process.pid);
91
+ }
92
+ spinner.succeed(options.daemon
93
+ ? 'Remote CLI service started in daemon mode'
94
+ : 'Remote CLI service started');
95
+ return {
96
+ success: true,
97
+ daemonMode: options.daemon,
98
+ };
99
+ }
100
+ catch (error) {
101
+ spinner.fail('Failed to start service');
102
+ return {
103
+ success: false,
104
+ error: error instanceof Error ? error.message : 'Unknown error',
105
+ };
106
+ }
107
+ }
108
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Status command options
3
+ */
4
+ export interface StatusCommandOptions {
5
+ /** Output as JSON */
6
+ json?: boolean;
7
+ }
8
+ /**
9
+ * Service status
10
+ */
11
+ export interface ServiceStatus {
12
+ initialized: boolean;
13
+ deviceId?: string;
14
+ serverUrl?: string;
15
+ openId?: string;
16
+ bound: boolean;
17
+ running: boolean;
18
+ connected: boolean;
19
+ uptime?: number;
20
+ allowedDirectories?: string[];
21
+ startedAt?: number;
22
+ pid?: number;
23
+ }
24
+ /**
25
+ * Status command result
26
+ */
27
+ export interface StatusCommandResult {
28
+ success: boolean;
29
+ status?: ServiceStatus;
30
+ json?: boolean;
31
+ error?: string;
32
+ }
33
+ /**
34
+ * Get service status
35
+ */
36
+ export declare function statusCommand(options?: StatusCommandOptions): Promise<StatusCommandResult>;
37
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,qBAAqB;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAkE9B"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.statusCommand = statusCommand;
4
+ const ConfigManager_1 = require("../config/ConfigManager");
5
+ const WebSocketClient_1 = require("../client/WebSocketClient");
6
+ /**
7
+ * Get service status
8
+ */
9
+ async function statusCommand(options = {}) {
10
+ try {
11
+ const config = await ConfigManager_1.ConfigManager.initialize();
12
+ // Get all configuration
13
+ const allConfig = config.getAll();
14
+ // Check if initialized
15
+ if (!config.has('deviceId')) {
16
+ return {
17
+ success: true,
18
+ status: {
19
+ initialized: false,
20
+ bound: false,
21
+ running: false,
22
+ connected: false,
23
+ },
24
+ json: options.json,
25
+ };
26
+ }
27
+ const { deviceId, serverUrl, openId, security, service } = allConfig;
28
+ // Calculate uptime
29
+ let uptime;
30
+ if (service?.running && service.startedAt) {
31
+ uptime = Date.now() - service.startedAt;
32
+ }
33
+ // Check WebSocket connection (if service is running)
34
+ let connected = false;
35
+ if (service?.running) {
36
+ try {
37
+ const wsUrl = serverUrl?.replace(/^http/, 'ws') + '/ws';
38
+ const wsClient = new WebSocketClient_1.WebSocketClient(wsUrl || '', deviceId || '');
39
+ connected = wsClient.isConnected();
40
+ }
41
+ catch {
42
+ connected = false;
43
+ }
44
+ }
45
+ const status = {
46
+ initialized: true,
47
+ deviceId,
48
+ serverUrl,
49
+ openId,
50
+ bound: Boolean(openId),
51
+ running: Boolean(service?.running),
52
+ connected,
53
+ uptime,
54
+ allowedDirectories: security?.allowedDirectories,
55
+ startedAt: service?.startedAt,
56
+ pid: service?.pid,
57
+ };
58
+ return {
59
+ success: true,
60
+ status,
61
+ json: options.json,
62
+ };
63
+ }
64
+ catch (error) {
65
+ return {
66
+ success: false,
67
+ error: error instanceof Error ? error.message : 'Unknown error',
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":";;AAyCA,sCAoEC;AA7GD,2DAAwD;AACxD,+DAA4D;AAqC5D;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,UAAgC,EAAE;IAElC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,6BAAa,CAAC,UAAU,EAAE,CAAC;QAEhD,wBAAwB;QACxB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAElC,uBAAuB;QACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE;oBACN,WAAW,EAAE,KAAK;oBAClB,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,KAAK;oBACd,SAAS,EAAE,KAAK;iBACjB;gBACD,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;QAErE,mBAAmB;QACnB,IAAI,MAA0B,CAAC;QAC/B,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;QAC1C,CAAC;QAED,qDAAqD;QACrD,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;gBACxD,MAAM,QAAQ,GAAG,IAAI,iCAAe,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;gBAClE,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAkB;YAC5B,WAAW,EAAE,IAAI;YACjB,QAAQ;YACR,SAAS;YACT,MAAM;YACN,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;YAClC,SAAS;YACT,MAAM;YACN,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB;YAChD,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,GAAG,EAAE,OAAO,EAAE,GAAG;SAClB,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM;YACN,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;IACJ,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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Stop command options
3
+ */
4
+ export interface StopCommandOptions {
5
+ /** Graceful shutdown */
6
+ graceful?: boolean;
7
+ /** Force stop */
8
+ force?: boolean;
9
+ }
10
+ /**
11
+ * Stop command result
12
+ */
13
+ export interface StopCommandResult {
14
+ success: boolean;
15
+ graceful?: boolean;
16
+ force?: boolean;
17
+ error?: string;
18
+ }
19
+ /**
20
+ * Stop the remote CLI service
21
+ */
22
+ export declare function stopCommand(options?: StopCommandOptions): Promise<StopCommandResult>;
23
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CA6C5B"}
@@ -0,0 +1,52 @@
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.stopCommand = stopCommand;
7
+ const ConfigManager_1 = require("../config/ConfigManager");
8
+ const ora_1 = __importDefault(require("ora"));
9
+ /**
10
+ * Stop the remote CLI service
11
+ */
12
+ async function stopCommand(options = {}) {
13
+ const spinner = (0, ora_1.default)('Stopping remote CLI service...').start();
14
+ try {
15
+ const config = await ConfigManager_1.ConfigManager.initialize();
16
+ // Get service state
17
+ const allConfig = config.getAll();
18
+ const service = allConfig.service;
19
+ // Check if service is running
20
+ if (!service || !service.running) {
21
+ spinner.fail('Service not running');
22
+ return {
23
+ success: false,
24
+ error: 'Service is not running',
25
+ };
26
+ }
27
+ // Handle graceful shutdown
28
+ if (options.graceful) {
29
+ spinner.text = 'Waiting for pending tasks to complete...';
30
+ // In a real implementation, we would wait for tasks to finish
31
+ // For now, just simulate a delay
32
+ await new Promise((resolve) => setTimeout(resolve, 1000));
33
+ }
34
+ // Update service state
35
+ await config.set('service.running', false);
36
+ await config.set('service.stoppedAt', Date.now());
37
+ spinner.succeed('Remote CLI service stopped');
38
+ return {
39
+ success: true,
40
+ graceful: options.graceful,
41
+ force: options.force,
42
+ };
43
+ }
44
+ catch (error) {
45
+ spinner.fail('Failed to stop service');
46
+ return {
47
+ success: false,
48
+ error: error instanceof Error ? error.message : 'Unknown error',
49
+ };
50
+ }
51
+ }
52
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":";;;;;AA0BA,kCA+CC;AAzED,2DAAwD;AACxD,8CAAsB;AAsBtB;;GAEG;AACI,KAAK,UAAU,WAAW,CAC/B,UAA8B,EAAE;IAEhC,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,gCAAgC,CAAC,CAAC,KAAK,EAAE,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,6BAAa,CAAC,UAAU,EAAE,CAAC;QAEhD,oBAAoB;QACpB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QAElC,8BAA8B;QAC9B,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACpC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,wBAAwB;aAChC,CAAC;QACJ,CAAC;QAED,2BAA2B;QAC3B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,GAAG,0CAA0C,CAAC;YAC1D,8DAA8D;YAC9D,iCAAiC;YACjC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,uBAAuB;QACvB,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAElD,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAE9C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvC,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"}
@@ -0,0 +1,109 @@
1
+ import { Config } from '../types/config';
2
+ /**
3
+ * Configuration Manager
4
+ * Responsible for reading, writing and managing configuration files
5
+ */
6
+ export declare class ConfigManager {
7
+ private config;
8
+ private configDir;
9
+ private configFile;
10
+ private constructor();
11
+ /**
12
+ * Initialize configuration manager
13
+ * @returns ConfigManager instance
14
+ */
15
+ static initialize(): Promise<ConfigManager>;
16
+ /**
17
+ * Validate configuration structure
18
+ * @param config Configuration object
19
+ * @returns Whether it is valid
20
+ */
21
+ private static isValidConfig;
22
+ /**
23
+ * Get current configuration
24
+ * @returns Configuration object (deep copy)
25
+ */
26
+ getConfig(): Config;
27
+ /**
28
+ * Get configuration directory path
29
+ * @returns Configuration directory path
30
+ */
31
+ getConfigDir(): string;
32
+ /**
33
+ * Get configuration file path
34
+ * @returns Configuration file path
35
+ */
36
+ getConfigFile(): string;
37
+ /**
38
+ * Save configuration to file
39
+ */
40
+ private saveConfig;
41
+ /**
42
+ * Add allowed directory
43
+ * @param directory Directory path (supports ~ and relative paths)
44
+ */
45
+ addAllowedDirectory(directory: string): Promise<void>;
46
+ /**
47
+ * Remove allowed directory
48
+ * @param directory Directory path
49
+ */
50
+ removeAllowedDirectory(directory: string): Promise<void>;
51
+ /**
52
+ * Add denied command
53
+ * @param command Command pattern
54
+ */
55
+ addDeniedCommand(command: string): Promise<void>;
56
+ /**
57
+ * Remove denied command
58
+ * @param command Command pattern
59
+ */
60
+ removeDeniedCommand(command: string): Promise<void>;
61
+ /**
62
+ * Update server URL
63
+ * @param url WebSocket server URL
64
+ */
65
+ updateServerUrl(url: string): Promise<void>;
66
+ /**
67
+ * Update maximum concurrent tasks
68
+ * @param max Maximum concurrent tasks
69
+ */
70
+ updateMaxConcurrentTasks(max: number): Promise<void>;
71
+ /**
72
+ * Reset configuration to defaults
73
+ */
74
+ resetToDefaults(): Promise<void>;
75
+ /**
76
+ * Export configuration as JSON string
77
+ * @returns JSON string
78
+ */
79
+ exportConfig(): string;
80
+ /**
81
+ * Import configuration from JSON string
82
+ * @param json JSON string
83
+ */
84
+ importConfig(json: string): Promise<void>;
85
+ /**
86
+ * Check if configuration key exists
87
+ * @param keyPath Key path (supports dot-separated nested paths)
88
+ * @returns Whether it exists
89
+ */
90
+ has(keyPath: string): boolean;
91
+ /**
92
+ * Get configuration value
93
+ * @param keyPath Key path (supports dot-separated nested paths, e.g. 'security.allowedDirectories')
94
+ * @returns Configuration value
95
+ */
96
+ get(keyPath: string): any;
97
+ /**
98
+ * Set configuration value
99
+ * @param keyPath Key path (supports dot-separated nested paths)
100
+ * @param value Configuration value
101
+ */
102
+ set(keyPath: string, value: any): Promise<void>;
103
+ /**
104
+ * Get all configuration (alias for getConfig)
105
+ * @returns Configuration object (deep copy)
106
+ */
107
+ getAll(): Config;
108
+ }
109
+ //# sourceMappingURL=ConfigManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAkB,MAAM,iBAAiB,CAAC;AAEzD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO;IAMP;;;OAGG;WACU,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IA8BjD;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAiB5B;;;OAGG;IACH,SAAS,IAAI,MAAM;IAInB;;;OAGG;IACH,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;YACW,UAAU;IAIxB;;;OAGG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3D;;;OAGG;IACG,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9D;;;OAGG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtD;;;OAGG;IACG,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD;;;OAGG;IACG,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjD;;;OAGG;IACG,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1D;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtC;;;OAGG;IACH,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/C;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7B;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG;IAczB;;;;OAIG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBrD;;;OAGG;IACH,MAAM,IAAI,MAAM;CAGjB"}