Open Intel Atlas 是一個本地優先的公開情報監測基礎版。它會抓取公開資料源,整理成統一的事件格式,提供人類可讀的 newsroom、全屏世界地圖,以及給其他程式或 AI agent 呼叫的 JSON API。
目前版本:1.3.0
這不是 World Monitor 的 clone。此專案使用自己的資料模型、API contract、UI 版面、source registry 和本地 SQLite 儲存方式。
- Node.js 24+ 原生 HTTP server,無前端框架;MCP transport 使用官方 TypeScript SDK v2 與 Zod schema validation。
- 新的 canonical pipeline 採用
Source → Document → Story → Event,保留來源、raw fetch、衍生方法與證據 lineage。 - 33 個 source adapter 已註冊;26 個預設可啟用,7 個會在缺少設定、transport gate 未通過或未明確開啟時 fail closed。
- 每個來源各自保存 run status、最後成功/失敗、錯誤、筆數與 latency;單一來源失敗不會拖垮查詢 API。
- SQLite schema v5 保存每個來源的
next_due_at、lease、failure count、backoff 與 catch-up gap,以 append-onlystory_updates保存 consumer 可續接的 Story/Event 變化,並保存 Document-owned media、可稽核的 PromotionDecision 與獨立於事件地點的 RegionalRelevance;process 重啟後不會把排程、promotion/relevance audit 或 change cursor truth 歸零。 - 可使用 ETag/Last-Modified 時送出 conditional GET;HTTP 304 視為來源成功但不建立重複 Document。
- freshness 同時提供全域與 politics/technology/finance/hazards 分領域 coverage。
/api/v1/*提供 versioned documents、stories、events、entities、search、brief、durable change feed、representation profiles、source health 與 collector API;目前 source-level consumer contract 為1.2。/mcp提供 loopback-only、read-only 的 Atlas tools/resources;REST 與 MCP 共用同一個 backend capability layer,不各自計算 freshness、coverage 或 verification。- 首頁是 newsroom-first 摘要版面,顯示本期頭條、live desk、6 則最新報導、四個領域入口、搜尋與資料缺口;完整領域事件流、來源健康與 evidence view 位於
/domain.html?domain=politics|technology|finance|hazards。Hero、Latest 前三則與 Domain 子頁 lead 只在 backend-selectedrepresentative_media可remote_embed時顯示來源圖片,沒有合法圖片時使用自然收合的純文字版面。 /atlas.html是獨立全屏情報地圖;它以 cursor pagination 讀取 canonical/api/v1/events,只有具備可驗證座標的事件會放置 marker,但無座標事件仍保留在列表。國家關聯只使用 backendlocation.country_code,不從標題猜測。/api/dispatch、/api/events、/api/sources、/api/dashboard、/api/stories與/api/topics是由 canonical store 投影的 legacy compatibility surface;正式 UI 與新 consumer 應使用/api/v1或 MCP capability。- v1 canonical data 寫入單一
data/db/atlas.sqlite,以關聯表表達多領域資料,不再一類別一個 DB。 - 舊分類 DB 與 dashboard DB 可能繼續存在於本機,但不會由 v1 migration 刪除或由目前 runtime 讀寫;legacy
/api/*直接投影 canonical store。 - Runtime DB、logs、
.env都已由.gitignore排除,不會進 repo。
目前 source registry:
- 政治:GDELT DOC、BBC World RSS、U.S. Federal Register、Congress.gov、總統府、行政院、外交部、日本防衛省、NDL 國會會議錄 metadata;METI official Atom 已註冊但因 compliant Node transport 回 403 而預設停用。
- 科技:arXiv、CISA KEV、CISA Advisories、NVD CVE、OSV.dev、Semantic Scholar、JPCERT/CC Alerts。
- 金融:TWSE 重大訊息、SEC EDGAR、CoinGecko、Frankfurter、FRED、ECB、World Bank。
- 氣象/災害:USGS、NASA EONET、GDACS、ReliefWeb、臺灣 CWA、民生示警公開資料平台 NCDR active CAP、U.S. NWS、日本氣象廳 JMAXML、日本消防庁 FDMA 災害應變 RSS。
預設未啟用或缺少設定的來源會明確顯示 disabled_reason:Congress.gov、SEC EDGAR、FRED、ReliefWeb、CWA、Semantic Scholar 與 METI。METI 的 fixture/isolated contract 已完成,但正式 Atlas User-Agent 在 2026-08-30 取得 HTTP 403,因此不以瀏覽器偽裝繞過。市場觀測值、研究論文與 routine legislative/policy records 會保存為 Document,但不會自動把每個價位、論文或會議升格成 Event。
NVD attribution notice:
This product uses data from the NVD API but is not endorsed or certified by the NVD.
正式商用前,仍需要逐一確認每個 upstream source 的 terms、attribution、cache、rate limit、redistribution 限制。
npm start開啟:
http://localhost:8790
需求:
Node.js >= 24
原因是本地分類儲存使用 Node 內建的 node:sqlite。
scripts/atlas-tray.ps1 是 Windows 本機 runtime 的唯一 owner。它會使用工作區實際保存的 manosaba_icon_56x56_under10KB.png 作為托盤 icon,隱藏啟動後端,並提供:
- 雙擊 icon 或選擇「開啟 Atlas」開啟
http://127.0.0.1:8790。 - 啟動、停止、重新啟動後端與重新檢查 API 狀態。
- backend 異常結束後 bounded backoff 重啟。
- Explorer/taskbar 重啟與重複 launcher 呼叫時重新註冊既有 icon,不建立第二個 instance。
- 只停止自己建立的 process tree;若 port 已被其他程序使用,托盤不會接管或 broad-kill。
手動隱藏啟動:
wscript.exe .\scripts\start-atlas-tray.vbs托盤與 backend log 位於 data/logs/,已由 .gitignore 排除。
Windows 可能在第一次啟動時把新 icon 放進通知區域的 ^ overflow;是否固定顯示由使用者的 taskbar 偏好控制,安裝腳本不會修改個人化設定。
可選環境變數:
$env:PORT = "8790"
$env:ATLAS_AUTO_COLLECT = "true"
$env:ATLAS_DB_PATH = "data/db/atlas.sqlite"
$env:NVD_API_KEY = ""
npm startNVD_API_KEY 可留空。需要辨識或憑證的來源請依 .env.example 設定;未設定時該來源停用,不會用假資料替代。開發或離線測試可設 $env:ATLAS_AUTO_COLLECT = "false",GET 查詢不會觸發 provider I/O。
主要 v1 API:
GET /api/v1/health
GET /api/v1/profiles
GET /api/v1/domains
GET /api/v1/freshness
GET /api/v1/freshness?domain=hazards
GET /api/v1/sources
GET /api/v1/documents
GET /api/v1/documents/:id
GET /api/v1/stories
GET /api/v1/stories/:id
GET /api/v1/events
GET /api/v1/events/:id
GET /api/v1/entities
GET /api/v1/entities/:id/events
GET /api/v1/search?q=...
GET /api/v1/brief?profile=brief_compact_v1
GET /api/v1/brief?presentation=east_asia
GET /api/v1/changes?cursor=...&domain=politics
GET /api/v1/collector
POST /api/v1/collect?source=gdacs-events (loopback only;scheduler 啟用時回傳 202 queued)
列表支援 bounded limit=1..200 與 cursor。依資源可用 domain、source、document_type、event_type、severity、verification、lifecycle、country、entity、from、to、q 篩選。錯誤固定回傳 { "error": { "code", "message" } }。
Consumer profiles 由 /api/v1/profiles 發布,目前包含:
brief_compact_v1:Kuro 與一般 agent 的短摘要。change_feed_v1:可保存 cursor、可去重的 Story/Event 變化。story_detail_v1:Story 與 compact Event。evidence_pack_v1:OMI/分析 consumer 使用的較完整 evidence。source_status_v1、latest_events_v1、search_results_v1、domain_registry_v1。
在 REST 可分別用 /events?profile=latest_events_v1、/search?profile=search_results_v1、/stories/:id?profile=story_detail_v1、/sources?profile=source_status_v1 與 /domains?profile=domain_registry_v1 取得和 MCP 相同的投影。
Brief 的 presentation 支援 global、east_asia、taiwan_focus、japan_focus。這只影響 backend-owned selection,不改寫 Event verification、severity、confidence 或 location;區域合格內容不足時回傳較少 highlights 與 coverage_gaps,不以 global filler 補滿。來源所屬國與事件發生國是不同欄位,RegionalRelevance 不得拿來偽造 event_country。
/api/v1/changes 的 cursor 是 opaque 且綁定當次 domain/change_type。續接時必須帶回相同 filters;若要只接收之後的新變化,可先用 cursor=now 取得 head cursor。Kuro 的 last_cursor、安靜時間與 delivery log 仍由 Kuro 保存,Atlas 不會因讀取 change feed 自動發通知。
從 schema v1/v2 升級到 v3 時不會合成過去不存在的 update history;既有 Story 的目前狀態可由 brief/story API 取得,change feed 只會記錄 v3 上線後發生的 material changes。Schema v4 的 media migration 與 schema v5 的 PromotionDecision/RegionalRelevance migration 都是 additive,不解析舊 raw JSON、不抓網路、不做無界 backfill,也不把 presentation policy 變更冒充 Story update。
Representative media 是 Document-owned 的 optional additive projection,包含 document_id/source_id lineage。Outward query 會以 persisted media policy 與 current source media policy 共同計算 effective display policy,再跨 Story/Event supporting evidence deterministic 選圖;來源未同時通過 HTTPS、rights class、明確展示授權、terms evidence、review time 與 allowed-host policy 時,既有圖片也會立即 fail closed 為 candidate/link_only,不需等待下一次抓取。Newsroom 只有 remote_embed 才顯示圖片;REST 與 MCP 共用 consumer contract 1.2。
BBC News World RSS 是目前第一個有條件通過的 live media source:只有 runtime 明確設定 ATLAS_MEDIA_USAGE_CONTEXT=personal_noncommercial 時,才會以官方 feed 原樣提供的 ichef.bbci.co.uk thumbnail、BBC News attribution 與原文連結產生 remote_embed。未設定、設定錯誤或未來商業/公開部署都會 fail closed 回到 candidate;商業使用需另取得 BBC 授權。
本機 MCP endpoint:
http://127.0.0.1:8790/mcp
目前 tools:
atlas.latest
atlas.search
atlas.story.get
atlas.brief
atlas.changes
atlas.sources.status
目前 resources:
atlas://domains
atlas://sources/status
atlas://brief/latest
atlas://stories/{storyId}
Transport 支援 MCP 2026-07-28 的 per-request flow,也保留 2025-11-25/2025-06-18 legacy stateless requests。端點會拒絕非 loopback client 與非 localhost Host/Origin;它沒有 refresh、backfill、delete、publish、notify 或任意 URL fetch 工具。這只證明 Atlas 本機 endpoint 可用,不表示 Kuro、OMI、ChatGPT connector 或 Control Center 已完成設定與採用。
以下 legacy API 保留作 compatibility surface,由 canonical Event 即時投影,不會在 GET 時抓外部來源;目前正式 Newsroom 與 Full Map 均讀取 /api/v1:
GET /api/health
GET /api/sources
GET /api/events
GET /api/dispatch
GET /api/dashboard
GET /api/stories
GET /api/topics
GET /api/evidence
GET /api/map-points
/api/events、/api/dispatch、/api/dashboard、/api/stories、/api/topics、/api/evidence、/api/map-points 支援:
range=live | 24h | 7d | 30d | all
date=YYYY-MM-DD
category=geopolitics | infrastructure | finance | ai
limit=1..200
範例:
GET /api/dispatch?range=live&limit=50
GET /api/events?category=infrastructure&range=7d
GET /api/events?date=2026-05-25
GET /api/dashboard?range=24h
GET /api/topics?category=ai&range=7d
GET /api/evidence?range=24h
GET /api/map-points?category=geopolitics
/api/dashboard 僅保留 legacy compatibility。它會把 canonical Event 投影成舊 dashboard shape:
brief_cards
top_signals
watchlist_impacts
sector_heat
mini_map_points
data_status
evidence_feed
stories
topics
v1 runtime 會建立:
data/db/atlas.sqlite
既有 runtime 可能仍保有下列 legacy 檔案;v1 不會刪除或重寫它們:
data/db/geopolitics.sqlite
data/db/infrastructure.sqlite
data/db/finance.sqlite
data/db/ai.sqlite
data/db/sources.sqlite
data/db/dashboard.sqlite
這些是本機 runtime data,不應提交到 git。它們已被 .gitignore 排除。
每筆 canonical event 大致如下:
{
"id": "event:stable-id",
"event_type": "hazards.earthquake",
"primary_domain": "hazards",
"title": "Human readable title",
"summary": "Short normalized summary",
"event_severity": "high",
"verification_status": "official_confirmed",
"confidence": 0.9,
"representative_source": "USGS Earthquake Hazards",
"representative_url": "https://earthquake.usgs.gov/...",
"occurred_at": "2026-05-25T12:00:00.000Z",
"evidence_count": 1,
"independent_source_count": 1,
"location": {
"label": "USGS observed location",
"latitude": 38.9,
"longitude": -77
}
}ATLAS_AUTO_COLLECT=true時,poller 只負責喚醒;真正的 due time、lease 與 backoff 保存於atlas.sqlite。- 來源成功後依 cadence 加上 bounded jitter 排下次執行;失敗後從來源 cadence 開始指數 backoff,預設最多 24 小時。
- GDELT、Federal Register、USGS 支援最多 24 小時的 bounded time-window catch-up。
- CISA KEV 與 NVD 使用 provider history;RSS、即時警報與 snapshot API 為
latest_only,離線太久的 gap 會顯示SOURCE_GAP_UNRECOVERABLE,不假裝已補齊。 - source freshness 以
last_success_at與 cadence 計算;data_as_of另外表示該 scope 最近一次 Document ingestion。 /api/v1/freshness?domain=...只計算該領域的 enabled/failed/stale/disabled sources。
Windows 登入後常駐可先用 dry-run 檢查。Scheduled Task 採目前使用者 AtLogOn、interactive、hidden window 與 IgnoreNew,action 直接指向托盤 launcher;backend 不再由第二套登入 action 另外啟動:
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\install-atlas-logon-task.ps1 -WhatIf
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\install-atlas-logon-task.ps1 -StartNow解除 Windows 登入啟動不會停止目前正在執行的托盤:
powershell -NoProfile -ExecutionPolicy Bypass -File .\scripts\install-atlas-logon-task.ps1 -Uninstall- 目前 story clustering、entity extraction、嚴重程度與 confidence 是 versioned deterministic baseline,尚未接 LLM 或完整 NLP。
- GDELT、NASA EONET、NVD 等公開來源偶爾會 timeout 或 rate limit;API 會以
degraded: true表示 partial coverage。 - 沒有登入、權限管理、部署設定或 production queue。
- 尚未做完整 geocoding;沒有可靠座標的事件仍保留在列表,但不會出現在地圖上。
- scheduler truth 已持久化,但仍定位為本機單實例;SQLite lease 用於 crash recovery/防重入,不宣稱是多節點 distributed lock。
- Windows 未登入或電腦關機期間仍無法抓取;重新登入後只補 provider 仍保留且 adapter 宣告可恢復的 bounded 資料。
- Dispatch 還沒有排程寄送或 webhook;MCP 已提供 read-only 查詢,但尚未接入外部 consumer runtime。
- 前端 newsroom 仍是單機基礎版,尚未加入登入、個人 watchlist、互動圖表或真正的即時行情。
- BBC News World RSS 已完成第一輪個人非商業使用條款與 exact CDN allowlist 審核;其他真實來源仍維持
candidate。這個核准不涵蓋商業或公開部署。
- 加入 scheduled dispatch:email、webhook、chat tools。
- 以 Kuro 與 OMI 各一條 read-only adapter 完成實際 runtime adoption proof,並分別驗證 stale/partial/failure state。
- 為 key-gated adapters 配置合法憑證/識別,逐一跑 bounded live acceptance 與 terms review。
- 增加 correction/retraction、malformed payload、rate-limit 與 adapter fixture coverage。
- 加入可選 LLM-backed analysis,保留目前 no-key public source foundation。