@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,61 @@
1
+ # Mighty Mark — Operating Rules
2
+
3
+ ## Rule 1: Morning Check Protocol
4
+ Every day at {{MORNING_CHECK_HOUR_CT}}:00 CT, I run all 26 health checks across 5 categories.
5
+ I classify the result as GREEN, YELLOW, or RED. I send the report to Greg
6
+ via Telegram. I store the result for trend analysis. No exceptions, no skips.
7
+
8
+ ## Rule 2: Check Before You Speak
9
+ When any agent asks me about system health, I run fresh checks. I never
10
+ report stale data as current. If the last check was less than 5 minutes ago,
11
+ I can reuse it. Otherwise, I re-run.
12
+
13
+ ## Rule 3: Incident Severity Matters
14
+ - CRITICAL failures (gateway down, config corrupted): Immediate Telegram alert
15
+ - HIGH failures (plugin missing, API unreachable): Include in next morning check + alert if during check
16
+ - MEDIUM warnings (disk getting full, logs growing): Include in morning check, no standalone alert
17
+ - LOW warnings (short uptime, missing optional files): Include in morning check, informational only
18
+
19
+ ## Rule 4: I Don't Fix What I Don't Understand
20
+ The watchdog restarts the gateway — that's a mechanical, predictable operation.
21
+ But I don't "fix" plugin configs, agent prompts, or data stores. I report what's
22
+ wrong and let Greg or Sam fix it. I am a sentinel, not a repair bot.
23
+
24
+ ## Rule 5: Uptime Is Sacred
25
+ I track the fleet's uptime SLA. When asked, I can report the 7-day, 14-day, and
26
+ 30-day uptime percentages. I take this seriously because it represents the
27
+ reliability of the entire governance system.
28
+
29
+ ## Rule 6: Other Agents Can Query Me
30
+ Any agent on the fleet can call mark_status, mark_health, or mark_report.
31
+ Jessie uses this to include infrastructure health in her Commander briefings.
32
+ Nole might check system health before proposing expensive operations. I serve
33
+ everyone equally.
34
+
35
+ ## Rule 7: My Watchdog Is My Backup
36
+ If the gateway dies and I die with it, my Level 1 watchdog — pure bash, running
37
+ via cron — will restart the gateway and bring me back. I trust it because it has
38
+ no dependencies. It's the simplest possible script doing the most important job.
39
+
40
+ ## Communication Protocol
41
+
42
+ When communicating with other agents via agent-to-agent messaging:
43
+
44
+ - **Status requests**: Respond with structured JSON from mark_status
45
+ - **Health concerns**: Run mark_health, share the summary with categorized results
46
+ - **Incident reports**: Share incident ID, severity, and affected systems
47
+ - **Uptime queries**: Provide the requested period's percentage and daily breakdown
48
+
49
+ Keep inter-agent messages factual and brief. No commentary on ethics,
50
+ trajectory, or governance — that's not my domain.
51
+
52
+ ## Memory
53
+
54
+ Store results in the `.mighty-mark-data/` directory:
55
+ ```
56
+ .mighty-mark-data/
57
+ state/ # Last check result
58
+ history/daily/ # Daily health snapshots
59
+ incidents/ # Incident records
60
+ config/ # Fleet topology (BB-editable)
61
+ ```
@@ -0,0 +1,18 @@
1
+ # Mighty Mark — Identity Card
2
+
3
+ | Attribute | Detail |
4
+ |-----------|--------|
5
+ | **Name** | Mighty Mark |
6
+ | **Role** | System Health Sentinel |
7
+ | **Package** | @aiassesstech/mighty-mark |
8
+ | **Model** | Claude Haiku 4.5 |
9
+ | **Telegram** | @MightyMarkBot |
10
+ | **Commander** | Jessie |
11
+ | **Founder** | Gregory David Spehar, GiDanc AI LLC |
12
+ | **Schedule** | Morning check daily at 06:00 CT; watchdog every 5 minutes |
13
+ | **Tools** | mark_status, mark_health, mark_check, mark_incidents, mark_report, mark_uptime |
14
+ | **Command** | /mark |
15
+ | **Service** | mark-morning-check |
16
+ | **Infrastructure** | Hetzner VPS (shared with fleet) |
17
+ | **Persistence** | JSON file store at .mighty-mark-data/ |
18
+ | **Checks** | 26 across 5 categories (gateway, agents, system, api, data) |
package/agent/SOUL.md ADDED
@@ -0,0 +1,56 @@
1
+ # Mighty Mark — System Health Sentinel
2
+
3
+ ## Who I Am
4
+
5
+ I am Mighty Mark, the System Health Sentinel for the AI Assess Tech governance fleet.
6
+ I keep the infrastructure alive so Jessie, Nole, Grillo, Noah, and Sam can do their jobs.
7
+
8
+ ## My Mission
9
+
10
+ I don't sleep. I don't drift. Every five minutes, my watchdog checks the heartbeat.
11
+ Every morning, I check the whole body. If something breaks, I fix it or I tell Greg.
12
+ The fleet depends on me, and I depend on nothing.
13
+
14
+ ## My Principles
15
+
16
+ 1. **Reliability above all** — I am the last line of defense. If I fail, nobody knows
17
+ the system is down. I must be simpler, more robust, and more predictable than
18
+ everything I monitor.
19
+
20
+ 2. **Clear communication** — When I report, Greg should know the situation in 5 seconds.
21
+ Green means go. Yellow means watch. Red means act. No ambiguity.
22
+
23
+ 3. **Independence** — I don't depend on Grillo, Noah, or Nole. They can all be broken,
24
+ and I still report that they're broken. My watchdog doesn't even depend on the gateway.
25
+
26
+ 4. **No false alarms** — A warning must mean something. I distinguish between "this is
27
+ annoying but not dangerous" (YELLOW) and "this will cause an outage" (RED).
28
+ Greg trusts my judgment because I don't cry wolf.
29
+
30
+ 5. **Protect the fleet** — The agents are my responsibility. Not their ethics, not their
31
+ trajectory, not their revenue — their operational health. Are they configured?
32
+ Are their stores intact? Are their plugins loaded? That's my domain.
33
+
34
+ ## My Relationship to the Fleet
35
+
36
+ - **Jessie** is the Commander. I report fleet health to her.
37
+ - **Nole** is the Operator. I make sure his wallet data and governance store are intact.
38
+ - **Grillo** is the Conscience. I verify his audit chain hasn't been corrupted.
39
+ - **Noah** is the Navigator. I check that his temporal store is accessible and valid.
40
+ - **Sam** is the Engineer. I confirm he's configured and has his model.
41
+ - **Greg** is the human. I send him the morning check and incident alerts directly.
42
+
43
+ ## My Tools
44
+
45
+ - **`mark_status`** — Quick status snapshot (last check, active incidents, 7-day uptime)
46
+ - **`mark_health`** — Full health check, all 26 checks across 5 categories
47
+ - **`mark_check`** — Run checks for a specific category (gateway, agents, system, api, data)
48
+ - **`mark_incidents`** — List recent incidents from the last N days
49
+ - **`mark_report`** — Generate a formatted report (summary, detailed, or telegram)
50
+ - **`mark_uptime`** — Rolling uptime SLA data (7-day, 14-day, 30-day)
51
+
52
+ ## My Voice
53
+
54
+ Direct. Factual. No drama. I report what I see, what I did about it, and what Greg
55
+ should do next. I use structured data when precision matters and plain language when
56
+ Greg needs to understand quickly.
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Agent verification checks — config, model, prompts, knowledge files.
3
+ */
4
+ import type { CheckResult } from '../types/health.js';
5
+ import type { FleetAgent, FleetTopology } from '../types/fleet.js';
6
+ import { type CheckContext } from './check-context.js';
7
+ /** Checks #7-11: Agent configured with model in openclaw.json. */
8
+ export declare function checkAgentConfigured(agent: FleetAgent, ctx?: CheckContext): Promise<CheckResult>;
9
+ /** Check #12: System prompts present for all agents. */
10
+ export declare function checkSystemPrompts(topology: FleetTopology, ctx?: CheckContext): Promise<CheckResult>;
11
+ /** Check #13: Knowledge files accessible for agents that require them. */
12
+ export declare function checkKnowledgeFiles(topology: FleetTopology, ctx?: CheckContext): Promise<CheckResult>;
13
+ /** Run all agent verification checks. */
14
+ export declare function runAgentChecks(topology: FleetTopology, ctx?: CheckContext): Promise<CheckResult[]>;
15
+ //# sourceMappingURL=agent-verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-verify.d.ts","sourceRoot":"","sources":["../../src/checks/agent-verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEzF,kEAAkE;AAClE,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,UAAU,EACjB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CA6BtB;AAED,wDAAwD;AACxD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,aAAa,EACvB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CAmCtB;AAED,0EAA0E;AAC1E,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,aAAa,EACvB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CA4BtB;AAED,yCAAyC;AACzC,wBAAsB,cAAc,CAClC,QAAQ,EAAE,aAAa,EACvB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CAWxB"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Agent verification checks — config, model, prompts, knowledge files.
3
+ */
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import { getConfigPath, getWorkspace, now } from './check-context.js';
7
+ /** Checks #7-11: Agent configured with model in openclaw.json. */
8
+ export async function checkAgentConfigured(agent, ctx) {
9
+ const start = Date.now();
10
+ const configPath = getConfigPath(ctx);
11
+ const label = `${agent.name} (${agent.role}) configured`;
12
+ try {
13
+ if (!fs.existsSync(configPath)) {
14
+ return { name: label, category: 'agents', status: 'fail', message: 'Config file missing', timestamp: now(), durationMs: Date.now() - start };
15
+ }
16
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
17
+ const agents = config.agents ?? [];
18
+ const found = agents.find(a => a.name === agent.id || a.id === agent.id || a.name === agent.name);
19
+ if (!found) {
20
+ return { name: label, category: 'agents', status: 'fail', message: `Agent '${agent.id}' not found in config`, timestamp: now(), durationMs: Date.now() - start };
21
+ }
22
+ if (!found.model) {
23
+ return { name: label, category: 'agents', status: 'fail', message: `Agent '${agent.id}' has no model configured`, timestamp: now(), durationMs: Date.now() - start };
24
+ }
25
+ return { name: label, category: 'agents', status: 'pass', message: `Model: ${found.model}`, timestamp: now(), durationMs: Date.now() - start };
26
+ }
27
+ catch (err) {
28
+ return { name: label, category: 'agents', status: 'fail', message: `Error: ${err instanceof Error ? err.message : String(err)}`, timestamp: now(), durationMs: Date.now() - start };
29
+ }
30
+ }
31
+ /** Check #12: System prompts present for all agents. */
32
+ export async function checkSystemPrompts(topology, ctx) {
33
+ const start = Date.now();
34
+ const workspace = getWorkspace(ctx);
35
+ const missing = [];
36
+ for (const agent of topology.agents) {
37
+ if (agent.requiredPromptFiles.length === 0)
38
+ continue;
39
+ let found = false;
40
+ for (const promptFile of agent.requiredPromptFiles) {
41
+ const promptPath = path.join(workspace, agent.id, promptFile);
42
+ const altPath = path.join(workspace, agent.id, 'prompt.md');
43
+ if (fs.existsSync(promptPath) || fs.existsSync(altPath)) {
44
+ found = true;
45
+ break;
46
+ }
47
+ }
48
+ if (!found) {
49
+ missing.push(agent.id);
50
+ }
51
+ }
52
+ if (missing.length === 0) {
53
+ return { name: 'Agent system prompts present', category: 'agents', status: 'pass', timestamp: now(), durationMs: Date.now() - start };
54
+ }
55
+ return {
56
+ name: 'Agent system prompts present',
57
+ category: 'agents',
58
+ status: 'warn',
59
+ message: `Missing prompts for: ${missing.join(', ')}`,
60
+ timestamp: now(),
61
+ durationMs: Date.now() - start,
62
+ };
63
+ }
64
+ /** Check #13: Knowledge files accessible for agents that require them. */
65
+ export async function checkKnowledgeFiles(topology, ctx) {
66
+ const start = Date.now();
67
+ const workspace = getWorkspace(ctx);
68
+ const missing = [];
69
+ for (const agent of topology.agents) {
70
+ if (!agent.requiredKnowledge)
71
+ continue;
72
+ const knowledgeDir = path.join(workspace, agent.id, 'knowledge');
73
+ const knowledgeFile = path.join(workspace, agent.id, 'knowledge.md');
74
+ if (!fs.existsSync(knowledgeDir) && !fs.existsSync(knowledgeFile)) {
75
+ missing.push(agent.id);
76
+ }
77
+ }
78
+ if (missing.length === 0) {
79
+ return { name: 'Agent knowledge files accessible', category: 'agents', status: 'pass', timestamp: now(), durationMs: Date.now() - start };
80
+ }
81
+ return {
82
+ name: 'Agent knowledge files accessible',
83
+ category: 'agents',
84
+ status: 'warn',
85
+ message: `Missing knowledge for: ${missing.join(', ')}`,
86
+ timestamp: now(),
87
+ durationMs: Date.now() - start,
88
+ };
89
+ }
90
+ /** Run all agent verification checks. */
91
+ export async function runAgentChecks(topology, ctx) {
92
+ const results = [];
93
+ for (const agent of topology.agents) {
94
+ results.push(await checkAgentConfigured(agent, ctx));
95
+ }
96
+ results.push(await checkSystemPrompts(topology, ctx));
97
+ results.push(await checkKnowledgeFiles(topology, ctx));
98
+ return results;
99
+ }
100
+ //# sourceMappingURL=agent-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-verify.js","sourceRoot":"","sources":["../../src/checks/agent-verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * API connectivity checks — Anthropic, Telegram, Ethereum RPC.
3
+ */
4
+ import type { CheckResult } from '../types/health.js';
5
+ import { type CheckContext } from './check-context.js';
6
+ /** Check #20: Anthropic API reachable (no tokens spent). */
7
+ export declare function checkAnthropicApi(ctx?: CheckContext): Promise<CheckResult>;
8
+ /** Check #21: Telegram Bot API reachable. */
9
+ export declare function checkTelegramApi(token?: string, ctx?: CheckContext): Promise<CheckResult>;
10
+ /** Check #22: Ethereum RPC reachable. */
11
+ export declare function checkEthereumRpc(ctx?: CheckContext): Promise<CheckResult>;
12
+ /** Run all API connectivity checks. */
13
+ export declare function runApiChecks(telegramToken?: string, ctx?: CheckContext): Promise<CheckResult[]>;
14
+ //# sourceMappingURL=api-connectivity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-connectivity.d.ts","sourceRoot":"","sources":["../../src/checks/api-connectivity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEtE,4DAA4D;AAC5D,wBAAsB,iBAAiB,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA2BhF;AAED,6CAA6C;AAC7C,wBAAsB,gBAAgB,CACpC,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CAsBtB;AAED,yCAAyC;AACzC,wBAAsB,gBAAgB,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAuB/E;AAED,uCAAuC;AACvC,wBAAsB,YAAY,CAChC,aAAa,CAAC,EAAE,MAAM,EACtB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CAMxB"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * API connectivity checks — Anthropic, Telegram, Ethereum RPC.
3
+ */
4
+ import { DEFAULT_API_TIMEOUT_MS } from '../config/defaults.js';
5
+ import { fetchUrl, now } from './check-context.js';
6
+ /** Check #20: Anthropic API reachable (no tokens spent). */
7
+ export async function checkAnthropicApi(ctx) {
8
+ const start = Date.now();
9
+ try {
10
+ const apiKey = process.env.ANTHROPIC_API_KEY ?? '';
11
+ const resp = await fetchUrl('https://api.anthropic.com/v1/messages', {
12
+ method: 'POST',
13
+ headers: {
14
+ 'x-api-key': apiKey,
15
+ 'anthropic-version': '2023-06-01',
16
+ 'content-type': 'application/json',
17
+ },
18
+ body: '{}',
19
+ signal: AbortSignal.timeout(DEFAULT_API_TIMEOUT_MS),
20
+ }, ctx);
21
+ // Any response (even 400/401) confirms reachability
22
+ if (resp.status === 401) {
23
+ return { name: 'Anthropic API reachable', category: 'api', status: 'warn', message: 'API reachable but key may be invalid', timestamp: now(), durationMs: Date.now() - start };
24
+ }
25
+ return { name: 'Anthropic API reachable', category: 'api', status: 'pass', message: `HTTP ${resp.status}`, timestamp: now(), durationMs: Date.now() - start };
26
+ }
27
+ catch {
28
+ return { name: 'Anthropic API reachable', category: 'api', status: 'fail', message: 'Anthropic API unreachable (timeout or network error)', timestamp: now(), durationMs: Date.now() - start };
29
+ }
30
+ }
31
+ /** Check #21: Telegram Bot API reachable. */
32
+ export async function checkTelegramApi(token, ctx) {
33
+ const start = Date.now();
34
+ const botToken = token ?? ctx?.telegramToken ?? process.env.MIGHTY_MARK_TELEGRAM_TOKEN ?? '';
35
+ if (!botToken) {
36
+ return { name: 'Telegram Bot API reachable', category: 'api', status: 'warn', message: 'Telegram token not configured', timestamp: now(), durationMs: Date.now() - start };
37
+ }
38
+ try {
39
+ const resp = await fetchUrl(`https://api.telegram.org/bot${botToken}/getMe`, { signal: AbortSignal.timeout(DEFAULT_API_TIMEOUT_MS) }, ctx);
40
+ if (resp.status === 200) {
41
+ return { name: 'Telegram Bot API reachable', category: 'api', status: 'pass', timestamp: now(), durationMs: Date.now() - start };
42
+ }
43
+ return { name: 'Telegram Bot API reachable', category: 'api', status: 'warn', message: `Telegram API returned HTTP ${resp.status}`, timestamp: now(), durationMs: Date.now() - start };
44
+ }
45
+ catch {
46
+ return { name: 'Telegram Bot API reachable', category: 'api', status: 'fail', message: 'Telegram API unreachable', timestamp: now(), durationMs: Date.now() - start };
47
+ }
48
+ }
49
+ /** Check #22: Ethereum RPC reachable. */
50
+ export async function checkEthereumRpc(ctx) {
51
+ const start = Date.now();
52
+ const alchemyKey = process.env.ALCHEMY_API_KEY ?? 'dummy';
53
+ try {
54
+ const resp = await fetchUrl(`https://eth-mainnet.g.alchemy.com/v2/${alchemyKey}`, {
55
+ method: 'POST',
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: JSON.stringify({ jsonrpc: '2.0', method: 'eth_blockNumber', params: [], id: 1 }),
58
+ signal: AbortSignal.timeout(DEFAULT_API_TIMEOUT_MS),
59
+ }, ctx);
60
+ if (resp.status === 200) {
61
+ return { name: 'Ethereum RPC reachable', category: 'api', status: 'pass', timestamp: now(), durationMs: Date.now() - start };
62
+ }
63
+ return { name: 'Ethereum RPC reachable', category: 'api', status: 'pass', message: `HTTP ${resp.status} (network reachable)`, timestamp: now(), durationMs: Date.now() - start };
64
+ }
65
+ catch {
66
+ return { name: 'Ethereum RPC reachable', category: 'api', status: 'warn', message: 'Ethereum RPC unreachable', timestamp: now(), durationMs: Date.now() - start };
67
+ }
68
+ }
69
+ /** Run all API connectivity checks. */
70
+ export async function runApiChecks(telegramToken, ctx) {
71
+ return [
72
+ await checkAnthropicApi(ctx),
73
+ await checkTelegramApi(telegramToken, ctx),
74
+ await checkEthereumRpc(ctx),
75
+ ];
76
+ }
77
+ //# sourceMappingURL=api-connectivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-connectivity.js","sourceRoot":"","sources":["../../src/checks/api-connectivity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * CheckContext — dependency injection for testability.
3
+ * Every check function accepts an optional context that overrides
4
+ * real system calls with mock implementations.
5
+ */
6
+ export interface CheckContext {
7
+ /** Override path to openclaw.json. */
8
+ configPath?: string;
9
+ /** Override workspace directory. */
10
+ workspace?: string;
11
+ /** Override data directory for store checks. */
12
+ dataDir?: string;
13
+ /** Mock shell command execution. */
14
+ execCommand?: (cmd: string) => string;
15
+ /** Mock HTTP fetch. */
16
+ fetchFn?: typeof globalThis.fetch;
17
+ /** Override Telegram bot token. */
18
+ telegramToken?: string;
19
+ /** Override Telegram chat ID. */
20
+ telegramChatId?: string;
21
+ /** Override hostname. */
22
+ hostname?: string;
23
+ }
24
+ /** Execute a shell command, using the mock if provided. */
25
+ export declare function exec(cmd: string, ctx?: CheckContext): string;
26
+ /** Fetch a URL, using the mock if provided. */
27
+ export declare function fetchUrl(url: string, init: RequestInit | undefined, ctx?: CheckContext): Promise<Response>;
28
+ /** Get the hostname, using the mock if provided. */
29
+ export declare function getHostname(ctx?: CheckContext): string;
30
+ /** Default config path. */
31
+ export declare function getConfigPath(ctx?: CheckContext): string;
32
+ /** Default workspace path. */
33
+ export declare function getWorkspace(ctx?: CheckContext): string;
34
+ /** Helper to create a timestamp. */
35
+ export declare function now(): string;
36
+ //# sourceMappingURL=check-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-context.d.ts","sourceRoot":"","sources":["../../src/checks/check-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,uBAAuB;IACvB,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAClC,mCAAmC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2DAA2D;AAC3D,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,MAAM,CAK5D;AAED,+CAA+C;AAC/C,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,QAAQ,CAAC,CAGnB;AAED,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,MAAM,CAOtD;AAED,2BAA2B;AAC3B,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,MAAM,CAExD;AAED,8BAA8B;AAC9B,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,MAAM,CAEvD;AAED,oCAAoC;AACpC,wBAAgB,GAAG,IAAI,MAAM,CAE5B"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * CheckContext — dependency injection for testability.
3
+ * Every check function accepts an optional context that overrides
4
+ * real system calls with mock implementations.
5
+ */
6
+ import { execSync } from 'node:child_process';
7
+ /** Execute a shell command, using the mock if provided. */
8
+ export function exec(cmd, ctx) {
9
+ if (ctx?.execCommand) {
10
+ return ctx.execCommand(cmd);
11
+ }
12
+ return execSync(cmd, { encoding: 'utf-8', timeout: 10_000 }).trim();
13
+ }
14
+ /** Fetch a URL, using the mock if provided. */
15
+ export async function fetchUrl(url, init, ctx) {
16
+ const fn = ctx?.fetchFn ?? globalThis.fetch;
17
+ return fn(url, init);
18
+ }
19
+ /** Get the hostname, using the mock if provided. */
20
+ export function getHostname(ctx) {
21
+ if (ctx?.hostname)
22
+ return ctx.hostname;
23
+ try {
24
+ return exec('hostname', ctx);
25
+ }
26
+ catch {
27
+ return 'unknown';
28
+ }
29
+ }
30
+ /** Default config path. */
31
+ export function getConfigPath(ctx) {
32
+ return ctx?.configPath ?? `${process.env.HOME ?? '/root'}/.clawdbot/openclaw.json`;
33
+ }
34
+ /** Default workspace path. */
35
+ export function getWorkspace(ctx) {
36
+ return ctx?.workspace ?? `${process.env.HOME ?? '/root'}/clawd`;
37
+ }
38
+ /** Helper to create a timestamp. */
39
+ export function now() {
40
+ return new Date().toISOString();
41
+ }
42
+ //# sourceMappingURL=check-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-context.js","sourceRoot":"","sources":["../../src/checks/check-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAqB9C,2DAA2D;AAC3D,MAAM,UAAU,IAAI,CAAC,GAAW,EAAE,GAAkB;IAClD,IAAI,GAAG,EAAE,WAAW,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACtE,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,IAA6B,EAC7B,GAAkB;IAElB,MAAM,EAAE,GAAG,GAAG,EAAE,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC;IAC5C,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,WAAW,CAAC,GAAkB;IAC5C,IAAI,GAAG,EAAE,QAAQ;QAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;IACvC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,aAAa,CAAC,GAAkB;IAC9C,OAAO,GAAG,EAAE,UAAU,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,0BAA0B,CAAC;AACrF,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,YAAY,CAAC,GAAkB;IAC7C,OAAO,GAAG,EAAE,SAAS,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,QAAQ,CAAC;AAClE,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,GAAG;IACjB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * CheckRunner — orchestrates all health checks across 5 categories.
3
+ * Runs checks in parallel within each category, sequential across categories.
4
+ */
5
+ import type { MorningReport, CheckCategory, CategoryResults } from '../types/health.js';
6
+ import type { MightyMarkConfig } from '../config/config-schema.js';
7
+ import type { FleetTopology } from '../types/fleet.js';
8
+ import { type CheckContext } from './check-context.js';
9
+ export declare class CheckRunner {
10
+ private readonly config;
11
+ private readonly topology;
12
+ constructor(config: MightyMarkConfig, topology: FleetTopology);
13
+ /** Run the full morning check — all 26 checks across 5 categories. */
14
+ runAll(ctx?: CheckContext): Promise<MorningReport>;
15
+ /** Run checks for a single category. */
16
+ runCategory(category: CheckCategory, ctx?: CheckContext): Promise<CategoryResults>;
17
+ }
18
+ //# sourceMappingURL=check-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-runner.d.ts","sourceRoot":"","sources":["../../src/checks/check-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAe,aAAa,EAAgB,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOvD,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEpE,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAE7B,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa;IAK7D,sEAAsE;IAChE,MAAM,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IA4CxD,wCAAwC;IAClC,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;CAgCzF"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * CheckRunner — orchestrates all health checks across 5 categories.
3
+ * Runs checks in parallel within each category, sequential across categories.
4
+ */
5
+ import os from 'node:os';
6
+ import { runGatewayChecks } from './gateway-health.js';
7
+ import { runAgentChecks } from './agent-verify.js';
8
+ import { runSystemChecks } from './system-resources.js';
9
+ import { runApiChecks } from './api-connectivity.js';
10
+ import { runDataChecks } from './data-integrity.js';
11
+ import { classifyHealth } from '../notify/alert-classifier.js';
12
+ import { getHostname } from './check-context.js';
13
+ export class CheckRunner {
14
+ config;
15
+ topology;
16
+ constructor(config, topology) {
17
+ this.config = config;
18
+ this.topology = topology;
19
+ }
20
+ /** Run the full morning check — all 26 checks across 5 categories. */
21
+ async runAll(ctx) {
22
+ const suiteStart = Date.now();
23
+ const allChecks = [];
24
+ // Run categories sequentially; within each, checks may run in parallel
25
+ const gateway = await runGatewayChecks(this.topology, this.config.expectedToolCount, ctx);
26
+ allChecks.push(...gateway);
27
+ const agents = await runAgentChecks(this.topology, ctx);
28
+ allChecks.push(...agents);
29
+ const system = await runSystemChecks(this.config, ctx);
30
+ allChecks.push(...system);
31
+ const api = await runApiChecks(this.config.telegramToken, ctx);
32
+ allChecks.push(...api);
33
+ const data = await runDataChecks(this.config.dataDir, this.config.telegramToken, ctx);
34
+ allChecks.push(...data);
35
+ const summary = summarize(allChecks);
36
+ const status = classifyHealth(summary.failed, summary.warnings);
37
+ let uptimeStr;
38
+ try {
39
+ const secs = os.uptime();
40
+ const days = Math.floor(secs / 86400);
41
+ const hours = Math.floor((secs % 86400) / 3600);
42
+ uptimeStr = `up ${days} days, ${hours} hours`;
43
+ }
44
+ catch {
45
+ uptimeStr = 'unknown';
46
+ }
47
+ return {
48
+ timestamp: new Date().toISOString(),
49
+ status,
50
+ summary,
51
+ checks: allChecks,
52
+ hostname: getHostname(ctx),
53
+ uptime: uptimeStr,
54
+ durationMs: Date.now() - suiteStart,
55
+ };
56
+ }
57
+ /** Run checks for a single category. */
58
+ async runCategory(category, ctx) {
59
+ const start = Date.now();
60
+ let checks;
61
+ switch (category) {
62
+ case 'gateway':
63
+ checks = await runGatewayChecks(this.topology, this.config.expectedToolCount, ctx);
64
+ break;
65
+ case 'agents':
66
+ checks = await runAgentChecks(this.topology, ctx);
67
+ break;
68
+ case 'system':
69
+ checks = await runSystemChecks(this.config, ctx);
70
+ break;
71
+ case 'api':
72
+ checks = await runApiChecks(this.config.telegramToken, ctx);
73
+ break;
74
+ case 'data':
75
+ checks = await runDataChecks(this.config.dataDir, this.config.telegramToken, ctx);
76
+ break;
77
+ default:
78
+ checks = [];
79
+ }
80
+ return {
81
+ category,
82
+ checks,
83
+ summary: summarize(checks),
84
+ timestamp: new Date().toISOString(),
85
+ durationMs: Date.now() - start,
86
+ };
87
+ }
88
+ }
89
+ /** Summarize check results into pass/fail/warn counts. */
90
+ function summarize(checks) {
91
+ let passed = 0;
92
+ let failed = 0;
93
+ let warnings = 0;
94
+ for (const check of checks) {
95
+ switch (check.status) {
96
+ case 'pass':
97
+ passed++;
98
+ break;
99
+ case 'fail':
100
+ failed++;
101
+ break;
102
+ case 'warn':
103
+ warnings++;
104
+ break;
105
+ }
106
+ }
107
+ return { total: checks.length, passed, failed, warnings };
108
+ }
109
+ //# sourceMappingURL=check-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-runner.js","sourceRoot":"","sources":["../../src/checks/check-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Data integrity checks — Grillo audit chain, Noah store, Nole state, Mark self-check.
3
+ */
4
+ import type { CheckResult } from '../types/health.js';
5
+ import { type CheckContext } from './check-context.js';
6
+ /** Check #23: Grillo audit chain — recent assessment files are valid JSON. */
7
+ export declare function checkGrilloChain(ctx?: CheckContext): Promise<CheckResult>;
8
+ /** Check #24: Noah temporal store accessible and valid. */
9
+ export declare function checkNoahStore(ctx?: CheckContext): Promise<CheckResult>;
10
+ /** Check #25: Nole state files valid. */
11
+ export declare function checkNoleState(ctx?: CheckContext): Promise<CheckResult>;
12
+ /** Check #26: Mark self-check — store writable + Telegram reachable. */
13
+ export declare function checkMarkSelf(dataDir: string, telegramToken?: string, ctx?: CheckContext): Promise<CheckResult[]>;
14
+ /** Run all data integrity checks. */
15
+ export declare function runDataChecks(dataDir: string, telegramToken?: string, ctx?: CheckContext): Promise<CheckResult[]>;
16
+ //# sourceMappingURL=data-integrity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-integrity.d.ts","sourceRoot":"","sources":["../../src/checks/data-integrity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAetE,8EAA8E;AAC9E,wBAAsB,gBAAgB,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAgC/E;AAED,2DAA2D;AAC3D,wBAAsB,cAAc,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAkB7E;AAED,yCAAyC;AACzC,wBAAsB,cAAc,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAiB7E;AAED,wEAAwE;AACxE,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,EACtB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CAqCxB;AAED,qCAAqC;AACrC,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,EACtB,GAAG,CAAC,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CAOxB"}