{"id":"3bcb39ca-6914-4a79-b805-391b05209c9d","entityType":"agent","slug":"clawhub-fish1981bimmer-ops-maintenance","name":"ops-maintenance","canonicalUrl":"https://www.xpersona.co/agent/clawhub-fish1981bimmer-ops-maintenance","canonicalPath":"/agent/clawhub-fish1981bimmer-ops-maintenance","generatedAt":"2026-10-10T08:44:20.327Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T03:24:10.349Z","emptyReason":null},"description":"运维助手 v3.3.10 - 本地/远程/集群监控 (健康检查、日志分析、性能监控、批量操作、密码过期检查、告警通知、定时巡检、Docker健康、SSL证书、安全审计、网络诊断) Skill: ops-maintenance Owner: fish1981bimmer Summary: 运维助手 v3.3.10 - 本地/远程/集群监控 (健康检查、日志分析、性能监控、批量操作、密码过期检查、告警通知、定时巡检、Docker健康、SSL证书、安全审计、网络诊断) Tags: latest:3.3.10 Version history: v3.3.10 | 2026-09-06T05:03:26.214Z | auto ops-maintenance v3.3.10 - 更新版本号至 v3.3.10，文档描述同步升级。 - 无功能、命令或配置变更，仅为版本及文档信息维护。 v3.3.9 | 2026-09-06T05:00:49.809Z | auto ops-maintenance v3.3.9 Changelog - Bump version from 3.3.8 to 3.3.9 in package","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17dzz5rp1x5wrb7s33vv04cb984wjf8:ops-maintenance","sourceUrl":"https://clawhub.ai/fish1981bimmer/ops-maintenance","homepage":"https://clawhub.ai/fish1981bimmer/skills/ops-maintenance","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/fish1981bimmer/ops-maintenance","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/fish1981bimmer/skills/ops-maintenance","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":65,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"运维助手 v3.3.10 - 本地/远程/集群监控 (健康检查、日志分析、性能监控、批量操作、密码过期检查、告警通知、定时巡检、Docker健康、SSL证书、安全审计、网络诊断) Skill: ops-maintenance Owner: fish1981bimmer Summary: 运维助手 v3.3.10 - 本"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:24:10.349Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:24:10.349Z","emptyReason":null},"stars":null,"forks":null,"downloads":1738,"packageName":null,"latestVersion":"3.3.10","tractionLabel":"1.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:24:10.349Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T03:24:10.349Z","lastCrawledAt":"2026-10-10T03:24:10.349Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T03:24:10.349Z","lastVerifiedAt":null,"highlights":[{"version":"3.3.10","createdAt":"2026-09-06T05:03:26.214Z","changelog":"ops-maintenance v3.3.10 - 更新版本号至 v3.3.10，文档描述同步升级。 - 无功能、命令或配置变更，仅为版本及文档信息维护。","fileCount":191,"zipByteSize":375346},{"version":"3.3.9","createdAt":"2026-09-06T05:00:49.809Z","changelog":"# ops-maintenance v3.3.9 Changelog - Bump version from 3.3.8 to 3.3.9 in package.json.","fileCount":191,"zipByteSize":375289},{"version":"3.3.8","createdAt":"2026-09-06T04:56:28.005Z","changelog":"**Major update with new remote password check, enhanced network tools, and improved modularity.** - Added password expiration check for local and remote servers (`password` command). - Overhauled CLI: simplified command set, improved consistency and modularity. - New and reorganized documentation with concise usage and architecture guides. - Dropped legacy CLI and utility modules; migrated to a Clean Architecture codebase. - Enhanced i18n support and security (automatic config encryption).","fileCount":191,"zipByteSize":375284},{"version":"3.3.7","createdAt":"2026-08-23T08:02:43.082Z","changelog":"Fix: 重新排序功能说明，最新功能放最前","fileCount":25,"zipByteSize":100275},{"version":"3.3.6","createdAt":"2026-08-23T07:48:52.199Z","changelog":"Fix: SKILL.md description to v3.3","fileCount":25,"zipByteSize":100342},{"version":"3.3.5","createdAt":"2026-08-23T07:47:37.613Z","changelog":"Fix: SKILL.md description v3.3","fileCount":25,"zipByteSize":100373},{"version":"3.3.4","createdAt":"2026-08-23T07:42:36.797Z","changelog":"Fix: SKILL.md description 版本修复为 v3.3","fileCount":25,"zipByteSize":100461},{"version":"3.3.3","createdAt":"2026-08-23T07:32:09.238Z","changelog":"Fix: SKILL.md description 版本从 v3.1 修复为 v3.3","fileCount":38,"zipByteSize":124531}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17dzz5rp1x5wrb7s33vv04cb984wjf8:ops-maintenance","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fish1981bimmer-ops-maintenance/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fish1981bimmer-ops-maintenance/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fish1981bimmer-ops-maintenance/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fish1981bimmer-ops-maintenance/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fish1981bimmer-ops-maintenance/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fish1981bimmer-ops-maintenance/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T08:44:20.324Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fish1981bimmer-ops-maintenance/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fish1981bimmer-ops-maintenance/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fish1981bimmer-ops-maintenance/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fish1981bimmer-ops-maintenance/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T03:24:10.349Z","emptyReason":null},"readme":"Skill: ops-maintenance\n\nOwner: fish1981bimmer\n\nSummary: 运维助手 v3.3.10 - 本地/远程/集群监控 (健康检查、日志分析、性能监控、批量操作、密码过期检查、告警通知、定时巡检、Docker健康、SSL证书、安全审计、网络诊断)\n\nTags: latest:3.3.10\n\nVersion history:\n\nv3.3.10 | 2026-09-06T05:03:26.214Z | auto\n\nops-maintenance v3.3.10\n\n- 更新版本号至 v3.3.10，文档描述同步升级。\n- 无功能、命令或配置变更，仅为版本及文档信息维护。\n\nv3.3.9 | 2026-09-06T05:00:49.809Z | auto\n\n# ops-maintenance v3.3.9 Changelog\n\n- Bump version from 3.3.8 to 3.3.9 in package.json.\n\nv3.3.8 | 2026-09-06T04:56:28.005Z | auto\n\n**Major update with new remote password check, enhanced network tools, and improved modularity.**\n\n- Added password expiration check for local and remote servers (`password` command).\n- Overhauled CLI: simplified command set, improved consistency and modularity.\n- New and reorganized documentation with concise usage and architecture guides.\n- Dropped legacy CLI and utility modules; migrated to a Clean Architecture codebase.\n- Enhanced i18n support and security (automatic config encryption).\n\nv3.3.7 | 2026-08-23T08:02:43.082Z | user\n\nFix: 重新排序功能说明，最新功能放最前\n\nv3.3.6 | 2026-08-23T07:48:52.199Z | user\n\nFix: SKILL.md description to v3.3\n\nv3.3.5 | 2026-08-23T07:47:37.613Z | user\n\nFix: SKILL.md description v3.3\n\nv3.3.4 | 2026-08-23T07:42:36.797Z | user\n\nFix: SKILL.md description 版本修复为 v3.3\n\nv3.3.3 | 2026-08-23T07:32:09.238Z | user\n\nFix: SKILL.md description 版本从 v3.1 修复为 v3.3\n\nv3.3.2 | 2026-08-23T07:21:36.538Z | user\n\nFix: SKILL.md description 版本修复\n\nv3.3.1 | 2026-08-23T07:15:36.532Z | user\n\nFix: SKILL.md description 版本修复\n\nv3.3.0 | 2026-08-23T06:49:05.992Z | auto\n\nops-maintenance v3.3.0\n\n- 新增 Slack、钉钉、多 Webhook 等多渠道告警通知支持\n- CLI 工具健壮性提升，patrol start 命令后台运行且启动后不阻塞\n- 退出码与错误处理改进，命令失败时返回正确退出码\n- 通用 Webhook 支持，支持任意 HTTP POST 回调通知\n- 移除无用测试文件，完善单元测试覆盖至49个用例\n- 代码 ESM 化，require 全部替换为 import\n\nv3.2.7 | 2026-08-23T06:18:14.025Z | auto\n\n- Improved internal utilities for health checks, config change tracking, patrol scheduling, report generation, SFTP/SSH connection handling, and SSL monitoring.\n- Code updates in 8 files, including enhancements in src/utils modules.\n- No user-facing command or interface changes; CLI and documentation remain unchanged.\n\nv3.2.6 | 2026-08-23T06:11:35.700Z | auto\n\n- 更新版本号至 3.2.6\n- 无其他功能或文档变动（仅版本号递增）\n\nv3.2.5 | 2026-08-23T06:04:43.287Z | auto\n\n- 更新文档版本号至 v3.2.4 并完善功能说明\n- 补充/调整 CLI 命令与参数说明，包括告警、巡检等管理命令\n- 明确所有主要功能和系统安全性、性能、技术栈信息\n- 优化描述，统一版本信息，并突出 v3.2 关键特性\n\nv3.2.4 | 2026-08-23T05:51:05.592Z | auto\n\n- Bumped package version from 3.1.0 to 3.2.4 in package.json.\n- No user-facing feature or documentation changes.\n\nv3.2.3 | 2026-08-23T05:47:35.963Z | auto\n\n- 更新依赖：package.json 有修改。\n- 无功能或文档上的变动，核心逻辑和命令未变化。\n- 适用于常规依赖升级场景。\n\nv3.2.2 | 2026-08-23T05:46:22.989Z | auto\n\n- No changes in this release; the code and documentation remain identical to the previous version.\n- Version number updated to 3.2.2, but no file changes detected.\n\nv3.2.1 | 2026-08-23T05:39:11.933Z | auto\n\n- 更新描述为“运维助手 v3.2”。\n- 其余文档内容与上个版本保持一致。\n\nv3.2.0 | 2026-08-23T05:32:55.172Z | auto\n\n- Bump version to 3.2.0.\n- No user-facing feature or documentation changes.  \n- Internal updates to package.json and src/cli.ts only.\n\nv3.1.5 | 2026-08-23T05:24:27.403Z | auto\n\n- Removed 13 documentation and example files, including all markdown docs and TypeScript config/examples.\n- Updated SKILL.md to remove the \"邮件通知配置\" section.\n- No functional or CLI changes in code—cleanup mainly affects documentation and supporting files.\n\nv3.1.4 | 2026-08-23T05:17:23.765Z | auto\n\nVersion 3.1.4\n\n- No file changes detected compared to the previous version.\n- Internal version bump; functionality and documentation remain unchanged.\n\nv3.1.3 | 2026-08-23T05:09:09.159Z | auto\n\n- Version bump from 3.1.0 to 3.1.3 with no file changes detected.\n- No new features, fixes, or documentation updates in this release.\n- All functionality remains identical to the previous version.\n\nv3.1.2 | 2026-08-23T05:08:14.022Z | auto\n\n- Removed documentation file skill-card.md.\n- No changes to functionality or code—only documentation cleanup.\n\nv3.1.1 | 2026-08-23T05:03:33.706Z | auto\n\n- Version bumped from 3.1.0 to 3.1.1, but no file changes were detected.\n- No new features, bug fixes, or documentation updates in this release.\n\nv3.1.0 | 2026-06-07T01:51:14.895Z | user\n\nv3.1.0: Docker容器健康巡检+SSL证书监控+安全测试修复\n\n新功能:\n- Docker容器健康巡检: 容器状态检查、资源使用分析、镜像更新检测\n- SSL证书监控: 批量域名证书检查、过期告警、链路验证\n\n安全修复:\n- 命令验证器重构: 先检查危险模式(管道/替换/分号/注释)再查白名单\n- 告警测试隔离: 清除持久化文件防止历史数据污染测试\n\n56/56 测试全部通过\n\nv3.0.1 | 2026-05-24T12:31:17.850Z | auto\n\nVersion 3.0.1 Changelog\n\n- No code or documentation changes detected in this version.\n- All features and functionality remain unchanged from version 3.0.0.\n\nv3.0.0 | 2026-05-24T12:25:20.855Z | auto\n\nops-maintenance v3.0.0\n\n- 全面升级至 v3.0，加入安全审计、智能日志分析、配置变更追踪、告警通知、定时巡检等新子系统\n- 新增安全扫描、合规评估、风险分级和自动修复建议\n- 智能日志分析支持趋势、聚类、异常多维检测\n- 配置基线、变更检测、行级diff、历史记录\n- 完善告警平台：多渠道通知、去重、静默、升级、自动恢复\n- 新增定时巡检任务、报告自动生成与存储\n- 扩展命令行及API，完善多服务器、集群和巡检管理能力\n\nv2.1.2 | 2026-05-04T04:08:17.560Z | user\n\n运维助手 v2.1 - 安全增强版，密码加密、命令白名单\n\nv2.1.1 | 2026-05-01T10:45:06.253Z | user\n\nv2.1.1: 文档优化，安全增强版更新\n\nv2.1.0 | 2026-05-01T05:12:27.105Z | user\n\n安全增强版：密码AES-256-GCM加密、命令白名单、移除默认root、移除shell执行、审计日志增强\n\nv2.0.1 | 2026-04-26T00:40:56.616Z | user\n\nv2.0 优化：使用ssh2库替代child_process.exec，添加SSH连接池、SFTP文件传输、审计日志、并发控制、重试机制、安全性增强（主机密钥验证）、性能优化（连接复用）、跨平台兼容性修复\n\nv2.0.0 | 2026-04-21T13:27:51.475Z | user\n\n支持本地、远程、多服务器集群监控 (健康检查、日志分析、性能监控、批量操作、密码过期检查)\n\nArchive index:\n\nArchive v3.3.10: 191 files, 375346 bytes\n\nFiles: check.js (3209b), coverage/clover.xml (9082b), coverage/coverage-final.json (28327b), coverage/lcov-report/base.css (5394b), coverage/lcov-report/block-navigation.js (2655b), coverage/lcov-report/config/index.html (4396b), coverage/lcov-report/config/schemas.ts.html (45384b), coverage/lcov-report/index.html (5760b), coverage/lcov-report/infrastructure/notifiers/EmailNotifier.ts.html (22093b), coverage/lcov-report/infrastructure/notifiers/index.html (4500b), coverage/lcov-report/prettify.css (676b), coverage/lcov-report/prettify.js (17590b), coverage/lcov-report/sorter.js (6731b), coverage/lcov-report/utils/index.html (4443b), coverage/lcov-report/utils/logger.ts.html (24279b), dist/common.d.ts (4690b), dist/common.js (3168b), dist/config/ICredentialsProvider.d.ts (795b), dist/config/ICredentialsProvider.js (197b), dist/config/loader.d.ts (747b), dist/config/loader.js (5532b), dist/config/schemas.d.ts (7120b), dist/config/schemas.js (3445b), dist/config/validator.d.ts (2188b), dist/config/validator.js (2780b), dist/container.d.ts (2917b), dist/container.js (6802b), dist/core/entities/index.d.ts (310b), dist/core/entities/index.js (513b), dist/core/repositories/CacheRepository.d.ts (238b), dist/core/repositories/CacheRepository.js (251b), dist/core/repositories/index.d.ts (106b), dist/core/repositories/index.js (897b), dist/core/repositories/ServerRepository.d.ts (700b), dist/core/repositories/ServerRepository.js (215b), dist/core/usecases/DiskCheckUseCase.d.ts (1146b), dist/core/usecases/DiskCheckUseCase.js (4451b), dist/core/usecases/HealthCheckUseCase.d.ts (1465b), dist/core/usecases/HealthCheckUseCase.js (3900b), dist/core/usecases/index.d.ts (149b), dist/core/usecases/index.js (958b), dist/core/usecases/PasswordCheckUseCase.d.ts (1074b), dist/core/usecases/PasswordCheckUseCase.js (4964b), dist/exports.d.ts (2169b), dist/exports.js (8459b), dist/index.d.ts (469b), dist/index.js (1976b), dist/infrastructure/cache/CacheRepository.d.ts (2121b), dist/infrastructure/cache/CacheRepository.js (5799b), dist/infrastructure/cache/index.d.ts (133b), dist/infrastructure/cache/index.js (942b), dist/infrastructure/monitoring/HealthChecker.d.ts (1811b), dist/infrastructure/monitoring/HealthChecker.js (5225b), dist/infrastructure/monitoring/index.d.ts (104b), dist/infrastructure/monitoring/index.js (895b), dist/infrastructure/monitoring/ThresholdChecker.d.ts (741b), dist/infrastructure/monitoring/ThresholdChecker.js (3108b), dist/infrastructure/notifiers/EmailNotifier.d.ts (845b), dist/infrastructure/notifiers/EmailNotifier.js (4518b), dist/infrastructure/notifiers/index.d.ts (157b), dist/infrastructure/notifiers/index.js (496b), dist/infrastructure/repositories/CredentialsRepository.d.ts (2474b), dist/infrastructure/repositories/CredentialsRepository.js (6057b), dist/infrastructure/repositories/index.d.ts (75b), dist/infrastructure/repositories/index.js (848b), dist/infrastructure/repositories/ServerFileRepository.d.ts (1943b), dist/infrastructure/repositories/ServerFileRepository.js (3346b), dist/infrastructure/ssh/ConnectionPool.d.ts (1729b), dist/infrastructure/ssh/ConnectionPool.js (6985b), dist/infrastructure/ssh/SSHClient.d.ts (681b), dist/infrastructure/ssh/SSHClient.js (4349b), dist/legacy.d.ts (4698b), dist/legacy.js (6861b), dist/presentation/cli/CLI.d.ts (1891b), dist/presentation/cli/CLI.js (10051b), dist/presentation/cli/CommandDispatcher.d.ts (980b), dist/presentation/cli/CommandDispatcher.js (4498b), dist/presentation/cli/index.d.ts (95b), dist/presentation/cli/index.js (886b), dist/presentation/formatters/index.d.ts (105b)\n\nFile v3.3.10:SKILL.md\n\n---\nname: ops-maintenance\ndescription: 运维助手 v3.3.10 - 本地/远程/集群监控 (健康检查、日志分析、性能监控、批量操作、密码过期检查、告警通知、定时巡检、Docker健康、SSL证书、安全审计、网络诊断)\nuserInvocable: true\nargumentHint: <health|logs|perf|ports|process|disk|password|network|report|audit|docker|ssl|security|cluster> [args]\nallowedTools:\n  - Bash\n  - Read\n---\n\n# 运维助手 (ops-maintenance) v3.3.10\n\n专业的运维助手，支持单服务器和多服务器集群监控。\n\n## v3.3.8 新功能\n\n### 网络诊断\n```\n/ops-maintenance network               # 网络诊断（ping/dns/port）\n/ops-maintenance network <host>        # 指定主机检测\n```\n\n### 运维报告\n```\n/ops-maintenance report                # 集群状态摘要报告\n```\n\n### 操作审计\n```\n/ops-maintenance audit                 # 查看审计日志统计\n```\n\n### Docker 健康巡检\n```\n/ops-maintenance docker                # Docker容器健康检查\n```\n\n### SSL 证书监控\n```\n/ops-maintenance ssl                   # SSL证书检查\n```\n\n### 安全审计\n```\n/ops-maintenance security              # 安全配置审计\n```\n\n### 远程密码检查\n```\n/ops-maintenance user@host password    # 远程服务器密码过期检查\n```\n\n## 功能命令\n\n### 健康检查\n```\n/ops-maintenance health              # 本地\n/ops-maintenance user@host health    # 远程 SSH\n```\n\n### 日志分析  \n```\n/ops-maintenance logs [关键词]       # 本地\n/ops-maintenance user@host logs error  # 远程\n```\n\n### 性能监控 (本地)\n```\n/ops-maintenance perf\n```\n\n### 端口检查\n```\n/ops-maintenance ports [端口]        # 本地\n/ops-maintenance user@host ports 80  # 远程\n```\n\n### 进程检查\n```\n/ops-maintenance process [名称]      # 本地\n/ops-maintenance user@host process nginx  # 远程\n```\n\n### 磁盘使用\n```\n/ops-maintenance disk                # 本地\n/ops-maintenance user@host disk      # 远程\n```\n\n### 密码过期检查\n```\n/ops-maintenance password            # 检查所有配置服务器的密码过期状态\n```\n\n## 远程服务器配置\n\n### 方式 1: SSH Config (推荐)\n在 `~/.ssh/config` 中配置:\n```\nHost myserver\n    HostName 192.168.1.100\n    User root\n    Port 22\n    IdentityFile ~/.ssh/id_rsa\n```\n\n### 方式 2: 直接指定\n```\nuser@192.168.1.100 health\nroot@server.com:2222 disk\n```\n\n## 支持的远程操作\n- health: 系统负载、内存、磁盘、服务状态\n- logs: 远程日志搜索\n- ports: 端口占用检查\n- process: 进程查找\n- disk: 磁盘使用分析\n- password: 远程密码过期检查（v3.3.8新增）\n\n## 输出格式\n\n返回 Markdown 格式结果，包含:\n- 标题 (emoji + 操作名 + 服务器)\n- 代码块中的命令输出\n- 关键发现和建议\n\n### 密码过期检查输出示例\n\n```\n### 🔐 密码过期检查 (本地)\n\n| 用户 | 上次修改 | 过期日期 | 最大天数 | 状态 |\n|------|----------|----------|----------|------|\n| root | 2024-01-15 | 2024-07-15 | 180 | ✅ 有效 |\n| admin | 2024-02-01 | never | 90 | ⚠️ 永不过期 |\n| user1 | 2023-11-01 | 2024-01-01 | 60 | ❌ 已过期 |\n```\n\n## 多服务器集群管理\n\n### 查看集群状态\n```\n/ops-maintenance cluster              # 查看所有服务器状态\n/ops-maintenance cluster @production  # 按标签筛选\n```\n\n### 批量添加服务器\n```\n# 直接添加多个 IP\n/ops-maintenance batch-add 192.168.1.100 192.168.1.101 192.168.1.102\n\n# 带端口\n/ops-maintenance batch-add 192.168.1.100:2222 192.168.1.101:22\n\n# 带用户\n/ops-maintenance batch-add root@192.168.1.100 admin@192.168.1.101\n\n# 完整格式\n/ops-maintenance batch-add user@host:port user2@host2:port\n\n# CSV 格式 (多行)\n/ops-maintenance import-servers <<EOF\n192.168.1.100,22,root,web-1,production;web\n192.168.1.101,22,admin,db-1,production;database\nEOF\n\n# JSON 格式\n/ops-maintenance import-servers [{\"host\":\"192.168.1.100\",\"name\":\"web-1\",\"tags\":[\"prod\"]}]\n```\n\n### 添加服务器\n```\n/ops-maintenance add-server 192.168.1.100 --name web1 --tags production,web\n```\n\n### 移除服务器\n```\n/ops-maintenance remove-server 192.168.1.100\n```\n\n### 批量执行命令\n```\n/ops-maintenance exec \"df -h\" @production   # 在 production 组执行\n/ops-maintenance exec \"uptime\" all          # 在所有服务器执行\n```\n\n### 服务器配置文件\n- 位置: `~/.config/ops-maintenance/servers.json`\n- 支持字段: host, port, user, keyFile, name, tags\n- **密码加密**: v3.3.8+ 自动加密存储，密钥文件位于 `~/.config/ops-maintenance/.key`\n\n### 示例配置\n```json\n[\n  {\n    \"host\": \"192.168.1.100\",\n    \"user\": \"root\",\n    \"name\": \"web-1\",\n    \"tags\": [\"production\", \"web\"]\n  },\n  {\n    \"host\": \"192.168.1.101\",\n    \"user\": \"admin\",\n    \"name\": \"db-1\",\n    \"tags\": [\"production\", \"database\"]\n  }\n]\n```\n\n## 告警通知 (v3.3+)\n\n### 告警规则管理\n```\n/ops-maintenance alert rules     # 查看告警规则\n/ops-maintenance alert list      # 查看活跃告警\n/ops-maintenance alert stats     # 查看告警统计\n/ops-maintenance alert silence <ruleId> <server> [分钟]  # 静默告警\n/ops-maintenance alert cleanup [天数]  # 清理旧告警\n```\n\n### 通知渠道配置\n```\n/ops-maintenance alert notify email '{\"smtpHost\":\"smtp.qq.com\",\"smtpPort\":465,\"smtpUser\":\"xxx\",\"smtpPass\":\"授权码\",\"from\":\"xxx\",\"to\":[\"收件人\"]}'\n/ops-maintenance alert notify feishu '{\"webhook\":\"https://...\", \"secret\":\"...\"}'\n/ops-maintenance alert notify webhook '{\"url\":\"https://...\"}'\n```\n\n## 定时巡检 (v3.3+)\n\n### 巡检任务管理\n```\n/ops-maintenance patrol list     # 查看巡检任务\n/ops-maintenance patrol run      # 执行巡检\n/ops-maintenance patrol start    # 启动定时巡检\n/ops-maintenance patrol stop     # 停止定时巡检\n```\n\n## i18n 国际化 (v3.3.8新增)\n\n```bash\n# 设置语言\nexport LANG=en_US.UTF-8  # 英文\nexport LANG=zh_CN.UTF-8  # 中文（默认）\n```\n\n## 测试\n\n### 运行测试\n```bash\n# 运行所有测试\nnpm test\n\n# 运行核心功能测试（快速）\nnpm test -- test/core.test.ts\n\n# 运行特定测试\nnpm test -- --testNamePattern=\"健康检查\"\n```\n\n### 测试覆盖\n- ✅ 平台检测与命令执行\n- ✅ 本地健康检查\n- ✅ 日志分析\n- ✅ 性能监控\n- ✅ 进程检查\n- ✅ 密码过期检查\n- ✅ 服务器配置管理\n- ✅ 告警管理\n- ✅ 巡检调度\n- ✅ SSL监控\n- ✅ 邮件通知\n- ✅ 安全审计\n- ✅ Docker健康\n- ✅ 密码加密\n- ✅ i18n 国际化\n- ✅ 配置变更追踪\n- ✅ 审计报告生成\n- ✅ 网络诊断\n\n## 故障排除\n\n### SSH连接问题\n1. **连接超时**: 检查网络连接和防火墙设置\n2. **认证失败**: 确认SSH密钥配置正确\n3. **主机密钥验证**: 首次连接需要手动确认主机密钥\n\n### 命令执行缓慢\n1. **网络延迟**: 远程命令受网络影响\n2. **系统负载**: 高负载时响应变慢\n3. **超时设置**: 可在代码中调整超时时间\n\n### 权限问题\n1. **文件访问**: 某些系统文件需要root权限\n2. **命令执行**: 部分命令需要sudo权限\n3. **日志读取**: 确保有日志文件读取权限\n\n## 性能优化\n\n### 缓存策略\n- 内存缓存: 30秒TTL，减少重复计算\n- 文件缓存: 持久化存储，跨会话复用\n- 连接池: SSH连接复用，减少握手开销\n\n### 批量操作\n- 使用集群命令而非单台操作\n- 合并相关命令减少网络往返\n- 合理设置超时时间\n\n### 监控建议\n- 定期检查服务器健康状态\n- 关注密码过期时间\n- 监控磁盘使用趋势\n- 设置关键服务端口监控\n\n## 架构说明\n\n### Clean Architecture\n```\nsrc-new/\n├── core/              # 核心业务逻辑\n│   ├── usecases/     # 用例实现\n│   └── domain/       # 领域模型\n├── infrastructure/    # 基础设施\n│   ├── ssh/          # SSH客户端\n│   ├── cache/        # 缓存实现\n│   └── monitoring/   # 监控策略\n├── presentation/      # 表现层\n│   └── cli/          # CLI接口\n└── config/           # 配置管理\n```\n\n### 设计模式\n- **依赖注入**: 使用容器管理依赖\n- **策略模式**: 可插拔的监控策略\n- **适配器模式**: 兼容旧版API\n- **工厂模式**: 创建SSH连接\n\n### 数据流\n```\n用户命令 → CLI解析 → UseCase → Infrastructure → 外部系统\n                ↓\n            缓存层\n```\n\n## 开发指南\n\n### 添加新功能\n1. 在`core/usecases/`创建新的UseCase\n2. 在`infrastructure/`实现必要的适配器\n3. 在`presentation/cli/`添加CLI命令\n4. 更新`container.ts`注册依赖\n5. 添加测试用例\n\n### 代码规范\n- 使用TypeScript类型注解\n- 遵循Clean Architecture原则\n- 保持向后兼容性\n- 添加适当的错误处理\n- 编写单元测试\n\n### 调试技巧\n```bash\n# 启用详细日志\nDEBUG=* npm start\n\n# 测试单个功能\nnode run.js health\n\n# 检查配置\ncat ~/.config/ops-maintenance/servers.json\n```\n\n## 限制与注意事项\n\n### 平台支持\n- ✅ Linux: 完整支持\n- ✅ macOS: 基本支持（部分功能受限）\n- ⚠️ Windows: 有限支持（通过WSL）\n\n### 网络要求\n- SSH连接需要稳定的网络\n- 防火墙需要开放SSH端口\n- 建议使用SSH密钥认证\n\n### 安全建议\n- 不要在代码中硬编码密码\n- 使用SSH密钥而非密码认证\n- 定期更新SSH密钥\n- 限制服务器访问权限\n- 加密敏感配置信息（v3.3.8+自动加密）\n\n## 贡献指南\n\n### 报告问题\n提供详细的错误信息：\n- 操作系统版本\n- Node.js版本\n- 复现步骤\n- 错误日志\n\n### 提交代码\n1. Fork项目\n2. 创建功能分支\n3. 编写测试\n4. 提交Pull Request\n\n### 文档改进\n- 修正错误和不准确之处\n- 添加使用示例\n- 翻译文档\n\nFile v3.3.10:skills/ops-maintenance/SKILL.md\n\n---\nname: ops-maintenance\nversion: 3.3.0\ndescription: 运维助手 v3.3 - 支持本地、远程、多服务器集群监控、安全审计、智能日志分析、配置变更追踪、告警通知、定时巡检、Docker容器健康巡检、SSL证书监控\nuserInvocable: true\nargumentHint: <health|security|logs|config|report|perf|ports|process|disk|cluster|alert|patrol|docker-health|ssl|add-server|remove-server|upload|download|list|audit> [args]\nallowedTools:\n - Bash\n - Read\n---\n\n# 运维助手 (ops-maintenance) v3.3.0\n\n专业的运维助手，支持单服务器和多服务器集群监控、安全审计、智能日志分析、配置变更追踪、告警通知、定时巡检、Docker容器健康巡检、SSL证书监控。\n\n## v3.3 新功能\n\n### 多渠道通知增强 (v3.3)\n- **Slack 支持**: 通过 `ops alert notify slack <config>` 配置 Slack Webhook\n- **钉钉支持**: 通过 `ops alert notify dingtalk <config>` 配置钉钉机器人\n- **通用 Webhook**: 支持任意 HTTP POST 回调\n\n### CLI 健壮性修复 (v3.3)\n- **patrol start 不再阻塞**: 启动后自动退出，后台运行\n- **完整的错误处理**: 所有命令失败时返回适当退出码\n\n### 测试覆盖提升 (v3.3)\n- **49 个单元测试**: 覆盖安全、告警、巡检、SSL、Docker 核心功能\n- **ESM 兼容**: 所有 `require()` 替换为 `import`\n\n### 通知渠道配置示例\n```bash\n# 飞书\nops alert notify feishu '{\"webhookUrl\":\"https://open.feishu.cn/open-apis/bot/v2/hook/xxx\"}'\n\n# 企业微信\nops alert notify wechat '{\"webhookUrl\":\"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx\"}'\n\n# 邮件 (SMTP)\nops alert notify email '{\"smtpHost\":\"smtp.qq.com\",\"smtpPort\":465,\"smtpUser\":\"xxx@qq.com\",\"smtpPass\":\"授权码\",\"from\":\"xxx@qq.com\",\"to\":[\"收件人@qq.com\"]}'\n\n# Webhook\nops alert notify webhook '{\"url\":\"https://hooks.slack.com/services/xxx\"}'\n\n# Slack\nops alert notify slack '{\"webhookUrl\":\"https://hooks.slack.com/services/xxx\",\"channel\":\"#alerts\",\"username\":\"OpsBot\"}'\n\n# 钉钉\nops alert notify dingtalk '{\"webhookUrl\":\"https://oapi.dingtalk.com/robot/send?access_token=xxx\"}'\n```\n\n## v3.2 新功能\n\n### Docker 容器健康巡检\n- **全面巡检**: 自动检查所有容器的健康状况\n- **重启检测**: 检测容器重启次数超限，识别启动即崩溃的僵尸容器\n- **OOM Kill检测**: 识别因内存不足被Kill的容器\n- **健康检查失败**: 检测Docker HEALTHCHECK失败\n- **资源超限**: CPU/内存使用率超阈值告警(70%/75%警告, 90%/90%严重)\n- **镜像过期**: 检测超过90天未更新的镜像\n- **单容器检查**: 支持指定容器名深度检查\n\n### SSL 证书监控\n- **批量域名检查**: 支持同时检查多个域名的SSL证书\n- **过期告警**: 默认30天前告警，7天前严重告警\n- **证书详情**: 显示颁发者、有效期、SAN域名、协议版本\n- **链路检查**: 检测SAN不匹配、不安全协议(TLSv1.0/1.1)\n- **配置文件支持**: 从 ~/.config/ops-maintenance/ssl-domains.json 加载域名\n- **备用方案**: openssl命令作为Node.js TLS的备用检测方式\n\n### 安全审计系统\n- **自动安全扫描**: SSH配置、防火墙状态、文件权限、Docker安全、内核参数\n- **风险分级**: high/medium/low 三级风险分类\n- **修复建议**: 每项发现自动生成修复建议\n- **合规检查**: 对照安全基线自动评估\n\n### 智能日志分析\n- **趋势统计**: 按时间段统计错误量，生成时间线\n- **模式识别**: 相似日志自动聚合，提取通用模式\n- **异常检测**: 4种异常检测(错误突增/新模式/超时聚类/连续爆发)\n- **多源关联**: 多个日志源的关联分析\n- **自动发现**: 自动发现常见日志路径\n\n### 配置变更追踪\n- **基线快照**: 为关键配置文件建立SHA256基线\n- **变更检测**: 自动检测配置文件变更\n- **差异对比**: 变更详情展示(行级diff)\n- **变更历史**: 保留完整变更历史记录\n- **预设追踪**: 默认追踪nginx/SSH/sysctl/fstab/hosts/DNS/crontab\n\n### 运维报告生成\n- **综合报告**: 一键汇总健康/安全/日志/配置四维报告\n- **多格式输出**: Markdown / JSON / 纯文本\n- **模块可选**: 可选择性跳过某些模块\n- **状态总览**: 一目了然的OK/WARN/CRIT状态汇总\n\n### 告警通知系统\n- **多渠道通知**: 飞书机器人 / 企业微信 / 邮件 / Webhook / 控制台\n- **8种默认告警规则**: 磁盘(80%/90%)、内存(85%/95%)、负载(5/10)、CPU(80%)、服务宕机\n- **告警去重**: 同一规则+服务器不重复触发\n- **告警静默**: 指定时间内屏蔽重复告警\n- **自动恢复检测**: 阈值恢复后自动标记 resolved 并发送恢复通知\n- **告警升级**: 按阈值从高到低，优先触发最高级别\n- **持久化存储**: 告警记录保存在 ~/.config/ops-maintenance/alerts.json\n\n#### 邮件通知配置\n```bash\n# 配置SMTP邮件通知 (QQ邮箱示例)\nops alert notify email '{\"smtpHost\":\"smtp.qq.com\",\"smtpPort\":465,\"smtpUser\":\"xxx@qq.com\",\"smtpPass\":\"授权码\",\"from\":\"xxx@qq.com\",\"to\":[\"收件人@qq.com\"]}'\n\n# 其他SMTP服务商\n# 163: smtp.163.com:465\n# Gmail: smtp.gmail.com:587\n# Outlook: smtp.office365.com:587\n```\n\n### 定时巡检调度\n- **自动巡检**: 按配置间隔自动执行 health/disk/memory/load/cpu/service 检查\n- **2种默认任务**: 基础健康巡检(5分钟)、服务状态巡检(1分钟)\n- **巡检报告**: 自动生成 Markdown 格式报告，保存在 ~/.config/ops-maintenance/reports/\n- **手动触发**: 随时手动执行单个或全部巡检任务\n- **告警联动**: 巡检结果自动评估告警规则并触发通知\n\n### CLI 命令增强 (v3.2)\n- **告警管理**: `ops alert rules/list/notify/stats/silence/cleanup` — 完整的告警生命周期管理\n- **巡检管理**: `ops patrol list/run/start/stop` — 定时巡检任务的启动/停止/手动触发\n- **邮件通知**: 支持 SMTP 配置 (QQ/163/Gmail/Outlook)，通过 `ops alert notify email <config>` 设置\n- **批量操作**: 支持多服务器并行执行命令，默认5并发\n- **JSON输出**: 所有命令支持 `--json` 选项，便于程序化处理\n\n## CLI 命令 (v3.3)\n\n```\nops health              # 系统健康检查\nops security            # 安全审计\nops security --fix      # 安全审计+修复建议\nops logs                # 智能日志分析\nops logs --trends       # 只看趋势\nops logs --anomalies    # 只看异常\nops config list         # 查看追踪文件\nops config check        # 检查配置变更\nops config baseline     # 建立配置基线\nops config history      # 查看变更历史\nops report              # 生成综合运维报告\nops report -f json      # JSON格式报告\nops audit               # 查看审计日志\nops docker-health       # Docker容器健康巡检(全部)\nops docker-health -c nginx  # 检查指定容器\nops docker-health --images  # 只检查镜像更新\nops docker-health --json    # JSON格式输出\nops ssl example.com     # 检查域名SSL证书\nops ssl a.com b.com c.com   # 批量检查\nops ssl example.com --detail  # 证书详情\nops ssl example.com --port 8443  # 指定端口\nops ssl example.com --warn-days 14  # 14天内告警\n```\n\n## 告警命令\n\n```\n/ops-maintenance alert rules          # 查看告警规则\n/ops-maintenance alert list           # 查看活跃告警\n/ops-maintenance alert stats          # 查看告警统计\n/ops-maintenance alert silence <ruleId> <server> [分钟]  # 静默告警\n/ops-maintenance alert cleanup [天数] # 清理旧告警\n/ops-maintenance alert notify <channel> <config>  # 配置通知渠道\n/ops-maintenance alert add <rule>     # 添加告警规则\n/ops-maintenance alert remove <ruleId> # 删除告警规则\n/ops-maintenance alert toggle <ruleId> <on|off>  # 启用/禁用规则\n```\n\n## 巡检命令\n\n```\n/ops-maintenance patrol start         # 启动定时巡检\n/ops-maintenance patrol stop          # 停止定时巡检\n/ops-maintenance patrol run [jobId]   # 手动执行巡检\n/ops-maintenance patrol jobs          # 查看巡检任务\n/ops-maintenance patrol reports       # 查看巡检报告\n/ops-maintenance patrol add <job>     # 添加巡检任务\n/ops-maintenance patrol remove <jobId> # 删除巡检任务\n/ops-maintenance patrol toggle <jobId> <on|off>  # 启用/禁用任务\n```\n\n## 网络诊断命令\n\n```\n/ops-maintenance net ping <host> [count]     # Ping测试\n/ops-maintenance net dns <host> [server]     # DNS查询\n/ops-maintenance net trace <host> [maxHops]  # 路由追踪\n/ops-maintenance net mtr <host> [count]      # MTR测试\n/ops-maintenance net port <host> <port>      # 端口连通测试\n/ops-maintenance net check <host> [ports]    # 综合连通性测试\n```\n\n## 服务管理命令 (Docker + systemd)\n\n```\n/ops-maintenance docker ps [all]             # 容器列表\n/ops-maintenance docker stats [container]    # 容器资源使用\n/ops-maintenance docker inspect <name|id>    # 容器详情\n/ops-maintenance docker logs <name|id> [lines] # 容器日志\n/ops-maintenance docker images               # 镜像列表\n/ops-maintenance svc status <name>           # 服务状态(systemd)\n/ops-maintenance svc status <n1> <n2> ...    # 批量服务状态\n/ops-maintenance svc logs <name> [lines]     # 服务日志(journalctl)\n```\n\n## 基础功能命令\n\n### 健康检查\n```\n/ops-maintenance health                     # 本地\n/ops-maintenance user@host health           # 远程 SSH\n```\n\n### 日志分析\n```\n/ops-maintenance logs [关键词]              # 本地\n/ops-maintenance user@host logs error       # 远程\n```\n\n### 性能监控 (本地)\n```\n/ops-maintenance perf\n```\n\n### 端口检查\n```\n/ops-maintenance ports [端口]               # 本地\n/ops-maintenance user@host ports 80         # 远程\n```\n\n### 进程检查\n```\n/ops-maintenance process [名称]             # 本地\n/ops-maintenance user@host process nginx    # 远程\n```\n\n### 磁盘使用\n```\n/ops-maintenance disk                       # 本地\n/ops-maintenance user@host disk             # 远程\n```\n\n### 文件传输\n```\n/ops-maintenance upload <local> <remote>    # 上传文件\n/ops-maintenance download <remote> <local>  # 下载文件\n/ops-maintenance list <remote>              # 列出远程目录\n```\n\n### 审计日志\n```\n/ops-maintenance audit                      # 查看审计统计\n```\n\n## 远程服务器配置\n\n### 方式 1: 配置文件 (推荐)\n在 `~/.config/ops-maintenance/servers.json` 中配置:\n```json\n[\n  {\n    \"host\": \"192.168.1.100\",\n    \"user\": \"root\",\n    \"port\": 22,\n    \"keyFile\": \"~/.ssh/id_rsa\",\n    \"name\": \"web-1\",\n    \"tags\": [\"production\", \"web\"]\n  }\n]\n```\n\n### 方式 2: 直接指定\n```\nuser@192.168.1.100 health\nroot@server.com:2222 disk\n```\n\n## 多服务器集群管理\n\n### 查看集群状态\n```\n/ops-maintenance cluster                    # 查看所有服务器状态\n/ops-maintenance cluster @production        # 按标签筛选\n```\n\n### 批量添加服务器\n```\n/ops-maintenance batch-add 192.168.1.100 192.168.1.101\n/ops-maintenance batch-add root@192.168.1.100 admin@192.168.1.101\n/ops-maintenance import-servers <<EOF\n192.168.1.100,22,root,web-1,production;web\n192.168.1.101,22,admin,db-1,production;database\nEOF\n```\n\n### 批量执行命令\n```\n/ops-maintenance exec \"df -h\" @production   # 在 production 组执行\n/ops-maintenance exec \"uptime\" all          # 在所有服务器执行\n```\n\n## 安全性说明\n\n### v2.1 安全改进\n- **移除默认root用户**：必须显式指定SSH用户\n- **密码加密存储**：使用AES-256-GCM加密\n- **命令白名单验证**：只允许执行安全的只读命令\n- **增强安全检查**：检测管道、重定向、命令替换等绕过方式\n\n### 命令白名单\n允许: uptime, free, df, ps, tail, grep, journalctl, netstat, ss, lsof, systemctl status, docker ps, ls, du, find\n禁止: rm, mv, cp, chmod, shutdown, reboot, useradd, passwd, apt, yum, npm, systemctl start/stop\n\n### 认证方式\n1. 密钥认证（推荐）: `\"keyFile\": \"~/.ssh/id_rsa\"`\n2. 密码认证（加密存储）: 密码自动使用AES-256-GCM加密\n3. 默认密钥: 自动使用 ~/.ssh/id_rsa\n\n## 审计日志\n\n- 位置: ~/.config/ops-maintenance/logs/audit.log\n- 记录: 时间戳、操作类型、目标服务器、执行命令、状态、时长、错误信息\n\n## 性能优化\n\n- 连接池: 最大10连接，5分钟超时，自动清理\n- 并发控制: 批量操作默认5并发\n- 重试机制: 3次重试，指数退避\n\n## 技术栈\n\n- Node.js + TypeScript\n- ssh2: SSH客户端库\n- ssh2-sftp-client: SFTP文件传输\n- commander: CLI命令框架\n- 审计日志: JSON格式，支持查询和统计\n\n## 开发说明\n\n```bash\ncd /Users/a1234/.openclaw/workspace/skills/ops-maintenance\nnpm install\nnpm run dev\nnpm test\nnpm run build\n```\n\nFile v3.3.10:README.md\n\n# ops-maintenance 2.0 重构完成\n\n## 🎉 重大更新\n\n运维助手已完成 Clean Architecture 架构重构，保持 **100% 向后兼容**。\n\n### 核心改进\n\n| 特性 | v1.x | v2.0 |\n|------|------|------|\n| 架构 | 单体 1500 行 | 分层清晰 |\n| SSH 连接 | 每次新建 | 连接池复用 ✅ |\n| 配置管理 | 静态读文件 | 热加载 + CRUD ✅ |\n| 缓存 | 无 | 内存 + 文件缓存 ✅ |\n| 可测试性 | 难 | 依赖注入，易于测试 ✅ |\n| 扩展性 | 硬编码 | 策略模式，插件化 ✅ |\n\n---\n\n## 📦 快速开始\n\n### 安装\n```bash\ncd ~/.claude/skills/ops-maintenance\nnpm install\n```\n\n### 配置服务器\n```bash\n# 编辑配置文件\nvim ~/.config/ops-maintenance/servers.json\n```\n\n示例配置：\n```json\n[\n  {\n    \"host\": \"10.119.120.143\",\n    \"port\": 22,\n    \"user\": \"salt\",\n    \"name\": \"DM裸金属服务器\",\n    \"tags\": [\"DB\"]\n  }\n]\n```\n\n### 设置凭据（安全方式）\n```bash\n# 使用环境变量（推荐，密码不存文件）\nexport OPS_CRED_10_119_120_143=\"salt:Giten!#202501Tab*&\"\n# 或使用密钥\nexport OPS_KEY_10_119_120_143=\"/home/user/.ssh/id_rsa\"\n```\n\n### 运行\n\n```bash\n# 集群健康检查\nnode run.js cluster\n\n# 密码过期检查\nnode run.js password\n\n# 指定环境\nnode run.js health @production\n\n# JSON 输出\nnode run.js password --json\n```\n\n---\n\n## 🏗️ 架构文档\n\n详细架构说明见 [`doc/ARCHITECTURE.md`](doc/ARCHITECTURE.md)\n\n### 目录结构\n```\nsrc-new/\n├── types.ts                      # 统一类型定义\n├── config/                       # 配置层\n│   ├── schemas.ts                # 类型和接口\n│   ├── loader.ts                 # ConfigManager\n│   └── validator.ts              # Zod 验证\n├── core/                         # 领域层\n│   ├── entities/                 # 实体\n│   ├── repositories/             # 仓库接口\n│   └── usecases/                 # 用例\n├── infrastructure/               # 基础设施\n│   ├── ssh/                      # SSH 客户端 & 池\n│   ├── cache/                    # 缓存\n│   ├── repositories/             # 仓库实现\n│   └── monitoring/               # 监控策略\n├── presentation/                 # 表现层\n│   ├── formatters/               # 格式化器\n│   ├── cli/                      # CLI\n│   └── LegacyAdapter.ts          # 向后兼容\n├── container.ts                  # 依赖注入容器\n├── legacy.ts                     # 旧版 API 适配\n└── index.ts                      # 新架构入口\n```\n\n---\n\n## 🔧 开发\n\n### 编译\n```bash\nnpm run build          # 编译到 dist/\nnpm run build:watch    # 监听模式\n```\n\n### 测试\n```bash\nnpm test               # 运行测试\nnpm run test:watch     # 监听模式\nnpm run test:coverage   # 覆盖率报告\n```\n\n### 调试\n```bash\nnode run-dev.js            # 开发模式，显示状态\nOPS_LOG_LEVEL=debug node run.js cluster  # 调试日志\n```\n\n---\n\n## 🔐 凭据管理\n\n### 方式 1: 环境变量（推荐）\n```bash\n# 密码认证\nexport OPS_CRED_<HOST>=\"user:password\"\n# 例如（将 . 替换为 _）：\nexport OPS_CRED_10_119_120_143=\"salt:password123\"\n\n# 密钥认证\nexport OPS_KEY_<HOST>=\"/path/to/private/key\"\n```\n\n### 方式 2: SSH 默认密钥\n如果未设置环境变量，自动尝试 `~/.ssh/id_rsa`、`id_ed25519` 等。\n\n### 方式 3: 配置文件（不推荐生产）\n扩展 `servers.json` 增加 `password` 或 `keyFile` 字段（仅测试环境使用）。\n\n---\n\n## 🎯 API 使用\n\n### 新架构 API\n```typescript\nimport { initContainer, Server } from 'ops-maintenance'\n\nconst container = await initContainer()\nconst healthUC = container.createHealthCheckUseCase()\n\nconst report = await healthUC.execute({\n  tags: ['production'],\n  force: true\n})\n\nconsole.log(report)\n```\n\n### 旧版 API（完全兼容）\n```typescript\nconst { loadServers, checkAllServersHealth } = require('ops-maintenance')\n\nconst servers = await loadServers()\nconst results = await checkAllServersHealth()\n```\n\n---\n\n## 📊 性能提升\n\n基准测试（4 台服务器，3 次检查）：\n\n| 指标 | v1.x | v2.0 | 提升 |\n|------|------|------|------|\n| 首次检查耗时 | 8.2s | 6.1s | **25%** ↓ |\n| 重复检查（缓存）| 8.2s | 0.5s | **94%** ↓ |\n| SSH 连接数 | 4 → 4 | 4 → 1（复用）| **75%** ↓ |\n| 内存占用 | 45MB | 38MB | **15%** ↓ |\n\n---\n\n## 🛡️ 安全改进\n\n1. **密码不存文件** - 只通过环境变量传递\n2. **连接池 keepalive** - 减少密码传输次数\n3. **配置热加载** - 无需重启即可更新服务器列表\n4. **凭据提供者抽象** - 可集成密钥环（Keychain/Secret Service）\n\n---\n\n## 🎓 常见问题\n\n### Q: 旧代码需要修改吗？\nA: **完全不需要**，v2.0 保持 100% API 兼容。\n\n### Q: 如何启用连接池？\nA: 默认启用。通过 `useConnectionPool: false` 禁用：\n```typescript\nawait initContainer({ useConnectionPool: false })\n```\n\n### Q: 缓存如何工作？\nA: 默认 30 秒 TTL。同一服务器 30 秒内的检查直接返回缓存结果。\n\n### Q: 如何添加自定义检查策略？\nA:\n```typescript\nimport { IHealthCheckStrategy } from 'ops-maintenance'\n\nclass CustomCheck implements IHealthCheckStrategy {\n  name = 'custom'\n  priority = 5\n  isCritical() { return false }\n  async check(server, ssh) { /* ... */ }\n}\n\ncontainer.getHealthChecker().addStrategy(new CustomCheck())\n```\n\n---\n\n## 📈 后续规划\n\n- [ ] **告警系统** - 阈值触发，Webhook/邮件通知\n- [ ] **历史数据** - InfluxDB/Prometheus 集成\n- [ ] **Web Dashboard** - React 实时监控面板\n- [ ] **自动修复** - 磁盘满自动清理、服务异常自愈\n- [ ] **CMDB 同步** - 从云平台自动发现服务器\n\n---\n\n## 🤝 贡献\n\n欢迎提交 Issue 和 PR！\n\n## 📄 许可证\n\nISC\n\nFile v3.3.10:_meta.json\n\n{\n  \"ownerId\": \"kn76tyr0ztr0j5fyej0qbchjx584wwjp\",\n  \"slug\": \"ops-maintenance\",\n  \"version\": \"3.3.10\",\n  \"publishedAt\": 1788671006214\n}\n\nFile v3.3.10:doc/ARCHITECTURE.md\n\n# ops-maintenance 2.0 架构文档\n\n## 🏗️ 架构概览\n\n### 设计原则\n- **Clean Architecture**: 领域层独立，依赖方向向内\n- **依赖注入**: 所有依赖通过容器管理，易于测试\n- **单一职责**: 每个类/模块只做一件事\n- **可测试性**: 核心逻辑不依赖外部设施，易于单元测试\n\n### 分层结构\n\n```\nsrc-new/\n├── types.ts                    # 统一类型定义（简化版）\n├── config/\n│   ├── schemas.ts              # 完整类型定义（原版）\n│   ├── loader.ts               # ConfigManager - 配置管理\n│   ├── validator.ts            # Zod 验证\n│   └── ICredentialsProvider.ts # 凭据提供者接口\n├── core/\n│   ├── entities/               # 领域实体\n│   ├── repositories/           # 仓库接口\n│   └── usecases/               # 用例层（业务逻辑）\n├── infrastructure/\n│   ├── ssh/                    # SSH 客户端 & 连接池\n│   ├── cache/                  # 缓存实现\n│   ├── repositories/           # 仓库实现\n│   └── monitoring/             # 监控检查策略\n├── presentation/\n│   ├── formatters/             # 输出格式化器\n│   ├── cli/                    # CLI 命令解析\n│   └── LegacyAdapter.ts        # 向后兼容适配器\n├── container.ts                # 依赖注入容器\n├── legacy.ts                   # 旧版 API 兼容层\n├── index.ts                    # 新版应用入口\n└── exports.ts                  # 统一导出\n```\n\n---\n\n## 🔄 依赖关系\n\n```\n    ┌─────────────────┐\n    │  presentation   │  CLI / Formatter / LegacyAdapter\n    └────────┬────────┘\n             │ depends on\n    ┌────────▼────────┐\n    │    core/usecase │  HealthCheckUseCase, PasswordCheckUseCase\n    └────────┬────────┘\n             │ depends on\n    ┌────────▼────────┐\n    │  repositories   │  IServerRepository, ICacheRepository\n    └────────┬────────┘\n             │ depends on\n    ┌────────▼────────┐\n    │ infrastructure  │  SSHClient, Cache, ConfigManager\n    └─────────────────┘\n```\n\n---\n\n## 📦 核心模块说明\n\n### ConfigManager（配置管理）\n**职责**: 服务器配置的加载、验证、热重载、CRUD\n\n**特性**:\n- 自动加载 `~/.config/ops-maintenance/servers.json`\n- 文件监听（macOS/Linux 用 fs.watch，Windows 用轮询）\n- 配置变更事件通知\n- 运行时增删服务器（`add()`/`remove()`）\n\n**使用**:\n```typescript\nconst cm = new ConfigManager()\nawait cm.start()\ncm.on('change', () => console.log('配置已变更'))\nconst servers = cm.getAll()\nawait cm.add({ host: '1.2.3.4', user: 'root', password: 'xxx' })\n```\n\n### SSHClient（SSH 客户端）\n**职责**: 封装 ssh2 库，提供连接复用、认证、超时控制\n\n**特性**:\n- 连接池复用（`connections: Map`）\n- keepalive 自动保活\n- 命令执行超时控制\n- 凭据提供者模式（`ICredentialsProvider`）\n\n**凭据源优先级**:\n1. 环境变量 `OPS_CRED_<HOST>` 和 `OPS_KEY_<HOST>`\n2. 配置文件（扩展字段，不推荐生产）\n3. 默认 SSH 密钥 `~/.ssh/id_rsa` 等\n\n### ConnectionPool（连接池）\n**职责**: 管理多服务器连接生命周期\n\n**特性**:\n- 最大连接数限制（默认 10）\n- 空闲连接自动清理（5 分钟）\n- 连接最大存活时间（30 分钟）\n- 等待队列机制（并发满时排队）\n\n### Cache（缓存）\n**内存缓存**: TTL 自动清理，每分钟扫描过期项  \n**文件缓存**: 进程重启后缓存持久化  \n**分层缓存**: Memory + File 二级缓存\n\n### HealthChecker（健康检查策略）\n**策略模式**: 每个检查项是独立的 `IHealthCheckStrategy`\n\n| 策略 | 优先级 | 关键 | 说明 |\n|------|--------|------|------|\n| LoadAverageCheck | 1 | ✅ | 1/5/15 分钟负载 |\n| MemoryCheck | 2 | ✅ | 内存使用率 |\n| DiskCheck | 3 | ✅ | 根分区使用率 |\n| ServiceStatusCheck | 4 | ❌ | nginx/docker 等 |\n\n支持自定义策略，通过 `HealthChecker.addStrategy()` 注入。\n\n### ThresholdChecker（阈值检查）\n**环境感知**: production/staging/development 不同阈值\n\nThresholdConfig:\n```typescript\n{\n  diskWarning: 80, diskCritical: 90,\n  memoryWarning: 80, memoryCritical: 90,\n  swapWarning: 70, swapCritical: 90,\n  loadWarningMultiplier: 1.0, loadCriticalMultiplier: 2.0\n}\n```\n\n### UseCases（用例层）\n**单一职责**:\n- `HealthCheckUseCase` - 协调检查所有服务器\n- `PasswordCheckUseCase` - 密码过期检查\n- `DiskCheckUseCase` - 磁盘使用分析\n\n**输入/输出**:\n```typescript\ninterface HealthCheckInput {\n  tags?: string[]\n  servers?: Server[]\n  force?: boolean\n  services?: string[]\n}\n```\n\n### LegacyAdapter（向后兼容）\n**目标**: 旧版 `index.ts` 导出的所有函数保持不变\n\n旧版代码无需修改即可使用新架构：\n```typescript\n// 旧代码\nconst { loadServers, checkAllServersHealth } = require('./dist/index')\n// 底层实际调用 LegacyAdapter\n```\n\n---\n\n## 🔐 凭据管理\n\n### 环境变量（推荐）\n\n```bash\n# 密码认证（格式：user:password 或仅 password）\nexport OPS_CRED_10_119_120_143=\"salt:Giten!#202501Tab*&\"\nexport OPS_CRED_10_111_66_177=\"salt:another_password\"\n\n# 密钥认证（私钥文件路径）\nexport OPS_KEY_10_119_120_143=\"/home/user/.ssh/id_rsa\"\n```\n\n### 配置文件格式\n\n`~/.config/ops-maintenance/servers.json`:\n```json\n[\n  {\n    \"host\": \"10.119.120.143\",\n    \"port\": 22,\n    \"user\": \"salt\",\n    \"name\": \"DM裸金属服务器\",\n    \"tags\": [\"DB\", \"production\"]\n  }\n]\n```\n密码/密钥**不存储**在配置文件中，通过环境变量注入。\n\n---\n\n## 🎯 使用示例\n\n### 新架构（推荐）\n\n```typescript\nimport { Container, Server, HealthCheckUseCase } from 'ops-maintenance'\n\n// 初始化容器\nconst container = await initContainer({\n  configPath: '/path/to/servers.json',\n  environment: 'production',\n  cacheTTL: 30\n})\n\n// 创建用例\nconst healthUseCase = container.createHealthCheckUseCase()\n\n// 执行检查\nconst report = await healthUseCase.execute({\n  tags: ['production'],\n  force: false\n})\n\nconsole.log(`健康: ${report.healthy}, 警告: ${report.warning}, 离线: ${report.offline}`)\n```\n\n### 旧版 API（向后兼容）\n\n```typescript\n// 与旧版完全相同的调用方式\nconst { loadServers, checkAllServersHealth } = require('ops-maintenance')\n\nconst servers = await loadServers()\nconst results = await checkAllServersHealth(['production'])\n```\n\n---\n\n## 🧪 测试策略\n\n### 单元测试（Jest）\n- ConfigManager 解析配置\n- ThresholdChecker 阈值判断\n- SSHClient 连接逻辑（Mock ssh2）\n\n### 集成测试\n- 使用 Docker 模拟真实服务器\n- 端到端完整流程\n\n### 覆盖率目标\n- 核心模块 ≥80%\n- 使用 `npm run test:coverage`\n\n---\n\n## 📈 性能优化\n\n| 优化项 | 当前 | 目标 | 收益 |\n|--------|------|------|------|\n| SSH 连接复用 | ❌ | ✅ | 减少 70% 握手开销 |\n| 结果缓存 | ❌ | ✅ 30s TTL | 减少 50% SSH 调用 |\n| 并发控制 | Promise.all | 信号量 | 避免压垮服务器 |\n| 配置热加载 | ❌ | ✅ | 无需重启更新配置 |\n\n---\n\n## 🚀 迁移指南\n\n### 从 v1.x 迁移到 v2.0\n\n**无需修改代码**，v2.0 完全向后兼容。\n\n如需使用新 API：\n```typescript\n// v1.x\nconst { checkAllServersHealth } = require('ops-maintenance')\n\n// v2.0（新 API）\nimport { Container, HealthCheckUseCase } from 'ops-maintenance'\nconst container = await initContainer()\nconst useCase = container.createHealthCheckUseCase()\nconst report = await useCase.execute({ tags: ['production'] })\n```\n\n---\n\n## 📝 待办事项\n\n- [ ] Phase 2: 完成所有 UseCases 实现（日志、性能、端口、进程）\n- [ ] Phase 2: 编写单元测试（≥80% 覆盖率）\n- [ ] Phase 2: 告警系统（Webhook、邮件）\n- [ ] Phase 3: 性能压测（50+ 服务器）\n- [ ] Phase 3: 文档完善（API 文档、示例）\n- [ ] Phase 3: 发布 v2.0.0\n\n---\n\n**维护者**: Claude Code  \n**最后更新**: 2026-04-09\n\nFile v3.3.10:skill-card.md\n\n## Description:\n\nOps Maintenance helps agents inspect local, remote, and clustered servers for health, logs, performance, ports, processes, disk usage, password expiry, networking, reporting, audit logs, Docker health, SSL certificates, and security posture.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[fish1981bimmer](https://clawhub.ai/user/fish1981bimmer)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and operations engineers use this skill to ask an agent to run or plan operational checks across local and SSH-accessible servers. It supports health monitoring, log analysis, security audits, network diagnostics, Docker and SSL checks, alerting, scheduled patrols, and maintenance reports.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can provide administrative visibility into local and remote systems.\n\nMitigation: Install only for users who need that access, use a dedicated low-privilege SSH account, and limit configured servers to the intended maintenance scope.\n\nRisk: Fleet command execution against production systems can create operational impact if a command is wrong or too broad.\n\nMitigation: Review the exact command and target group before running fleet execution, especially for production hosts.\n\nRisk: Credentials, alert tokens, SMTP passwords, configuration snapshots, and audit logs can expose sensitive operational data.\n\nMitigation: Prefer key-based authentication, avoid password authentication, avoid saving alert or SMTP secrets in config files, verify host keys outside the skill, and treat generated logs and snapshots as sensitive files.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/fish1981bimmer/skills/ops-maintenance)\n- [Architecture documentation](artifact/doc/ARCHITECTURE.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with command output, tables, JSON snippets, and inline shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include sensitive operational findings, configuration snapshots, audit log summaries, and remote command results.]\n\n## Skill Version(s):\n\n3.3.10 (source: server release metadata, package.json, target metadata; artifact skill frontmatter differs)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v3.3.10:coverage/coverage-final.json\n\n{\"/Users/a1234/.openclaw/workspace/ops-maintenance/src-new/config/schemas.ts\": {\"path\":\"/Users/a1234/.openclaw/workspace/ops-maintenance/src-new/config/schemas.ts\",\"statementMap\":{\"0\":{\"start\":{\"line\":29,\"column\":0},\"end\":{\"line\":29,\"column\":null}},\"1\":{\"start\":{\"line\":30,\"column\":2},\"end\":{\"line\":30,\"column\":null}},\"2\":{\"start\":{\"line\":31,\"column\":2},\"end\":{\"line\":31,\"column\":null}},\"3\":{\"start\":{\"line\":32,\"column\":2},\"end\":{\"line\":32,\"column\":null}},\"4\":{\"start\":{\"line\":33,\"column\":2},\"end\":{\"line\":33,\"column\":null}},\"5\":{\"start\":{\"line\":41,\"column\":20},\"end\":{\"line\":41,\"column\":30}},\"6\":{\"start\":{\"line\":42,\"column\":20},\"end\":{\"line\":42,\"column\":32}},\"7\":{\"start\":{\"line\":43,\"column\":20},\"end\":{\"line\":43,\"column\":32}},\"8\":{\"start\":{\"line\":44,\"column\":20},\"end\":{\"line\":44,\"column\":32}},\"9\":{\"start\":{\"line\":45,\"column\":20},\"end\":{\"line\":45,\"column\":33}},\"10\":{\"start\":{\"line\":46,\"column\":20},\"end\":{\"line\":46,\"column\":37}},\"11\":{\"start\":{\"line\":53,\"column\":15},\"end\":{\"line\":53,\"column\":77}},\"12\":{\"start\":{\"line\":54,\"column\":4},\"end\":{\"line\":61,\"column\":null}},\"13\":{\"start\":{\"line\":68,\"column\":4},\"end\":{\"line\":68,\"column\":null}},\"14\":{\"start\":{\"line\":75,\"column\":4},\"end\":{\"line\":75,\"column\":null}},\"15\":{\"start\":{\"line\":82,\"column\":4},\"end\":{\"line\":82,\"column\":null}},\"16\":{\"start\":{\"line\":39,\"column\":0},\"end\":{\"line\":39,\"column\":13}},\"17\":{\"start\":{\"line\":127,\"column\":20},\"end\":{\"line\":127,\"column\":34}},\"18\":{\"start\":{\"line\":128,\"column\":20},\"end\":{\"line\":128,\"column\":40}},\"19\":{\"start\":{\"line\":129,\"column\":20},\"end\":{\"line\":129,\"column\":43}},\"20\":{\"start\":{\"line\":130,\"column\":20},\"end\":{\"line\":130,\"column\":46}},\"21\":{\"start\":{\"line\":131,\"column\":20},\"end\":{\"line\":131,\"column\":38}},\"22\":{\"start\":{\"line\":132,\"column\":20},\"end\":{\"line\":132,\"column\":34}},\"23\":{\"start\":{\"line\":139,\"column\":4},\"end\":{\"line\":139,\"column\":null}},\"24\":{\"start\":{\"line\":143,\"column\":4},\"end\":{\"line\":143,\"column\":null}},\"25\":{\"start\":{\"line\":147,\"column\":4},\"end\":{\"line\":147,\"column\":null}},\"26\":{\"start\":{\"line\":154,\"column\":4},\"end\":{\"line\":154,\"column\":null}},\"27\":{\"start\":{\"line\":161,\"column\":4},\"end\":{\"line\":161,\"column\":null}},\"28\":{\"start\":{\"line\":161,\"column\":23},\"end\":{\"line\":161,\"column\":null}},\"29\":{\"start\":{\"line\":162,\"column\":28},\"end\":{\"line\":162,\"column\":47}},\"30\":{\"start\":{\"line\":163,\"column\":4},\"end\":{\"line\":163,\"column\":null}},\"31\":{\"start\":{\"line\":170,\"column\":4},\"end\":{\"line\":170,\"column\":null}},\"32\":{\"start\":{\"line\":170,\"column\":23},\"end\":{\"line\":170,\"column\":null}},\"33\":{\"start\":{\"line\":171,\"column\":36},\"end\":{\"line\":171,\"column\":55}},\"34\":{\"start\":{\"line\":172,\"column\":4},\"end\":{\"line\":172,\"column\":null}},\"35\":{\"start\":{\"line\":172,\"column\":25},\"end\":{\"line\":172,\"column\":null}},\"36\":{\"start\":{\"line\":173,\"column\":4},\"end\":{\"line\":173,\"column\":null}},\"37\":{\"start\":{\"line\":125,\"column\":0},\"end\":{\"line\":125,\"column\":13}},\"38\":{\"start\":{\"line\":198,\"column\":4},\"end\":{\"line\":198,\"column\":null}},\"39\":{\"start\":{\"line\":195,\"column\":20},\"end\":{\"line\":195,\"column\":34}},\"40\":{\"start\":{\"line\":196,\"column\":20},\"end\":{\"line\":196,\"column\":31}},\"41\":{\"start\":{\"line\":199,\"column\":4},\"end\":{\"line\":199,\"column\":null}},\"42\":{\"start\":{\"line\":192,\"column\":0},\"end\":{\"line\":192,\"column\":13}}},\"fnMap\":{\"0\":{\"name\":\"(anonymous_0)\",\"decl\":{\"start\":{\"line\":29,\"column\":0},\"end\":{\"line\":29,\"column\":12}},\"loc\":{\"start\":{\"line\":29,\"column\":24},\"end\":{\"line\":34,\"column\":1}}},\"1\":{\"name\":\"(anonymous_1)\",\"decl\":{\"start\":{\"line\":40,\"column\":2},\"end\":{\"line\":40,\"column\":null}},\"loc\":{\"start\":{\"line\":46,\"column\":39},\"end\":{\"line\":47,\"column\":6}}},\"2\":{\"name\":\"(anonymous_2)\",\"decl\":{\"start\":{\"line\":52,\"column\":2},\"end\":{\"line\":52,\"column\":8}},\"loc\":{\"start\":{\"line\":52,\"column\":54},\"end\":{\"line\":62,\"column\":3}}},\"3\":{\"name\":\"(anonymous_3)\",\"decl\":{\"start\":{\"line\":67,\"column\":2},\"end\":{\"line\":67,\"column\":8}},\"loc\":{\"start\":{\"line\":67,\"column\":8},\"end\":{\"line\":69,\"column\":3}}},\"4\":{\"name\":\"(anonymous_4)\",\"decl\":{\"start\":{\"line\":74,\"column\":2},\"end\":{\"line\":74,\"column\":8}},\"loc\":{\"start\":{\"line\":74,\"column\":20},\"end\":{\"line\":76,\"column\":3}}},\"5\":{\"name\":\"(anonymous_5)\",\"decl\":{\"start\":{\"line\":81,\"column\":2},\"end\":{\"line\":81,\"column\":16}},\"loc\":{\"start\":{\"line\":81,\"column\":16},\"end\":{\"line\":83,\"column\":3}}},\"6\":{\"name\":\"(anonymous_6)\",\"decl\":{\"start\":{\"line\":126,\"column\":2},\"end\":{\"line\":126,\"column\":null}},\"loc\":{\"start\":{\"line\":132,\"column\":34},\"end\":{\"line\":133,\"column\":6}}},\"7\":{\"name\":\"(anonymous_7)\",\"decl\":{\"start\":{\"line\":138,\"column\":2},\"end\":{\"line\":138,\"column\":8}},\"loc\":{\"start\":{\"line\":138,\"column\":82},\"end\":{\"line\":140,\"column\":3}}},\"8\":{\"name\":\"(anonymous_8)\",\"decl\":{\"start\":{\"line\":142,\"column\":2},\"end\":{\"line\":142,\"column\":8}},\"loc\":{\"start\":{\"line\":142,\"column\":99},\"end\":{\"line\":144,\"column\":3}}},\"9\":{\"name\":\"(anonymous_9)\",\"decl\":{\"start\":{\"line\":146,\"column\":2},\"end\":{\"line\":146,\"column\":8}},\"loc\":{\"start\":{\"line\":146,\"column\":46},\"end\":{\"line\":148,\"column\":3}}},\"10\":{\"name\":\"(anonymous_10)\",\"decl\":{\"start\":{\"line\":153,\"column\":2},\"end\":{\"line\":153,\"column\":21}},\"loc\":{\"start\":{\"line\":153,\"column\":21},\"end\":{\"line\":155,\"column\":3}}},\"11\":{\"name\":\"(anonymous_11)\",\"decl\":{\"start\":{\"line\":160,\"column\":2},\"end\":{\"line\":160,\"column\":23}},\"loc\":{\"start\":{\"line\":160,\"column\":23},\"end\":{\"line\":164,\"column\":3}}},\"12\":{\"name\":\"(anonymous_12)\",\"decl\":{\"start\":{\"line\":169,\"column\":2},\"end\":{\"line\":169,\"column\":21}},\"loc\":{\"start\":{\"line\":169,\"column\":21},\"end\":{\"line\":174,\"column\":3}}},\"13\":{\"name\":\"(anonymous_13)\",\"decl\":{\"start\":{\"line\":193,\"column\":2},\"end\":{\"line\":193,\"column\":null}},\"loc\":{\"start\":{\"line\":196,\"column\":31},\"end\":{\"line\":200,\"column\":3}}}},\"branchMap\":{\"0\":{\"loc\":{\"start\":{\"line\":29,\"column\":12},\"end\":{\"line\":29,\"column\":null}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":29,\"column\":12},\"end\":{\"line\":29,\"column\":24}},{\"start\":{\"line\":29,\"column\":24},\"end\":{\"line\":29,\"column\":null}}]},\"1\":{\"loc\":{\"start\":{\"line\":46,\"column\":20},\"end\":{\"line\":46,\"column\":39}},\"type\":\"default-arg\",\"locations\":[{\"start\":{\"line\":46,\"column\":37},\"end\":{\"line\":46,\"column\":39}}]},\"2\":{\"loc\":{\"start\":{\"line\":53,\"column\":33},\"end\":{\"line\":53,\"column\":50}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":53,\"column\":33},\"end\":{\"line\":53,\"column\":44}},{\"start\":{\"line\":53,\"column\":48},\"end\":{\"line\":53,\"column\":50}}]},\"3\":{\"loc\":{\"start\":{\"line\":53,\"column\":54},\"end\":{\"line\":53,\"column\":75}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":53,\"column\":54},\"end\":{\"line\":53,\"column\":65}},{\"start\":{\"line\":53,\"column\":69},\"end\":{\"line\":53,\"column\":75}}]},\"4\":{\"loc\":{\"start\":{\"line\":57,\"column\":6},\"end\":{\"line\":57,\"column\":23}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":57,\"column\":6},\"end\":{\"line\":57,\"column\":17}},{\"start\":{\"line\":57,\"column\":21},\"end\":{\"line\":57,\"column\":23}}]},\"5\":{\"loc\":{\"start\":{\"line\":58,\"column\":6},\"end\":{\"line\":58,\"column\":27}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":58,\"column\":6},\"end\":{\"line\":58,\"column\":17}},{\"start\":{\"line\":58,\"column\":21},\"end\":{\"line\":58,\"column\":27}}]},\"6\":{\"loc\":{\"start\":{\"line\":59,\"column\":6},\"end\":{\"line\":59,\"column\":71}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":59,\"column\":6},\"end\":{\"line\":59,\"column\":17}},{\"start\":{\"line\":59,\"column\":21},\"end\":{\"line\":59,\"column\":71}}]},\"7\":{\"loc\":{\"start\":{\"line\":59,\"column\":31},\"end\":{\"line\":59,\"column\":69}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":59,\"column\":31},\"end\":{\"line\":59,\"column\":34}},{\"start\":{\"line\":59,\"column\":38},\"end\":{\"line\":59,\"column\":69}}]},\"8\":{\"loc\":{\"start\":{\"line\":60,\"column\":6},\"end\":{\"line\":60,\"column\":23}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":60,\"column\":6},\"end\":{\"line\":60,\"column\":17}},{\"start\":{\"line\":60,\"column\":21},\"end\":{\"line\":60,\"column\":23}}]},\"9\":{\"loc\":{\"start\":{\"line\":82,\"column\":11},\"end\":{\"line\":82,\"column\":33}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":82,\"column\":11},\"end\":{\"line\":82,\"column\":20}},{\"start\":{\"line\":82,\"column\":24},\"end\":{\"line\":82,\"column\":33}}]},\"10\":{\"loc\":{\"start\":{\"line\":131,\"column\":20},\"end\":{\"line\":131,\"column\":48}},\"type\":\"default-arg\",\"locations\":[{\"start\":{\"line\":131,\"column\":38},\"end\":{\"line\":131,\"column\":48}}]},\"11\":{\"loc\":{\"start\":{\"line\":154,\"column\":11},\"end\":{\"line\":154,\"column\":47}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":154,\"column\":11},\"end\":{\"line\":154,\"column\":42}},{\"start\":{\"line\":154,\"column\":46},\"end\":{\"line\":154,\"column\":47}}]},\"12\":{\"loc\":{\"start\":{\"line\":161,\"column\":4},\"end\":{\"line\":161,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":161,\"column\":4},\"end\":{\"line\":161,\"column\":null}}]},\"13\":{\"loc\":{\"start\":{\"line\":170,\"column\":4},\"end\":{\"line\":170,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":170,\"column\":4},\"end\":{\"line\":170,\"column\":null}}]},\"14\":{\"loc\":{\"start\":{\"line\":172,\"column\":4},\"end\":{\"line\":172,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":172,\"column\":4},\"end\":{\"line\":172,\"column\":null}}]}},\"s\":{\"0\":1,\"1\":1,\"2\":1,\"3\":1,\"4\":1,\"5\":0,\"6\":0,\"7\":0,\"8\":0,\"9\":0,\"10\":0,\"11\":0,\"12\":0,\"13\":0,\"14\":0,\"15\":0,\"16\":1,\"17\":0,\"18\":0,\"19\":0,\"20\":0,\"21\":0,\"22\":0,\"23\":0,\"24\":0,\"25\":0,\"26\":0,\"27\":0,\"28\":0,\"29\":0,\"30\":0,\"31\":0,\"32\":0,\"33\":0,\"34\":0,\"35\":0,\"36\":0,\"37\":1,\"38\":0,\"39\":0,\"40\":0,\"41\":0,\"42\":1},\"f\":{\"0\":1,\"1\":0,\"2\":0,\"3\":0,\"4\":0,\"5\":0,\"6\":0,\"7\":0,\"8\":0,\"9\":0,\"10\":0,\"11\":0,\"12\":0,\"13\":0},\"b\":{\"0\":[1,1],\"1\":[0],\"2\":[0,0],\"3\":[0,0],\"4\":[0,0],\"5\":[0,0],\"6\":[0,0],\"7\":[0,0],\"8\":[0,0],\"9\":[0,0],\"10\":[0],\"11\":[0,0],\"12\":[0],\"13\":[0],\"14\":[0]}}\n,\"/Users/a1234/.openclaw/workspace/ops-maintenance/src-new/infrastructure/notifiers/EmailNotifier.ts\": {\"path\":\"/Users/a1234/.openclaw/workspace/ops-maintenance/src-new/infrastructure/notifiers/EmailNotifier.ts\",\"statementMap\":{\"0\":{\"start\":{\"line\":127,\"column\":0},\"end\":{\"line\":127,\"column\":16}},\"1\":{\"start\":{\"line\":5,\"column\":0},\"end\":{\"line\":5,\"column\":35}},\"2\":{\"start\":{\"line\":8,\"column\":0},\"end\":{\"line\":8,\"column\":51}},\"3\":{\"start\":{\"line\":9,\"column\":0},\"end\":{\"line\":9,\"column\":43}},\"4\":{\"start\":{\"line\":11,\"column\":57},\"end\":{\"line\":17,\"column\":null}},\"5\":{\"start\":{\"line\":20,\"column\":10},\"end\":{\"line\":20,\"column\":null}},\"6\":{\"start\":{\"line\":22,\"column\":10},\"end\":{\"line\":22,\"column\":null}},\"7\":{\"start\":{\"line\":25,\"column\":4},\"end\":{\"line\":25,\"column\":null}},\"8\":{\"start\":{\"line\":32,\"column\":4},\"end\":{\"line\":32,\"column\":32}},\"9\":{\"start\":{\"line\":32,\"column\":26},\"end\":{\"line\":32,\"column\":32}},\"10\":{\"start\":{\"line\":34,\"column\":4},\"end\":{\"line\":42,\"column\":null}},\"11\":{\"start\":{\"line\":45,\"column\":17},\"end\":{\"line\":45,\"column\":48}},\"12\":{\"start\":{\"line\":46,\"column\":4},\"end\":{\"line\":46,\"column\":null}},\"13\":{\"start\":{\"line\":54,\"column\":4},\"end\":{\"line\":57,\"column\":5}},\"14\":{\"start\":{\"line\":55,\"column\":6},\"end\":{\"line\":55,\"column\":null}},\"15\":{\"start\":{\"line\":56,\"column\":6},\"end\":{\"line\":56,\"column\":12}},\"16\":{\"start\":{\"line\":59,\"column\":4},\"end\":{\"line\":61,\"column\":5}},\"17\":{\"start\":{\"line\":60,\"column\":6},\"end\":{\"line\":60,\"column\":null}},\"18\":{\"start\":{\"line\":63,\"column\":4},\"end\":{\"line\":63,\"column\":33}},\"19\":{\"start\":{\"line\":63,\"column\":27},\"end\":{\"line\":63,\"column\":33}},\"20\":{\"start\":{\"line\":64,\"column\":20},\"end\":{\"line\":64,\"column\":66}},\"21\":{\"start\":{\"line\":65,\"column\":18},\"end\":{\"line\":65,\"column\":81}},\"22\":{\"start\":{\"line\":66,\"column\":17},\"end\":{\"line\":66,\"column\":87}},\"23\":{\"start\":{\"line\":67,\"column\":41},\"end\":{\"line\":72,\"column\":null}},\"24\":{\"start\":{\"line\":73,\"column\":4},\"end\":{\"line\":79,\"column\":5}},\"25\":{\"start\":{\"line\":74,\"column\":19},\"end\":{\"line\":74,\"column\":63}},\"26\":{\"start\":{\"line\":75,\"column\":6},\"end\":{\"line\":75,\"column\":null}},\"27\":{\"start\":{\"line\":77,\"column\":6},\"end\":{\"line\":77,\"column\":null}},\"28\":{\"start\":{\"line\":78,\"column\":6},\"end\":{\"line\":78,\"column\":null}},\"29\":{\"start\":{\"line\":86,\"column\":4},\"end\":{\"line\":93,\"column\":5}},\"30\":{\"start\":{\"line\":88,\"column\":23},\"end\":{\"line\":88,\"column\":63}},\"31\":{\"start\":{\"line\":89,\"column\":6},\"end\":{\"line\":92,\"column\":7}},\"32\":{\"start\":{\"line\":90,\"column\":8},\"end\":{\"line\":90,\"column\":null}},\"33\":{\"start\":{\"line\":91,\"column\":8},\"end\":{\"line\":91,\"column\":14}},\"34\":{\"start\":{\"line\":95,\"column\":28},\"end\":{\"line\":95,\"column\":30}},\"35\":{\"start\":{\"line\":96,\"column\":4},\"end\":{\"line\":96,\"column\":null}},\"36\":{\"start\":{\"line\":97,\"column\":4},\"end\":{\"line\":97,\"column\":null}},\"37\":{\"start\":{\"line\":98,\"column\":4},\"end\":{\"line\":98,\"column\":null}},\"38\":{\"start\":{\"line\":100,\"column\":4},\"end\":{\"line\":110,\"column\":5}},\"39\":{\"start\":{\"line\":101,\"column\":19},\"end\":{\"line\":101,\"column\":117}},\"40\":{\"start\":{\"line\":102,\"column\":6},\"end\":{\"line\":102,\"column\":null}},\"41\":{\"start\":{\"line\":104,\"column\":6},\"end\":{\"line\":109,\"column\":7}},\"42\":{\"start\":{\"line\":105,\"column\":21},\"end\":{\"line\":105,\"column\":49}},\"43\":{\"start\":{\"line\":106,\"column\":20},\"end\":{\"line\":106,\"column\":50}},\"44\":{\"start\":{\"line\":107,\"column\":8},\"end\":{\"line\":107,\"column\":null}},\"45\":{\"start\":{\"line\":107,\"column\":23},\"end\":{\"line\":107,\"column\":null}},\"46\":{\"start\":{\"line\":108,\"column\":8},\"end\":{\"line\":108,\"column\":null}},\"47\":{\"start\":{\"line\":108,\"column\":22},\"end\":{\"line\":108,\"column\":null}},\"48\":{\"start\":{\"line\":112,\"column\":18},\"end\":{\"line\":112,\"column\":88}},\"49\":{\"start\":{\"line\":113,\"column\":4},\"end\":{\"line\":113,\"column\":null}},\"50\":{\"start\":{\"line\":120,\"column\":4},\"end\":{\"line\":123,\"column\":5}},\"51\":{\"start\":{\"line\":121,\"column\":6},\"end\":{\"line\":121,\"column\":null}},\"52\":{\"start\":{\"line\":122,\"column\":6},\"end\":{\"line\":122,\"column\":null}},\"53\":{\"start\":{\"line\":19,\"column\":0},\"end\":{\"line\":19,\"column\":13}},\"54\":{\"start\":{\"line\":128,\"column\":2},\"end\":{\"line\":128,\"column\":null}}},\"fnMap\":{\"0\":{\"name\":\"(anonymous_1)\",\"decl\":{\"start\":{\"line\":24,\"column\":2},\"end\":{\"line\":24,\"column\":14}},\"loc\":{\"start\":{\"line\":24,\"column\":47},\"end\":{\"line\":26,\"column\":3}}},\"1\":{\"name\":\"(anonymous_2)\",\"decl\":{\"start\":{\"line\":31,\"column\":2},\"end\":{\"line\":31,\"column\":7}},\"loc\":{\"start\":{\"line\":31,\"column\":12},\"end\":{\"line\":47,\"column\":3}}},\"2\":{\"name\":\"(anonymous_3)\",\"decl\":{\"start\":{\"line\":52,\"column\":2},\"end\":{\"line\":52,\"column\":7}},\"loc\":{\"start\":{\"line\":52,\"column\":85},\"end\":{\"line\":80,\"column\":3}}},\"3\":{\"name\":\"(anonymous_4)\",\"decl\":{\"start\":{\"line\":85,\"column\":2},\"end\":{\"line\":85,\"column\":7}},\"loc\":{\"start\":{\"line\":85,\"column\":45},\"end\":{\"line\":114,\"column\":3}}},\"4\":{\"name\":\"(anonymous_5)\",\"decl\":{\"start\":{\"line\":119,\"column\":2},\"end\":{\"line\":119,\"column\":7}},\"loc\":{\"start\":{\"line\":119,\"column\":13},\"end\":{\"line\":124,\"column\":3}}},\"5\":{\"name\":\"createEmailNotifier\",\"decl\":{\"start\":{\"line\":127,\"column\":16},\"end\":{\"line\":127,\"column\":35}},\"loc\":{\"start\":{\"line\":127,\"column\":64},\"end\":{\"line\":129,\"column\":1}}}},\"branchMap\":{\"0\":{\"loc\":{\"start\":{\"line\":24,\"column\":14},\"end\":{\"line\":24,\"column\":47}},\"type\":\"default-arg\",\"locations\":[{\"start\":{\"line\":24,\"column\":45},\"end\":{\"line\":24,\"column\":47}}]},\"1\":{\"loc\":{\"start\":{\"line\":32,\"column\":4},\"end\":{\"line\":32,\"column\":32}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":32,\"column\":4},\"end\":{\"line\":32,\"column\":32}}]},\"2\":{\"loc\":{\"start\":{\"line\":54,\"column\":4},\"end\":{\"line\":57,\"column\":5}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":54,\"column\":4},\"end\":{\"line\":57,\"column\":5}}]},\"3\":{\"loc\":{\"start\":{\"line\":54,\"column\":8},\"end\":{\"line\":54,\"column\":50}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":54,\"column\":8},\"end\":{\"line\":54,\"column\":25}},{\"start\":{\"line\":54,\"column\":29},\"end\":{\"line\":54,\"column\":50}}]},\"4\":{\"loc\":{\"start\":{\"line\":59,\"column\":4},\"end\":{\"line\":61,\"column\":5}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":59,\"column\":4},\"end\":{\"line\":61,\"column\":5}}]},\"5\":{\"loc\":{\"start\":{\"line\":63,\"column\":4},\"end\":{\"line\":63,\"column\":33}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":63,\"column\":4},\"end\":{\"line\":63,\"column\":33}}]},\"6\":{\"loc\":{\"start\":{\"line\":65,\"column\":18},\"end\":{\"line\":65,\"column\":81}},\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":65,\"column\":41},\"end\":{\"line\":65,\"column\":45}},{\"start\":{\"line\":65,\"column\":48},\"end\":{\"line\":65,\"column\":81}}]},\"7\":{\"loc\":{\"start\":{\"line\":65,\"column\":48},\"end\":{\"line\":65,\"column\":81}},\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":65,\"column\":70},\"end\":{\"line\":65,\"column\":74}},{\"start\":{\"line\":65,\"column\":77},\"end\":{\"line\":65,\"column\":81}}]},\"8\":{\"loc\":{\"start\":{\"line\":68,\"column\":12},\"end\":{\"line\":68,\"column\":48}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":68,\"column\":12},\"end\":{\"line\":68,\"column\":28}},{\"start\":{\"line\":68,\"column\":32},\"end\":{\"line\":68,\"column\":48}}]},\"9\":{\"loc\":{\"start\":{\"line\":86,\"column\":4},\"end\":{\"line\":93,\"column\":5}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":86,\"column\":4},\"end\":{\"line\":93,\"column\":5}}]},\"10\":{\"loc\":{\"start\":{\"line\":88,\"column\":23},\"end\":{\"line\":88,\"column\":63}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":88,\"column\":23},\"end\":{\"line\":88,\"column\":41}},{\"start\":{\"line\":88,\"column\":45},\"end\":{\"line\":88,\"column\":63}}]},\"11\":{\"loc\":{\"start\":{\"line\":89,\"column\":6},\"end\":{\"line\":92,\"column\":7}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":89,\"column\":6},\"end\":{\"line\":92,\"column\":7}}]},\"12\":{\"loc\":{\"start\":{\"line\":101,\"column\":19},\"end\":{\"line\":101,\"column\":117}},\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":101,\"column\":60},\"end\":{\"line\":101,\"column\":63}},{\"start\":{\"line\":101,\"column\":66},\"end\":{\"line\":101,\"column\":117}}]},\"13\":{\"loc\":{\"start\":{\"line\":101,\"column\":66},\"end\":{\"line\":101,\"column\":117}},\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":101,\"column\":107},\"end\":{\"line\":101,\"column\":111}},{\"start\":{\"line\":101,\"column\":114},\"end\":{\"line\":101,\"column\":117}}]},\"14\":{\"loc\":{\"start\":{\"line\":104,\"column\":6},\"end\":{\"line\":109,\"column\":7}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":104,\"column\":6},\"end\":{\"line\":109,\"column\":7}}]},\"15\":{\"loc\":{\"start\":{\"line\":107,\"column\":8},\"end\":{\"line\":107,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":107,\"column\":8},\"end\":{\"line\":107,\"column\":null}}]},\"16\":{\"loc\":{\"start\":{\"line\":108,\"column\":8},\"end\":{\"line\":108,\"column\":null}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":108,\"column\":8},\"end\":{\"line\":108,\"column\":null}}]},\"17\":{\"loc\":{\"start\":{\"line\":112,\"column\":18},\"end\":{\"line\":112,\"column\":88}},\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":112,\"column\":39},\"end\":{\"line\":112,\"column\":48}},{\"start\":{\"line\":112,\"column\":51},\"end\":{\"line\":112,\"column\":88}}]},\"18\":{\"loc\":{\"start\":{\"line\":112,\"column\":51},\"end\":{\"line\":112,\"column\":88}},\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":112,\"column\":72},\"end\":{\"line\":112,\"column\":79}},{\"start\":{\"line\":112,\"column\":82},\"end\":{\"line\":112,\"column\":88}}]},\"19\":{\"loc\":{\"start\":{\"line\":113,\"column\":47},\"end\":{\"line\":113,\"column\":90}},\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":113,\"column\":68},\"end\":{\"line\":113,\"column\":78}},{\"start\":{\"line\":113,\"column\":81},\"end\":{\"line\":113,\"column\":90}}]},\"20\":{\"loc\":{\"start\":{\"line\":120,\"column\":4},\"end\":{\"line\":123,\"column\":5}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":120,\"column\":4},\"end\":{\"line\":123,\"column\":5}}]}},\"s\":{\"0\":1,\"1\":1,\"2\":1,\"3\":1,\"4\":1,\"5\":4,\"6\":4,\"7\":4,\"8\":0,\"9\":0,\"10\":0,\"11\":0,\"12\":0,\"13\":3,\"14\":1,\"15\":1,\"16\":2,\"17\":0,\"18\":2,\"19\":0,\"20\":2,\"21\":2,\"22\":2,\"23\":2,\"24\":2,\"25\":2,\"26\":2,\"27\":0,\"28\":0,\"29\":0,\"30\":0,\"31\":0,\"32\":0,\"33\":0,\"34\":0,\"35\":0,\"36\":0,\"37\":0,\"38\":0,\"39\":0,\"40\":0,\"41\":0,\"42\":0,\"43\":0,\"44\":0,\"45\":0,\"46\":0,\"47\":0,\"48\":0,\"49\":0,\"50\":0,\"51\":0,\"52\":0,\"53\":1,\"54\":0},\"f\":{\"0\":4,\"1\":0,\"2\":3,\"3\":0,\"4\":0,\"5\":0},\"b\":{\"0\":[1],\"1\":[0],\"2\":[1],\"3\":[3,2],\"4\":[0],\"5\":[0],\"6\":[1,1],\"7\":[0,1],\"8\":[2,0],\"9\":[0],\"10\":[0,0],\"11\":[0],\"12\":[0,0],\"13\":[0,0],\"14\":[0],\"15\":[0],\"16\":[0],\"17\":[0,0],\"18\":[0,0],\"19\":[0,0],\"20\":[0]}}\n,\"/Users/a1234/.openclaw/workspace/ops-maintenance/src-new/utils/logger.ts\": {\"path\":\"/Users/a1234/.openclaw/workspace/ops-maintenance/src-new/utils/logger.ts\",\"statementMap\":{\"0\":{\"start\":{\"line\":6,\"column\":0},\"end\":{\"line\":6,\"column\":29}},\"1\":{\"start\":{\"line\":11,\"column\":0},\"end\":{\"line\":11,\"column\":null}},\"2\":{\"start\":{\"line\":12,\"column\":2},\"end\":{\"line\":12,\"column\":null}},\"3\":{\"start\":{\"line\":13,\"column\":2},\"end\":{\"line\":13,\"column\":null}},\"4\":{\"start\":{\"line\":14,\"column\":2},\"end\":{\"line\":14,\"column\":null}},\"5\":{\"start\":{\"line\":15,\"column\":2},\"end\":{\"line\":15,\"column\":null}},\"6\":{\"start\":{\"line\":21,\"column\":18},\"end\":{\"line\":24,\"column\":null}},\"7\":{\"start\":{\"line\":30,\"column\":22},\"end\":{\"line\":39,\"column\":null}},\"8\":{\"start\":{\"line\":34,\"column\":18},\"end\":{\"line\":34,\"column\":20}},\"9\":{\"start\":{\"line\":35,\"column\":4},\"end\":{\"line\":37,\"column\":5}},\"10\":{\"start\":{\"line\":36,\"column\":6},\"end\":{\"line\":36,\"column\":null}},\"11\":{\"start\":{\"line\":38,\"column\":4},\"end\":{\"line\":38,\"column\":null}},\"12\":{\"start\":{\"line\":45,\"column\":49},\"end\":{\"line\":50,\"column\":null}},\"13\":{\"start\":{\"line\":59,\"column\":30},\"end\":{\"line\":59,\"column\":46}},\"14\":{\"start\":{\"line\":60,\"column\":23},\"end\":{\"line\":64,\"column\":null}},\"15\":{\"start\":{\"line\":66,\"column\":4},\"end\":{\"line\":72,\"column\":null}},\"16\":{\"start\":{\"line\":79,\"column\":4},\"end\":{\"line\":81,\"column\":5}},\"17\":{\"start\":{\"line\":80,\"column\":6},\"end\":{\"line\":80,\"column\":null}},\"18\":{\"start\":{\"line\":82,\"column\":4},\"end\":{\"line\":84,\"column\":5}},\"19\":{\"start\":{\"line\":83,\"column\":6},\"end\":{\"line\":83,\"column\":null}},\"20\":{\"start\":{\"line\":85,\"column\":4},\"end\":{\"line\":85,\"column\":null}},\"21\":{\"start\":{\"line\":92,\"column\":26},\"end\":{\"line\":92,\"column\":53}},\"22\":{\"start\":{\"line\":93,\"column\":4},\"end\":{\"line\":93,\"column\":null}},\"23\":{\"start\":{\"line\":97,\"column\":4},\"end\":{\"line\":99,\"column\":5}},\"24\":{\"start\":{\"line\":98,\"column\":6},\"end\":{\"line\":98,\"column\":null}},\"25\":{\"start\":{\"line\":100,\"column\":4},\"end\":{\"line\":100,\"column\":null}},\"26\":{\"start\":{\"line\":107,\"column\":4},\"end\":{\"line\":107,\"column\":null}},\"27\":{\"start\":{\"line\":114,\"column\":4},\"end\":{\"line\":114,\"column\":null}},\"28\":{\"start\":{\"line\":121,\"column\":4},\"end\":{\"line\":121,\"column\":null}},\"29\":{\"start\":{\"line\":128,\"column\":4},\"end\":{\"line\":132,\"column\":5}},\"30\":{\"start\":{\"line\":129,\"column\":6},\"end\":{\"line\":129,\"column\":null}},\"31\":{\"start\":{\"line\":131,\"column\":6},\"end\":{\"line\":131,\"column\":null}},\"32\":{\"start\":{\"line\":139,\"column\":20},\"end\":{\"line\":139,\"column\":66}},\"33\":{\"start\":{\"line\":140,\"column\":24},\"end\":{\"line\":140,\"column\":46}},\"34\":{\"start\":{\"line\":142,\"column\":4},\"end\":{\"line\":146,\"column\":5}},\"35\":{\"start\":{\"line\":143,\"column\":6},\"end\":{\"line\":143,\"column\":null}},\"36\":{\"start\":{\"line\":145,\"column\":6},\"end\":{\"line\":145,\"column\":null}},\"37\":{\"start\":{\"line\":153,\"column\":4},\"end\":{\"line\":153,\"column\":null}},\"38\":{\"start\":{\"line\":160,\"column\":18},\"end\":{\"line\":160,\"column\":45}},\"39\":{\"start\":{\"line\":161,\"column\":4},\"end\":{\"line\":161,\"column\":null}},\"40\":{\"start\":{\"line\":168,\"column\":4},\"end\":{\"line\":168,\"column\":null}},\"41\":{\"start\":{\"line\":55,\"column\":0},\"end\":{\"line\":55,\"column\":13}},\"42\":{\"start\":{\"line\":56,\"column\":17},\"end\":{\"line\":56,\"column\":null}}},\"fnMap\":{\"0\":{\"name\":\"(anonymous_1)\",\"decl\":{\"start\":{\"line\":11,\"column\":0},\"end\":{\"line\":11,\"column\":12}},\"loc\":{\"start\":{\"line\":11,\"column\":20},\"end\":{\"line\":16,\"column\":1}}},\"1\":{\"name\":\"(anonymous_2)\",\"decl\":{\"start\":{\"line\":33,\"column\":24},\"end\":{\"line\":33,\"column\":25}},\"loc\":{\"start\":{\"line\":33,\"column\":67},\"end\":{\"line\":39,\"column\":3}}},\"2\":{\"name\":\"(anonymous_3)\",\"decl\":{\"start\":{\"line\":59,\"column\":2},\"end\":{\"line\":59,\"column\":30}},\"loc\":{\"start\":{\"line\":59,\"column\":46},\"end\":{\"line\":73,\"column\":3}}},\"3\":{\"name\":\"(anonymous_4)\",\"decl\":{\"start\":{\"line\":78,\"column\":2},\"end\":{\"line\":78,\"column\":8}},\"loc\":{\"start\":{\"line\":78,\"column\":35},\"end\":{\"line\":86,\"column\":3}}},\"4\":{\"name\":\"(anonymous_5)\",\"decl\":{\"start\":{\"line\":91,\"column\":2},\"end\":{\"line\":91,\"column\":8}},\"loc\":{\"start\":{\"line\":91,\"column\":42},\"end\":{\"line\":94,\"column\":3}}},\"5\":{\"name\":\"(anonymous_6)\",\"decl\":{\"start\":{\"line\":96,\"column\":10},\"end\":{\"line\":96,\"column\":16}},\"loc\":{\"start\":{\"line\":96,\"column\":28},\"end\":{\"line\":101,\"column\":3}}},\"6\":{\"name\":\"(anonymous_7)\",\"decl\":{\"start\":{\"line\":106,\"column\":2},\"end\":{\"line\":106,\"column\":7}},\"loc\":{\"start\":{\"line\":106,\"column\":35},\"end\":{\"line\":108,\"column\":3}}},\"7\":{\"name\":\"(anonymous_8)\",\"decl\":{\"start\":{\"line\":113,\"column\":2},\"end\":{\"line\":113,\"column\":6}},\"loc\":{\"start\":{\"line\":113,\"column\":34},\"end\":{\"line\":115,\"column\":3}}},\"8\":{\"name\":\"(anonymous_9)\",\"decl\":{\"start\":{\"line\":120,\"column\":2},\"end\":{\"line\":120,\"column\":6}},\"loc\":{\"start\":{\"line\":120,\"column\":34},\"end\":{\"line\":122,\"column\":3}}},\"9\":{\"name\":\"(anonymous_10)\",\"decl\":{\"start\":{\"line\":127,\"column\":2},\"end\":{\"line\":127,\"column\":7}},\"loc\":{\"start\":{\"line\":127,\"column\":44},\"end\":{\"line\":133,\"column\":3}}},\"10\":{\"name\":\"(anonymous_11)\",\"decl\":{\"start\":{\"line\":138,\"column\":10},\"end\":{\"line\":138,\"column\":13}},\"loc\":{\"start\":{\"line\":138,\"column\":56},\"end\":{\"line\":147,\"column\":3}}},\"11\":{\"name\":\"(anonymous_12)\",\"decl\":{\"start\":{\"line\":152,\"column\":2},\"end\":{\"line\":152,\"column\":13}},\"loc\":{\"start\":{\"line\":152,\"column\":79},\"end\":{\"line\":154,\"column\":3}}},\"12\":{\"name\":\"(anonymous_13)\",\"decl\":{\"start\":{\"line\":159,\"column\":2},\"end\":{\"line\":159,\"column\":12}},\"loc\":{\"start\":{\"line\":159,\"column\":80},\"end\":{\"line\":162,\"column\":3}}},\"13\":{\"name\":\"(anonymous_14)\",\"decl\":{\"start\":{\"line\":167,\"column\":2},\"end\":{\"line\":167,\"column\":14}},\"loc\":{\"start\":{\"line\":167,\"column\":41},\"end\":{\"line\":169,\"column\":3}}}},\"branchMap\":{\"0\":{\"loc\":{\"start\":{\"line\":11,\"column\":12},\"end\":{\"line\":11,\"column\":null}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":11,\"column\":12},\"end\":{\"line\":11,\"column\":20}},{\"start\":{\"line\":11,\"column\":20},\"end\":{\"line\":11,\"column\":null}}]},\"1\":{\"loc\":{\"start\":{\"line\":35,\"column\":4},\"end\":{\"line\":37,\"column\":5}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":35,\"column\":4},\"end\":{\"line\":37,\"column\":5}}]},\"2\":{\"loc\":{\"start\":{\"line\":62,\"column\":16},\"end\":{\"line\":62,\"column\":81}},\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":62,\"column\":56},\"end\":{\"line\":62,\"column\":65}},{\"start\":{\"line\":62,\"column\":68},\"end\":{\"line\":62,\"column\":81}}]},\"3\":{\"loc\":{\"start\":{\"line\":67,\"column\":13},\"end\":{\"line\":67,\"column\":48}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":67,\"column\":13},\"end\":{\"line\":67,\"column\":38}},{\"start\":{\"line\":67,\"column\":42},\"end\":{\"line\":67,\"column\":48}}]},\"4\":{\"loc\":{\"start\":{\"line\":79,\"column\":4},\"end\":{\"line\":81,\"column\":5}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":79,\"column\":4},\"end\":{\"line\":81,\"column\":5}}]},\"5\":{\"loc\":{\"start\":{\"line\":82,\"column\":4},\"end\":{\"line\":84,\"column\":5}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":82,\"column\":4},\"end\":{\"line\":84,\"column\":5}}]},\"6\":{\"loc\":{\"start\":{\"line\":82,\"column\":8},\"end\":{\"line\":82,\"column\":46}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":82,\"column\":8},\"end\":{\"line\":82,\"column\":15}},{\"start\":{\"line\":82,\"column\":19},\"end\":{\"line\":82,\"column\":46}}]},\"7\":{\"loc\":{\"start\":{\"line\":93,\"column\":26},\"end\":{\"line\":93,\"column\":59}},\"type\":\"binary-expr\",\"locations\":[{\"start\":{\"line\":93,\"column\":26},\"end\":{\"line\":93,\"column\":49}},{\"start\":{\"line\":93,\"column\":53},\"end\":{\"line\":93,\"column\":59}}]},\"8\":{\"loc\":{\"start\":{\"line\":97,\"column\":4},\"end\":{\"line\":99,\"column\":5}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":97,\"column\":4},\"end\":{\"line\":99,\"column\":5}}]},\"9\":{\"loc\":{\"start\":{\"line\":128,\"column\":4},\"end\":{\"line\":132,\"column\":5}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":128,\"column\":4},\"end\":{\"line\":132,\"column\":5}},{\"start\":{\"line\":130,\"column\":11},\"end\":{\"line\":132,\"column\":5}}]},\"10\":{\"loc\":{\"start\":{\"line\":139,\"column\":20},\"end\":{\"line\":139,\"column\":66}},\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":139,\"column\":38},\"end\":{\"line\":139,\"column\":61}},{\"start\":{\"line\":139,\"column\":64},\"end\":{\"line\":139,\"column\":66}}]},\"11\":{\"loc\":{\"start\":{\"line\":142,\"column\":4},\"end\":{\"line\":146,\"column\":5}},\"type\":\"if\",\"locations\":[{\"start\":{\"line\":142,\"column\":4},\"end\":{\"line\":146,\"column\":5}},{\"start\":{\"line\":144,\"column\":11},\"end\":{\"line\":146,\"column\":5}}]},\"12\":{\"loc\":{\"start\":{\"line\":160,\"column\":18},\"end\":{\"line\":160,\"column\":45}},\"type\":\"cond-expr\",\"locations\":[{\"start\":{\"line\":160,\"column\":28},\"end\":{\"line\":160,\"column\":35}},{\"start\":{\"line\":160,\"column\":38},\"end\":{\"line\":160,\"column\":45}}]}},\"s\":{\"0\":1,\"1\":1,\"2\":1,\"3\":1,\"4\":1,\"5\":1,\"6\":1,\"7\":1,\"8\":3,\"9\":3,\"10\":0,\"11\":3,\"12\":1,\"13\":1,\"14\":1,\"15\":1,\"16\":4,\"17\":1,\"18\":4,\"19\":0,\"20\":4,\"21\":0,\"22\":0,\"23\":0,\"24\":0,\"25\":0,\"26\":0,\"27\":2,\"28\":1,\"29\":0,\"30\":0,\"31\":0,\"32\":3,\"33\":3,\"34\":3,\"35\":0,\"36\":3,\"37\":0,\"38\":0,\"39\":0,\"40\":0,\"41\":1,\"42\":1},\"f\":{\"0\":1,\"1\":3,\"2\":1,\"3\":4,\"4\":0,\"5\":0,\"6\":0,\"7\":2,\"8\":1,\"9\":0,\"10\":3,\"11\":0,\"12\":0,\"13\":0},\"b\":{\"0\":[1,1],\"1\":[0],\"2\":[0,1],\"3\":[1,1],\"4\":[1],\"5\":[0],\"6\":[4,4],\"7\":[0,0],\"8\":[0],\"9\":[0,0],\"10\":[3,0],\"11\":[0,3],\"12\":[0,0]}}\n}\n\nFile v3.3.10:package-lock.json\n\n{\n  \"name\": \"ops-maintenance-refactored\",\n  \"version\": \"2.0.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"ops-maintenance-refactored\",\n      \"version\": \"2.0.0\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"dotenv\": \"^17.4.1\",\n        \"nodemailer\": \"^9.0.5\",\n        \"ssh2\": \"^1.17.0\",\n        \"winston\": \"^3.11.0\",\n        \"zod\": \"^3.22.0\"\n      },\n      \"devDependencies\": {\n        \"@types/jest\": \"^29.5.0\",\n        \"@types/node\": \"^25.5.2\",\n        \"@types/nodemailer\": \"^8.0.1\",\n        \"@types/ssh2\": \"^1.15.5\",\n        \"jest\": \"^29.7.0\",\n        \"ts-jest\": \"^29.1.0\",\n        \"typescript\": \"^6.0.2\"\n      }\n    },\n    \"node_modules/@babel/code-frame\": {\n      \"version\": \"7.29.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/code-frame/-/code-frame-7.29.0.tgz\",\n      \"integrity\": \"sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-validator-identifier\": \"^7.28.5\",\n        \"js-tokens\": \"^4.0.0\",\n        \"picocolors\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/compat-data\": {\n      \"version\": \"7.29.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/compat-data/-/compat-data-7.29.0.tgz\",\n      \"integrity\": \"sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/core\": {\n      \"version\": \"7.29.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/core/-/core-7.29.0.tgz\",\n      \"integrity\": \"sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.29.0\",\n        \"@babel/generator\": \"^7.29.0\",\n        \"@babel/helper-compilation-targets\": \"^7.28.6\",\n        \"@babel/helper-module-transforms\": \"^7.28.6\",\n        \"@babel/helpers\": \"^7.28.6\",\n        \"@babel/parser\": \"^7.29.0\",\n        \"@babel/template\": \"^7.28.6\",\n        \"@babel/traverse\": \"^7.29.0\",\n        \"@babel/types\": \"^7.29.0\",\n        \"@jridgewell/remapping\": \"^2.3.5\",\n        \"convert-source-map\": \"^2.0.0\",\n        \"debug\": \"^4.1.0\",\n        \"gensync\": \"^1.0.0-beta.2\",\n        \"json5\": \"^2.2.3\",\n        \"semver\": \"^6.3.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/babel\"\n      }\n    },\n    \"node_modules/@babel/generator\": {\n      \"version\": \"7.29.1\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/generator/-/generator-7.29.1.tgz\",\n      \"integrity\": \"sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/parser\": \"^7.29.0\",\n        \"@babel/types\": \"^7.29.0\",\n        \"@jridgewell/gen-mapping\": \"^0.3.12\",\n        \"@jridgewell/trace-mapping\": \"^0.3.28\",\n        \"jsesc\": \"^3.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-compilation-targets\": {\n      \"version\": \"7.28.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz\",\n      \"integrity\": \"sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/compat-data\": \"^7.28.6\",\n        \"@babel/helper-validator-option\": \"^7.27.1\",\n        \"browserslist\": \"^4.24.0\",\n        \"lru-cache\": \"^5.1.1\",\n        \"semver\": \"^6.3.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-globals\": {\n      \"version\": \"7.28.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/helper-globals/-/helper-globals-7.28.0.tgz\",\n      \"integrity\": \"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-module-imports\": {\n      \"version\": \"7.28.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz\",\n      \"integrity\": \"sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/traverse\": \"^7.28.6\",\n        \"@babel/types\": \"^7.28.6\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-module-transforms\": {\n      \"version\": \"7.28.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz\",\n      \"integrity\": \"sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-module-imports\": \"^7.28.6\",\n        \"@babel/helper-validator-identifier\": \"^7.28.5\",\n        \"@babel/traverse\": \"^7.28.6\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@babel/helper-plugin-utils\": {\n      \"version\": \"7.28.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz\",\n      \"integrity\": \"sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-string-parser\": {\n      \"version\": \"7.27.1\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz\",\n      \"integrity\": \"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-validator-identifier\": {\n      \"version\": \"7.28.5\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz\",\n      \"integrity\": \"sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-validator-option\": {\n      \"version\": \"7.27.1\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz\",\n      \"integrity\": \"sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helpers\": {\n      \"version\": \"7.29.2\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/helpers/-/helpers-7.29.2.tgz\",\n      \"integrity\": \"sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/template\": \"^7.28.6\",\n        \"@babel/types\": \"^7.29.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/parser\": {\n      \"version\": \"7.29.2\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/parser/-/parser-7.29.2.tgz\",\n      \"integrity\": \"sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/types\": \"^7.29.0\"\n      },\n      \"bin\": {\n        \"parser\": \"bin/babel-parser.js\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-async-generators\": {\n      \"version\": \"7.8.4\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz\",\n      \"integrity\": \"sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-bigint\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz\",\n      \"integrity\": \"sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-class-properties\": {\n      \"version\": \"7.12.13\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz\",\n      \"integrity\": \"sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.12.13\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-class-static-block\": {\n      \"version\": \"7.14.5\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz\",\n      \"integrity\": \"sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.14.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-import-attributes\": {\n      \"version\": \"7.28.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz\",\n      \"integrity\": \"sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.28.6\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-import-meta\": {\n      \"version\": \"7.10.4\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz\",\n      \"integrity\": \"sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.10.4\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-json-strings\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz\",\n      \"integrity\": \"sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-jsx\": {\n      \"version\": \"7.28.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz\",\n      \"integrity\": \"sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.28.6\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-logical-assignment-operators\": {\n      \"version\": \"7.10.4\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz\",\n      \"integrity\": \"sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.10.4\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-nullish-coalescing-operator\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz\",\n      \"integrity\": \"sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-numeric-separator\": {\n      \"version\": \"7.10.4\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz\",\n      \"integrity\": \"sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.10.4\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-object-rest-spread\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz\",\n      \"integrity\": \"sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-optional-catch-binding\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz\",\n      \"integrity\": \"sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-optional-chaining\": {\n      \"version\": \"7.8.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz\",\n      \"integrity\": \"sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.8.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-private-property-in-object\": {\n      \"version\": \"7.14.5\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz\",\n      \"integrity\": \"sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.14.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-top-level-await\": {\n      \"version\": \"7.14.5\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz\",\n      \"integrity\": \"sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.14.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/plugin-syntax-typescript\": {\n      \"version\": \"7.28.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz\",\n      \"integrity\": \"sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.28.6\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0-0\"\n      }\n    },\n    \"node_modules/@babel/template\": {\n      \"version\": \"7.28.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/template/-/template-7.28.6.tgz\",\n      \"integrity\": \"sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.28.6\",\n        \"@babel/parser\": \"^7.28.6\",\n        \"@babel/types\": \"^7.28.6\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/traverse\": {\n      \"version\": \"7.29.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/traverse/-/traverse-7.29.0.tgz\",\n      \"integrity\": \"sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.29.0\",\n        \"@babel/generator\": \"^7.29.0\",\n        \"@babel/helper-globals\": \"^7.28.0\",\n        \"@babel/parser\": \"^7.29.0\",\n        \"@babel/template\": \"^7.28.6\",\n        \"@babel/types\": \"^7.29.0\",\n        \"debug\": \"^4.3.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/types\": {\n      \"version\": \"7.29.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@babel/types/-/types-7.29.0.tgz\",\n      \"integrity\": \"sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-string-parser\": \"^7.27.1\",\n        \"@babel/helper-validator-identifier\": \"^7.28.5\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@bcoe/v8-coverage\": {\n      \"version\": \"0.2.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz\",\n      \"integrity\": \"sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@colors/colors\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@colors/colors/-/colors-1.6.0.tgz\",\n      \"integrity\": \"sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.1.90\"\n      }\n    },\n    \"node_modules/@dabh/diagnostics\": {\n      \"version\": \"2.0.8\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@dabh/diagnostics/-/diagnostics-2.0.8.tgz\",\n      \"integrity\": \"sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@so-ric/colorspace\": \"^1.1.6\",\n        \"enabled\": \"2.0.x\",\n        \"kuler\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/@istanbuljs/load-nyc-config\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz\",\n      \"integrity\": \"sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"camelcase\": \"^5.3.1\",\n        \"find-up\": \"^4.1.0\",\n        \"get-package-type\": \"^0.1.0\",\n        \"js-yaml\": \"^3.13.1\",\n        \"resolve-from\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/@istanbuljs/schema\": {\n      \"version\": \"0.1.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@istanbuljs/schema/-/schema-0.1.3.tgz\",\n      \"integrity\": \"sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/@jest/console\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/console/-/console-29.7.0.tgz\",\n      \"integrity\": \"sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jest/types\": \"^29.6.3\",\n        \"@types/node\": \"*\",\n        \"chalk\": \"^4.0.0\",\n        \"jest-message-util\": \"^29.7.0\",\n        \"jest-util\": \"^29.7.0\",\n        \"slash\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/core\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/core/-/core-29.7.0.tgz\",\n      \"integrity\": \"sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jest/console\": \"^29.7.0\",\n        \"@jest/reporters\": \"^29.7.0\",\n        \"@jest/test-result\": \"^29.7.0\",\n        \"@jest/transform\": \"^29.7.0\",\n        \"@jest/types\": \"^29.6.3\",\n        \"@types/node\": \"*\",\n        \"ansi-escapes\": \"^4.2.1\",\n        \"chalk\": \"^4.0.0\",\n        \"ci-info\": \"^3.2.0\",\n        \"exit\": \"^0.1.2\",\n        \"graceful-fs\": \"^4.2.9\",\n        \"jest-changed-files\": \"^29.7.0\",\n        \"jest-config\": \"^29.7.0\",\n        \"jest-haste-map\": \"^29.7.0\",\n        \"jest-message-util\": \"^29.7.0\",\n        \"jest-regex-util\": \"^29.6.3\",\n        \"jest-resolve\": \"^29.7.0\",\n        \"jest-resolve-dependencies\": \"^29.7.0\",\n        \"jest-runner\": \"^29.7.0\",\n        \"jest-runtime\": \"^29.7.0\",\n        \"jest-snapshot\": \"^29.7.0\",\n        \"jest-util\": \"^29.7.0\",\n        \"jest-validate\": \"^29.7.0\",\n        \"jest-watcher\": \"^29.7.0\",\n        \"micromatch\": \"^4.0.4\",\n        \"pretty-format\": \"^29.7.0\",\n        \"slash\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      },\n      \"peerDependencies\": {\n        \"node-notifier\": \"^8.0.1 || ^9.0.0 || ^10.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"node-notifier\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@jest/environment\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/environment/-/environment-29.7.0.tgz\",\n      \"integrity\": \"sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jest/fake-timers\": \"^29.7.0\",\n        \"@jest/types\": \"^29.6.3\",\n        \"@types/node\": \"*\",\n        \"jest-mock\": \"^29.7.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/expect\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/expect/-/expect-29.7.0.tgz\",\n      \"integrity\": \"sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"expect\": \"^29.7.0\",\n        \"jest-snapshot\": \"^29.7.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/expect-utils\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/expect-utils/-/expect-utils-29.7.0.tgz\",\n      \"integrity\": \"sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"jest-get-type\": \"^29.6.3\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/fake-timers\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/fake-timers/-/fake-timers-29.7.0.tgz\",\n      \"integrity\": \"sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jest/types\": \"^29.6.3\",\n        \"@sinonjs/fake-timers\": \"^10.0.2\",\n        \"@types/node\": \"*\",\n        \"jest-message-util\": \"^29.7.0\",\n        \"jest-mock\": \"^29.7.0\",\n        \"jest-util\": \"^29.7.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/globals\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/globals/-/globals-29.7.0.tgz\",\n      \"integrity\": \"sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jest/environment\": \"^29.7.0\",\n        \"@jest/expect\": \"^29.7.0\",\n        \"@jest/types\": \"^29.6.3\",\n        \"jest-mock\": \"^29.7.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/reporters\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/reporters/-/reporters-29.7.0.tgz\",\n      \"integrity\": \"sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@bcoe/v8-coverage\": \"^0.2.3\",\n        \"@jest/console\": \"^29.7.0\",\n        \"@jest/test-result\": \"^29.7.0\",\n        \"@jest/transform\": \"^29.7.0\",\n        \"@jest/types\": \"^29.6.3\",\n        \"@jridgewell/trace-mapping\": \"^0.3.18\",\n        \"@types/node\": \"*\",\n        \"chalk\": \"^4.0.0\",\n        \"collect-v8-coverage\": \"^1.0.0\",\n        \"exit\": \"^0.1.2\",\n        \"glob\": \"^7.1.3\",\n        \"graceful-fs\": \"^4.2.9\",\n        \"istanbul-lib-coverage\": \"^3.0.0\",\n        \"istanbul-lib-instrument\": \"^6.0.0\",\n        \"istanbul-lib-report\": \"^3.0.0\",\n        \"istanbul-lib-source-maps\": \"^4.0.0\",\n        \"istanbul-reports\": \"^3.1.3\",\n        \"jest-message-util\": \"^29.7.0\",\n        \"jest-util\": \"^29.7.0\",\n        \"jest-worker\": \"^29.7.0\",\n        \"slash\": \"^3.0.0\",\n        \"string-length\": \"^4.0.1\",\n        \"strip-ansi\": \"^6.0.0\",\n        \"v8-to-istanbul\": \"^9.0.1\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      },\n      \"peerDependencies\": {\n        \"node-notifier\": \"^8.0.1 || ^9.0.0 || ^10.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"node-notifier\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@jest/schemas\": {\n      \"version\": \"29.6.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/schemas/-/schemas-29.6.3.tgz\",\n      \"integrity\": \"sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@sinclair/typebox\": \"^0.27.8\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/source-map\": {\n      \"version\": \"29.6.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/source-map/-/source-map-29.6.3.tgz\",\n      \"integrity\": \"sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/trace-mapping\": \"^0.3.18\",\n        \"callsites\": \"^3.0.0\",\n        \"graceful-fs\": \"^4.2.9\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/test-result\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/test-result/-/test-result-29.7.0.tgz\",\n      \"integrity\": \"sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jest/console\": \"^29.7.0\",\n        \"@jest/types\": \"^29.6.3\",\n        \"@types/istanbul-lib-coverage\": \"^2.0.0\",\n        \"collect-v8-coverage\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/test-sequencer\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz\",\n      \"integrity\": \"sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jest/test-result\": \"^29.7.0\",\n        \"graceful-fs\": \"^4.2.9\",\n        \"jest-haste-map\": \"^29.7.0\",\n        \"slash\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/transform\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/transform/-/transform-29.7.0.tgz\",\n      \"integrity\": \"sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/core\": \"^7.11.6\",\n        \"@jest/types\": \"^29.6.3\",\n        \"@jridgewell/trace-mapping\": \"^0.3.18\",\n        \"babel-plugin-istanbul\": \"^6.1.1\",\n        \"chalk\": \"^4.0.0\",\n        \"convert-source-map\": \"^2.0.0\",\n        \"fast-json-stable-stringify\": \"^2.1.0\",\n        \"graceful-fs\": \"^4.2.9\",\n        \"jest-haste-map\": \"^29.7.0\",\n        \"jest-regex-util\": \"^29.6.3\",\n        \"jest-util\": \"^29.7.0\",\n        \"micromatch\": \"^4.0.4\",\n        \"pirates\": \"^4.0.4\",\n        \"slash\": \"^3.0.0\",\n        \"write-file-atomic\": \"^4.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jest/types\": {\n      \"version\": \"29.6.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jest/types/-/types-29.6.3.tgz\",\n      \"integrity\": \"sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jest/schemas\": \"^29.6.3\",\n        \"@types/istanbul-lib-coverage\": \"^2.0.0\",\n        \"@types/istanbul-reports\": \"^3.0.0\",\n        \"@types/node\": \"*\",\n        \"@types/yargs\": \"^17.0.8\",\n        \"chalk\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/gen-mapping\": {\n      \"version\": \"0.3.13\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz\",\n      \"integrity\": \"sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n        \"@jridgewell/trace-mapping\": \"^0.3.24\"\n      }\n    },\n    \"node_modules/@jridgewell/remapping\": {\n      \"version\": \"2.3.5\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jridgewell/remapping/-/remapping-2.3.5.tgz\",\n      \"integrity\": \"sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/gen-mapping\": \"^0.3.5\",\n        \"@jridgewell/trace-mapping\": \"^0.3.24\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n      \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.5.5\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n      \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.31\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz\",\n      \"integrity\": \"sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.1.0\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n      }\n    },\n    \"node_modules/@sinclair/typebox\": {\n      \"version\": \"0.27.10\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@sinclair/typebox/-/typebox-0.27.10.tgz\",\n      \"integrity\": \"sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==\",\n      \"dev\": true\n    },\n    \"node_modules/@sinonjs/commons\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@sinonjs/commons/-/commons-3.0.1.tgz\",\n      \"integrity\": \"sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==\",\n      \"dev\": true,\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"type-detect\": \"4.0.8\"\n      }\n    },\n    \"node_modules/@sinonjs/fake-timers\": {\n      \"version\": \"10.3.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz\",\n      \"integrity\": \"sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==\",\n      \"dev\": true,\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"@sinonjs/commons\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/@so-ric/colorspace\": {\n      \"version\": \"1.1.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@so-ric/colorspace/-/colorspace-1.1.6.tgz\",\n      \"integrity\": \"sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color\": \"^5.0.2\",\n        \"text-hex\": \"1.0.x\"\n      }\n    },\n    \"node_modules/@types/babel__core\": {\n      \"version\": \"7.20.5\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/babel__core/-/babel__core-7.20.5.tgz\",\n      \"integrity\": \"sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@babel/parser\": \"^7.20.7\",\n        \"@babel/types\": \"^7.20.7\",\n        \"@types/babel__generator\": \"*\",\n        \"@types/babel__template\": \"*\",\n        \"@types/babel__traverse\": \"*\"\n      }\n    },\n    \"node_modules/@types/babel__generator\": {\n      \"version\": \"7.27.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/babel__generator/-/babel__generator-7.27.0.tgz\",\n      \"integrity\": \"sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/types\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@types/babel__template\": {\n      \"version\": \"7.4.4\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/babel__template/-/babel__template-7.4.4.tgz\",\n      \"integrity\": \"sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/parser\": \"^7.1.0\",\n        \"@babel/types\": \"^7.0.0\"\n      }\n    },\n    \"node_modules/@types/babel__traverse\": {\n      \"version\": \"7.28.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/babel__traverse/-/babel__traverse-7.28.0.tgz\",\n      \"integrity\": \"sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/types\": \"^7.28.2\"\n      }\n    },\n    \"node_modules/@types/graceful-fs\": {\n      \"version\": \"4.1.9\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/graceful-fs/-/graceful-fs-4.1.9.tgz\",\n      \"integrity\": \"sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/istanbul-lib-coverage\": {\n      \"version\": \"2.0.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz\",\n      \"integrity\": \"sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/istanbul-lib-report\": {\n      \"version\": \"3.0.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz\",\n      \"integrity\": \"sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/istanbul-lib-coverage\": \"*\"\n      }\n    },\n    \"node_modules/@types/istanbul-reports\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz\",\n      \"integrity\": \"sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/istanbul-lib-report\": \"*\"\n      }\n    },\n    \"node_modules/@types/jest\": {\n      \"version\": \"29.5.14\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/jest/-/jest-29.5.14.tgz\",\n      \"integrity\": \"sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"expect\": \"^29.0.0\",\n        \"pretty-format\": \"^29.0.0\"\n      }\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"25.5.2\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/node/-/node-25.5.2.tgz\",\n      \"integrity\": \"sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~7.18.0\"\n      }\n    },\n    \"node_modules/@types/nodemailer\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/nodemailer/-/nodemailer-8.0.1.tgz\",\n      \"integrity\": \"sha512-PxpaInm8V1JQDd4j0ds5HfvWQk8JupS1C0Picb96QJsrrRDjBH+DlK7L4ZdNSqNULhiZRQHc40nLVShaGxXAMw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/ssh2\": {\n      \"version\": \"1.15.5\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/ssh2/-/ssh2-1.15.5.tgz\",\n      \"integrity\": \"sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"^18.11.18\"\n      }\n    },\n    \"node_modules/@types/ssh2/node_modules/@types/node\": {\n      \"version\": \"18.19.130\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/node/-/node-18.19.130.tgz\",\n      \"integrity\": \"sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~5.26.4\"\n      }\n    },\n    \"node_modules/@types/ssh2/node_modules/undici-types\": {\n      \"version\": \"5.26.5\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/undici-types/-/undici-types-5.26.5.tgz\",\n      \"integrity\": \"sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/stack-utils\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/stack-utils/-/stack-utils-2.0.3.tgz\",\n      \"integrity\": \"sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/triple-beam\": {\n      \"version\": \"1.3.5\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/triple-beam/-/triple-beam-1.3.5.tgz\",\n      \"integrity\": \"sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/yargs\": {\n      \"version\": \"17.0.35\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/yargs/-/yargs-17.0.35.tgz\",\n      \"integrity\": \"sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/yargs-parser\": \"*\"\n      }\n    },\n    \"node_modules/@types/yargs-parser\": {\n      \"version\": \"21.0.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/@types/yargs-parser/-/yargs-parser-21.0.3.tgz\",\n      \"integrity\": \"sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/ansi-escapes\": {\n      \"version\": \"4.3.2\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/ansi-escapes/-/ansi-escapes-4.3.2.tgz\",\n      \"integrity\": \"sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"type-fest\": \"^0.21.3\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/anymatch\": {\n      \"version\": \"3.1.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/anymatch/-/anymatch-3.1.3.tgz\",\n      \"integrity\": \"sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==\",\n      \"dev\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"normalize-path\": \"^3.0.0\",\n        \"picomatch\": \"^2.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/argparse\": {\n      \"version\": \"1.0.10\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/argparse/-/argparse-1.0.10.tgz\",\n      \"integrity\": \"sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"sprintf-js\": \"~1.0.2\"\n      }\n    },\n    \"node_modules/asn1\": {\n      \"version\": \"0.2.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/asn1/-/asn1-0.2.6.tgz\",\n      \"integrity\": \"sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safer-buffer\": \"~2.1.0\"\n      }\n    },\n    \"node_modules/async\": {\n      \"version\": \"3.2.6\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/async/-/async-3.2.6.tgz\",\n      \"integrity\": \"sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/babel-jest\": {\n      \"version\": \"29.7.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/babel-jest/-/babel-jest-29.7.0.tgz\",\n      \"integrity\": \"sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jest/transform\": \"^29.7.0\",\n        \"@types/babel__core\": \"^7.1.14\",\n        \"babel-plugin-istanbul\": \"^6.1.1\",\n        \"babel-preset-jest\": \"^29.6.3\",\n        \"chalk\": \"^4.0.0\",\n        \"graceful-fs\": \"^4.2.9\",\n        \"slash\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.8.0\"\n      }\n    },\n    \"node_modules/babel-plugin-istanbul\": {\n      \"version\": \"6.1.1\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz\",\n      \"integrity\": \"sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==\",\n      \"dev\": true,\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"@babel/helper-plugin-utils\": \"^7.0.0\",\n        \"@istanbuljs/load-nyc-config\": \"^1.0.0\",\n        \"@istanbuljs/schema\": \"^0.1.2\",\n        \"istanbul-lib-instrument\": \"^5.0.4\",\n        \"test-exclude\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz\",\n      \"integrity\": \"sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==\",\n      \"dev\": true,\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"@babel/core\": \"^7.12.3\",\n        \"@babel/parser\": \"^7.14.7\",\n        \"@istanbuljs/schema\": \"^0.1.2\",\n        \"istanbul-lib-coverage\": \"^3.2.0\",\n        \"semver\": \"^6.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/babel-plugin-jest-hoist\": {\n      \"version\": \"29.6.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz\",\n      \"integrity\": \"sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/template\": \"^7.3.3\",\n        \"@babel/types\": \"^7.3.3\",\n        \"@types/babel__core\": \"^7.1.14\",\n        \"@types/babel__traverse\": \"^7.0.6\"\n      },\n      \"engines\": {\n        \"node\": \"^14.15.0 || ^16.10.0 || >=18.0.0\"\n      }\n    },\n    \"node_modules/babel-preset-current-node-syntax\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz\",\n      \"integrity\": \"sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/plugin-syntax-async-generators\": \"^7.8.4\",\n        \"@babel/plugin-syntax-bigint\": \"^7.8.3\",\n        \"@babel/plugin-syntax-class-properties\": \"^7.12.13\",\n        \"@babel/plugin-syntax-class-static-block\": \"^7.14.5\",\n        \"@babel/plugin-syntax-import-attributes\": \"^7.24.7\",\n        \"@babel/plugin-syntax-import-meta\": \"^7.10.4\",\n        \"@babel/plugin-syntax-json-strings\": \"^7.8.3\",\n        \"@babel/plugin-syntax-logical-assignment-operators\": \"^7.10.4\",\n        \"@babel/plugin-syntax-nullish-coalescing-operator\": \"^7.8.3\",\n        \"@babel/plugin-syntax-numeric-separator\": \"^7.10.4\",\n        \"@babel/plugin-syntax-object-rest-spread\": \"^7.8.3\",\n        \"@babel/plugin-syntax-optional-catch-binding\": \"^7.8.3\",\n        \"@babel/plugin-syntax-optional-chaining\": \"^7.8.3\",\n        \"@babel/plugin-syntax-private-property-in-object\": \"^7.14.5\",\n        \"@babel/plugin-syntax-top-level-await\": \"^7.14.5\"\n      },\n      \"peerDependencies\": {\n        \"@babel/core\": \"^7.0.0 || ^8.0.0-0\"\n      }\n    },\n    \"node_modules/babel-preset-jest\": {\n      \"version\": \"29.6.3\",\n      \"resolved\": \"https://mirrors.cloud.tencent.com/npm/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz\",\n      \"integrity\": \"sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==\",\n      \"dev\": \n\nFile v3.3.10:package.json\n\n{\n  \"name\": \"ops-maintenance-refactored\",\n  \"version\": \"3.3.10\",\n  \"description\": \"Refactored operations maintenance assistant with Clean Architecture\",\n  \"main\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"build:watch\": \"tsc -w\",\n    \"test\": \"jest --maxWorkers=2\",\n    \"test:watch\": \"jest --watch\",\n    \"lint\": \"eslint src-new --ext .ts\",\n    \"prepublishOnly\": \"npm run build\"\n  },\n  \"keywords\": [\n    \"ops\",\n    \"maintenance\",\n    \"monitoring\",\n    \"ssh\",\n    \"devops\"\n  ],\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"type\": \"commonjs\",\n  \"dependencies\": {\n    \"dotenv\": \"^17.4.1\",\n    \"nodemailer\": \"^9.0.5\",\n    \"ssh2\": \"^1.17.0\",\n    \"winston\": \"^3.11.0\",\n    \"zod\": \"^3.22.0\"\n  },\n  \"devDependencies\": {\n    \"@types/jest\": \"^29.5.0\",\n    \"@types/node\": \"^25.5.2\",\n    \"@types/nodemailer\": \"^8.0.1\",\n    \"@types/ssh2\": \"^1.15.5\",\n    \"jest\": \"^29.7.0\",\n    \"ts-jest\": \"^29.1.0\",\n    \"typescript\": \"^6.0.2\"\n  },\n  \"files\": [\n    \"dist\",\n    \"README.md\"\n  ]\n}\n\nFile v3.3.10:servers.json\n\n[\r\n  {\r\n    \"host\": \"100.1.120.1\",\r\n    \"port\": 2234,\r\n    \"user\": \"root\",\r\n    \"password\": \"1234\",\r\n    \"name\": \"服务器\",\r\n    \"tags\": [\"DB\"]\r\n  }\r\n]\n\nFile v3.3.10:skills/ops-maintenance/package-lock.json\n\n{\n  \"name\": \"ops-maintenance\",\n  \"version\": \"3.1.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"ops-maintenance\",\n      \"version\": \"3.1.0\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/nodemailer\": \"^8.0.1\",\n        \"commander\": \"^12.1.0\",\n        \"nodemailer\": \"^9.0.5\",\n        \"ssh2\": \"^1.15.0\",\n        \"ssh2-sftp-client\": \"^10.0.3\"\n      },\n      \"bin\": {\n        \"ops\": \"src/cli.ts\"\n      },\n      \"devDependencies\": {\n        \"@types/node\": \"^20.0.0\",\n        \"@types/ssh2\": \"^1.15.5\",\n        \"@types/ssh2-sftp-client\": \"^9.0.6\",\n        \"tsx\": \"^4.0.0\",\n        \"typescript\": \"^5.0.0\",\n        \"vitest\": \"^4.1.7\"\n      }\n    },\n    \"node_modules/@esbuild/aix-ppc64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz\",\n      \"integrity\": \"sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"aix\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.28.2.tgz\",\n      \"integrity\": \"sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz\",\n      \"integrity\": \"sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ia32\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz\",\n      \"integrity\": \"sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-loong64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz\",\n      \"integrity\": \"sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-mips64el\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz\",\n      \"integrity\": \"sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==\",\n      \"cpu\": [\n        \"mips64el\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ppc64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz\",\n      \"integrity\": \"sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-riscv64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz\",\n      \"integrity\": \"sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-s390x\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz\",\n      \"integrity\": \"sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openharmony-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/sunos-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"sunos\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-ia32\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz\",\n      \"integrity\": \"sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.5.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n      \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@oxc-project/types\": {\n      \"version\": \"0.146.0\",\n      \"resolved\": \"https://registry.npmmirror.com/@oxc-project/types/-/types-0.146.0.tgz\",\n      \"integrity\": \"sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/Boshen\"\n      }\n    },\n    \"node_modules/@rolldown/binding-android-arm-eabi\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz\",\n      \"integrity\": \"sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-android-arm64\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz\",\n      \"integrity\": \"sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-darwin-arm64\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz\",\n      \"integrity\": \"sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-darwin-x64\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz\",\n      \"integrity\": \"sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-freebsd-x64\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz\",\n      \"integrity\": \"sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-linux-arm-gnueabihf\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz\",\n      \"integrity\": \"sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-linux-arm64-gnu\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz\",\n      \"integrity\": \"sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"libc\": [\n        \"glibc\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-linux-arm64-musl\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz\",\n      \"integrity\": \"sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"libc\": [\n        \"musl\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-linux-ppc64-gnu\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz\",\n      \"integrity\": \"sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"libc\": [\n        \"glibc\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-linux-s390x-gnu\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz\",\n      \"integrity\": \"sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"libc\": [\n        \"glibc\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-linux-x64-gnu\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz\",\n      \"integrity\": \"sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"libc\": [\n        \"glibc\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-linux-x64-musl\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz\",\n      \"integrity\": \"sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"libc\": [\n        \"musl\"\n      ],\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-openharmony-arm64\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz\",\n      \"integrity\": \"sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-win32-arm64-msvc\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz\",\n      \"integrity\": \"sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/binding-win32-x64-msvc\": {\n      \"version\": \"1.2.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz\",\n      \"integrity\": \"sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \"^20.19.0 || >=22.12.0\"\n      }\n    },\n    \"node_modules/@rolldown/pluginutils\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz\",\n      \"integrity\": \"sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@standard-schema/spec\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz\",\n      \"integrity\": \"sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/chai\": {\n      \"version\": \"5.2.3\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/chai/-/chai-5.2.3.tgz\",\n      \"integrity\": \"sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/deep-eql\": \"*\",\n        \"assertion-error\": \"^2.0.1\"\n      }\n    },\n    \"node_modules/@types/deep-eql\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/deep-eql/-/deep-eql-4.0.2.tgz\",\n      \"integrity\": \"sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/estree\": {\n      \"version\": \"1.0.9\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz\",\n      \"integrity\": \"sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"20.19.43\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/node/-/node-20.19.43.tgz\",\n      \"integrity\": \"sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/@types/nodemailer\": {\n      \"version\": \"8.0.1\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/nodemailer/-/nodemailer-8.0.1.tgz\",\n      \"integrity\": \"sha512-PxpaInm8V1JQDd4j0ds5HfvWQk8JupS1C0Picb96QJsrrRDjBH+DlK7L4ZdNSqNULhiZRQHc40nLVShaGxXAMw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@types/ssh2\": {\n      \"version\": \"1.15.5\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/ssh2/-/ssh2-1.15.5.tgz\",\n      \"integrity\": \"sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"^18.11.18\"\n      }\n    },\n    \"node_modules/@types/ssh2-sftp-client\": {\n      \"version\": \"9.0.6\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/ssh2-sftp-client/-/ssh2-sftp-client-9.0.6.tgz\",\n      \"integrity\": \"sha512-4+KvXO/V77y9VjI2op2T8+RCGI/GXQAwR0q5Qkj/EJ5YSeyKszqZP6F8i3H3txYoBqjc7sgorqyvBP3+w1EHyg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/ssh2\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/@types/ssh2/node_modules/@types/node\": {\n      \"version\": \"18.19.130\",\n      \"resolved\": \"https://registry.npmmirror.com/@types/node/-/node-18.19.130.tgz\",\n      \"integrity\": \"sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~5.26.4\"\n      }\n    },\n    \"node_modules/@types/ssh2/node_modules/undici-types\": {\n      \"version\": \"5.26.5\",\n      \"resolved\": \"https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz\",\n      \"integrity\": \"sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==\",\n      \"dev\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@vitest/expect\": {\n      \"version\": \"4.1.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@vitest/expect/-/expect-4.1.11.tgz\",\n      \"integrity\": \"sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@standard-schema/spec\": \"^1.1.0\",\n        \"@types/chai\": \"^5.2.2\",\n        \"@vitest/spy\": \"4.1.11\",\n        \"@vitest/utils\": \"4.1.11\",\n        \"chai\": \"^6.2.2\",\n        \"tinyrainbow\": \"^3.1.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/vitest\"\n      }\n    },\n    \"node_modules/@vitest/mocker\": {\n      \"version\": \"4.1.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@vitest/mocker/-/mocker-4.1.11.tgz\",\n      \"integrity\": \"sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@vitest/spy\": \"4.1.11\",\n        \"estree-walker\": \"^3.0.3\",\n        \"magic-string\": \"^0.30.21\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/vitest\"\n      },\n      \"peerDependencies\": {\n        \"msw\": \"^2.4.9\",\n        \"vite\": \"^6.0.0 || ^7.0.0 || ^8.0.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"msw\": {\n          \"optional\": true\n        },\n        \"vite\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/@vitest/pretty-format\": {\n      \"version\": \"4.1.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@vitest/pretty-format/-/pretty-format-4.1.11.tgz\",\n      \"integrity\": \"sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"tinyrainbow\": \"^3.1.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/vitest\"\n      }\n    },\n    \"node_modules/@vitest/runner\": {\n      \"version\": \"4.1.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@vitest/runner/-/runner-4.1.11.tgz\",\n      \"integrity\": \"sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@vitest/utils\": \"4.1.11\",\n        \"pathe\": \"^2.0.3\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/vitest\"\n      }\n    },\n    \"node_modules/@vitest/snapshot\": {\n      \"version\": \"4.1.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@vitest/snapshot/-/snapshot-4.1.11.tgz\",\n      \"integrity\": \"sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@vitest/pretty-format\": \"4.1.11\",\n        \"@vitest/utils\": \"4.1.11\",\n        \"magic-string\": \"^0.30.21\",\n        \"pathe\": \"^2.0.3\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/vitest\"\n      }\n    },\n    \"node_modules/@vitest/spy\": {\n      \"version\": \"4.1.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@vitest/spy/-/spy-4.1.11.tgz\",\n      \"integrity\": \"sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://opencollective.com/vitest\"\n      }\n    },\n    \"node_modules/@vitest/utils\": {\n      \"version\": \"4.1.11\",\n      \"resolved\": \"https://registry.npmmirror.com/@vitest/utils/-/utils-4.1.11.tgz\",\n      \"integrity\": \"sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@vitest/pretty-format\": \"4.1.11\",\n        \"convert-source-map\": \"^2.0.0\",\n        \"tinyrainbow\": \"^3.1.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/vitest\"\n      }\n    },\n    \"node_modules/asn1\": {\n      \"version\": \"0.2.6\",\n      \"resolved\": \"https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz\",\n      \"integrity\": \"sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safer-buffer\": \"~2.1.0\"\n      }\n    },\n    \"node_modules/assertion-error\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmmirror.com/assertion-error/-/assertion-error-2.0.1.tgz\",\n      \"integrity\": \"sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==\",\n      \"dev\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/bcrypt-pbkdf\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz\",\n      \"integrity\": \"sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"tweetnacl\": \"^0.14.3\"\n      }\n    },\n    \"node_modules/buffer-from\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz\",\n      \"integrity\": \"sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/buildcheck\": {\n      \"version\": \"0.0.7\",\n\n\nArchive v3.3.9: 191 files, 375289 bytes\n\nFiles: check.js (3209b), coverage/clover.xml (9082b), coverage/coverage-final.json (28327b), coverage/lcov-report/base.css (5394b), coverage/lcov-report/block-navigation.js (2655b), coverage/lcov-report/config/index.html (4396b), coverage/lcov-report/config/schemas.ts.html (45384b), coverage/lcov-report/index.html (5760b), coverage/lcov-report/infrastructure/notifiers/EmailNotifier.ts.html (22093b), coverage/lcov-report/infrastructure/notifiers/index.html (4500b), coverage/lcov-report/prettify.css (676b), coverage/lcov-report/prettify.js (17590b), coverage/lcov-report/sorter.js (6731b), coverage/lcov-report/utils/index.html (4443b), coverage/lcov-report/utils/logger.ts.html (24279b), dist/common.d.ts (4690b), dist/common.js (3168b), dist/config/ICredentialsProvider.d.ts (795b), dist/config/ICredentialsProvider.js (197b), dist/config/loader.d.ts (747b), dist/config/loader.js (5532b), dist/config/schemas.d.ts (7120b), dist/config/schemas.js (3445b), dist/config/validator.d.ts (2188b), dist/config/validator.js (2780b), dist/container.d.ts (2917b), dist/container.js (6802b), dist/core/entities/index.d.ts (310b), dist/core/entities/index.js (513b), dist/core/repositories/CacheRepository.d.ts (238b), dist/core/repositories/CacheRepository.js (251b), dist/core/repositories/index.d.ts (106b), dist/core/repositories/index.js (897b), dist/core/repositories/ServerRepository.d.ts (700b), dist/core/repositories/ServerRepository.js (215b), dist/core/usecases/DiskCheckUseCase.d.ts (1146b), dist/core/usecases/DiskCheckUseCase.js (4451b), dist/core/usecases/HealthCheckUseCase.d.ts (1465b), dist/core/usecases/HealthCheckUseCase.js (3900b), dist/core/usecases/index.d.ts (149b), dist/core/usecases/index.js (958b), dist/core/usecases/PasswordCheckUseCase.d.ts (1074b), dist/core/usecases/PasswordCheckUseCase.js (4964b), dist/exports.d.ts (2169b), dist/exports.js (8459b), dist/index.d.ts (469b), dist/index.js (1976b), dist/infrastructure/cache/CacheRepository.d.ts (2121b), dist/infrastructure/cache/CacheRepository.js (5799b), dist/infrastructure/cache/index.d.ts (133b), dist/infrastructure/cache/index.js (942b), dist/infrastructure/monitoring/HealthChecker.d.ts (1811b), dist/infrastructure/monitoring/HealthChecker.js (5225b), dist/infrastructure/monitoring/index.d.ts (104b), dist/infrastructure/monitoring/index.js (895b), dist/infrastructure/monitoring/ThresholdChecker.d.ts (741b), dist/infrastructure/monitoring/ThresholdChecker.js (3108b), dist/infrastructure/notifiers/EmailNotifier.d.ts (845b), dist/infrastructure/notifiers/EmailNotifier.js (4518b), dist/infrastructure/notifiers/index.d.ts (157b), dist/infrastructure/notifiers/index.js (496b), dist/infrastructure/repositories/CredentialsRepository.d.ts (2474b), dist/infrastructure/repositories/CredentialsRepository.js (6057b), dist/infrastructure/repositories/index.d.ts (75b), dist/infrastructure/repositories/index.js (848b), dist/infrastructure/repositories/ServerFileRepository.d.ts (1943b), dist/infrastructure/repositories/ServerFileRepository.js (3346b), dist/infrastructure/ssh/ConnectionPool.d.ts (1729b), dist/infrastructure/ssh/ConnectionPool.js (6985b), dist/infrastructure/ssh/SSHClient.d.ts (681b), dist/infrastructure/ssh/SSHClient.js (4349b), dist/legacy.d.ts (4698b), dist/legacy.js (6861b), dist/presentation/cli/CLI.d.ts (1891b), dist/presentation/cli/CLI.js (10051b), dist/presentation/cli/CommandDispatcher.d.ts (980b), dist/presentation/cli/CommandDispatcher.js (4498b), dist/presentation/cli/index.d.ts (95b), dist/presentation/cli/index.js (886b), dist/presentation/formatters/index.d.ts (105b)\n\nArchive v3.3.8: 191 files, 375284 bytes\n\nFiles: check.js (3209b), coverage/clover.xml (9082b), coverage/coverage-final.json (28327b), coverage/lcov-report/base.css (5394b), coverage/lcov-report/block-navigation.js (2655b), coverage/lcov-report/config/index.html (4396b), coverage/lcov-report/config/schemas.ts.html (45384b), coverage/lcov-report/index.html (5760b), coverage/lcov-report/infrastructure/notifiers/EmailNotifier.ts.html (22093b), coverage/lcov-report/infrastructure/notifiers/index.html (4500b), coverage/lcov-report/prettify.css (676b), coverage/lcov-report/prettify.js (17590b), coverage/lcov-report/sorter.js (6731b), coverage/lcov-report/utils/index.html (4443b), coverage/lcov-report/utils/logger.ts.html (24279b), dist/common.d.ts (4690b), dist/common.js (3168b), dist/config/ICredentialsProvider.d.ts (795b), dist/config/ICredentialsProvider.js (197b), dist/config/loader.d.ts (747b), dist/config/loader.js (5532b), dist/config/schemas.d.ts (7120b), dist/config/schemas.js (3445b), dist/config/validator.d.ts (2188b), dist/config/validator.js (2780b), dist/container.d.ts (2917b), dist/container.js (6802b), dist/core/entities/index.d.ts (310b), dist/core/entities/index.js (513b), dist/core/repositories/CacheRepository.d.ts (238b), dist/core/repositories/CacheRepository.js (251b), dist/core/repositories/index.d.ts (106b), dist/core/repositories/index.js (897b), dist/core/repositories/ServerRepository.d.ts (700b), dist/core/repositories/ServerRepository.js (215b), dist/core/usecases/DiskCheckUseCase.d.ts (1146b), dist/core/usecases/DiskCheckUseCase.js (4451b), dist/core/usecases/HealthCheckUseCase.d.ts (1465b), dist/core/usecases/HealthCheckUseCase.js (3900b), dist/core/usecases/index.d.ts (149b), dist/core/usecases/index.js (958b), dist/core/usecases/PasswordCheckUseCase.d.ts (1074b), dist/core/usecases/PasswordCheckUseCase.js (4964b), dist/exports.d.ts (2169b), dist/exports.js (8459b), dist/index.d.ts (469b), dist/index.js (1976b), dist/infrastructure/cache/CacheRepository.d.ts (2121b), dist/infrastructure/cache/CacheRepository.js (5799b), dist/infrastructure/cache/index.d.ts (133b), dist/infrastructure/cache/index.js (942b), dist/infrastructure/monitoring/HealthChecker.d.ts (1811b), dist/infrastructure/monitoring/HealthChecker.js (5225b), dist/infrastructure/monitoring/index.d.ts (104b), dist/infrastructure/monitoring/index.js (895b), dist/infrastructure/monitoring/ThresholdChecker.d.ts (741b), dist/infrastructure/monitoring/ThresholdChecker.js (3108b), dist/infrastructure/notifiers/EmailNotifier.d.ts (845b), dist/infrastructure/notifiers/EmailNotifier.js (4518b), dist/infrastructure/notifiers/index.d.ts (157b), dist/infrastructure/notifiers/index.js (496b), dist/infrastructure/repositories/CredentialsRepository.d.ts (2474b), dist/infrastructure/repositories/CredentialsRepository.js (6057b), dist/infrastructure/repositories/index.d.ts (75b), dist/infrastructure/repositories/index.js (848b), dist/infrastructure/repositories/ServerFileRepository.d.ts (1943b), dist/infrastructure/repositories/ServerFileRepository.js (3346b), dist/infrastructure/ssh/ConnectionPool.d.ts (1729b), dist/infrastructure/ssh/ConnectionPool.js (6985b), dist/infrastructure/ssh/SSHClient.d.ts (681b), dist/infrastructure/ssh/SSHClient.js (4349b), dist/legacy.d.ts (4698b), dist/legacy.js (6861b), dist/presentation/cli/CLI.d.ts (1891b), dist/presentation/cli/CLI.js (10051b), dist/presentation/cli/CommandDispatcher.d.ts (980b), dist/presentation/cli/CommandDispatcher.js (4498b), dist/presentation/cli/index.d.ts (95b), dist/presentation/cli/index.js (886b), dist/presentation/formatters/index.d.ts (105b)\n\nArchive v3.3.7: 25 files, 100275 bytes\n\nFiles: package-lock.json (66411b), package.json (1053b), skill-card.md (2289b), SKILL.md (12723b), src/cli.ts (19571b), src/index.ts (48758b), src/utils/alert-manager.ts (22700b), src/utils/audit-logger.ts (5366b), src/utils/command-validator.ts (5488b), src/utils/config-change-tracker.ts (14426b), src/utils/crypto.ts (4021b), src/utils/docker-health-checker.ts (14533b), src/utils/health-checker.ts (11572b), src/utils/multi-notifier.ts (11295b), src/utils/network-diagnostics.ts (12688b), src/utils/patrol-scheduler.ts (14588b), src/utils/prometheus-exporter.ts (3237b), src/utils/report-generator.ts (8894b), src/utils/security-auditor.ts (17240b), src/utils/service-manager.ts (13345b), src/utils/sftp-client.ts (4166b), src/utils/smart-log-analyzer.ts (19914b), src/utils/ssh-pool.ts (6674b), src/utils/ssl-monitor.ts (13142b), _meta.json (134b)\n\nArchive v3.3.6: 25 files, 100342 bytes\n\nFiles: package-lock.json (66411b), package.json (1053b), skill-card.md (2401b), SKILL.md (12723b), src/cli.ts (19571b), src/index.ts (48758b), src/utils/alert-manager.ts (22700b), src/utils/audit-logger.ts (5366b), src/utils/command-validator.ts (5488b), src/utils/config-change-tracker.ts (14426b), src/utils/crypto.ts (4021b), src/utils/docker-health-checker.ts (14533b), src/utils/health-checker.ts (11572b), src/utils/multi-notifier.ts (11295b), src/utils/network-diagnostics.ts (12688b), src/utils/patrol-scheduler.ts (14588b), src/utils/prometheus-exporter.ts (3237b), src/utils/report-generator.ts (8894b), src/utils/security-auditor.ts (17240b), src/utils/service-manager.ts (13345b), src/utils/sftp-client.ts (4166b), src/utils/smart-log-analyzer.ts (19914b), src/utils/ssh-pool.ts (6674b), src/utils/ssl-monitor.ts (13142b), _meta.json (134b)\n\nArchive v3.3.5: 25 files, 100373 bytes\n\nFiles: package-lock.json (66411b), package.json (1053b), skill-card.md (2605b), SKILL.md (12723b), src/cli.ts (19571b), src/index.ts (48758b), src/utils/alert-manager.ts (22700b), src/utils/audit-logger.ts (5366b), src/utils/command-validator.ts (5488b), src/utils/config-change-tracker.ts (14426b), src/utils/crypto.ts (4021b), src/utils/docker-health-checker.ts (14533b), src/utils/health-checker.ts (11572b), src/utils/multi-notifier.ts (11295b), src/utils/network-diagnostics.ts (12688b), src/utils/patrol-scheduler.ts (14588b), src/utils/prometheus-exporter.ts (3237b), src/utils/report-generator.ts (8894b), src/utils/security-auditor.ts (17240b), src/utils/service-manager.ts (13345b), src/utils/sftp-client.ts (4166b), src/utils/smart-log-analyzer.ts (19914b), src/utils/ssh-pool.ts (6674b), src/utils/ssl-monitor.ts (13142b), _meta.json (134b)\n\nArchive v3.3.4: 25 files, 100461 bytes\n\nFiles: package-lock.json (66411b), package.json (1053b), skill-card.md (2729b), SKILL.md (12723b), src/cli.ts (19571b), src/index.ts (48758b), src/utils/alert-manager.ts (22700b), src/utils/audit-logger.ts (5366b), src/utils/command-validator.ts (5488b), src/utils/config-change-tracker.ts (14426b), src/utils/crypto.ts (4021b), src/utils/docker-health-checker.ts (14533b), src/utils/health-checker.ts (11572b), src/utils/multi-notifier.ts (11295b), src/utils/network-diagnostics.ts (12688b), src/utils/patrol-scheduler.ts (14588b), src/utils/prometheus-exporter.ts (3237b), src/utils/report-generator....","readmeExcerpt":"Skill: ops-maintenance Owner: fish1981bimmer Summary: 运维助手 v3.3.10 - 本地/远程/集群监控 (健康检查、日志分析、性能监控、批量操作、密码过期检查、告警通知、定时巡检、Docker健康、SSL证书、安全审计、网络诊断) Tags: latest:3.3.10 Version history: v3.3.10 | 2026-09-06T05:03:26.214Z | auto ops-maintenance v3.3.10 - 更新版本号至 v3.3.10，文档描述同步升级。 - 无功能、命令或配置变更，仅为版本及文档信息维护。 v3.3.9 | 2026-09-06T05:00:49.809Z | auto ops-maintenance v3.3.9 Changelog - Bump version from 3.3.8 to 3.3.9 in package","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"/ops-maintenance network               # 网络诊断（ping/dns/port）\n/ops-maintenance network <host>        # 指定主机检测"},{"language":"text","snippet":"/ops-maintenance report                # 集群状态摘要报告"},{"language":"text","snippet":"/ops-maintenance audit                 # 查看审计日志统计"},{"language":"text","snippet":"/ops-maintenance docker                # Docker容器健康检查"},{"language":"text","snippet":"/ops-maintenance ssl                   # SSL证书检查"},{"language":"text","snippet":"/ops-maintenance security              # 安全配置审计"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: ops-maintenance\ndescription: 运维助手 v3.3.10 - 本地/远程/集群监控 (健康检查、日志分析、性能监控、批量操作、密码过期检查、告警通知、定时巡检、Docker健康、SSL证书、安全审计、网络诊断)\nuserInvocable: true\nargumentHint: <health|logs|perf|ports|process|disk|password|network|report|audit|docker|ssl|security|cluster> [args]\nallowedTools:\n  - Bash\n  - Read\n---\n\n# 运维助手 (ops-maintenance) v3.3.10\n\n专业的运维助手，支持单服务器和多服务器集群监控。\n\n## v3.3.8 新功能\n\n### 网络诊断\n```\n/ops-maintenance network               # 网络诊断（ping/dns/port）\n/ops-maintenance network <host>        # 指定主机检测\n```\n\n### 运维报告\n```\n/ops-maintenance report                # 集群状态摘要报告\n```\n\n### 操作审计\n```\n/ops-maintenance audit                 # 查看审计日志统计\n```\n\n### Docker 健康巡检\n```\n/ops-maintenance docker                # Docker容器健康检查\n```\n\n### SSL 证书监控\n```\n/ops-maintenance ssl                   # SSL证书检查\n```\n\n### 安全审计\n```\n/ops-maintenance security              # 安全配置审计\n```\n\n### 远程密码检查\n```\n/ops-maintenance user@host password    # 远程服务器密码过期检查\n```\n\n## 功能命令\n\n### 健康检查\n```\n/ops-maintenance health              # 本地\n/ops-maintenance user@host health    # 远程 SSH\n```\n\n### 日志分析  \n```\n/ops-maintenance logs [关键词]       # 本地\n/ops-maintenance user@host logs error  # 远程\n```\n\n### 性能监控 (本地)\n```\n/ops-maintenance perf\n```\n\n### 端口检查\n```\n/ops-maintenance ports [端口]        # 本地\n/ops-maintenance user@host ports 80  # 远程\n```\n\n### 进程检查\n```\n/ops-maintenance process [名称]      # 本地\n/ops-maintenance user@host process nginx  # 远程\n```\n\n### 磁盘使用\n```\n/ops-maintenance disk                # 本地\n/ops-maintenance user@host disk      # 远程\n```\n\n### 密码过期检查\n```\n/ops-maintenance password            # 检查所有配置服务器的密码过期状态\n```\n\n## 远程服务器配置\n\n### 方式 1: SSH Config (推荐)\n在 `~/.ssh/config` 中配置:\n```\nHost myserver\n    HostName 192.168.1.100\n    User root\n    Port 22\n    IdentityFile ~/.ssh/id_rsa\n```\n\n### 方式 2: 直接指定\n```\nuser@192.168.1.100 health\nroot@server.com:2222 disk\n```\n\n## 支持的远程操作\n- health: 系统负载、内存、磁盘、服务状态\n- logs: 远程日志搜索\n- ports: 端口占用检查\n- process: 进程查找\n- disk: 磁盘使用分析\n- password: 远程密码过期检查（v3.3.8新增）\n\n## 输出格式\n\n返回 Markdown 格式结果，包含:\n- 标题 (emoji + 操作名 + 服务器)\n- 代码块中的命令输出\n- 关键发现和建议\n\n### 密码过期检查输出示例\n\n```\n### 🔐 密码过期检查 (本地)\n\n| 用户 | 上次修改 | 过期日期 | 最大天数 | 状态 |\n|------|----------|----------|----------|------|\n| root | 2024-01-15 | 2024-07-15 | 180 | ✅ 有效 |\n| admin | 2024-02-01 | never | 90 | ⚠️ 永不过期 |\n| user1 | 2023-11-01 | 2024-01-01 | 60 | ❌ 已过期 |\n```\n\n## 多服务器集群管理\n\n### 查看集群状态\n```\n/ops-maintenance cluster              # 查看所有服务器状态\n/ops-maintenance cluster @production  # 按标签筛选\n```\n\n### 批量添加服务器\n```\n# 直接添加多个 IP\n/ops-maintenance batch-add 192.168.1.100 192.168.1.101 192.168.1.102\n\n# 带端口\n/ops-maintenance batch-add 192.168.1.100:2222 192.168.1.101:22\n\n# 带用户\n/ops-maintenance batch-add root@192.168.1.100 admin@192.168.1.101\n\n# 完整格式\n/ops-maintenance batch-add user@host:port user2@host2:port\n\n# CSV 格式 (多行)\n/ops-maintenance import-servers <<EOF\n192.168.1.100,22,root,web-1,production;web\n192.168.1.101,22,admin,db-1,production;database\nEOF\n\n# JSON 格式\n/ops-maintenance import-servers [{\"host\":\"192.168.1.100\",\"name\":\"web-1\",\"tags\":[\"prod\"]}]\n```\n\n### 添加服务器\n`"},{"path":"skills/ops-maintenance/SKILL.md","content":"---\nname: ops-maintenance\nversion: 3.3.0\ndescription: 运维助手 v3.3 - 支持本地、远程、多服务器集群监控、安全审计、智能日志分析、配置变更追踪、告警通知、定时巡检、Docker容器健康巡检、SSL证书监控\nuserInvocable: true\nargumentHint: <health|security|logs|config|report|perf|ports|process|disk|cluster|alert|patrol|docker-health|ssl|add-server|remove-server|upload|download|list|audit> [args]\nallowedTools:\n - Bash\n - Read\n---\n\n# 运维助手 (ops-maintenance) v3.3.0\n\n专业的运维助手，支持单服务器和多服务器集群监控、安全审计、智能日志分析、配置变更追踪、告警通知、定时巡检、Docker容器健康巡检、SSL证书监控。\n\n## v3.3 新功能\n\n### 多渠道通知增强 (v3.3)\n- **Slack 支持**: 通过 `ops alert notify slack <config>` 配置 Slack Webhook\n- **钉钉支持**: 通过 `ops alert notify dingtalk <config>` 配置钉钉机器人\n- **通用 Webhook**: 支持任意 HTTP POST 回调\n\n### CLI 健壮性修复 (v3.3)\n- **patrol start 不再阻塞**: 启动后自动退出，后台运行\n- **完整的错误处理**: 所有命令失败时返回适当退出码\n\n### 测试覆盖提升 (v3.3)\n- **49 个单元测试**: 覆盖安全、告警、巡检、SSL、Docker 核心功能\n- **ESM 兼容**: 所有 `require()` 替换为 `import`\n\n### 通知渠道配置示例\n```bash\n# 飞书\nops alert notify feishu '{\"webhookUrl\":\"https://open.feishu.cn/open-apis/bot/v2/hook/xxx\"}'\n\n# 企业微信\nops alert notify wechat '{\"webhookUrl\":\"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx\"}'\n\n# 邮件 (SMTP)\nops alert notify email '{\"smtpHost\":\"smtp.qq.com\",\"smtpPort\":465,\"smtpUser\":\"xxx@qq.com\",\"smtpPass\":\"授权码\",\"from\":\"xxx@qq.com\",\"to\":[\"收件人@qq.com\"]}'\n\n# Webhook\nops alert notify webhook '{\"url\":\"https://hooks.slack.com/services/xxx\"}'\n\n# Slack\nops alert notify slack '{\"webhookUrl\":\"https://hooks.slack.com/services/xxx\",\"channel\":\"#alerts\",\"username\":\"OpsBot\"}'\n\n# 钉钉\nops alert notify dingtalk '{\"webhookUrl\":\"https://oapi.dingtalk.com/robot/send?access_token=xxx\"}'\n```\n\n## v3.2 新功能\n\n### Docker 容器健康巡检\n- **全面巡检**: 自动检查所有容器的健康状况\n- **重启检测**: 检测容器重启次数超限，识别启动即崩溃的僵尸容器\n- **OOM Kill检测**: 识别因内存不足被Kill的容器\n- **健康检查失败**: 检测Docker HEALTHCHECK失败\n- **资源超限**: CPU/内存使用率超阈值告警(70%/75%警告, 90%/90%严重)\n- **镜像过期**: 检测超过90天未更新的镜像\n- **单容器检查**: 支持指定容器名深度检查\n\n### SSL 证书监控\n- **批量域名检查**: 支持同时检查多个域名的SSL证书\n- **过期告警**: 默认30天前告警，7天前严重告警\n- **证书详情**: 显示颁发者、有效期、SAN域名、协议版本\n- **链路检查**: 检测SAN不匹配、不安全协议(TLSv1.0/1.1)\n- **配置文件支持**: 从 ~/.config/ops-maintenance/ssl-domains.json 加载域名\n- **备用方案**: openssl命令作为Node.js TLS的备用检测方式\n\n### 安全审计系统\n- **自动安全扫描**: SSH配置、防火墙状态、文件权限、Docker安全、内核参数\n- **风险分级**: high/medium/low 三级风险分类\n- **修复建议**: 每项发现自动生成修复建议\n- **合规检查**: 对照安全基线自动评估\n\n### 智能日志分析\n- **趋势统计**: 按时间段统计错误量，生成时间线\n- **模式识别**: 相似日志自动聚合，提取通用模式\n- **异常检测**: 4种异常检测(错误突增/新模式/超时聚类/连续爆发)\n- **多源关联**: 多个日志源的关联分析\n- **自动发现**: 自动发现常见日志路径\n\n### 配置变更追踪\n- **基线快照**: 为关键配置文件建立SHA256基线\n- **变更检测**: 自动检测配置文件变更\n- **差异对比**: 变更详情展示(行级diff)\n- **变更历史**: 保留完整变更历史记录\n- **预设追踪**: 默认追踪nginx/SSH/sysctl/fstab/hosts/DNS/crontab\n\n### 运维报告生成\n- **综合报告**: 一键汇总健康/安全/日志/配置四维报告\n- **多格式输出**: Markdown / JSON / 纯文本\n- **模块可选**: 可选择性跳过某些模块\n- **状态总览**: 一目了然的OK/WARN/CRIT状态汇总\n\n### 告警通知系统\n- **多渠道通知**: 飞书机器人 / 企业微信 / 邮件 / Webhook / 控制台\n- **8种默认告警规则**: 磁盘(80%/90%)、内存(85%/95%)、负载(5/10)、CPU(80%)、服务宕机\n- **告警去重**: 同一规则+服务器不重复触发\n- **告警静默**: 指定时间内屏蔽重复告警\n- **自动恢复检测**: 阈值恢复后自动标记 resolved 并发送恢复通知\n- **告警升级**: 按阈值从高到低，优先触发最高级别\n- **持久化存储**: 告警记录保存在 ~/.config/ops-maintenance/alerts.json\n\n#### 邮件"},{"path":"README.md","content":"# ops-maintenance 2.0 重构完成\n\n## 🎉 重大更新\n\n运维助手已完成 Clean Architecture 架构重构，保持 **100% 向后兼容**。\n\n### 核心改进\n\n| 特性 | v1.x | v2.0 |\n|------|------|------|\n| 架构 | 单体 1500 行 | 分层清晰 |\n| SSH 连接 | 每次新建 | 连接池复用 ✅ |\n| 配置管理 | 静态读文件 | 热加载 + CRUD ✅ |\n| 缓存 | 无 | 内存 + 文件缓存 ✅ |\n| 可测试性 | 难 | 依赖注入，易于测试 ✅ |\n| 扩展性 | 硬编码 | 策略模式，插件化 ✅ |\n\n---\n\n## 📦 快速开始\n\n### 安装\n```bash\ncd ~/.claude/skills/ops-maintenance\nnpm install\n```\n\n### 配置服务器\n```bash\n# 编辑配置文件\nvim ~/.config/ops-maintenance/servers.json\n```\n\n示例配置：\n```json\n[\n  {\n    \"host\": \"10.119.120.143\",\n    \"port\": 22,\n    \"user\": \"salt\",\n    \"name\": \"DM裸金属服务器\",\n    \"tags\": [\"DB\"]\n  }\n]\n```\n\n### 设置凭据（安全方式）\n```bash\n# 使用环境变量（推荐，密码不存文件）\nexport OPS_CRED_10_119_120_143=\"salt:Giten!#202501Tab*&\"\n# 或使用密钥\nexport OPS_KEY_10_119_120_143=\"/home/user/.ssh/id_rsa\"\n```\n\n### 运行\n\n```bash\n# 集群健康检查\nnode run.js cluster\n\n# 密码过期检查\nnode run.js password\n\n# 指定环境\nnode run.js health @production\n\n# JSON 输出\nnode run.js password --json\n```\n\n---\n\n## 🏗️ 架构文档\n\n详细架构说明见 [`doc/ARCHITECTURE.md`](doc/ARCHITECTURE.md)\n\n### 目录结构\n```\nsrc-new/\n├── types.ts                      # 统一类型定义\n├── config/                       # 配置层\n│   ├── schemas.ts                # 类型和接口\n│   ├── loader.ts                 # ConfigManager\n│   └── validator.ts              # Zod 验证\n├── core/                         # 领域层\n│   ├── entities/                 # 实体\n│   ├── repositories/             # 仓库接口\n│   └── usecases/                 # 用例\n├── infrastructure/               # 基础设施\n│   ├── ssh/                      # SSH 客户端 & 池\n│   ├── cache/                    # 缓存\n│   ├── repositories/             # 仓库实现\n│   └── monitoring/               # 监控策略\n├── presentation/                 # 表现层\n│   ├── formatters/               # 格式化器\n│   ├── cli/                      # CLI\n│   └── LegacyAdapter.ts          # 向后兼容\n├── container.ts                  # 依赖注入容器\n├── legacy.ts                     # 旧版 API 适配\n└── index.ts                      # 新架构入口\n```\n\n---\n\n## 🔧 开发\n\n### 编译\n```bash\nnpm run build          # 编译到 dist/\nnpm run build:watch    # 监听模式\n```\n\n### 测试\n```bash\nnpm test               # 运行测试\nnpm run test:watch     # 监听模式\nnpm run test:coverage   # 覆盖率报告\n```\n\n### 调试\n```bash\nnode run-dev.js            # 开发模式，显示状态\nOPS_LOG_LEVEL=debug node run.js cluster  # 调试日志\n```\n\n---\n\n## 🔐 凭据管理\n\n### 方式 1: 环境变量（推荐）\n```bash\n# 密码认证\nexport OPS_CRED_<HOST>=\"user:password\"\n# 例如（将 . 替换为 _）：\nexport OPS_CRED_10_119_120_143=\"salt:password123\"\n\n# 密钥认证\nexport OPS_KEY_<HOST>=\"/path/to/private/key\"\n```\n\n### 方式 2: SSH 默认密钥\n如果未设置环境变量，自动尝试 `~/.ssh/id_rsa`、`id_ed25519` 等。\n\n### 方式 3: 配置文件（不推荐生产）\n扩展 `servers.json` 增加 `password` 或 `keyFile` 字段（仅测试环境使用）。\n\n---\n\n## 🎯 API 使用\n\n### 新架构 API\n```typescript\nimport { initContainer, Server } from 'ops-maintenance'\n\nconst container = await initContainer()\nconst healthUC = container.createHealthCheckUseCase()\n\nconst report = await healthUC.execute({\n  tags: ['production'],\n  force: true\n})\n\nconsole.log(report)\n```\n\n### 旧版 API（完全兼容）\n```typescript\nconst { loadServers, checkAllServersHealth } = require('ops-mainten"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn76tyr0ztr0j5fyej0qbchjx584wwjp\",\n  \"slug\": \"ops-maintenance\",\n  \"version\": \"3.3.10\",\n  \"publishedAt\": 1788671006214\n}"},{"path":"doc/ARCHITECTURE.md","content":"# ops-maintenance 2.0 架构文档\n\n## 🏗️ 架构概览\n\n### 设计原则\n- **Clean Architecture**: 领域层独立，依赖方向向内\n- **依赖注入**: 所有依赖通过容器管理，易于测试\n- **单一职责**: 每个类/模块只做一件事\n- **可测试性**: 核心逻辑不依赖外部设施，易于单元测试\n\n### 分层结构\n\n```\nsrc-new/\n├── types.ts                    # 统一类型定义（简化版）\n├── config/\n│   ├── schemas.ts              # 完整类型定义（原版）\n│   ├── loader.ts               # ConfigManager - 配置管理\n│   ├── validator.ts            # Zod 验证\n│   └── ICredentialsProvider.ts # 凭据提供者接口\n├── core/\n│   ├── entities/               # 领域实体\n│   ├── repositories/           # 仓库接口\n│   └── usecases/               # 用例层（业务逻辑）\n├── infrastructure/\n│   ├── ssh/                    # SSH 客户端 & 连接池\n│   ├── cache/                  # 缓存实现\n│   ├── repositories/           # 仓库实现\n│   └── monitoring/             # 监控检查策略\n├── presentation/\n│   ├── formatters/             # 输出格式化器\n│   ├── cli/                    # CLI 命令解析\n│   └── LegacyAdapter.ts        # 向后兼容适配器\n├── container.ts                # 依赖注入容器\n├── legacy.ts                   # 旧版 API 兼容层\n├── index.ts                    # 新版应用入口\n└── exports.ts                  # 统一导出\n```\n\n---\n\n## 🔄 依赖关系\n\n```\n    ┌─────────────────┐\n    │  presentation   │  CLI / Formatter / LegacyAdapter\n    └────────┬────────┘\n             │ depends on\n    ┌────────▼────────┐\n    │    core/usecase │  HealthCheckUseCase, PasswordCheckUseCase\n    └────────┬────────┘\n             │ depends on\n    ┌────────▼────────┐\n    │  repositories   │  IServerRepository, ICacheRepository\n    └────────┬────────┘\n             │ depends on\n    ┌────────▼────────┐\n    │ infrastructure  │  SSHClient, Cache, ConfigManager\n    └─────────────────┘\n```\n\n---\n\n## 📦 核心模块说明\n\n### ConfigManager（配置管理）\n**职责**: 服务器配置的加载、验证、热重载、CRUD\n\n**特性**:\n- 自动加载 `~/.config/ops-maintenance/servers.json`\n- 文件监听（macOS/Linux 用 fs.watch，Windows 用轮询）\n- 配置变更事件通知\n- 运行时增删服务器（`add()`/`remove()`）\n\n**使用**:\n```typescript\nconst cm = new ConfigManager()\nawait cm.start()\ncm.on('change', () => console.log('配置已变更'))\nconst servers = cm.getAll()\nawait cm.add({ host: '1.2.3.4', user: 'root', password: 'xxx' })\n```\n\n### SSHClient（SSH 客户端）\n**职责**: 封装 ssh2 库，提供连接复用、认证、超时控制\n\n**特性**:\n- 连接池复用（`connections: Map`）\n- keepalive 自动保活\n- 命令执行超时控制\n- 凭据提供者模式（`ICredentialsProvider`）\n\n**凭据源优先级**:\n1. 环境变量 `OPS_CRED_<HOST>` 和 `OPS_KEY_<HOST>`\n2. 配置文件（扩展字段，不推荐生产）\n3. 默认 SSH 密钥 `~/.ssh/id_rsa` 等\n\n### ConnectionPool（连接池）\n**职责**: 管理多服务器连接生命周期\n\n**特性**:\n- 最大连接数限制（默认 10）\n- 空闲连接自动清理（5 分钟）\n- 连接最大存活时间（30 分钟）\n- 等待队列机制（并发满时排队）\n\n### Cache（缓存）\n**内存缓存**: TTL 自动清理，每分钟扫描过期项  \n**文件缓存**: 进程重启后缓存持久化  \n**分层缓存**: Memory + File 二级缓存\n\n### HealthChecker（健康检查策略）\n**策略模式**: 每个检查项是独立的 `IHealthCheckStrategy`\n\n| 策略 | 优先级 | 关键 | 说明 |\n|------|--------|------|------|\n| LoadAverageCheck | 1 | ✅ | 1/5/15 分钟负载 |\n| MemoryCheck | 2 | ✅ | 内存使用率 |\n| DiskCheck | 3 | ✅ | 根分区使用率 |\n| ServiceStatusCheck | 4 | ❌ | nginx/docker 等 |\n\n支持自定义策略，通过 `HealthChecker.addStrategy()` 注入。\n\n### ThresholdChecker（阈值检查）\n**环境感知**: production/staging/development 不同阈值\n\nThresholdConfig:\n```typescript\n{\n  diskWarning: 80, diskCritical: 90,\n  memoryW"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"运维助手 v3.3.10 - 本地/远程/集群监控 (健康检查、日志分析、性能监控、批量操作、密码过期检查、告警通知、定时巡检、Docker健康、SSL证书、安全审计、网络诊断) Skill: ops-maintenance Owner: fish1981bimmer Summary: 运维助手 v3.3.10 - 本地/远程/集群监控 (健康检查、日志分析、性能监控、批量操作、密码过期检查、告警通知、定时巡检、Docker健康、SSL证书、安全审计、网络诊断) Tags: latest:3.3.10 Version history: v3.3.10 | 2026-09-06T05:03:26.214Z | auto ops-maintenance v3.3.10 - 更新版本号至 v3.3.10，文档描述同步升级。 - 无功能、命令或配置变更，仅为版本及文档信息维护。 v3.3.9 | 2026-09-06T05:00:49.809Z | auto ops-maintenance v3.3.9 Changelog - Bump version from 3.3.8 to 3.3.9 in package","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":768,"uniquenessScore":58,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T03:24:10.349Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T03:24:10.349Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T08:44:20.327Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}