Repository navigation
What's Changed
- feat(errors): classify TypeNotFoundError as schema drift, not missing entity (#1549) by @axisrow in #1553
- feat(web): QR login for account onboarding (#1551) by @axisrow in #1555
- fix(auth): QR login review fixes missing from #1555 by @axisrow in #1559
- chore(docs): standard AO review replaces dual Claude+Codex convention by @axisrow in #1560
- feat(collector): parse MessageEntity spans and flatten RichText iv-pages (#1547) by @axisrow in #1554
- feat(sanitize): anti-prompt-injection sanitizer for Telegram content entering LLM prompts (#1546) by @axisrow in #1558
- feat(runtime): cross-process session lock and AuthKeyDuplicatedError retries (#1548) by @axisrow in #1556
- feat(transcription): speech-to-text для голосовых — порт transcription.py из telegram-mcp by @axisrow in #1561
- fix(filters): label-only метки переживают apply; keep-тег гардирует все авто-пути фильтрации by @axisrow in #1565
- feat(collector): preserve masked-hyperlink URLs in entities_json (#1492) by @axisrow in #1564
- fix(agent-tools): default-phone ACL pick skips inactive/broken accounts (#1485) by @axisrow in #1563
- feat(scheduler): queue-status — live collection progress with measured ETA by @axisrow in #1562
- feat(dm): reply drafts with atomic claim against double-send (#1429) by @axisrow in #1566
- test(db): close every raw sqlite3 connection left open by test helpers (#1494) by @axisrow in #1567
- chore(deps): update fastapi requirement from <0.143,>=0.136.3 to >=0.136.3,<0.144 by @dependabot[bot] in #1543
- feat(filters): low_engagement — флаг мёртвого вовлечения (views <10% подписчиков, окно 100 постов) by @axisrow in #1550
- test(quality): pin quality-scoring tests to offline default stub (#1445) by @axisrow in #1572
- feat(messages): topic_title рядом с topic_id при выдаче (#1552) by @axisrow in #1575
- fix(cli): no parallel Telegram pools — scheduler start / channel stats / collect --channel-id (#1569) by @axisrow in #1574
- feat(filters): whitelist-режим «авторский контент» (#1490) + filter flag — sticky manual (#1499) by @axisrow in #1573
- feat(ping): friendly pings for dormant DM contacts (#1415) by @axisrow in #1576
- feat(scheduler): CLI status reads live runtime_snapshots; raw settings set reaches the worker by @axisrow in #1577
- feat(scheduler): live RPC for trigger/cancel/clear-pending over telegram_commands (#1568) by @axisrow in #1578
- packaging: wheel ships tg_agent package; tg-agent --version prints correct name (#1448, #1447) by @axisrow in #1582
- feat(search): date window + json/csv output; structured weekly digest workflow by @axisrow in #1584
- fix(cli): reject unknown permission boolean values by @axisrow in #1609
- fix(cli): preserve Typer exit codes in production entrypoints by @axisrow in #1610
- fix(account): load session encryption key for env-only onboarding by @axisrow in #1612
- fix(cli): recognize console-script and configured daemon processes by @axisrow in #1611
- fix(cli): apply new pipeline filters after message loading by @axisrow in #1613
- fix(pipeline): preserve DAG publication relations on edit by @axisrow in #1614
- feat(skills): channel discovery workflow by keywords by @axisrow in #1615
- feat(filters): channel probe — pre-add quality card from a LIVE sample by @axisrow in #1622
- fix(cli): recognize macOS framework Python binary in daemon detection by @axisrow in #1623
- fix(analytics): pipeline-stats publish rate inflated 100x (5000% instead of 50%) by @axisrow in #1625
- fix(cli): reject translate detect --batch-size <= 0 (infinite loop, #1618) by @axisrow in #1624
- fix(cli): keep full message text in CSV output (#1617) by @axisrow in #1627
- fix(pipeline): keep A/B settings through export/import (#1621) by @axisrow in #1628
- fix(pipeline): persist A/B flags on pipeline add --node (#1620) by @axisrow in #1629
- hotfix: remove duplicated A/B kwargs breaking import_json (main red at b731cf6) by @axisrow in #1634
- fix(search,analytics): validate and normalize non-canonical date bounds (#1593) by @axisrow in #1633
- fix(channel): clean not-found instead of FK traceback for tag set/get (#1600) by @axisrow in #1630
- fix(search-query): validate regex patterns; report unavailable counts honestly (#1607) by @axisrow in #1631
- fix(cli): messages read --format json/csv survives empty results and errors (#1598) by @axisrow in #1632
- fix(calendar): --limit must not reorder the upcoming queue head (#1619) by @axisrow in #1626
- fix(filters): use saved filter-criteria thresholds in ChannelAnalyzer (#1596) by @axisrow in #1636
- feat(tasks): lease/TTL recovery for stranded interop claims (#1468) by @axisrow in #1638
- feat(dm): incoming-DM journal readability + web/REST surfaces (#1579) by @axisrow in #1639
- feat(dm): catch-up settings validation, dm status CLI, mark_processed wiring, queue log phone (#1581) by @axisrow in #1640
- fix(settings): encrypt embeddings API key at rest; mask secrets in CLI output (#1597) by @axisrow in #1642
- fix(cli): clean abort on EOF and Ctrl-C at confirmation prompts (#1590) by @axisrow in #1641
- fix(pipeline): forward backend/mode/image flags on pipeline add --json-file (#1594) by @axisrow in #1643
- fix(photo-loader): batch-create is atomic — no partial HELD batch on error (#1601) by @axisrow in #1644
- fix(skills): align documented commands with the CLI tree; document dialogs delete (#1605) by @axisrow in #1635
- feat(filters): high_volume flag — P95 of 24h message volume with absolute floor by @axisrow in #1645
- fix(paths): anchor runtime data/log dirs to cwd, not the package dir (#1595) by @axisrow in #1637
- feat(dm): agent tools for the DM cycle — journal, drafts, approve/reject, archive (#1580) by @axisrow in #1646
- perf(test): speed up full pytest runs and fix isolation by @axisrow in #1647
- fix(cli): search-query toggle/run report not-found instead of fake success (#1606) by @axisrow in #1648
- feat(channels): approval queue core and gate (provenance stage 5.1) by @axisrow in #1654
- test(env): detect stale editable installs with one clear failure (#1649) by @axisrow in #1650
- feat(filters): analyzer and prefilters skip human channels — provenance stage 4 (#1312) by @axisrow in #1651
- feat(shared): tg-shared package scaffold — storage Protocol, boundary (#1420) by @axisrow in #1653
- test(cli): cover the full daemon-autorestart decision path; document local hook wiring by @axisrow in #1652
- fix(cli): errors exit non-zero with stderr via shared cli_error helper by @axisrow in #1655
- docs(skills): digest items must end with bare source links by @axisrow in #1656
- docs(skills): digest item = title, body, ONE primary-source URL by @axisrow in #1657
- fix(telegram): rotate accounts on TL schema-drift parse failures (#1471) by @axisrow in #1659
- feat(analytics): usefulness content rating — deterministic prod report + LLM judge calibration axes by @axisrow in #1658
- feat(filters): calibrate usefulness dictionaries/tiers against judge labels by @axisrow in #1663
- feat(cli): batch search — several queries per call (#1668) by @axisrow in #1669
- fix(analytics): day-window post counter compared ISO date to space-separated boundary (#1665) by @axisrow in #1672
- fix(search): include length bounds in min/max-length filters by @axisrow in #1673
- fix(search): normalize datetime date bounds to UTC (#1666) by @axisrow in #1674
- feat(filters): P95 high_volume blocks collection + simultaneous copies are dupes by @axisrow in #1677
- perf(filters): incremental text-stats cache — analyze without five 27GB scans (#1679) by @axisrow in #1680
- ci: raise tests-shards wall budget to 10m on measured CI data by @axisrow in #1670
- fix(cli): mask tg_api_hash in settings get output (#1664) by @axisrow in #1671
- test(flood): assert flood-gate contracts behaviorally via the public API by @axisrow in #1678
Highlights
- Channel filtering: fast analyzer, spam waves closed — An incremental text-stats cache makes a full
filter analyzerun in seconds instead of five 27GB table scans (#1679, #1680); the P95high_volumeflag now blocks collection and simultaneous cross-channel copies count as dupes (#1571, #1677);low_engagementflags dead channels (views <10% of subscribers) (#1550); the «авторский контент» whitelist mode and a sticky manual flag give humans the final word (#1490, #1499);channel probeshows a live quality card before adding a channel (#1622); the approval queue gates new channels (provenance 5.1, #1654); human-approved channels are invisible to the analyzer (#1312); andanalytics usefulnessrates «полезное vs вода» with an optional LLM-judge calibration axis (#1658, #1663). - Search and digests — Batch search runs several keywords in one call (#1668); date windows plus json/csv output anchor the structured weekly-digest workflow (#1584); date bounds are validated and normalized to UTC with length bounds included (#1593, #1666, #1673); forum messages carry
topic_titlenext totopic_id(#1552); CSV keeps the full message text (#1617). - DM cycle and dormant-contact pings — The full incoming-DM flow lands: a readability journal (#1579), reply drafts with an atomic claim against double-send (#1429), catch-up settings with a live
dm status(#1581), and agent tools for journal/drafts/approve/archive (#1580); friendly pings re-engage dormant 1:1 dialogs on a decaying schedule (#1415); and voice/video notes transcribe via groq/telegram/openai/local whisper (#1561). - Security and resilience — An anti-prompt-injection sanitizer guards LLM prompts from Telegram content (#1546); a cross-process session lock prevents AuthKeyDuplicatedError (#1548); accounts rotate on TL schema-drift parse failures instead of failing the pass (#1471); the embeddings API key is encrypted at rest and secrets are masked in CLI output, including
tg_api_hash(#1597, #1664); stranded interop claims recover via lease/TTL (#1468); confirmation prompts survive EOF/Ctrl-C (#1590); and the errors-exit-non-zero contract is enforced repo-wide (#1655, #1610). - Ops, packaging and CI — Scheduler
trigger/task-cancel/clear-pendingbecome live RPC against the running worker (#1568),queue-statusreports measured ETA (#1562); the tg-shared package scaffold lands with a storage Protocol boundary (#1420); the wheel ships thetg_agentpackage andtg-agent --versionreports the right name (#1448); a detector fails fast on stale editable installs (#1649); CI test shards get a measured 10-minute budget (#1670); and the full pytest run gets faster with isolation fixed (#1647) — plus ~40 targeted fixes across CLI, pipelines, analytics and filters.
Full Changelog: v0.2.4.1...v0.2.4.2