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
package/dist/index.js ADDED
@@ -0,0 +1,39 @@
1
+ import 'dotenv/config';
2
+ import { GatewayMonitor } from './healthcheck/gateway-monitor.js';
3
+ import { defaultMonitorConfig, defaultAIConfig, defaultRecoveryConfig } from './config/default.js';
4
+ import logger from './utils/logger.js';
5
+ async function main() {
6
+ logger.info('🚀 Starting OpenClaw HealthCheck System');
7
+ logger.info('Configuration loaded', {
8
+ gatewayUrl: defaultMonitorConfig.gatewayUrl,
9
+ checkInterval: defaultMonitorConfig.checkInterval,
10
+ aiProvider: defaultAIConfig.provider,
11
+ gitTracking: defaultRecoveryConfig.useGitTracking,
12
+ });
13
+ const monitor = new GatewayMonitor(defaultMonitorConfig, defaultAIConfig, defaultRecoveryConfig);
14
+ // Handle graceful shutdown
15
+ process.on('SIGINT', () => {
16
+ logger.info('Received SIGINT, shutting down gracefully');
17
+ monitor.stop();
18
+ process.exit(0);
19
+ });
20
+ process.on('SIGTERM', () => {
21
+ logger.info('Received SIGTERM, shutting down gracefully');
22
+ monitor.stop();
23
+ process.exit(0);
24
+ });
25
+ // Start monitoring
26
+ try {
27
+ await monitor.start();
28
+ logger.info('✅ OpenClaw HealthCheck System is running');
29
+ }
30
+ catch (error) {
31
+ logger.error('Failed to start monitoring', { error: error.message });
32
+ process.exit(1);
33
+ }
34
+ }
35
+ main().catch((error) => {
36
+ logger.error('Fatal error', { error: error.message });
37
+ process.exit(1);
38
+ });
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAEvD,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;QAClC,UAAU,EAAE,oBAAoB,CAAC,UAAU;QAC3C,aAAa,EAAE,oBAAoB,CAAC,aAAa;QACjD,UAAU,EAAE,eAAe,CAAC,QAAQ;QACpC,WAAW,EAAE,qBAAqB,CAAC,cAAc;KAClD,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,cAAc,CAChC,oBAAoB,EACpB,eAAe,EACf,qBAAqB,CACtB,CAAC;IAEF,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,mBAAmB;IACnB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { DiagnosisResult, RecoveryResult, RecoveryConfig } from '../types';
2
+ export declare class AutoFixer {
3
+ private changeRecorder;
4
+ private gitManager?;
5
+ private config;
6
+ constructor(config: RecoveryConfig);
7
+ /**
8
+ * Record the fix that AI has already applied
9
+ * AI has already modified files and executed commands
10
+ * We just need to commit to git and record the change
11
+ */
12
+ recordFix(diagnosis: DiagnosisResult): Promise<RecoveryResult>;
13
+ private createCommitMessage;
14
+ private verifyFix;
15
+ }
16
+ //# sourceMappingURL=auto-fixer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fixer.d.ts","sourceRoot":"","sources":["../../src/recovery/auto-fixer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAgB,MAAM,SAAS,CAAC;AAExF,qBAAa,SAAS;IACpB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IASlC;;;;OAIG;IACG,SAAS,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAuGpE,OAAO,CAAC,mBAAmB;YA+Bb,SAAS;CAuBxB"}
@@ -0,0 +1,162 @@
1
+ import { ChangeRecorder } from './change-recorder.js';
2
+ import { GitManager } from '../utils/git-manager.js';
3
+ import { SafeConfigGenerator } from '../setup/safe-config-generator.js';
4
+ import { executor } from '../utils/executor.js';
5
+ import logger from '../utils/logger.js';
6
+ export class AutoFixer {
7
+ changeRecorder;
8
+ gitManager;
9
+ config;
10
+ constructor(config) {
11
+ this.config = config;
12
+ this.changeRecorder = new ChangeRecorder();
13
+ if (config.useGitTracking) {
14
+ this.gitManager = new GitManager(config.openclawConfigPath);
15
+ }
16
+ }
17
+ /**
18
+ * Record the fix that AI has already applied
19
+ * AI has already modified files and executed commands
20
+ * We just need to commit to git and record the change
21
+ */
22
+ async recordFix(diagnosis) {
23
+ logger.info('Recording AI-applied fix', { diagnosis });
24
+ const actions = [];
25
+ const errors = [];
26
+ let gitCommit;
27
+ try {
28
+ // Initialize git if needed
29
+ if (this.gitManager) {
30
+ await this.gitManager.init();
31
+ }
32
+ // AI has already modified files, so we collect what changed
33
+ actions.push('AI completed diagnosis and fix');
34
+ if (diagnosis.configChanges && diagnosis.configChanges.length > 0) {
35
+ actions.push(`Modified ${diagnosis.configChanges.length} configuration files`);
36
+ }
37
+ if (diagnosis.commands && diagnosis.commands.length > 0) {
38
+ actions.push(`Executed ${diagnosis.commands.length} commands`);
39
+ }
40
+ // Commit changes to git
41
+ if (this.gitManager) {
42
+ const commitMessage = this.createCommitMessage(diagnosis);
43
+ try {
44
+ // Update safe config before committing
45
+ logger.info('Updating safe configuration');
46
+ const safeConfigGen = new SafeConfigGenerator(this.config.openclawConfigPath);
47
+ await safeConfigGen.update();
48
+ actions.push('Updated openclaw.safe.json');
49
+ // Get diff to see what actually changed
50
+ const diff = await this.gitManager.getDiff();
51
+ if (diff) {
52
+ // Stage openclaw.safe.json
53
+ gitCommit = await this.gitManager.commit(commitMessage, ['openclaw.safe.json']);
54
+ actions.push(`Committed changes: ${gitCommit}`);
55
+ logger.info('Changes committed to git', { commit: gitCommit });
56
+ // Auto-push to GitHub if enabled
57
+ if (gitCommit && this.config.useGitHubCli) {
58
+ if (await this.gitManager.hasRemote()) {
59
+ const pushed = await this.gitManager.push();
60
+ actions.push(pushed ? 'Pushed to GitHub' : 'GitHub push failed (best-effort)');
61
+ }
62
+ }
63
+ }
64
+ else {
65
+ logger.info('No git changes to commit');
66
+ actions.push('No git changes detected');
67
+ }
68
+ }
69
+ catch (error) {
70
+ logger.error('Git commit failed', { error: error.message });
71
+ errors.push(`Git commit failed: ${error.message}`);
72
+ }
73
+ }
74
+ // Verify the fix by checking gateway status
75
+ const verificationResult = await this.verifyFix();
76
+ if (!verificationResult.success) {
77
+ errors.push(`Verification failed: ${verificationResult.message}`);
78
+ }
79
+ else {
80
+ actions.push(`Verification: ${verificationResult.message}`);
81
+ }
82
+ const success = errors.length === 0 && verificationResult.success;
83
+ const result = {
84
+ success,
85
+ actions,
86
+ errors: errors.length > 0 ? errors : undefined,
87
+ configChanges: diagnosis.configChanges,
88
+ restartRequired: false, // AI should have already restarted if needed
89
+ };
90
+ // Record the change
91
+ const record = {
92
+ timestamp: new Date(),
93
+ trigger: 'ai-auto-fix',
94
+ diagnosis,
95
+ recovery: result,
96
+ gitCommit,
97
+ };
98
+ await this.changeRecorder.record(record);
99
+ logger.info('Fix recording completed', result);
100
+ return result;
101
+ }
102
+ catch (error) {
103
+ logger.error('Fix recording failed', { error: error.message });
104
+ return {
105
+ success: false,
106
+ actions,
107
+ errors: [...errors, `Fatal error: ${error.message}`],
108
+ restartRequired: false,
109
+ };
110
+ }
111
+ }
112
+ createCommitMessage(diagnosis) {
113
+ const lines = [];
114
+ lines.push(`${this.config.gitCommitPrefix} ${diagnosis.issue}`);
115
+ lines.push('');
116
+ lines.push(`Root Cause: ${diagnosis.rootCause}`);
117
+ lines.push(`Fix Applied: ${diagnosis.suggestedFix}`);
118
+ lines.push(`Confidence: ${diagnosis.confidence}`);
119
+ if (diagnosis.configChanges && diagnosis.configChanges.length > 0) {
120
+ lines.push('');
121
+ lines.push('Files Modified:');
122
+ diagnosis.configChanges.forEach((change) => {
123
+ lines.push(`- ${change.file}: ${change.reason}`);
124
+ });
125
+ }
126
+ if (diagnosis.commands && diagnosis.commands.length > 0) {
127
+ lines.push('');
128
+ lines.push('Commands Executed:');
129
+ diagnosis.commands.forEach((cmd) => {
130
+ lines.push(`- ${cmd}`);
131
+ });
132
+ }
133
+ lines.push('');
134
+ lines.push('Applied by: AI Auto-Fix System');
135
+ return lines.join('\n');
136
+ }
137
+ async verifyFix() {
138
+ try {
139
+ // Check gateway status
140
+ const statusResult = await executor.getGatewayStatus();
141
+ if (statusResult.success) {
142
+ return {
143
+ success: true,
144
+ message: 'Gateway is running normally',
145
+ };
146
+ }
147
+ else {
148
+ return {
149
+ success: false,
150
+ message: `Gateway status check failed: ${statusResult.stderr}`,
151
+ };
152
+ }
153
+ }
154
+ catch (error) {
155
+ return {
156
+ success: false,
157
+ message: `Verification error: ${error.message}`,
158
+ };
159
+ }
160
+ }
161
+ }
162
+ //# sourceMappingURL=auto-fixer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fixer.js","sourceRoot":"","sources":["../../src/recovery/auto-fixer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ChangeRecord } from '../types';
2
+ export declare class ChangeRecorder {
3
+ private logFilePath;
4
+ constructor(logFilePath?: string);
5
+ record(record: ChangeRecord): Promise<void>;
6
+ getHistory(limit?: number): Promise<ChangeRecord[]>;
7
+ }
8
+ //# sourceMappingURL=change-recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-recorder.d.ts","sourceRoot":"","sources":["../../src/recovery/change-recorder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,CAAC,EAAE,MAAM;IAI1B,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB3C,UAAU,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAS9D"}
@@ -0,0 +1,41 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import logger from '../utils/logger.js';
4
+ import { getChangesFilePath } from '../utils/paths.js';
5
+ export class ChangeRecorder {
6
+ logFilePath;
7
+ constructor(logFilePath) {
8
+ this.logFilePath = logFilePath || getChangesFilePath();
9
+ }
10
+ async record(record) {
11
+ logger.info('Recording change', record);
12
+ try {
13
+ await fs.mkdir(path.dirname(this.logFilePath), { recursive: true });
14
+ let records = [];
15
+ try {
16
+ const content = await fs.readFile(this.logFilePath, 'utf-8');
17
+ records = JSON.parse(content);
18
+ }
19
+ catch {
20
+ // File doesn't exist yet
21
+ }
22
+ records.push(record);
23
+ await fs.writeFile(this.logFilePath, JSON.stringify(records, null, 2), 'utf-8');
24
+ logger.info('Change recorded successfully');
25
+ }
26
+ catch (error) {
27
+ logger.error('Failed to record change', { error: error.message });
28
+ }
29
+ }
30
+ async getHistory(limit = 10) {
31
+ try {
32
+ const content = await fs.readFile(this.logFilePath, 'utf-8');
33
+ const records = JSON.parse(content);
34
+ return records.slice(-limit);
35
+ }
36
+ catch {
37
+ return [];
38
+ }
39
+ }
40
+ }
41
+ //# sourceMappingURL=change-recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-recorder.js","sourceRoot":"","sources":["../../src/recovery/change-recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,OAAO,cAAc;IACjB,WAAW,CAAS;IAE5B,YAAY,WAAoB;QAC9B,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,kBAAkB,EAAE,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAoB;QAC/B,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEpE,IAAI,OAAO,GAAmB,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBAC7D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAErB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAChF,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAmB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ export interface WatcherConfig {
2
+ openclawConfigPath: string;
3
+ gatewayUrl: string;
4
+ healthCheckInterval: number;
5
+ failureThreshold: number;
6
+ aiProvider: string;
7
+ gitTracking: boolean;
8
+ useGitHubCli: boolean;
9
+ }
10
+ export declare class ConfigInitializer {
11
+ create(config: WatcherConfig): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=config-initializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-initializer.d.ts","sourceRoot":"","sources":["../../src/setup/config-initializer.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,iBAAiB;IACtB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CA0CnD"}
@@ -0,0 +1,46 @@
1
+ import fs from 'fs/promises';
2
+ import logger from '../utils/logger.js';
3
+ import { getWatcherHome, getConfigPath, getLogsDir, getLogFilePath, } from '../utils/paths.js';
4
+ export class ConfigInitializer {
5
+ async create(config) {
6
+ const configContent = {
7
+ monitor: {
8
+ gatewayUrl: config.gatewayUrl,
9
+ healthEndpoint: '/',
10
+ checkInterval: config.healthCheckInterval,
11
+ timeout: 10000,
12
+ maxRetries: 3,
13
+ failureThreshold: config.failureThreshold,
14
+ },
15
+ ai: {
16
+ provider: config.aiProvider,
17
+ timeout: 300000,
18
+ },
19
+ recovery: {
20
+ useGitTracking: config.gitTracking,
21
+ useGitHubCli: config.useGitHubCli,
22
+ gitCommitPrefix: '[AutoFix]',
23
+ backupBeforeChange: true,
24
+ openclawConfigPath: config.openclawConfigPath,
25
+ },
26
+ logging: {
27
+ level: 'info',
28
+ filePath: getLogFilePath(),
29
+ },
30
+ };
31
+ // Ensure watcher home and logs directory exist
32
+ const watcherHome = getWatcherHome();
33
+ await fs.mkdir(watcherHome, { recursive: true });
34
+ await fs.mkdir(getLogsDir(), { recursive: true });
35
+ const configPath = getConfigPath();
36
+ try {
37
+ await fs.writeFile(configPath, JSON.stringify(configContent, null, 2), 'utf-8');
38
+ logger.info('Configuration file created', { path: configPath });
39
+ }
40
+ catch (error) {
41
+ logger.error('Failed to create configuration file', { error: error.message });
42
+ throw error;
43
+ }
44
+ }
45
+ }
46
+ //# sourceMappingURL=config-initializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-initializer.js","sourceRoot":"","sources":["../../src/setup/config-initializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,MAAM,MAAM,mBAAmB,CAAC;AACvC,OAAO,EACL,cAAc,EACd,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC;AAY1B,MAAM,OAAO,iBAAiB;IAC5B,KAAK,CAAC,MAAM,CAAC,MAAqB;QAChC,MAAM,aAAa,GAAG;YACpB,OAAO,EAAE;gBACP,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,cAAc,EAAE,GAAG;gBACnB,aAAa,EAAE,MAAM,CAAC,mBAAmB;gBACzC,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,CAAC;gBACb,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;aAC1C;YACD,EAAE,EAAE;gBACF,QAAQ,EAAE,MAAM,CAAC,UAAU;gBAC3B,OAAO,EAAE,MAAM;aAChB;YACD,QAAQ,EAAE;gBACR,cAAc,EAAE,MAAM,CAAC,WAAW;gBAClC,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,eAAe,EAAE,WAAW;gBAC5B,kBAAkB,EAAE,IAAI;gBACxB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;aAC9C;YACD,OAAO,EAAE;gBACP,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,cAAc,EAAE;aAC3B;SACF,CAAC;QAEF,+CAA+C;QAC/C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAChF,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import { MonitorConfig, AIClientConfig, RecoveryConfig } from '../types/index.js';
2
+ export interface LoadedConfig {
3
+ monitor: MonitorConfig;
4
+ ai: AIClientConfig;
5
+ recovery: RecoveryConfig;
6
+ }
7
+ export declare function loadConfig(): Promise<LoadedConfig | null>;
8
+ export declare function getConfigFilePath(): string;
9
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/setup/config-loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGjF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,aAAa,CAAC;IACvB,EAAE,EAAE,cAAc,CAAC;IACnB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAU/D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -0,0 +1,17 @@
1
+ import fs from 'fs/promises';
2
+ import { getConfigPath } from '../utils/paths.js';
3
+ export async function loadConfig() {
4
+ const configPath = getConfigPath();
5
+ try {
6
+ const content = await fs.readFile(configPath, 'utf-8');
7
+ const config = JSON.parse(content);
8
+ return config;
9
+ }
10
+ catch {
11
+ return null;
12
+ }
13
+ }
14
+ export function getConfigFilePath() {
15
+ return getConfigPath();
16
+ }
17
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/setup/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,MAAsB,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface GitInitOptions {
2
+ repoName: string;
3
+ isPrivate: boolean;
4
+ }
5
+ export declare class GitInitializer {
6
+ private git;
7
+ private repoPath;
8
+ constructor(repoPath: string);
9
+ init(options: GitInitOptions): Promise<void>;
10
+ private createGitignore;
11
+ private createReadme;
12
+ setupPreCommitHook(): Promise<void>;
13
+ initialCommit(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=git-initializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-initializer.d.ts","sourceRoot":"","sources":["../../src/setup/git-initializer.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAKtB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YA4BpC,eAAe;YAkCf,YAAY;IA0CpB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAqEnC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAUrC"}
@@ -0,0 +1,189 @@
1
+ import simpleGit from 'simple-git';
2
+ import fs from 'fs/promises';
3
+ import path from 'path';
4
+ import logger from '../utils/logger.js';
5
+ export class GitInitializer {
6
+ git;
7
+ repoPath;
8
+ constructor(repoPath) {
9
+ this.repoPath = repoPath;
10
+ this.git = simpleGit(repoPath);
11
+ }
12
+ async init(options) {
13
+ try {
14
+ // Check if already a git repo
15
+ const isRepo = await this.git.checkIsRepo();
16
+ if (isRepo) {
17
+ logger.info('Git repository already exists', { path: this.repoPath });
18
+ return;
19
+ }
20
+ // Initialize git
21
+ await this.git.init();
22
+ logger.info('Git repository initialized', { path: this.repoPath });
23
+ // Configure git
24
+ await this.git.addConfig('user.name', 'OpenClaw Watcher');
25
+ await this.git.addConfig('user.email', 'watcher@openclaw.local');
26
+ // Create .gitignore
27
+ await this.createGitignore();
28
+ // Create README
29
+ await this.createReadme(options);
30
+ }
31
+ catch (error) {
32
+ logger.error('Failed to initialize git repository', { error: error.message });
33
+ throw error;
34
+ }
35
+ }
36
+ async createGitignore() {
37
+ const gitignorePath = path.join(this.repoPath, '.gitignore');
38
+ const content = `# OpenClaw Configuration - Sensitive Files
39
+ # IMPORTANT: openclaw.json contains API keys and tokens
40
+ openclaw.json
41
+
42
+ # Agent auth profiles (API keys)
43
+ agents/*/agent/auth-profiles.json
44
+
45
+ # Session history (large + privacy)
46
+ agents/*/sessions/
47
+
48
+ # Vector index / memory DB (large)
49
+ memory/*.sqlite
50
+
51
+ # Cache
52
+ cache/
53
+
54
+ # Logs
55
+ *.log
56
+
57
+ # Backup files
58
+ *.backup
59
+ *.bak
60
+ *.tmp
61
+
62
+ # System files
63
+ .DS_Store
64
+ Thumbs.db
65
+ `;
66
+ await fs.writeFile(gitignorePath, content, 'utf-8');
67
+ logger.info('.gitignore created');
68
+ }
69
+ async createReadme(options) {
70
+ const readmePath = path.join(this.repoPath, 'README.md');
71
+ const content = `# ${options.repoName}
72
+
73
+ ${options.isPrivate ? '🔒 **Private Repository**' : '📖 Public Repository'}
74
+
75
+ This repository is managed by **OpenClaw Watcher** — it tracks the entire \`~/.openclaw\` directory, including configuration, agent settings, and AI repair history.
76
+
77
+ ## What's Tracked
78
+
79
+ | Path | Description |
80
+ |------|-------------|
81
+ | \`openclaw.safe.json\` | Safe configuration (secrets redacted) |
82
+ | \`agents/*/agent/*.json\` | Agent configuration (except auth) |
83
+ | \`README.md\` | This file |
84
+ | \`.gitignore\` | Git ignore rules |
85
+
86
+ ## What's Excluded (.gitignore)
87
+
88
+ | Pattern | Reason |
89
+ |---------|--------|
90
+ | \`openclaw.json\` | Contains API keys and tokens |
91
+ | \`agents/*/agent/auth-profiles.json\` | Agent API keys |
92
+ | \`agents/*/sessions/\` | Session history (large + privacy) |
93
+ | \`memory/*.sqlite\` | Vector index / memory DB |
94
+ | \`cache/\` | Runtime cache |
95
+ | \`*.log\` | Log files |
96
+
97
+ ## ⚠️ Security
98
+
99
+ - A **pre-commit hook** blocks commits containing sensitive patterns
100
+ - Never commit \`openclaw.json\` or auth profile files manually
101
+ - All automated commits are created by the AI repair system
102
+
103
+ ## 🔧 Managed by
104
+
105
+ [OpenClaw Watcher](https://github.com/your-org/openclaw-watcher) - AI-powered health monitoring and auto-repair
106
+ `;
107
+ await fs.writeFile(readmePath, content, 'utf-8');
108
+ logger.info('README.md created');
109
+ }
110
+ async setupPreCommitHook() {
111
+ const hooksDir = path.join(this.repoPath, '.git', 'hooks');
112
+ const preCommitPath = path.join(hooksDir, 'pre-commit');
113
+ const hookContent = `#!/bin/bash
114
+
115
+ # OpenClaw Watcher Pre-commit Hook
116
+ # Checks for sensitive data in openclaw.safe.json
117
+
118
+ echo "🔍 Checking for sensitive data..."
119
+
120
+ # Check if openclaw.safe.json is staged
121
+ if git diff --cached --name-only | grep -q "openclaw.safe.json"; then
122
+ # Get the diff content, excluding already redacted lines (placeholders)
123
+ # Lines containing <YOUR_..._HERE> or <REDACTED> are considered safe
124
+ DIFF_CONTENT=$(git diff --cached openclaw.safe.json | grep -v "<YOUR_.*_HERE>" | grep -v "<REDACTED>")
125
+
126
+ # Check for common sensitive patterns in non-redacted content
127
+ PATTERNS=(
128
+ "sk-ant-[a-zA-Z0-9]" # Claude API keys
129
+ "Bearer [a-zA-Z0-9_-]{10,}" # Bearer tokens
130
+ "api[_-]?key[^\"]*[\"']\s*:\s*[\"'][^\"']{5,}[\"']" # API keys
131
+ "token[^\"]*[\"']\s*:\s*[\"'][^\"']{5,}[\"']" # Tokens
132
+ "password[^\"]*[\"']\s*:\s*[\"'][^\"']{3,}[\"']" # Passwords
133
+ "secret[^\"]*[\"']\s*:\s*[\"'][^\"']{5,}[\"']" # Secrets
134
+ )
135
+
136
+ FOUND_SENSITIVE=false
137
+
138
+ for pattern in "\${PATTERNS[@]}"; do
139
+ if echo "$DIFF_CONTENT" | grep -iE "$pattern" > /dev/null; then
140
+ echo "❌ ERROR: Possible sensitive data found in openclaw.safe.json"
141
+ echo " Pattern matched: $pattern"
142
+ FOUND_SENSITIVE=true
143
+ fi
144
+ done
145
+
146
+ if [ "$FOUND_SENSITIVE" = true ]; then
147
+ echo ""
148
+ echo "🚨 Commit blocked to prevent sensitive data leak!"
149
+ echo " Please review openclaw.safe.json and ensure all secrets are replaced with placeholders"
150
+ echo " Example: \\"apiKey\\": \\"<YOUR_API_KEY_HERE>\\""
151
+ exit 1
152
+ fi
153
+ fi
154
+
155
+ # Check if openclaw.json is accidentally staged
156
+ if git diff --cached --name-only | grep -q "^openclaw.json$"; then
157
+ echo "❌ ERROR: openclaw.json should NOT be committed!"
158
+ echo " This file contains sensitive information."
159
+ echo " It should be in .gitignore"
160
+ exit 1
161
+ fi
162
+
163
+ echo "✅ Pre-commit checks passed"
164
+ exit 0
165
+ `;
166
+ try {
167
+ await fs.mkdir(hooksDir, { recursive: true });
168
+ await fs.writeFile(preCommitPath, hookContent, 'utf-8');
169
+ await fs.chmod(preCommitPath, 0o755);
170
+ logger.info('Pre-commit hook installed');
171
+ }
172
+ catch (error) {
173
+ logger.error('Failed to setup pre-commit hook', { error: error.message });
174
+ throw error;
175
+ }
176
+ }
177
+ async initialCommit() {
178
+ try {
179
+ await this.git.add('.');
180
+ await this.git.commit('Initial commit: OpenClaw Watcher configuration tracking');
181
+ logger.info('Initial commit created');
182
+ }
183
+ catch (error) {
184
+ logger.error('Failed to create initial commit', { error: error.message });
185
+ throw error;
186
+ }
187
+ }
188
+ }
189
+ //# sourceMappingURL=git-initializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-initializer.js","sourceRoot":"","sources":["../../src/setup/git-initializer.ts"],"names":[],"mappings":"AAAA,OAAO,SAAwB,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAOvC,MAAM,OAAO,cAAc;IACjB,GAAG,CAAY;IACf,QAAQ,CAAS;IAEzB,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAuB;QAChC,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAC5C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACtE,OAAO;YACT,CAAC;YAED,iBAAiB;YACjB,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEnE,gBAAgB;YAChB,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;YAC1D,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;YAEjE,oBAAoB;YACpB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAE7B,gBAAgB;YAChB,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BnB,CAAC;QACE,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,OAAuB;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,KAAK,OAAO,CAAC,QAAQ;;EAEvC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCzE,CAAC;QACE,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAExD,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDvB,CAAC;QAEE,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,yDAAyD,CAAC,CAAC;YACjF,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ export declare class SafeConfigGenerator {
2
+ private configPath;
3
+ constructor(configPath: string);
4
+ generate(): Promise<void>;
5
+ update(): Promise<void>;
6
+ private redactSensitiveData;
7
+ private getPlaceholder;
8
+ }
9
+ //# sourceMappingURL=safe-config-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-config-generator.d.ts","sourceRoot":"","sources":["../../src/setup/safe-config-generator.ts"],"names":[],"mappings":"AAIA,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAIxB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBzB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,OAAO,CAAC,mBAAmB;IAsC3B,OAAO,CAAC,cAAc;CAuBvB"}