@clawhub-jerryharbin-7a4764eab1
自动监控任意网站公告列表页,支持关键词过滤、多层级分类、定时推送及多渠道通知(钉钉、微信、邮件)。
# notice-monitor - 通用公告监控技能
## 📋 技能描述
**通用网站公告监控工具** - 支持任意政府公告/采购/招标网站的自动化监控
- 监控任意 URL 的公告列表页
- 自定义关键词过滤
- 多层级/多分类支持
- 自动去重 + 定时推送
- 支持 DingTalk/微信/邮件通知
---
## 🚀 快速开始
### 安装
```bash
clawhub install notice-monitor
```
### 配置
创建配置文件 `~/.openclaw/workspace/notice-monitor-config.yaml`:
```yaml
# 监控任务配置
tasks:
- name: 黑龙江教育采购
url: https://hljcg.hlj.gov.cn/maincms-web/procurementNotice
levels:
- name: 省级
selector: "省级"
- name: 市级
selector: "市级"
- name: 县区级
selector: "县 (区)"
keywords:
- 教育
- 学校
- 学院
- 大学
- 培训
- 教学
schedule: "0 8 * * *" # 每天早 8 点
notify:
type: dingtalk
target: "01254349410626385789"
- name: 北京医疗招标
url: https://bphc.beijing.gov.cn/notice
keywords:
- 医院
- 医疗
- 药品
- 器械
schedule: "0 9 * * *"
notify:
type: dingtalk
target: "01254349410626385789"
```
### 运行
```bash
# 手动执行一次
openclaw skill run notice-monitor --config ~/.openclaw/workspace/notice-monitor-config.yaml
# 启用定时任务
openclaw skill cron notice-monitor enable
```
---
## ⚙️ 配置参数说明
### 任务配置 (tasks)
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `name` | string | ✅ | 任务名称 |
| `url` | string | ✅ | 公告列表页 URL |
| `levels` | array | ❌ | 层级配置(省/市/县等) |
| `keywords` | array | ✅ | 过滤关键词列表 |
| `schedule` | string | ❌ | Cron 表达式,定时执行 |
| `notify` | object | ✅ | 通知配置 |
### 层级配置 (levels)
| 参数 | 类型 | 说明 |
|------|------|------|
| `name` | string | 层级显示名称 |
| `selector` | string | 页面选择器(文本/XPath/CSS) |
### 通知配置 (notify)
| 参数 | 类型 | 说明 |
|------|------|------|
| `type` | string | 通知类型:`dingtalk` / `wechat` / `email` |
| `target` | string | 接收目标(用户 ID/群 ID/邮箱) |
---
## 📁 示例配置
### 示例 1:黑龙江省教育采购(当前配置)
```yaml
tasks:
- name: 黑龙江教育采购
url: https://hljcg.hlj.gov.cn/maincms-web/procurementNotice
levels:
- name: 省级
selector: "省级"
- name: 市级
selector: "市级"
- name: 县区级
selector: "县 (区)"
keywords:
- 教育
- 学校
- 学院
- 大学
- 中学
- 小学
- 幼儿园
- 培训
- 教学
- 科研
- 实验室
- 医院
schedule: "0 8 * * *"
notify:
type: dingtalk
target: "01254349410626385789"
```
### 示例 2:北京市医疗设备招标
```yaml
tasks:
- name: 北京医疗招标
url: https://bphc.beijing.gov.cn/notice
keywords:
- 医院
- 医疗
- 药品
- 器械
- 卫生
- 诊所
schedule: "0 9 * * *"
notify:
type: dingtalk
target: "01254349410626385789"
```
### 示例 3:上海市 IT 项目采购
```yaml
tasks:
- name: 上海 IT 采购
url: https://zfcg.sh.gov.cn/notice
keywords:
- 软件
- 系统
- 信息化
- 网络
- 数据
- 云平台
schedule: "0 10 * * *"
notify:
type: dingtalk
target: "01254349410626385789"
```
---
## 🔧 高级用法
### 多任务并行
```yaml
tasks:
- name: 教育采购
url: https://hljcg.hlj.gov.cn/...
keywords: [教育,学校,学院]
- name: 医疗招标
url: https://bphc.beijing.gov.cn/...
keywords: [医院,医疗,药品]
- name: IT 项目
url: https://zfcg.sh.gov.cn/...
keywords: [软件,系统,信息化]
```
### 自定义报告模板
```yaml
template: |
📢 {{taskName}} 日报
📅 {{date}}
{{#each levels}}
【{{name}}】{{count}}条
{{#each items}}
{{index}}️⃣ {{title}}
📍 {{area}} | 🕐 {{date}}
{{/each}}
{{/each}}
✅ 今日新增:{{total}}条
```
### webhook 通知
```yaml
notify:
type: webhook
url: https://your-server.com/api/notify
method: POST
headers:
Authorization: Bearer xxx
```
---
## 📊 输出示例
```
📢 黑龙江教育采购 日报
📅 2026/3/20
【省级】14 条
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1️⃣ 哈尔滨医科大学设备更新项目招标公告
📍 黑龙江省省本级 | 🕐 2026-03-19
【市级】5 条
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1️⃣ 七台河职业学院实训室竞争性磋商公告
📍 七台河市本级 | 🕐 2026-03-19
【县区级】0 条
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 今日新增:19 条 | 累计:156 条
```
---
## 🐛 故障排查
### 查看日志
```bash
tail -f ~/.openclaw/workspace/state/notice-monitor.log
```
### 测试配置
```bash
openclaw skill run notice-monitor --config ~/.openclaw/workspace/notice-monitor-config.yaml --dry-run
```
### 清除缓存
```bash
rm ~/.openclaw/workspace/state/pushed-ids-*.json
```
---
## 📝 版本历史
- **v1.0.0** (2026-03-20) - 初始版本
- 支持单/多任务监控
- 关键词过滤
- 自动去重
- DingTalk 通知
---
## 📄 License
MIT License
---
**作者**: 营销总监
**仓库**: https://clawhub.com/skills/notice-monitor
FILE:README.md
# notice-monitor
[](https://clawhub.com/skills/notice-monitor)
[](https://clawhub.com/skills/notice-monitor)
[](LICENSE)
## 📋 简介
**通用网站公告监控工具** - 帮助你自动监控任意政府公告网、采购网、招标网的最新动态。
- ✅ 支持任意网站(只需配置 URL)
- ✅ 自定义关键词过滤
- ✅ 多层级/多分类支持(省/市/县等)
- ✅ 自动去重,不重复推送
- ✅ 定时任务,自动执行
- ✅ 多通知渠道(DingTalk/微信/邮件/Webhook)
---
## 🚀 快速开始
### 1. 安装技能
```bash
clawhub install notice-monitor
```
### 2. 创建配置文件
```bash
cp ~/.openclaw/skills/notice-monitor/configs/default.yaml \
~/.openclaw/workspace/notice-monitor-config.yaml
```
### 3. 编辑配置
编辑 `~/.openclaw/workspace/notice-monitor-config.yaml`:
```yaml
tasks:
- name: 黑龙江教育采购
url: https://hljcg.hlj.gov.cn/maincms-web/procurementNotice
levels:
- name: 省级
selector: "省级"
- name: 市级
selector: "市级"
keywords:
- 教育
- 学校
- 学院
- 大学
- 培训
schedule: "0 8 * * *"
notify:
type: dingtalk
target: "你的 DingTalk 用户 ID"
```
### 4. 运行
```bash
# 手动执行一次
openclaw skill run notice-monitor --config ~/.openclaw/workspace/notice-monitor-config.yaml
# 启用定时任务
openclaw skill cron notice-monitor enable
```
---
## 📖 详细文档
查看完整文档:[SKILL.md](SKILL.md)
### 配置参数
| 参数 | 说明 | 必填 |
|------|------|------|
| `name` | 任务名称 | ✅ |
| `url` | 公告列表页 URL | ✅ |
| `levels` | 层级配置(省/市/县) | ❌ |
| `keywords` | 过滤关键词 | ✅ |
| `schedule` | Cron 表达式 | ❌ |
| `notify` | 通知配置 | ✅ |
### 示例配置
#### 教育采购监控
```yaml
tasks:
- name: 黑龙江教育采购
url: https://hljcg.hlj.gov.cn/maincms-web/procurementNotice
keywords: [教育,学校,学院,大学,培训]
schedule: "0 8 * * *"
notify:
type: dingtalk
target: "01254349410626385789"
```
#### 医疗招标监控
```yaml
tasks:
- name: 北京医疗招标
url: https://bphc.beijing.gov.cn/notice
keywords: [医院,医疗,药品,器械]
schedule: "0 9 * * *"
notify:
type: dingtalk
target: "01254349410626385789"
```
#### IT 项目监控
```yaml
tasks:
- name: 上海 IT 采购
url: https://zfcg.sh.gov.cn/notice
keywords: [软件,系统,信息化,网络,数据]
schedule: "0 10 * * *"
notify:
type: dingtalk
target: "01254349410626385789"
```
---
## 📊 输出示例
```
📢 黑龙江教育采购 日报
📅 2026/3/20
【省级】14 条
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1️⃣ 哈尔滨医科大学设备更新项目招标公告
📍 黑龙江省省本级 | 🕐 2026-03-19
【市级】5 条
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1️⃣ 七台河职业学院实训室竞争性磋商公告
📍 七台河市本级 | 🕐 2026-03-19
✅ 今日新增:19 条 | 累计:156 条
```
---
## 🔧 高级用法
### 多任务并行
```yaml
tasks:
- name: 教育采购
url: ...
keywords: [教育,学校]
- name: 医疗招标
url: ...
keywords: [医院,医疗]
- name: IT 项目
url: ...
keywords: [软件,系统]
```
### Webhook 通知
```yaml
notify:
type: webhook
url: https://your-server.com/api/notify
method: POST
headers:
Authorization: Bearer xxx
```
### 自定义报告模板
```yaml
template: |
📢 {{taskName}} 日报
📅 {{date}}
{{#each levels}}
【{{name}}】{{count}}条
{{#each items}}
{{index}}️⃣ {{title}}
📍 {{area}} | 🕐 {{date}}
{{/each}}
{{/each}}
✅ 今日新增:{{total}}条
```
---
## 🐛 故障排查
### 查看日志
```bash
tail -f ~/.openclaw/workspace/state/notice-monitor.log
```
### 测试运行
```bash
openclaw skill run notice-monitor --config ~/.openclaw/workspace/notice-monitor-config.yaml --dry-run
```
### 清除缓存
```bash
rm ~/.openclaw/workspace/state/pushed-ids-*.json
```
---
## 📝 版本历史
### v1.0.0 (2026-03-20)
- ✅ 初始版本发布
- ✅ 支持多任务配置
- ✅ 关键词过滤
- ✅ 自动去重机制
- ✅ DingTalk 通知集成
---
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
- 问题反馈:https://clawhub.com/skills/notice-monitor/issues
- 功能建议:https://clawhub.com/skills/notice-monitor/discussions
---
## 📄 License
MIT License
---
**作者**: 营销总监
**ClawHub**: https://clawhub.com/skills/notice-monitor
FILE:clawhub.json
{
"name": "notice-monitor",
"version": "1.0.1",
"description": "通用网站公告监控工具 - 支持任意政府公告/采购/招标网站自动化监控",
"author": "营销总监",
"license": "MIT",
"category": "automation",
"tags": ["monitor", "crawler", "notification", "automation", "procurement", "government"],
"repository": "https://github.com/openclaw/skills/notice-monitor",
"homepage": "https://clawhub.com/skills/notice-monitor",
"icon": "🔍",
"screenshots": [
"screenshots/report-example.png"
],
"pricing": "free",
"requirements": {
"node": ">=14.0.0",
"openclaw": ">=1.0.0"
},
"features": [
"多任务并行监控",
"自定义关键词过滤",
"多层级/多分类支持",
"自动去重",
"定时任务(Cron)",
"多通知渠道(DingTalk/微信/邮件/Webhook)"
],
"useCases": [
"政府采购公告监控",
"教育行业招标追踪",
"医疗设备采购通知",
"IT 项目招标监控",
"任意网站公告订阅"
]
}
FILE:configs/default.yaml
# 默认配置文件
# 复制到 ~/.openclaw/workspace/notice-monitor-config.yaml 后修改使用
tasks:
# 示例任务 1:黑龙江省教育采购
- name: 黑龙江教育采购
url: https://hljcg.hlj.gov.cn/maincms-web/procurementNotice
levels:
- name: 省级
selector: "省级"
- name: 市级
selector: "市级"
- name: 县区级
selector: "县 (区)"
keywords:
- 教育
- 学校
- 学院
- 大学
- 中学
- 小学
- 幼儿园
- 培训
- 教学
- 科研
- 实验室
- 医院
schedule: "0 8 * * *"
notify:
type: dingtalk
target: "01254349410626385789"
# 示例任务 2:北京医疗招标(示例)
# - name: 北京医疗招标
# url: https://bphc.beijing.gov.cn/notice
# keywords:
# - 医院
# - 医疗
# - 药品
# - 器械
# schedule: "0 9 * * *"
# notify:
# type: dingtalk
# target: "01254349410626385789"
FILE:configs/examples/beijing-medical.yaml
# 示例配置:北京市医疗设备招标监控
tasks:
- name: 北京医疗招标
url: https://bphc.beijing.gov.cn/notice
keywords:
- 医院
- 医疗
- 药品
- 器械
- 卫生
- 诊所
- 医保
- 护理
schedule: "0 9 * * *"
notify:
type: dingtalk
target: "YOUR_DINGTALK_ID"
FILE:configs/examples/hlj-edu.yaml
# 示例配置:黑龙江省教育采购监控
tasks:
- name: 黑龙江教育采购
url: https://hljcg.hlj.gov.cn/maincms-web/procurementNotice
levels:
- name: 省级
selector: "省级"
- name: 市级
selector: "市级"
- name: 县区级
selector: "县 (区)"
keywords:
- 教育
- 学校
- 学院
- 大学
- 中学
- 小学
- 幼儿园
- 培训
- 教学
- 科研
- 实验室
- 医院
- 医学院
- 医科大学
- 卫校
- 职校
- 技校
- 师范
schedule: "0 8 * * *"
notify:
type: dingtalk
target: "01254349410626385789"
FILE:configs/examples/shanghai-it.yaml
# 示例配置:上海市 IT 项目采购监控
tasks:
- name: 上海 IT 采购
url: https://zfcg.sh.gov.cn/notice
keywords:
- 软件
- 系统
- 信息化
- 网络
- 数据
- 云平台
- 数字化
- 智能
- IT
- 计算机
schedule: "0 10 * * *"
notify:
type: dingtalk
target: "YOUR_DINGTALK_ID"
FILE:package-lock.json
{
"name": "notice-monitor",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "notice-monitor",
"version": "1.0.0",
"license": "MIT",
"dependencies": {
"commander": "^11.0.0",
"node-cron": "^3.0.0",
"puppeteer": "^21.0.0",
"yaml": "^2.3.0"
},
"bin": {
"notice-monitor": "src/cli.js"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@babel/code-frame": {
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
"integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.28.5",
"js-tokens": "^4.0.0",
"picocolors": "^1.1.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.28.5",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
"integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@puppeteer/browsers": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.1.tgz",
"integrity": "sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==",
"license": "Apache-2.0",
"dependencies": {
"debug": "4.3.4",
"extract-zip": "2.0.1",
"progress": "2.0.3",
"proxy-agent": "6.3.1",
"tar-fs": "3.0.4",
"unbzip2-stream": "1.4.3",
"yargs": "17.7.2"
},
"bin": {
"browsers": "lib/cjs/main-cli.js"
},
"engines": {
"node": ">=16.3.0"
}
},
"node_modules/@tootallnate/quickjs-emscripten": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
"integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
"license": "MIT"
},
"node_modules/@types/node": {
"version": "25.5.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz",
"integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==",
"license": "MIT",
"optional": true,
"dependencies": {
"undici-types": "~7.18.0"
}
},
"node_modules/@types/yauzl": {
"version": "2.10.3",
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
"integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
"license": "MIT",
"optional": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/agent-base": {
"version": "7.1.4",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
"integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
"license": "MIT",
"engines": {
"node": ">= 14"
}
},
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"license": "Python-2.0"
},
"node_modules/ast-types": {
"version": "0.13.4",
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
"integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
"license": "MIT",
"dependencies": {
"tslib": "^2.0.1"
},
"engines": {
"node": ">=4"
}
},
"node_modules/b4a": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz",
"integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==",
"license": "Apache-2.0",
"peerDependencies": {
"react-native-b4a": "*"
},
"peerDependenciesMeta": {
"react-native-b4a": {
"optional": true
}
}
},
"node_modules/bare-events": {
"version": "2.8.2",
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz",
"integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==",
"license": "Apache-2.0",
"peerDependencies": {
"bare-abort-controller": "*"
},
"peerDependenciesMeta": {
"bare-abort-controller": {
"optional": true
}
}
},
"node_modules/bare-fs": {
"version": "4.5.6",
"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.6.tgz",
"integrity": "sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==",
"license": "Apache-2.0",
"dependencies": {
"bare-events": "^2.5.4",
"bare-path": "^3.0.0",
"bare-stream": "^2.6.4",
"bare-url": "^2.2.2",
"fast-fifo": "^1.3.2"
},
"engines": {
"bare": ">=1.16.0"
},
"peerDependencies": {
"bare-buffer": "*"
},
"peerDependenciesMeta": {
"bare-buffer": {
"optional": true
}
}
},
"node_modules/bare-os": {
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.0.tgz",
"integrity": "sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==",
"license": "Apache-2.0",
"engines": {
"bare": ">=1.14.0"
}
},
"node_modules/bare-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
"integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
"license": "Apache-2.0",
"dependencies": {
"bare-os": "^3.0.1"
}
},
"node_modules/bare-stream": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.10.0.tgz",
"integrity": "sha512-DOPZF/DDcDruKDA43cOw6e9Quq5daua7ygcAwJE/pKJsRWhgSSemi7qVNGE5kyDIxIeN1533G/zfbvWX7Wcb9w==",
"license": "Apache-2.0",
"dependencies": {
"streamx": "^2.25.0",
"teex": "^1.0.1"
},
"peerDependencies": {
"bare-buffer": "*",
"bare-events": "*"
},
"peerDependenciesMeta": {
"bare-buffer": {
"optional": true
},
"bare-events": {
"optional": true
}
}
},
"node_modules/bare-url": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz",
"integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==",
"license": "Apache-2.0",
"dependencies": {
"bare-path": "^3.0.0"
}
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/basic-ftp": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz",
"integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
}
},
"node_modules/buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
"integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
"license": "MIT",
"engines": {
"node": "*"
}
},
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/chromium-bidi": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.8.tgz",
"integrity": "sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==",
"license": "Apache-2.0",
"dependencies": {
"mitt": "3.0.1",
"urlpattern-polyfill": "10.0.0"
},
"peerDependencies": {
"devtools-protocol": "*"
}
},
"node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT"
},
"node_modules/commander": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
"integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
"license": "MIT",
"engines": {
"node": ">=16"
}
},
"node_modules/cosmiconfig": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
"integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
"license": "MIT",
"dependencies": {
"env-paths": "^2.2.1",
"import-fresh": "^3.3.0",
"js-yaml": "^4.1.0",
"parse-json": "^5.2.0"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/d-fischer"
},
"peerDependencies": {
"typescript": ">=4.9.5"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/cross-fetch": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
"integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
"license": "MIT",
"dependencies": {
"node-fetch": "^2.6.12"
}
},
"node_modules/data-uri-to-buffer": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
"integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
"license": "MIT",
"engines": {
"node": ">= 14"
}
},
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"license": "MIT",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/degenerator": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
"integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
"license": "MIT",
"dependencies": {
"ast-types": "^0.13.4",
"escodegen": "^2.1.0",
"esprima": "^4.0.1"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/devtools-protocol": {
"version": "0.0.1232444",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz",
"integrity": "sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==",
"license": "BSD-3-Clause"
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
"license": "MIT",
"dependencies": {
"once": "^1.4.0"
}
},
"node_modules/env-paths": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/error-ex": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
"integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
"license": "MIT",
"dependencies": {
"is-arrayish": "^0.2.1"
}
},
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/escodegen": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
"integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
"license": "BSD-2-Clause",
"dependencies": {
"esprima": "^4.0.1",
"estraverse": "^5.2.0",
"esutils": "^2.0.2"
},
"bin": {
"escodegen": "bin/escodegen.js",
"esgenerate": "bin/esgenerate.js"
},
"engines": {
"node": ">=6.0"
},
"optionalDependencies": {
"source-map": "~0.6.1"
}
},
"node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"license": "BSD-2-Clause",
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
}
},
"node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/events-universal": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
"integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
"license": "Apache-2.0",
"dependencies": {
"bare-events": "^2.7.0"
}
},
"node_modules/extract-zip": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
"license": "BSD-2-Clause",
"dependencies": {
"debug": "^4.1.1",
"get-stream": "^5.1.0",
"yauzl": "^2.10.0"
},
"bin": {
"extract-zip": "cli.js"
},
"engines": {
"node": ">= 10.17.0"
},
"optionalDependencies": {
"@types/yauzl": "^2.9.1"
}
},
"node_modules/fast-fifo": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
"integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
"license": "MIT"
},
"node_modules/fd-slicer": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
"integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
"license": "MIT",
"dependencies": {
"pend": "~1.2.0"
}
},
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"license": "ISC",
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"license": "MIT",
"dependencies": {
"pump": "^3.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/get-uri": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz",
"integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
"license": "MIT",
"dependencies": {
"basic-ftp": "^5.0.2",
"data-uri-to-buffer": "^6.0.2",
"debug": "^4.3.4"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/http-proxy-agent": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
"integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.0",
"debug": "^4.3.4"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/https-proxy-agent": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
"integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.2",
"debug": "4"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause"
},
"node_modules/import-fresh": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
"license": "MIT",
"dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ip-address": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
"license": "MIT",
"engines": {
"node": ">= 12"
}
},
"node_modules/is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"license": "MIT"
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"license": "MIT"
},
"node_modules/js-yaml": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
"integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
"license": "MIT"
},
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"license": "MIT"
},
"node_modules/lru-cache": {
"version": "7.18.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
"integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
"license": "MIT"
},
"node_modules/mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
"license": "MIT"
},
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"license": "MIT"
},
"node_modules/netmask": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
"integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
"license": "MIT",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/node-cron": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz",
"integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==",
"license": "ISC",
"dependencies": {
"uuid": "8.3.2"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/node-fetch": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
"license": "MIT",
"dependencies": {
"whatwg-url": "^5.0.0"
},
"engines": {
"node": "4.x || >=6.0.0"
},
"peerDependencies": {
"encoding": "^0.1.0"
},
"peerDependenciesMeta": {
"encoding": {
"optional": true
}
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"license": "ISC",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/pac-proxy-agent": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
"integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
"license": "MIT",
"dependencies": {
"@tootallnate/quickjs-emscripten": "^0.23.0",
"agent-base": "^7.1.2",
"debug": "^4.3.4",
"get-uri": "^6.0.1",
"http-proxy-agent": "^7.0.0",
"https-proxy-agent": "^7.0.6",
"pac-resolver": "^7.0.1",
"socks-proxy-agent": "^8.0.5"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/pac-resolver": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
"integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
"license": "MIT",
"dependencies": {
"degenerator": "^5.0.0",
"netmask": "^2.0.2"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"license": "MIT",
"dependencies": {
"callsites": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
"license": "MIT"
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
},
"node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/proxy-agent": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz",
"integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==",
"license": "MIT",
"dependencies": {
"agent-base": "^7.0.2",
"debug": "^4.3.4",
"http-proxy-agent": "^7.0.0",
"https-proxy-agent": "^7.0.2",
"lru-cache": "^7.14.1",
"pac-proxy-agent": "^7.0.1",
"proxy-from-env": "^1.1.0",
"socks-proxy-agent": "^8.0.2"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/pump": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
"integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"node_modules/puppeteer": {
"version": "21.11.0",
"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.11.0.tgz",
"integrity": "sha512-9jTHuYe22TD3sNxy0nEIzC7ZrlRnDgeX3xPkbS7PnbdwYjl2o/z/YuCrRBwezdKpbTDTJ4VqIggzNyeRcKq3cg==",
"deprecated": "< 24.15.0 is no longer supported",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@puppeteer/browsers": "1.9.1",
"cosmiconfig": "9.0.0",
"puppeteer-core": "21.11.0"
},
"bin": {
"puppeteer": "lib/esm/puppeteer/node/cli.js"
},
"engines": {
"node": ">=16.13.2"
}
},
"node_modules/puppeteer-core": {
"version": "21.11.0",
"resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.11.0.tgz",
"integrity": "sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==",
"license": "Apache-2.0",
"dependencies": {
"@puppeteer/browsers": "1.9.1",
"chromium-bidi": "0.5.8",
"cross-fetch": "4.0.0",
"debug": "4.3.4",
"devtools-protocol": "0.0.1232444",
"ws": "8.16.0"
},
"engines": {
"node": ">=16.13.2"
}
},
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
"license": "MIT",
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
}
},
"node_modules/socks": {
"version": "2.8.7",
"resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz",
"integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
"license": "MIT",
"dependencies": {
"ip-address": "^10.0.1",
"smart-buffer": "^4.2.0"
},
"engines": {
"node": ">= 10.0.0",
"npm": ">= 3.0.0"
}
},
"node_modules/socks-proxy-agent": {
"version": "8.0.5",
"resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
"integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.2",
"debug": "^4.3.4",
"socks": "^2.8.3"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"license": "BSD-3-Clause",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/streamx": {
"version": "2.25.0",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz",
"integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==",
"license": "MIT",
"dependencies": {
"events-universal": "^1.0.0",
"fast-fifo": "^1.3.2",
"text-decoder": "^1.1.0"
}
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/tar-fs": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
"integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
"license": "MIT",
"dependencies": {
"mkdirp-classic": "^0.5.2",
"pump": "^3.0.0",
"tar-stream": "^3.1.5"
}
},
"node_modules/tar-stream": {
"version": "3.1.8",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz",
"integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==",
"license": "MIT",
"dependencies": {
"b4a": "^1.6.4",
"bare-fs": "^4.5.5",
"fast-fifo": "^1.2.0",
"streamx": "^2.15.0"
}
},
"node_modules/teex": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
"integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
"license": "MIT",
"dependencies": {
"streamx": "^2.12.5"
}
},
"node_modules/text-decoder": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz",
"integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==",
"license": "Apache-2.0",
"dependencies": {
"b4a": "^1.6.4"
}
},
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
"license": "MIT"
},
"node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
"license": "MIT"
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
"node_modules/unbzip2-stream": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
"integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
"license": "MIT",
"dependencies": {
"buffer": "^5.2.1",
"through": "^2.3.8"
}
},
"node_modules/undici-types": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
"integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
"license": "MIT",
"optional": true
},
"node_modules/urlpattern-polyfill": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz",
"integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==",
"license": "MIT"
},
"node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
"license": "BSD-2-Clause"
},
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"license": "MIT",
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
}
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC"
},
"node_modules/ws": {
"version": "8.16.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"license": "ISC",
"engines": {
"node": ">=10"
}
},
"node_modules/yaml": {
"version": "2.8.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
"integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
"node": ">= 14.6"
},
"funding": {
"url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
"license": "MIT",
"dependencies": {
"buffer-crc32": "~0.2.3",
"fd-slicer": "~1.1.0"
}
}
}
}
FILE:package.json
{
"name": "notice-monitor",
"version": "1.0.1",
"description": "通用网站公告监控工具 - 支持任意政府公告/采购/招标网站自动化监控",
"main": "src/monitor.js",
"bin": {
"notice-monitor": "./src/cli.js"
},
"scripts": {
"start": "node src/monitor.js",
"test": "node test/test.js"
},
"keywords": [
"monitor",
"notice",
"procurement",
"crawler",
"automation",
"openclaw",
"skill"
],
"author": "营销总监",
"license": "MIT",
"dependencies": {
"puppeteer": "^21.0.0",
"yaml": "^2.3.0",
"commander": "^11.0.0",
"node-cron": "^3.0.0"
},
"engines": {
"node": ">=14.0.0"
}
}
FILE:skill.json
{
"name": "notice-monitor",
"version": "1.0.1",
"description": "通用网站公告监控工具 - 支持任意政府公告/采购/招标网站自动化监控",
"author": "营销总监",
"license": "MIT",
"category": "automation",
"tags": ["monitor", "crawler", "notification", "automation", "procurement"],
"repository": "https://clawhub.com/skills/notice-monitor",
"homepage": "https://clawhub.com/skills/notice-monitor",
"bugs": "https://clawhub.com/skills/notice-monitor/issues",
"requirements": {
"node": ">=14.0.0",
"openclaw": ">=1.0.0"
},
"dependencies": {
"puppeteer": "^21.0.0",
"yaml": "^2.3.0",
"commander": "^11.0.0"
},
"entry": "src/monitor.js",
"cli": "src/cli.js",
"config": {
"default": "configs/default.yaml",
"example": "configs/examples/"
},
"usage": {
"install": "clawhub install notice-monitor",
"config": "cp ~/.openclaw/skills/notice-monitor/configs/default.yaml ~/.openclaw/workspace/notice-monitor-config.yaml",
"run": "openclaw skill run notice-monitor --config ~/.openclaw/workspace/notice-monitor-config.yaml",
"cron": "openclaw skill cron notice-monitor enable"
},
"examples": [
{
"name": "黑龙江教育采购监控",
"config": "configs/examples/hlj-edu.yaml"
},
{
"name": "北京医疗招标监控",
"config": "configs/examples/beijing-medical.yaml"
},
{
"name": "上海 IT 项目监控",
"config": "configs/examples/shanghai-it.yaml"
}
],
"features": [
"多任务并行监控",
"自定义关键词过滤",
"多层级/多分类支持",
"自动去重",
"定时任务(Cron)",
"多通知渠道(DingTalk/微信/邮件/Webhook)",
"可定制报告模板"
],
"changelog": {
"1.0.0": {
"date": "2026-03-20",
"changes": [
"初始版本发布",
"支持多任务配置",
"关键词过滤",
"自动去重机制",
"DingTalk 通知集成"
]
}
}
}
FILE:src/monitor.js
#!/usr/bin/env node
/**
* notice-monitor - 通用公告监控引擎 v2
* 修复:页面加载和层级切换逻辑
*/
const puppeteer = require('puppeteer');
const fs = require('fs');
const path = require('path');
const yaml = require('yaml');
const { program } = require('commander');
program
.name('notice-monitor')
.description('通用公告监控工具')
.version('1.0.0')
.option('-c, --config <path>', '配置文件路径')
.option('-t, --task <name>', '执行指定任务')
.option('--dry-run', '测试运行,不发送通知')
.parse(process.argv);
const options = program.opts();
function loadConfig(configPath) {
const fullPath = path.resolve(configPath || '~/.openclaw/workspace/notice-monitor-config.yaml').replace('~', process.env.HOME);
if (!fs.existsSync(fullPath)) {
console.error(`❌ 配置文件不存在:fullPath`);
process.exit(1);
}
return yaml.parse(fs.readFileSync(fullPath, 'utf-8'));
}
class StateManager {
constructor(stateDir) {
this.stateDir = stateDir;
if (!fs.existsSync(stateDir)) fs.mkdirSync(stateDir, { recursive: true });
}
load(taskName) {
const file = path.join(this.stateDir, `pushed-taskName.toLowerCase().replace(/[^a-z0-9]/g, '-').json`);
return fs.existsSync(file) ? JSON.parse(fs.readFileSync(file, 'utf-8')) : [];
}
save(taskName, ids) {
const file = path.join(this.stateDir, `pushed-taskName.toLowerCase().replace(/[^a-z0-9]/g, '-').json`);
fs.writeFileSync(file, JSON.stringify(ids.slice(-1000), null, 2));
}
}
class Notifier {
static async send(config, message) {
if (config.type === 'dingtalk') {
try {
const { execSync } = require('child_process');
execSync(`openclaw message send --target "config.target" --message "message.replace(/"/g, '\\"')"`, { stdio: 'pipe' });
console.log('✅ 消息已发送');
} catch (e) {
console.error('❌ 发送失败:', e.message);
console.log(message);
}
} else {
console.log(message);
}
}
}
async function main() {
console.log('🔍 notice-monitor v1.0.0');
const config = loadConfig(options.config);
const stateManager = new StateManager(path.join(__dirname, '..', 'state'));
let browser;
try {
browser = await puppeteer.launch({
headless: 'new',
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu']
});
const page = await browser.newPage();
await page.setViewport({ width: 1920, height: 1080 });
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36');
const tasks = options.task ? config.tasks.filter(t => t.name === options.task) : config.tasks;
for (const task of tasks) {
console.log(`\n🚀 任务:task.name`);
console.log(` URL: task.url`);
const pushedIds = stateManager.load(task.name);
const newNotices = {};
const levels = task.levels || [{ name: '默认', selector: null }];
for (const level of levels) {
console.log(` 📍 level.name...`);
try {
// 加载页面
await page.goto(task.url, { waitUntil: 'domcontentloaded', timeout: 90000 });
// 等待表格数据出现
await page.waitForFunction(() => {
const rows = document.querySelectorAll('table tbody tr');
return rows.length > 0;
}, { timeout: 30000 }).catch(() => {});
await new Promise(r => setTimeout(r, 2000));
// 点击层级(省级通常默认显示,不需要点击)
if (level.selector && level.name !== '省级') {
const clicked = await page.evaluate((sel) => {
const els = Array.from(document.querySelectorAll('span, div, a, button'));
const target = els.find(e => {
const t = e.textContent?.trim();
return t === sel || t.includes(sel);
});
if (target?.click) { target.click(); return true; }
return false;
}, level.selector);
console.log(` 点击:'❌'`);
await new Promise(r => setTimeout(r, 3000));
} else if (level.selector) {
console.log(` 默认层级,跳过点击`);
}
// 提取数据
const notices = await page.evaluate(() => {
const rows = [];
document.querySelectorAll('table tbody tr').forEach(row => {
const cells = row.querySelectorAll('td');
if (cells.length >= 4) {
const title = cells[2]?.querySelector('a')?.textContent?.trim() || cells[2]?.textContent?.trim() || '';
const area = cells[3]?.textContent?.trim() || '';
const date = cells[4]?.textContent?.trim() || '';
if (title) rows.push({ title, area, date, id: `date_title.slice(0, 30)` });
}
});
return rows;
});
console.log(` 公告:notices.length 条`);
// 过滤
newNotices[level.name] = [];
const keywords = task.keywords || [];
for (const n of notices) {
const matches = keywords.some(k => n.title.includes(k));
if (matches && !pushedIds.includes(n.id)) {
newNotices[level.name].push(n);
pushedIds.push(n.id);
}
}
console.log(` 新增:newNotices[level.name].length 条`);
} catch (e) {
console.error(` 失败:e.message`);
}
}
stateManager.save(task.name, pushedIds);
const total = Object.values(newNotices).reduce((s, a) => s + a.length, 0);
if (total > 0 && !options.dryRun) {
await Notifier.send(task.notify, generateReport(task.name, newNotices));
} else if (options.dryRun) {
console.log('\n📝 报告:\n' + generateReport(task.name, newNotices));
} else {
console.log(' ✅ 无新增');
}
}
} catch (e) {
console.error('❌ 错误:', e.message);
process.exit(1);
} finally {
if (browser) await browser.close();
}
}
function generateReport(taskName, notices) {
const today = new Date().toLocaleDateString('zh-CN');
let r = `📢 taskName 日报\n📅 today\n\n`;
for (const [level, items] of Object.entries(notices)) {
r += `【level】items.length条\n'━'.repeat(35)\n`;
if (items.length === 0) { r += '\n'; continue; }
items.forEach((n, i) => {
r += `i+1️⃣ n.title\n 📍 n.area | 🕐 n.date\n\n`;
});
}
const total = Object.values(notices).reduce((s, a) => s + a.length, 0);
r += `'━'.repeat(35)\n✅ 今日新增:total条`;
return r;
}
main();
FILE:state/pushed--------.json
[
"2026-03-19_七台河职业学院网络攻防实训室竞争性磋商公告",
"2026-03-19_佳木斯职业学院佳木斯国家农高区现代农业产教联合体建设项目(二",
"2026-03-19_哈尔滨职业技术大学具身智能数据采集中心设备购置(二次)招标公",
"2026-03-18_佳木斯市中心医院X射线计算机体层摄影设备(二次)招标公告",
"2026-03-18_佳木斯市中心医院数字化X射线摄影系统(二次)招标公告",
"2026-03-20_哈尔滨医科大学寒地心血管病全国重点实验室设备更新项目第十五批",
"2026-03-20_哈尔滨金融学院基于业财融合的数字化门户及业务系统建设项目竞争",
"2026-03-20_黑龙江中医药大学附属第一医院肉类、蛋类及塑料制品、杂品配送服",
"2026-03-19_哈尔滨医科大学附属第一医院口眼医院屋面防水及玻璃穹顶更换工程",
"2026-03-19_哈尔滨医科大学附属第二医院重症医学科购置一次性使用输液延长管",
"2026-03-19_哈尔滨医科大学寒地心血管病全国重点实验室设备更新项目第二十批",
"2026-03-19_哈尔滨医科大学寒地心血管病全国重点实验室设备更新项目第十三批",
"2026-03-19_哈尔滨医科大学寒地心血管病全国重点实验室设备更新项目第十六批",
"2026-03-19_黑龙江省第二医院2026年医疗责任保险竞争性磋商公告",
"2026-03-19_哈尔滨医科大学寒地心血管病全国重点实验室设备更新项目第十七批",
"2026-03-19_哈尔滨医科大学寒地心血管病全国重点实验室设备更新项目第十一批",
"2026-03-19_哈尔滨医科大学寒地心血管病全国重点实验室设备更新项目第七批招",
"2026-03-19_哈尔滨医科大学附属第一医院学生通勤、临时用车竞争性磋商公告",
"2026-03-20_大庆市第四中学2026年度政府采购意向公告(第5批)",
"2026-03-20_佳木斯市职业技术学校2026年度政府采购意向公告(第25批)",
"2026-03-20_佳木斯市职业技术学校2024年07月至2024年11月政府采",
"2026-03-20_佳木斯市职业技术学校2024年11月政府采购意向",
"2026-03-20_佳木斯市职业技术学校2024年10月至2024年11月政府采",
"2026-03-20_佳木斯市职业技术学校2024年12月政府采购意向",
"2026-03-20_佳木斯市职业技术学校2024年09月政府采购意向",
"2026-03-20_佳木斯市职业技术学校2024年10月政府采购意向"
]