@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,81 @@
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 fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import { z } from 'zod';
8
+ const FleetAgentSchema = z.object({
9
+ id: z.string(),
10
+ name: z.string(),
11
+ role: z.string(),
12
+ model: z.string(),
13
+ hasPlugin: z.boolean(),
14
+ pluginId: z.string().optional(),
15
+ requiredPromptFiles: z.array(z.string()).default([]),
16
+ requiredKnowledge: z.boolean().default(false),
17
+ dataChecks: z.array(z.string()).default([]),
18
+ });
19
+ const FleetTopologySchema = z.object({
20
+ version: z.string(),
21
+ lastUpdated: z.string().optional(),
22
+ updatedBy: z.string().optional(),
23
+ agents: z.array(FleetAgentSchema),
24
+ plugins: z.array(z.string()),
25
+ expectedMinToolCount: z.number().default(23),
26
+ notes: z.string().optional(),
27
+ });
28
+ /** Compiled-in default topology — used when fleet-topology.json is not found. */
29
+ export const DEFAULT_TOPOLOGY = {
30
+ version: '1.0',
31
+ lastUpdated: '2026-02-17',
32
+ updatedBy: 'Archie (default)',
33
+ agents: [
34
+ { id: 'jessie', name: 'Jessie', role: 'commander', model: 'claude-haiku-4-5', hasPlugin: false, requiredPromptFiles: ['system-prompt.md'], requiredKnowledge: false, dataChecks: [] },
35
+ { id: 'nole', name: 'Nole', role: 'operator', model: 'claude-sonnet-4-5', hasPlugin: true, pluginId: 'nole', requiredPromptFiles: ['system-prompt.md'], requiredKnowledge: true, dataChecks: ['nole-state'] },
36
+ { id: 'grillo', name: 'Grillo', role: 'conscience', model: 'claude-haiku-4-5', hasPlugin: true, pluginId: 'grillo', requiredPromptFiles: ['system-prompt.md'], requiredKnowledge: true, dataChecks: ['grillo-chain'] },
37
+ { id: 'noah', name: 'Noah', role: 'navigator', model: 'claude-haiku-4-5', hasPlugin: true, pluginId: 'noah', requiredPromptFiles: ['system-prompt.md'], requiredKnowledge: true, dataChecks: ['noah-store'] },
38
+ { id: 'sam', name: 'Sam', role: 'engineer', model: 'claude-sonnet-4-5', hasPlugin: false, requiredPromptFiles: ['system-prompt.md'], requiredKnowledge: false, dataChecks: [] },
39
+ { id: 'mighty-mark', name: 'Mighty Mark', role: 'sentinel', model: 'claude-haiku-4-5', hasPlugin: true, pluginId: 'mighty-mark', requiredPromptFiles: ['system-prompt.md'], requiredKnowledge: false, dataChecks: ['mark-self'] },
40
+ ],
41
+ plugins: ['grillo', 'noah', 'nole', 'mighty-mark'],
42
+ expectedMinToolCount: 23,
43
+ notes: 'Edit this file to add/remove agents or change expectations. No rebuild required.',
44
+ };
45
+ /**
46
+ * Load fleet topology from the data directory. Falls back to compiled defaults.
47
+ */
48
+ export function loadFleetTopology(dataDir) {
49
+ const topoPath = path.join(dataDir, 'config', 'fleet-topology.json');
50
+ if (!fs.existsSync(topoPath)) {
51
+ return DEFAULT_TOPOLOGY;
52
+ }
53
+ try {
54
+ const raw = JSON.parse(fs.readFileSync(topoPath, 'utf-8'));
55
+ return FleetTopologySchema.parse(raw);
56
+ }
57
+ catch (err) {
58
+ console.warn('[mighty-mark] Failed to parse fleet-topology.json, using defaults:', err);
59
+ return DEFAULT_TOPOLOGY;
60
+ }
61
+ }
62
+ /**
63
+ * Write the default fleet topology to the data directory (used during setup).
64
+ */
65
+ export function writeDefaultTopology(dataDir) {
66
+ const configDir = path.join(dataDir, 'config');
67
+ if (!fs.existsSync(configDir)) {
68
+ fs.mkdirSync(configDir, { recursive: true });
69
+ }
70
+ const topoPath = path.join(configDir, 'fleet-topology.json');
71
+ fs.writeFileSync(topoPath, JSON.stringify(DEFAULT_TOPOLOGY, null, 2) + '\n');
72
+ }
73
+ /** Get agents that have plugins. */
74
+ export function getPluginAgents(topology) {
75
+ return topology.agents.filter(a => a.hasPlugin);
76
+ }
77
+ /** Get agents that need data integrity checks. */
78
+ export function getDataCheckAgents(topology) {
79
+ return topology.agents.filter(a => a.dataChecks.length > 0);
80
+ }
81
+ //# sourceMappingURL=fleet-topology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-topology.js","sourceRoot":"","sources":["../../src/config/fleet-topology.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Incident log — create, retrieve, and resolve incidents.
3
+ */
4
+ import type { CheckResult } from '../types/health.js';
5
+ import type { Incident } from '../types/incident.js';
6
+ import type { MarkStore } from '../store/types.js';
7
+ export declare class IncidentLog {
8
+ private readonly store;
9
+ constructor(store: MarkStore);
10
+ /** Create an incident from failed check results. */
11
+ createFromFailures(failures: CheckResult[]): Promise<Incident>;
12
+ /** Get incidents from the last N days. */
13
+ getRecent(days: number): Promise<Incident[]>;
14
+ /** Resolve an incident. */
15
+ resolve(id: string, resolution: string): Promise<void>;
16
+ /** Count active (unresolved) incidents. */
17
+ countActive(): Promise<number>;
18
+ }
19
+ //# sourceMappingURL=incident-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incident-log.d.ts","sourceRoot":"","sources":["../../src/history/incident-log.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;gBAEtB,KAAK,EAAE,SAAS;IAI5B,oDAAoD;IAC9C,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAuBpE,0CAA0C;IACpC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIlD,2BAA2B;IACrB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,2CAA2C;IACrC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;CAIrC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Incident log — create, retrieve, and resolve incidents.
3
+ */
4
+ import crypto from 'node:crypto';
5
+ import { classifyIncidentSeverity } from '../notify/alert-classifier.js';
6
+ export class IncidentLog {
7
+ store;
8
+ constructor(store) {
9
+ this.store = store;
10
+ }
11
+ /** Create an incident from failed check results. */
12
+ async createFromFailures(failures) {
13
+ if (failures.length === 0) {
14
+ throw new Error('Cannot create incident from empty failures');
15
+ }
16
+ const severity = classifyIncidentSeverity(failures);
17
+ const category = failures[0].category;
18
+ const descriptions = failures.map(f => f.name + (f.message ? ': ' + f.message : ''));
19
+ const incident = {
20
+ id: generateId(),
21
+ timestamp: new Date().toISOString(),
22
+ severity,
23
+ category,
24
+ description: descriptions.join('; '),
25
+ checkResults: failures,
26
+ resolved: false,
27
+ };
28
+ await this.store.saveIncident(incident);
29
+ return incident;
30
+ }
31
+ /** Get incidents from the last N days. */
32
+ async getRecent(days) {
33
+ return this.store.getIncidents(days);
34
+ }
35
+ /** Resolve an incident. */
36
+ async resolve(id, resolution) {
37
+ await this.store.resolveIncident(id, resolution);
38
+ }
39
+ /** Count active (unresolved) incidents. */
40
+ async countActive() {
41
+ const recent = await this.store.getIncidents(30);
42
+ return recent.filter(i => !i.resolved).length;
43
+ }
44
+ }
45
+ function generateId() {
46
+ const timestamp = Date.now().toString(36);
47
+ const random = crypto.randomBytes(4).toString('hex');
48
+ return `inc-${timestamp}-${random}`;
49
+ }
50
+ //# sourceMappingURL=incident-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incident-log.js","sourceRoot":"","sources":["../../src/history/incident-log.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AAIjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,OAAO,WAAW;IACL,KAAK,CAAY;IAElC,YAAY,KAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,kBAAkB,CAAC,QAAuB;QAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC;QACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAErF,MAAM,QAAQ,GAAa;YACzB,EAAE,EAAE,UAAU,EAAE;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ;YACR,QAAQ;YACR,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACpC,YAAY,EAAE,QAAQ;YACtB,QAAQ,EAAE,KAAK;SAChB,CAAC;QAEF,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,0CAA0C;IAC1C,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,OAAO,CAAC,EAAU,EAAE,UAAkB;QAC1C,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,WAAW;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IAChD,CAAC;CACF;AAED,SAAS,UAAU;IACjB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrD,OAAO,OAAO,SAAS,IAAI,MAAM,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Trend analyzer — rule-based pattern detection in health history.
3
+ * v1.0: Threshold comparisons. v2.0: AI model for sophisticated patterns.
4
+ */
5
+ import type { DailyHealth } from '../types/incident.js';
6
+ export interface Trend {
7
+ type: 'recurring' | 'degradation' | 'improvement';
8
+ description: string;
9
+ severity: 'info' | 'warning' | 'concern';
10
+ }
11
+ export declare class TrendAnalyzer {
12
+ /** Analyze daily health history for patterns. */
13
+ analyze(history: DailyHealth[]): Trend[];
14
+ private detectRecurringFailures;
15
+ private detectDegradation;
16
+ private detectImprovement;
17
+ }
18
+ //# sourceMappingURL=trend-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trend-analyzer.d.ts","sourceRoot":"","sources":["../../src/history/trend-analyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;CAC1C;AAED,qBAAa,aAAa;IACxB,iDAAiD;IACjD,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,KAAK,EAAE;IAYxC,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,iBAAiB;CAoB1B"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Trend analyzer — rule-based pattern detection in health history.
3
+ * v1.0: Threshold comparisons. v2.0: AI model for sophisticated patterns.
4
+ */
5
+ export class TrendAnalyzer {
6
+ /** Analyze daily health history for patterns. */
7
+ analyze(history) {
8
+ if (history.length < 3)
9
+ return [];
10
+ const trends = [];
11
+ trends.push(...this.detectRecurringFailures(history));
12
+ trends.push(...this.detectDegradation(history));
13
+ trends.push(...this.detectImprovement(history));
14
+ return trends;
15
+ }
16
+ detectRecurringFailures(history) {
17
+ const trends = [];
18
+ const redCount = history.filter(d => d.status === 'RED').length;
19
+ const yellowCount = history.filter(d => d.status === 'YELLOW').length;
20
+ if (redCount >= 3) {
21
+ trends.push({
22
+ type: 'recurring',
23
+ description: `${redCount} RED days in the last ${history.length} days — recurring failures`,
24
+ severity: 'concern',
25
+ });
26
+ }
27
+ if (yellowCount >= 5) {
28
+ trends.push({
29
+ type: 'recurring',
30
+ description: `${yellowCount} YELLOW days in the last ${history.length} days — persistent warnings`,
31
+ severity: 'warning',
32
+ });
33
+ }
34
+ return trends;
35
+ }
36
+ detectDegradation(history) {
37
+ if (history.length < 7)
38
+ return [];
39
+ const trends = [];
40
+ const firstHalf = history.slice(0, Math.floor(history.length / 2));
41
+ const secondHalf = history.slice(Math.floor(history.length / 2));
42
+ const firstAvg = avgPassRate(firstHalf);
43
+ const secondAvg = avgPassRate(secondHalf);
44
+ if (firstAvg - secondAvg > 0.1) {
45
+ trends.push({
46
+ type: 'degradation',
47
+ description: `Pass rate declining: ${pct(firstAvg)} → ${pct(secondAvg)} over ${history.length} days`,
48
+ severity: 'warning',
49
+ });
50
+ }
51
+ return trends;
52
+ }
53
+ detectImprovement(history) {
54
+ if (history.length < 7)
55
+ return [];
56
+ const trends = [];
57
+ const firstHalf = history.slice(0, Math.floor(history.length / 2));
58
+ const secondHalf = history.slice(Math.floor(history.length / 2));
59
+ const firstAvg = avgPassRate(firstHalf);
60
+ const secondAvg = avgPassRate(secondHalf);
61
+ if (secondAvg - firstAvg > 0.1) {
62
+ trends.push({
63
+ type: 'improvement',
64
+ description: `Pass rate improving: ${pct(firstAvg)} → ${pct(secondAvg)} over ${history.length} days`,
65
+ severity: 'info',
66
+ });
67
+ }
68
+ return trends;
69
+ }
70
+ }
71
+ function avgPassRate(days) {
72
+ if (days.length === 0)
73
+ return 1;
74
+ const total = days.reduce((sum, d) => sum + (d.totalChecks > 0 ? d.passedChecks / d.totalChecks : 1), 0);
75
+ return total / days.length;
76
+ }
77
+ function pct(rate) {
78
+ return `${Math.round(rate * 100)}%`;
79
+ }
80
+ //# sourceMappingURL=trend-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trend-analyzer.js","sourceRoot":"","sources":["../../src/history/trend-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Uptime tracker — rolling uptime percentage and daily health history.
3
+ */
4
+ import type { MorningReport } from '../types/health.js';
5
+ import type { UptimeData } from '../types/incident.js';
6
+ import type { MarkStore } from '../store/types.js';
7
+ export declare class UptimeTracker {
8
+ private readonly store;
9
+ constructor(store: MarkStore);
10
+ /** Record a morning check result as a daily health entry. */
11
+ recordCheck(report: MorningReport): Promise<void>;
12
+ /** Calculate rolling uptime data for the last N days. */
13
+ getUptime(days: number): Promise<UptimeData>;
14
+ }
15
+ //# sourceMappingURL=uptime-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uptime-tracker.d.ts","sourceRoot":"","sources":["../../src/history/uptime-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;gBAEtB,KAAK,EAAE,SAAS;IAI5B,6DAA6D;IACvD,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvD,yDAAyD;IACnD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CA+BnD"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Uptime tracker — rolling uptime percentage and daily health history.
3
+ */
4
+ export class UptimeTracker {
5
+ store;
6
+ constructor(store) {
7
+ this.store = store;
8
+ }
9
+ /** Record a morning check result as a daily health entry. */
10
+ async recordCheck(report) {
11
+ const date = report.timestamp.slice(0, 10);
12
+ const entry = {
13
+ date,
14
+ status: report.status,
15
+ passedChecks: report.summary.passed,
16
+ totalChecks: report.summary.total,
17
+ incidents: report.summary.failed,
18
+ };
19
+ await this.store.saveDailyHealth(entry);
20
+ }
21
+ /** Calculate rolling uptime data for the last N days. */
22
+ async getUptime(days) {
23
+ const history = await this.store.getDailyHistory(days);
24
+ let greenDays = 0;
25
+ let yellowDays = 0;
26
+ let redDays = 0;
27
+ let totalChecks = 0;
28
+ for (const day of history) {
29
+ totalChecks += day.totalChecks;
30
+ switch (day.status) {
31
+ case 'GREEN':
32
+ greenDays++;
33
+ break;
34
+ case 'YELLOW':
35
+ yellowDays++;
36
+ break;
37
+ case 'RED':
38
+ redDays++;
39
+ break;
40
+ }
41
+ }
42
+ // Uptime % = days that were not RED / total days recorded
43
+ const totalDays = history.length;
44
+ const percentage = totalDays > 0 ? ((totalDays - redDays) / totalDays) * 100 : 100;
45
+ return {
46
+ days,
47
+ percentage: Math.round(percentage * 100) / 100,
48
+ totalChecks,
49
+ greenDays,
50
+ yellowDays,
51
+ redDays,
52
+ history,
53
+ };
54
+ }
55
+ }
56
+ //# sourceMappingURL=uptime-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uptime-tracker.js","sourceRoot":"","sources":["../../src/history/uptime-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,OAAO,aAAa;IACP,KAAK,CAAY;IAElC,YAAY,KAAgB;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,WAAW,CAAC,MAAqB;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAgB;YACzB,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;YACnC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;YACjC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;SACjC,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,WAAW,IAAI,GAAG,CAAC,WAAW,CAAC;YAC/B,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;gBACnB,KAAK,OAAO;oBAAE,SAAS,EAAE,CAAC;oBAAC,MAAM;gBACjC,KAAK,QAAQ;oBAAE,UAAU,EAAE,CAAC;oBAAC,MAAM;gBACnC,KAAK,KAAK;oBAAE,OAAO,EAAE,CAAC;oBAAC,MAAM;YAC/B,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;QACjC,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAEnF,OAAO;YACL,IAAI;YACJ,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG;YAC9C,WAAW;YACX,SAAS;YACT,UAAU;YACV,OAAO;YACP,OAAO;SACR,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @aiassesstech/mighty-mark — System Health Sentinel for AI Assess Tech Fleet.
3
+ *
4
+ * Public API:
5
+ * const mark = new MarkCore(config);
6
+ * await mark.initialize();
7
+ * const report = await mark.runHealthCheck();
8
+ */
9
+ import { type MightyMarkConfig } from './config/config-schema.js';
10
+ import type { MorningReport, StatusSnapshot, CategoryResults } from './types/health.js';
11
+ import type { Incident, UptimeData } from './types/incident.js';
12
+ import type { CheckContext } from './checks/check-context.js';
13
+ export declare class MarkCore {
14
+ readonly config: MightyMarkConfig;
15
+ private topology;
16
+ private runner;
17
+ private notifier;
18
+ private store;
19
+ private uptimeTracker;
20
+ private incidentLog;
21
+ private trendAnalyzer;
22
+ private lastReport;
23
+ constructor(rawConfig?: Record<string, unknown>);
24
+ /** Initialize all subsystems. Must be called before any operations. */
25
+ initialize(): Promise<void>;
26
+ /** Run a full health check (all 26 checks). */
27
+ runHealthCheck(ctx?: CheckContext): Promise<MorningReport>;
28
+ /** Run checks for a single category. */
29
+ runCategory(category: string, ctx?: CheckContext): Promise<CategoryResults>;
30
+ /** Get quick status snapshot. */
31
+ getStatus(): Promise<StatusSnapshot>;
32
+ /** Get incidents from the last N days. */
33
+ getIncidents(days: number): Promise<Incident[]>;
34
+ /** Get uptime SLA data. */
35
+ getUptime(days: number): Promise<UptimeData>;
36
+ /** Generate a formatted report. */
37
+ generateReport(format: string): Promise<string>;
38
+ /** Send a morning report via Telegram. */
39
+ sendMorningReport(report: MorningReport): Promise<boolean>;
40
+ /** Check if the last report is still fresh. */
41
+ private isFresh;
42
+ }
43
+ export type { MightyMarkConfig } from './config/config-schema.js';
44
+ export type { FleetTopology, FleetAgent } from './types/fleet.js';
45
+ export type { HealthStatus, CheckStatus, CheckCategory, Severity, CheckResult, MorningReport, StatusSnapshot, CategoryResults, } from './types/health.js';
46
+ export type { Incident, DailyHealth, UptimeData } from './types/incident.js';
47
+ export type { CheckContext } from './checks/check-context.js';
48
+ export type { MarkStore } from './store/types.js';
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAU/E,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAiB,eAAe,EAAgB,MAAM,mBAAmB,CAAC;AACrH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,qBAAa,QAAQ;IACnB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,UAAU,CAA8B;gBAEpC,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAInD,uEAAuE;IACjE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC,+CAA+C;IACzC,cAAc,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAiBhE,wCAAwC;IAClC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAIjF,iCAAiC;IAC3B,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAwB1C,0CAA0C;IACpC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIrD,2BAA2B;IACrB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAIlD,mCAAmC;IAC7B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAerD,0CAA0C;IACpC,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhE,+CAA+C;IAC/C,OAAO,CAAC,OAAO;CAKhB;AAGD,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAClE,YAAY,EACV,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAClD,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,GAC5D,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7E,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,124 @@
1
+ /**
2
+ * @aiassesstech/mighty-mark — System Health Sentinel for AI Assess Tech Fleet.
3
+ *
4
+ * Public API:
5
+ * const mark = new MarkCore(config);
6
+ * await mark.initialize();
7
+ * const report = await mark.runHealthCheck();
8
+ */
9
+ import { parseConfig } from './config/config-schema.js';
10
+ import { loadFleetTopology } from './config/fleet-topology.js';
11
+ import { CheckRunner } from './checks/check-runner.js';
12
+ import { TelegramNotifier } from './notify/telegram-notifier.js';
13
+ import { formatSummaryReport, formatDetailedReport, formatTelegramReport } from './notify/report-formatter.js';
14
+ import { JsonStore } from './store/json-store.js';
15
+ import { UptimeTracker } from './history/uptime-tracker.js';
16
+ import { IncidentLog } from './history/incident-log.js';
17
+ import { TrendAnalyzer } from './history/trend-analyzer.js';
18
+ import { STALE_CHECK_THRESHOLD_MS } from './config/defaults.js';
19
+ export class MarkCore {
20
+ config;
21
+ topology;
22
+ runner;
23
+ notifier;
24
+ store;
25
+ uptimeTracker;
26
+ incidentLog;
27
+ trendAnalyzer;
28
+ lastReport = null;
29
+ constructor(rawConfig = {}) {
30
+ this.config = parseConfig(rawConfig);
31
+ }
32
+ /** Initialize all subsystems. Must be called before any operations. */
33
+ async initialize() {
34
+ this.store = new JsonStore(this.config.dataDir);
35
+ await this.store.initialize();
36
+ this.topology = loadFleetTopology(this.config.dataDir);
37
+ this.runner = new CheckRunner(this.config, this.topology);
38
+ this.notifier = new TelegramNotifier({
39
+ token: this.config.telegramToken ?? '',
40
+ chatId: this.config.telegramChatId ?? '',
41
+ enabled: !!(this.config.telegramToken && this.config.telegramChatId),
42
+ });
43
+ this.uptimeTracker = new UptimeTracker(this.store);
44
+ this.incidentLog = new IncidentLog(this.store);
45
+ this.trendAnalyzer = new TrendAnalyzer();
46
+ this.lastReport = await this.store.getLastCheck();
47
+ }
48
+ /** Run a full health check (all 26 checks). */
49
+ async runHealthCheck(ctx) {
50
+ const report = await this.runner.runAll(ctx);
51
+ // Persist results
52
+ await this.store.saveLastCheck(report);
53
+ await this.uptimeTracker.recordCheck(report);
54
+ this.lastReport = report;
55
+ // Create incidents for failures
56
+ const failures = report.checks.filter(c => c.status === 'fail');
57
+ if (failures.length > 0) {
58
+ await this.incidentLog.createFromFailures(failures);
59
+ }
60
+ return report;
61
+ }
62
+ /** Run checks for a single category. */
63
+ async runCategory(category, ctx) {
64
+ return this.runner.runCategory(category, ctx);
65
+ }
66
+ /** Get quick status snapshot. */
67
+ async getStatus() {
68
+ const activeIncidents = await this.incidentLog.countActive();
69
+ let uptimePercent = null;
70
+ try {
71
+ const uptime = await this.uptimeTracker.getUptime(7);
72
+ uptimePercent = uptime.percentage;
73
+ }
74
+ catch { /* no history yet */ }
75
+ let hostname = 'unknown';
76
+ try {
77
+ const os = await import('node:os');
78
+ hostname = os.hostname();
79
+ }
80
+ catch { /* fallback */ }
81
+ return {
82
+ status: this.lastReport?.status ?? 'GREEN',
83
+ lastCheck: this.lastReport?.timestamp ?? null,
84
+ lastCheckStatus: this.lastReport?.status ?? null,
85
+ activeIncidents,
86
+ uptimePercent7d: uptimePercent,
87
+ hostname,
88
+ };
89
+ }
90
+ /** Get incidents from the last N days. */
91
+ async getIncidents(days) {
92
+ return this.incidentLog.getRecent(days);
93
+ }
94
+ /** Get uptime SLA data. */
95
+ async getUptime(days) {
96
+ return this.uptimeTracker.getUptime(days);
97
+ }
98
+ /** Generate a formatted report. */
99
+ async generateReport(format) {
100
+ // Use cached report if fresh, otherwise run new check
101
+ const report = this.isFresh()
102
+ ? this.lastReport
103
+ : await this.runHealthCheck();
104
+ switch (format) {
105
+ case 'telegram': return formatTelegramReport(report);
106
+ case 'detailed': return formatDetailedReport(report);
107
+ case 'summary':
108
+ default:
109
+ return formatSummaryReport(report);
110
+ }
111
+ }
112
+ /** Send a morning report via Telegram. */
113
+ async sendMorningReport(report) {
114
+ return this.notifier.sendMorningReport(report);
115
+ }
116
+ /** Check if the last report is still fresh. */
117
+ isFresh() {
118
+ if (!this.lastReport)
119
+ return false;
120
+ const age = Date.now() - new Date(this.lastReport.timestamp).getTime();
121
+ return age < STALE_CHECK_THRESHOLD_MS;
122
+ }
123
+ }
124
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Alert classifier — determines GREEN/YELLOW/RED from check results.
3
+ */
4
+ import type { HealthStatus, CheckResult } from '../types/health.js';
5
+ import type { Severity } from '../types/health.js';
6
+ /**
7
+ * Classify overall health from failure/warning counts.
8
+ * GREEN = 0 failures, 0 warnings
9
+ * YELLOW = 0 failures, 1+ warnings
10
+ * RED = 1+ failures
11
+ */
12
+ export declare function classifyHealth(failures: number, warnings: number): HealthStatus;
13
+ /** Get the emoji for a health status. */
14
+ export declare function statusEmoji(status: HealthStatus): string;
15
+ /** Get human-readable status text. */
16
+ export declare function statusText(status: HealthStatus): string;
17
+ /** Determine incident severity from a set of failed checks. */
18
+ export declare function classifyIncidentSeverity(failures: CheckResult[]): Severity;
19
+ //# sourceMappingURL=alert-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert-classifier.d.ts","sourceRoot":"","sources":["../../src/notify/alert-classifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAI/E;AAED,yCAAyC;AACzC,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAMxD;AAED,sCAAsC;AACtC,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAMvD;AAED,+DAA+D;AAC/D,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,QAAQ,CAQ1E"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Alert classifier — determines GREEN/YELLOW/RED from check results.
3
+ */
4
+ /**
5
+ * Classify overall health from failure/warning counts.
6
+ * GREEN = 0 failures, 0 warnings
7
+ * YELLOW = 0 failures, 1+ warnings
8
+ * RED = 1+ failures
9
+ */
10
+ export function classifyHealth(failures, warnings) {
11
+ if (failures > 0)
12
+ return 'RED';
13
+ if (warnings > 0)
14
+ return 'YELLOW';
15
+ return 'GREEN';
16
+ }
17
+ /** Get the emoji for a health status. */
18
+ export function statusEmoji(status) {
19
+ switch (status) {
20
+ case 'GREEN': return '🟢';
21
+ case 'YELLOW': return '🟡';
22
+ case 'RED': return '🔴';
23
+ }
24
+ }
25
+ /** Get human-readable status text. */
26
+ export function statusText(status) {
27
+ switch (status) {
28
+ case 'GREEN': return 'All Systems Operational';
29
+ case 'YELLOW': return 'Operational with Warnings';
30
+ case 'RED': return 'Failures Detected';
31
+ }
32
+ }
33
+ /** Determine incident severity from a set of failed checks. */
34
+ export function classifyIncidentSeverity(failures) {
35
+ const hasGateway = failures.some(f => f.category === 'gateway' && f.name.includes('process'));
36
+ const hasConfig = failures.some(f => f.name.includes('config') && f.status === 'fail');
37
+ if (hasGateway || hasConfig)
38
+ return 'critical';
39
+ if (failures.some(f => f.category === 'gateway' || f.category === 'api'))
40
+ return 'high';
41
+ if (failures.some(f => f.category === 'agents'))
42
+ return 'medium';
43
+ return 'low';
44
+ }
45
+ //# sourceMappingURL=alert-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert-classifier.js","sourceRoot":"","sources":["../../src/notify/alert-classifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,QAAgB;IAC/D,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC9C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;QAC1B,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC;QAC3B,KAAK,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO,CAAC,CAAC,OAAO,yBAAyB,CAAC;QAC/C,KAAK,QAAQ,CAAC,CAAC,OAAO,2BAA2B,CAAC;QAClD,KAAK,KAAK,CAAC,CAAC,OAAO,mBAAmB,CAAC;IACzC,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,wBAAwB,CAAC,QAAuB;IAC9D,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9F,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAEvF,IAAI,UAAU,IAAI,SAAS;QAAE,OAAO,UAAU,CAAC;IAC/C,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACxF,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjE,OAAO,KAAK,CAAC;AACf,CAAC"}