openspec: change-ы manual-direction (ручное направление без LLM) и extract-post-sources (извлечение источников из постов) + sources/extract.py

This commit is contained in:
kpa39l
2026-09-22 17:37:07 +00:00
parent 1ae4b14d24
commit 6a1c894ff7
7 changed files with 316 additions and 0 deletions
@@ -0,0 +1,32 @@
# extract-post-sources
Извлечение источников новостей из текста постов (TG-каналы/сайты) и быстрое добавление в реестр.
## Why
Пользователь: нужно извлекать источники новостей из полученных постов (каналы/сайты,
откуда пришли новости), чтобы в следующий раз забирать новости напрямую из источника.
Сейчас ссылки в тексте постов никак не используются: всё приходит из sources.yaml,
а репосты/упоминания других каналов и сайтов теряются.
## What Changes
- **sources/extract.py** (новый): `extract_sources_from_text(text) -> list[dict]` —
находит в тексте ссылки на TG-каналы (t.me/handle, @handle, t.me/s/handle) и
внешние сайты (https://domain), исключает ссылки на сам пост (t.me/channel/postid),
дедуплицирует. Ограничение: не более 5 найденных на пост (шум).
- **web/app.py**:
- helper `_post_sources(post)` → список {kind, address, slug_hint, known} для карточки
(known = slug_hint уже есть в sources).
- В render candidates/selected передаёт `post_sources`.
- POST `/sources/add-from-post`: {address} → parse_address + add_or_update_source
(переиспользует существующий CRUD). Возвращает redirect на ту же страницу с did-сообщением.
- **web/templates/candidates.html / selected.html**: блок «🌐 Источники из поста» под бейджами:
для каждого найденного — `@handle` / `domain`, бейдж «в реестре» или кнопка «➕».
## Impact
- В карточках кандидатов/отобранных видны ссылки на внешние каналы/сайты из текста.
- Один клик — добавить источник в реестр (yaml + БД, как ручное добавление).
- Никаких LLM-вызовов — regex-извлечение, бесплатно. Дообогащение модели для
одобренных — отдельная задача (по кнопке, экономия токенов).