mirror of
https://github.com/hanzoai/world.git
synced 2026-08-05 06:22:26 +00:00
Sources — one abstraction, extended:
- Reddit and YouTube publish real RSS/Atom, so they are plain `Feed`s through
the existing rss-proxy; their hosts join rssDomainList (the one SSRF
boundary), which also gets them the warm cache + lake ingest for free.
- X / TikTok / LinkedIn expose posts only behind a credentialed API, so world
speaks that API and re-emits RSS 2.0 on its own origin
(/v1/world/social/{x,tiktok,linkedin}) — the handleFwdstart shape, referenced
as an ordinary `Feed`. Missing key → one skip log line and an empty channel,
never a 5xx. Credentials come from KMS, never git.
- A same-origin emitter bypasses handleRSSProxy, so it calls ingestFeedItems
itself; without that its items never reach the lake and monitors can't match
them.
- buildFwdstartRSS folds onto the shared buildRSS — one RSS emitter, not two —
which also gains XML escaping of upstream text.
- New `social` feed category in all three catalogs + panel/i18n, and in the MCP
feedCategories registry so the AI plane sees it too.
Topics — the Monitor IS the per-user topic store (per-user SQLite, namespace
`monitors`); no second store, endpoint or localStorage key was added:
- topicFeeds() synthesizes Feeds from a user's keywords, fetched through the
same fetchCategoryFeeds path, which folds them into the server-side lake so
the backend matches that topic on every device.
- TOPIC_KEYWORDS demoted to a default seed: analyzeCorrelationsCore takes the
user's topics and unions them in (threaded as an argument — this runs in a
worker). A topic the user typed is deliberate, so the trending-noise
suppression list now applies only to the seed.
- Both MonitorPanel surfaces (vanilla + React) stay in sync.
Co-authored-by: Hanzo Dev <dev@hanzo.ai>