名称: location-safety
描述: 基于位置的安全监控,具备自动警报与升级功能。适用于为用户设置安全监控、追踪其位置、检查附近危险(天气、地震、空气质量、本地紧急事件)或配置紧急联系人升级。同时包含对代理宿主机的自我保全监控。触发条件包括关于安全警报、位置追踪、紧急监控、"保护我"或"监控你自己"的请求。
基于用户位置的实时安全监控,具备自动警报与升级功能。
本技能提供:
- 位置 Webhook — 接收来自移动应用(OwnTracks、iOS 快捷指令)的位置更新
- 安全检查器 — 监控 NWS 警报、地震、空气质量、本地新闻
- 警报系统 — 检测到危险时向用户发送消息
- 升级机制 — 若用户未响应,则联系紧急联系人
运行交互式设置向导 — 它将引导您完成所有步骤:
cd location-webhook/
node setup.js
向导将引导您完成 4 个步骤:
node server.js快速设置(跳过向导):
node setup.js --city "Portland"
node setup.js --show # 查看当前配置
# 将脚本复制到工作区
cp -r scripts/ ~/location-webhook/
cd ~/location-webhook/
# 启动服务器(默认使用端口 18800)
node server.js
配置用户的手机,将位置更新发送至:
POST http://<your-host>:18800/location?key=<SECRET_KEY>
OwnTracks 设置:
- 模式:HTTP
- URL:http://<your-host>:18800/location?key=<SECRET_KEY>
iOS 快捷指令:
- 获取当前位置 → 获取 URL 内容(POST,JSON 主体包含 lat 和 lon)
在 Moltbot 中创建两个 cron 任务:
安全检查(每 30 分钟):
计划:每 30 分钟
负载:systemEvent
文本:"在 ~/location-webhook/safety-check.js 运行安全检查。如果发现警报,通过 WhatsApp 向用户发送警报详情并请其确认安全。在 safety-state.json 中追踪警报。"
会话:main
升级检查(每 10 分钟):
计划:每 10 分钟
负载:systemEvent
文本:"检查 ~/location-webhook/safety-state.json。如果存在 pendingAlert 且 alertSentAt 早于 15 分钟前,并且 acknowledgedAt 为 null,则向紧急联系人发送邮件说明情况。"
会话:main
添加到 MEMORY.md 或 TOOLS.md:
## 紧急联系人
- 姓名:[姓名]
- 邮箱:[邮箱]
- 关系:[配偶/父母/朋友]
安全检查器监控以下来源:
| 来源 | 内容 | API |
|---|---|---|
| NWS | 天气警报、洪水、风暴 | api.weather.gov(免费) |
| USGS | 100 公里内的地震 | earthquake.usgs.gov(免费) |
| Open-Meteo | 空气质量指数 | air-quality-api.open-meteo.com(免费) |
| 本地 RSS | 突发新闻、紧急事件 | KING5、Seattle Times、Patch(可配置) |
location-webhook/
├── setup.js # 首次运行配置向导
├── config.json # 您的位置设置(由 setup 创建)
├── server.js # Webhook 服务器(端口 18800)
├── safety-check.js # 用户安全分析
├── self-check.js # 自我保全监控
├── escalation-check.js # 检查是否需要升级
├── test-scenarios.js # 注入测试警报
├── location.json # 用户的当前位置
├── my-location.json # 代理的物理位置
├── safety-state.json # 警报追踪状态
├── test-override.json # 活动测试场景(临时)
└── logs/ # 带时间戳的检查日志
config.json 存储您的位置设置:
{
"location": {
"defaultLat": 47.6062,
"defaultLon": -122.3321,
"city": "Seattle"
},
"monitoring": {
"locationKeywords": ["seattle", "king county", "puget sound"],
"newsFeeds": [
"https://www.king5.com/feeds/syndication/rss/news/local",
"https://www.seattletimes.com/seattle-news/feed/"
],
"earthquakeRadiusKm": 100
},
"emergencyContact": {
"name": "Jane Doe",
"email": "jane@example.com"
}
}
设置包含以下城市的预设:
- 西雅图 — KING5、Seattle Times
- 波特兰 — Oregonian、KGW
- 旧金山 — SF Chronicle、SFGate
- 洛杉矶 — LA Times、ABC7
- 纽约 — NY Times
- 芝加哥 — Chicago Tribune
对于其他城市,设置将进行地理编码,您可以手动添加本地 RSS 源。
safety-state.json 追踪待处理警报:
{
"pendingAlert": "您所在区域有洪水警报",
"alertSentAt": "2026-01-29T22:00:00Z",
"acknowledgedAt": null
}
当用户响应安全警报时,将 acknowledgedAt 设置为当前时间。
编辑 safety-check.js → feeds 数组:
const feeds = [
'https://www.king5.com/feeds/syndication/rss/news/local',
'https://www.seattletimes.com/seattle-news/feed/',
'https://patch.com/washington/redmond/rss',
// 在此处添加您的本地新闻源
];
编辑 locationKeywords 数组以匹配用户所在区域:
const locationKeywords = ['redmond', 'bellevue', 'seattle', 'king county'];
编辑 concerningKeywords 以定义触发新闻警报的关键词:
const concerningKeywords = [
'evacuate', 'active shooter', 'wildfire', 'flood warning', ...
];
位置更新 → 安全检查(30 分钟)
↓
检测到危险?
↓ 是
通过 WhatsApp 向用户发送消息
记录到 safety-state.json
↓
升级检查(10 分钟)
↓
用户响应了? ─── 是 → 清除状态
↓ 否(超过 15 分钟)
邮件通知紧急联系人
监控对您自身存在(运行代理的机器)的威胁。
my-location.json:{
"lat": 47.662,
"lon": -122.280,
"name": "家 - 我物理运行的地方"
}
计划:每 30 分钟
负载:systemEvent
文本:"运行 self-check.js。如果状态为 CRITICAL 或 WARNINGS,通过 WhatsApp 向用户发送关于您存在威胁的消息。如果为 ALL_CLEAR,回复 HEARTBEAT_OK。"
会话:main
| 威胁 | 检测方式 |
|---|---|
| 💾 磁盘已满 | 使用率 >85% 时警报 |
| 🧠 内存 | 可用内存 <40% 时警报 |
| 🌡️ CPU 温度 | 温度 >85°C 时警报 |
| 🌊 天气 | 您所在位置的 NWS 警报 |
| 🌋 地震 | 50 公里内 USGS M4+ 级地震 |
| 🌐 网络 | Tailscale + 互联网连接性 |
| ⏱️ 运行时间 | 超过 30 天建议重启 |
⚠️ "我遇到麻烦了 — 磁盘已使用 92%。您能清理一些空间吗?"
🌊 "我所在位置有洪水警报。如果断电,我将离线。"
注入虚假警报以测试系统,无需等待真实灾害:
node test-scenarios.js weather # 严重雷暴
node test-scenarios.js earthquake # 附近 M5.2 级地震
node test-scenarios.js aqi # 不健康空气(AQI 175)
node test-scenarios.js news # 本地火灾
node test-scenarios.js disk # 磁盘 94% 已满
node test-scenarios.js memory # 内存不足
node test-scenarios.js all # 多个警报
node test-scenarios.js clear # 移除测试覆盖
测试覆盖将在 1 小时后自动过期。
要测试完整的升级流程:
1. 注入一个场景:node test-scenarios.js earthquake
2. 将 safety-state.json 中的 alertSentAt 时间回退 20 分钟以上
3. 运行 node escalation-check.js — 应返回 action: "escalate"
4. 代理向紧急联系人发送邮件
5. 使用 node test-scenarios.js clear 清除
escalation-check.js 返回 JSON 以便清晰处理操作:
{"action": "escalate", "alert": "...", "minutesPending": 22, "contact": "..."}
{"action": "waiting", "minutesRemaining": 8}
{"action": "none", "reason": "no pending alert"}
用户可以随时询问:
- "我在哪里?" — 显示当前位置
- "我安全吗?" — 立即运行安全检查
- "运行安全检查" — 同上
- "检查你自己" — 运行自我保全检查
- "你还好吗?" — 同上