@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,99 @@
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
+ import { execSync } from 'node:child_process';
11
+ import { fileURLToPath } from 'node:url';
12
+ import path from 'node:path';
13
+ import { cmdSetup } from './setup.js';
14
+ export async function run() {
15
+ const args = process.argv.slice(2);
16
+ const command = args[0];
17
+ switch (command) {
18
+ case 'setup':
19
+ return cmdSetup(parseSetupArgs(args.slice(1)));
20
+ case 'check': {
21
+ const { MarkCore } = await import('../index.js');
22
+ const mark = new MarkCore();
23
+ await mark.initialize();
24
+ const report = await mark.runHealthCheck();
25
+ const { formatDetailedReport } = await import('../notify/report-formatter.js');
26
+ console.log(formatDetailedReport(report));
27
+ break;
28
+ }
29
+ case 'status': {
30
+ const { MarkCore: MC } = await import('../index.js');
31
+ const m = new MC();
32
+ await m.initialize();
33
+ const status = await m.getStatus();
34
+ console.log(JSON.stringify(status, null, 2));
35
+ break;
36
+ }
37
+ case 'install-watchdog': {
38
+ const thisFile = fileURLToPath(import.meta.url);
39
+ const packageRoot = path.resolve(path.dirname(thisFile), '..', '..');
40
+ const installScript = path.join(packageRoot, 'src', 'watchdog', 'install.sh');
41
+ const passArgs = args.slice(1).join(' ');
42
+ console.log(`[mighty-mark] Running watchdog installer: ${installScript}`);
43
+ try {
44
+ execSync(`sudo bash "${installScript}" ${passArgs}`, { stdio: 'inherit' });
45
+ }
46
+ catch (err) {
47
+ console.error('[mighty-mark] Watchdog installation failed');
48
+ process.exitCode = 1;
49
+ }
50
+ break;
51
+ }
52
+ default:
53
+ console.log('Mighty Mark — System Health Sentinel\n');
54
+ console.log('Usage:');
55
+ console.log(' mighty-mark setup Set up Mark as an OpenClaw agent');
56
+ console.log(' mighty-mark check Run a full health check');
57
+ console.log(' mighty-mark status Show current status');
58
+ console.log(' mighty-mark install-watchdog Install bash watchdog on VPS');
59
+ console.log('');
60
+ console.log('Options for setup:');
61
+ console.log(' --openclaw-home <path> OpenClaw home directory');
62
+ console.log(' --model <model> Model (default: anthropic/claude-haiku-4-5)');
63
+ console.log(' --hck <key> Health Check Key');
64
+ console.log(' --force Overwrite existing agent files');
65
+ console.log('');
66
+ console.log('Options for install-watchdog:');
67
+ console.log(' --telegram-token <token> @MightyMarkBot token');
68
+ console.log(' --telegram-chat-id <id> Telegram chat ID for alerts');
69
+ console.log(' --dry-run Preview changes without installing');
70
+ break;
71
+ }
72
+ }
73
+ function parseSetupArgs(args) {
74
+ const opts = {};
75
+ for (let i = 0; i < args.length; i++) {
76
+ switch (args[i]) {
77
+ case '--openclaw-home':
78
+ opts.openclawHome = args[++i];
79
+ break;
80
+ case '--model':
81
+ opts.model = args[++i];
82
+ break;
83
+ case '--hck':
84
+ opts.healthCheckKey = args[++i];
85
+ break;
86
+ case '--telegram-token':
87
+ opts.telegramToken = args[++i];
88
+ break;
89
+ case '--telegram-chat-id':
90
+ opts.telegramChatId = args[++i];
91
+ break;
92
+ case '--force':
93
+ opts.force = true;
94
+ break;
95
+ }
96
+ }
97
+ return opts;
98
+ }
99
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Mighty Mark — Agent Setup for OpenClaw
3
+ *
4
+ * Sets up Mighty Mark as an independent agent in an OpenClaw deployment:
5
+ * 1. Creates ~/.openclaw/agents/mighty-mark/agent/ directory
6
+ * 2. Copies SOUL.md, AGENTS.md, IDENTITY.md into the agent directory
7
+ * 3. Adds mighty-mark to agents.list in openclaw.json
8
+ * 4. Creates .mighty-mark-data/ directory for health check storage
9
+ * 5. Writes default fleet-topology.json
10
+ * 6. Configures Telegram credentials if provided
11
+ *
12
+ * Usage:
13
+ * mighty-mark setup [--openclaw-home ~/.openclaw] [--model anthropic/claude-haiku-4-5] [--hck hck_...]
14
+ *
15
+ * Pattern: Follows @aiassesstech/noah setup exactly to avoid past install issues.
16
+ */
17
+ export interface SetupOptions {
18
+ openclawHome?: string;
19
+ model?: string;
20
+ healthCheckKey?: string;
21
+ telegramToken?: string;
22
+ telegramChatId?: string;
23
+ morningCheckHourCt?: number;
24
+ workspace?: string;
25
+ force?: boolean;
26
+ }
27
+ export declare function cmdSetup(options?: SetupOptions): Promise<void>;
28
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAuEH,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8MxE"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Mighty Mark — Agent Setup for OpenClaw
3
+ *
4
+ * Sets up Mighty Mark as an independent agent in an OpenClaw deployment:
5
+ * 1. Creates ~/.openclaw/agents/mighty-mark/agent/ directory
6
+ * 2. Copies SOUL.md, AGENTS.md, IDENTITY.md into the agent directory
7
+ * 3. Adds mighty-mark to agents.list in openclaw.json
8
+ * 4. Creates .mighty-mark-data/ directory for health check storage
9
+ * 5. Writes default fleet-topology.json
10
+ * 6. Configures Telegram credentials if provided
11
+ *
12
+ * Usage:
13
+ * mighty-mark setup [--openclaw-home ~/.openclaw] [--model anthropic/claude-haiku-4-5] [--hck hck_...]
14
+ *
15
+ * Pattern: Follows @aiassesstech/noah setup exactly to avoid past install issues.
16
+ */
17
+ import * as fs from 'node:fs';
18
+ import * as path from 'node:path';
19
+ import { fileURLToPath } from 'node:url';
20
+ import { writeDefaultTopology } from '../config/fleet-topology.js';
21
+ // ================================================================
22
+ // Path Resolution
23
+ // ================================================================
24
+ function resolveOpenClawHome(override) {
25
+ return (override ||
26
+ process.env.OPENCLAW_HOME ||
27
+ path.join(process.env.HOME || '~', '.openclaw'));
28
+ }
29
+ function resolvePackageAgentDir() {
30
+ const thisFile = fileURLToPath(import.meta.url);
31
+ const thisDir = path.dirname(thisFile);
32
+ const packageRoot = path.resolve(thisDir, '..', '..');
33
+ const agentDir = path.join(packageRoot, 'agent');
34
+ if (!fs.existsSync(agentDir)) {
35
+ throw new Error(`Could not find agent/ directory at ${agentDir}. ` +
36
+ `Make sure you installed @aiassesstech/mighty-mark correctly.`);
37
+ }
38
+ return agentDir;
39
+ }
40
+ // ================================================================
41
+ // Agent Files
42
+ // ================================================================
43
+ const AGENT_FILES = ['SOUL.md', 'AGENTS.md', 'IDENTITY.md'];
44
+ function resolveTemplateValues(options, pluginConfig) {
45
+ return {
46
+ MORNING_CHECK_HOUR_CT: String(options.morningCheckHourCt ?? pluginConfig.morningCheckHourCt ?? 6),
47
+ };
48
+ }
49
+ function applyTemplate(content, values) {
50
+ return content.replace(/\{\{MORNING_CHECK_HOUR_CT\}\}/g, values.MORNING_CHECK_HOUR_CT);
51
+ }
52
+ export async function cmdSetup(options = {}) {
53
+ const openclawHome = resolveOpenClawHome(options.openclawHome);
54
+ const model = options.model || 'anthropic/claude-haiku-4-5';
55
+ const force = options.force || false;
56
+ console.log('[mighty-mark] Setting up Mighty Mark as an OpenClaw agent...');
57
+ console.log(`[mighty-mark] OpenClaw home: ${openclawHome}`);
58
+ // ── Step 1: Verify OpenClaw installation ──────────────────────
59
+ const configPath = path.join(openclawHome, 'openclaw.json');
60
+ if (!fs.existsSync(configPath)) {
61
+ // Also check ~/.clawdbot/ (Jessie alternate)
62
+ const altConfigPath = path.join(process.env.HOME || '~', '.clawdbot', 'openclaw.json');
63
+ if (fs.existsSync(altConfigPath)) {
64
+ console.log(`[mighty-mark] Found config at ${altConfigPath} — using that location`);
65
+ }
66
+ else {
67
+ console.error(`[mighty-mark] ERROR: openclaw.json not found at ${configPath}`);
68
+ console.error('[mighty-mark] Is OpenClaw installed? Expected config at ~/.openclaw/openclaw.json');
69
+ console.error('[mighty-mark] Use --openclaw-home to specify a different location.');
70
+ process.exitCode = 1;
71
+ return;
72
+ }
73
+ }
74
+ // ── Step 2: Create agent directory ────────────────────────────
75
+ const agentDir = path.join(openclawHome, 'agents', 'mighty-mark', 'agent');
76
+ const workspaceDir = options.workspace || path.join(openclawHome, 'agents', 'mighty-mark');
77
+ if (fs.existsSync(agentDir) && !force) {
78
+ console.log(`[mighty-mark] Agent directory already exists: ${agentDir}`);
79
+ console.log('[mighty-mark] Use --force to overwrite existing agent files.');
80
+ }
81
+ else {
82
+ fs.mkdirSync(agentDir, { recursive: true });
83
+ console.log(`[mighty-mark] Created agent directory: ${agentDir}`);
84
+ }
85
+ // Create data directories
86
+ const dataDir = path.join(workspaceDir, '.mighty-mark-data');
87
+ const dataDirs = [
88
+ dataDir,
89
+ path.join(dataDir, 'state'),
90
+ path.join(dataDir, 'history', 'daily'),
91
+ path.join(dataDir, 'incidents'),
92
+ path.join(dataDir, 'config'),
93
+ ];
94
+ for (const dir of dataDirs) {
95
+ if (!fs.existsSync(dir)) {
96
+ fs.mkdirSync(dir, { recursive: true });
97
+ }
98
+ }
99
+ console.log(`[mighty-mark] Created data directories: ${dataDir}`);
100
+ // Write default fleet topology (BB can edit this without rebuild)
101
+ writeDefaultTopology(dataDir);
102
+ console.log('[mighty-mark] Wrote default fleet-topology.json (editable by BB)');
103
+ // ── Step 3: Copy agent files (with template substitution) ────
104
+ const sourceAgentDir = resolvePackageAgentDir();
105
+ let pluginConfigValues = {};
106
+ try {
107
+ const existingConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
108
+ pluginConfigValues = existingConfig?.plugins?.entries?.['mighty-mark']?.config || {};
109
+ }
110
+ catch { /* use defaults */ }
111
+ const templateValues = resolveTemplateValues(options, pluginConfigValues);
112
+ const TEMPLATED_FILES = new Set(['AGENTS.md']);
113
+ for (const file of AGENT_FILES) {
114
+ const src = path.join(sourceAgentDir, file);
115
+ const dest = path.join(agentDir, file);
116
+ if (!fs.existsSync(src)) {
117
+ console.warn(`[mighty-mark] WARNING: ${file} not found in package at ${src}`);
118
+ continue;
119
+ }
120
+ if (fs.existsSync(dest) && !force) {
121
+ console.log(`[mighty-mark] ${file} already exists, skipping (use --force to overwrite)`);
122
+ continue;
123
+ }
124
+ if (fs.existsSync(dest) && force) {
125
+ const backup = `${dest}.backup.${Date.now()}`;
126
+ fs.copyFileSync(dest, backup);
127
+ console.log(`[mighty-mark] Backed up existing ${file} to ${path.basename(backup)}`);
128
+ }
129
+ if (TEMPLATED_FILES.has(file)) {
130
+ const content = fs.readFileSync(src, 'utf-8');
131
+ const templated = applyTemplate(content, templateValues);
132
+ fs.writeFileSync(dest, templated);
133
+ console.log(`[mighty-mark] Installed ${file} (templated with config values)`);
134
+ }
135
+ else {
136
+ fs.copyFileSync(src, dest);
137
+ console.log(`[mighty-mark] Installed ${file}`);
138
+ }
139
+ }
140
+ // ── Step 4: Update openclaw.json ──────────────────────────────
141
+ let config;
142
+ try {
143
+ config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
144
+ }
145
+ catch {
146
+ console.error(`[mighty-mark] ERROR: Could not parse ${configPath}`);
147
+ process.exitCode = 1;
148
+ return;
149
+ }
150
+ if (!config.agents)
151
+ config.agents = {};
152
+ if (!Array.isArray(config.agents.list))
153
+ config.agents.list = [];
154
+ const existingIdx = config.agents.list.findIndex((a) => a.id === 'mighty-mark');
155
+ const markAgentEntry = {
156
+ id: 'mighty-mark',
157
+ name: 'mighty-mark',
158
+ workspace: workspaceDir,
159
+ agentDir: agentDir,
160
+ model: model,
161
+ tools: {
162
+ allow: [
163
+ 'mark_status',
164
+ 'mark_health',
165
+ 'mark_check',
166
+ 'mark_incidents',
167
+ 'mark_report',
168
+ 'mark_uptime',
169
+ 'group:fs',
170
+ ],
171
+ },
172
+ };
173
+ if (existingIdx >= 0) {
174
+ if (force) {
175
+ config.agents.list[existingIdx] = markAgentEntry;
176
+ console.log('[mighty-mark] Updated existing mighty-mark agent entry in openclaw.json');
177
+ }
178
+ else {
179
+ console.log('[mighty-mark] mighty-mark agent already exists in agents.list (use --force to update)');
180
+ }
181
+ }
182
+ else {
183
+ config.agents.list.push(markAgentEntry);
184
+ console.log('[mighty-mark] Added mighty-mark to agents.list in openclaw.json');
185
+ }
186
+ // ── Step 5: Configure plugin settings ─────────────────────────
187
+ if (!config.plugins)
188
+ config.plugins = {};
189
+ if (!config.plugins.entries)
190
+ config.plugins.entries = {};
191
+ if (!config.plugins.entries['mighty-mark']) {
192
+ config.plugins.entries['mighty-mark'] = { enabled: true, config: {} };
193
+ }
194
+ if (!config.plugins.entries['mighty-mark'].config) {
195
+ config.plugins.entries['mighty-mark'].config = {};
196
+ }
197
+ const pluginCfg = config.plugins.entries['mighty-mark'].config;
198
+ if (options.healthCheckKey) {
199
+ pluginCfg.healthCheckKey = options.healthCheckKey;
200
+ console.log(`[mighty-mark] Health Check Key configured: ${options.healthCheckKey.substring(0, 8)}${'*'.repeat(12)}`);
201
+ }
202
+ if (options.telegramToken) {
203
+ pluginCfg.telegramToken = options.telegramToken;
204
+ console.log('[mighty-mark] Telegram bot token configured');
205
+ }
206
+ if (options.telegramChatId) {
207
+ pluginCfg.telegramChatId = options.telegramChatId;
208
+ console.log(`[mighty-mark] Telegram chat ID configured: ${options.telegramChatId}`);
209
+ }
210
+ pluginCfg.dataDir = '.mighty-mark-data';
211
+ // ── Step 6: Write updated config (atomic) ─────────────────────
212
+ const tmpPath = configPath + '.mighty-mark-setup.tmp';
213
+ fs.writeFileSync(tmpPath, JSON.stringify(config, null, 2));
214
+ fs.renameSync(tmpPath, configPath);
215
+ console.log('[mighty-mark] Updated openclaw.json');
216
+ // ── Done ──────────────────────────────────────────────────────
217
+ console.log('');
218
+ console.log('╔══════════════════════════════════════════════════╗');
219
+ console.log('║ Mighty Mark agent setup complete! ║');
220
+ console.log('╚══════════════════════════════════════════════════╝');
221
+ console.log('');
222
+ console.log(' Agent directory: ' + agentDir);
223
+ console.log(' Workspace: ' + workspaceDir);
224
+ console.log(' Data directory: ' + dataDir);
225
+ console.log(' Model: ' + model);
226
+ console.log('');
227
+ if (!options.telegramToken) {
228
+ console.log(' NOTE: Telegram bot token not configured.');
229
+ console.log(' Morning reports and alerts will be disabled until configured.');
230
+ console.log(' Set via: openclaw.json → plugins.entries.mighty-mark.config.telegramToken');
231
+ console.log('');
232
+ }
233
+ console.log(' Restart OpenClaw to activate Mighty Mark:');
234
+ console.log(' systemctl restart openclaw-gateway');
235
+ console.log('');
236
+ console.log(" Then verify: 'Mark, status'");
237
+ }
238
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Mighty Mark configuration schema — validated with Zod at runtime.
3
+ */
4
+ import { z } from 'zod';
5
+ export declare const MightyMarkConfigSchema: z.ZodObject<{
6
+ healthCheckKey: z.ZodOptional<z.ZodString>;
7
+ telegramToken: z.ZodOptional<z.ZodString>;
8
+ telegramChatId: z.ZodOptional<z.ZodString>;
9
+ morningCheckHourCt: z.ZodDefault<z.ZodNumber>;
10
+ diskThresholdPercent: z.ZodDefault<z.ZodNumber>;
11
+ memoryThresholdMb: z.ZodDefault<z.ZodNumber>;
12
+ cpuThreshold: z.ZodDefault<z.ZodNumber>;
13
+ logSizeThresholdMb: z.ZodDefault<z.ZodNumber>;
14
+ expectedAgentCount: z.ZodDefault<z.ZodNumber>;
15
+ expectedToolCount: z.ZodDefault<z.ZodNumber>;
16
+ uptimeHistoryDays: z.ZodDefault<z.ZodNumber>;
17
+ dataDir: z.ZodDefault<z.ZodString>;
18
+ perCheckTimeoutMs: z.ZodDefault<z.ZodNumber>;
19
+ suiteTimeoutMs: z.ZodDefault<z.ZodNumber>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ morningCheckHourCt: number;
22
+ diskThresholdPercent: number;
23
+ memoryThresholdMb: number;
24
+ cpuThreshold: number;
25
+ logSizeThresholdMb: number;
26
+ expectedAgentCount: number;
27
+ expectedToolCount: number;
28
+ uptimeHistoryDays: number;
29
+ dataDir: string;
30
+ perCheckTimeoutMs: number;
31
+ suiteTimeoutMs: number;
32
+ healthCheckKey?: string | undefined;
33
+ telegramToken?: string | undefined;
34
+ telegramChatId?: string | undefined;
35
+ }, {
36
+ healthCheckKey?: string | undefined;
37
+ telegramToken?: string | undefined;
38
+ telegramChatId?: string | undefined;
39
+ morningCheckHourCt?: number | undefined;
40
+ diskThresholdPercent?: number | undefined;
41
+ memoryThresholdMb?: number | undefined;
42
+ cpuThreshold?: number | undefined;
43
+ logSizeThresholdMb?: number | undefined;
44
+ expectedAgentCount?: number | undefined;
45
+ expectedToolCount?: number | undefined;
46
+ uptimeHistoryDays?: number | undefined;
47
+ dataDir?: string | undefined;
48
+ perCheckTimeoutMs?: number | undefined;
49
+ suiteTimeoutMs?: number | undefined;
50
+ }>;
51
+ export type MightyMarkConfig = z.infer<typeof MightyMarkConfigSchema>;
52
+ /**
53
+ * Parse and validate a raw config object. Returns validated config with defaults applied.
54
+ */
55
+ export declare function parseConfig(raw?: Record<string, unknown>): MightyMarkConfig;
56
+ //# sourceMappingURL=config-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,gBAAgB,CAE/E"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Mighty Mark configuration schema — validated with Zod at runtime.
3
+ */
4
+ import { z } from 'zod';
5
+ export const MightyMarkConfigSchema = z.object({
6
+ healthCheckKey: z.string().startsWith('hck_').optional(),
7
+ // Telegram
8
+ telegramToken: z.string().optional(),
9
+ telegramChatId: z.string().optional(),
10
+ // Schedule (America/Chicago — DST-safe)
11
+ morningCheckHourCt: z.number().min(0).max(23).default(6),
12
+ // Thresholds
13
+ diskThresholdPercent: z.number().min(1).max(99).default(20),
14
+ memoryThresholdMb: z.number().min(64).max(16384).default(256),
15
+ cpuThreshold: z.number().min(0.1).max(64).default(3.0),
16
+ logSizeThresholdMb: z.number().min(10).max(10000).default(500),
17
+ // Fleet expectations
18
+ expectedAgentCount: z.number().min(1).default(6),
19
+ expectedToolCount: z.number().min(1).default(23),
20
+ // History
21
+ uptimeHistoryDays: z.number().min(1).max(365).default(30),
22
+ // Storage
23
+ dataDir: z.string().default('.mighty-mark-data'),
24
+ // Check timeouts
25
+ perCheckTimeoutMs: z.number().min(1000).max(60000).default(15000),
26
+ suiteTimeoutMs: z.number().min(10000).max(300000).default(120000),
27
+ });
28
+ /**
29
+ * Parse and validate a raw config object. Returns validated config with defaults applied.
30
+ */
31
+ export function parseConfig(raw = {}) {
32
+ return MightyMarkConfigSchema.parse(raw);
33
+ }
34
+ //# sourceMappingURL=config-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IAExD,WAAW;IACX,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAErC,wCAAwC;IACxC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAExD,aAAa;IACb,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3D,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAC7D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACtD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAE9D,qBAAqB;IACrB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAEhD,UAAU;IACV,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAEzD,UAAU;IACV,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC;IAEhD,iBAAiB;IACjB,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACjE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CAClE,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAA+B,EAAE;IAC3D,OAAO,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Default threshold constants for Mighty Mark health checks.
3
+ * These can be overridden via the config schema.
4
+ */
5
+ /** Minimum % disk space free before warning. */
6
+ export declare const DEFAULT_DISK_THRESHOLD_PERCENT = 20;
7
+ /** Critical disk threshold — below this is a failure, not warning. */
8
+ export declare const CRITICAL_DISK_THRESHOLD_PERCENT = 10;
9
+ /** Minimum MB memory available before warning. */
10
+ export declare const DEFAULT_MEMORY_THRESHOLD_MB = 256;
11
+ /** Critical memory threshold — below this is a failure. */
12
+ export declare const CRITICAL_MEMORY_THRESHOLD_MB = 128;
13
+ /** Maximum 5-min CPU load average before warning. */
14
+ export declare const DEFAULT_CPU_THRESHOLD = 3;
15
+ /** Maximum combined log size in MB before warning. */
16
+ export declare const DEFAULT_LOG_SIZE_THRESHOLD_MB = 500;
17
+ /** Minimum system uptime in minutes (below = warning from recent reboot). */
18
+ export declare const DEFAULT_MIN_UPTIME_MINUTES = 5;
19
+ /** Expected minimum number of registered tools. */
20
+ export declare const DEFAULT_EXPECTED_TOOL_COUNT = 23;
21
+ /** Per-check timeout in milliseconds. */
22
+ export declare const DEFAULT_PER_CHECK_TIMEOUT_MS = 15000;
23
+ /** Full suite timeout in milliseconds. */
24
+ export declare const DEFAULT_SUITE_TIMEOUT_MS = 120000;
25
+ /** API probe timeout in milliseconds. */
26
+ export declare const DEFAULT_API_TIMEOUT_MS = 10000;
27
+ /** How many days of uptime history to retain. */
28
+ export declare const DEFAULT_UPTIME_HISTORY_DAYS = 30;
29
+ /** Stale check threshold — reuse check results if newer than this (ms). */
30
+ export declare const STALE_CHECK_THRESHOLD_MS: number;
31
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,gDAAgD;AAChD,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD,sEAAsE;AACtE,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,kDAAkD;AAClD,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,2DAA2D;AAC3D,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,IAAM,CAAC;AAEzC,sDAAsD;AACtD,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD,6EAA6E;AAC7E,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,mDAAmD;AACnD,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,yCAAyC;AACzC,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,0CAA0C;AAC1C,eAAO,MAAM,wBAAwB,SAAU,CAAC;AAEhD,yCAAyC;AACzC,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C,iDAAiD;AACjD,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,QAAgB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Default threshold constants for Mighty Mark health checks.
3
+ * These can be overridden via the config schema.
4
+ */
5
+ /** Minimum % disk space free before warning. */
6
+ export const DEFAULT_DISK_THRESHOLD_PERCENT = 20;
7
+ /** Critical disk threshold — below this is a failure, not warning. */
8
+ export const CRITICAL_DISK_THRESHOLD_PERCENT = 10;
9
+ /** Minimum MB memory available before warning. */
10
+ export const DEFAULT_MEMORY_THRESHOLD_MB = 256;
11
+ /** Critical memory threshold — below this is a failure. */
12
+ export const CRITICAL_MEMORY_THRESHOLD_MB = 128;
13
+ /** Maximum 5-min CPU load average before warning. */
14
+ export const DEFAULT_CPU_THRESHOLD = 3.0;
15
+ /** Maximum combined log size in MB before warning. */
16
+ export const DEFAULT_LOG_SIZE_THRESHOLD_MB = 500;
17
+ /** Minimum system uptime in minutes (below = warning from recent reboot). */
18
+ export const DEFAULT_MIN_UPTIME_MINUTES = 5;
19
+ /** Expected minimum number of registered tools. */
20
+ export const DEFAULT_EXPECTED_TOOL_COUNT = 23;
21
+ /** Per-check timeout in milliseconds. */
22
+ export const DEFAULT_PER_CHECK_TIMEOUT_MS = 15_000;
23
+ /** Full suite timeout in milliseconds. */
24
+ export const DEFAULT_SUITE_TIMEOUT_MS = 120_000;
25
+ /** API probe timeout in milliseconds. */
26
+ export const DEFAULT_API_TIMEOUT_MS = 10_000;
27
+ /** How many days of uptime history to retain. */
28
+ export const DEFAULT_UPTIME_HISTORY_DAYS = 30;
29
+ /** Stale check threshold — reuse check results if newer than this (ms). */
30
+ export const STALE_CHECK_THRESHOLD_MS = 5 * 60 * 1000; // 5 minutes
31
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD,sEAAsE;AACtE,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAElD,kDAAkD;AAClD,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,2DAA2D;AAC3D,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAEhD,qDAAqD;AACrD,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,sDAAsD;AACtD,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAEjD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAE5C,mDAAmD;AACnD,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAE9C,yCAAyC;AACzC,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAEnD,0CAA0C;AAC1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAEhD,yCAAyC;AACzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE7C,iDAAiD;AACjD,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAE9C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Fleet topology loader — reads expected fleet configuration from an external
3
+ * JSON file so BB/Greg can update it without rebuilding the package.
4
+ */
5
+ import type { FleetTopology as FleetTopologyType, FleetAgent } from '../types/fleet.js';
6
+ export type { FleetTopology } from '../types/fleet.js';
7
+ export type { FleetAgent } from '../types/fleet.js';
8
+ /** Compiled-in default topology — used when fleet-topology.json is not found. */
9
+ export declare const DEFAULT_TOPOLOGY: FleetTopologyType;
10
+ /**
11
+ * Load fleet topology from the data directory. Falls back to compiled defaults.
12
+ */
13
+ export declare function loadFleetTopology(dataDir: string): FleetTopologyType;
14
+ /**
15
+ * Write the default fleet topology to the data directory (used during setup).
16
+ */
17
+ export declare function writeDefaultTopology(dataDir: string): void;
18
+ /** Get agents that have plugins. */
19
+ export declare function getPluginAgents(topology: FleetTopologyType): FleetAgent[];
20
+ /** Get agents that need data integrity checks. */
21
+ export declare function getDataCheckAgents(topology: FleetTopologyType): FleetAgent[];
22
+ //# sourceMappingURL=fleet-topology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-topology.d.ts","sourceRoot":"","sources":["../../src/config/fleet-topology.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,aAAa,IAAI,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAExF,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAwBpD,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,EAAE,iBAe9B,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAcpE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAO1D;AAED,oCAAoC;AACpC,wBAAgB,eAAe,CAAC,QAAQ,EAAE,iBAAiB,GAAG,UAAU,EAAE,CAEzE;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,UAAU,EAAE,CAE5E"}