Skip to content

Repository files navigation

Open Intel Atlas

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-only story_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-selected representative_mediaremote_embed 時顯示來源圖片,沒有合法圖片時使用自然收合的純文字版面。
  • /atlas.html 是獨立全屏情報地圖;它以 cursor pagination 讀取 canonical /api/v1/events,只有具備可驗證座標的事件會放置 marker,但無座標事件仍保留在列表。國家關聯只使用 backend location.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

Windows 托盤常駐

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 start

NVD_API_KEY 可留空。需要辨識或憑證的來源請依 .env.example 設定;未設定時該來源停用,不會用假資料替代。開發或離線測試可設 $env:ATLAS_AUTO_COLLECT = "false",GET 查詢不會觸發 provider I/O。

API

主要 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..200cursor。依資源可用 domainsourcedocument_typeevent_typeseverityverificationlifecyclecountryentityfromtoq 篩選。錯誤固定回傳 { "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_v1latest_events_v1search_results_v1domain_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 支援 globaleast_asiataiwan_focusjapan_focus。這只影響 backend-owned selection,不改寫 Event verification、severity、confidence 或 location;區域合格內容不足時回傳較少 highlights 與 coverage_gaps,不以 global filler 補滿。來源所屬國與事件發生國是不同欄位,RegionalRelevance 不得拿來偽造 event_country

/api/v1/changes 的 cursor 是 opaque 且綁定當次 domainchange_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_idsource_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 為 candidatelink_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

本機 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-252025-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 排除。

Event Contract

每筆 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
  }
}

排程、catch-up 與 freshness

  • 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。

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages