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.
- package/.claude/settings.local.json +7 -0
- package/.dockerignore +21 -0
- package/.env.example +31 -0
- package/.eslintrc.json +26 -0
- package/.prettierrc.json +9 -0
- package/CHANGELOG.md +93 -0
- package/Dockerfile +47 -0
- package/README.md +408 -0
- package/build.sh +33 -0
- package/dist/ai/ai-orchestrator.d.ts +11 -0
- package/dist/ai/ai-orchestrator.d.ts.map +1 -0
- package/dist/ai/ai-orchestrator.js +85 -0
- package/dist/ai/ai-orchestrator.js.map +1 -0
- package/dist/ai/cli-client.d.ts +17 -0
- package/dist/ai/cli-client.d.ts.map +1 -0
- package/dist/ai/cli-client.js +239 -0
- package/dist/ai/cli-client.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +33 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +7 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +52 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +205 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/start.d.ts +6 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +49 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +48 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config/default.d.ts +5 -0
- package/dist/config/default.d.ts.map +1 -0
- package/dist/config/default.js +22 -0
- package/dist/config/default.js.map +1 -0
- package/dist/healthcheck/gateway-monitor.d.ts +19 -0
- package/dist/healthcheck/gateway-monitor.d.ts.map +1 -0
- package/dist/healthcheck/gateway-monitor.js +116 -0
- package/dist/healthcheck/gateway-monitor.js.map +1 -0
- package/dist/healthcheck/health-checker.d.ts +11 -0
- package/dist/healthcheck/health-checker.d.ts.map +1 -0
- package/dist/healthcheck/health-checker.js +60 -0
- package/dist/healthcheck/health-checker.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/recovery/auto-fixer.d.ts +16 -0
- package/dist/recovery/auto-fixer.d.ts.map +1 -0
- package/dist/recovery/auto-fixer.js +162 -0
- package/dist/recovery/auto-fixer.js.map +1 -0
- package/dist/recovery/change-recorder.d.ts +8 -0
- package/dist/recovery/change-recorder.d.ts.map +1 -0
- package/dist/recovery/change-recorder.js +41 -0
- package/dist/recovery/change-recorder.js.map +1 -0
- package/dist/setup/config-initializer.d.ts +13 -0
- package/dist/setup/config-initializer.d.ts.map +1 -0
- package/dist/setup/config-initializer.js +46 -0
- package/dist/setup/config-initializer.js.map +1 -0
- package/dist/setup/config-loader.d.ts +9 -0
- package/dist/setup/config-loader.d.ts.map +1 -0
- package/dist/setup/config-loader.js +17 -0
- package/dist/setup/config-loader.js.map +1 -0
- package/dist/setup/git-initializer.d.ts +15 -0
- package/dist/setup/git-initializer.d.ts.map +1 -0
- package/dist/setup/git-initializer.js +189 -0
- package/dist/setup/git-initializer.js.map +1 -0
- package/dist/setup/safe-config-generator.d.ts +9 -0
- package/dist/setup/safe-config-generator.d.ts.map +1 -0
- package/dist/setup/safe-config-generator.js +85 -0
- package/dist/setup/safe-config-generator.js.map +1 -0
- package/dist/types/index.d.ts +60 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/executor.d.ts +17 -0
- package/dist/utils/executor.d.ts.map +1 -0
- package/dist/utils/executor.js +57 -0
- package/dist/utils/executor.js.map +1 -0
- package/dist/utils/git-manager.d.ts +14 -0
- package/dist/utils/git-manager.d.ts.map +1 -0
- package/dist/utils/git-manager.js +116 -0
- package/dist/utils/git-manager.js.map +1 -0
- package/dist/utils/github-cli.d.ts +9 -0
- package/dist/utils/github-cli.d.ts.map +1 -0
- package/dist/utils/github-cli.js +31 -0
- package/dist/utils/github-cli.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +26 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +6 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +19 -0
- package/dist/utils/paths.js.map +1 -0
- package/docker-compose.yml +43 -0
- package/nodemon.json +9 -0
- package/package.json +59 -0
- package/prompts/fix-openclaw.md +202 -0
- package/scripts/setup.sh +105 -0
- package/src/ai/ai-orchestrator.ts +95 -0
- package/src/ai/cli-client.ts +296 -0
- package/src/cli.ts +40 -0
- package/src/commands/config.ts +57 -0
- package/src/commands/init.ts +239 -0
- package/src/commands/start.ts +75 -0
- package/src/commands/status.ts +79 -0
- package/src/config/default.ts +25 -0
- package/src/healthcheck/gateway-monitor.ts +137 -0
- package/src/healthcheck/health-checker.ts +71 -0
- package/src/index.ts +48 -0
- package/src/recovery/auto-fixer.ts +184 -0
- package/src/recovery/change-recorder.ts +46 -0
- package/src/setup/config-initializer.ts +63 -0
- package/src/setup/config-loader.ts +25 -0
- package/src/setup/git-initializer.ts +203 -0
- package/src/setup/safe-config-generator.ts +100 -0
- package/src/types/index.ts +67 -0
- package/src/utils/executor.ts +75 -0
- package/src/utils/git-manager.ts +121 -0
- package/src/utils/github-cli.ts +37 -0
- package/src/utils/logger.ts +39 -0
- package/src/utils/paths.ts +25 -0
- 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":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -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
|
package/dist/cli.js.map
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|