Files
hanzo-dev ee91452345 feat(world): social sources + user topics that actually pull
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>
2026-07-27 16:19:41 -07:00
..
2026-01-10 17:36:14 +04:00