@aiassesstech/mighty-mark 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/agent/AGENTS.md +61 -0
  2. package/agent/IDENTITY.md +18 -0
  3. package/agent/SOUL.md +56 -0
  4. package/dist/checks/agent-verify.d.ts +15 -0
  5. package/dist/checks/agent-verify.d.ts.map +1 -0
  6. package/dist/checks/agent-verify.js +100 -0
  7. package/dist/checks/agent-verify.js.map +1 -0
  8. package/dist/checks/api-connectivity.d.ts +14 -0
  9. package/dist/checks/api-connectivity.d.ts.map +1 -0
  10. package/dist/checks/api-connectivity.js +77 -0
  11. package/dist/checks/api-connectivity.js.map +1 -0
  12. package/dist/checks/check-context.d.ts +36 -0
  13. package/dist/checks/check-context.d.ts.map +1 -0
  14. package/dist/checks/check-context.js +42 -0
  15. package/dist/checks/check-context.js.map +1 -0
  16. package/dist/checks/check-runner.d.ts +18 -0
  17. package/dist/checks/check-runner.d.ts.map +1 -0
  18. package/dist/checks/check-runner.js +109 -0
  19. package/dist/checks/check-runner.js.map +1 -0
  20. package/dist/checks/data-integrity.d.ts +16 -0
  21. package/dist/checks/data-integrity.d.ts.map +1 -0
  22. package/dist/checks/data-integrity.js +152 -0
  23. package/dist/checks/data-integrity.js.map +1 -0
  24. package/dist/checks/gateway-health.d.ts +17 -0
  25. package/dist/checks/gateway-health.d.ts.map +1 -0
  26. package/dist/checks/gateway-health.js +208 -0
  27. package/dist/checks/gateway-health.js.map +1 -0
  28. package/dist/checks/system-resources.d.ts +21 -0
  29. package/dist/checks/system-resources.d.ts.map +1 -0
  30. package/dist/checks/system-resources.js +136 -0
  31. package/dist/checks/system-resources.js.map +1 -0
  32. package/dist/cli/bin.d.ts +8 -0
  33. package/dist/cli/bin.d.ts.map +1 -0
  34. package/dist/cli/bin.js +12 -0
  35. package/dist/cli/bin.js.map +1 -0
  36. package/dist/cli/runner.d.ts +11 -0
  37. package/dist/cli/runner.d.ts.map +1 -0
  38. package/dist/cli/runner.js +99 -0
  39. package/dist/cli/runner.js.map +1 -0
  40. package/dist/cli/setup.d.ts +28 -0
  41. package/dist/cli/setup.d.ts.map +1 -0
  42. package/dist/cli/setup.js +238 -0
  43. package/dist/cli/setup.js.map +1 -0
  44. package/dist/config/config-schema.d.ts +56 -0
  45. package/dist/config/config-schema.d.ts.map +1 -0
  46. package/dist/config/config-schema.js +34 -0
  47. package/dist/config/config-schema.js.map +1 -0
  48. package/dist/config/defaults.d.ts +31 -0
  49. package/dist/config/defaults.d.ts.map +1 -0
  50. package/dist/config/defaults.js +31 -0
  51. package/dist/config/defaults.js.map +1 -0
  52. package/dist/config/fleet-topology.d.ts +22 -0
  53. package/dist/config/fleet-topology.d.ts.map +1 -0
  54. package/dist/config/fleet-topology.js +81 -0
  55. package/dist/config/fleet-topology.js.map +1 -0
  56. package/dist/history/incident-log.d.ts +19 -0
  57. package/dist/history/incident-log.d.ts.map +1 -0
  58. package/dist/history/incident-log.js +50 -0
  59. package/dist/history/incident-log.js.map +1 -0
  60. package/dist/history/trend-analyzer.d.ts +18 -0
  61. package/dist/history/trend-analyzer.d.ts.map +1 -0
  62. package/dist/history/trend-analyzer.js +80 -0
  63. package/dist/history/trend-analyzer.js.map +1 -0
  64. package/dist/history/uptime-tracker.d.ts +15 -0
  65. package/dist/history/uptime-tracker.d.ts.map +1 -0
  66. package/dist/history/uptime-tracker.js +56 -0
  67. package/dist/history/uptime-tracker.js.map +1 -0
  68. package/dist/index.d.ts +49 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +124 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/notify/alert-classifier.d.ts +19 -0
  73. package/dist/notify/alert-classifier.d.ts.map +1 -0
  74. package/dist/notify/alert-classifier.js +45 -0
  75. package/dist/notify/alert-classifier.js.map +1 -0
  76. package/dist/notify/report-formatter.d.ts +21 -0
  77. package/dist/notify/report-formatter.d.ts.map +1 -0
  78. package/dist/notify/report-formatter.js +139 -0
  79. package/dist/notify/report-formatter.js.map +1 -0
  80. package/dist/notify/telegram-notifier.d.ts +28 -0
  81. package/dist/notify/telegram-notifier.d.ts.map +1 -0
  82. package/dist/notify/telegram-notifier.js +69 -0
  83. package/dist/notify/telegram-notifier.js.map +1 -0
  84. package/dist/plugin.d.ts +18 -0
  85. package/dist/plugin.d.ts.map +1 -0
  86. package/dist/plugin.js +289 -0
  87. package/dist/plugin.js.map +1 -0
  88. package/dist/store/json-store.d.ts +22 -0
  89. package/dist/store/json-store.d.ts.map +1 -0
  90. package/dist/store/json-store.js +128 -0
  91. package/dist/store/json-store.js.map +1 -0
  92. package/dist/store/types.d.ts +19 -0
  93. package/dist/store/types.d.ts.map +1 -0
  94. package/dist/store/types.js +5 -0
  95. package/dist/store/types.js.map +1 -0
  96. package/dist/types/events.d.ts +33 -0
  97. package/dist/types/events.d.ts.map +1 -0
  98. package/dist/types/events.js +5 -0
  99. package/dist/types/events.js.map +1 -0
  100. package/dist/types/fleet.d.ts +27 -0
  101. package/dist/types/fleet.d.ts.map +1 -0
  102. package/dist/types/fleet.js +6 -0
  103. package/dist/types/fleet.js.map +1 -0
  104. package/dist/types/health.d.ts +58 -0
  105. package/dist/types/health.d.ts.map +1 -0
  106. package/dist/types/health.js +5 -0
  107. package/dist/types/health.js.map +1 -0
  108. package/dist/types/incident.d.ts +35 -0
  109. package/dist/types/incident.d.ts.map +1 -0
  110. package/dist/types/incident.js +5 -0
  111. package/dist/types/incident.js.map +1 -0
  112. package/openclaw.plugin.json +56 -0
  113. package/package.json +71 -0
  114. package/src/watchdog/README.md +123 -0
  115. package/src/watchdog/install.sh +244 -0
  116. package/src/watchdog/lib/config.sh +44 -0
  117. package/src/watchdog/lib/logging.sh +29 -0
  118. package/src/watchdog/lib/notify.sh +46 -0
  119. package/src/watchdog/morning-check.sh +107 -0
  120. package/src/watchdog/openclaw-gateway.service +43 -0
  121. package/src/watchdog/watchdog.sh +124 -0
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Data integrity checks — Grillo audit chain, Noah store, Nole state, Mark self-check.
3
+ */
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import { fetchUrl, now } from './check-context.js';
7
+ /** Find a data directory by checking multiple possible locations. */
8
+ function findDataDir(name, ctx) {
9
+ const home = process.env.HOME ?? '/root';
10
+ const candidates = [
11
+ `${home}/.clawdbot/plugins/${name}/data`,
12
+ `${home}/.${name}-data`,
13
+ ];
14
+ for (const dir of candidates) {
15
+ if (fs.existsSync(dir))
16
+ return dir;
17
+ }
18
+ return null;
19
+ }
20
+ /** Check #23: Grillo audit chain — recent assessment files are valid JSON. */
21
+ export async function checkGrilloChain(ctx) {
22
+ const start = Date.now();
23
+ const dataDir = findDataDir('grillo', ctx);
24
+ if (!dataDir) {
25
+ return { name: 'Grillo audit chain valid', category: 'data', status: 'warn', message: 'Grillo data directory not found', timestamp: now(), durationMs: Date.now() - start };
26
+ }
27
+ try {
28
+ const files = findJsonFiles(dataDir);
29
+ if (files.length === 0) {
30
+ return { name: 'Grillo audit chain valid', category: 'data', status: 'warn', message: 'No Grillo assessment files found', timestamp: now(), durationMs: Date.now() - start };
31
+ }
32
+ // Spot-check last 5 files
33
+ const recent = files.slice(-5);
34
+ let invalid = 0;
35
+ for (const file of recent) {
36
+ try {
37
+ JSON.parse(fs.readFileSync(file, 'utf-8'));
38
+ }
39
+ catch {
40
+ invalid++;
41
+ }
42
+ }
43
+ if (invalid > 0) {
44
+ return { name: 'Grillo audit chain valid', category: 'data', status: 'fail', message: `${invalid} corrupted assessment files`, timestamp: now(), durationMs: Date.now() - start };
45
+ }
46
+ return { name: 'Grillo audit chain valid', category: 'data', status: 'pass', message: `${files.length} files, recent 5 valid`, timestamp: now(), durationMs: Date.now() - start };
47
+ }
48
+ catch (err) {
49
+ return { name: 'Grillo audit chain valid', category: 'data', status: 'warn', message: `Error checking Grillo chain: ${err instanceof Error ? err.message : String(err)}`, timestamp: now(), durationMs: Date.now() - start };
50
+ }
51
+ }
52
+ /** Check #24: Noah temporal store accessible and valid. */
53
+ export async function checkNoahStore(ctx) {
54
+ const start = Date.now();
55
+ const dataDir = findDataDir('noah', ctx);
56
+ if (!dataDir) {
57
+ return { name: 'Noah temporal store accessible', category: 'data', status: 'warn', message: 'Noah data directory not found', timestamp: now(), durationMs: Date.now() - start };
58
+ }
59
+ try {
60
+ const files = findJsonFiles(dataDir);
61
+ if (files.length > 0) {
62
+ // Validate the first file found
63
+ JSON.parse(fs.readFileSync(files[0], 'utf-8'));
64
+ }
65
+ return { name: 'Noah temporal store accessible', category: 'data', status: 'pass', timestamp: now(), durationMs: Date.now() - start };
66
+ }
67
+ catch {
68
+ return { name: 'Noah temporal store accessible', category: 'data', status: 'fail', message: 'Noah state file corrupted', timestamp: now(), durationMs: Date.now() - start };
69
+ }
70
+ }
71
+ /** Check #25: Nole state files valid. */
72
+ export async function checkNoleState(ctx) {
73
+ const start = Date.now();
74
+ const dataDir = findDataDir('nole', ctx);
75
+ if (!dataDir) {
76
+ return { name: 'Nole state files valid', category: 'data', status: 'warn', message: 'Nole data directory not found', timestamp: now(), durationMs: Date.now() - start };
77
+ }
78
+ try {
79
+ const files = findJsonFiles(dataDir);
80
+ if (files.length > 0) {
81
+ JSON.parse(fs.readFileSync(files[0], 'utf-8'));
82
+ }
83
+ return { name: 'Nole state files valid', category: 'data', status: 'pass', timestamp: now(), durationMs: Date.now() - start };
84
+ }
85
+ catch {
86
+ return { name: 'Nole state files valid', category: 'data', status: 'fail', message: 'Nole state file corrupted', timestamp: now(), durationMs: Date.now() - start };
87
+ }
88
+ }
89
+ /** Check #26: Mark self-check — store writable + Telegram reachable. */
90
+ export async function checkMarkSelf(dataDir, telegramToken, ctx) {
91
+ const results = [];
92
+ // Sub-check 1: Store writable
93
+ const storeStart = Date.now();
94
+ try {
95
+ const testFile = path.join(dataDir, '.write-test');
96
+ fs.writeFileSync(testFile, 'mark-self-check');
97
+ fs.unlinkSync(testFile);
98
+ results.push({ name: 'Mark store writable', category: 'data', status: 'pass', timestamp: now(), durationMs: Date.now() - storeStart });
99
+ }
100
+ catch {
101
+ results.push({ name: 'Mark store writable', category: 'data', status: 'fail', message: `Cannot write to ${dataDir}`, timestamp: now(), durationMs: Date.now() - storeStart });
102
+ }
103
+ // Sub-check 2: Telegram reachable
104
+ const teleStart = Date.now();
105
+ const token = telegramToken ?? ctx?.telegramToken ?? process.env.MIGHTY_MARK_TELEGRAM_TOKEN;
106
+ if (!token) {
107
+ results.push({ name: 'Mark Telegram reachable', category: 'data', status: 'warn', message: 'Telegram token not configured', timestamp: now(), durationMs: Date.now() - teleStart });
108
+ }
109
+ else {
110
+ try {
111
+ const resp = await fetchUrl(`https://api.telegram.org/bot${token}/getMe`, { signal: AbortSignal.timeout(10_000) }, ctx);
112
+ if (resp.ok) {
113
+ results.push({ name: 'Mark Telegram reachable', category: 'data', status: 'pass', timestamp: now(), durationMs: Date.now() - teleStart });
114
+ }
115
+ else {
116
+ results.push({ name: 'Mark Telegram reachable', category: 'data', status: 'warn', message: `Telegram API returned HTTP ${resp.status}`, timestamp: now(), durationMs: Date.now() - teleStart });
117
+ }
118
+ }
119
+ catch {
120
+ results.push({ name: 'Mark Telegram reachable', category: 'data', status: 'fail', message: 'Telegram Bot API unreachable — morning reports will not be delivered', timestamp: now(), durationMs: Date.now() - teleStart });
121
+ }
122
+ }
123
+ return results;
124
+ }
125
+ /** Run all data integrity checks. */
126
+ export async function runDataChecks(dataDir, telegramToken, ctx) {
127
+ const results = [];
128
+ results.push(await checkGrilloChain(ctx));
129
+ results.push(await checkNoahStore(ctx));
130
+ results.push(await checkNoleState(ctx));
131
+ results.push(...await checkMarkSelf(dataDir, telegramToken, ctx));
132
+ return results;
133
+ }
134
+ /** Recursively find JSON files in a directory. */
135
+ function findJsonFiles(dir) {
136
+ const results = [];
137
+ try {
138
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
139
+ for (const entry of entries) {
140
+ const full = path.join(dir, entry.name);
141
+ if (entry.isDirectory()) {
142
+ results.push(...findJsonFiles(full));
143
+ }
144
+ else if (entry.name.endsWith('.json')) {
145
+ results.push(full);
146
+ }
147
+ }
148
+ }
149
+ catch { /* ignore unreadable dirs */ }
150
+ return results.sort();
151
+ }
152
+ //# sourceMappingURL=data-integrity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-integrity.js","sourceRoot":"","sources":["../../src/checks/data-integrity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Gateway health checks — process alive, config valid, plugins loaded, tools registered.
3
+ */
4
+ import type { CheckResult } from '../types/health.js';
5
+ import type { FleetTopology } from '../types/fleet.js';
6
+ import { type CheckContext } from './check-context.js';
7
+ /** Check #1: Gateway process alive. */
8
+ export declare function checkGatewayProcess(ctx?: CheckContext): Promise<CheckResult>;
9
+ /** Check #2: Gateway config is valid JSON with required keys. */
10
+ export declare function checkGatewayConfig(ctx?: CheckContext): Promise<CheckResult>;
11
+ /** Checks #3-5: Plugin loaded (one per plugin from fleet topology). */
12
+ export declare function checkPluginLoaded(pluginId: string, pluginName: string, ctx?: CheckContext): Promise<CheckResult>;
13
+ /** Check #6: Tool count meets minimum. */
14
+ export declare function checkToolCount(expectedMin: number, ctx?: CheckContext): Promise<CheckResult>;
15
+ /** Run all gateway health checks. */
16
+ export declare function runGatewayChecks(topology: FleetTopology, expectedToolCount: number, ctx?: CheckContext): Promise<CheckResult[]>;
17
+ //# sourceMappingURL=gateway-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-health.d.ts","sourceRoot":"","sources":["../../src/checks/gateway-health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEjF,uCAAuC;AACvC,wBAAsB,mBAAmB,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAuBlF;AAED,iEAAiE;AACjE,wBAAsB,kBAAkB,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA6CjF;AAED,uEAAuE;AACvE,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CAgEtB;AAED,0CAA0C;AAC1C,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CA2DtB;AAED,qCAAqC;AACrC,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,aAAa,EACvB,iBAAiB,EAAE,MAAM,EACzB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CAaxB"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Gateway health checks — process alive, config valid, plugins loaded, tools registered.
3
+ */
4
+ import fs from 'node:fs';
5
+ import { exec, getConfigPath, now } from './check-context.js';
6
+ /** Check #1: Gateway process alive. */
7
+ export async function checkGatewayProcess(ctx) {
8
+ const start = Date.now();
9
+ try {
10
+ const output = exec('pgrep -f openclaw-gateway', ctx);
11
+ const pid = output.split('\n')[0]?.trim();
12
+ return {
13
+ name: 'Gateway process alive',
14
+ category: 'gateway',
15
+ status: 'pass',
16
+ message: pid ? `PID: ${pid}` : undefined,
17
+ timestamp: now(),
18
+ durationMs: Date.now() - start,
19
+ };
20
+ }
21
+ catch {
22
+ return {
23
+ name: 'Gateway process alive',
24
+ category: 'gateway',
25
+ status: 'fail',
26
+ message: 'Gateway process not found',
27
+ timestamp: now(),
28
+ durationMs: Date.now() - start,
29
+ };
30
+ }
31
+ }
32
+ /** Check #2: Gateway config is valid JSON with required keys. */
33
+ export async function checkGatewayConfig(ctx) {
34
+ const start = Date.now();
35
+ const configPath = getConfigPath(ctx);
36
+ if (!fs.existsSync(configPath)) {
37
+ return {
38
+ name: 'Gateway config valid',
39
+ category: 'gateway',
40
+ status: 'fail',
41
+ message: `Config file missing: ${configPath}`,
42
+ timestamp: now(),
43
+ durationMs: Date.now() - start,
44
+ };
45
+ }
46
+ try {
47
+ const raw = fs.readFileSync(configPath, 'utf-8');
48
+ const config = JSON.parse(raw);
49
+ if (!config.agents) {
50
+ return {
51
+ name: 'Gateway config valid',
52
+ category: 'gateway',
53
+ status: 'fail',
54
+ message: "Config missing 'agents' key",
55
+ timestamp: now(),
56
+ durationMs: Date.now() - start,
57
+ };
58
+ }
59
+ return {
60
+ name: 'Gateway config valid',
61
+ category: 'gateway',
62
+ status: 'pass',
63
+ timestamp: now(),
64
+ durationMs: Date.now() - start,
65
+ };
66
+ }
67
+ catch (err) {
68
+ return {
69
+ name: 'Gateway config valid',
70
+ category: 'gateway',
71
+ status: 'fail',
72
+ message: `Config is invalid JSON: ${err instanceof Error ? err.message : String(err)}`,
73
+ timestamp: now(),
74
+ durationMs: Date.now() - start,
75
+ };
76
+ }
77
+ }
78
+ /** Checks #3-5: Plugin loaded (one per plugin from fleet topology). */
79
+ export async function checkPluginLoaded(pluginId, pluginName, ctx) {
80
+ const start = Date.now();
81
+ const configPath = getConfigPath(ctx);
82
+ try {
83
+ if (!fs.existsSync(configPath)) {
84
+ return {
85
+ name: `${pluginName} plugin loaded`,
86
+ category: 'gateway',
87
+ status: 'fail',
88
+ message: 'Config file missing',
89
+ timestamp: now(),
90
+ durationMs: Date.now() - start,
91
+ };
92
+ }
93
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
94
+ const plugins = config.plugins;
95
+ // Check in config entries
96
+ if (plugins?.entries && plugins.entries[pluginId]) {
97
+ return {
98
+ name: `${pluginName} plugin loaded`,
99
+ category: 'gateway',
100
+ status: 'pass',
101
+ timestamp: now(),
102
+ durationMs: Date.now() - start,
103
+ };
104
+ }
105
+ // Check as array of plugin objects
106
+ if (Array.isArray(plugins)) {
107
+ const found = plugins.some((p) => p.name === pluginId || p.id === pluginId);
108
+ if (found) {
109
+ return {
110
+ name: `${pluginName} plugin loaded`,
111
+ category: 'gateway',
112
+ status: 'pass',
113
+ timestamp: now(),
114
+ durationMs: Date.now() - start,
115
+ };
116
+ }
117
+ }
118
+ return {
119
+ name: `${pluginName} plugin loaded`,
120
+ category: 'gateway',
121
+ status: 'fail',
122
+ message: `Plugin '${pluginId}' not found in config`,
123
+ timestamp: now(),
124
+ durationMs: Date.now() - start,
125
+ };
126
+ }
127
+ catch (err) {
128
+ return {
129
+ name: `${pluginName} plugin loaded`,
130
+ category: 'gateway',
131
+ status: 'fail',
132
+ message: `Error checking plugin: ${err instanceof Error ? err.message : String(err)}`,
133
+ timestamp: now(),
134
+ durationMs: Date.now() - start,
135
+ };
136
+ }
137
+ }
138
+ /** Check #6: Tool count meets minimum. */
139
+ export async function checkToolCount(expectedMin, ctx) {
140
+ const start = Date.now();
141
+ const configPath = getConfigPath(ctx);
142
+ try {
143
+ if (!fs.existsSync(configPath)) {
144
+ return {
145
+ name: `Tool count >= ${expectedMin}`,
146
+ category: 'gateway',
147
+ status: 'warn',
148
+ message: 'Config file missing — cannot count tools',
149
+ timestamp: now(),
150
+ durationMs: Date.now() - start,
151
+ };
152
+ }
153
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
154
+ let toolCount = 0;
155
+ // Count tools from plugin entries
156
+ const plugins = config.plugins;
157
+ if (plugins?.entries) {
158
+ for (const key of Object.keys(plugins.entries)) {
159
+ const entry = plugins.entries[key];
160
+ if (Array.isArray(entry.tools)) {
161
+ toolCount += entry.tools.length;
162
+ }
163
+ }
164
+ }
165
+ if (toolCount >= expectedMin) {
166
+ return {
167
+ name: `Tool count >= ${expectedMin}`,
168
+ category: 'gateway',
169
+ status: 'pass',
170
+ message: `${toolCount} tools registered`,
171
+ timestamp: now(),
172
+ durationMs: Date.now() - start,
173
+ };
174
+ }
175
+ return {
176
+ name: `Tool count >= ${expectedMin}`,
177
+ category: 'gateway',
178
+ status: 'warn',
179
+ message: `Only ${toolCount} tools registered (expected >= ${expectedMin})`,
180
+ timestamp: now(),
181
+ durationMs: Date.now() - start,
182
+ };
183
+ }
184
+ catch {
185
+ return {
186
+ name: `Tool count >= ${expectedMin}`,
187
+ category: 'gateway',
188
+ status: 'warn',
189
+ message: 'Could not determine tool count from config',
190
+ timestamp: now(),
191
+ durationMs: Date.now() - start,
192
+ };
193
+ }
194
+ }
195
+ /** Run all gateway health checks. */
196
+ export async function runGatewayChecks(topology, expectedToolCount, ctx) {
197
+ const results = [];
198
+ results.push(await checkGatewayProcess(ctx));
199
+ results.push(await checkGatewayConfig(ctx));
200
+ for (const plugin of topology.plugins) {
201
+ const agent = topology.agents.find(a => a.pluginId === plugin);
202
+ const name = agent?.name ?? plugin;
203
+ results.push(await checkPluginLoaded(plugin, name, ctx));
204
+ }
205
+ results.push(await checkToolCount(expectedToolCount, ctx));
206
+ return results;
207
+ }
208
+ //# sourceMappingURL=gateway-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-health.js","sourceRoot":"","sources":["../../src/checks/gateway-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * System resource checks — disk, memory, CPU, uptime, OOM, log sizes.
3
+ */
4
+ import type { CheckResult } from '../types/health.js';
5
+ import type { MightyMarkConfig } from '../config/config-schema.js';
6
+ import { type CheckContext } from './check-context.js';
7
+ /** Check #14: Disk space above threshold. */
8
+ export declare function checkDiskSpace(thresholdPercent: number, ctx?: CheckContext): Promise<CheckResult>;
9
+ /** Check #15: Memory available above threshold. */
10
+ export declare function checkMemory(thresholdMb: number, ctx?: CheckContext): Promise<CheckResult>;
11
+ /** Check #16: CPU load below threshold. */
12
+ export declare function checkCpuLoad(threshold: number, ctx?: CheckContext): Promise<CheckResult>;
13
+ /** Check #17: System uptime above minimum. */
14
+ export declare function checkUptime(ctx?: CheckContext): Promise<CheckResult>;
15
+ /** Check #18: No OOM kills in last 24h. */
16
+ export declare function checkOomKills(ctx?: CheckContext): Promise<CheckResult>;
17
+ /** Check #19: Log files not oversized. */
18
+ export declare function checkLogSize(thresholdMb: number, ctx?: CheckContext): Promise<CheckResult>;
19
+ /** Run all system resource checks. */
20
+ export declare function runSystemChecks(config: MightyMarkConfig, ctx?: CheckContext): Promise<CheckResult[]>;
21
+ //# sourceMappingURL=system-resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-resources.d.ts","sourceRoot":"","sources":["../../src/checks/system-resources.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElE,6CAA6C;AAC7C,wBAAsB,cAAc,CAClC,gBAAgB,EAAE,MAAM,EACxB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CAiBtB;AAED,mDAAmD;AACnD,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CAgBtB;AAED,2CAA2C;AAC3C,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CAatB;AAED,8CAA8C;AAC9C,wBAAsB,WAAW,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAc1E;AAED,2CAA2C;AAC3C,wBAAsB,aAAa,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAuB5E;AAED,0CAA0C;AAC1C,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CAsBtB;AAED,sCAAsC;AACtC,wBAAsB,eAAe,CACnC,MAAM,EAAE,gBAAgB,EACxB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CASxB"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * System resource checks — disk, memory, CPU, uptime, OOM, log sizes.
3
+ */
4
+ import { CRITICAL_DISK_THRESHOLD_PERCENT, CRITICAL_MEMORY_THRESHOLD_MB, DEFAULT_MIN_UPTIME_MINUTES } from '../config/defaults.js';
5
+ import { exec, now } from './check-context.js';
6
+ /** Check #14: Disk space above threshold. */
7
+ export async function checkDiskSpace(thresholdPercent, ctx) {
8
+ const start = Date.now();
9
+ try {
10
+ const output = exec("df / | awk 'NR==2{gsub(/%/,\"\"); print $5}'", ctx);
11
+ const usedPct = parseInt(output, 10);
12
+ const freePct = 100 - usedPct;
13
+ if (freePct >= thresholdPercent) {
14
+ return { name: `Disk space > ${thresholdPercent}% free`, category: 'system', status: 'pass', message: `${freePct}% free`, timestamp: now(), durationMs: Date.now() - start };
15
+ }
16
+ if (freePct >= CRITICAL_DISK_THRESHOLD_PERCENT) {
17
+ return { name: `Disk space > ${thresholdPercent}% free`, category: 'system', status: 'warn', message: `Disk ${freePct}% free (threshold: ${thresholdPercent}%)`, timestamp: now(), durationMs: Date.now() - start };
18
+ }
19
+ return { name: `Disk space > ${thresholdPercent}% free`, category: 'system', status: 'fail', message: `CRITICAL: Disk only ${freePct}% free`, timestamp: now(), durationMs: Date.now() - start };
20
+ }
21
+ catch (err) {
22
+ return { name: `Disk space > ${thresholdPercent}% free`, category: 'system', status: 'warn', message: `Could not check disk: ${err instanceof Error ? err.message : String(err)}`, timestamp: now(), durationMs: Date.now() - start };
23
+ }
24
+ }
25
+ /** Check #15: Memory available above threshold. */
26
+ export async function checkMemory(thresholdMb, ctx) {
27
+ const start = Date.now();
28
+ try {
29
+ const output = exec("free -m | awk 'NR==2{print $7}'", ctx);
30
+ const availMb = parseInt(output, 10);
31
+ if (availMb >= thresholdMb) {
32
+ return { name: `Memory available > ${thresholdMb}MB`, category: 'system', status: 'pass', message: `${availMb}MB available`, timestamp: now(), durationMs: Date.now() - start };
33
+ }
34
+ if (availMb >= CRITICAL_MEMORY_THRESHOLD_MB) {
35
+ return { name: `Memory available > ${thresholdMb}MB`, category: 'system', status: 'warn', message: `Memory ${availMb}MB available (threshold: ${thresholdMb}MB)`, timestamp: now(), durationMs: Date.now() - start };
36
+ }
37
+ return { name: `Memory available > ${thresholdMb}MB`, category: 'system', status: 'fail', message: `CRITICAL: Only ${availMb}MB memory available`, timestamp: now(), durationMs: Date.now() - start };
38
+ }
39
+ catch (err) {
40
+ return { name: `Memory available > ${thresholdMb}MB`, category: 'system', status: 'warn', message: `Could not check memory: ${err instanceof Error ? err.message : String(err)}`, timestamp: now(), durationMs: Date.now() - start };
41
+ }
42
+ }
43
+ /** Check #16: CPU load below threshold. */
44
+ export async function checkCpuLoad(threshold, ctx) {
45
+ const start = Date.now();
46
+ try {
47
+ const output = exec("awk '{print $2}' /proc/loadavg", ctx);
48
+ const load = parseFloat(output);
49
+ if (load <= threshold) {
50
+ return { name: `CPU load < ${threshold}`, category: 'system', status: 'pass', message: `5-min load: ${load}`, timestamp: now(), durationMs: Date.now() - start };
51
+ }
52
+ return { name: `CPU load < ${threshold}`, category: 'system', status: 'warn', message: `CPU load ${load} exceeds threshold ${threshold}`, timestamp: now(), durationMs: Date.now() - start };
53
+ }
54
+ catch (err) {
55
+ return { name: `CPU load < ${threshold}`, category: 'system', status: 'warn', message: `Could not check CPU: ${err instanceof Error ? err.message : String(err)}`, timestamp: now(), durationMs: Date.now() - start };
56
+ }
57
+ }
58
+ /** Check #17: System uptime above minimum. */
59
+ export async function checkUptime(ctx) {
60
+ const start = Date.now();
61
+ try {
62
+ const output = exec("awk '{printf \"%d\", $1}' /proc/uptime", ctx);
63
+ const uptimeSec = parseInt(output, 10);
64
+ const uptimeMin = Math.floor(uptimeSec / 60);
65
+ if (uptimeMin >= DEFAULT_MIN_UPTIME_MINUTES) {
66
+ return { name: `System uptime > ${DEFAULT_MIN_UPTIME_MINUTES} min`, category: 'system', status: 'pass', message: `${uptimeMin} minutes`, timestamp: now(), durationMs: Date.now() - start };
67
+ }
68
+ return { name: `System uptime > ${DEFAULT_MIN_UPTIME_MINUTES} min`, category: 'system', status: 'warn', message: `System uptime only ${uptimeMin} minutes (recent reboot?)`, timestamp: now(), durationMs: Date.now() - start };
69
+ }
70
+ catch (err) {
71
+ return { name: `System uptime > ${DEFAULT_MIN_UPTIME_MINUTES} min`, category: 'system', status: 'warn', message: `Could not check uptime: ${err instanceof Error ? err.message : String(err)}`, timestamp: now(), durationMs: Date.now() - start };
72
+ }
73
+ }
74
+ /** Check #18: No OOM kills in last 24h. */
75
+ export async function checkOomKills(ctx) {
76
+ const start = Date.now();
77
+ try {
78
+ let count = 0;
79
+ try {
80
+ const output = exec('dmesg -T 2>/dev/null | grep -c "Out of memory" || echo 0', ctx);
81
+ count = parseInt(output, 10);
82
+ }
83
+ catch {
84
+ try {
85
+ const output = exec('journalctl --since "24 hours ago" 2>/dev/null | grep -c "oom-kill" || echo 0', ctx);
86
+ count = parseInt(output, 10);
87
+ }
88
+ catch {
89
+ count = 0;
90
+ }
91
+ }
92
+ if (count === 0) {
93
+ return { name: 'No OOM kills in last 24h', category: 'system', status: 'pass', timestamp: now(), durationMs: Date.now() - start };
94
+ }
95
+ return { name: 'No OOM kills in last 24h', category: 'system', status: 'fail', message: `${count} OOM kills in last 24 hours`, timestamp: now(), durationMs: Date.now() - start };
96
+ }
97
+ catch {
98
+ return { name: 'No OOM kills in last 24h', category: 'system', status: 'pass', message: 'Could not check OOM (assuming clean)', timestamp: now(), durationMs: Date.now() - start };
99
+ }
100
+ }
101
+ /** Check #19: Log files not oversized. */
102
+ export async function checkLogSize(thresholdMb, ctx) {
103
+ const start = Date.now();
104
+ try {
105
+ let totalMb = 0;
106
+ try {
107
+ const markLogs = exec('du -sm /opt/mighty-mark/logs/ 2>/dev/null | awk \'{print $1}\'', ctx);
108
+ totalMb += parseInt(markLogs, 10) || 0;
109
+ }
110
+ catch { /* directory may not exist yet */ }
111
+ try {
112
+ const gwLogs = exec(`du -sm ${process.env.HOME ?? '/root'}/.clawdbot/logs/ 2>/dev/null | awk '{print $1}'`, ctx);
113
+ totalMb += parseInt(gwLogs, 10) || 0;
114
+ }
115
+ catch { /* directory may not exist */ }
116
+ if (totalMb <= thresholdMb) {
117
+ return { name: `Log files not oversized`, category: 'system', status: 'pass', message: `${totalMb}MB total`, timestamp: now(), durationMs: Date.now() - start };
118
+ }
119
+ return { name: `Log files not oversized`, category: 'system', status: 'warn', message: `Log files total ${totalMb}MB (threshold: ${thresholdMb}MB)`, timestamp: now(), durationMs: Date.now() - start };
120
+ }
121
+ catch {
122
+ return { name: `Log files not oversized`, category: 'system', status: 'pass', message: 'Could not check log sizes', timestamp: now(), durationMs: Date.now() - start };
123
+ }
124
+ }
125
+ /** Run all system resource checks. */
126
+ export async function runSystemChecks(config, ctx) {
127
+ return [
128
+ await checkDiskSpace(config.diskThresholdPercent, ctx),
129
+ await checkMemory(config.memoryThresholdMb, ctx),
130
+ await checkCpuLoad(config.cpuThreshold, ctx),
131
+ await checkUptime(ctx),
132
+ await checkOomKills(ctx),
133
+ await checkLogSize(config.logSizeThresholdMb, ctx),
134
+ ];
135
+ }
136
+ //# sourceMappingURL=system-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-resources.js","sourceRoot":"","sources":["../../src/checks/system-resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Mighty Mark — CLI Entry Point
4
+ *
5
+ * This file is the bin target for `npx mighty-mark` or the global `mighty-mark` command.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Mighty Mark — CLI Entry Point
4
+ *
5
+ * This file is the bin target for `npx mighty-mark` or the global `mighty-mark` command.
6
+ */
7
+ import { run } from './runner.js';
8
+ run().catch((error) => {
9
+ console.error('[mighty-mark] Fatal error:', error);
10
+ process.exit(1);
11
+ });
12
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/cli/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACpB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Mighty Mark — CLI Command Router
3
+ *
4
+ * Usage:
5
+ * mighty-mark setup [--openclaw-home ...] [--model ...] [--hck ...]
6
+ * mighty-mark check [--category ...]
7
+ * mighty-mark status
8
+ * mighty-mark install-watchdog [--telegram-token ...] [--telegram-chat-id ...]
9
+ */
10
+ export declare function run(): Promise<void>;
11
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DzC"}