openclaw-watcher 0.0.1

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 (130) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.dockerignore +21 -0
  3. package/.env.example +31 -0
  4. package/.eslintrc.json +26 -0
  5. package/.prettierrc.json +9 -0
  6. package/CHANGELOG.md +93 -0
  7. package/Dockerfile +47 -0
  8. package/README.md +408 -0
  9. package/build.sh +33 -0
  10. package/dist/ai/ai-orchestrator.d.ts +11 -0
  11. package/dist/ai/ai-orchestrator.d.ts.map +1 -0
  12. package/dist/ai/ai-orchestrator.js +85 -0
  13. package/dist/ai/ai-orchestrator.js.map +1 -0
  14. package/dist/ai/cli-client.d.ts +17 -0
  15. package/dist/ai/cli-client.d.ts.map +1 -0
  16. package/dist/ai/cli-client.js +239 -0
  17. package/dist/ai/cli-client.js.map +1 -0
  18. package/dist/cli.d.ts +3 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +33 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/commands/config.d.ts +7 -0
  23. package/dist/commands/config.d.ts.map +1 -0
  24. package/dist/commands/config.js +52 -0
  25. package/dist/commands/config.js.map +1 -0
  26. package/dist/commands/init.d.ts +6 -0
  27. package/dist/commands/init.d.ts.map +1 -0
  28. package/dist/commands/init.js +205 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/start.d.ts +6 -0
  31. package/dist/commands/start.d.ts.map +1 -0
  32. package/dist/commands/start.js +49 -0
  33. package/dist/commands/start.js.map +1 -0
  34. package/dist/commands/status.d.ts +2 -0
  35. package/dist/commands/status.d.ts.map +1 -0
  36. package/dist/commands/status.js +48 -0
  37. package/dist/commands/status.js.map +1 -0
  38. package/dist/config/default.d.ts +5 -0
  39. package/dist/config/default.d.ts.map +1 -0
  40. package/dist/config/default.js +22 -0
  41. package/dist/config/default.js.map +1 -0
  42. package/dist/healthcheck/gateway-monitor.d.ts +19 -0
  43. package/dist/healthcheck/gateway-monitor.d.ts.map +1 -0
  44. package/dist/healthcheck/gateway-monitor.js +116 -0
  45. package/dist/healthcheck/gateway-monitor.js.map +1 -0
  46. package/dist/healthcheck/health-checker.d.ts +11 -0
  47. package/dist/healthcheck/health-checker.d.ts.map +1 -0
  48. package/dist/healthcheck/health-checker.js +60 -0
  49. package/dist/healthcheck/health-checker.js.map +1 -0
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +39 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/recovery/auto-fixer.d.ts +16 -0
  55. package/dist/recovery/auto-fixer.d.ts.map +1 -0
  56. package/dist/recovery/auto-fixer.js +162 -0
  57. package/dist/recovery/auto-fixer.js.map +1 -0
  58. package/dist/recovery/change-recorder.d.ts +8 -0
  59. package/dist/recovery/change-recorder.d.ts.map +1 -0
  60. package/dist/recovery/change-recorder.js +41 -0
  61. package/dist/recovery/change-recorder.js.map +1 -0
  62. package/dist/setup/config-initializer.d.ts +13 -0
  63. package/dist/setup/config-initializer.d.ts.map +1 -0
  64. package/dist/setup/config-initializer.js +46 -0
  65. package/dist/setup/config-initializer.js.map +1 -0
  66. package/dist/setup/config-loader.d.ts +9 -0
  67. package/dist/setup/config-loader.d.ts.map +1 -0
  68. package/dist/setup/config-loader.js +17 -0
  69. package/dist/setup/config-loader.js.map +1 -0
  70. package/dist/setup/git-initializer.d.ts +15 -0
  71. package/dist/setup/git-initializer.d.ts.map +1 -0
  72. package/dist/setup/git-initializer.js +189 -0
  73. package/dist/setup/git-initializer.js.map +1 -0
  74. package/dist/setup/safe-config-generator.d.ts +9 -0
  75. package/dist/setup/safe-config-generator.d.ts.map +1 -0
  76. package/dist/setup/safe-config-generator.js +85 -0
  77. package/dist/setup/safe-config-generator.js.map +1 -0
  78. package/dist/types/index.d.ts +60 -0
  79. package/dist/types/index.d.ts.map +1 -0
  80. package/dist/types/index.js +2 -0
  81. package/dist/types/index.js.map +1 -0
  82. package/dist/utils/executor.d.ts +17 -0
  83. package/dist/utils/executor.d.ts.map +1 -0
  84. package/dist/utils/executor.js +57 -0
  85. package/dist/utils/executor.js.map +1 -0
  86. package/dist/utils/git-manager.d.ts +14 -0
  87. package/dist/utils/git-manager.d.ts.map +1 -0
  88. package/dist/utils/git-manager.js +116 -0
  89. package/dist/utils/git-manager.js.map +1 -0
  90. package/dist/utils/github-cli.d.ts +9 -0
  91. package/dist/utils/github-cli.d.ts.map +1 -0
  92. package/dist/utils/github-cli.js +31 -0
  93. package/dist/utils/github-cli.js.map +1 -0
  94. package/dist/utils/logger.d.ts +4 -0
  95. package/dist/utils/logger.d.ts.map +1 -0
  96. package/dist/utils/logger.js +26 -0
  97. package/dist/utils/logger.js.map +1 -0
  98. package/dist/utils/paths.d.ts +6 -0
  99. package/dist/utils/paths.d.ts.map +1 -0
  100. package/dist/utils/paths.js +19 -0
  101. package/dist/utils/paths.js.map +1 -0
  102. package/docker-compose.yml +43 -0
  103. package/nodemon.json +9 -0
  104. package/package.json +59 -0
  105. package/prompts/fix-openclaw.md +202 -0
  106. package/scripts/setup.sh +105 -0
  107. package/src/ai/ai-orchestrator.ts +95 -0
  108. package/src/ai/cli-client.ts +296 -0
  109. package/src/cli.ts +40 -0
  110. package/src/commands/config.ts +57 -0
  111. package/src/commands/init.ts +239 -0
  112. package/src/commands/start.ts +75 -0
  113. package/src/commands/status.ts +79 -0
  114. package/src/config/default.ts +25 -0
  115. package/src/healthcheck/gateway-monitor.ts +137 -0
  116. package/src/healthcheck/health-checker.ts +71 -0
  117. package/src/index.ts +48 -0
  118. package/src/recovery/auto-fixer.ts +184 -0
  119. package/src/recovery/change-recorder.ts +46 -0
  120. package/src/setup/config-initializer.ts +63 -0
  121. package/src/setup/config-loader.ts +25 -0
  122. package/src/setup/git-initializer.ts +203 -0
  123. package/src/setup/safe-config-generator.ts +100 -0
  124. package/src/types/index.ts +67 -0
  125. package/src/utils/executor.ts +75 -0
  126. package/src/utils/git-manager.ts +121 -0
  127. package/src/utils/github-cli.ts +37 -0
  128. package/src/utils/logger.ts +39 -0
  129. package/src/utils/paths.ts +25 -0
  130. package/tsconfig.json +29 -0
