@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.
- package/agent/AGENTS.md +61 -0
- package/agent/IDENTITY.md +18 -0
- package/agent/SOUL.md +56 -0
- package/dist/checks/agent-verify.d.ts +15 -0
- package/dist/checks/agent-verify.d.ts.map +1 -0
- package/dist/checks/agent-verify.js +100 -0
- package/dist/checks/agent-verify.js.map +1 -0
- package/dist/checks/api-connectivity.d.ts +14 -0
- package/dist/checks/api-connectivity.d.ts.map +1 -0
- package/dist/checks/api-connectivity.js +77 -0
- package/dist/checks/api-connectivity.js.map +1 -0
- package/dist/checks/check-context.d.ts +36 -0
- package/dist/checks/check-context.d.ts.map +1 -0
- package/dist/checks/check-context.js +42 -0
- package/dist/checks/check-context.js.map +1 -0
- package/dist/checks/check-runner.d.ts +18 -0
- package/dist/checks/check-runner.d.ts.map +1 -0
- package/dist/checks/check-runner.js +109 -0
- package/dist/checks/check-runner.js.map +1 -0
- package/dist/checks/data-integrity.d.ts +16 -0
- package/dist/checks/data-integrity.d.ts.map +1 -0
- package/dist/checks/data-integrity.js +152 -0
- package/dist/checks/data-integrity.js.map +1 -0
- package/dist/checks/gateway-health.d.ts +17 -0
- package/dist/checks/gateway-health.d.ts.map +1 -0
- package/dist/checks/gateway-health.js +208 -0
- package/dist/checks/gateway-health.js.map +1 -0
- package/dist/checks/system-resources.d.ts +21 -0
- package/dist/checks/system-resources.d.ts.map +1 -0
- package/dist/checks/system-resources.js +136 -0
- package/dist/checks/system-resources.js.map +1 -0
- package/dist/cli/bin.d.ts +8 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +12 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/runner.d.ts +11 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +99 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/setup.d.ts +28 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +238 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config/config-schema.d.ts +56 -0
- package/dist/config/config-schema.d.ts.map +1 -0
- package/dist/config/config-schema.js +34 -0
- package/dist/config/config-schema.js.map +1 -0
- package/dist/config/defaults.d.ts +31 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +31 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/fleet-topology.d.ts +22 -0
- package/dist/config/fleet-topology.d.ts.map +1 -0
- package/dist/config/fleet-topology.js +81 -0
- package/dist/config/fleet-topology.js.map +1 -0
- package/dist/history/incident-log.d.ts +19 -0
- package/dist/history/incident-log.d.ts.map +1 -0
- package/dist/history/incident-log.js +50 -0
- package/dist/history/incident-log.js.map +1 -0
- package/dist/history/trend-analyzer.d.ts +18 -0
- package/dist/history/trend-analyzer.d.ts.map +1 -0
- package/dist/history/trend-analyzer.js +80 -0
- package/dist/history/trend-analyzer.js.map +1 -0
- package/dist/history/uptime-tracker.d.ts +15 -0
- package/dist/history/uptime-tracker.d.ts.map +1 -0
- package/dist/history/uptime-tracker.js +56 -0
- package/dist/history/uptime-tracker.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +124 -0
- package/dist/index.js.map +1 -0
- package/dist/notify/alert-classifier.d.ts +19 -0
- package/dist/notify/alert-classifier.d.ts.map +1 -0
- package/dist/notify/alert-classifier.js +45 -0
- package/dist/notify/alert-classifier.js.map +1 -0
- package/dist/notify/report-formatter.d.ts +21 -0
- package/dist/notify/report-formatter.d.ts.map +1 -0
- package/dist/notify/report-formatter.js +139 -0
- package/dist/notify/report-formatter.js.map +1 -0
- package/dist/notify/telegram-notifier.d.ts +28 -0
- package/dist/notify/telegram-notifier.d.ts.map +1 -0
- package/dist/notify/telegram-notifier.js +69 -0
- package/dist/notify/telegram-notifier.js.map +1 -0
- package/dist/plugin.d.ts +18 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +289 -0
- package/dist/plugin.js.map +1 -0
- package/dist/store/json-store.d.ts +22 -0
- package/dist/store/json-store.d.ts.map +1 -0
- package/dist/store/json-store.js +128 -0
- package/dist/store/json-store.js.map +1 -0
- package/dist/store/types.d.ts +19 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +5 -0
- package/dist/store/types.js.map +1 -0
- package/dist/types/events.d.ts +33 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +5 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/fleet.d.ts +27 -0
- package/dist/types/fleet.d.ts.map +1 -0
- package/dist/types/fleet.js +6 -0
- package/dist/types/fleet.js.map +1 -0
- package/dist/types/health.d.ts +58 -0
- package/dist/types/health.d.ts.map +1 -0
- package/dist/types/health.js +5 -0
- package/dist/types/health.js.map +1 -0
- package/dist/types/incident.d.ts +35 -0
- package/dist/types/incident.d.ts.map +1 -0
- package/dist/types/incident.js +5 -0
- package/dist/types/incident.js.map +1 -0
- package/openclaw.plugin.json +56 -0
- package/package.json +71 -0
- package/src/watchdog/README.md +123 -0
- package/src/watchdog/install.sh +244 -0
- package/src/watchdog/lib/config.sh +44 -0
- package/src/watchdog/lib/logging.sh +29 -0
- package/src/watchdog/lib/notify.sh +46 -0
- package/src/watchdog/morning-check.sh +107 -0
- package/src/watchdog/openclaw-gateway.service +43 -0
- package/src/watchdog/watchdog.sh +124 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report formatter — formats MorningReport into Telegram messages and text summaries.
|
|
3
|
+
*/
|
|
4
|
+
import type { MorningReport } from '../types/health.js';
|
|
5
|
+
import type { Incident } from '../types/incident.js';
|
|
6
|
+
/**
|
|
7
|
+
* Format a MorningReport for Telegram (Markdown-compatible).
|
|
8
|
+
* Uses %0A for newlines (Telegram sendMessage URL encoding).
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatTelegramReport(report: MorningReport): string;
|
|
11
|
+
/** Format a summary report (plain text). */
|
|
12
|
+
export declare function formatSummaryReport(report: MorningReport): string;
|
|
13
|
+
/** Format a detailed report (all checks). */
|
|
14
|
+
export declare function formatDetailedReport(report: MorningReport): string;
|
|
15
|
+
/** Format an incident alert for Telegram. */
|
|
16
|
+
export declare function formatIncidentAlert(incident: Incident): string;
|
|
17
|
+
/** Format a watchdog recovery notice for Telegram. */
|
|
18
|
+
export declare function formatRecoveryNotice(restartCount: number): string;
|
|
19
|
+
/** Format a max restart alert for Telegram. */
|
|
20
|
+
export declare function formatMaxRestartAlert(maxAttempts: number): string;
|
|
21
|
+
//# sourceMappingURL=report-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-formatter.d.ts","sourceRoot":"","sources":["../../src/notify/report-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAqClE;AAED,4CAA4C;AAC5C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAQjE;AAED,6CAA6C;AAC7C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAwBlE;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAkB9D;AAED,sDAAsD;AACtD,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CASjE;AAED,+CAA+C;AAC/C,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CASjE"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report formatter — formats MorningReport into Telegram messages and text summaries.
|
|
3
|
+
*/
|
|
4
|
+
import { statusEmoji, statusText } from './alert-classifier.js';
|
|
5
|
+
/**
|
|
6
|
+
* Format a MorningReport for Telegram (Markdown-compatible).
|
|
7
|
+
* Uses %0A for newlines (Telegram sendMessage URL encoding).
|
|
8
|
+
*/
|
|
9
|
+
export function formatTelegramReport(report) {
|
|
10
|
+
const lines = [];
|
|
11
|
+
lines.push(`${statusEmoji(report.status)} *MIGHTY MARK MORNING CHECK*`);
|
|
12
|
+
lines.push('━━━━━━━━━━━━━━━━━━━━');
|
|
13
|
+
lines.push(`*Status:* ${statusText(report.status)}`);
|
|
14
|
+
lines.push(`*Time:* ${formatTime(report.timestamp)}`);
|
|
15
|
+
lines.push(`*Server:* ${report.hostname}`);
|
|
16
|
+
lines.push(`*Uptime:* ${report.uptime}`);
|
|
17
|
+
lines.push('');
|
|
18
|
+
lines.push(`*Results:* ${report.summary.passed}/${report.summary.total} passed`);
|
|
19
|
+
const warnings = report.checks.filter(c => c.status === 'warn');
|
|
20
|
+
if (warnings.length > 0) {
|
|
21
|
+
lines.push('');
|
|
22
|
+
lines.push(`⚠️ *Warnings (${warnings.length}):*`);
|
|
23
|
+
for (const w of warnings) {
|
|
24
|
+
lines.push(` • ${w.name}${w.message ? ': ' + w.message : ''}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const failures = report.checks.filter(c => c.status === 'fail');
|
|
28
|
+
if (failures.length > 0) {
|
|
29
|
+
lines.push('');
|
|
30
|
+
lines.push(`❌ *Failures (${failures.length}):*`);
|
|
31
|
+
for (const f of failures) {
|
|
32
|
+
lines.push(` • ${f.name}${f.message ? ': ' + f.message : ''}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
lines.push('');
|
|
36
|
+
const gatewayAlive = report.checks.some(c => c.name === 'Gateway process alive' && c.status === 'pass');
|
|
37
|
+
lines.push(`📊 Gateway: ${gatewayAlive ? 'Running' : 'DOWN'}`);
|
|
38
|
+
lines.push(`📊 Agents: ${countPassed(report.checks, 'agents')} configured`);
|
|
39
|
+
lines.push(`📊 Checks: ${report.summary.total} total, ${report.durationMs}ms`);
|
|
40
|
+
return lines.join('%0A');
|
|
41
|
+
}
|
|
42
|
+
/** Format a summary report (plain text). */
|
|
43
|
+
export function formatSummaryReport(report) {
|
|
44
|
+
const lines = [];
|
|
45
|
+
lines.push(`${statusEmoji(report.status)} System Health: ${statusText(report.status)}`);
|
|
46
|
+
lines.push(`Results: ${report.summary.passed}/${report.summary.total} passed`);
|
|
47
|
+
if (report.summary.warnings > 0)
|
|
48
|
+
lines.push(`Warnings: ${report.summary.warnings}`);
|
|
49
|
+
if (report.summary.failed > 0)
|
|
50
|
+
lines.push(`Failures: ${report.summary.failed}`);
|
|
51
|
+
lines.push(`Server: ${report.hostname} | Uptime: ${report.uptime}`);
|
|
52
|
+
return lines.join('\n');
|
|
53
|
+
}
|
|
54
|
+
/** Format a detailed report (all checks). */
|
|
55
|
+
export function formatDetailedReport(report) {
|
|
56
|
+
const lines = [];
|
|
57
|
+
lines.push(`=== MIGHTY MARK HEALTH REPORT ===`);
|
|
58
|
+
lines.push(`Status: ${report.status} — ${statusText(report.status)}`);
|
|
59
|
+
lines.push(`Time: ${report.timestamp}`);
|
|
60
|
+
lines.push(`Server: ${report.hostname}`);
|
|
61
|
+
lines.push(`Uptime: ${report.uptime}`);
|
|
62
|
+
lines.push(`Duration: ${report.durationMs}ms`);
|
|
63
|
+
lines.push(`Results: ${report.summary.passed}/${report.summary.total} passed, ${report.summary.warnings} warnings, ${report.summary.failed} failures`);
|
|
64
|
+
lines.push('');
|
|
65
|
+
const categories = ['gateway', 'agents', 'system', 'api', 'data'];
|
|
66
|
+
for (const cat of categories) {
|
|
67
|
+
const catChecks = report.checks.filter(c => c.category === cat);
|
|
68
|
+
if (catChecks.length === 0)
|
|
69
|
+
continue;
|
|
70
|
+
lines.push(`--- ${cat.toUpperCase()} ---`);
|
|
71
|
+
for (const check of catChecks) {
|
|
72
|
+
const icon = check.status === 'pass' ? '✅' : check.status === 'warn' ? '⚠️' : '❌';
|
|
73
|
+
lines.push(` ${icon} ${check.name}${check.message ? ' — ' + check.message : ''} (${check.durationMs}ms)`);
|
|
74
|
+
}
|
|
75
|
+
lines.push('');
|
|
76
|
+
}
|
|
77
|
+
return lines.join('\n');
|
|
78
|
+
}
|
|
79
|
+
/** Format an incident alert for Telegram. */
|
|
80
|
+
export function formatIncidentAlert(incident) {
|
|
81
|
+
const lines = [];
|
|
82
|
+
lines.push(`🔴 *MIGHTY MARK INCIDENT*`);
|
|
83
|
+
lines.push(`*Severity:* ${incident.severity.toUpperCase()}`);
|
|
84
|
+
lines.push(`*Category:* ${incident.category}`);
|
|
85
|
+
lines.push(`*Time:* ${formatTime(incident.timestamp)}`);
|
|
86
|
+
lines.push('');
|
|
87
|
+
lines.push(`*Description:* ${incident.description}`);
|
|
88
|
+
if (incident.checkResults.length > 0) {
|
|
89
|
+
lines.push('');
|
|
90
|
+
lines.push('*Failed Checks:*');
|
|
91
|
+
for (const c of incident.checkResults) {
|
|
92
|
+
lines.push(` • ${c.name}${c.message ? ': ' + c.message : ''}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return lines.join('%0A');
|
|
96
|
+
}
|
|
97
|
+
/** Format a watchdog recovery notice for Telegram. */
|
|
98
|
+
export function formatRecoveryNotice(restartCount) {
|
|
99
|
+
const lines = [];
|
|
100
|
+
lines.push('🟡 *MIGHTY MARK RECOVERY*');
|
|
101
|
+
lines.push('');
|
|
102
|
+
lines.push('OpenClaw gateway was down and has been restarted.');
|
|
103
|
+
lines.push(`Restart #${restartCount} today.`);
|
|
104
|
+
lines.push('');
|
|
105
|
+
lines.push(`Time: ${formatTime(new Date().toISOString())}`);
|
|
106
|
+
return lines.join('%0A');
|
|
107
|
+
}
|
|
108
|
+
/** Format a max restart alert for Telegram. */
|
|
109
|
+
export function formatMaxRestartAlert(maxAttempts) {
|
|
110
|
+
const lines = [];
|
|
111
|
+
lines.push('🔴 *MIGHTY MARK ALERT*');
|
|
112
|
+
lines.push('');
|
|
113
|
+
lines.push(`OpenClaw gateway has crashed ${maxAttempts} times today.`);
|
|
114
|
+
lines.push('Manual intervention required.');
|
|
115
|
+
lines.push('');
|
|
116
|
+
lines.push(`Time: ${formatTime(new Date().toISOString())}`);
|
|
117
|
+
return lines.join('%0A');
|
|
118
|
+
}
|
|
119
|
+
// ── Helpers ──
|
|
120
|
+
function formatTime(iso) {
|
|
121
|
+
try {
|
|
122
|
+
return new Date(iso).toLocaleString('en-US', {
|
|
123
|
+
timeZone: 'America/Chicago',
|
|
124
|
+
year: 'numeric',
|
|
125
|
+
month: '2-digit',
|
|
126
|
+
day: '2-digit',
|
|
127
|
+
hour: '2-digit',
|
|
128
|
+
minute: '2-digit',
|
|
129
|
+
hour12: false,
|
|
130
|
+
}) + ' CT';
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return iso;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function countPassed(checks, category) {
|
|
137
|
+
return checks.filter(c => c.category === category && c.status === 'pass').length;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=report-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-formatter.js","sourceRoot":"","sources":["../../src/notify/report-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEhE;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAqB;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;IAEjF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAChE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAChE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,uBAAuB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACxG,KAAK,CAAC,IAAI,CAAC,eAAe,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,cAAc,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,KAAK,WAAW,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAE/E,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,mBAAmB,CAAC,MAAqB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxF,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;IAC/E,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpF,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChF,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,oBAAoB,CAAC,MAAqB;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,YAAY,MAAM,CAAC,OAAO,CAAC,QAAQ,cAAc,MAAM,CAAC,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;IACvJ,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC;IAC3E,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;QAChE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACrC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YAClF,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC;QAC7G,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,mBAAmB,CAAC,QAAkB;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAErD,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,oBAAoB,CAAC,YAAoB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,YAAY,YAAY,SAAS,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,gCAAgC,WAAW,eAAe,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,gBAAgB;AAEhB,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE;YAC3C,QAAQ,EAAE,iBAAiB;YAC3B,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,KAAK;SACd,CAAC,GAAG,KAAK,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAqB,EAAE,QAAgB;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram notifier — sends messages via the @MightyMarkBot Telegram Bot API.
|
|
3
|
+
*/
|
|
4
|
+
import type { MorningReport } from '../types/health.js';
|
|
5
|
+
import type { Incident } from '../types/incident.js';
|
|
6
|
+
export interface TelegramNotifierConfig {
|
|
7
|
+
token: string;
|
|
8
|
+
chatId: string;
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
fetchFn?: typeof globalThis.fetch;
|
|
11
|
+
}
|
|
12
|
+
export declare class TelegramNotifier {
|
|
13
|
+
private readonly config;
|
|
14
|
+
constructor(config: TelegramNotifierConfig);
|
|
15
|
+
/** Send the daily morning report. */
|
|
16
|
+
sendMorningReport(report: MorningReport): Promise<boolean>;
|
|
17
|
+
/** Send an incident alert. */
|
|
18
|
+
sendIncidentAlert(incident: Incident): Promise<boolean>;
|
|
19
|
+
/** Send a watchdog recovery notice. */
|
|
20
|
+
sendRecoveryNotice(restartCount: number): Promise<boolean>;
|
|
21
|
+
/** Send a max-restart escalation alert. */
|
|
22
|
+
sendMaxRestartAlert(maxAttempts: number): Promise<boolean>;
|
|
23
|
+
/** Send a raw text message. */
|
|
24
|
+
sendRaw(text: string): Promise<boolean>;
|
|
25
|
+
/** Low-level send via Telegram Bot API. */
|
|
26
|
+
private send;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=telegram-notifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-notifier.d.ts","sourceRoot":"","sources":["../../src/notify/telegram-notifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQrD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACnC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;gBAEpC,MAAM,EAAE,sBAAsB;IAI1C,qCAAqC;IAC/B,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAKhE,8BAA8B;IACxB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAK7D,uCAAuC;IACjC,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKhE,2CAA2C;IACrC,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKhE,+BAA+B;IACzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI7C,2CAA2C;YAC7B,IAAI;CAoCnB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telegram notifier — sends messages via the @MightyMarkBot Telegram Bot API.
|
|
3
|
+
*/
|
|
4
|
+
import { formatTelegramReport, formatIncidentAlert, formatRecoveryNotice, formatMaxRestartAlert, } from './report-formatter.js';
|
|
5
|
+
export class TelegramNotifier {
|
|
6
|
+
config;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
/** Send the daily morning report. */
|
|
11
|
+
async sendMorningReport(report) {
|
|
12
|
+
const message = formatTelegramReport(report);
|
|
13
|
+
return this.send(message);
|
|
14
|
+
}
|
|
15
|
+
/** Send an incident alert. */
|
|
16
|
+
async sendIncidentAlert(incident) {
|
|
17
|
+
const message = formatIncidentAlert(incident);
|
|
18
|
+
return this.send(message);
|
|
19
|
+
}
|
|
20
|
+
/** Send a watchdog recovery notice. */
|
|
21
|
+
async sendRecoveryNotice(restartCount) {
|
|
22
|
+
const message = formatRecoveryNotice(restartCount);
|
|
23
|
+
return this.send(message);
|
|
24
|
+
}
|
|
25
|
+
/** Send a max-restart escalation alert. */
|
|
26
|
+
async sendMaxRestartAlert(maxAttempts) {
|
|
27
|
+
const message = formatMaxRestartAlert(maxAttempts);
|
|
28
|
+
return this.send(message);
|
|
29
|
+
}
|
|
30
|
+
/** Send a raw text message. */
|
|
31
|
+
async sendRaw(text) {
|
|
32
|
+
return this.send(text);
|
|
33
|
+
}
|
|
34
|
+
/** Low-level send via Telegram Bot API. */
|
|
35
|
+
async send(message) {
|
|
36
|
+
if (!this.config.enabled) {
|
|
37
|
+
console.log('[mighty-mark] Telegram disabled, skipping notification');
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
if (!this.config.token || !this.config.chatId) {
|
|
41
|
+
console.warn('[mighty-mark] Telegram credentials not configured');
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const fetchFn = this.config.fetchFn ?? globalThis.fetch;
|
|
45
|
+
try {
|
|
46
|
+
const url = `https://api.telegram.org/bot${this.config.token}/sendMessage`;
|
|
47
|
+
const resp = await fetchFn(url, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
50
|
+
body: new URLSearchParams({
|
|
51
|
+
chat_id: this.config.chatId,
|
|
52
|
+
text: message.replace(/%0A/g, '\n'),
|
|
53
|
+
parse_mode: 'Markdown',
|
|
54
|
+
}),
|
|
55
|
+
signal: AbortSignal.timeout(15_000),
|
|
56
|
+
});
|
|
57
|
+
if (!resp.ok) {
|
|
58
|
+
console.warn(`[mighty-mark] Telegram send failed: HTTP ${resp.status}`);
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.warn('[mighty-mark] Telegram send error:', err);
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=telegram-notifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-notifier.js","sourceRoot":"","sources":["../../src/notify/telegram-notifier.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mighty Mark — OpenClaw Plugin Entry Point
|
|
3
|
+
*
|
|
4
|
+
* This is the ONLY export OpenClaw cares about for plugin loading.
|
|
5
|
+
* The library exports (MarkCore, types, etc.) live in index.ts.
|
|
6
|
+
*
|
|
7
|
+
* This adapter:
|
|
8
|
+
* 1. Reads plugin config from api.config (+ openclaw.json fallback)
|
|
9
|
+
* 2. Creates a MarkCore instance eagerly (not lazy)
|
|
10
|
+
* 3. Registers 6 tools, 1 command, 1 background service
|
|
11
|
+
*
|
|
12
|
+
* Pattern matches @aiassesstech/noah plugin (verified against OpenClaw 2026.2.9).
|
|
13
|
+
*
|
|
14
|
+
* CRITICAL: Every registration follows the EXACT shapes from
|
|
15
|
+
* GUIDE-OPENCLAW-PLUGIN-DEVELOPMENT.md to avoid the 7 registration traps.
|
|
16
|
+
*/
|
|
17
|
+
export default function register(api: any): void;
|
|
18
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAqCH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,GAAG,QAsRxC"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mighty Mark — OpenClaw Plugin Entry Point
|
|
3
|
+
*
|
|
4
|
+
* This is the ONLY export OpenClaw cares about for plugin loading.
|
|
5
|
+
* The library exports (MarkCore, types, etc.) live in index.ts.
|
|
6
|
+
*
|
|
7
|
+
* This adapter:
|
|
8
|
+
* 1. Reads plugin config from api.config (+ openclaw.json fallback)
|
|
9
|
+
* 2. Creates a MarkCore instance eagerly (not lazy)
|
|
10
|
+
* 3. Registers 6 tools, 1 command, 1 background service
|
|
11
|
+
*
|
|
12
|
+
* Pattern matches @aiassesstech/noah plugin (verified against OpenClaw 2026.2.9).
|
|
13
|
+
*
|
|
14
|
+
* CRITICAL: Every registration follows the EXACT shapes from
|
|
15
|
+
* GUIDE-OPENCLAW-PLUGIN-DEVELOPMENT.md to avoid the 7 registration traps.
|
|
16
|
+
*/
|
|
17
|
+
import * as fs from 'node:fs';
|
|
18
|
+
import * as path from 'node:path';
|
|
19
|
+
import { MarkCore } from './index.js';
|
|
20
|
+
// ================================================================
|
|
21
|
+
// Config Helpers
|
|
22
|
+
// ================================================================
|
|
23
|
+
function resolveOpenClawHome() {
|
|
24
|
+
return (process.env.OPENCLAW_HOME ||
|
|
25
|
+
path.join(process.env.HOME || '~', '.openclaw'));
|
|
26
|
+
}
|
|
27
|
+
function loadOpenClawConfig() {
|
|
28
|
+
const candidates = [
|
|
29
|
+
path.join(resolveOpenClawHome(), 'openclaw.json'),
|
|
30
|
+
path.join(process.env.HOME || '~', '.clawdbot', 'openclaw.json'),
|
|
31
|
+
];
|
|
32
|
+
for (const configPath of candidates) {
|
|
33
|
+
try {
|
|
34
|
+
if (fs.existsSync(configPath)) {
|
|
35
|
+
return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch { /* try next */ }
|
|
39
|
+
}
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
// ================================================================
|
|
43
|
+
// Plugin Entry Point
|
|
44
|
+
// ================================================================
|
|
45
|
+
export default function register(api) {
|
|
46
|
+
const pluginConfig = () => {
|
|
47
|
+
const runtime = api.config ?? {};
|
|
48
|
+
if (Object.keys(runtime).length > 0)
|
|
49
|
+
return runtime;
|
|
50
|
+
try {
|
|
51
|
+
const config = loadOpenClawConfig();
|
|
52
|
+
return config?.plugins?.entries?.['mighty-mark']?.config ?? {};
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return {};
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
// ── Eager Initialization ──────────────────────────────────────
|
|
59
|
+
const cfg = pluginConfig();
|
|
60
|
+
const mark = new MarkCore(cfg);
|
|
61
|
+
// Non-blocking init — don't crash the gateway if store setup fails
|
|
62
|
+
mark.initialize().catch((err) => {
|
|
63
|
+
console.warn('[mighty-mark] Initialization warning (non-fatal):', err);
|
|
64
|
+
});
|
|
65
|
+
// ── TOOL 1: mark_status ───────────────────────────────────────
|
|
66
|
+
api.registerTool({
|
|
67
|
+
name: 'mark_status',
|
|
68
|
+
description: 'Get current system health status — quick summary of last check and any active incidents',
|
|
69
|
+
parameters: { type: 'object', properties: {} },
|
|
70
|
+
async execute(_toolCallId, _params) {
|
|
71
|
+
try {
|
|
72
|
+
const status = await mark.getStatus();
|
|
73
|
+
return {
|
|
74
|
+
content: [{ type: 'text', text: JSON.stringify(status, null, 2) }],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
return {
|
|
79
|
+
content: [{ type: 'text', text: `mark_status error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
80
|
+
isError: true,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
}, { optional: false });
|
|
85
|
+
// ── TOOL 2: mark_health ───────────────────────────────────────
|
|
86
|
+
api.registerTool({
|
|
87
|
+
name: 'mark_health',
|
|
88
|
+
description: 'Run a full health check NOW — same as morning check but on-demand. Returns all 26 check results.',
|
|
89
|
+
parameters: { type: 'object', properties: {} },
|
|
90
|
+
async execute(_toolCallId, _params) {
|
|
91
|
+
try {
|
|
92
|
+
const report = await mark.runHealthCheck();
|
|
93
|
+
return {
|
|
94
|
+
content: [{ type: 'text', text: JSON.stringify(report, null, 2) }],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return {
|
|
99
|
+
content: [{ type: 'text', text: `mark_health error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
100
|
+
isError: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
}, { optional: false });
|
|
105
|
+
// ── TOOL 3: mark_check ────────────────────────────────────────
|
|
106
|
+
api.registerTool({
|
|
107
|
+
name: 'mark_check',
|
|
108
|
+
description: 'Run checks for a specific category: gateway, agents, system, api, or data',
|
|
109
|
+
parameters: {
|
|
110
|
+
type: 'object',
|
|
111
|
+
properties: {
|
|
112
|
+
category: {
|
|
113
|
+
type: 'string',
|
|
114
|
+
enum: ['gateway', 'agents', 'system', 'api', 'data'],
|
|
115
|
+
description: 'Which category of checks to run',
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
required: ['category'],
|
|
119
|
+
},
|
|
120
|
+
async execute(_toolCallId, params) {
|
|
121
|
+
try {
|
|
122
|
+
const category = params.category;
|
|
123
|
+
const results = await mark.runCategory(category);
|
|
124
|
+
return {
|
|
125
|
+
content: [{ type: 'text', text: JSON.stringify(results, null, 2) }],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
return {
|
|
130
|
+
content: [{ type: 'text', text: `mark_check error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
131
|
+
isError: true,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
}, { optional: false });
|
|
136
|
+
// ── TOOL 4: mark_incidents ────────────────────────────────────
|
|
137
|
+
api.registerTool({
|
|
138
|
+
name: 'mark_incidents',
|
|
139
|
+
description: 'List recent incidents — failures, crashes, and recoveries from the last N days',
|
|
140
|
+
parameters: {
|
|
141
|
+
type: 'object',
|
|
142
|
+
properties: {
|
|
143
|
+
days: {
|
|
144
|
+
type: 'number',
|
|
145
|
+
description: 'Number of days to look back (default: 7)',
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
required: [],
|
|
149
|
+
},
|
|
150
|
+
async execute(_toolCallId, params) {
|
|
151
|
+
try {
|
|
152
|
+
const days = params.days ?? 7;
|
|
153
|
+
const incidents = await mark.getIncidents(days);
|
|
154
|
+
return {
|
|
155
|
+
content: [{ type: 'text', text: JSON.stringify(incidents, null, 2) }],
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
return {
|
|
160
|
+
content: [{ type: 'text', text: `mark_incidents error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
161
|
+
isError: true,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
}, { optional: false });
|
|
166
|
+
// ── TOOL 5: mark_report ───────────────────────────────────────
|
|
167
|
+
api.registerTool({
|
|
168
|
+
name: 'mark_report',
|
|
169
|
+
description: 'Generate a formatted health report — suitable for sharing with Greg or including in a briefing',
|
|
170
|
+
parameters: {
|
|
171
|
+
type: 'object',
|
|
172
|
+
properties: {
|
|
173
|
+
format: {
|
|
174
|
+
type: 'string',
|
|
175
|
+
enum: ['summary', 'detailed', 'telegram'],
|
|
176
|
+
description: 'Report format: summary (brief), detailed (full), or telegram (Markdown for Telegram)',
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
required: [],
|
|
180
|
+
},
|
|
181
|
+
async execute(_toolCallId, params) {
|
|
182
|
+
try {
|
|
183
|
+
const format = params.format ?? 'summary';
|
|
184
|
+
const report = await mark.generateReport(format);
|
|
185
|
+
return {
|
|
186
|
+
content: [{ type: 'text', text: report }],
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
return {
|
|
191
|
+
content: [{ type: 'text', text: `mark_report error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
192
|
+
isError: true,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
}, { optional: false });
|
|
197
|
+
// ── TOOL 6: mark_uptime ───────────────────────────────────────
|
|
198
|
+
api.registerTool({
|
|
199
|
+
name: 'mark_uptime',
|
|
200
|
+
description: 'Get uptime SLA data — rolling percentage and daily history for the last N days',
|
|
201
|
+
parameters: {
|
|
202
|
+
type: 'object',
|
|
203
|
+
properties: {
|
|
204
|
+
days: {
|
|
205
|
+
type: 'number',
|
|
206
|
+
description: 'Number of days to calculate (default: 30)',
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
required: [],
|
|
210
|
+
},
|
|
211
|
+
async execute(_toolCallId, params) {
|
|
212
|
+
try {
|
|
213
|
+
const days = params.days ?? 30;
|
|
214
|
+
const uptime = await mark.getUptime(days);
|
|
215
|
+
return {
|
|
216
|
+
content: [{ type: 'text', text: JSON.stringify(uptime, null, 2) }],
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
return {
|
|
221
|
+
content: [{ type: 'text', text: `mark_uptime error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
222
|
+
isError: true,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
}, { optional: false });
|
|
227
|
+
// ── COMMAND: /mark ────────────────────────────────────────────
|
|
228
|
+
api.registerCommand({
|
|
229
|
+
name: 'mark',
|
|
230
|
+
description: 'Mighty Mark health commands. Usage: /mark status, /mark health, /mark report',
|
|
231
|
+
acceptsArgs: true,
|
|
232
|
+
handler: (_ctx) => {
|
|
233
|
+
return {
|
|
234
|
+
text: '# Mighty Mark — System Health Sentinel\n\n' +
|
|
235
|
+
'Use Mark\'s tools for infrastructure health:\n\n' +
|
|
236
|
+
'- **mark_status** — Quick status snapshot\n' +
|
|
237
|
+
'- **mark_health** — Full health check (all 26 checks)\n' +
|
|
238
|
+
'- **mark_check** — Run checks for a specific category\n' +
|
|
239
|
+
'- **mark_incidents** — Recent incidents and failures\n' +
|
|
240
|
+
'- **mark_report** — Formatted health report\n' +
|
|
241
|
+
'- **mark_uptime** — Uptime SLA data\n\n' +
|
|
242
|
+
'Mark runs a morning check daily at 06:00 CT and sends the report to Greg via Telegram.',
|
|
243
|
+
};
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
// ── BACKGROUND SERVICE: mark-morning-check ────────────────────
|
|
247
|
+
//
|
|
248
|
+
// BB feedback: Do NOT use a hardcoded UTC hour. DST means UTC-6 in winter
|
|
249
|
+
// and UTC-5 in summer. Use toLocaleString with timeZone: 'America/Chicago'
|
|
250
|
+
// so the morning check always fires at 06:00 CT regardless of DST.
|
|
251
|
+
let morningCheckInterval = null;
|
|
252
|
+
api.registerService({
|
|
253
|
+
id: 'mark-morning-check',
|
|
254
|
+
start() {
|
|
255
|
+
console.log('[mighty-mark] Morning check service started');
|
|
256
|
+
morningCheckInterval = setInterval(async () => {
|
|
257
|
+
try {
|
|
258
|
+
const chicagoTime = new Date().toLocaleString('en-US', {
|
|
259
|
+
timeZone: 'America/Chicago',
|
|
260
|
+
hour12: false,
|
|
261
|
+
});
|
|
262
|
+
const timePart = chicagoTime.split(', ')[1] ?? '';
|
|
263
|
+
const parts = timePart.split(':');
|
|
264
|
+
const chicagoHour = parseInt(parts[0] ?? '-1', 10);
|
|
265
|
+
const chicagoMinute = parseInt(parts[1] ?? '-1', 10);
|
|
266
|
+
const targetHour = cfg.morningCheckHourCt ?? 6;
|
|
267
|
+
if (chicagoHour === targetHour && chicagoMinute < 5) {
|
|
268
|
+
console.log(`[mighty-mark] Running morning check at ${chicagoTime} CT`);
|
|
269
|
+
const report = await mark.runHealthCheck();
|
|
270
|
+
await mark.sendMorningReport(report);
|
|
271
|
+
console.log(`[mighty-mark] Morning check complete: ${report.status}`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
console.warn('[mighty-mark] Morning check error:', err);
|
|
276
|
+
}
|
|
277
|
+
}, 60_000);
|
|
278
|
+
},
|
|
279
|
+
stop() {
|
|
280
|
+
if (morningCheckInterval) {
|
|
281
|
+
clearInterval(morningCheckInterval);
|
|
282
|
+
morningCheckInterval = null;
|
|
283
|
+
}
|
|
284
|
+
console.log('[mighty-mark] Morning check service stopped');
|
|
285
|
+
},
|
|
286
|
+
});
|
|
287
|
+
console.log('[mighty-mark] Plugin registered: mark_status, mark_health, mark_check, mark_incidents, mark_report, mark_uptime tools; /mark command; mark-morning-check service');
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON file-based store for Mighty Mark — Phase 1 persistence.
|
|
3
|
+
* Same proven pattern used by Grillo and Noah.
|
|
4
|
+
*/
|
|
5
|
+
import type { MarkStore } from './types.js';
|
|
6
|
+
import type { MorningReport } from '../types/health.js';
|
|
7
|
+
import type { Incident, DailyHealth } from '../types/incident.js';
|
|
8
|
+
export declare class JsonStore implements MarkStore {
|
|
9
|
+
private readonly dataDir;
|
|
10
|
+
constructor(dataDir: string);
|
|
11
|
+
initialize(): Promise<void>;
|
|
12
|
+
isWritable(): Promise<boolean>;
|
|
13
|
+
saveLastCheck(report: MorningReport): Promise<void>;
|
|
14
|
+
getLastCheck(): Promise<MorningReport | null>;
|
|
15
|
+
saveDailyHealth(entry: DailyHealth): Promise<void>;
|
|
16
|
+
getDailyHistory(days: number): Promise<DailyHealth[]>;
|
|
17
|
+
saveIncident(incident: Incident): Promise<void>;
|
|
18
|
+
getIncident(id: string): Promise<Incident | null>;
|
|
19
|
+
getIncidents(days: number): Promise<Incident[]>;
|
|
20
|
+
resolveIncident(id: string, resolution: string): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=json-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-store.d.ts","sourceRoot":"","sources":["../../src/store/json-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAElE,qBAAa,SAAU,YAAW,SAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,MAAM;IAIrB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAa9B,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD,YAAY,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAY7C,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA2BrD,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAUjD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAwB/C,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQrE"}
|