openclaw-aegis 1.0.0 → 1.1.1

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/README.md CHANGED
@@ -4,6 +4,7 @@
4
4
 
5
5
  Aegis monitors your OpenClaw gateway, detects failures in seconds, fixes them automatically, and alerts you through out-of-band channels that don't depend on the gateway being up.
6
6
 
7
+ [![npm](https://img.shields.io/npm/v/openclaw-aegis)](https://www.npmjs.com/package/openclaw-aegis)
7
8
  [![CI](https://github.com/Canary-Builds/openclaw-aegis/actions/workflows/ci.yml/badge.svg)](https://github.com/Canary-Builds/openclaw-aegis/actions/workflows/ci.yml)
8
9
  [![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
9
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
@@ -66,7 +67,7 @@ Probes: 10 passed, 0 failed
66
67
  | [Getting Started](docs/getting-started.md) | Installation, first setup, verification |
67
68
  | [Architecture](docs/architecture.md) | System design, probe pipeline, recovery tiers |
68
69
  | [Configuration](docs/configuration.md) | Full TOML reference with every option |
69
- | [Alerts](docs/alerts.md) | Setting up ntfy, Telegram, WhatsApp, webhooks |
70
+ | [Alerts](docs/alerts.md) | Setting up ntfy, Telegram, WhatsApp, Slack, Discord, Email, Pushover, webhooks |
70
71
  | [CLI Reference](docs/cli-reference.md) | Every command with examples and options |
71
72
  | [Contributing](docs/contributing.md) | Development setup, testing, PR process |
72
73
 
@@ -85,7 +86,7 @@ OpenClaw Gateway Aegis Sidecar
85
86
  │ systemd service │◄─────────│ L2: Targeted Repair │
86
87
  │ │ │ L4: Human Alert │
87
88
  └─────────────────────┘ │ Alert Dispatcher │
88
- │ (ntfy/TG/WA/Slack/Webhook)
89
+ │ (8 alert providers)
89
90
  └──────────────────────────────┘
90
91
 
91
92
  Out-of-band
package/dist/cli/index.js CHANGED
@@ -24,6 +24,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  ));
25
25
 
26
26
  // src/cli/index.ts
27
+ var import_node_fs = require("fs");
28
+ var import_node_path = require("path");
27
29
  var import_commander5 = require("commander");
28
30
 
29
31
  // src/cli/commands/status.ts
@@ -2053,8 +2055,16 @@ var testAlertCommand = new import_commander4.Command("test-alert").description("
2053
2055
  });
2054
2056
 
2055
2057
  // src/cli/index.ts
2058
+ function getVersion() {
2059
+ try {
2060
+ const pkg = JSON.parse((0, import_node_fs.readFileSync)((0, import_node_path.join)(__dirname, "..", "..", "package.json"), "utf-8"));
2061
+ return pkg.version;
2062
+ } catch {
2063
+ return "unknown";
2064
+ }
2065
+ }
2056
2066
  var program = new import_commander5.Command();
2057
- program.name("aegis").description("OpenClaw Aegis \u2014 self-healing sidecar for the OpenClaw gateway").version("1.0.0");
2067
+ program.name("aegis").description("OpenClaw Aegis \u2014 self-healing sidecar for the OpenClaw gateway").version(getVersion());
2058
2068
  program.addCommand(initCommand);
2059
2069
  program.addCommand(statusCommand);
2060
2070
  program.addCommand(checkCommand);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/status.ts","../../src/config/loader.ts","../../src/config/schema.ts","../../src/health/monitor.ts","../../src/types/index.ts","../../src/health/scoring.ts","../../src/health/probes/resolve-pid.ts","../../src/health/probes/process.ts","../../src/health/probes/port.ts","../../src/health/probes/http.ts","../../src/health/probes/config.ts","../../src/health/probes/tun.ts","../../src/health/probes/memory.ts","../../src/health/probes/cpu.ts","../../src/health/probes/disk.ts","../../src/health/probes/log-tail.ts","../../src/health/probes/websocket.ts","../../src/cli/commands/check.ts","../../src/cli/commands/init.ts","../../src/cli/commands/test-alert.ts","../../src/alerts/dispatcher.ts","../../src/alerts/providers/ntfy.ts","../../src/alerts/providers/telegram.ts","../../src/alerts/providers/whatsapp.ts","../../src/alerts/providers/webhook.ts","../../src/alerts/providers/slack.ts","../../src/alerts/providers/discord.ts","../../src/alerts/providers/email.ts","../../src/alerts/providers/pushover.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { testAlertCommand } from \"./commands/test-alert.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"aegis\")\n .description(\"OpenClaw Aegis — self-healing sidecar for the OpenClaw gateway\")\n .version(\"1.0.0\");\n\nprogram.addCommand(initCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(checkCommand);\nprogram.addCommand(testAlertCommand);\n\nprogram.parse(process.argv);\n","import { Command } from \"commander\";\nimport { loadConfig, DEFAULT_CONFIG_PATH } from \"../../config/loader.js\";\nimport { HealthMonitor } from \"../../health/monitor.js\";\n\nexport const statusCommand = new Command(\"status\")\n .description(\"Show current health status and recovery stats\")\n .option(\"-c, --config <path>\", \"Config file path\", DEFAULT_CONFIG_PATH)\n .action(async (opts: { config: string }) => {\n const config = loadConfig(opts.config);\n const monitor = new HealthMonitor(config);\n\n const score = await monitor.runAllProbes();\n\n const bandColors: Record<string, string> = {\n healthy: \"\\x1b[32m\",\n degraded: \"\\x1b[33m\",\n critical: \"\\x1b[31m\",\n };\n const reset = \"\\x1b[0m\";\n const color = bandColors[score.band] ?? \"\";\n\n process.stdout.write(`\\nHealth: ${color}${score.band.toUpperCase()}${reset} (score: ${score.total})\\n\\n`);\n\n for (const probe of score.probeResults) {\n const icon = probe.healthy ? \"\\x1b[32m+\\x1b[0m\" : \"\\x1b[31m-\\x1b[0m\";\n const msg = probe.message ? ` — ${probe.message}` : \"\";\n process.stdout.write(` ${icon} ${probe.name} (${probe.latencyMs}ms)${msg}\\n`);\n }\n\n if (config.alerts.channels.length === 0) {\n process.stdout.write(\n `\\n\\x1b[33mWARNING: No alert channels configured. Aegis cannot notify you during incidents. Run 'aegis init' to add alerts.\\x1b[0m\\n`,\n );\n }\n\n process.stdout.write(\"\\n\");\n });\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport TOML from \"@iarna/toml\";\nimport { aegisConfigSchema, type AegisConfig } from \"./schema.js\";\n\nexport function expandHome(filepath: string): string {\n if (filepath.startsWith(\"~/\")) {\n return path.join(os.homedir(), filepath.slice(2));\n }\n return filepath;\n}\n\nexport function resolveConfigPaths(config: AegisConfig): AegisConfig {\n return {\n ...config,\n gateway: {\n ...config.gateway,\n configPath: expandHome(config.gateway.configPath),\n pidFile: expandHome(config.gateway.pidFile),\n logPath: expandHome(config.gateway.logPath),\n },\n backup: {\n ...config.backup,\n basePath: expandHome(config.backup.basePath),\n },\n };\n}\n\nexport function loadConfig(configPath: string): AegisConfig {\n const resolvedPath = expandHome(configPath);\n\n if (!fs.existsSync(resolvedPath)) {\n const defaults = aegisConfigSchema.parse({});\n return resolveConfigPaths(defaults);\n }\n\n const raw = fs.readFileSync(resolvedPath, \"utf-8\");\n const parsed: unknown = TOML.parse(raw);\n const validated = aegisConfigSchema.parse(parsed);\n return resolveConfigPaths(validated);\n}\n\nexport const DEFAULT_CONFIG_PATH = \"~/.openclaw/aegis/config.toml\";\n\nexport function getConfigDir(): string {\n return expandHome(\"~/.openclaw/aegis\");\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n}\n","import { z } from \"zod\";\n\nconst alertChannelSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"ntfy\"),\n url: z.string().url().default(\"https://ntfy.sh\"),\n topic: z.string().min(1),\n priority: z.number().int().min(1).max(5).default(4),\n }),\n z.object({\n type: z.literal(\"webhook\"),\n url: z.string().url(),\n secret: z.string().min(1).optional(),\n }),\n z.object({\n type: z.literal(\"telegram\"),\n botToken: z.string().min(1),\n chatId: z.string().min(1),\n }),\n z.object({\n type: z.literal(\"whatsapp\"),\n phoneNumberId: z.string().min(1),\n accessToken: z.string().min(1),\n recipientNumber: z.string().min(1),\n }),\n z.object({\n type: z.literal(\"slack\"),\n webhookUrl: z.string().url(),\n channel: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"discord\"),\n webhookUrl: z.string().url(),\n username: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"email\"),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535).default(587),\n secure: z.boolean().default(false),\n username: z.string().min(1),\n password: z.string().min(1),\n from: z.string().min(1),\n to: z.string().min(1),\n }),\n z.object({\n type: z.literal(\"pushover\"),\n apiToken: z.string().min(1),\n userKey: z.string().min(1),\n device: z.string().optional(),\n }),\n]);\n\nexport type AlertChannelConfig = z.infer<typeof alertChannelSchema>;\n\nexport const aegisConfigSchema = z.object({\n gateway: z\n .object({\n configPath: z.string().default(\"~/.openclaw/openclaw.json\"),\n pidFile: z.string().default(\"openclaw-gateway.service\"),\n port: z.number().int().min(1).max(65535).default(18789),\n logPath: z.string().default(\"~/.openclaw/logs/gateway.log\"),\n healthEndpoint: z.string().default(\"/health\"),\n })\n .default({}),\n\n monitoring: z\n .object({\n intervalMs: z.number().int().min(1000).default(10000),\n probeTimeoutMs: z.number().int().min(500).default(5000),\n configPollIntervalMs: z.number().int().min(500).default(2000),\n degradedConfirmationCount: z.number().int().min(1).default(2),\n })\n .default({}),\n\n health: z\n .object({\n healthyMin: z.number().int().min(0).default(7),\n degradedMin: z.number().int().min(0).default(4),\n memoryThresholdMb: z.number().int().min(0).default(512),\n cpuThresholdPercent: z.number().int().min(0).max(100).default(90),\n diskThresholdMb: z.number().int().min(0).default(100),\n })\n .default({}),\n\n recovery: z\n .object({\n l1MaxAttempts: z.number().int().min(1).default(3),\n l1BackoffBaseMs: z.number().int().min(1000).default(5000),\n l1BackoffMultiplier: z.number().min(1).default(3),\n l2MaxAttempts: z.number().int().min(1).default(2),\n l2CooldownMs: z.number().int().min(1000).default(60000),\n circuitBreakerMaxCycles: z.number().int().min(1).default(3),\n circuitBreakerWindowMs: z.number().int().min(60000).default(3600000),\n antiFlap: z\n .object({\n maxRestarts: z.number().int().min(1).default(5),\n windowMs: z.number().int().min(60000).default(900000),\n cooldownMs: z.number().int().min(60000).default(600000),\n decayMs: z.number().int().min(60000).default(21600000),\n })\n .default({}),\n })\n .default({}),\n\n backup: z\n .object({\n maxChronological: z.number().int().min(1).default(20),\n maxKnownGood: z.number().int().min(1).default(3),\n knownGoodStabilityMs: z.number().int().min(10000).default(60000),\n basePath: z.string().default(\"~/.openclaw/aegis/backups\"),\n })\n .default({}),\n\n deadManSwitch: z\n .object({\n countdownMs: z.number().int().min(5000).default(30000),\n enabled: z.boolean().default(true),\n })\n .default({}),\n\n alerts: z\n .object({\n channels: z.array(alertChannelSchema).default([]),\n retryAttempts: z.number().int().min(0).default(3),\n retryBackoffMs: z.array(z.number().int()).default([5000, 15000, 45000]),\n })\n .default({}),\n\n platform: z\n .object({\n type: z.enum([\"systemd\", \"launchd\"]).default(\"systemd\"),\n watchdogSec: z.number().int().min(10).default(30),\n })\n .default({}),\n});\n\nexport type AegisConfig = z.infer<typeof aegisConfigSchema>;\n","import { EventEmitter } from \"node:events\";\nimport type { HealthProbeResult, HealthScore, ProbeTarget } from \"../types/index.js\";\nimport type { AegisConfig } from \"../config/schema.js\";\nimport { computeHealthScore, DegradedConfirmation } from \"./scoring.js\";\nimport { processProbe } from \"./probes/process.js\";\nimport { portProbe } from \"./probes/port.js\";\nimport { httpHealthProbe } from \"./probes/http.js\";\nimport { configProbe } from \"./probes/config.js\";\nimport { tunProbe } from \"./probes/tun.js\";\nimport { memoryProbe } from \"./probes/memory.js\";\nimport { cpuProbe } from \"./probes/cpu.js\";\nimport { diskProbe } from \"./probes/disk.js\";\nimport { logTailProbe } from \"./probes/log-tail.js\";\nimport { websocketProbe } from \"./probes/websocket.js\";\n\nexport class HealthMonitor extends EventEmitter {\n private interval: NodeJS.Timeout | null = null;\n private readonly degradedConfirmation: DegradedConfirmation;\n private lastScore: HealthScore | null = null;\n\n constructor(private readonly config: AegisConfig) {\n super();\n this.degradedConfirmation = new DegradedConfirmation(\n config.monitoring.degradedConfirmationCount,\n );\n }\n\n async runAllProbes(): Promise<HealthScore> {\n const target: ProbeTarget = { type: \"local\" };\n const timeout = this.config.monitoring.probeTimeoutMs;\n\n const withTimeout = async (\n fn: () => Promise<HealthProbeResult>,\n name: string,\n ): Promise<HealthProbeResult> => {\n try {\n return await Promise.race([\n fn(),\n new Promise<HealthProbeResult>((resolve) =>\n setTimeout(\n () =>\n resolve({\n name,\n healthy: false,\n score: 0,\n message: `Probe timed out after ${timeout}ms`,\n latencyMs: timeout,\n }),\n timeout,\n ),\n ),\n ]);\n } catch (err) {\n return {\n name,\n healthy: false,\n score: 0,\n message: `Probe error: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: 0,\n };\n }\n };\n\n const results = await Promise.allSettled([\n withTimeout(() => processProbe(target, this.config.gateway.pidFile), \"process\"),\n withTimeout(() => portProbe(target, this.config.gateway.port, timeout), \"port\"),\n withTimeout(\n () =>\n httpHealthProbe(\n target,\n this.config.gateway.port,\n this.config.gateway.healthEndpoint,\n timeout,\n ),\n \"http\",\n ),\n withTimeout(() => configProbe(target, this.config.gateway.configPath), \"config\"),\n withTimeout(() => tunProbe(target), \"tun\"),\n withTimeout(\n () => memoryProbe(target, this.config.gateway.pidFile, this.config.health.memoryThresholdMb),\n \"memory\",\n ),\n withTimeout(\n () => cpuProbe(target, this.config.gateway.pidFile, this.config.health.cpuThresholdPercent),\n \"cpu\",\n ),\n withTimeout(\n () => diskProbe(target, this.config.gateway.configPath, this.config.health.diskThresholdMb),\n \"disk\",\n ),\n withTimeout(() => logTailProbe(target, this.config.gateway.logPath), \"logTail\"),\n withTimeout(\n () => websocketProbe(target, this.config.gateway.port, timeout),\n \"websocket\",\n ),\n ]);\n\n const probeResults: HealthProbeResult[] = results.map((r, i) => {\n if (r.status === \"fulfilled\") return r.value;\n const names = [\n \"process\", \"port\", \"http\", \"config\", \"tun\",\n \"memory\", \"cpu\", \"disk\", \"logTail\", \"websocket\",\n ] as const;\n return {\n name: names[i] ?? \"unknown\",\n healthy: false,\n score: 0,\n message: `Probe rejected: ${r.reason instanceof Error ? r.reason.message : String(r.reason)}`,\n latencyMs: 0,\n };\n });\n\n const score = computeHealthScore(probeResults, {\n healthyMin: this.config.health.healthyMin,\n degradedMin: this.config.health.degradedMin,\n });\n\n this.lastScore = score;\n const shouldEscalate = this.degradedConfirmation.update(score.band);\n\n this.emit(\"check\", score);\n\n if (shouldEscalate && score.band !== \"healthy\") {\n this.emit(\"escalate\", score);\n }\n\n return score;\n }\n\n start(): void {\n this.interval = setInterval(() => {\n void this.runAllProbes();\n }, this.config.monitoring.intervalMs);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n }\n\n getLastScore(): HealthScore | null {\n return this.lastScore;\n }\n}\n","export interface HealthProbeResult {\n name: string;\n healthy: boolean;\n score: number;\n message?: string;\n latencyMs: number;\n}\n\nexport type ProbeTarget = { type: \"local\" } | { type: \"remote\"; host: string; port: number };\n\nexport interface RecoveryAction {\n level: \"L1\" | \"L2\" | \"L4\";\n action: string;\n result: \"success\" | \"failure\" | \"skipped\";\n durationMs: number;\n}\n\nexport interface IncidentEvent {\n timestamp: string;\n type: string;\n data: Record<string, unknown>;\n checksum: string;\n}\n\nexport type HealthBand = \"healthy\" | \"degraded\" | \"critical\";\n\nexport interface HealthScore {\n total: number;\n band: HealthBand;\n probeResults: HealthProbeResult[];\n}\n\nexport interface BackupEntry {\n path: string;\n timestamp: string;\n checksum: string;\n}\n\nexport interface KnownGoodEntry extends BackupEntry {\n promotedAt: string;\n}\n\nexport interface AlertPayload {\n severity: \"info\" | \"warning\" | \"critical\";\n title: string;\n body: string;\n timestamp: string;\n incidentId?: string;\n recoveryActions?: RecoveryAction[];\n healthScore?: HealthScore;\n}\n\nexport interface AlertResult {\n provider: string;\n success: boolean;\n error?: string;\n durationMs: number;\n}\n\nexport interface AlertProvider {\n name: string;\n send(alert: AlertPayload): Promise<AlertResult>;\n test(): Promise<boolean>;\n}\n\nexport interface PlatformAdapter {\n name: string;\n install(config: PlatformInstallConfig): Promise<void>;\n start(): Promise<void>;\n stop(): Promise<void>;\n restart(): Promise<void>;\n status(): Promise<PlatformServiceStatus>;\n notifyWatchdog(): Promise<void>;\n}\n\nexport interface PlatformInstallConfig {\n serviceName: string;\n execPath: string;\n workingDirectory: string;\n user: string;\n watchdogSec: number;\n readWritePaths: string[];\n}\n\nexport type PlatformServiceStatus = \"running\" | \"stopped\" | \"failed\" | \"unknown\";\n\nexport interface FailurePattern {\n id: number;\n name: string;\n detect(context: DiagnosisContext): Promise<boolean>;\n fix(context: DiagnosisContext): Promise<RecoveryAction>;\n}\n\nexport interface DiagnosisContext {\n configPath: string;\n pidFile: string;\n gatewayPort: number;\n logPath: string;\n knownGoodPath?: string;\n currentConfig: Record<string, unknown> | null;\n}\n\nexport const PROBE_WEIGHTS: Record<string, number> = {\n process: 2,\n port: 2,\n http: 2,\n config: 2,\n websocket: 1,\n tun: 1,\n memory: 1,\n cpu: 1,\n disk: 1,\n logTail: 1,\n};\n\nexport const MAX_HEALTH_SCORE = Object.values(PROBE_WEIGHTS).reduce((a, b) => a + b, 0) * 2;\n\nexport const PROTECTED_CONFIG_KEYS = [\n \"allowFrom\",\n \"groupAllowFrom\",\n \"authToken\",\n \"token\",\n \"webhookUrl\",\n \"apiKey\",\n] as const;\n\nexport const CRITICAL_CONFIG_KEYS = [\n \"gateway.port\",\n \"authToken\",\n \"token\",\n \"autoAck\",\n \"autoAckMessage\",\n \"allowFrom\",\n \"groupAllowFrom\",\n] as const;\n","import type { HealthProbeResult, HealthScore, HealthBand } from \"../types/index.js\";\nimport { PROBE_WEIGHTS, MAX_HEALTH_SCORE } from \"../types/index.js\";\n\nexport interface ScoringThresholds {\n healthyMin: number;\n degradedMin: number;\n}\n\nconst DEFAULT_THRESHOLDS: ScoringThresholds = {\n healthyMin: 7,\n degradedMin: 4,\n};\n\nexport function computeHealthScore(\n results: HealthProbeResult[],\n thresholds: ScoringThresholds = DEFAULT_THRESHOLDS,\n): HealthScore {\n let rawTotal = 0;\n\n for (const result of results) {\n const weight = PROBE_WEIGHTS[result.name] ?? 1;\n rawTotal += result.score * weight;\n }\n\n const normalized = MAX_HEALTH_SCORE > 0 ? Math.round((rawTotal / MAX_HEALTH_SCORE) * 10) : 0;\n const band = classifyBand(normalized, thresholds);\n\n return { total: normalized, band, probeResults: results };\n}\n\nfunction classifyBand(score: number, thresholds: ScoringThresholds): HealthBand {\n if (score >= thresholds.healthyMin) return \"healthy\";\n if (score >= thresholds.degradedMin) return \"degraded\";\n return \"critical\";\n}\n\nexport class DegradedConfirmation {\n private consecutiveDegradedCount = 0;\n private readonly requiredCount: number;\n\n constructor(requiredCount: number = 2) {\n this.requiredCount = requiredCount;\n }\n\n update(band: HealthBand): boolean {\n if (band === \"degraded\") {\n this.consecutiveDegradedCount++;\n return this.consecutiveDegradedCount >= this.requiredCount;\n }\n\n if (band === \"critical\") {\n this.consecutiveDegradedCount = 0;\n return true;\n }\n\n this.consecutiveDegradedCount = 0;\n return false;\n }\n\n reset(): void {\n this.consecutiveDegradedCount = 0;\n }\n\n getCount(): number {\n return this.consecutiveDegradedCount;\n }\n}\n","import * as fs from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\n\n/**\n * Resolve gateway PID. Tries systemd user service first, then falls back to PID file.\n * @param pidSource - systemd unit name (e.g. \"openclaw-gateway.service\") or path to PID file\n * @returns PID number, or null if unresolvable\n */\nexport function resolvePid(pidSource: string): number | null {\n // If it looks like a systemd unit name (contains \".service\" or no path separators)\n if (pidSource.endsWith(\".service\") || !pidSource.includes(\"/\")) {\n const pid = resolveFromSystemd(pidSource);\n if (pid !== null) return pid;\n }\n\n // Fall back to PID file\n return resolveFromFile(pidSource);\n}\n\nfunction resolveFromSystemd(unit: string): number | null {\n try {\n const output = execFileSync(\n \"systemctl\",\n [\"--user\", \"show\", \"-p\", \"MainPID\", \"--value\", unit],\n { encoding: \"utf-8\", timeout: 3000, stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n ).trim();\n\n const pid = parseInt(output, 10);\n if (!isNaN(pid) && pid > 0) return pid;\n return null;\n } catch {\n return null;\n }\n}\n\nfunction resolveFromFile(pidFile: string): number | null {\n try {\n if (!fs.existsSync(pidFile)) return null;\n const pidStr = fs.readFileSync(pidFile, \"utf-8\").trim();\n const pid = parseInt(pidStr, 10);\n if (!isNaN(pid) && pid > 0) return pid;\n return null;\n } catch {\n return null;\n }\n}\n","import type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\nimport { resolvePid } from \"./resolve-pid.js\";\n\nexport async function processProbe(\n _target: ProbeTarget,\n pidSource: string,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n try {\n const pid = resolvePid(pidSource);\n\n if (pid === null) {\n return {\n name: \"process\",\n healthy: false,\n score: 0,\n message: \"Gateway process not found (checked systemd unit and PID file)\",\n latencyMs: Date.now() - start,\n };\n }\n\n try {\n process.kill(pid, 0);\n return {\n name: \"process\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n };\n } catch {\n return {\n name: \"process\",\n healthy: false,\n score: 0,\n message: `Process ${pid} not running (stale PID)`,\n latencyMs: Date.now() - start,\n };\n }\n } catch (err) {\n return {\n name: \"process\",\n healthy: false,\n score: 0,\n message: `Process probe error: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import * as net from \"node:net\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nexport async function portProbe(\n target: ProbeTarget,\n port: number,\n timeoutMs: number = 5000,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n const host = target.type === \"remote\" ? target.host : \"127.0.0.1\";\n\n return new Promise<HealthProbeResult>((resolve) => {\n const socket = new net.Socket();\n let resolved = false;\n\n const finish = (result: HealthProbeResult) => {\n if (!resolved) {\n resolved = true;\n socket.destroy();\n resolve(result);\n }\n };\n\n socket.setTimeout(timeoutMs);\n\n socket.connect(port, host, () => {\n finish({\n name: \"port\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n });\n });\n\n socket.on(\"error\", (err) => {\n finish({\n name: \"port\",\n healthy: false,\n score: 0,\n message: `Port ${port} unreachable: ${err.message}`,\n latencyMs: Date.now() - start,\n });\n });\n\n socket.on(\"timeout\", () => {\n finish({\n name: \"port\",\n healthy: false,\n score: 0,\n message: `Port ${port} connection timed out after ${timeoutMs}ms`,\n latencyMs: Date.now() - start,\n });\n });\n });\n}\n","import * as http from \"node:http\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nexport async function httpHealthProbe(\n target: ProbeTarget,\n port: number,\n endpoint: string = \"/health\",\n timeoutMs: number = 5000,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n const host = target.type === \"remote\" ? target.host : \"127.0.0.1\";\n\n return new Promise<HealthProbeResult>((resolve) => {\n const req = http.get(\n {\n hostname: host,\n port,\n path: endpoint,\n timeout: timeoutMs,\n },\n (res) => {\n const statusCode = res.statusCode ?? 0;\n res.resume();\n\n if (statusCode >= 200 && statusCode < 300) {\n resolve({\n name: \"http\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n });\n } else {\n resolve({\n name: \"http\",\n healthy: false,\n score: 0,\n message: `HTTP health returned status ${statusCode}`,\n latencyMs: Date.now() - start,\n });\n }\n },\n );\n\n req.on(\"error\", (err) => {\n resolve({\n name: \"http\",\n healthy: false,\n score: 0,\n message: `HTTP health probe failed: ${err.message}`,\n latencyMs: Date.now() - start,\n });\n });\n\n req.on(\"timeout\", () => {\n req.destroy();\n resolve({\n name: \"http\",\n healthy: false,\n score: 0,\n message: `HTTP health probe timed out after ${timeoutMs}ms`,\n latencyMs: Date.now() - start,\n });\n });\n });\n}\n","import * as fs from \"node:fs\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nconst REQUIRED_CONFIG_PATHS: { path: string[]; label: string }[] = [\n { path: [\"gateway\", \"port\"], label: \"gateway.port\" },\n];\n\nconst POISON_KEYS = [\"autoAck\", \"autoAckMessage\"];\n\nexport async function configProbe(\n _target: ProbeTarget,\n configPath: string,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n if (!fs.existsSync(configPath)) {\n return {\n name: \"config\",\n healthy: false,\n score: 0,\n message: \"Gateway config file not found\",\n latencyMs: Date.now() - start,\n };\n }\n\n const raw = fs.readFileSync(configPath, \"utf-8\");\n let parsed: Record<string, unknown>;\n\n try {\n parsed = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return {\n name: \"config\",\n healthy: false,\n score: 0,\n message: \"Gateway config is not valid JSON\",\n latencyMs: Date.now() - start,\n };\n }\n\n const missingPaths = REQUIRED_CONFIG_PATHS.filter(({ path }) => {\n let obj: unknown = parsed;\n for (const key of path) {\n if (obj === null || typeof obj !== \"object\" || !(key in obj)) return true;\n obj = (obj as Record<string, unknown>)[key];\n }\n return false;\n });\n if (missingPaths.length > 0) {\n return {\n name: \"config\",\n healthy: false,\n score: 0,\n message: `Missing required config keys: ${missingPaths.map((p) => p.label).join(\", \")}`,\n latencyMs: Date.now() - start,\n };\n }\n\n const foundPoison = POISON_KEYS.filter((key) => key in parsed);\n if (foundPoison.length > 0) {\n return {\n name: \"config\",\n healthy: false,\n score: 0,\n message: `Poison keys detected: ${foundPoison.join(\", \")}`,\n latencyMs: Date.now() - start,\n };\n }\n\n return {\n name: \"config\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n return {\n name: \"config\",\n healthy: false,\n score: 0,\n message: `Config probe error: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import * as fs from \"node:fs\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function tunProbe(_target: ProbeTarget): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n // Check if any TUN device exists\n const tunDevices = fs\n .readdirSync(\"/sys/class/net\")\n .filter((dev) => {\n try {\n const type = fs.readFileSync(`/sys/class/net/${dev}/type`, \"utf-8\").trim();\n return type === \"65534\"; // ARPHRD_NONE — typical for TUN\n } catch {\n return false;\n }\n });\n\n if (tunDevices.length === 0) {\n return {\n name: \"tun\",\n healthy: true,\n score: 2,\n message: \"No TUN device configured (not required)\",\n latencyMs: Date.now() - start,\n };\n }\n\n // Check if TUN device is UP\n const tunDev = tunDevices[0];\n if (!tunDev) {\n return {\n name: \"tun\",\n healthy: true,\n score: 2,\n message: \"No TUN device configured (not required)\",\n latencyMs: Date.now() - start,\n };\n }\n const { stdout } = await execFileAsync(\"ip\", [\"link\", \"show\", tunDev]);\n const isUp = stdout.includes(\"state UP\") || stdout.includes(\",UP\");\n\n return {\n name: \"tun\",\n healthy: isUp,\n score: isUp ? 2 : 0,\n message: isUp ? undefined : `TUN device ${tunDev} is DOWN`,\n latencyMs: Date.now() - start,\n };\n } catch {\n return {\n name: \"tun\",\n healthy: true,\n score: 2,\n message: \"TUN probe skipped (not available on this platform)\",\n latencyMs: Date.now() - start,\n };\n }\n}\n","import * as fs from \"node:fs\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\nimport { resolvePid } from \"./resolve-pid.js\";\n\nexport async function memoryProbe(\n _target: ProbeTarget,\n pidSource: string,\n thresholdMb: number = 512,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n const pid = resolvePid(pidSource);\n\n if (pid === null) {\n return {\n name: \"memory\",\n healthy: false,\n score: 0,\n message: \"Gateway process not found — cannot check memory\",\n latencyMs: Date.now() - start,\n };\n }\n\n const statusPath = `/proc/${pid}/status`;\n\n if (!fs.existsSync(statusPath)) {\n return {\n name: \"memory\",\n healthy: false,\n score: 0,\n message: `Process ${pid} not found in /proc`,\n latencyMs: Date.now() - start,\n };\n }\n\n const status = fs.readFileSync(statusPath, \"utf-8\");\n const rssMatch = status.match(/VmRSS:\\s+(\\d+)\\s+kB/);\n\n if (!rssMatch) {\n return {\n name: \"memory\",\n healthy: true,\n score: 1,\n message: \"Could not parse RSS from /proc status\",\n latencyMs: Date.now() - start,\n };\n }\n\n const rssKb = parseInt(rssMatch[1] ?? \"0\", 10);\n const rssMb = rssKb / 1024;\n const healthy = rssMb < thresholdMb;\n\n return {\n name: \"memory\",\n healthy,\n score: healthy ? 2 : 0,\n message: healthy ? undefined : `RSS ${rssMb.toFixed(0)}MB exceeds threshold ${thresholdMb}MB`,\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n return {\n name: \"memory\",\n healthy: false,\n score: 0,\n message: `Memory probe error: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import * as fs from \"node:fs\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\nimport { resolvePid } from \"./resolve-pid.js\";\n\nexport async function cpuProbe(\n _target: ProbeTarget,\n pidSource: string,\n thresholdPercent: number = 90,\n sampleMs: number = 1000,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n const pid = resolvePid(pidSource);\n\n if (pid === null) {\n return {\n name: \"cpu\",\n healthy: false,\n score: 0,\n message: \"Gateway process not found — cannot check CPU\",\n latencyMs: Date.now() - start,\n };\n }\n\n const statPath = `/proc/${pid}/stat`;\n\n if (!fs.existsSync(statPath)) {\n return {\n name: \"cpu\",\n healthy: false,\n score: 0,\n message: `Process ${pid} not found in /proc`,\n latencyMs: Date.now() - start,\n };\n }\n\n const readCpuTime = (): number => {\n const stat = fs.readFileSync(statPath, \"utf-8\");\n const fields = stat.split(\" \");\n const utime = parseInt(fields[13] ?? \"0\", 10) || 0;\n const stime = parseInt(fields[14] ?? \"0\", 10) || 0;\n return utime + stime;\n };\n\n const cpuTime1 = readCpuTime();\n await new Promise((r) => setTimeout(r, sampleMs));\n const cpuTime2 = readCpuTime();\n\n const clockTicks = 100; // sysconf(_SC_CLK_TCK) — typically 100 on Linux\n const cpuDelta = (cpuTime2 - cpuTime1) / clockTicks;\n const cpuPercent = (cpuDelta / (sampleMs / 1000)) * 100;\n const healthy = cpuPercent < thresholdPercent;\n\n return {\n name: \"cpu\",\n healthy,\n score: healthy ? 2 : 0,\n message: healthy\n ? undefined\n : `CPU ${cpuPercent.toFixed(1)}% exceeds threshold ${thresholdPercent}%`,\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n return {\n name: \"cpu\",\n healthy: false,\n score: 0,\n message: `CPU probe error: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport * as path from \"node:path\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function diskProbe(\n _target: ProbeTarget,\n configPath: string,\n thresholdMb: number = 100,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n const dir = path.dirname(configPath);\n const { stdout } = await execFileAsync(\"df\", [\"-BM\", \"--output=avail\", dir]);\n const lines = stdout.trim().split(\"\\n\");\n const lastLine = lines[lines.length - 1];\n if (!lastLine) {\n return {\n name: \"disk\",\n healthy: true,\n score: 1,\n message: \"Could not parse df output\",\n latencyMs: Date.now() - start,\n };\n }\n const availStr = lastLine.trim().replace(\"M\", \"\");\n const availMb = parseInt(availStr, 10);\n\n if (isNaN(availMb)) {\n return {\n name: \"disk\",\n healthy: true,\n score: 1,\n message: \"Could not parse disk space\",\n latencyMs: Date.now() - start,\n };\n }\n\n const healthy = availMb >= thresholdMb;\n\n return {\n name: \"disk\",\n healthy,\n score: healthy ? 2 : 0,\n message: healthy\n ? undefined\n : `Only ${availMb}MB available (threshold: ${thresholdMb}MB)`,\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n return {\n name: \"disk\",\n healthy: true,\n score: 1,\n message: `Disk probe fallback: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import * as fs from \"node:fs\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nconst ERROR_PATTERNS = [\n /ECONNRESET/,\n /SIGTERM/,\n /SIGKILL/,\n /ENOMEM/,\n /fatal\\s+error/i,\n /uncaught\\s+exception/i,\n /unhandled\\s+rejection/i,\n /out\\s+of\\s+memory/i,\n /EACCES/,\n /ENOSPC/,\n];\n\nexport async function logTailProbe(\n _target: ProbeTarget,\n logPath: string,\n tailLines: number = 50,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n if (!fs.existsSync(logPath)) {\n return {\n name: \"logTail\",\n healthy: true,\n score: 2,\n message: \"Log file not found (may not exist yet)\",\n latencyMs: Date.now() - start,\n };\n }\n\n const content = fs.readFileSync(logPath, \"utf-8\");\n const lines = content.split(\"\\n\").slice(-tailLines);\n const recentText = lines.join(\"\\n\");\n\n const matchedPatterns = ERROR_PATTERNS.filter((p) => p.test(recentText));\n\n if (matchedPatterns.length === 0) {\n return {\n name: \"logTail\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n };\n }\n\n const score = matchedPatterns.length >= 3 ? 0 : 1;\n\n return {\n name: \"logTail\",\n healthy: false,\n score,\n message: `Error patterns in recent logs: ${matchedPatterns.map((p) => p.source).join(\", \")}`,\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n return {\n name: \"logTail\",\n healthy: true,\n score: 1,\n message: `Log tail probe fallback: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import WebSocket from \"ws\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nexport async function websocketProbe(\n target: ProbeTarget,\n port: number,\n timeoutMs: number = 5000,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n const host = target.type === \"remote\" ? target.host : \"127.0.0.1\";\n const url = `ws://${host}:${port}`;\n\n return new Promise<HealthProbeResult>((resolve) => {\n let resolved = false;\n const finish = (result: HealthProbeResult) => {\n if (!resolved) {\n resolved = true;\n resolve(result);\n }\n };\n\n const timer = setTimeout(() => {\n ws.terminate();\n finish({\n name: \"websocket\",\n healthy: false,\n score: 0,\n message: `WebSocket handshake timed out after ${timeoutMs}ms`,\n latencyMs: Date.now() - start,\n });\n }, timeoutMs);\n\n const ws = new WebSocket(url, { handshakeTimeout: timeoutMs });\n\n ws.on(\"open\", () => {\n clearTimeout(timer);\n ws.close();\n finish({\n name: \"websocket\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n });\n });\n\n ws.on(\"error\", (err) => {\n clearTimeout(timer);\n ws.terminate();\n finish({\n name: \"websocket\",\n healthy: false,\n score: 0,\n message: `WebSocket probe failed: ${err.message}`,\n latencyMs: Date.now() - start,\n });\n });\n });\n}\n","import { Command } from \"commander\";\nimport { loadConfig, DEFAULT_CONFIG_PATH } from \"../../config/loader.js\";\nimport { HealthMonitor } from \"../../health/monitor.js\";\n\nexport const checkCommand = new Command(\"check\")\n .description(\"Run all health probes once and exit\")\n .option(\"-c, --config <path>\", \"Config file path\", DEFAULT_CONFIG_PATH)\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts: { config: string; json?: boolean }) => {\n const config = loadConfig(opts.config);\n const monitor = new HealthMonitor(config);\n\n const score = await monitor.runAllProbes();\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(score, null, 2) + \"\\n\");\n } else {\n const failed = score.probeResults.filter((p) => !p.healthy);\n process.stdout.write(`Health: ${score.band.toUpperCase()} (score: ${score.total})\\n`);\n process.stdout.write(`Probes: ${score.probeResults.length - failed.length} passed, ${failed.length} failed\\n`);\n\n if (failed.length > 0) {\n process.stdout.write(\"\\nFailed probes:\\n\");\n for (const probe of failed) {\n process.stdout.write(` - ${probe.name}: ${probe.message ?? \"failed\"}\\n`);\n }\n }\n }\n\n process.exit(score.band === \"healthy\" ? 0 : 1);\n });\n","import { Command } from \"commander\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as readline from \"node:readline\";\nimport { ensureConfigDir, getConfigDir, DEFAULT_CONFIG_PATH, expandHome, loadConfig } from \"../../config/loader.js\";\nimport { HealthMonitor } from \"../../health/monitor.js\";\n\nfunction ask(rl: readline.Interface, question: string, defaultValue?: string): Promise<string> {\n const suffix = defaultValue ? ` [${defaultValue}]` : \"\";\n return new Promise((resolve) => {\n rl.question(`${question}${suffix}: `, (answer) => {\n resolve(answer.trim() || defaultValue || \"\");\n });\n });\n}\n\nfunction detectPort(): number {\n try {\n const configPath = expandHome(\"~/.openclaw/openclaw.json\");\n if (fs.existsSync(configPath)) {\n const raw = JSON.parse(fs.readFileSync(configPath, \"utf-8\"));\n if (raw?.gateway?.port) return raw.gateway.port;\n }\n } catch { /* ignore */ }\n return 3000;\n}\n\nfunction generateToml(opts: {\n port: number;\n memoryThresholdMb: number;\n channels: { type: string; [key: string]: string | number }[];\n}): string {\n let toml = `# OpenClaw Aegis Configuration\n# Generated by 'aegis init'\n\n[gateway]\nconfigPath = \"~/.openclaw/openclaw.json\"\npidFile = \"openclaw-gateway.service\"\nport = ${opts.port}\nlogPath = \"~/.openclaw/logs/gateway.log\"\nhealthEndpoint = \"/health\"\n\n[monitoring]\nintervalMs = 10000\nprobeTimeoutMs = 5000\n\n[health]\nmemoryThresholdMb = ${opts.memoryThresholdMb}\ncpuThresholdPercent = 90\ndiskThresholdMb = 100\n\n[recovery]\nl1MaxAttempts = 3\nl2MaxAttempts = 2\n\n[backup]\nmaxKnownGood = 5\nknownGoodStabilityMs = 60000\n\n[deadManSwitch]\nenabled = true\ncountdownMs = 30000\n\n[platform]\ntype = \"systemd\"\n`;\n\n if (opts.channels.length > 0) {\n toml += \"\\n[alerts]\\n\";\n for (const ch of opts.channels) {\n toml += \"\\n[[alerts.channels]]\\n\";\n for (const [key, val] of Object.entries(ch)) {\n if (typeof val === \"number\") {\n toml += `${key} = ${val}\\n`;\n } else {\n toml += `${key} = \"${val}\"\\n`;\n }\n }\n }\n }\n\n return toml;\n}\n\nexport const initCommand = new Command(\"init\")\n .description(\"Interactive setup wizard — configure Aegis for your gateway\")\n .option(\"--auto\", \"Auto-detect everything, no prompts\")\n .action(async (opts: { auto?: boolean }) => {\n const configDir = getConfigDir();\n const configFile = expandHome(DEFAULT_CONFIG_PATH);\n\n if (fs.existsSync(configFile) && !opts.auto) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const overwrite = await ask(rl, \"Config already exists. Overwrite? (y/N)\", \"n\");\n if (overwrite.toLowerCase() !== \"y\") {\n console.log(\"Aborted.\");\n rl.close();\n return;\n }\n rl.close();\n }\n\n const detectedPort = detectPort();\n const channels: { type: string; [key: string]: string | number }[] = [];\n\n if (opts.auto) {\n // Auto mode: detect everything, no prompts\n console.log(\"Auto-detecting configuration...\");\n console.log(` Gateway port: ${detectedPort}`);\n console.log(` PID source: openclaw-gateway.service (systemd)`);\n console.log(` Memory threshold: 768MB`);\n } else {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n\n console.log(\"\\n OpenClaw Aegis — Setup Wizard\\n\");\n console.log(\" Detected gateway config at ~/.openclaw/openclaw.json\");\n console.log(` Detected gateway port: ${detectedPort}\\n`);\n\n const portStr = await ask(rl, \"Gateway port\", String(detectedPort));\n const port = parseInt(portStr, 10) || detectedPort;\n\n const memStr = await ask(rl, \"Memory threshold (MB)\", \"768\");\n const memThreshold = parseInt(memStr, 10) || 768;\n\n // Alert channels\n console.log(\"\\n Alert Channels (out-of-band — never through the gateway)\\n\");\n console.log(\" Supported: ntfy, telegram, whatsapp, slack, discord, email, pushover, webhook\\n\");\n\n let addMore = true;\n while (addMore) {\n const channelType = await ask(rl, \"Add alert channel? (ntfy/telegram/whatsapp/slack/discord/email/pushover/webhook/skip)\", \"skip\");\n\n if (channelType === \"skip\" || channelType === \"\") {\n addMore = false;\n continue;\n }\n\n switch (channelType) {\n case \"ntfy\": {\n const topic = await ask(rl, \" ntfy topic\", \"aegis-alerts\");\n const url = await ask(rl, \" ntfy server URL\", \"https://ntfy.sh\");\n channels.push({ type: \"ntfy\", topic, url, priority: 4 });\n console.log(` Added ntfy channel (${url}/${topic})\\n`);\n break;\n }\n case \"telegram\": {\n const botToken = await ask(rl, \" Telegram bot token\");\n const chatId = await ask(rl, \" Telegram chat ID\");\n if (botToken && chatId) {\n channels.push({ type: \"telegram\", botToken, chatId });\n console.log(\" Added Telegram channel\\n\");\n } else {\n console.log(\" Skipped — bot token and chat ID required\\n\");\n }\n break;\n }\n case \"whatsapp\": {\n const phoneNumberId = await ask(rl, \" WhatsApp Business phone number ID\");\n const accessToken = await ask(rl, \" WhatsApp Cloud API access token\");\n const recipientNumber = await ask(rl, \" Recipient phone number (with country code, e.g. 61412345678)\");\n if (phoneNumberId && accessToken && recipientNumber) {\n channels.push({ type: \"whatsapp\", phoneNumberId, accessToken, recipientNumber });\n console.log(\" Added WhatsApp channel\\n\");\n } else {\n console.log(\" Skipped — all three fields required\\n\");\n }\n break;\n }\n case \"slack\": {\n const webhookUrl = await ask(rl, \" Slack Incoming Webhook URL\");\n if (webhookUrl) {\n const channel = await ask(rl, \" Slack channel override (optional, e.g. #alerts)\");\n const ch: { type: string; webhookUrl: string; channel?: string } = { type: \"slack\", webhookUrl };\n if (channel) ch.channel = channel;\n channels.push(ch);\n console.log(\" Added Slack channel\\n\");\n } else {\n console.log(\" Skipped — webhook URL required\\n\");\n }\n break;\n }\n case \"discord\": {\n const webhookUrl = await ask(rl, \" Discord Webhook URL\");\n if (webhookUrl) {\n const username = await ask(rl, \" Bot display name (optional)\", \"Aegis\");\n const ch: { type: string; webhookUrl: string; username?: string } = { type: \"discord\", webhookUrl };\n if (username && username !== \"Aegis\") ch.username = username;\n channels.push(ch);\n console.log(\" Added Discord channel\\n\");\n } else {\n console.log(\" Skipped — webhook URL required\\n\");\n }\n break;\n }\n case \"email\": {\n const host = await ask(rl, \" SMTP host (e.g. smtp.gmail.com)\");\n const portStr = await ask(rl, \" SMTP port\", \"587\");\n const username = await ask(rl, \" SMTP username\");\n const password = await ask(rl, \" SMTP password\");\n const from = await ask(rl, \" From address\");\n const to = await ask(rl, \" To address\");\n if (host && username && password && from && to) {\n channels.push({\n type: \"email\", host, port: parseInt(portStr, 10) || 587,\n secure: 0, username, password, from, to,\n });\n console.log(\" Added Email channel\\n\");\n } else {\n console.log(\" Skipped — all fields required\\n\");\n }\n break;\n }\n case \"pushover\": {\n const apiToken = await ask(rl, \" Pushover API token (from your app)\");\n const userKey = await ask(rl, \" Pushover user key\");\n if (apiToken && userKey) {\n const device = await ask(rl, \" Device name (optional)\");\n const ch: { type: string; apiToken: string; userKey: string; device?: string } = { type: \"pushover\", apiToken, userKey };\n if (device) ch.device = device;\n channels.push(ch);\n console.log(\" Added Pushover channel\\n\");\n } else {\n console.log(\" Skipped — API token and user key required\\n\");\n }\n break;\n }\n case \"webhook\": {\n const url = await ask(rl, \" Webhook URL\");\n if (url) {\n const secret = await ask(rl, \" Webhook secret (optional)\");\n const ch: { type: string; url: string; secret?: string } = { type: \"webhook\", url };\n if (secret) ch.secret = secret;\n channels.push(ch);\n console.log(` Added webhook channel (${url})\\n`);\n } else {\n console.log(\" Skipped — URL required\\n\");\n }\n break;\n }\n default:\n console.log(` Unknown channel type: ${channelType}\\n`);\n }\n }\n\n rl.close();\n\n // Write config with user values\n const toml = generateToml({ port, memoryThresholdMb: memThreshold, channels });\n ensureConfigDir();\n fs.writeFileSync(configFile, toml, { mode: 0o600 });\n\n console.log(`\\n Config written to ${configFile}`);\n\n // Run a quick health check\n console.log(\"\\n Running health check...\\n\");\n const config = loadConfig(configFile);\n const monitor = new HealthMonitor(config);\n const score = await monitor.runAllProbes();\n\n const passed = score.probeResults.filter((p) => p.healthy).length;\n const failed = score.probeResults.filter((p) => !p.healthy);\n\n console.log(` Health: ${score.band.toUpperCase()} (${passed}/${score.probeResults.length} probes passed)`);\n if (failed.length > 0) {\n for (const probe of failed) {\n console.log(` - ${probe.name}: ${probe.message ?? \"failed\"}`);\n }\n }\n\n if (channels.length === 0) {\n console.log(\"\\n No alert channels configured. You can add them later by editing:\");\n console.log(` ${configFile}`);\n }\n\n console.log(\"\\n Setup complete. Run 'aegis check' to verify anytime.\\n\");\n return;\n }\n\n // Auto mode write\n const toml = generateToml({ port: detectedPort, memoryThresholdMb: 768, channels });\n ensureConfigDir();\n fs.writeFileSync(configFile, toml, { mode: 0o600 });\n console.log(`Config written to ${configFile}`);\n\n const config = loadConfig(configFile);\n const monitor = new HealthMonitor(config);\n const score = await monitor.runAllProbes();\n const passed = score.probeResults.filter((p) => p.healthy).length;\n console.log(`Health: ${score.band.toUpperCase()} (${passed}/${score.probeResults.length} probes passed)`);\n console.log(\"\\nSetup complete.\");\n });\n","import { Command } from \"commander\";\nimport { loadConfig, DEFAULT_CONFIG_PATH } from \"../../config/loader.js\";\nimport { AlertDispatcher } from \"../../alerts/dispatcher.js\";\nimport { NtfyProvider } from \"../../alerts/providers/ntfy.js\";\nimport { TelegramProvider } from \"../../alerts/providers/telegram.js\";\nimport { WhatsAppProvider } from \"../../alerts/providers/whatsapp.js\";\nimport { WebhookProvider } from \"../../alerts/providers/webhook.js\";\nimport { SlackProvider } from \"../../alerts/providers/slack.js\";\nimport { DiscordProvider } from \"../../alerts/providers/discord.js\";\nimport { EmailProvider } from \"../../alerts/providers/email.js\";\nimport { PushoverProvider } from \"../../alerts/providers/pushover.js\";\nimport type { AlertPayload } from \"../../types/index.js\";\n\nexport const testAlertCommand = new Command(\"test-alert\")\n .description(\"Send a test alert to all configured channels\")\n .option(\"-c, --config <path>\", \"Config file path\", DEFAULT_CONFIG_PATH)\n .action(async (opts: { config: string }) => {\n const config = loadConfig(opts.config);\n\n if (config.alerts.channels.length === 0) {\n console.log(\"No alert channels configured. Run 'aegis init' to add one.\");\n process.exit(1);\n }\n\n const dispatcher = new AlertDispatcher(1, [1000]);\n\n for (const ch of config.alerts.channels) {\n switch (ch.type) {\n case \"ntfy\":\n dispatcher.addProvider(new NtfyProvider(ch));\n break;\n case \"telegram\":\n dispatcher.addProvider(new TelegramProvider(ch));\n break;\n case \"whatsapp\":\n dispatcher.addProvider(new WhatsAppProvider(ch));\n break;\n case \"webhook\":\n dispatcher.addProvider(new WebhookProvider(ch));\n break;\n case \"slack\":\n dispatcher.addProvider(new SlackProvider(ch));\n break;\n case \"discord\":\n dispatcher.addProvider(new DiscordProvider(ch));\n break;\n case \"email\":\n dispatcher.addProvider(new EmailProvider(ch));\n break;\n case \"pushover\":\n dispatcher.addProvider(new PushoverProvider(ch));\n break;\n }\n }\n\n const alert: AlertPayload = {\n severity: \"info\",\n title: \"Aegis Test Alert\",\n body: \"This is a test notification from OpenClaw Aegis. If you see this, alerts are working.\",\n timestamp: new Date().toISOString(),\n };\n\n console.log(`Sending test alert to ${dispatcher.getProviders().length} channel(s)...\\n`);\n\n const result = await dispatcher.dispatch(alert);\n\n for (const r of result.results) {\n if (r.success) {\n console.log(` + ${r.provider}: sent (${r.durationMs}ms)`);\n } else {\n console.log(` - ${r.provider}: failed — ${r.error}`);\n }\n }\n\n console.log(result.sent ? \"\\nTest alert sent successfully.\" : \"\\nAll channels failed.\");\n process.exit(result.sent ? 0 : 1);\n });\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../types/index.js\";\n\nexport interface DispatchResult {\n sent: boolean;\n results: AlertResult[];\n allFailed: boolean;\n}\n\nexport class AlertDispatcher {\n private readonly providers: AlertProvider[] = [];\n private readonly retryBackoffMs: number[];\n private readonly retryAttempts: number;\n\n constructor(retryAttempts: number = 3, retryBackoffMs: number[] = [5000, 15000, 45000]) {\n this.retryAttempts = retryAttempts;\n this.retryBackoffMs = retryBackoffMs;\n }\n\n addProvider(provider: AlertProvider): void {\n this.providers.push(provider);\n }\n\n getProviders(): AlertProvider[] {\n return [...this.providers];\n }\n\n hasProviders(): boolean {\n return this.providers.length > 0;\n }\n\n async dispatch(alert: AlertPayload): Promise<DispatchResult> {\n if (this.providers.length === 0) {\n return { sent: false, results: [], allFailed: true };\n }\n\n const scrubbed = scrubSensitiveData(alert);\n const results: AlertResult[] = [];\n\n for (const provider of this.providers) {\n const result = await this.sendWithRetry(provider, scrubbed);\n results.push(result);\n }\n\n const anySuccess = results.some((r) => r.success);\n return { sent: anySuccess, results, allFailed: !anySuccess };\n }\n\n async testAll(): Promise<Map<string, boolean>> {\n const results = new Map<string, boolean>();\n for (const provider of this.providers) {\n try {\n const ok = await provider.test();\n results.set(provider.name, ok);\n } catch {\n results.set(provider.name, false);\n }\n }\n return results;\n }\n\n private async sendWithRetry(provider: AlertProvider, alert: AlertPayload): Promise<AlertResult> {\n let lastResult: AlertResult = {\n provider: provider.name,\n success: false,\n error: \"No attempts made\",\n durationMs: 0,\n };\n\n for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {\n try {\n lastResult = await provider.send(alert);\n if (lastResult.success) return lastResult;\n } catch (err) {\n lastResult = {\n provider: provider.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: 0,\n };\n }\n\n if (attempt < this.retryAttempts) {\n const delay = this.retryBackoffMs[attempt] ?? this.retryBackoffMs[this.retryBackoffMs.length - 1] ?? 5000;\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n\n return lastResult;\n }\n}\n\nexport function scrubSensitiveData(alert: AlertPayload): AlertPayload {\n return {\n ...alert,\n body: scrubString(alert.body),\n title: scrubString(alert.title),\n };\n}\n\nfunction scrubString(input: string): string {\n return input.replace(\n /(\"[^\"]*(?:key|secret|token|password|credential|auth)[^\"]*\"\\s*:\\s*)\"[^\"]*\"/gi,\n '$1\"[REDACTED]\"',\n );\n}","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface NtfyConfig {\n url: string;\n topic: string;\n priority: number;\n}\n\nexport class NtfyProvider implements AlertProvider {\n readonly name = \"ntfy\";\n private readonly config: NtfyConfig;\n\n constructor(config: NtfyConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const url = `${this.config.url}/${this.config.topic}`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Title\": alert.title,\n \"Priority\": String(this.config.priority),\n \"Tags\": alertSeverityToTag(alert.severity),\n },\n body: alert.body,\n });\n\n return {\n provider: this.name,\n success: response.ok,\n error: response.ok ? undefined : `HTTP ${response.status}`,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n\nfunction alertSeverityToTag(severity: string): string {\n switch (severity) {\n case \"critical\": return \"rotating_light\";\n case \"warning\": return \"warning\";\n default: return \"information_source\";\n }\n}\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface TelegramConfig {\n botToken: string;\n chatId: string;\n}\n\nexport class TelegramProvider implements AlertProvider {\n readonly name = \"telegram\";\n private readonly config: TelegramConfig;\n\n constructor(config: TelegramConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const url = `https://api.telegram.org/bot${this.config.botToken}/sendMessage`;\n const icon = alert.severity === \"critical\" ? \"\\u{1F6A8}\" : alert.severity === \"warning\" ? \"\\u{26A0}\\u{FE0F}\" : \"\\u{2139}\\u{FE0F}\";\n const text = `${icon} *${escapeMarkdown(alert.title)}*\\n\\n${escapeMarkdown(alert.body)}`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n chat_id: this.config.chatId,\n text,\n parse_mode: \"MarkdownV2\",\n }),\n });\n\n const data = await response.json() as { ok: boolean; description?: string };\n\n return {\n provider: this.name,\n success: data.ok,\n error: data.ok ? undefined : data.description,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n\nfunction escapeMarkdown(text: string): string {\n return text.replace(/([_*[\\]()~`>#+\\-=|{}.!\\\\])/g, \"\\\\$1\");\n}\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface WhatsAppConfig {\n phoneNumberId: string;\n accessToken: string;\n recipientNumber: string;\n}\n\n/**\n * WhatsApp Business Cloud API provider.\n * Sends alerts directly via Meta's API — completely out-of-band from OpenClaw.\n */\nexport class WhatsAppProvider implements AlertProvider {\n readonly name = \"whatsapp\";\n private readonly config: WhatsAppConfig;\n\n constructor(config: WhatsAppConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const url = `https://graph.facebook.com/v21.0/${this.config.phoneNumberId}/messages`;\n const icon = alert.severity === \"critical\" ? \"\\u{1F6A8}\" : alert.severity === \"warning\" ? \"\\u{26A0}\\u{FE0F}\" : \"\\u{2139}\\u{FE0F}\";\n const text = `${icon} *${alert.title}*\\n\\n${alert.body}`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Authorization\": `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n messaging_product: \"whatsapp\",\n to: this.config.recipientNumber,\n type: \"text\",\n text: { body: text },\n }),\n });\n\n const data = await response.json() as { messages?: { id: string }[]; error?: { message: string } };\n const success = response.ok && !!data.messages?.length;\n\n return {\n provider: this.name,\n success,\n error: success ? undefined : (data.error?.message ?? `HTTP ${response.status}`),\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n","import * as crypto from \"node:crypto\";\nimport type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface WebhookConfig {\n url: string;\n secret?: string;\n}\n\nexport class WebhookProvider implements AlertProvider {\n readonly name = \"webhook\";\n private readonly config: WebhookConfig;\n\n constructor(config: WebhookConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const body = JSON.stringify(alert);\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n\n if (this.config.secret) {\n const signature = crypto\n .createHmac(\"sha256\", this.config.secret)\n .update(body)\n .digest(\"hex\");\n headers[\"X-Aegis-Signature\"] = `sha256=${signature}`;\n }\n\n try {\n const response = await fetch(this.config.url, {\n method: \"POST\",\n headers,\n body,\n });\n\n return {\n provider: this.name,\n success: response.ok,\n error: response.ok ? undefined : `HTTP ${response.status}`,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Webhook Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface SlackConfig {\n webhookUrl: string;\n channel?: string;\n}\n\nexport class SlackProvider implements AlertProvider {\n readonly name = \"slack\";\n private readonly config: SlackConfig;\n\n constructor(config: SlackConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const icon = alert.severity === \"critical\" ? \":rotating_light:\" : alert.severity === \"warning\" ? \":warning:\" : \":information_source:\";\n\n const payload: Record<string, unknown> = {\n text: `${icon} *${alert.title}*\\n\\n${alert.body}`,\n };\n if (this.config.channel) {\n payload.channel = this.config.channel;\n }\n\n try {\n const response = await fetch(this.config.webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n const ok = response.ok;\n return {\n provider: this.name,\n success: ok,\n error: ok ? undefined : `HTTP ${response.status}`,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface DiscordConfig {\n webhookUrl: string;\n username?: string;\n}\n\nexport class DiscordProvider implements AlertProvider {\n readonly name = \"discord\";\n private readonly config: DiscordConfig;\n\n constructor(config: DiscordConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const color = alert.severity === \"critical\" ? 0xED4245 : alert.severity === \"warning\" ? 0xFEE75C : 0x57F287;\n\n const payload: Record<string, unknown> = {\n embeds: [{\n title: alert.title,\n description: alert.body,\n color,\n timestamp: alert.timestamp,\n footer: { text: \"OpenClaw Aegis\" },\n }],\n };\n if (this.config.username) {\n payload.username = this.config.username;\n }\n\n try {\n const response = await fetch(this.config.webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n const ok = response.status === 204 || response.ok;\n return {\n provider: this.name,\n success: ok,\n error: ok ? undefined : `HTTP ${response.status}`,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n","import * as net from \"node:net\";\nimport * as tls from \"node:tls\";\nimport type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface EmailConfig {\n host: string;\n port: number;\n secure: boolean;\n username: string;\n password: string;\n from: string;\n to: string;\n}\n\nexport class EmailProvider implements AlertProvider {\n readonly name = \"email\";\n private readonly config: EmailConfig;\n\n constructor(config: EmailConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const icon = alert.severity === \"critical\" ? \"[CRITICAL]\" : alert.severity === \"warning\" ? \"[WARNING]\" : \"[INFO]\";\n const subject = `${icon} ${alert.title}`;\n\n try {\n await this.sendSmtp(subject, alert.body);\n return {\n provider: this.name,\n success: true,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n\n private sendSmtp(subject: string, body: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeout = 15000;\n let socket: net.Socket | tls.TLSSocket;\n\n const connect = () => {\n if (this.config.secure) {\n socket = tls.connect({\n host: this.config.host,\n port: this.config.port,\n rejectUnauthorized: true,\n });\n } else {\n socket = net.createConnection({\n host: this.config.host,\n port: this.config.port,\n });\n }\n\n socket.setTimeout(timeout);\n\n let buffer = \"\";\n let step = 0;\n\n const commands = [\n `EHLO aegis\\r\\n`,\n `AUTH LOGIN\\r\\n`,\n `${Buffer.from(this.config.username).toString(\"base64\")}\\r\\n`,\n `${Buffer.from(this.config.password).toString(\"base64\")}\\r\\n`,\n `MAIL FROM:<${this.config.from}>\\r\\n`,\n `RCPT TO:<${this.config.to}>\\r\\n`,\n `DATA\\r\\n`,\n `From: ${this.config.from}\\r\\nTo: ${this.config.to}\\r\\nSubject: ${subject}\\r\\nContent-Type: text/plain; charset=utf-8\\r\\nX-Mailer: OpenClaw-Aegis\\r\\n\\r\\n${body}\\r\\n.\\r\\n`,\n `QUIT\\r\\n`,\n ];\n\n socket.on(\"data\", (data: Buffer) => {\n buffer += data.toString();\n const lines = buffer.split(\"\\r\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line) continue;\n const code = parseInt(line.substring(0, 3), 10);\n\n if (line.charAt(3) === \"-\") continue;\n\n if (code >= 400) {\n socket.destroy();\n reject(new Error(`SMTP error: ${line}`));\n return;\n }\n\n if (step < commands.length) {\n socket.write(commands[step]!);\n step++;\n }\n\n if (step >= commands.length && code === 221) {\n socket.end();\n resolve();\n return;\n }\n }\n });\n\n socket.on(\"timeout\", () => {\n socket.destroy();\n reject(new Error(\"SMTP connection timed out\"));\n });\n\n socket.on(\"error\", (err: Error) => {\n reject(new Error(`SMTP error: ${err.message}`));\n });\n };\n\n if (!this.config.secure && this.config.port === 587) {\n const plain = net.createConnection({\n host: this.config.host,\n port: this.config.port,\n });\n plain.setTimeout(timeout);\n\n let buf = \"\";\n let startTlsSent = false;\n let ehloSent = false;\n\n plain.on(\"data\", (data: Buffer) => {\n buf += data.toString();\n const lines = buf.split(\"\\r\\n\");\n buf = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line) continue;\n const code = parseInt(line.substring(0, 3), 10);\n if (line.charAt(3) === \"-\") continue;\n\n if (code >= 400) {\n plain.destroy();\n reject(new Error(`SMTP error: ${line}`));\n return;\n }\n\n if (!ehloSent) {\n plain.write(\"EHLO aegis\\r\\n\");\n ehloSent = true;\n } else if (!startTlsSent) {\n plain.write(\"STARTTLS\\r\\n\");\n startTlsSent = true;\n } else if (code === 220 && startTlsSent) {\n socket = tls.connect({\n socket: plain,\n host: this.config.host,\n rejectUnauthorized: true,\n }, () => {\n let step2 = 0;\n let buffer2 = \"\";\n const cmds = [\n `EHLO aegis\\r\\n`,\n `AUTH LOGIN\\r\\n`,\n `${Buffer.from(this.config.username).toString(\"base64\")}\\r\\n`,\n `${Buffer.from(this.config.password).toString(\"base64\")}\\r\\n`,\n `MAIL FROM:<${this.config.from}>\\r\\n`,\n `RCPT TO:<${this.config.to}>\\r\\n`,\n `DATA\\r\\n`,\n `From: ${this.config.from}\\r\\nTo: ${this.config.to}\\r\\nSubject: ${subject}\\r\\nContent-Type: text/plain; charset=utf-8\\r\\nX-Mailer: OpenClaw-Aegis\\r\\n\\r\\n${body}\\r\\n.\\r\\n`,\n `QUIT\\r\\n`,\n ];\n\n socket.write(cmds[0]!);\n step2 = 1;\n\n socket.on(\"data\", (d: Buffer) => {\n buffer2 += d.toString();\n const ls = buffer2.split(\"\\r\\n\");\n buffer2 = ls.pop() ?? \"\";\n\n for (const l of ls) {\n if (!l) continue;\n const c = parseInt(l.substring(0, 3), 10);\n if (l.charAt(3) === \"-\") continue;\n\n if (c >= 400) {\n socket.destroy();\n reject(new Error(`SMTP error: ${l}`));\n return;\n }\n\n if (step2 < cmds.length) {\n socket.write(cmds[step2]!);\n step2++;\n }\n\n if (step2 >= cmds.length && c === 221) {\n socket.end();\n resolve();\n return;\n }\n }\n });\n });\n return;\n }\n }\n });\n\n plain.on(\"timeout\", () => { plain.destroy(); reject(new Error(\"SMTP connection timed out\")); });\n plain.on(\"error\", (err: Error) => { reject(new Error(`SMTP error: ${err.message}`)); });\n } else {\n connect();\n }\n });\n }\n}\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface PushoverConfig {\n apiToken: string;\n userKey: string;\n device?: string;\n}\n\nexport class PushoverProvider implements AlertProvider {\n readonly name = \"pushover\";\n private readonly config: PushoverConfig;\n\n constructor(config: PushoverConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const priority = alert.severity === \"critical\" ? 1 : alert.severity === \"warning\" ? 0 : -1;\n\n const params: Record<string, string> = {\n token: this.config.apiToken,\n user: this.config.userKey,\n title: alert.title,\n message: alert.body,\n priority: String(priority),\n timestamp: String(Math.floor(new Date(alert.timestamp).getTime() / 1000)),\n };\n if (this.config.device) {\n params.device = this.config.device;\n }\n\n try {\n const response = await fetch(\"https://api.pushover.net/1/messages.json\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(params).toString(),\n });\n\n const data = await response.json() as { status: number; errors?: string[] };\n const ok = data.status === 1;\n\n return {\n provider: this.name,\n success: ok,\n error: ok ? undefined : (data.errors?.join(\", \") ?? `HTTP ${response.status}`),\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,oBAAwB;;;ACAxB,uBAAwB;;;ACAxB,SAAoB;AACpB,WAAsB;AACtB,SAAoB;AACpB,kBAAiB;;;ACHjB,iBAAkB;AAElB,IAAM,qBAAqB,aAAE,mBAAmB,QAAQ;AAAA,EACtD,aAAE,OAAO;AAAA,IACP,MAAM,aAAE,QAAQ,MAAM;AAAA,IACtB,KAAK,aAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,iBAAiB;AAAA,IAC/C,OAAO,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACvB,UAAU,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACpD,CAAC;AAAA,EACD,aAAE,OAAO;AAAA,IACP,MAAM,aAAE,QAAQ,SAAS;AAAA,IACzB,KAAK,aAAE,OAAO,EAAE,IAAI;AAAA,IACpB,QAAQ,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACrC,CAAC;AAAA,EACD,aAAE,OAAO;AAAA,IACP,MAAM,aAAE,QAAQ,UAAU;AAAA,IAC1B,UAAU,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC1B,QAAQ,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,CAAC;AAAA,EACD,aAAE,OAAO;AAAA,IACP,MAAM,aAAE,QAAQ,UAAU;AAAA,IAC1B,eAAe,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC/B,aAAa,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC7B,iBAAiB,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACnC,CAAC;AAAA,EACD,aAAE,OAAO;AAAA,IACP,MAAM,aAAE,QAAQ,OAAO;AAAA,IACvB,YAAY,aAAE,OAAO,EAAE,IAAI;AAAA,IAC3B,SAAS,aAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,CAAC;AAAA,EACD,aAAE,OAAO;AAAA,IACP,MAAM,aAAE,QAAQ,SAAS;AAAA,IACzB,YAAY,aAAE,OAAO,EAAE,IAAI;AAAA,IAC3B,UAAU,aAAE,OAAO,EAAE,SAAS;AAAA,EAChC,CAAC;AAAA,EACD,aAAE,OAAO;AAAA,IACP,MAAM,aAAE,QAAQ,OAAO;AAAA,IACvB,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACtB,MAAM,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,EAAE,QAAQ,GAAG;AAAA,IACpD,QAAQ,aAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IACjC,UAAU,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC1B,UAAU,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC1B,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACtB,IAAI,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,CAAC;AAAA,EACD,aAAE,OAAO;AAAA,IACP,MAAM,aAAE,QAAQ,UAAU;AAAA,IAC1B,UAAU,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IAC1B,SAAS,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,IACzB,QAAQ,aAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,CAAC;AACH,CAAC;AAIM,IAAM,oBAAoB,aAAE,OAAO;AAAA,EACxC,SAAS,aACN,OAAO;AAAA,IACN,YAAY,aAAE,OAAO,EAAE,QAAQ,2BAA2B;AAAA,IAC1D,SAAS,aAAE,OAAO,EAAE,QAAQ,0BAA0B;AAAA,IACtD,MAAM,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,EAAE,QAAQ,KAAK;AAAA,IACtD,SAAS,aAAE,OAAO,EAAE,QAAQ,8BAA8B;AAAA,IAC1D,gBAAgB,aAAE,OAAO,EAAE,QAAQ,SAAS;AAAA,EAC9C,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EAEb,YAAY,aACT,OAAO;AAAA,IACN,YAAY,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAI,EAAE,QAAQ,GAAK;AAAA,IACpD,gBAAgB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,QAAQ,GAAI;AAAA,IACtD,sBAAsB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,QAAQ,GAAI;AAAA,IAC5D,2BAA2B,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC9D,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EAEb,QAAQ,aACL,OAAO;AAAA,IACN,YAAY,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IAC7C,aAAa,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IAC9C,mBAAmB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG;AAAA,IACtD,qBAAqB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE;AAAA,IAChE,iBAAiB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG;AAAA,EACtD,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EAEb,UAAU,aACP,OAAO;AAAA,IACN,eAAe,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IAChD,iBAAiB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAI,EAAE,QAAQ,GAAI;AAAA,IACxD,qBAAqB,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IAChD,eAAe,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IAChD,cAAc,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAI,EAAE,QAAQ,GAAK;AAAA,IACtD,yBAAyB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IAC1D,wBAAwB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAK,EAAE,QAAQ,IAAO;AAAA,IACnE,UAAU,aACP,OAAO;AAAA,MACN,aAAa,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,MAC9C,UAAU,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAK,EAAE,QAAQ,GAAM;AAAA,MACpD,YAAY,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAK,EAAE,QAAQ,GAAM;AAAA,MACtD,SAAS,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAK,EAAE,QAAQ,KAAQ;AAAA,IACvD,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EACf,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EAEb,QAAQ,aACL,OAAO;AAAA,IACN,kBAAkB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE;AAAA,IACpD,cAAc,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IAC/C,sBAAsB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAK,EAAE,QAAQ,GAAK;AAAA,IAC/D,UAAU,aAAE,OAAO,EAAE,QAAQ,2BAA2B;AAAA,EAC1D,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EAEb,eAAe,aACZ,OAAO;AAAA,IACN,aAAa,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAI,EAAE,QAAQ,GAAK;AAAA,IACrD,SAAS,aAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACnC,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EAEb,QAAQ,aACL,OAAO;AAAA,IACN,UAAU,aAAE,MAAM,kBAAkB,EAAE,QAAQ,CAAC,CAAC;AAAA,IAChD,eAAe,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IAChD,gBAAgB,aAAE,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAM,MAAO,IAAK,CAAC;AAAA,EACxE,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EAEb,UAAU,aACP,OAAO;AAAA,IACN,MAAM,aAAE,KAAK,CAAC,WAAW,SAAS,CAAC,EAAE,QAAQ,SAAS;AAAA,IACtD,aAAa,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE;AAAA,EAClD,CAAC,EACA,QAAQ,CAAC,CAAC;AACf,CAAC;;;ADjIM,SAAS,WAAW,UAA0B;AACnD,MAAI,SAAS,WAAW,IAAI,GAAG;AAC7B,WAAY,UAAQ,WAAQ,GAAG,SAAS,MAAM,CAAC,CAAC;AAAA,EAClD;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,QAAkC;AACnE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,MACP,GAAG,OAAO;AAAA,MACV,YAAY,WAAW,OAAO,QAAQ,UAAU;AAAA,MAChD,SAAS,WAAW,OAAO,QAAQ,OAAO;AAAA,MAC1C,SAAS,WAAW,OAAO,QAAQ,OAAO;AAAA,IAC5C;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,OAAO;AAAA,MACV,UAAU,WAAW,OAAO,OAAO,QAAQ;AAAA,IAC7C;AAAA,EACF;AACF;AAEO,SAAS,WAAW,YAAiC;AAC1D,QAAM,eAAe,WAAW,UAAU;AAE1C,MAAI,CAAI,cAAW,YAAY,GAAG;AAChC,UAAM,WAAW,kBAAkB,MAAM,CAAC,CAAC;AAC3C,WAAO,mBAAmB,QAAQ;AAAA,EACpC;AAEA,QAAM,MAAS,gBAAa,cAAc,OAAO;AACjD,QAAM,SAAkB,YAAAC,QAAK,MAAM,GAAG;AACtC,QAAM,YAAY,kBAAkB,MAAM,MAAM;AAChD,SAAO,mBAAmB,SAAS;AACrC;AAEO,IAAM,sBAAsB;AAE5B,SAAS,eAAuB;AACrC,SAAO,WAAW,mBAAmB;AACvC;AAEO,SAAS,kBAAwB;AACtC,QAAM,MAAM,aAAa;AACzB,EAAG,aAAU,KAAK,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACpD;;;AEpDA,yBAA6B;;;ACsGtB,IAAM,gBAAwC;AAAA,EACnD,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AACX;AAEO,IAAM,mBAAmB,OAAO,OAAO,aAAa,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI;;;AC3G1F,IAAM,qBAAwC;AAAA,EAC5C,YAAY;AAAA,EACZ,aAAa;AACf;AAEO,SAAS,mBACd,SACA,aAAgC,oBACnB;AACb,MAAI,WAAW;AAEf,aAAW,UAAU,SAAS;AAC5B,UAAM,SAAS,cAAc,OAAO,IAAI,KAAK;AAC7C,gBAAY,OAAO,QAAQ;AAAA,EAC7B;AAEA,QAAM,aAAa,mBAAmB,IAAI,KAAK,MAAO,WAAW,mBAAoB,EAAE,IAAI;AAC3F,QAAM,OAAO,aAAa,YAAY,UAAU;AAEhD,SAAO,EAAE,OAAO,YAAY,MAAM,cAAc,QAAQ;AAC1D;AAEA,SAAS,aAAa,OAAe,YAA2C;AAC9E,MAAI,SAAS,WAAW,WAAY,QAAO;AAC3C,MAAI,SAAS,WAAW,YAAa,QAAO;AAC5C,SAAO;AACT;AAEO,IAAM,uBAAN,MAA2B;AAAA,EACxB,2BAA2B;AAAA,EAClB;AAAA,EAEjB,YAAY,gBAAwB,GAAG;AACrC,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,OAAO,MAA2B;AAChC,QAAI,SAAS,YAAY;AACvB,WAAK;AACL,aAAO,KAAK,4BAA4B,KAAK;AAAA,IAC/C;AAEA,QAAI,SAAS,YAAY;AACvB,WAAK,2BAA2B;AAChC,aAAO;AAAA,IACT;AAEA,SAAK,2BAA2B;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,2BAA2B;AAAA,EAClC;AAAA,EAEA,WAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AACF;;;AClEA,IAAAC,MAAoB;AACpB,gCAA6B;AAOtB,SAAS,WAAW,WAAkC;AAE3D,MAAI,UAAU,SAAS,UAAU,KAAK,CAAC,UAAU,SAAS,GAAG,GAAG;AAC9D,UAAM,MAAM,mBAAmB,SAAS;AACxC,QAAI,QAAQ,KAAM,QAAO;AAAA,EAC3B;AAGA,SAAO,gBAAgB,SAAS;AAClC;AAEA,SAAS,mBAAmB,MAA6B;AACvD,MAAI;AACF,UAAM,aAAS;AAAA,MACb;AAAA,MACA,CAAC,UAAU,QAAQ,MAAM,WAAW,WAAW,IAAI;AAAA,MACnD,EAAE,UAAU,SAAS,SAAS,KAAM,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE;AAAA,IACtE,EAAE,KAAK;AAEP,UAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,QAAI,CAAC,MAAM,GAAG,KAAK,MAAM,EAAG,QAAO;AACnC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,SAAgC;AACvD,MAAI;AACF,QAAI,CAAI,eAAW,OAAO,EAAG,QAAO;AACpC,UAAM,SAAY,iBAAa,SAAS,OAAO,EAAE,KAAK;AACtD,UAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,QAAI,CAAC,MAAM,GAAG,KAAK,MAAM,EAAG,QAAO;AACnC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC1CA,eAAsB,aACpB,SACA,WAC4B;AAC5B,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI;AACF,UAAM,MAAM,WAAW,SAAS;AAEhC,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI;AACF,cAAQ,KAAK,KAAK,CAAC;AACnB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,WAAW,GAAG;AAAA,QACvB,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS,wBAAwB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACjF,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;;;AC/CA,UAAqB;AAGrB,eAAsB,UACpB,QACA,MACA,YAAoB,KACQ;AAC5B,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAEtD,SAAO,IAAI,QAA2B,CAAC,YAAY;AACjD,UAAM,SAAS,IAAQ,WAAO;AAC9B,QAAI,WAAW;AAEf,UAAM,SAAS,CAAC,WAA8B;AAC5C,UAAI,CAAC,UAAU;AACb,mBAAW;AACX,eAAO,QAAQ;AACf,gBAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,WAAW,SAAS;AAE3B,WAAO,QAAQ,MAAM,MAAM,MAAM;AAC/B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAED,WAAO,GAAG,SAAS,CAAC,QAAQ;AAC1B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,QAAQ,IAAI,iBAAiB,IAAI,OAAO;AAAA,QACjD,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAED,WAAO,GAAG,WAAW,MAAM;AACzB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,QAAQ,IAAI,+BAA+B,SAAS;AAAA,QAC7D,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;ACtDA,WAAsB;AAGtB,eAAsB,gBACpB,QACA,MACA,WAAmB,WACnB,YAAoB,KACQ;AAC5B,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAEtD,SAAO,IAAI,QAA2B,CAAC,YAAY;AACjD,UAAM,MAAW;AAAA,MACf;AAAA,QACE,UAAU;AAAA,QACV;AAAA,QACA,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,aAAa,IAAI,cAAc;AACrC,YAAI,OAAO;AAEX,YAAI,cAAc,OAAO,aAAa,KAAK;AACzC,kBAAQ;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO;AAAA,YACP,WAAW,KAAK,IAAI,IAAI;AAAA,UAC1B,CAAC;AAAA,QACH,OAAO;AACL,kBAAQ;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO;AAAA,YACP,SAAS,+BAA+B,UAAU;AAAA,YAClD,WAAW,KAAK,IAAI,IAAI;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,QAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,cAAQ;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,6BAA6B,IAAI,OAAO;AAAA,QACjD,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAED,QAAI,GAAG,WAAW,MAAM;AACtB,UAAI,QAAQ;AACZ,cAAQ;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,qCAAqC,SAAS;AAAA,QACvD,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;AChEA,IAAAC,MAAoB;AAGpB,IAAM,wBAA6D;AAAA,EACjE,EAAE,MAAM,CAAC,WAAW,MAAM,GAAG,OAAO,eAAe;AACrD;AAEA,IAAM,cAAc,CAAC,WAAW,gBAAgB;AAEhD,eAAsB,YACpB,SACA,YAC4B;AAC5B,QAAM,QAAQ,KAAK,IAAI;AAEvB,MAAI;AACF,QAAI,CAAI,eAAW,UAAU,GAAG;AAC9B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,MAAS,iBAAa,YAAY,OAAO;AAC/C,QAAI;AAEJ,QAAI;AACF,eAAS,KAAK,MAAM,GAAG;AAAA,IACzB,QAAQ;AACN,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,eAAe,sBAAsB,OAAO,CAAC,EAAE,MAAAC,MAAK,MAAM;AAC9D,UAAI,MAAe;AACnB,iBAAW,OAAOA,OAAM;AACtB,YAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,EAAE,OAAO,KAAM,QAAO;AACrE,cAAO,IAAgC,GAAG;AAAA,MAC5C;AACA,aAAO;AAAA,IACT,CAAC;AACD,QAAI,aAAa,SAAS,GAAG;AAC3B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,iCAAiC,aAAa,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,QACrF,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,cAAc,YAAY,OAAO,CAAC,QAAQ,OAAO,MAAM;AAC7D,QAAI,YAAY,SAAS,GAAG;AAC1B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,yBAAyB,YAAY,KAAK,IAAI,CAAC;AAAA,QACxD,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS,uBAAuB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAChF,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;;;ACrFA,IAAAC,MAAoB;AACpB,IAAAC,6BAAyB;AACzB,uBAA0B;AAG1B,IAAM,oBAAgB,4BAAU,mCAAQ;AAExC,eAAsB,SAAS,SAAkD;AAC/E,QAAM,QAAQ,KAAK,IAAI;AAEvB,MAAI;AAEF,UAAM,aACH,gBAAY,gBAAgB,EAC5B,OAAO,CAAC,QAAQ;AACf,UAAI;AACF,cAAM,OAAU,iBAAa,kBAAkB,GAAG,SAAS,OAAO,EAAE,KAAK;AACzE,eAAO,SAAS;AAAA,MAClB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAEH,QAAI,WAAW,WAAW,GAAG;AAC3B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAGA,UAAM,SAAS,WAAW,CAAC;AAC3B,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,EAAE,OAAO,IAAI,MAAM,cAAc,MAAM,CAAC,QAAQ,QAAQ,MAAM,CAAC;AACrE,UAAM,OAAO,OAAO,SAAS,UAAU,KAAK,OAAO,SAAS,KAAK;AAEjE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO,OAAO,IAAI;AAAA,MAClB,SAAS,OAAO,SAAY,cAAc,MAAM;AAAA,MAChD,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;;;AC/DA,IAAAC,MAAoB;AAIpB,eAAsB,YACpB,SACA,WACA,cAAsB,KACM;AAC5B,QAAM,QAAQ,KAAK,IAAI;AAEvB,MAAI;AACF,UAAM,MAAM,WAAW,SAAS;AAEhC,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,aAAa,SAAS,GAAG;AAE/B,QAAI,CAAI,eAAW,UAAU,GAAG;AAC9B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,WAAW,GAAG;AAAA,QACvB,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,SAAY,iBAAa,YAAY,OAAO;AAClD,UAAM,WAAW,OAAO,MAAM,qBAAqB;AAEnD,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,QAAQ,SAAS,SAAS,CAAC,KAAK,KAAK,EAAE;AAC7C,UAAM,QAAQ,QAAQ;AACtB,UAAM,UAAU,QAAQ;AAExB,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,OAAO,UAAU,IAAI;AAAA,MACrB,SAAS,UAAU,SAAY,OAAO,MAAM,QAAQ,CAAC,CAAC,wBAAwB,WAAW;AAAA,MACzF,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS,uBAAuB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAChF,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;;;ACrEA,IAAAC,MAAoB;AAIpB,eAAsB,SACpB,SACA,WACA,mBAA2B,IAC3B,WAAmB,KACS;AAC5B,QAAM,QAAQ,KAAK,IAAI;AAEvB,MAAI;AACF,UAAM,MAAM,WAAW,SAAS;AAEhC,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,GAAG;AAE7B,QAAI,CAAI,eAAW,QAAQ,GAAG;AAC5B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,WAAW,GAAG;AAAA,QACvB,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,cAAc,MAAc;AAChC,YAAM,OAAU,iBAAa,UAAU,OAAO;AAC9C,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,YAAM,QAAQ,SAAS,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK;AACjD,YAAM,QAAQ,SAAS,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK;AACjD,aAAO,QAAQ;AAAA,IACjB;AAEA,UAAM,WAAW,YAAY;AAC7B,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAChD,UAAM,WAAW,YAAY;AAE7B,UAAM,aAAa;AACnB,UAAM,YAAY,WAAW,YAAY;AACzC,UAAM,aAAc,YAAY,WAAW,OAAS;AACpD,UAAM,UAAU,aAAa;AAE7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,OAAO,UAAU,IAAI;AAAA,MACrB,SAAS,UACL,SACA,OAAO,WAAW,QAAQ,CAAC,CAAC,uBAAuB,gBAAgB;AAAA,MACvE,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS,oBAAoB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAC7E,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;;;ACxEA,IAAAC,6BAAyB;AACzB,IAAAC,oBAA0B;AAC1B,IAAAC,QAAsB;AAGtB,IAAMC,qBAAgB,6BAAU,mCAAQ;AAExC,eAAsB,UACpB,SACA,YACA,cAAsB,KACM;AAC5B,QAAM,QAAQ,KAAK,IAAI;AAEvB,MAAI;AACF,UAAM,MAAW,cAAQ,UAAU;AACnC,UAAM,EAAE,OAAO,IAAI,MAAMA,eAAc,MAAM,CAAC,OAAO,kBAAkB,GAAG,CAAC;AAC3E,UAAM,QAAQ,OAAO,KAAK,EAAE,MAAM,IAAI;AACtC,UAAM,WAAW,MAAM,MAAM,SAAS,CAAC;AACvC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,WAAW,SAAS,KAAK,EAAE,QAAQ,KAAK,EAAE;AAChD,UAAM,UAAU,SAAS,UAAU,EAAE;AAErC,QAAI,MAAM,OAAO,GAAG;AAClB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,UAAU,WAAW;AAE3B,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,OAAO,UAAU,IAAI;AAAA,MACrB,SAAS,UACL,SACA,QAAQ,OAAO,4BAA4B,WAAW;AAAA,MAC1D,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS,wBAAwB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACjF,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;;;AC7DA,IAAAC,MAAoB;AAGpB,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAsB,aACpB,SACA,SACA,YAAoB,IACQ;AAC5B,QAAM,QAAQ,KAAK,IAAI;AAEvB,MAAI;AACF,QAAI,CAAI,eAAW,OAAO,GAAG;AAC3B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,UAAa,iBAAa,SAAS,OAAO;AAChD,UAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,MAAM,CAAC,SAAS;AAClD,UAAM,aAAa,MAAM,KAAK,IAAI;AAElC,UAAM,kBAAkB,eAAe,OAAO,CAAC,MAAM,EAAE,KAAK,UAAU,CAAC;AAEvE,QAAI,gBAAgB,WAAW,GAAG;AAChC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,QAAQ,gBAAgB,UAAU,IAAI,IAAI;AAEhD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,SAAS,kCAAkC,gBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,MAC1F,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS,4BAA4B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACrF,WAAW,KAAK,IAAI,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;;;ACnEA,gBAAsB;AAGtB,eAAsB,eACpB,QACA,MACA,YAAoB,KACQ;AAC5B,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AACtD,QAAM,MAAM,QAAQ,IAAI,IAAI,IAAI;AAEhC,SAAO,IAAI,QAA2B,CAAC,YAAY;AACjD,QAAI,WAAW;AACf,UAAM,SAAS,CAAC,WAA8B;AAC5C,UAAI,CAAC,UAAU;AACb,mBAAW;AACX,gBAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,QAAQ,WAAW,MAAM;AAC7B,SAAG,UAAU;AACb,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,uCAAuC,SAAS;AAAA,QACzD,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,GAAG,SAAS;AAEZ,UAAM,KAAK,IAAI,UAAAC,QAAU,KAAK,EAAE,kBAAkB,UAAU,CAAC;AAE7D,OAAG,GAAG,QAAQ,MAAM;AAClB,mBAAa,KAAK;AAClB,SAAG,MAAM;AACT,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAED,OAAG,GAAG,SAAS,CAAC,QAAQ;AACtB,mBAAa,KAAK;AAClB,SAAG,UAAU;AACb,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,2BAA2B,IAAI,OAAO;AAAA,QAC/C,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;Ab1CO,IAAM,gBAAN,cAA4B,gCAAa;AAAA,EAK9C,YAA6B,QAAqB;AAChD,UAAM;AADqB;AAE3B,SAAK,uBAAuB,IAAI;AAAA,MAC9B,OAAO,WAAW;AAAA,IACpB;AAAA,EACF;AAAA,EATQ,WAAkC;AAAA,EACzB;AAAA,EACT,YAAgC;AAAA,EASxC,MAAM,eAAqC;AACzC,UAAM,SAAsB,EAAE,MAAM,QAAQ;AAC5C,UAAM,UAAU,KAAK,OAAO,WAAW;AAEvC,UAAM,cAAc,OAClB,IACA,SAC+B;AAC/B,UAAI;AACF,eAAO,MAAM,QAAQ,KAAK;AAAA,UACxB,GAAG;AAAA,UACH,IAAI;AAAA,YAA2B,CAAC,YAC9B;AAAA,cACE,MACE,QAAQ;AAAA,gBACN;AAAA,gBACA,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,SAAS,yBAAyB,OAAO;AAAA,gBACzC,WAAW;AAAA,cACb,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO;AAAA,UACL;AAAA,UACA,SAAS;AAAA,UACT,OAAO;AAAA,UACP,SAAS,gBAAgB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,UACzE,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,MACvC,YAAY,MAAM,aAAa,QAAQ,KAAK,OAAO,QAAQ,OAAO,GAAG,SAAS;AAAA,MAC9E,YAAY,MAAM,UAAU,QAAQ,KAAK,OAAO,QAAQ,MAAM,OAAO,GAAG,MAAM;AAAA,MAC9E;AAAA,QACE,MACE;AAAA,UACE;AAAA,UACA,KAAK,OAAO,QAAQ;AAAA,UACpB,KAAK,OAAO,QAAQ;AAAA,UACpB;AAAA,QACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,YAAY,MAAM,YAAY,QAAQ,KAAK,OAAO,QAAQ,UAAU,GAAG,QAAQ;AAAA,MAC/E,YAAY,MAAM,SAAS,MAAM,GAAG,KAAK;AAAA,MACzC;AAAA,QACE,MAAM,YAAY,QAAQ,KAAK,OAAO,QAAQ,SAAS,KAAK,OAAO,OAAO,iBAAiB;AAAA,QAC3F;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM,SAAS,QAAQ,KAAK,OAAO,QAAQ,SAAS,KAAK,OAAO,OAAO,mBAAmB;AAAA,QAC1F;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM,UAAU,QAAQ,KAAK,OAAO,QAAQ,YAAY,KAAK,OAAO,OAAO,eAAe;AAAA,QAC1F;AAAA,MACF;AAAA,MACA,YAAY,MAAM,aAAa,QAAQ,KAAK,OAAO,QAAQ,OAAO,GAAG,SAAS;AAAA,MAC9E;AAAA,QACE,MAAM,eAAe,QAAQ,KAAK,OAAO,QAAQ,MAAM,OAAO;AAAA,QAC9D;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,eAAoC,QAAQ,IAAI,CAAC,GAAG,MAAM;AAC9D,UAAI,EAAE,WAAW,YAAa,QAAO,EAAE;AACvC,YAAM,QAAQ;AAAA,QACZ;AAAA,QAAW;AAAA,QAAQ;AAAA,QAAQ;AAAA,QAAU;AAAA,QACrC;AAAA,QAAU;AAAA,QAAO;AAAA,QAAQ;AAAA,QAAW;AAAA,MACtC;AACA,aAAO;AAAA,QACL,MAAM,MAAM,CAAC,KAAK;AAAA,QAClB,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,mBAAmB,EAAE,kBAAkB,QAAQ,EAAE,OAAO,UAAU,OAAO,EAAE,MAAM,CAAC;AAAA,QAC3F,WAAW;AAAA,MACb;AAAA,IACF,CAAC;AAED,UAAM,QAAQ,mBAAmB,cAAc;AAAA,MAC7C,YAAY,KAAK,OAAO,OAAO;AAAA,MAC/B,aAAa,KAAK,OAAO,OAAO;AAAA,IAClC,CAAC;AAED,SAAK,YAAY;AACjB,UAAM,iBAAiB,KAAK,qBAAqB,OAAO,MAAM,IAAI;AAElE,SAAK,KAAK,SAAS,KAAK;AAExB,QAAI,kBAAkB,MAAM,SAAS,WAAW;AAC9C,WAAK,KAAK,YAAY,KAAK;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,WAAW,YAAY,MAAM;AAChC,WAAK,KAAK,aAAa;AAAA,IACzB,GAAG,KAAK,OAAO,WAAW,UAAU;AAAA,EACtC;AAAA,EAEA,OAAa;AACX,QAAI,KAAK,UAAU;AACjB,oBAAc,KAAK,QAAQ;AAC3B,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,eAAmC;AACjC,WAAO,KAAK;AAAA,EACd;AACF;;;AH7IO,IAAM,gBAAgB,IAAI,yBAAQ,QAAQ,EAC9C,YAAY,+CAA+C,EAC3D,OAAO,uBAAuB,oBAAoB,mBAAmB,EACrE,OAAO,OAAO,SAA6B;AAC1C,QAAM,SAAS,WAAW,KAAK,MAAM;AACrC,QAAM,UAAU,IAAI,cAAc,MAAM;AAExC,QAAM,QAAQ,MAAM,QAAQ,aAAa;AAEzC,QAAM,aAAqC;AAAA,IACzC,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AACA,QAAM,QAAQ;AACd,QAAM,QAAQ,WAAW,MAAM,IAAI,KAAK;AAExC,UAAQ,OAAO,MAAM;AAAA,UAAa,KAAK,GAAG,MAAM,KAAK,YAAY,CAAC,GAAG,KAAK,YAAY,MAAM,KAAK;AAAA;AAAA,CAAO;AAExG,aAAW,SAAS,MAAM,cAAc;AACtC,UAAM,OAAO,MAAM,UAAU,qBAAqB;AAClD,UAAM,MAAM,MAAM,UAAU,WAAM,MAAM,OAAO,KAAK;AACpD,YAAQ,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM,SAAS,MAAM,GAAG;AAAA,CAAI;AAAA,EAC/E;AAEA,MAAI,OAAO,OAAO,SAAS,WAAW,GAAG;AACvC,YAAQ,OAAO;AAAA,MACb;AAAA;AAAA;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,IAAI;AAC3B,CAAC;;;AiBpCH,IAAAC,oBAAwB;AAIjB,IAAM,eAAe,IAAI,0BAAQ,OAAO,EAC5C,YAAY,qCAAqC,EACjD,OAAO,uBAAuB,oBAAoB,mBAAmB,EACrE,OAAO,UAAU,gBAAgB,EACjC,OAAO,OAAO,SAA6C;AAC1D,QAAM,SAAS,WAAW,KAAK,MAAM;AACrC,QAAM,UAAU,IAAI,cAAc,MAAM;AAExC,QAAM,QAAQ,MAAM,QAAQ,aAAa;AAEzC,MAAI,KAAK,MAAM;AACb,YAAQ,OAAO,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,IAAI;AAAA,EAC5D,OAAO;AACL,UAAM,SAAS,MAAM,aAAa,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO;AAC1D,YAAQ,OAAO,MAAM,WAAW,MAAM,KAAK,YAAY,CAAC,YAAY,MAAM,KAAK;AAAA,CAAK;AACpF,YAAQ,OAAO,MAAM,WAAW,MAAM,aAAa,SAAS,OAAO,MAAM,YAAY,OAAO,MAAM;AAAA,CAAW;AAE7G,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,OAAO,MAAM,oBAAoB;AACzC,iBAAW,SAAS,QAAQ;AAC1B,gBAAQ,OAAO,MAAM,OAAO,MAAM,IAAI,KAAK,MAAM,WAAW,QAAQ;AAAA,CAAI;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,KAAK,MAAM,SAAS,YAAY,IAAI,CAAC;AAC/C,CAAC;;;AC9BH,IAAAC,oBAAwB;AACxB,IAAAC,MAAoB;AAEpB,eAA0B;AAI1B,SAAS,IAAI,IAAwB,UAAkB,cAAwC;AAC7F,QAAM,SAAS,eAAe,KAAK,YAAY,MAAM;AACrD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,OAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW;AAChD,cAAQ,OAAO,KAAK,KAAK,gBAAgB,EAAE;AAAA,IAC7C,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,aAAqB;AAC5B,MAAI;AACF,UAAM,aAAa,WAAW,2BAA2B;AACzD,QAAO,eAAW,UAAU,GAAG;AAC7B,YAAM,MAAM,KAAK,MAAS,iBAAa,YAAY,OAAO,CAAC;AAC3D,UAAI,KAAK,SAAS,KAAM,QAAO,IAAI,QAAQ;AAAA,IAC7C;AAAA,EACF,QAAQ;AAAA,EAAe;AACvB,SAAO;AACT;AAEA,SAAS,aAAa,MAIX;AACT,MAAI,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAMJ,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBASI,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoB1C,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,YAAQ;AACR,eAAW,MAAM,KAAK,UAAU;AAC9B,cAAQ;AACR,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,EAAE,GAAG;AAC3C,YAAI,OAAO,QAAQ,UAAU;AAC3B,kBAAQ,GAAG,GAAG,MAAM,GAAG;AAAA;AAAA,QACzB,OAAO;AACL,kBAAQ,GAAG,GAAG,OAAO,GAAG;AAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,cAAc,IAAI,0BAAQ,MAAM,EAC1C,YAAY,kEAA6D,EACzE,OAAO,UAAU,oCAAoC,EACrD,OAAO,OAAO,SAA6B;AAC1C,QAAM,YAAY,aAAa;AAC/B,QAAM,aAAa,WAAW,mBAAmB;AAEjD,MAAO,eAAW,UAAU,KAAK,CAAC,KAAK,MAAM;AAC3C,UAAM,KAAc,yBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,UAAM,YAAY,MAAM,IAAI,IAAI,2CAA2C,GAAG;AAC9E,QAAI,UAAU,YAAY,MAAM,KAAK;AACnC,cAAQ,IAAI,UAAU;AACtB,SAAG,MAAM;AACT;AAAA,IACF;AACA,OAAG,MAAM;AAAA,EACX;AAEA,QAAM,eAAe,WAAW;AAChC,QAAM,WAA+D,CAAC;AAEtE,MAAI,KAAK,MAAM;AAEb,YAAQ,IAAI,iCAAiC;AAC7C,YAAQ,IAAI,mBAAmB,YAAY,EAAE;AAC7C,YAAQ,IAAI,kDAAkD;AAC9D,YAAQ,IAAI,2BAA2B;AAAA,EACzC,OAAO;AACL,UAAM,KAAc,yBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAEpF,YAAQ,IAAI,0CAAqC;AACjD,YAAQ,IAAI,wDAAwD;AACpE,YAAQ,IAAI,4BAA4B,YAAY;AAAA,CAAI;AAExD,UAAM,UAAU,MAAM,IAAI,IAAI,gBAAgB,OAAO,YAAY,CAAC;AAClE,UAAM,OAAO,SAAS,SAAS,EAAE,KAAK;AAEtC,UAAM,SAAS,MAAM,IAAI,IAAI,yBAAyB,KAAK;AAC3D,UAAM,eAAe,SAAS,QAAQ,EAAE,KAAK;AAG7C,YAAQ,IAAI,qEAAgE;AAC5E,YAAQ,IAAI,mFAAmF;AAE/F,QAAI,UAAU;AACd,WAAO,SAAS;AACd,YAAM,cAAc,MAAM,IAAI,IAAI,yFAAyF,MAAM;AAEjI,UAAI,gBAAgB,UAAU,gBAAgB,IAAI;AAChD,kBAAU;AACV;AAAA,MACF;AAEA,cAAQ,aAAa;AAAA,QACnB,KAAK,QAAQ;AACX,gBAAM,QAAQ,MAAM,IAAI,IAAI,gBAAgB,cAAc;AAC1D,gBAAM,MAAM,MAAM,IAAI,IAAI,qBAAqB,iBAAiB;AAChE,mBAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,UAAU,EAAE,CAAC;AACvD,kBAAQ,IAAI,yBAAyB,GAAG,IAAI,KAAK;AAAA,CAAK;AACtD;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AACf,gBAAM,WAAW,MAAM,IAAI,IAAI,sBAAsB;AACrD,gBAAM,SAAS,MAAM,IAAI,IAAI,oBAAoB;AACjD,cAAI,YAAY,QAAQ;AACtB,qBAAS,KAAK,EAAE,MAAM,YAAY,UAAU,OAAO,CAAC;AACpD,oBAAQ,IAAI,4BAA4B;AAAA,UAC1C,OAAO;AACL,oBAAQ,IAAI,mDAA8C;AAAA,UAC5D;AACA;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AACf,gBAAM,gBAAgB,MAAM,IAAI,IAAI,qCAAqC;AACzE,gBAAM,cAAc,MAAM,IAAI,IAAI,mCAAmC;AACrE,gBAAM,kBAAkB,MAAM,IAAI,IAAI,gEAAgE;AACtG,cAAI,iBAAiB,eAAe,iBAAiB;AACnD,qBAAS,KAAK,EAAE,MAAM,YAAY,eAAe,aAAa,gBAAgB,CAAC;AAC/E,oBAAQ,IAAI,4BAA4B;AAAA,UAC1C,OAAO;AACL,oBAAQ,IAAI,8CAAyC;AAAA,UACvD;AACA;AAAA,QACF;AAAA,QACA,KAAK,SAAS;AACZ,gBAAM,aAAa,MAAM,IAAI,IAAI,8BAA8B;AAC/D,cAAI,YAAY;AACd,kBAAM,UAAU,MAAM,IAAI,IAAI,mDAAmD;AACjF,kBAAM,KAA6D,EAAE,MAAM,SAAS,WAAW;AAC/F,gBAAI,QAAS,IAAG,UAAU;AAC1B,qBAAS,KAAK,EAAE;AAChB,oBAAQ,IAAI,yBAAyB;AAAA,UACvC,OAAO;AACL,oBAAQ,IAAI,yCAAoC;AAAA,UAClD;AACA;AAAA,QACF;AAAA,QACA,KAAK,WAAW;AACd,gBAAM,aAAa,MAAM,IAAI,IAAI,uBAAuB;AACxD,cAAI,YAAY;AACd,kBAAM,WAAW,MAAM,IAAI,IAAI,iCAAiC,OAAO;AACvE,kBAAM,KAA8D,EAAE,MAAM,WAAW,WAAW;AAClG,gBAAI,YAAY,aAAa,QAAS,IAAG,WAAW;AACpD,qBAAS,KAAK,EAAE;AAChB,oBAAQ,IAAI,2BAA2B;AAAA,UACzC,OAAO;AACL,oBAAQ,IAAI,yCAAoC;AAAA,UAClD;AACA;AAAA,QACF;AAAA,QACA,KAAK,SAAS;AACZ,gBAAM,OAAO,MAAM,IAAI,IAAI,mCAAmC;AAC9D,gBAAMC,WAAU,MAAM,IAAI,IAAI,eAAe,KAAK;AAClD,gBAAM,WAAW,MAAM,IAAI,IAAI,iBAAiB;AAChD,gBAAM,WAAW,MAAM,IAAI,IAAI,iBAAiB;AAChD,gBAAM,OAAO,MAAM,IAAI,IAAI,gBAAgB;AAC3C,gBAAM,KAAK,MAAM,IAAI,IAAI,cAAc;AACvC,cAAI,QAAQ,YAAY,YAAY,QAAQ,IAAI;AAC9C,qBAAS,KAAK;AAAA,cACZ,MAAM;AAAA,cAAS;AAAA,cAAM,MAAM,SAASA,UAAS,EAAE,KAAK;AAAA,cACpD,QAAQ;AAAA,cAAG;AAAA,cAAU;AAAA,cAAU;AAAA,cAAM;AAAA,YACvC,CAAC;AACD,oBAAQ,IAAI,yBAAyB;AAAA,UACvC,OAAO;AACL,oBAAQ,IAAI,wCAAmC;AAAA,UACjD;AACA;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AACf,gBAAM,WAAW,MAAM,IAAI,IAAI,sCAAsC;AACrE,gBAAM,UAAU,MAAM,IAAI,IAAI,qBAAqB;AACnD,cAAI,YAAY,SAAS;AACvB,kBAAM,SAAS,MAAM,IAAI,IAAI,0BAA0B;AACvD,kBAAM,KAA2E,EAAE,MAAM,YAAY,UAAU,QAAQ;AACvH,gBAAI,OAAQ,IAAG,SAAS;AACxB,qBAAS,KAAK,EAAE;AAChB,oBAAQ,IAAI,4BAA4B;AAAA,UAC1C,OAAO;AACL,oBAAQ,IAAI,oDAA+C;AAAA,UAC7D;AACA;AAAA,QACF;AAAA,QACA,KAAK,WAAW;AACd,gBAAM,MAAM,MAAM,IAAI,IAAI,eAAe;AACzC,cAAI,KAAK;AACP,kBAAM,SAAS,MAAM,IAAI,IAAI,6BAA6B;AAC1D,kBAAM,KAAqD,EAAE,MAAM,WAAW,IAAI;AAClF,gBAAI,OAAQ,IAAG,SAAS;AACxB,qBAAS,KAAK,EAAE;AAChB,oBAAQ,IAAI,4BAA4B,GAAG;AAAA,CAAK;AAAA,UAClD,OAAO;AACL,oBAAQ,IAAI,iCAA4B;AAAA,UAC1C;AACA;AAAA,QACF;AAAA,QACA;AACE,kBAAQ,IAAI,2BAA2B,WAAW;AAAA,CAAI;AAAA,MAC1D;AAAA,IACF;AAEA,OAAG,MAAM;AAGT,UAAMC,QAAO,aAAa,EAAE,MAAM,mBAAmB,cAAc,SAAS,CAAC;AAC7E,oBAAgB;AAChB,IAAG,kBAAc,YAAYA,OAAM,EAAE,MAAM,IAAM,CAAC;AAElD,YAAQ,IAAI;AAAA,sBAAyB,UAAU,EAAE;AAGjD,YAAQ,IAAI,+BAA+B;AAC3C,UAAMC,UAAS,WAAW,UAAU;AACpC,UAAMC,WAAU,IAAI,cAAcD,OAAM;AACxC,UAAME,SAAQ,MAAMD,SAAQ,aAAa;AAEzC,UAAME,UAASD,OAAM,aAAa,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAC3D,UAAM,SAASA,OAAM,aAAa,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO;AAE1D,YAAQ,IAAI,aAAaA,OAAM,KAAK,YAAY,CAAC,KAAKC,OAAM,IAAID,OAAM,aAAa,MAAM,iBAAiB;AAC1G,QAAI,OAAO,SAAS,GAAG;AACrB,iBAAW,SAAS,QAAQ;AAC1B,gBAAQ,IAAI,SAAS,MAAM,IAAI,KAAK,MAAM,WAAW,QAAQ,EAAE;AAAA,MACjE;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,cAAQ,IAAI,sEAAsE;AAClF,cAAQ,IAAI,KAAK,UAAU,EAAE;AAAA,IAC/B;AAEA,YAAQ,IAAI,4DAA4D;AACxE;AAAA,EACF;AAGA,QAAM,OAAO,aAAa,EAAE,MAAM,cAAc,mBAAmB,KAAK,SAAS,CAAC;AAClF,kBAAgB;AAChB,EAAG,kBAAc,YAAY,MAAM,EAAE,MAAM,IAAM,CAAC;AAClD,UAAQ,IAAI,qBAAqB,UAAU,EAAE;AAE7C,QAAM,SAAS,WAAW,UAAU;AACpC,QAAM,UAAU,IAAI,cAAc,MAAM;AACxC,QAAM,QAAQ,MAAM,QAAQ,aAAa;AACzC,QAAM,SAAS,MAAM,aAAa,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAC3D,UAAQ,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC,KAAK,MAAM,IAAI,MAAM,aAAa,MAAM,iBAAiB;AACxG,UAAQ,IAAI,mBAAmB;AACjC,CAAC;;;AClSH,IAAAE,oBAAwB;;;ACQjB,IAAM,kBAAN,MAAsB;AAAA,EACV,YAA6B,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EAEjB,YAAY,gBAAwB,GAAG,iBAA2B,CAAC,KAAM,MAAO,IAAK,GAAG;AACtF,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,YAAY,UAA+B;AACzC,SAAK,UAAU,KAAK,QAAQ;AAAA,EAC9B;AAAA,EAEA,eAAgC;AAC9B,WAAO,CAAC,GAAG,KAAK,SAAS;AAAA,EAC3B;AAAA,EAEA,eAAwB;AACtB,WAAO,KAAK,UAAU,SAAS;AAAA,EACjC;AAAA,EAEA,MAAM,SAAS,OAA8C;AAC3D,QAAI,KAAK,UAAU,WAAW,GAAG;AAC/B,aAAO,EAAE,MAAM,OAAO,SAAS,CAAC,GAAG,WAAW,KAAK;AAAA,IACrD;AAEA,UAAM,WAAW,mBAAmB,KAAK;AACzC,UAAM,UAAyB,CAAC;AAEhC,eAAW,YAAY,KAAK,WAAW;AACrC,YAAM,SAAS,MAAM,KAAK,cAAc,UAAU,QAAQ;AAC1D,cAAQ,KAAK,MAAM;AAAA,IACrB;AAEA,UAAM,aAAa,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO;AAChD,WAAO,EAAE,MAAM,YAAY,SAAS,WAAW,CAAC,WAAW;AAAA,EAC7D;AAAA,EAEA,MAAM,UAAyC;AAC7C,UAAM,UAAU,oBAAI,IAAqB;AACzC,eAAW,YAAY,KAAK,WAAW;AACrC,UAAI;AACF,cAAM,KAAK,MAAM,SAAS,KAAK;AAC/B,gBAAQ,IAAI,SAAS,MAAM,EAAE;AAAA,MAC/B,QAAQ;AACN,gBAAQ,IAAI,SAAS,MAAM,KAAK;AAAA,MAClC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,UAAyB,OAA2C;AAC9F,QAAI,aAA0B;AAAA,MAC5B,UAAU,SAAS;AAAA,MACnB,SAAS;AAAA,MACT,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAEA,aAAS,UAAU,GAAG,WAAW,KAAK,eAAe,WAAW;AAC9D,UAAI;AACF,qBAAa,MAAM,SAAS,KAAK,KAAK;AACtC,YAAI,WAAW,QAAS,QAAO;AAAA,MACjC,SAAS,KAAK;AACZ,qBAAa;AAAA,UACX,UAAU,SAAS;AAAA,UACnB,SAAS;AAAA,UACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,UACtD,YAAY;AAAA,QACd;AAAA,MACF;AAEA,UAAI,UAAU,KAAK,eAAe;AAChC,cAAM,QAAQ,KAAK,eAAe,OAAO,KAAK,KAAK,eAAe,KAAK,eAAe,SAAS,CAAC,KAAK;AACrG,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,OAAmC;AACpE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,YAAY,MAAM,IAAI;AAAA,IAC5B,OAAO,YAAY,MAAM,KAAK;AAAA,EAChC;AACF;AAEA,SAAS,YAAY,OAAuB;AAC1C,SAAO,MAAM;AAAA,IACX;AAAA,IACA;AAAA,EACF;AACF;;;AChGO,IAAM,eAAN,MAA4C;AAAA,EACxC,OAAO;AAAA,EACC;AAAA,EAEjB,YAAY,QAAoB;AAC9B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,OAA2C;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,KAAK,OAAO,KAAK;AAEnD,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,SAAS,MAAM;AAAA,UACf,YAAY,OAAO,KAAK,OAAO,QAAQ;AAAA,UACvC,QAAQ,mBAAmB,MAAM,QAAQ;AAAA,QAC3C;AAAA,QACA,MAAM,MAAM;AAAA,MACd,CAAC;AAED,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS,SAAS;AAAA,QAClB,OAAO,SAAS,KAAK,SAAY,QAAQ,SAAS,MAAM;AAAA,QACxD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC7B,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,UAA0B;AACpD,UAAQ,UAAU;AAAA,IAChB,KAAK;AAAY,aAAO;AAAA,IACxB,KAAK;AAAW,aAAO;AAAA,IACvB;AAAS,aAAO;AAAA,EAClB;AACF;;;AC7DO,IAAM,mBAAN,MAAgD;AAAA,EAC5C,OAAO;AAAA,EACC;AAAA,EAEjB,YAAY,QAAwB;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,OAA2C;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,MAAM,+BAA+B,KAAK,OAAO,QAAQ;AAC/D,UAAM,OAAO,MAAM,aAAa,aAAa,cAAc,MAAM,aAAa,YAAY,iBAAqB;AAC/G,UAAM,OAAO,GAAG,IAAI,KAAK,eAAe,MAAM,KAAK,CAAC;AAAA;AAAA,EAAQ,eAAe,MAAM,IAAI,CAAC;AAEtF,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU;AAAA,UACnB,SAAS,KAAK,OAAO;AAAA,UACrB;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAAA,MACH,CAAC;AAED,YAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,OAAO,KAAK,KAAK,SAAY,KAAK;AAAA,QAClC,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC7B,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAAsB;AAC5C,SAAO,KAAK,QAAQ,+BAA+B,MAAM;AAC3D;;;ACvDO,IAAM,mBAAN,MAAgD;AAAA,EAC5C,OAAO;AAAA,EACC;AAAA,EAEjB,YAAY,QAAwB;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,OAA2C;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,MAAM,oCAAoC,KAAK,OAAO,aAAa;AACzE,UAAM,OAAO,MAAM,aAAa,aAAa,cAAc,MAAM,aAAa,YAAY,iBAAqB;AAC/G,UAAM,OAAO,GAAG,IAAI,KAAK,MAAM,KAAK;AAAA;AAAA,EAAQ,MAAM,IAAI;AAEtD,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,iBAAiB,UAAU,KAAK,OAAO,WAAW;AAAA,UAClD,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,mBAAmB;AAAA,UACnB,IAAI,KAAK,OAAO;AAAA,UAChB,MAAM;AAAA,UACN,MAAM,EAAE,MAAM,KAAK;AAAA,QACrB,CAAC;AAAA,MACH,CAAC;AAED,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,UAAU,SAAS,MAAM,CAAC,CAAC,KAAK,UAAU;AAEhD,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf;AAAA,QACA,OAAO,UAAU,SAAa,KAAK,OAAO,WAAW,QAAQ,SAAS,MAAM;AAAA,QAC5E,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC7B,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACzEA,aAAwB;AAQjB,IAAM,kBAAN,MAA+C;AAAA,EAC3C,OAAO;AAAA,EACC;AAAA,EAEjB,YAAY,QAAuB;AACjC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,OAA2C;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,OAAO,KAAK,UAAU,KAAK;AACjC,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAE7E,QAAI,KAAK,OAAO,QAAQ;AACtB,YAAM,YACH,kBAAW,UAAU,KAAK,OAAO,MAAM,EACvC,OAAO,IAAI,EACX,OAAO,KAAK;AACf,cAAQ,mBAAmB,IAAI,UAAU,SAAS;AAAA,IACpD;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK,OAAO,KAAK;AAAA,QAC5C,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS,SAAS;AAAA,QAClB,OAAO,SAAS,KAAK,SAAY,QAAQ,SAAS,MAAM;AAAA,QACxD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC7B,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC1DO,IAAM,gBAAN,MAA6C;AAAA,EACzC,OAAO;AAAA,EACC;AAAA,EAEjB,YAAY,QAAqB;AAC/B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,OAA2C;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,OAAO,MAAM,aAAa,aAAa,qBAAqB,MAAM,aAAa,YAAY,cAAc;AAE/G,UAAM,UAAmC;AAAA,MACvC,MAAM,GAAG,IAAI,KAAK,MAAM,KAAK;AAAA;AAAA,EAAQ,MAAM,IAAI;AAAA,IACjD;AACA,QAAI,KAAK,OAAO,SAAS;AACvB,cAAQ,UAAU,KAAK,OAAO;AAAA,IAChC;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK,OAAO,YAAY;AAAA,QACnD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B,CAAC;AAED,YAAM,KAAK,SAAS;AACpB,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,OAAO,KAAK,SAAY,QAAQ,SAAS,MAAM;AAAA,QAC/C,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC7B,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACxDO,IAAM,kBAAN,MAA+C;AAAA,EAC3C,OAAO;AAAA,EACC;AAAA,EAEjB,YAAY,QAAuB;AACjC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,OAA2C;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,QAAQ,MAAM,aAAa,aAAa,WAAW,MAAM,aAAa,YAAY,WAAW;AAEnG,UAAM,UAAmC;AAAA,MACvC,QAAQ,CAAC;AAAA,QACP,OAAO,MAAM;AAAA,QACb,aAAa,MAAM;AAAA,QACnB;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,QAAQ,EAAE,MAAM,iBAAiB;AAAA,MACnC,CAAC;AAAA,IACH;AACA,QAAI,KAAK,OAAO,UAAU;AACxB,cAAQ,WAAW,KAAK,OAAO;AAAA,IACjC;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK,OAAO,YAAY;AAAA,QACnD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B,CAAC;AAED,YAAM,KAAK,SAAS,WAAW,OAAO,SAAS;AAC/C,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,OAAO,KAAK,SAAY,QAAQ,SAAS,MAAM;AAAA,QAC/C,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC7B,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACrEA,IAAAC,OAAqB;AACrB,UAAqB;AAad,IAAM,gBAAN,MAA6C;AAAA,EACzC,OAAO;AAAA,EACC;AAAA,EAEjB,YAAY,QAAqB;AAC/B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,OAA2C;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,OAAO,MAAM,aAAa,aAAa,eAAe,MAAM,aAAa,YAAY,cAAc;AACzG,UAAM,UAAU,GAAG,IAAI,IAAI,MAAM,KAAK;AAEtC,QAAI;AACF,YAAM,KAAK,SAAS,SAAS,MAAM,IAAI;AACvC,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC7B,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,SAAS,SAAiB,MAA6B;AAC7D,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAAU;AAChB,UAAI;AAEJ,YAAMC,WAAU,MAAM;AACpB,YAAI,KAAK,OAAO,QAAQ;AACtB,mBAAa,YAAQ;AAAA,YACnB,MAAM,KAAK,OAAO;AAAA,YAClB,MAAM,KAAK,OAAO;AAAA,YAClB,oBAAoB;AAAA,UACtB,CAAC;AAAA,QACH,OAAO;AACL,mBAAa,sBAAiB;AAAA,YAC5B,MAAM,KAAK,OAAO;AAAA,YAClB,MAAM,KAAK,OAAO;AAAA,UACpB,CAAC;AAAA,QACH;AAEA,eAAO,WAAW,OAAO;AAEzB,YAAI,SAAS;AACb,YAAI,OAAO;AAEX,cAAM,WAAW;AAAA,UACf;AAAA;AAAA,UACA;AAAA;AAAA,UACA,GAAG,OAAO,KAAK,KAAK,OAAO,QAAQ,EAAE,SAAS,QAAQ,CAAC;AAAA;AAAA,UACvD,GAAG,OAAO,KAAK,KAAK,OAAO,QAAQ,EAAE,SAAS,QAAQ,CAAC;AAAA;AAAA,UACvD,cAAc,KAAK,OAAO,IAAI;AAAA;AAAA,UAC9B,YAAY,KAAK,OAAO,EAAE;AAAA;AAAA,UAC1B;AAAA;AAAA,UACA,SAAS,KAAK,OAAO,IAAI;AAAA,MAAW,KAAK,OAAO,EAAE;AAAA,WAAgB,OAAO;AAAA;AAAA;AAAA;AAAA,EAAkF,IAAI;AAAA;AAAA;AAAA,UAC/J;AAAA;AAAA,QACF;AAEA,eAAO,GAAG,QAAQ,CAAC,SAAiB;AAClC,oBAAU,KAAK,SAAS;AACxB,gBAAM,QAAQ,OAAO,MAAM,MAAM;AACjC,mBAAS,MAAM,IAAI,KAAK;AAExB,qBAAW,QAAQ,OAAO;AACxB,gBAAI,CAAC,KAAM;AACX,kBAAM,OAAO,SAAS,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE;AAE9C,gBAAI,KAAK,OAAO,CAAC,MAAM,IAAK;AAE5B,gBAAI,QAAQ,KAAK;AACf,qBAAO,QAAQ;AACf,qBAAO,IAAI,MAAM,eAAe,IAAI,EAAE,CAAC;AACvC;AAAA,YACF;AAEA,gBAAI,OAAO,SAAS,QAAQ;AAC1B,qBAAO,MAAM,SAAS,IAAI,CAAE;AAC5B;AAAA,YACF;AAEA,gBAAI,QAAQ,SAAS,UAAU,SAAS,KAAK;AAC3C,qBAAO,IAAI;AACX,sBAAQ;AACR;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAED,eAAO,GAAG,WAAW,MAAM;AACzB,iBAAO,QAAQ;AACf,iBAAO,IAAI,MAAM,2BAA2B,CAAC;AAAA,QAC/C,CAAC;AAED,eAAO,GAAG,SAAS,CAAC,QAAe;AACjC,iBAAO,IAAI,MAAM,eAAe,IAAI,OAAO,EAAE,CAAC;AAAA,QAChD,CAAC;AAAA,MACH;AAEA,UAAI,CAAC,KAAK,OAAO,UAAU,KAAK,OAAO,SAAS,KAAK;AACnD,cAAM,QAAY,sBAAiB;AAAA,UACjC,MAAM,KAAK,OAAO;AAAA,UAClB,MAAM,KAAK,OAAO;AAAA,QACpB,CAAC;AACD,cAAM,WAAW,OAAO;AAExB,YAAI,MAAM;AACV,YAAI,eAAe;AACnB,YAAI,WAAW;AAEf,cAAM,GAAG,QAAQ,CAAC,SAAiB;AACjC,iBAAO,KAAK,SAAS;AACrB,gBAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,gBAAM,MAAM,IAAI,KAAK;AAErB,qBAAW,QAAQ,OAAO;AACxB,gBAAI,CAAC,KAAM;AACX,kBAAM,OAAO,SAAS,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE;AAC9C,gBAAI,KAAK,OAAO,CAAC,MAAM,IAAK;AAE5B,gBAAI,QAAQ,KAAK;AACf,oBAAM,QAAQ;AACd,qBAAO,IAAI,MAAM,eAAe,IAAI,EAAE,CAAC;AACvC;AAAA,YACF;AAEA,gBAAI,CAAC,UAAU;AACb,oBAAM,MAAM,gBAAgB;AAC5B,yBAAW;AAAA,YACb,WAAW,CAAC,cAAc;AACxB,oBAAM,MAAM,cAAc;AAC1B,6BAAe;AAAA,YACjB,WAAW,SAAS,OAAO,cAAc;AACvC,uBAAa,YAAQ;AAAA,gBACnB,QAAQ;AAAA,gBACR,MAAM,KAAK,OAAO;AAAA,gBAClB,oBAAoB;AAAA,cACtB,GAAG,MAAM;AACP,oBAAI,QAAQ;AACZ,oBAAI,UAAU;AACd,sBAAM,OAAO;AAAA,kBACX;AAAA;AAAA,kBACA;AAAA;AAAA,kBACA,GAAG,OAAO,KAAK,KAAK,OAAO,QAAQ,EAAE,SAAS,QAAQ,CAAC;AAAA;AAAA,kBACvD,GAAG,OAAO,KAAK,KAAK,OAAO,QAAQ,EAAE,SAAS,QAAQ,CAAC;AAAA;AAAA,kBACvD,cAAc,KAAK,OAAO,IAAI;AAAA;AAAA,kBAC9B,YAAY,KAAK,OAAO,EAAE;AAAA;AAAA,kBAC1B;AAAA;AAAA,kBACA,SAAS,KAAK,OAAO,IAAI;AAAA,MAAW,KAAK,OAAO,EAAE;AAAA,WAAgB,OAAO;AAAA;AAAA;AAAA;AAAA,EAAkF,IAAI;AAAA;AAAA;AAAA,kBAC/J;AAAA;AAAA,gBACF;AAEA,uBAAO,MAAM,KAAK,CAAC,CAAE;AACrB,wBAAQ;AAER,uBAAO,GAAG,QAAQ,CAAC,MAAc;AAC/B,6BAAW,EAAE,SAAS;AACtB,wBAAM,KAAK,QAAQ,MAAM,MAAM;AAC/B,4BAAU,GAAG,IAAI,KAAK;AAEtB,6BAAW,KAAK,IAAI;AAClB,wBAAI,CAAC,EAAG;AACR,0BAAM,IAAI,SAAS,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE;AACxC,wBAAI,EAAE,OAAO,CAAC,MAAM,IAAK;AAEzB,wBAAI,KAAK,KAAK;AACZ,6BAAO,QAAQ;AACf,6BAAO,IAAI,MAAM,eAAe,CAAC,EAAE,CAAC;AACpC;AAAA,oBACF;AAEA,wBAAI,QAAQ,KAAK,QAAQ;AACvB,6BAAO,MAAM,KAAK,KAAK,CAAE;AACzB;AAAA,oBACF;AAEA,wBAAI,SAAS,KAAK,UAAU,MAAM,KAAK;AACrC,6BAAO,IAAI;AACX,8BAAQ;AACR;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF,CAAC;AAAA,cACH,CAAC;AACD;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAED,cAAM,GAAG,WAAW,MAAM;AAAE,gBAAM,QAAQ;AAAG,iBAAO,IAAI,MAAM,2BAA2B,CAAC;AAAA,QAAG,CAAC;AAC9F,cAAM,GAAG,SAAS,CAAC,QAAe;AAAE,iBAAO,IAAI,MAAM,eAAe,IAAI,OAAO,EAAE,CAAC;AAAA,QAAG,CAAC;AAAA,MACxF,OAAO;AACL,QAAAA,SAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC/NO,IAAM,mBAAN,MAAgD;AAAA,EAC5C,OAAO;AAAA,EACC;AAAA,EAEjB,YAAY,QAAwB;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,OAA2C;AACpD,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,WAAW,MAAM,aAAa,aAAa,IAAI,MAAM,aAAa,YAAY,IAAI;AAExF,UAAM,SAAiC;AAAA,MACrC,OAAO,KAAK,OAAO;AAAA,MACnB,MAAM,KAAK,OAAO;AAAA,MAClB,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,MACf,UAAU,OAAO,QAAQ;AAAA,MACzB,WAAW,OAAO,KAAK,MAAM,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ,IAAI,GAAI,CAAC;AAAA,IAC1E;AACA,QAAI,KAAK,OAAO,QAAQ;AACtB,aAAO,SAAS,KAAK,OAAO;AAAA,IAC9B;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,4CAA4C;AAAA,QACvE,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,QAC/D,MAAM,IAAI,gBAAgB,MAAM,EAAE,SAAS;AAAA,MAC7C,CAAC;AAED,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,KAAK,KAAK,WAAW;AAE3B,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,OAAO,KAAK,SAAa,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,SAAS,MAAM;AAAA,QAC3E,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,SAAS;AAAA,QACT,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACtD,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAyB;AAC7B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK;AAAA,QAC7B,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,QACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACD,aAAO,OAAO;AAAA,IAChB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AT1DO,IAAM,mBAAmB,IAAI,0BAAQ,YAAY,EACrD,YAAY,8CAA8C,EAC1D,OAAO,uBAAuB,oBAAoB,mBAAmB,EACrE,OAAO,OAAO,SAA6B;AAC1C,QAAM,SAAS,WAAW,KAAK,MAAM;AAErC,MAAI,OAAO,OAAO,SAAS,WAAW,GAAG;AACvC,YAAQ,IAAI,4DAA4D;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,IAAI,gBAAgB,GAAG,CAAC,GAAI,CAAC;AAEhD,aAAW,MAAM,OAAO,OAAO,UAAU;AACvC,YAAQ,GAAG,MAAM;AAAA,MACf,KAAK;AACH,mBAAW,YAAY,IAAI,aAAa,EAAE,CAAC;AAC3C;AAAA,MACF,KAAK;AACH,mBAAW,YAAY,IAAI,iBAAiB,EAAE,CAAC;AAC/C;AAAA,MACF,KAAK;AACH,mBAAW,YAAY,IAAI,iBAAiB,EAAE,CAAC;AAC/C;AAAA,MACF,KAAK;AACH,mBAAW,YAAY,IAAI,gBAAgB,EAAE,CAAC;AAC9C;AAAA,MACF,KAAK;AACH,mBAAW,YAAY,IAAI,cAAc,EAAE,CAAC;AAC5C;AAAA,MACF,KAAK;AACH,mBAAW,YAAY,IAAI,gBAAgB,EAAE,CAAC;AAC9C;AAAA,MACF,KAAK;AACH,mBAAW,YAAY,IAAI,cAAc,EAAE,CAAC;AAC5C;AAAA,MACF,KAAK;AACH,mBAAW,YAAY,IAAI,iBAAiB,EAAE,CAAC;AAC/C;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,QAAsB;AAAA,IAC1B,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,UAAQ,IAAI,yBAAyB,WAAW,aAAa,EAAE,MAAM;AAAA,CAAkB;AAEvF,QAAM,SAAS,MAAM,WAAW,SAAS,KAAK;AAE9C,aAAW,KAAK,OAAO,SAAS;AAC9B,QAAI,EAAE,SAAS;AACb,cAAQ,IAAI,OAAO,EAAE,QAAQ,WAAW,EAAE,UAAU,KAAK;AAAA,IAC3D,OAAO;AACL,cAAQ,IAAI,OAAO,EAAE,QAAQ,mBAAc,EAAE,KAAK,EAAE;AAAA,IACtD;AAAA,EACF;AAEA,UAAQ,IAAI,OAAO,OAAO,oCAAoC,wBAAwB;AACtF,UAAQ,KAAK,OAAO,OAAO,IAAI,CAAC;AAClC,CAAC;;;ApBtEH,IAAM,UAAU,IAAI,0BAAQ;AAE5B,QACG,KAAK,OAAO,EACZ,YAAY,qEAAgE,EAC5E,QAAQ,OAAO;AAElB,QAAQ,WAAW,WAAW;AAC9B,QAAQ,WAAW,aAAa;AAChC,QAAQ,WAAW,YAAY;AAC/B,QAAQ,WAAW,gBAAgB;AAEnC,QAAQ,MAAM,QAAQ,IAAI;","names":["import_commander","TOML","fs","fs","path","fs","import_node_child_process","fs","fs","import_node_child_process","import_node_util","path","execFileAsync","fs","WebSocket","import_commander","import_commander","fs","portStr","toml","config","monitor","score","passed","import_commander","net","connect"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/status.ts","../../src/config/loader.ts","../../src/config/schema.ts","../../src/health/monitor.ts","../../src/types/index.ts","../../src/health/scoring.ts","../../src/health/probes/resolve-pid.ts","../../src/health/probes/process.ts","../../src/health/probes/port.ts","../../src/health/probes/http.ts","../../src/health/probes/config.ts","../../src/health/probes/tun.ts","../../src/health/probes/memory.ts","../../src/health/probes/cpu.ts","../../src/health/probes/disk.ts","../../src/health/probes/log-tail.ts","../../src/health/probes/websocket.ts","../../src/cli/commands/check.ts","../../src/cli/commands/init.ts","../../src/cli/commands/test-alert.ts","../../src/alerts/dispatcher.ts","../../src/alerts/providers/ntfy.ts","../../src/alerts/providers/telegram.ts","../../src/alerts/providers/whatsapp.ts","../../src/alerts/providers/webhook.ts","../../src/alerts/providers/slack.ts","../../src/alerts/providers/discord.ts","../../src/alerts/providers/email.ts","../../src/alerts/providers/pushover.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { Command } from \"commander\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { checkCommand } from \"./commands/check.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { testAlertCommand } from \"./commands/test-alert.js\";\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(join(__dirname, \"..\", \"..\", \"package.json\"), \"utf-8\")) as { version: string };\n return pkg.version;\n } catch {\n return \"unknown\";\n }\n}\n\nconst program = new Command();\n\nprogram\n .name(\"aegis\")\n .description(\"OpenClaw Aegis — self-healing sidecar for the OpenClaw gateway\")\n .version(getVersion());\n\nprogram.addCommand(initCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(checkCommand);\nprogram.addCommand(testAlertCommand);\n\nprogram.parse(process.argv);\n","import { Command } from \"commander\";\nimport { loadConfig, DEFAULT_CONFIG_PATH } from \"../../config/loader.js\";\nimport { HealthMonitor } from \"../../health/monitor.js\";\n\nexport const statusCommand = new Command(\"status\")\n .description(\"Show current health status and recovery stats\")\n .option(\"-c, --config <path>\", \"Config file path\", DEFAULT_CONFIG_PATH)\n .action(async (opts: { config: string }) => {\n const config = loadConfig(opts.config);\n const monitor = new HealthMonitor(config);\n\n const score = await monitor.runAllProbes();\n\n const bandColors: Record<string, string> = {\n healthy: \"\\x1b[32m\",\n degraded: \"\\x1b[33m\",\n critical: \"\\x1b[31m\",\n };\n const reset = \"\\x1b[0m\";\n const color = bandColors[score.band] ?? \"\";\n\n process.stdout.write(`\\nHealth: ${color}${score.band.toUpperCase()}${reset} (score: ${score.total})\\n\\n`);\n\n for (const probe of score.probeResults) {\n const icon = probe.healthy ? \"\\x1b[32m+\\x1b[0m\" : \"\\x1b[31m-\\x1b[0m\";\n const msg = probe.message ? ` — ${probe.message}` : \"\";\n process.stdout.write(` ${icon} ${probe.name} (${probe.latencyMs}ms)${msg}\\n`);\n }\n\n if (config.alerts.channels.length === 0) {\n process.stdout.write(\n `\\n\\x1b[33mWARNING: No alert channels configured. Aegis cannot notify you during incidents. Run 'aegis init' to add alerts.\\x1b[0m\\n`,\n );\n }\n\n process.stdout.write(\"\\n\");\n });\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport TOML from \"@iarna/toml\";\nimport { aegisConfigSchema, type AegisConfig } from \"./schema.js\";\n\nexport function expandHome(filepath: string): string {\n if (filepath.startsWith(\"~/\")) {\n return path.join(os.homedir(), filepath.slice(2));\n }\n return filepath;\n}\n\nexport function resolveConfigPaths(config: AegisConfig): AegisConfig {\n return {\n ...config,\n gateway: {\n ...config.gateway,\n configPath: expandHome(config.gateway.configPath),\n pidFile: expandHome(config.gateway.pidFile),\n logPath: expandHome(config.gateway.logPath),\n },\n backup: {\n ...config.backup,\n basePath: expandHome(config.backup.basePath),\n },\n };\n}\n\nexport function loadConfig(configPath: string): AegisConfig {\n const resolvedPath = expandHome(configPath);\n\n if (!fs.existsSync(resolvedPath)) {\n const defaults = aegisConfigSchema.parse({});\n return resolveConfigPaths(defaults);\n }\n\n const raw = fs.readFileSync(resolvedPath, \"utf-8\");\n const parsed: unknown = TOML.parse(raw);\n const validated = aegisConfigSchema.parse(parsed);\n return resolveConfigPaths(validated);\n}\n\nexport const DEFAULT_CONFIG_PATH = \"~/.openclaw/aegis/config.toml\";\n\nexport function getConfigDir(): string {\n return expandHome(\"~/.openclaw/aegis\");\n}\n\nexport function ensureConfigDir(): void {\n const dir = getConfigDir();\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n}\n","import { z } from \"zod\";\n\nconst alertChannelSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"ntfy\"),\n url: z.string().url().default(\"https://ntfy.sh\"),\n topic: z.string().min(1),\n priority: z.number().int().min(1).max(5).default(4),\n }),\n z.object({\n type: z.literal(\"webhook\"),\n url: z.string().url(),\n secret: z.string().min(1).optional(),\n }),\n z.object({\n type: z.literal(\"telegram\"),\n botToken: z.string().min(1),\n chatId: z.string().min(1),\n }),\n z.object({\n type: z.literal(\"whatsapp\"),\n phoneNumberId: z.string().min(1),\n accessToken: z.string().min(1),\n recipientNumber: z.string().min(1),\n }),\n z.object({\n type: z.literal(\"slack\"),\n webhookUrl: z.string().url(),\n channel: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"discord\"),\n webhookUrl: z.string().url(),\n username: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"email\"),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535).default(587),\n secure: z.boolean().default(false),\n username: z.string().min(1),\n password: z.string().min(1),\n from: z.string().min(1),\n to: z.string().min(1),\n }),\n z.object({\n type: z.literal(\"pushover\"),\n apiToken: z.string().min(1),\n userKey: z.string().min(1),\n device: z.string().optional(),\n }),\n]);\n\nexport type AlertChannelConfig = z.infer<typeof alertChannelSchema>;\n\nexport const aegisConfigSchema = z.object({\n gateway: z\n .object({\n configPath: z.string().default(\"~/.openclaw/openclaw.json\"),\n pidFile: z.string().default(\"openclaw-gateway.service\"),\n port: z.number().int().min(1).max(65535).default(18789),\n logPath: z.string().default(\"~/.openclaw/logs/gateway.log\"),\n healthEndpoint: z.string().default(\"/health\"),\n })\n .default({}),\n\n monitoring: z\n .object({\n intervalMs: z.number().int().min(1000).default(10000),\n probeTimeoutMs: z.number().int().min(500).default(5000),\n configPollIntervalMs: z.number().int().min(500).default(2000),\n degradedConfirmationCount: z.number().int().min(1).default(2),\n })\n .default({}),\n\n health: z\n .object({\n healthyMin: z.number().int().min(0).default(7),\n degradedMin: z.number().int().min(0).default(4),\n memoryThresholdMb: z.number().int().min(0).default(512),\n cpuThresholdPercent: z.number().int().min(0).max(100).default(90),\n diskThresholdMb: z.number().int().min(0).default(100),\n })\n .default({}),\n\n recovery: z\n .object({\n l1MaxAttempts: z.number().int().min(1).default(3),\n l1BackoffBaseMs: z.number().int().min(1000).default(5000),\n l1BackoffMultiplier: z.number().min(1).default(3),\n l2MaxAttempts: z.number().int().min(1).default(2),\n l2CooldownMs: z.number().int().min(1000).default(60000),\n circuitBreakerMaxCycles: z.number().int().min(1).default(3),\n circuitBreakerWindowMs: z.number().int().min(60000).default(3600000),\n antiFlap: z\n .object({\n maxRestarts: z.number().int().min(1).default(5),\n windowMs: z.number().int().min(60000).default(900000),\n cooldownMs: z.number().int().min(60000).default(600000),\n decayMs: z.number().int().min(60000).default(21600000),\n })\n .default({}),\n })\n .default({}),\n\n backup: z\n .object({\n maxChronological: z.number().int().min(1).default(20),\n maxKnownGood: z.number().int().min(1).default(3),\n knownGoodStabilityMs: z.number().int().min(10000).default(60000),\n basePath: z.string().default(\"~/.openclaw/aegis/backups\"),\n })\n .default({}),\n\n deadManSwitch: z\n .object({\n countdownMs: z.number().int().min(5000).default(30000),\n enabled: z.boolean().default(true),\n })\n .default({}),\n\n alerts: z\n .object({\n channels: z.array(alertChannelSchema).default([]),\n retryAttempts: z.number().int().min(0).default(3),\n retryBackoffMs: z.array(z.number().int()).default([5000, 15000, 45000]),\n })\n .default({}),\n\n platform: z\n .object({\n type: z.enum([\"systemd\", \"launchd\"]).default(\"systemd\"),\n watchdogSec: z.number().int().min(10).default(30),\n })\n .default({}),\n});\n\nexport type AegisConfig = z.infer<typeof aegisConfigSchema>;\n","import { EventEmitter } from \"node:events\";\nimport type { HealthProbeResult, HealthScore, ProbeTarget } from \"../types/index.js\";\nimport type { AegisConfig } from \"../config/schema.js\";\nimport { computeHealthScore, DegradedConfirmation } from \"./scoring.js\";\nimport { processProbe } from \"./probes/process.js\";\nimport { portProbe } from \"./probes/port.js\";\nimport { httpHealthProbe } from \"./probes/http.js\";\nimport { configProbe } from \"./probes/config.js\";\nimport { tunProbe } from \"./probes/tun.js\";\nimport { memoryProbe } from \"./probes/memory.js\";\nimport { cpuProbe } from \"./probes/cpu.js\";\nimport { diskProbe } from \"./probes/disk.js\";\nimport { logTailProbe } from \"./probes/log-tail.js\";\nimport { websocketProbe } from \"./probes/websocket.js\";\n\nexport class HealthMonitor extends EventEmitter {\n private interval: NodeJS.Timeout | null = null;\n private readonly degradedConfirmation: DegradedConfirmation;\n private lastScore: HealthScore | null = null;\n\n constructor(private readonly config: AegisConfig) {\n super();\n this.degradedConfirmation = new DegradedConfirmation(\n config.monitoring.degradedConfirmationCount,\n );\n }\n\n async runAllProbes(): Promise<HealthScore> {\n const target: ProbeTarget = { type: \"local\" };\n const timeout = this.config.monitoring.probeTimeoutMs;\n\n const withTimeout = async (\n fn: () => Promise<HealthProbeResult>,\n name: string,\n ): Promise<HealthProbeResult> => {\n try {\n return await Promise.race([\n fn(),\n new Promise<HealthProbeResult>((resolve) =>\n setTimeout(\n () =>\n resolve({\n name,\n healthy: false,\n score: 0,\n message: `Probe timed out after ${timeout}ms`,\n latencyMs: timeout,\n }),\n timeout,\n ),\n ),\n ]);\n } catch (err) {\n return {\n name,\n healthy: false,\n score: 0,\n message: `Probe error: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: 0,\n };\n }\n };\n\n const results = await Promise.allSettled([\n withTimeout(() => processProbe(target, this.config.gateway.pidFile), \"process\"),\n withTimeout(() => portProbe(target, this.config.gateway.port, timeout), \"port\"),\n withTimeout(\n () =>\n httpHealthProbe(\n target,\n this.config.gateway.port,\n this.config.gateway.healthEndpoint,\n timeout,\n ),\n \"http\",\n ),\n withTimeout(() => configProbe(target, this.config.gateway.configPath), \"config\"),\n withTimeout(() => tunProbe(target), \"tun\"),\n withTimeout(\n () => memoryProbe(target, this.config.gateway.pidFile, this.config.health.memoryThresholdMb),\n \"memory\",\n ),\n withTimeout(\n () => cpuProbe(target, this.config.gateway.pidFile, this.config.health.cpuThresholdPercent),\n \"cpu\",\n ),\n withTimeout(\n () => diskProbe(target, this.config.gateway.configPath, this.config.health.diskThresholdMb),\n \"disk\",\n ),\n withTimeout(() => logTailProbe(target, this.config.gateway.logPath), \"logTail\"),\n withTimeout(\n () => websocketProbe(target, this.config.gateway.port, timeout),\n \"websocket\",\n ),\n ]);\n\n const probeResults: HealthProbeResult[] = results.map((r, i) => {\n if (r.status === \"fulfilled\") return r.value;\n const names = [\n \"process\", \"port\", \"http\", \"config\", \"tun\",\n \"memory\", \"cpu\", \"disk\", \"logTail\", \"websocket\",\n ] as const;\n return {\n name: names[i] ?? \"unknown\",\n healthy: false,\n score: 0,\n message: `Probe rejected: ${r.reason instanceof Error ? r.reason.message : String(r.reason)}`,\n latencyMs: 0,\n };\n });\n\n const score = computeHealthScore(probeResults, {\n healthyMin: this.config.health.healthyMin,\n degradedMin: this.config.health.degradedMin,\n });\n\n this.lastScore = score;\n const shouldEscalate = this.degradedConfirmation.update(score.band);\n\n this.emit(\"check\", score);\n\n if (shouldEscalate && score.band !== \"healthy\") {\n this.emit(\"escalate\", score);\n }\n\n return score;\n }\n\n start(): void {\n this.interval = setInterval(() => {\n void this.runAllProbes();\n }, this.config.monitoring.intervalMs);\n }\n\n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n }\n\n getLastScore(): HealthScore | null {\n return this.lastScore;\n }\n}\n","export interface HealthProbeResult {\n name: string;\n healthy: boolean;\n score: number;\n message?: string;\n latencyMs: number;\n}\n\nexport type ProbeTarget = { type: \"local\" } | { type: \"remote\"; host: string; port: number };\n\nexport interface RecoveryAction {\n level: \"L1\" | \"L2\" | \"L4\";\n action: string;\n result: \"success\" | \"failure\" | \"skipped\";\n durationMs: number;\n}\n\nexport interface IncidentEvent {\n timestamp: string;\n type: string;\n data: Record<string, unknown>;\n checksum: string;\n}\n\nexport type HealthBand = \"healthy\" | \"degraded\" | \"critical\";\n\nexport interface HealthScore {\n total: number;\n band: HealthBand;\n probeResults: HealthProbeResult[];\n}\n\nexport interface BackupEntry {\n path: string;\n timestamp: string;\n checksum: string;\n}\n\nexport interface KnownGoodEntry extends BackupEntry {\n promotedAt: string;\n}\n\nexport interface AlertPayload {\n severity: \"info\" | \"warning\" | \"critical\";\n title: string;\n body: string;\n timestamp: string;\n incidentId?: string;\n recoveryActions?: RecoveryAction[];\n healthScore?: HealthScore;\n}\n\nexport interface AlertResult {\n provider: string;\n success: boolean;\n error?: string;\n durationMs: number;\n}\n\nexport interface AlertProvider {\n name: string;\n send(alert: AlertPayload): Promise<AlertResult>;\n test(): Promise<boolean>;\n}\n\nexport interface PlatformAdapter {\n name: string;\n install(config: PlatformInstallConfig): Promise<void>;\n start(): Promise<void>;\n stop(): Promise<void>;\n restart(): Promise<void>;\n status(): Promise<PlatformServiceStatus>;\n notifyWatchdog(): Promise<void>;\n}\n\nexport interface PlatformInstallConfig {\n serviceName: string;\n execPath: string;\n workingDirectory: string;\n user: string;\n watchdogSec: number;\n readWritePaths: string[];\n}\n\nexport type PlatformServiceStatus = \"running\" | \"stopped\" | \"failed\" | \"unknown\";\n\nexport interface FailurePattern {\n id: number;\n name: string;\n detect(context: DiagnosisContext): Promise<boolean>;\n fix(context: DiagnosisContext): Promise<RecoveryAction>;\n}\n\nexport interface DiagnosisContext {\n configPath: string;\n pidFile: string;\n gatewayPort: number;\n logPath: string;\n knownGoodPath?: string;\n currentConfig: Record<string, unknown> | null;\n}\n\nexport const PROBE_WEIGHTS: Record<string, number> = {\n process: 2,\n port: 2,\n http: 2,\n config: 2,\n websocket: 1,\n tun: 1,\n memory: 1,\n cpu: 1,\n disk: 1,\n logTail: 1,\n};\n\nexport const MAX_HEALTH_SCORE = Object.values(PROBE_WEIGHTS).reduce((a, b) => a + b, 0) * 2;\n\nexport const PROTECTED_CONFIG_KEYS = [\n \"allowFrom\",\n \"groupAllowFrom\",\n \"authToken\",\n \"token\",\n \"webhookUrl\",\n \"apiKey\",\n] as const;\n\nexport const CRITICAL_CONFIG_KEYS = [\n \"gateway.port\",\n \"authToken\",\n \"token\",\n \"autoAck\",\n \"autoAckMessage\",\n \"allowFrom\",\n \"groupAllowFrom\",\n] as const;\n","import type { HealthProbeResult, HealthScore, HealthBand } from \"../types/index.js\";\nimport { PROBE_WEIGHTS, MAX_HEALTH_SCORE } from \"../types/index.js\";\n\nexport interface ScoringThresholds {\n healthyMin: number;\n degradedMin: number;\n}\n\nconst DEFAULT_THRESHOLDS: ScoringThresholds = {\n healthyMin: 7,\n degradedMin: 4,\n};\n\nexport function computeHealthScore(\n results: HealthProbeResult[],\n thresholds: ScoringThresholds = DEFAULT_THRESHOLDS,\n): HealthScore {\n let rawTotal = 0;\n\n for (const result of results) {\n const weight = PROBE_WEIGHTS[result.name] ?? 1;\n rawTotal += result.score * weight;\n }\n\n const normalized = MAX_HEALTH_SCORE > 0 ? Math.round((rawTotal / MAX_HEALTH_SCORE) * 10) : 0;\n const band = classifyBand(normalized, thresholds);\n\n return { total: normalized, band, probeResults: results };\n}\n\nfunction classifyBand(score: number, thresholds: ScoringThresholds): HealthBand {\n if (score >= thresholds.healthyMin) return \"healthy\";\n if (score >= thresholds.degradedMin) return \"degraded\";\n return \"critical\";\n}\n\nexport class DegradedConfirmation {\n private consecutiveDegradedCount = 0;\n private readonly requiredCount: number;\n\n constructor(requiredCount: number = 2) {\n this.requiredCount = requiredCount;\n }\n\n update(band: HealthBand): boolean {\n if (band === \"degraded\") {\n this.consecutiveDegradedCount++;\n return this.consecutiveDegradedCount >= this.requiredCount;\n }\n\n if (band === \"critical\") {\n this.consecutiveDegradedCount = 0;\n return true;\n }\n\n this.consecutiveDegradedCount = 0;\n return false;\n }\n\n reset(): void {\n this.consecutiveDegradedCount = 0;\n }\n\n getCount(): number {\n return this.consecutiveDegradedCount;\n }\n}\n","import * as fs from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\n\n/**\n * Resolve gateway PID. Tries systemd user service first, then falls back to PID file.\n * @param pidSource - systemd unit name (e.g. \"openclaw-gateway.service\") or path to PID file\n * @returns PID number, or null if unresolvable\n */\nexport function resolvePid(pidSource: string): number | null {\n // If it looks like a systemd unit name (contains \".service\" or no path separators)\n if (pidSource.endsWith(\".service\") || !pidSource.includes(\"/\")) {\n const pid = resolveFromSystemd(pidSource);\n if (pid !== null) return pid;\n }\n\n // Fall back to PID file\n return resolveFromFile(pidSource);\n}\n\nfunction resolveFromSystemd(unit: string): number | null {\n try {\n const output = execFileSync(\n \"systemctl\",\n [\"--user\", \"show\", \"-p\", \"MainPID\", \"--value\", unit],\n { encoding: \"utf-8\", timeout: 3000, stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n ).trim();\n\n const pid = parseInt(output, 10);\n if (!isNaN(pid) && pid > 0) return pid;\n return null;\n } catch {\n return null;\n }\n}\n\nfunction resolveFromFile(pidFile: string): number | null {\n try {\n if (!fs.existsSync(pidFile)) return null;\n const pidStr = fs.readFileSync(pidFile, \"utf-8\").trim();\n const pid = parseInt(pidStr, 10);\n if (!isNaN(pid) && pid > 0) return pid;\n return null;\n } catch {\n return null;\n }\n}\n","import type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\nimport { resolvePid } from \"./resolve-pid.js\";\n\nexport async function processProbe(\n _target: ProbeTarget,\n pidSource: string,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n try {\n const pid = resolvePid(pidSource);\n\n if (pid === null) {\n return {\n name: \"process\",\n healthy: false,\n score: 0,\n message: \"Gateway process not found (checked systemd unit and PID file)\",\n latencyMs: Date.now() - start,\n };\n }\n\n try {\n process.kill(pid, 0);\n return {\n name: \"process\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n };\n } catch {\n return {\n name: \"process\",\n healthy: false,\n score: 0,\n message: `Process ${pid} not running (stale PID)`,\n latencyMs: Date.now() - start,\n };\n }\n } catch (err) {\n return {\n name: \"process\",\n healthy: false,\n score: 0,\n message: `Process probe error: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import * as net from \"node:net\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nexport async function portProbe(\n target: ProbeTarget,\n port: number,\n timeoutMs: number = 5000,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n const host = target.type === \"remote\" ? target.host : \"127.0.0.1\";\n\n return new Promise<HealthProbeResult>((resolve) => {\n const socket = new net.Socket();\n let resolved = false;\n\n const finish = (result: HealthProbeResult) => {\n if (!resolved) {\n resolved = true;\n socket.destroy();\n resolve(result);\n }\n };\n\n socket.setTimeout(timeoutMs);\n\n socket.connect(port, host, () => {\n finish({\n name: \"port\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n });\n });\n\n socket.on(\"error\", (err) => {\n finish({\n name: \"port\",\n healthy: false,\n score: 0,\n message: `Port ${port} unreachable: ${err.message}`,\n latencyMs: Date.now() - start,\n });\n });\n\n socket.on(\"timeout\", () => {\n finish({\n name: \"port\",\n healthy: false,\n score: 0,\n message: `Port ${port} connection timed out after ${timeoutMs}ms`,\n latencyMs: Date.now() - start,\n });\n });\n });\n}\n","import * as http from \"node:http\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nexport async function httpHealthProbe(\n target: ProbeTarget,\n port: number,\n endpoint: string = \"/health\",\n timeoutMs: number = 5000,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n const host = target.type === \"remote\" ? target.host : \"127.0.0.1\";\n\n return new Promise<HealthProbeResult>((resolve) => {\n const req = http.get(\n {\n hostname: host,\n port,\n path: endpoint,\n timeout: timeoutMs,\n },\n (res) => {\n const statusCode = res.statusCode ?? 0;\n res.resume();\n\n if (statusCode >= 200 && statusCode < 300) {\n resolve({\n name: \"http\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n });\n } else {\n resolve({\n name: \"http\",\n healthy: false,\n score: 0,\n message: `HTTP health returned status ${statusCode}`,\n latencyMs: Date.now() - start,\n });\n }\n },\n );\n\n req.on(\"error\", (err) => {\n resolve({\n name: \"http\",\n healthy: false,\n score: 0,\n message: `HTTP health probe failed: ${err.message}`,\n latencyMs: Date.now() - start,\n });\n });\n\n req.on(\"timeout\", () => {\n req.destroy();\n resolve({\n name: \"http\",\n healthy: false,\n score: 0,\n message: `HTTP health probe timed out after ${timeoutMs}ms`,\n latencyMs: Date.now() - start,\n });\n });\n });\n}\n","import * as fs from \"node:fs\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nconst REQUIRED_CONFIG_PATHS: { path: string[]; label: string }[] = [\n { path: [\"gateway\", \"port\"], label: \"gateway.port\" },\n];\n\nconst POISON_KEYS = [\"autoAck\", \"autoAckMessage\"];\n\nexport async function configProbe(\n _target: ProbeTarget,\n configPath: string,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n if (!fs.existsSync(configPath)) {\n return {\n name: \"config\",\n healthy: false,\n score: 0,\n message: \"Gateway config file not found\",\n latencyMs: Date.now() - start,\n };\n }\n\n const raw = fs.readFileSync(configPath, \"utf-8\");\n let parsed: Record<string, unknown>;\n\n try {\n parsed = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return {\n name: \"config\",\n healthy: false,\n score: 0,\n message: \"Gateway config is not valid JSON\",\n latencyMs: Date.now() - start,\n };\n }\n\n const missingPaths = REQUIRED_CONFIG_PATHS.filter(({ path }) => {\n let obj: unknown = parsed;\n for (const key of path) {\n if (obj === null || typeof obj !== \"object\" || !(key in obj)) return true;\n obj = (obj as Record<string, unknown>)[key];\n }\n return false;\n });\n if (missingPaths.length > 0) {\n return {\n name: \"config\",\n healthy: false,\n score: 0,\n message: `Missing required config keys: ${missingPaths.map((p) => p.label).join(\", \")}`,\n latencyMs: Date.now() - start,\n };\n }\n\n const foundPoison = POISON_KEYS.filter((key) => key in parsed);\n if (foundPoison.length > 0) {\n return {\n name: \"config\",\n healthy: false,\n score: 0,\n message: `Poison keys detected: ${foundPoison.join(\", \")}`,\n latencyMs: Date.now() - start,\n };\n }\n\n return {\n name: \"config\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n return {\n name: \"config\",\n healthy: false,\n score: 0,\n message: `Config probe error: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import * as fs from \"node:fs\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function tunProbe(_target: ProbeTarget): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n // Check if any TUN device exists\n const tunDevices = fs\n .readdirSync(\"/sys/class/net\")\n .filter((dev) => {\n try {\n const type = fs.readFileSync(`/sys/class/net/${dev}/type`, \"utf-8\").trim();\n return type === \"65534\"; // ARPHRD_NONE — typical for TUN\n } catch {\n return false;\n }\n });\n\n if (tunDevices.length === 0) {\n return {\n name: \"tun\",\n healthy: true,\n score: 2,\n message: \"No TUN device configured (not required)\",\n latencyMs: Date.now() - start,\n };\n }\n\n // Check if TUN device is UP\n const tunDev = tunDevices[0];\n if (!tunDev) {\n return {\n name: \"tun\",\n healthy: true,\n score: 2,\n message: \"No TUN device configured (not required)\",\n latencyMs: Date.now() - start,\n };\n }\n const { stdout } = await execFileAsync(\"ip\", [\"link\", \"show\", tunDev]);\n const isUp = stdout.includes(\"state UP\") || stdout.includes(\",UP\");\n\n return {\n name: \"tun\",\n healthy: isUp,\n score: isUp ? 2 : 0,\n message: isUp ? undefined : `TUN device ${tunDev} is DOWN`,\n latencyMs: Date.now() - start,\n };\n } catch {\n return {\n name: \"tun\",\n healthy: true,\n score: 2,\n message: \"TUN probe skipped (not available on this platform)\",\n latencyMs: Date.now() - start,\n };\n }\n}\n","import * as fs from \"node:fs\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\nimport { resolvePid } from \"./resolve-pid.js\";\n\nexport async function memoryProbe(\n _target: ProbeTarget,\n pidSource: string,\n thresholdMb: number = 512,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n const pid = resolvePid(pidSource);\n\n if (pid === null) {\n return {\n name: \"memory\",\n healthy: false,\n score: 0,\n message: \"Gateway process not found — cannot check memory\",\n latencyMs: Date.now() - start,\n };\n }\n\n const statusPath = `/proc/${pid}/status`;\n\n if (!fs.existsSync(statusPath)) {\n return {\n name: \"memory\",\n healthy: false,\n score: 0,\n message: `Process ${pid} not found in /proc`,\n latencyMs: Date.now() - start,\n };\n }\n\n const status = fs.readFileSync(statusPath, \"utf-8\");\n const rssMatch = status.match(/VmRSS:\\s+(\\d+)\\s+kB/);\n\n if (!rssMatch) {\n return {\n name: \"memory\",\n healthy: true,\n score: 1,\n message: \"Could not parse RSS from /proc status\",\n latencyMs: Date.now() - start,\n };\n }\n\n const rssKb = parseInt(rssMatch[1] ?? \"0\", 10);\n const rssMb = rssKb / 1024;\n const healthy = rssMb < thresholdMb;\n\n return {\n name: \"memory\",\n healthy,\n score: healthy ? 2 : 0,\n message: healthy ? undefined : `RSS ${rssMb.toFixed(0)}MB exceeds threshold ${thresholdMb}MB`,\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n return {\n name: \"memory\",\n healthy: false,\n score: 0,\n message: `Memory probe error: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import * as fs from \"node:fs\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\nimport { resolvePid } from \"./resolve-pid.js\";\n\nexport async function cpuProbe(\n _target: ProbeTarget,\n pidSource: string,\n thresholdPercent: number = 90,\n sampleMs: number = 1000,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n const pid = resolvePid(pidSource);\n\n if (pid === null) {\n return {\n name: \"cpu\",\n healthy: false,\n score: 0,\n message: \"Gateway process not found — cannot check CPU\",\n latencyMs: Date.now() - start,\n };\n }\n\n const statPath = `/proc/${pid}/stat`;\n\n if (!fs.existsSync(statPath)) {\n return {\n name: \"cpu\",\n healthy: false,\n score: 0,\n message: `Process ${pid} not found in /proc`,\n latencyMs: Date.now() - start,\n };\n }\n\n const readCpuTime = (): number => {\n const stat = fs.readFileSync(statPath, \"utf-8\");\n const fields = stat.split(\" \");\n const utime = parseInt(fields[13] ?? \"0\", 10) || 0;\n const stime = parseInt(fields[14] ?? \"0\", 10) || 0;\n return utime + stime;\n };\n\n const cpuTime1 = readCpuTime();\n await new Promise((r) => setTimeout(r, sampleMs));\n const cpuTime2 = readCpuTime();\n\n const clockTicks = 100; // sysconf(_SC_CLK_TCK) — typically 100 on Linux\n const cpuDelta = (cpuTime2 - cpuTime1) / clockTicks;\n const cpuPercent = (cpuDelta / (sampleMs / 1000)) * 100;\n const healthy = cpuPercent < thresholdPercent;\n\n return {\n name: \"cpu\",\n healthy,\n score: healthy ? 2 : 0,\n message: healthy\n ? undefined\n : `CPU ${cpuPercent.toFixed(1)}% exceeds threshold ${thresholdPercent}%`,\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n return {\n name: \"cpu\",\n healthy: false,\n score: 0,\n message: `CPU probe error: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport * as path from \"node:path\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport async function diskProbe(\n _target: ProbeTarget,\n configPath: string,\n thresholdMb: number = 100,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n const dir = path.dirname(configPath);\n const { stdout } = await execFileAsync(\"df\", [\"-BM\", \"--output=avail\", dir]);\n const lines = stdout.trim().split(\"\\n\");\n const lastLine = lines[lines.length - 1];\n if (!lastLine) {\n return {\n name: \"disk\",\n healthy: true,\n score: 1,\n message: \"Could not parse df output\",\n latencyMs: Date.now() - start,\n };\n }\n const availStr = lastLine.trim().replace(\"M\", \"\");\n const availMb = parseInt(availStr, 10);\n\n if (isNaN(availMb)) {\n return {\n name: \"disk\",\n healthy: true,\n score: 1,\n message: \"Could not parse disk space\",\n latencyMs: Date.now() - start,\n };\n }\n\n const healthy = availMb >= thresholdMb;\n\n return {\n name: \"disk\",\n healthy,\n score: healthy ? 2 : 0,\n message: healthy\n ? undefined\n : `Only ${availMb}MB available (threshold: ${thresholdMb}MB)`,\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n return {\n name: \"disk\",\n healthy: true,\n score: 1,\n message: `Disk probe fallback: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import * as fs from \"node:fs\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nconst ERROR_PATTERNS = [\n /ECONNRESET/,\n /SIGTERM/,\n /SIGKILL/,\n /ENOMEM/,\n /fatal\\s+error/i,\n /uncaught\\s+exception/i,\n /unhandled\\s+rejection/i,\n /out\\s+of\\s+memory/i,\n /EACCES/,\n /ENOSPC/,\n];\n\nexport async function logTailProbe(\n _target: ProbeTarget,\n logPath: string,\n tailLines: number = 50,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n\n try {\n if (!fs.existsSync(logPath)) {\n return {\n name: \"logTail\",\n healthy: true,\n score: 2,\n message: \"Log file not found (may not exist yet)\",\n latencyMs: Date.now() - start,\n };\n }\n\n const content = fs.readFileSync(logPath, \"utf-8\");\n const lines = content.split(\"\\n\").slice(-tailLines);\n const recentText = lines.join(\"\\n\");\n\n const matchedPatterns = ERROR_PATTERNS.filter((p) => p.test(recentText));\n\n if (matchedPatterns.length === 0) {\n return {\n name: \"logTail\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n };\n }\n\n const score = matchedPatterns.length >= 3 ? 0 : 1;\n\n return {\n name: \"logTail\",\n healthy: false,\n score,\n message: `Error patterns in recent logs: ${matchedPatterns.map((p) => p.source).join(\", \")}`,\n latencyMs: Date.now() - start,\n };\n } catch (err) {\n return {\n name: \"logTail\",\n healthy: true,\n score: 1,\n message: `Log tail probe fallback: ${err instanceof Error ? err.message : String(err)}`,\n latencyMs: Date.now() - start,\n };\n }\n}\n","import WebSocket from \"ws\";\nimport type { HealthProbeResult, ProbeTarget } from \"../../types/index.js\";\n\nexport async function websocketProbe(\n target: ProbeTarget,\n port: number,\n timeoutMs: number = 5000,\n): Promise<HealthProbeResult> {\n const start = Date.now();\n const host = target.type === \"remote\" ? target.host : \"127.0.0.1\";\n const url = `ws://${host}:${port}`;\n\n return new Promise<HealthProbeResult>((resolve) => {\n let resolved = false;\n const finish = (result: HealthProbeResult) => {\n if (!resolved) {\n resolved = true;\n resolve(result);\n }\n };\n\n const timer = setTimeout(() => {\n ws.terminate();\n finish({\n name: \"websocket\",\n healthy: false,\n score: 0,\n message: `WebSocket handshake timed out after ${timeoutMs}ms`,\n latencyMs: Date.now() - start,\n });\n }, timeoutMs);\n\n const ws = new WebSocket(url, { handshakeTimeout: timeoutMs });\n\n ws.on(\"open\", () => {\n clearTimeout(timer);\n ws.close();\n finish({\n name: \"websocket\",\n healthy: true,\n score: 2,\n latencyMs: Date.now() - start,\n });\n });\n\n ws.on(\"error\", (err) => {\n clearTimeout(timer);\n ws.terminate();\n finish({\n name: \"websocket\",\n healthy: false,\n score: 0,\n message: `WebSocket probe failed: ${err.message}`,\n latencyMs: Date.now() - start,\n });\n });\n });\n}\n","import { Command } from \"commander\";\nimport { loadConfig, DEFAULT_CONFIG_PATH } from \"../../config/loader.js\";\nimport { HealthMonitor } from \"../../health/monitor.js\";\n\nexport const checkCommand = new Command(\"check\")\n .description(\"Run all health probes once and exit\")\n .option(\"-c, --config <path>\", \"Config file path\", DEFAULT_CONFIG_PATH)\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts: { config: string; json?: boolean }) => {\n const config = loadConfig(opts.config);\n const monitor = new HealthMonitor(config);\n\n const score = await monitor.runAllProbes();\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(score, null, 2) + \"\\n\");\n } else {\n const failed = score.probeResults.filter((p) => !p.healthy);\n process.stdout.write(`Health: ${score.band.toUpperCase()} (score: ${score.total})\\n`);\n process.stdout.write(`Probes: ${score.probeResults.length - failed.length} passed, ${failed.length} failed\\n`);\n\n if (failed.length > 0) {\n process.stdout.write(\"\\nFailed probes:\\n\");\n for (const probe of failed) {\n process.stdout.write(` - ${probe.name}: ${probe.message ?? \"failed\"}\\n`);\n }\n }\n }\n\n process.exit(score.band === \"healthy\" ? 0 : 1);\n });\n","import { Command } from \"commander\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as readline from \"node:readline\";\nimport { ensureConfigDir, getConfigDir, DEFAULT_CONFIG_PATH, expandHome, loadConfig } from \"../../config/loader.js\";\nimport { HealthMonitor } from \"../../health/monitor.js\";\n\nfunction ask(rl: readline.Interface, question: string, defaultValue?: string): Promise<string> {\n const suffix = defaultValue ? ` [${defaultValue}]` : \"\";\n return new Promise((resolve) => {\n rl.question(`${question}${suffix}: `, (answer) => {\n resolve(answer.trim() || defaultValue || \"\");\n });\n });\n}\n\nfunction detectPort(): number {\n try {\n const configPath = expandHome(\"~/.openclaw/openclaw.json\");\n if (fs.existsSync(configPath)) {\n const raw = JSON.parse(fs.readFileSync(configPath, \"utf-8\"));\n if (raw?.gateway?.port) return raw.gateway.port;\n }\n } catch { /* ignore */ }\n return 3000;\n}\n\nfunction generateToml(opts: {\n port: number;\n memoryThresholdMb: number;\n channels: { type: string; [key: string]: string | number }[];\n}): string {\n let toml = `# OpenClaw Aegis Configuration\n# Generated by 'aegis init'\n\n[gateway]\nconfigPath = \"~/.openclaw/openclaw.json\"\npidFile = \"openclaw-gateway.service\"\nport = ${opts.port}\nlogPath = \"~/.openclaw/logs/gateway.log\"\nhealthEndpoint = \"/health\"\n\n[monitoring]\nintervalMs = 10000\nprobeTimeoutMs = 5000\n\n[health]\nmemoryThresholdMb = ${opts.memoryThresholdMb}\ncpuThresholdPercent = 90\ndiskThresholdMb = 100\n\n[recovery]\nl1MaxAttempts = 3\nl2MaxAttempts = 2\n\n[backup]\nmaxKnownGood = 5\nknownGoodStabilityMs = 60000\n\n[deadManSwitch]\nenabled = true\ncountdownMs = 30000\n\n[platform]\ntype = \"systemd\"\n`;\n\n if (opts.channels.length > 0) {\n toml += \"\\n[alerts]\\n\";\n for (const ch of opts.channels) {\n toml += \"\\n[[alerts.channels]]\\n\";\n for (const [key, val] of Object.entries(ch)) {\n if (typeof val === \"number\") {\n toml += `${key} = ${val}\\n`;\n } else {\n toml += `${key} = \"${val}\"\\n`;\n }\n }\n }\n }\n\n return toml;\n}\n\nexport const initCommand = new Command(\"init\")\n .description(\"Interactive setup wizard — configure Aegis for your gateway\")\n .option(\"--auto\", \"Auto-detect everything, no prompts\")\n .action(async (opts: { auto?: boolean }) => {\n const configDir = getConfigDir();\n const configFile = expandHome(DEFAULT_CONFIG_PATH);\n\n if (fs.existsSync(configFile) && !opts.auto) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const overwrite = await ask(rl, \"Config already exists. Overwrite? (y/N)\", \"n\");\n if (overwrite.toLowerCase() !== \"y\") {\n console.log(\"Aborted.\");\n rl.close();\n return;\n }\n rl.close();\n }\n\n const detectedPort = detectPort();\n const channels: { type: string; [key: string]: string | number }[] = [];\n\n if (opts.auto) {\n // Auto mode: detect everything, no prompts\n console.log(\"Auto-detecting configuration...\");\n console.log(` Gateway port: ${detectedPort}`);\n console.log(` PID source: openclaw-gateway.service (systemd)`);\n console.log(` Memory threshold: 768MB`);\n } else {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n\n console.log(\"\\n OpenClaw Aegis — Setup Wizard\\n\");\n console.log(\" Detected gateway config at ~/.openclaw/openclaw.json\");\n console.log(` Detected gateway port: ${detectedPort}\\n`);\n\n const portStr = await ask(rl, \"Gateway port\", String(detectedPort));\n const port = parseInt(portStr, 10) || detectedPort;\n\n const memStr = await ask(rl, \"Memory threshold (MB)\", \"768\");\n const memThreshold = parseInt(memStr, 10) || 768;\n\n // Alert channels\n console.log(\"\\n Alert Channels (out-of-band — never through the gateway)\\n\");\n console.log(\" Supported: ntfy, telegram, whatsapp, slack, discord, email, pushover, webhook\\n\");\n\n let addMore = true;\n while (addMore) {\n const channelType = await ask(rl, \"Add alert channel? (ntfy/telegram/whatsapp/slack/discord/email/pushover/webhook/skip)\", \"skip\");\n\n if (channelType === \"skip\" || channelType === \"\") {\n addMore = false;\n continue;\n }\n\n switch (channelType) {\n case \"ntfy\": {\n const topic = await ask(rl, \" ntfy topic\", \"aegis-alerts\");\n const url = await ask(rl, \" ntfy server URL\", \"https://ntfy.sh\");\n channels.push({ type: \"ntfy\", topic, url, priority: 4 });\n console.log(` Added ntfy channel (${url}/${topic})\\n`);\n break;\n }\n case \"telegram\": {\n const botToken = await ask(rl, \" Telegram bot token\");\n const chatId = await ask(rl, \" Telegram chat ID\");\n if (botToken && chatId) {\n channels.push({ type: \"telegram\", botToken, chatId });\n console.log(\" Added Telegram channel\\n\");\n } else {\n console.log(\" Skipped — bot token and chat ID required\\n\");\n }\n break;\n }\n case \"whatsapp\": {\n const phoneNumberId = await ask(rl, \" WhatsApp Business phone number ID\");\n const accessToken = await ask(rl, \" WhatsApp Cloud API access token\");\n const recipientNumber = await ask(rl, \" Recipient phone number (with country code, e.g. 61412345678)\");\n if (phoneNumberId && accessToken && recipientNumber) {\n channels.push({ type: \"whatsapp\", phoneNumberId, accessToken, recipientNumber });\n console.log(\" Added WhatsApp channel\\n\");\n } else {\n console.log(\" Skipped — all three fields required\\n\");\n }\n break;\n }\n case \"slack\": {\n const webhookUrl = await ask(rl, \" Slack Incoming Webhook URL\");\n if (webhookUrl) {\n const channel = await ask(rl, \" Slack channel override (optional, e.g. #alerts)\");\n const ch: { type: string; webhookUrl: string; channel?: string } = { type: \"slack\", webhookUrl };\n if (channel) ch.channel = channel;\n channels.push(ch);\n console.log(\" Added Slack channel\\n\");\n } else {\n console.log(\" Skipped — webhook URL required\\n\");\n }\n break;\n }\n case \"discord\": {\n const webhookUrl = await ask(rl, \" Discord Webhook URL\");\n if (webhookUrl) {\n const username = await ask(rl, \" Bot display name (optional)\", \"Aegis\");\n const ch: { type: string; webhookUrl: string; username?: string } = { type: \"discord\", webhookUrl };\n if (username && username !== \"Aegis\") ch.username = username;\n channels.push(ch);\n console.log(\" Added Discord channel\\n\");\n } else {\n console.log(\" Skipped — webhook URL required\\n\");\n }\n break;\n }\n case \"email\": {\n const host = await ask(rl, \" SMTP host (e.g. smtp.gmail.com)\");\n const portStr = await ask(rl, \" SMTP port\", \"587\");\n const username = await ask(rl, \" SMTP username\");\n const password = await ask(rl, \" SMTP password\");\n const from = await ask(rl, \" From address\");\n const to = await ask(rl, \" To address\");\n if (host && username && password && from && to) {\n channels.push({\n type: \"email\", host, port: parseInt(portStr, 10) || 587,\n secure: 0, username, password, from, to,\n });\n console.log(\" Added Email channel\\n\");\n } else {\n console.log(\" Skipped — all fields required\\n\");\n }\n break;\n }\n case \"pushover\": {\n const apiToken = await ask(rl, \" Pushover API token (from your app)\");\n const userKey = await ask(rl, \" Pushover user key\");\n if (apiToken && userKey) {\n const device = await ask(rl, \" Device name (optional)\");\n const ch: { type: string; apiToken: string; userKey: string; device?: string } = { type: \"pushover\", apiToken, userKey };\n if (device) ch.device = device;\n channels.push(ch);\n console.log(\" Added Pushover channel\\n\");\n } else {\n console.log(\" Skipped — API token and user key required\\n\");\n }\n break;\n }\n case \"webhook\": {\n const url = await ask(rl, \" Webhook URL\");\n if (url) {\n const secret = await ask(rl, \" Webhook secret (optional)\");\n const ch: { type: string; url: string; secret?: string } = { type: \"webhook\", url };\n if (secret) ch.secret = secret;\n channels.push(ch);\n console.log(` Added webhook channel (${url})\\n`);\n } else {\n console.log(\" Skipped — URL required\\n\");\n }\n break;\n }\n default:\n console.log(` Unknown channel type: ${channelType}\\n`);\n }\n }\n\n rl.close();\n\n // Write config with user values\n const toml = generateToml({ port, memoryThresholdMb: memThreshold, channels });\n ensureConfigDir();\n fs.writeFileSync(configFile, toml, { mode: 0o600 });\n\n console.log(`\\n Config written to ${configFile}`);\n\n // Run a quick health check\n console.log(\"\\n Running health check...\\n\");\n const config = loadConfig(configFile);\n const monitor = new HealthMonitor(config);\n const score = await monitor.runAllProbes();\n\n const passed = score.probeResults.filter((p) => p.healthy).length;\n const failed = score.probeResults.filter((p) => !p.healthy);\n\n console.log(` Health: ${score.band.toUpperCase()} (${passed}/${score.probeResults.length} probes passed)`);\n if (failed.length > 0) {\n for (const probe of failed) {\n console.log(` - ${probe.name}: ${probe.message ?? \"failed\"}`);\n }\n }\n\n if (channels.length === 0) {\n console.log(\"\\n No alert channels configured. You can add them later by editing:\");\n console.log(` ${configFile}`);\n }\n\n console.log(\"\\n Setup complete. Run 'aegis check' to verify anytime.\\n\");\n return;\n }\n\n // Auto mode write\n const toml = generateToml({ port: detectedPort, memoryThresholdMb: 768, channels });\n ensureConfigDir();\n fs.writeFileSync(configFile, toml, { mode: 0o600 });\n console.log(`Config written to ${configFile}`);\n\n const config = loadConfig(configFile);\n const monitor = new HealthMonitor(config);\n const score = await monitor.runAllProbes();\n const passed = score.probeResults.filter((p) => p.healthy).length;\n console.log(`Health: ${score.band.toUpperCase()} (${passed}/${score.probeResults.length} probes passed)`);\n console.log(\"\\nSetup complete.\");\n });\n","import { Command } from \"commander\";\nimport { loadConfig, DEFAULT_CONFIG_PATH } from \"../../config/loader.js\";\nimport { AlertDispatcher } from \"../../alerts/dispatcher.js\";\nimport { NtfyProvider } from \"../../alerts/providers/ntfy.js\";\nimport { TelegramProvider } from \"../../alerts/providers/telegram.js\";\nimport { WhatsAppProvider } from \"../../alerts/providers/whatsapp.js\";\nimport { WebhookProvider } from \"../../alerts/providers/webhook.js\";\nimport { SlackProvider } from \"../../alerts/providers/slack.js\";\nimport { DiscordProvider } from \"../../alerts/providers/discord.js\";\nimport { EmailProvider } from \"../../alerts/providers/email.js\";\nimport { PushoverProvider } from \"../../alerts/providers/pushover.js\";\nimport type { AlertPayload } from \"../../types/index.js\";\n\nexport const testAlertCommand = new Command(\"test-alert\")\n .description(\"Send a test alert to all configured channels\")\n .option(\"-c, --config <path>\", \"Config file path\", DEFAULT_CONFIG_PATH)\n .action(async (opts: { config: string }) => {\n const config = loadConfig(opts.config);\n\n if (config.alerts.channels.length === 0) {\n console.log(\"No alert channels configured. Run 'aegis init' to add one.\");\n process.exit(1);\n }\n\n const dispatcher = new AlertDispatcher(1, [1000]);\n\n for (const ch of config.alerts.channels) {\n switch (ch.type) {\n case \"ntfy\":\n dispatcher.addProvider(new NtfyProvider(ch));\n break;\n case \"telegram\":\n dispatcher.addProvider(new TelegramProvider(ch));\n break;\n case \"whatsapp\":\n dispatcher.addProvider(new WhatsAppProvider(ch));\n break;\n case \"webhook\":\n dispatcher.addProvider(new WebhookProvider(ch));\n break;\n case \"slack\":\n dispatcher.addProvider(new SlackProvider(ch));\n break;\n case \"discord\":\n dispatcher.addProvider(new DiscordProvider(ch));\n break;\n case \"email\":\n dispatcher.addProvider(new EmailProvider(ch));\n break;\n case \"pushover\":\n dispatcher.addProvider(new PushoverProvider(ch));\n break;\n }\n }\n\n const alert: AlertPayload = {\n severity: \"info\",\n title: \"Aegis Test Alert\",\n body: \"This is a test notification from OpenClaw Aegis. If you see this, alerts are working.\",\n timestamp: new Date().toISOString(),\n };\n\n console.log(`Sending test alert to ${dispatcher.getProviders().length} channel(s)...\\n`);\n\n const result = await dispatcher.dispatch(alert);\n\n for (const r of result.results) {\n if (r.success) {\n console.log(` + ${r.provider}: sent (${r.durationMs}ms)`);\n } else {\n console.log(` - ${r.provider}: failed — ${r.error}`);\n }\n }\n\n console.log(result.sent ? \"\\nTest alert sent successfully.\" : \"\\nAll channels failed.\");\n process.exit(result.sent ? 0 : 1);\n });\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../types/index.js\";\n\nexport interface DispatchResult {\n sent: boolean;\n results: AlertResult[];\n allFailed: boolean;\n}\n\nexport class AlertDispatcher {\n private readonly providers: AlertProvider[] = [];\n private readonly retryBackoffMs: number[];\n private readonly retryAttempts: number;\n\n constructor(retryAttempts: number = 3, retryBackoffMs: number[] = [5000, 15000, 45000]) {\n this.retryAttempts = retryAttempts;\n this.retryBackoffMs = retryBackoffMs;\n }\n\n addProvider(provider: AlertProvider): void {\n this.providers.push(provider);\n }\n\n getProviders(): AlertProvider[] {\n return [...this.providers];\n }\n\n hasProviders(): boolean {\n return this.providers.length > 0;\n }\n\n async dispatch(alert: AlertPayload): Promise<DispatchResult> {\n if (this.providers.length === 0) {\n return { sent: false, results: [], allFailed: true };\n }\n\n const scrubbed = scrubSensitiveData(alert);\n const results: AlertResult[] = [];\n\n for (const provider of this.providers) {\n const result = await this.sendWithRetry(provider, scrubbed);\n results.push(result);\n }\n\n const anySuccess = results.some((r) => r.success);\n return { sent: anySuccess, results, allFailed: !anySuccess };\n }\n\n async testAll(): Promise<Map<string, boolean>> {\n const results = new Map<string, boolean>();\n for (const provider of this.providers) {\n try {\n const ok = await provider.test();\n results.set(provider.name, ok);\n } catch {\n results.set(provider.name, false);\n }\n }\n return results;\n }\n\n private async sendWithRetry(provider: AlertProvider, alert: AlertPayload): Promise<AlertResult> {\n let lastResult: AlertResult = {\n provider: provider.name,\n success: false,\n error: \"No attempts made\",\n durationMs: 0,\n };\n\n for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {\n try {\n lastResult = await provider.send(alert);\n if (lastResult.success) return lastResult;\n } catch (err) {\n lastResult = {\n provider: provider.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: 0,\n };\n }\n\n if (attempt < this.retryAttempts) {\n const delay = this.retryBackoffMs[attempt] ?? this.retryBackoffMs[this.retryBackoffMs.length - 1] ?? 5000;\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n\n return lastResult;\n }\n}\n\nexport function scrubSensitiveData(alert: AlertPayload): AlertPayload {\n return {\n ...alert,\n body: scrubString(alert.body),\n title: scrubString(alert.title),\n };\n}\n\nfunction scrubString(input: string): string {\n return input.replace(\n /(\"[^\"]*(?:key|secret|token|password|credential|auth)[^\"]*\"\\s*:\\s*)\"[^\"]*\"/gi,\n '$1\"[REDACTED]\"',\n );\n}","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface NtfyConfig {\n url: string;\n topic: string;\n priority: number;\n}\n\nexport class NtfyProvider implements AlertProvider {\n readonly name = \"ntfy\";\n private readonly config: NtfyConfig;\n\n constructor(config: NtfyConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const url = `${this.config.url}/${this.config.topic}`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Title\": alert.title,\n \"Priority\": String(this.config.priority),\n \"Tags\": alertSeverityToTag(alert.severity),\n },\n body: alert.body,\n });\n\n return {\n provider: this.name,\n success: response.ok,\n error: response.ok ? undefined : `HTTP ${response.status}`,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n\nfunction alertSeverityToTag(severity: string): string {\n switch (severity) {\n case \"critical\": return \"rotating_light\";\n case \"warning\": return \"warning\";\n default: return \"information_source\";\n }\n}\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface TelegramConfig {\n botToken: string;\n chatId: string;\n}\n\nexport class TelegramProvider implements AlertProvider {\n readonly name = \"telegram\";\n private readonly config: TelegramConfig;\n\n constructor(config: TelegramConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const url = `https://api.telegram.org/bot${this.config.botToken}/sendMessage`;\n const icon = alert.severity === \"critical\" ? \"\\u{1F6A8}\" : alert.severity === \"warning\" ? \"\\u{26A0}\\u{FE0F}\" : \"\\u{2139}\\u{FE0F}\";\n const text = `${icon} *${escapeMarkdown(alert.title)}*\\n\\n${escapeMarkdown(alert.body)}`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n chat_id: this.config.chatId,\n text,\n parse_mode: \"MarkdownV2\",\n }),\n });\n\n const data = await response.json() as { ok: boolean; description?: string };\n\n return {\n provider: this.name,\n success: data.ok,\n error: data.ok ? undefined : data.description,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n\nfunction escapeMarkdown(text: string): string {\n return text.replace(/([_*[\\]()~`>#+\\-=|{}.!\\\\])/g, \"\\\\$1\");\n}\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface WhatsAppConfig {\n phoneNumberId: string;\n accessToken: string;\n recipientNumber: string;\n}\n\n/**\n * WhatsApp Business Cloud API provider.\n * Sends alerts directly via Meta's API — completely out-of-band from OpenClaw.\n */\nexport class WhatsAppProvider implements AlertProvider {\n readonly name = \"whatsapp\";\n private readonly config: WhatsAppConfig;\n\n constructor(config: WhatsAppConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const url = `https://graph.facebook.com/v21.0/${this.config.phoneNumberId}/messages`;\n const icon = alert.severity === \"critical\" ? \"\\u{1F6A8}\" : alert.severity === \"warning\" ? \"\\u{26A0}\\u{FE0F}\" : \"\\u{2139}\\u{FE0F}\";\n const text = `${icon} *${alert.title}*\\n\\n${alert.body}`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Authorization\": `Bearer ${this.config.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n messaging_product: \"whatsapp\",\n to: this.config.recipientNumber,\n type: \"text\",\n text: { body: text },\n }),\n });\n\n const data = await response.json() as { messages?: { id: string }[]; error?: { message: string } };\n const success = response.ok && !!data.messages?.length;\n\n return {\n provider: this.name,\n success,\n error: success ? undefined : (data.error?.message ?? `HTTP ${response.status}`),\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n","import * as crypto from \"node:crypto\";\nimport type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface WebhookConfig {\n url: string;\n secret?: string;\n}\n\nexport class WebhookProvider implements AlertProvider {\n readonly name = \"webhook\";\n private readonly config: WebhookConfig;\n\n constructor(config: WebhookConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const body = JSON.stringify(alert);\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n\n if (this.config.secret) {\n const signature = crypto\n .createHmac(\"sha256\", this.config.secret)\n .update(body)\n .digest(\"hex\");\n headers[\"X-Aegis-Signature\"] = `sha256=${signature}`;\n }\n\n try {\n const response = await fetch(this.config.url, {\n method: \"POST\",\n headers,\n body,\n });\n\n return {\n provider: this.name,\n success: response.ok,\n error: response.ok ? undefined : `HTTP ${response.status}`,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Webhook Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface SlackConfig {\n webhookUrl: string;\n channel?: string;\n}\n\nexport class SlackProvider implements AlertProvider {\n readonly name = \"slack\";\n private readonly config: SlackConfig;\n\n constructor(config: SlackConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const icon = alert.severity === \"critical\" ? \":rotating_light:\" : alert.severity === \"warning\" ? \":warning:\" : \":information_source:\";\n\n const payload: Record<string, unknown> = {\n text: `${icon} *${alert.title}*\\n\\n${alert.body}`,\n };\n if (this.config.channel) {\n payload.channel = this.config.channel;\n }\n\n try {\n const response = await fetch(this.config.webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n const ok = response.ok;\n return {\n provider: this.name,\n success: ok,\n error: ok ? undefined : `HTTP ${response.status}`,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface DiscordConfig {\n webhookUrl: string;\n username?: string;\n}\n\nexport class DiscordProvider implements AlertProvider {\n readonly name = \"discord\";\n private readonly config: DiscordConfig;\n\n constructor(config: DiscordConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const color = alert.severity === \"critical\" ? 0xED4245 : alert.severity === \"warning\" ? 0xFEE75C : 0x57F287;\n\n const payload: Record<string, unknown> = {\n embeds: [{\n title: alert.title,\n description: alert.body,\n color,\n timestamp: alert.timestamp,\n footer: { text: \"OpenClaw Aegis\" },\n }],\n };\n if (this.config.username) {\n payload.username = this.config.username;\n }\n\n try {\n const response = await fetch(this.config.webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n const ok = response.status === 204 || response.ok;\n return {\n provider: this.name,\n success: ok,\n error: ok ? undefined : `HTTP ${response.status}`,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n","import * as net from \"node:net\";\nimport * as tls from \"node:tls\";\nimport type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface EmailConfig {\n host: string;\n port: number;\n secure: boolean;\n username: string;\n password: string;\n from: string;\n to: string;\n}\n\nexport class EmailProvider implements AlertProvider {\n readonly name = \"email\";\n private readonly config: EmailConfig;\n\n constructor(config: EmailConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const icon = alert.severity === \"critical\" ? \"[CRITICAL]\" : alert.severity === \"warning\" ? \"[WARNING]\" : \"[INFO]\";\n const subject = `${icon} ${alert.title}`;\n\n try {\n await this.sendSmtp(subject, alert.body);\n return {\n provider: this.name,\n success: true,\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n\n private sendSmtp(subject: string, body: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeout = 15000;\n let socket: net.Socket | tls.TLSSocket;\n\n const connect = () => {\n if (this.config.secure) {\n socket = tls.connect({\n host: this.config.host,\n port: this.config.port,\n rejectUnauthorized: true,\n });\n } else {\n socket = net.createConnection({\n host: this.config.host,\n port: this.config.port,\n });\n }\n\n socket.setTimeout(timeout);\n\n let buffer = \"\";\n let step = 0;\n\n const commands = [\n `EHLO aegis\\r\\n`,\n `AUTH LOGIN\\r\\n`,\n `${Buffer.from(this.config.username).toString(\"base64\")}\\r\\n`,\n `${Buffer.from(this.config.password).toString(\"base64\")}\\r\\n`,\n `MAIL FROM:<${this.config.from}>\\r\\n`,\n `RCPT TO:<${this.config.to}>\\r\\n`,\n `DATA\\r\\n`,\n `From: ${this.config.from}\\r\\nTo: ${this.config.to}\\r\\nSubject: ${subject}\\r\\nContent-Type: text/plain; charset=utf-8\\r\\nX-Mailer: OpenClaw-Aegis\\r\\n\\r\\n${body}\\r\\n.\\r\\n`,\n `QUIT\\r\\n`,\n ];\n\n socket.on(\"data\", (data: Buffer) => {\n buffer += data.toString();\n const lines = buffer.split(\"\\r\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line) continue;\n const code = parseInt(line.substring(0, 3), 10);\n\n if (line.charAt(3) === \"-\") continue;\n\n if (code >= 400) {\n socket.destroy();\n reject(new Error(`SMTP error: ${line}`));\n return;\n }\n\n if (step < commands.length) {\n socket.write(commands[step]!);\n step++;\n }\n\n if (step >= commands.length && code === 221) {\n socket.end();\n resolve();\n return;\n }\n }\n });\n\n socket.on(\"timeout\", () => {\n socket.destroy();\n reject(new Error(\"SMTP connection timed out\"));\n });\n\n socket.on(\"error\", (err: Error) => {\n reject(new Error(`SMTP error: ${err.message}`));\n });\n };\n\n if (!this.config.secure && this.config.port === 587) {\n const plain = net.createConnection({\n host: this.config.host,\n port: this.config.port,\n });\n plain.setTimeout(timeout);\n\n let buf = \"\";\n let startTlsSent = false;\n let ehloSent = false;\n\n plain.on(\"data\", (data: Buffer) => {\n buf += data.toString();\n const lines = buf.split(\"\\r\\n\");\n buf = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line) continue;\n const code = parseInt(line.substring(0, 3), 10);\n if (line.charAt(3) === \"-\") continue;\n\n if (code >= 400) {\n plain.destroy();\n reject(new Error(`SMTP error: ${line}`));\n return;\n }\n\n if (!ehloSent) {\n plain.write(\"EHLO aegis\\r\\n\");\n ehloSent = true;\n } else if (!startTlsSent) {\n plain.write(\"STARTTLS\\r\\n\");\n startTlsSent = true;\n } else if (code === 220 && startTlsSent) {\n socket = tls.connect({\n socket: plain,\n host: this.config.host,\n rejectUnauthorized: true,\n }, () => {\n let step2 = 0;\n let buffer2 = \"\";\n const cmds = [\n `EHLO aegis\\r\\n`,\n `AUTH LOGIN\\r\\n`,\n `${Buffer.from(this.config.username).toString(\"base64\")}\\r\\n`,\n `${Buffer.from(this.config.password).toString(\"base64\")}\\r\\n`,\n `MAIL FROM:<${this.config.from}>\\r\\n`,\n `RCPT TO:<${this.config.to}>\\r\\n`,\n `DATA\\r\\n`,\n `From: ${this.config.from}\\r\\nTo: ${this.config.to}\\r\\nSubject: ${subject}\\r\\nContent-Type: text/plain; charset=utf-8\\r\\nX-Mailer: OpenClaw-Aegis\\r\\n\\r\\n${body}\\r\\n.\\r\\n`,\n `QUIT\\r\\n`,\n ];\n\n socket.write(cmds[0]!);\n step2 = 1;\n\n socket.on(\"data\", (d: Buffer) => {\n buffer2 += d.toString();\n const ls = buffer2.split(\"\\r\\n\");\n buffer2 = ls.pop() ?? \"\";\n\n for (const l of ls) {\n if (!l) continue;\n const c = parseInt(l.substring(0, 3), 10);\n if (l.charAt(3) === \"-\") continue;\n\n if (c >= 400) {\n socket.destroy();\n reject(new Error(`SMTP error: ${l}`));\n return;\n }\n\n if (step2 < cmds.length) {\n socket.write(cmds[step2]!);\n step2++;\n }\n\n if (step2 >= cmds.length && c === 221) {\n socket.end();\n resolve();\n return;\n }\n }\n });\n });\n return;\n }\n }\n });\n\n plain.on(\"timeout\", () => { plain.destroy(); reject(new Error(\"SMTP connection timed out\")); });\n plain.on(\"error\", (err: Error) => { reject(new Error(`SMTP error: ${err.message}`)); });\n } else {\n connect();\n }\n });\n }\n}\n","import type { AlertPayload, AlertProvider, AlertResult } from \"../../types/index.js\";\n\nexport interface PushoverConfig {\n apiToken: string;\n userKey: string;\n device?: string;\n}\n\nexport class PushoverProvider implements AlertProvider {\n readonly name = \"pushover\";\n private readonly config: PushoverConfig;\n\n constructor(config: PushoverConfig) {\n this.config = config;\n }\n\n async send(alert: AlertPayload): Promise<AlertResult> {\n const start = Date.now();\n const priority = alert.severity === \"critical\" ? 1 : alert.severity === \"warning\" ? 0 : -1;\n\n const params: Record<string, string> = {\n token: this.config.apiToken,\n user: this.config.userKey,\n title: alert.title,\n message: alert.body,\n priority: String(priority),\n timestamp: String(Math.floor(new Date(alert.timestamp).getTime() / 1000)),\n };\n if (this.config.device) {\n params.device = this.config.device;\n }\n\n try {\n const response = await fetch(\"https://api.pushover.net/1/messages.json\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(params).toString(),\n });\n\n const data = await response.json() as { status: number; errors?: string[] };\n const ok = data.status === 1;\n\n return {\n provider: this.name,\n success: ok,\n error: ok ? undefined : (data.errors?.join(\", \") ?? `HTTP ${response.status}`),\n durationMs: Date.now() - start,\n };\n } catch (err) {\n return {\n provider: this.name,\n success: false,\n error: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - start,\n };\n }\n }\n\n async test(): Promise<boolean> {\n try {\n const result = await this.send({\n severity: \"info\",\n title: \"Aegis Alert Test\",\n body: \"This is a test alert from OpenClaw Aegis.\",\n timestamp: new Date().toISOString(),\n });\n return result.success;\n } catch {\n return false;\n }\n }\n}\n"],"mappings":"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","names":["import_commander","TOML","fs","fs","path","fs","import_node_child_process","fs","fs","import_node_child_process","import_node_util","path","execFileAsync","fs","WebSocket","import_commander","import_commander","fs","portStr","toml","config","monitor","score","passed","import_commander","net","connect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-aegis",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Self-healing sidecar daemon for the OpenClaw gateway",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",