@@ -0,0 +1,85 @@
1
+ import { CLIClient } from './cli-client.js';
2
+ import logger from '../utils/logger.js';
3
+ export class AIOrchestrator {
4
+ primaryClient;
5
+ fallbackClient;
6
+ configPath;
7
+ constructor(aiConfig, recoveryConfig) {
8
+ this.configPath = recoveryConfig.openclawConfigPath;
9
+ // Primary AI client
10
+ this.primaryClient = new CLIClient(aiConfig.provider, aiConfig.timeout);
11
+ // Fallback to alternative provider
12
+ const fallbackProvider = aiConfig.provider === 'claude' ? 'kimi' : 'claude';
13
+ this.fallbackClient = new CLIClient(fallbackProvider, aiConfig.timeout);
14
+ }
15
+ async initialize() {
16
+ logger.info('Initializing AI orchestrator');
17
+ try {
18
+ await this.primaryClient.initialize();
19
+ logger.info('Primary AI client initialized');
20
+ }
21
+ catch (error) {
22
+ logger.error('Failed to initialize primary AI client', {
23
+ error: error.message,
24
+ });
25
+ throw error;
26
+ }
27
+ // Try to initialize fallback
28
+ try {
29
+ if (this.fallbackClient) {
30
+ await this.fallbackClient.initialize();
31
+ logger.info('Fallback AI client initialized');
32
+ }
33
+ }
34
+ catch (error) {
35
+ logger.warn('Failed to initialize fallback AI client', {
36
+ error: error.message,
37
+ });
38
+ // Non-critical, continue
39
+ }
40
+ }
41
+ async diagnoseAndFix(error) {
42
+ try {
43
+ // Check if primary client is available
44
+ const isPrimaryAvailable = await this.primaryClient.testConnection();
45
+ if (isPrimaryAvailable) {
46
+ return await this.primaryClient.diagnoseAndFix(error, this.configPath);
47
+ }
48
+ else {
49
+ logger.warn('Primary AI CLI not available, trying fallback');
50
+ return await this.fallbackDiagnosis(error);
51
+ }
52
+ }
53
+ catch (primaryError) {
54
+ logger.error('Primary AI diagnosis and fix failed, attempting fallback', {
55
+ error: primaryError.message,
56
+ });
57
+ return await this.fallbackDiagnosis(error);
58
+ }
59
+ }
60
+ async fallbackDiagnosis(error) {
61
+ if (!this.fallbackClient) {
62
+ throw new Error('No fallback AI client available');
63
+ }
64
+ try {
65
+ const isFallbackAvailable = await this.fallbackClient.testConnection();
66
+ if (!isFallbackAvailable) {
67
+ throw new Error('Fallback AI CLI not available');
68
+ }
69
+ logger.info('Using fallback AI for diagnosis and fix');
70
+ return await this.fallbackClient.diagnoseAndFix(error, this.configPath);
71
+ }
72
+ catch (fallbackError) {
73
+ logger.error('Fallback AI also failed', { error: fallbackError.message });
74
+ // Return basic diagnosis if all else fails
75
+ return {
76
+ issue: 'AI diagnosis and fix unavailable',
77
+ rootCause: `All AI providers failed. Manual intervention required.`,
78
+ suggestedFix: 'Attempt basic restart and check logs manually',
79
+ commands: ['openclaw gateway restart', 'openclaw gateway status'],
80
+ confidence: 0.1,
81
+ };
82
+ }
83
+ }
84
+ }
85
+ //# sourceMappingURL=ai-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-orchestrator.js","sourceRoot":"","sources":["../../src/ai/ai-orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { DiagnosisResult } from '../types';
2
+ export type AIProvider = 'claude' | 'kimi';
3
+ export declare class CLIClient {
4
+ private provider;
5
+ private timeout;
6
+ private systemPrompt;
7
+ constructor(provider: AIProvider, timeout?: number);
8
+ initialize(): Promise<void>;
9
+ diagnoseAndFix(error: string, configPath: string): Promise<DiagnosisResult>;
10
+ private gatherContext;
11
+ private createTaskDescription;
12
+ private executeAICLI;
13
+ private parseFixSummary;
14
+ private convertToDiagnosisResult;
15
+ testConnection(): Promise<boolean>;
16
+ }
17
+ //# sourceMappingURL=cli-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-client.d.ts","sourceRoot":"","sources":["../../src/ai/cli-client.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAkB1C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3C,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAc;gBAEtB,QAAQ,EAAE,UAAU,EAAE,OAAO,GAAE,MAAe;IAKpD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YA8BnE,aAAa;IA8B3B,OAAO,CAAC,qBAAqB;YA+Bf,YAAY;IAuE1B,OAAO,CAAC,eAAe;IAsDvB,OAAO,CAAC,wBAAwB;IAiB1B,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAezC"}
@@ -0,0 +1,239 @@
1
+ import { exec, spawn } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import fs from 'fs/promises';
4
+ import path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import logger from '../utils/logger.js';
7
+ import { executor } from '../utils/executor.js';
8
+ const execAsync = promisify(exec);
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ export class CLIClient {
11
+ provider;
12
+ timeout;
13
+ systemPrompt = '';
14
+ constructor(provider, timeout = 300000) {
15
+ this.provider = provider;
16
+ this.timeout = timeout;
17
+ }
18
+ async initialize() {
19
+ const promptPath = path.join(__dirname, '../../prompts/fix-openclaw.md');
20
+ try {
21
+ this.systemPrompt = await fs.readFile(promptPath, 'utf-8');
22
+ logger.info('System prompt loaded', { provider: this.provider });
23
+ }
24
+ catch (error) {
25
+ logger.error('Failed to load system prompt', { error: error.message });
26
+ throw error;
27
+ }
28
+ }
29
+ async diagnoseAndFix(error, configPath) {
30
+ logger.info('Starting AI-powered diagnosis and fix', {
31
+ provider: this.provider,
32
+ configPath,
33
+ });
34
+ try {
35
+ // Gather context
36
+ const context = await this.gatherContext(error);
37
+ // Create task description
38
+ const taskDescription = this.createTaskDescription(error, context, configPath);
39
+ // Execute AI CLI
40
+ const output = await this.executeAICLI(taskDescription, configPath);
41
+ // Parse fix summary
42
+ const summary = this.parseFixSummary(output);
43
+ // Convert to DiagnosisResult format
44
+ const diagnosis = this.convertToDiagnosisResult(summary);
45
+ logger.info('AI diagnosis and fix completed', diagnosis);
46
+ return diagnosis;
47
+ }
48
+ catch (error) {
49
+ logger.error('AI diagnosis and fix failed', { error: error.message });
50
+ throw error;
51
+ }
52
+ }
53
+ async gatherContext(_error) {
54
+ const parts = [];
55
+ // Get gateway status
56
+ const statusResult = await executor.getGatewayStatus();
57
+ if (statusResult.stdout) {
58
+ parts.push(`Gateway Status:\n${statusResult.stdout}`);
59
+ }
60
+ if (statusResult.stderr) {
61
+ parts.push(`Gateway Status Error:\n${statusResult.stderr}`);
62
+ }
63
+ // Get recent logs
64
+ const logsResult = await executor.getGatewayLogs(50);
65
+ if (logsResult.stdout) {
66
+ parts.push(`Recent Logs:\n${logsResult.stdout}`);
67
+ }
68
+ // Attempt restart to get detailed error
69
+ const restartResult = await executor.restartGateway();
70
+ if (restartResult.stderr) {
71
+ parts.push(`Restart Error:\n${restartResult.stderr}`);
72
+ }
73
+ if (restartResult.stdout) {
74
+ parts.push(`Restart Output:\n${restartResult.stdout}`);
75
+ }
76
+ return parts.join('\n\n');
77
+ }
78
+ createTaskDescription(error, context, configPath) {
79
+ return `${this.systemPrompt}
80
+
81
+ ---
82
+
83
+ ## 当前问题
84
+
85
+ **错误俔息**: ${error}
86
+
87
+ **OpenClaw é…ē½®č·Æå¾„**: ${configPath}
88
+
89
+ **äøŠäø‹ę–‡äæ”ęÆ**:
90
+ ${context}
91
+
92
+ ---
93
+
94
+ čÆ·ē«‹å³å¼€å§‹čÆŠę–­å’Œäæ®å¤čæ™äøŖé—®é¢˜ć€‚č®°ä½ļ¼š
95
+
96
+ 1. ē›“ęŽ„äæ®å¤ļ¼Œäøč¦åŖē»™å»ŗč®®
97
+ 2. ä½æē”Øå·„å…·čÆ»å–ć€ē¼–č¾‘é…ē½®ę–‡ä»¶
98
+ 3. ę‰§č”Œåæ…č¦ēš„å‘½ä»¤
99
+ 4. éŖŒčÆäæ®å¤ę˜Æå¦ęˆåŠŸ
100
+ 5. å®ŒęˆåŽč¾“å‡ŗę ‡å‡†ę ¼å¼ēš„ JSON ę‘˜č¦
101
+
102
+ å¼€å§‹å·„ä½œļ¼`;
103
+ }
104
+ async executeAICLI(task, workingDir) {
105
+ const cliCommand = this.provider === 'claude' ? 'claude' : 'kimi';
106
+ logger.info('Executing AI CLI', {
107
+ provider: this.provider,
108
+ workingDir,
109
+ });
110
+ return new Promise((resolve, reject) => {
111
+ const child = spawn(cliCommand, ['--dangerously-skip-permissions'], {
112
+ cwd: workingDir,
113
+ env: {
114
+ ...process.env,
115
+ FORCE_COLOR: '0',
116
+ },
117
+ });
118
+ const stdoutChunks = [];
119
+ const stderrChunks = [];
120
+ let settled = false;
121
+ const timer = setTimeout(() => {
122
+ if (!settled) {
123
+ settled = true;
124
+ child.kill('SIGTERM');
125
+ reject(new Error(`${this.provider} CLI timed out after ${this.timeout}ms`));
126
+ }
127
+ }, this.timeout);
128
+ child.stdout.on('data', (chunk) => stdoutChunks.push(chunk));
129
+ child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
130
+ child.on('error', (err) => {
131
+ if (!settled) {
132
+ settled = true;
133
+ clearTimeout(timer);
134
+ reject(new Error(`${this.provider} CLI spawn error: ${err.message}`));
135
+ }
136
+ });
137
+ child.on('close', (code) => {
138
+ if (!settled) {
139
+ settled = true;
140
+ clearTimeout(timer);
141
+ const stdout = Buffer.concat(stdoutChunks).toString();
142
+ const stderr = Buffer.concat(stderrChunks).toString();
143
+ const output = stdout + stderr;
144
+ if (code !== 0) {
145
+ logger.error('AI CLI execution failed', {
146
+ exitCode: code,
147
+ stderrPreview: stderr.substring(0, 200),
148
+ });
149
+ reject(new Error(`${this.provider} CLI exited with code ${code}`));
150
+ return;
151
+ }
152
+ logger.info('AI CLI execution completed', {
153
+ outputLength: output.length,
154
+ hasStderr: !!stderr,
155
+ });
156
+ resolve(output);
157
+ }
158
+ });
159
+ // Pipe task via stdin instead of embedding in command
160
+ child.stdin.write(task);
161
+ child.stdin.end();
162
+ });
163
+ }
164
+ parseFixSummary(output) {
165
+ try {
166
+ // Extract JSON summary between markers
167
+ const startMarker = '===FIX_SUMMARY_START===';
168
+ const endMarker = '===FIX_SUMMARY_END===';
169
+ const startIndex = output.indexOf(startMarker);
170
+ const endIndex = output.indexOf(endMarker);
171
+ if (startIndex === -1 || endIndex === -1) {
172
+ throw new Error('Fix summary markers not found in AI output');
173
+ }
174
+ const jsonStr = output
175
+ .substring(startIndex + startMarker.length, endIndex)
176
+ .trim();
177
+ // Remove markdown code blocks if present
178
+ const cleanJson = jsonStr.replace(/^```json\n?/, '').replace(/\n?```$/, '');
179
+ const summary = JSON.parse(cleanJson);
180
+ // Validate required fields
181
+ if (!summary.issue ||
182
+ !summary.rootCause ||
183
+ !summary.fixApplied ||
184
+ typeof summary.success !== 'boolean') {
185
+ throw new Error('Fix summary missing required fields');
186
+ }
187
+ logger.info('Fix summary parsed successfully', { success: summary.success });
188
+ return summary;
189
+ }
190
+ catch (error) {
191
+ logger.error('Failed to parse fix summary', {
192
+ error: error.message,
193
+ outputPreview: output.substring(0, 500),
194
+ });
195
+ // Return a fallback summary
196
+ return {
197
+ issue: 'Parse error',
198
+ rootCause: `Failed to parse AI output: ${error.message}`,
199
+ fixApplied: 'AI attempted fixes but summary parsing failed',
200
+ filesModified: [],
201
+ commandsExecuted: [],
202
+ verificationResult: 'Unknown - could not parse verification result',
203
+ success: false,
204
+ confidence: 0.3,
205
+ };
206
+ }
207
+ }
208
+ convertToDiagnosisResult(summary) {
209
+ return {
210
+ issue: summary.issue,
211
+ rootCause: summary.rootCause,
212
+ suggestedFix: summary.fixApplied,
213
+ commands: summary.commandsExecuted,
214
+ configChanges: summary.filesModified.map((file) => ({
215
+ file,
216
+ path: 'auto-modified',
217
+ oldValue: 'see git diff',
218
+ newValue: 'see git diff',
219
+ reason: summary.fixApplied,
220
+ })),
221
+ confidence: summary.confidence,
222
+ };
223
+ }
224
+ async testConnection() {
225
+ try {
226
+ const command = this.provider === 'claude' ? 'claude --version' : 'kimi --version';
227
+ await execAsync(command, { timeout: 5000 });
228
+ logger.info(`${this.provider} CLI is available`);
229
+ return true;
230
+ }
231
+ catch (error) {
232
+ logger.warn(`${this.provider} CLI is not available`, {
233
+ error: error.message,
234
+ });
235
+ return false;
236
+ }
237
+ }
238
+ }
239
+ //# sourceMappingURL=cli-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-client.js","sourceRoot":"","sources":["../../src/ai/cli-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAe/D,MAAM,OAAO,SAAS;IACZ,QAAQ,CAAa;IACrB,OAAO,CAAS;IAChB,YAAY,GAAW,EAAE,CAAC;IAElC,YAAY,QAAoB,EAAE,UAAkB,MAAM;QACxD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,+BAA+B,CAAC,CAAC;QACzE,IAAI,CAAC;YACH,IAAI,CAAC,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACvE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,UAAkB;QACpD,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE;YACnD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU;SACX,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,iBAAiB;YACjB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAEhD,0BAA0B;YAC1B,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;YAE/E,iBAAiB;YACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YAEpE,oBAAoB;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAE7C,oCAAoC;YACpC,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAEzD,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,SAAS,CAAC,CAAC;YACzD,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,MAAc;QACxC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,qBAAqB;QACrB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QACvD,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,oBAAoB,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,0BAA0B,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,kBAAkB;QAClB,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACrD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,iBAAiB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,wCAAwC;QACxC,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC;QACtD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,mBAAmB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,oBAAoB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAEO,qBAAqB,CAC3B,KAAa,EACb,OAAe,EACf,UAAkB;QAElB,OAAO,GAAG,IAAI,CAAC,YAAY;;;;;;YAMnB,KAAK;;qBAEI,UAAU;;;EAG7B,OAAO;;;;;;;;;;;;MAYH,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,UAAkB;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAElE,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU;SACX,CAAC,CAAC;QAEH,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,gCAAgC,CAAC,EAAE;gBAClE,GAAG,EAAE,UAAU;gBACf,GAAG,EAAE;oBACH,GAAG,OAAO,CAAC,GAAG;oBACd,WAAW,EAAE,GAAG;iBACjB;aACF,CAAC,CAAC;YAEH,MAAM,YAAY,GAAa,EAAE,CAAC;YAClC,MAAM,YAAY,GAAa,EAAE,CAAC;YAClC,IAAI,OAAO,GAAG,KAAK,CAAC;YAEpB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,GAAG,IAAI,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACtB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,wBAAwB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7D,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAE7D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,GAAG,IAAI,CAAC;oBACf,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,qBAAqB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,GAAG,IAAI,CAAC;oBACf,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACtD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACtD,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;oBAE/B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;wBACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;4BACtC,QAAQ,EAAE,IAAI;4BACd,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;yBACxC,CAAC,CAAC;wBACH,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,yBAAyB,IAAI,EAAE,CAAC,CAAC,CAAC;wBACnE,OAAO;oBACT,CAAC;oBAED,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;wBACxC,YAAY,EAAE,MAAM,CAAC,MAAM;wBAC3B,SAAS,EAAE,CAAC,CAAC,MAAM;qBACpB,CAAC,CAAC;oBACH,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,sDAAsD;YACtD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe,CAAC,MAAc;QACpC,IAAI,CAAC;YACH,uCAAuC;YACvC,MAAM,WAAW,GAAG,yBAAyB,CAAC;YAC9C,MAAM,SAAS,GAAG,uBAAuB,CAAC;YAE1C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAE3C,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,OAAO,GAAG,MAAM;iBACnB,SAAS,CAAC,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC;iBACpD,IAAI,EAAE,CAAC;YAEV,yCAAyC;YACzC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAE5E,MAAM,OAAO,GAAe,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAElD,2BAA2B;YAC3B,IACE,CAAC,OAAO,CAAC,KAAK;gBACd,CAAC,OAAO,CAAC,SAAS;gBAClB,CAAC,OAAO,CAAC,UAAU;gBACnB,OAAO,OAAO,CAAC,OAAO,KAAK,SAAS,EACpC,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;gBAC1C,KAAK,EAAE,KAAK,CAAC,OAAO;gBACpB,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;aACxC,CAAC,CAAC;YAEH,4BAA4B;YAC5B,OAAO;gBACL,KAAK,EAAE,aAAa;gBACpB,SAAS,EAAE,8BAA8B,KAAK,CAAC,OAAO,EAAE;gBACxD,UAAU,EAAE,+CAA+C;gBAC3D,aAAa,EAAE,EAAE;gBACjB,gBAAgB,EAAE,EAAE;gBACpB,kBAAkB,EAAE,+CAA+C;gBACnE,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,GAAG;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,wBAAwB,CAAC,OAAmB;QAClD,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,YAAY,EAAE,OAAO,CAAC,UAAU;YAChC,QAAQ,EAAE,OAAO,CAAC,gBAAgB;YAClC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAClD,IAAI;gBACJ,IAAI,EAAE,eAAe;gBACrB,QAAQ,EAAE,cAAc;gBACxB,QAAQ,EAAE,cAAc;gBACxB,MAAM,EAAE,OAAO,CAAC,UAAU;aAC3B,CAAC,CAAC;YACH,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC;YACH,MAAM,OAAO,GACX,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC;YAErE,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,mBAAmB,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,uBAAuB,EAAE;gBACnD,KAAK,EAAE,KAAK,CAAC,OAAO;aACrB,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { initCommand } from './commands/init.js';
4
+ import { startCommand } from './commands/start.js';
5
+ import { statusCommand } from './commands/status.js';
6
+ import { configCommand } from './commands/config.js';
7
+ const program = new Command();
8
+ program
9
+ .name('openclaw-watcher')
10
+ .description('AI-powered automated health monitoring and self-healing for OpenClaw Gateway')
11
+ .version('2.0.0');
12
+ program
13
+ .command('init')
14
+ .description('Initialize OpenClaw Watcher with interactive configuration')
15
+ .option('--no-git', 'Skip Git repository initialization')
16
+ .action(initCommand);
17
+ program
18
+ .command('start')
19
+ .description('Start health monitoring and auto-repair service')
20
+ .option('-d, --daemon', 'Run as daemon process')
21
+ .action(startCommand);
22
+ program
23
+ .command('status')
24
+ .description('Show current monitoring status')
25
+ .action(statusCommand);
26
+ program
27
+ .command('config')
28
+ .description('Manage configuration')
29
+ .option('-s, --show', 'Show current configuration')
30
+ .option('-e, --edit', 'Edit configuration file')
31
+ .action(configCommand);
32
+ program.parse();
33
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,8EAA8E,CAAC;KAC3F,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,UAAU,EAAE,oCAAoC,CAAC;KACxD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,cAAc,EAAE,uBAAuB,CAAC;KAC/C,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,YAAY,EAAE,4BAA4B,CAAC;KAClD,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC;KAC/C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface ConfigOptions {
2
+ show?: boolean;
3
+ edit?: boolean;
4
+ }
5
+ export declare function configCommand(options: ConfigOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAQA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,iBA2CzD"}
@@ -0,0 +1,52 @@
1
+ import chalk from 'chalk';
2
+ import { exec } from 'child_process';
3
+ import { promisify } from 'util';
4
+ import { loadConfig, getConfigFilePath } from '../setup/config-loader.js';
5
+ import fs from 'fs/promises';
6
+ const execAsync = promisify(exec);
7
+ export async function configCommand(options) {
8
+ const configPath = getConfigFilePath();
9
+ if (options.show) {
10
+ try {
11
+ const config = await loadConfig();
12
+ if (!config) {
13
+ console.log(chalk.yellow('Configuration not found'));
14
+ return;
15
+ }
16
+ console.log(chalk.bold.cyan('\nšŸ“‹ Current Configuration\n'));
17
+ console.log(JSON.stringify(config, null, 2));
18
+ console.log('');
19
+ }
20
+ catch (error) {
21
+ console.error(chalk.red(`Error: ${error.message}`));
22
+ process.exit(1);
23
+ }
24
+ }
25
+ else if (options.edit) {
26
+ try {
27
+ const editor = process.env.EDITOR || 'vim';
28
+ await execAsync(`${editor} ${configPath}`);
29
+ console.log(chalk.green('āœ“ Configuration updated'));
30
+ }
31
+ catch (error) {
32
+ console.error(chalk.red(`Error: ${error.message}`));
33
+ process.exit(1);
34
+ }
35
+ }
36
+ else {
37
+ // Show config file path
38
+ try {
39
+ await fs.access(configPath);
40
+ console.log(chalk.cyan('Configuration file:'), chalk.white(configPath));
41
+ console.log('');
42
+ console.log(chalk.gray('Use:'));
43
+ console.log(chalk.white(' --show '), chalk.gray('Show current configuration'));
44
+ console.log(chalk.white(' --edit '), chalk.gray('Edit configuration file'));
45
+ }
46
+ catch {
47
+ console.log(chalk.yellow('Configuration not found'));
48
+ console.log(chalk.gray('\nRun: npx openclaw-watcher init'));
49
+ }
50
+ }
51
+ }
52
+ //# 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,6 @@
1
+ interface InitOptions {
2
+ git?: boolean;
3
+ }
4
+ export declare function initCommand(options: InitOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAaA,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,iBA2KrD"}