Skip to content

Feat/daily push epic 179#218

Merged
jerry609 merged 17 commits into
devfrom
feat/daily-push-epic-179
Mar 3, 2026
Merged

Feat/daily push epic 179#218
jerry609 merged 17 commits into
devfrom
feat/daily-push-epic-179

Conversation

@jerry609

@jerry609 jerry609 commented Mar 3, 2026

Copy link
Copy Markdown
Owner

No description provided.

jerry609 and others added 17 commits March 2, 2026 19:56
Multi-channel push infrastructure with structured digest cards:

- #187: Integrate HF upvotes into Judge scoring prompt
- #180: Add digest_card extraction (highlight/method/finding/tags)
  with new LLM prompt, email template rendering, markdown output
- #181: MinerU Cloud API client for PDF figure extraction
- #182: Apprise multi-channel push layer with YAML config
- #183-185: Channel formatters (Telegram MarkdownV2, Discord Rich
  Embed, WeCom markdown+news, Feishu/Lark interactive card)
- #186: RSS 2.0 + Atom feed endpoints (/api/feed/daily.xml, .atom)

Also creates follow-up issues #190 (Push Channel Settings UI)
and #191 (Dashboard Digest Card Enhancement).

56 new tests, all passing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add docs/proposals/agentswarm-design.md covering multi-agent
  orchestration architecture, adapter pattern, session management,
  skills ecosystem, and OpenCode/OpenClaw/oMo integration (refs #197, #214)
- Add Playwright e2e test scaffolding for web dashboard (smoke,
  papers, research specs)
- Update web/.gitignore for Playwright artifacts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings March 3, 2026 10:02
@vercel

vercel Bot commented Mar 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
paper-bot Ready Ready Preview, Comment Mar 3, 2026 10:02am

@jerry609
jerry609 merged commit 04996ff into dev Mar 3, 2026
3 checks passed
@gemini-code-assist

Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

此拉取请求引入了名为 AgentSwarm 的多 Agent 协作平台的重大架构转变,旨在简化将研究论文转化为可复现代码的过程。它通过集成 Hugging Face Daily Papers 并提供强大的缓存和趋势功能,增强了每日论文推送系统,并增加了用于管理订阅的 Telegram 命令 API。此外,推送通知系统通过重试机制和幂等性变得更具弹性,项目文档也已重组以反映这些变化并提高可维护性。Web 前端现在包含端到端测试以确保稳定性。

Highlights

  • AgentSwarm 设计提案: 引入了一份全面的 AgentSwarm 设计文档,详细阐述了其架构、核心组件(Agent 路由器、适配器、消息总线、会话管理器)、UI/UX、API、ACI 命令以及分阶段路线图。旨在将“论文到可复现代码”流程从单一编排器模式升级为多 Agent 协作平台。
  • Hugging Face Daily Papers 集成增强: 增强了 HFDailyPapersConnector,增加了缓存、热门论文检索和 API 错误优雅降级功能。HFDailyAdapter 现在能从外部 URL 中提取 arXiv ID,以改进去重逻辑。
  • Telegram 推送命令 API: 新增了一个 FastAPI 端点(/api/push/telegram/command),用于处理 Telegram 命令,支持按关键词或追踪订阅/取消订阅每日摘要、列出订阅以及获取今日热门论文。
  • Apprise 通知器功能增强: 为推送通知实现了带指数退避的重试逻辑,并增加了幂等性机制以防止在 TTL 内重复推送。同时,错误代码现在被映射,以便更好地进行故障排查。
  • 文档结构重组: 将 docs/DEEPCODE_TODO.md 重命名为 docs/AGENTSWARM_TODO.md,并创建了 docs/archive 目录,用于存放过时文档,包括一个新的 docs/archive/README.md
  • 端到端测试设置: 引入了 Playwright 进行 Web 前端的端到端测试,包括对各个页面的冒烟测试以及对论文和研究部分的特定测试。

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • README.md
    • 更新了与 Paper2Code/AgentSwarm 相关的描述
    • 新增了“复现执行层迁移说明”部分
  • docs/AGENTSWARM_TODO.md
    • docs/DEEPCODE_TODO.md 重命名
    • 更新了标题以反映 AgentSwarm Studio
  • docs/HF_DAILY_SOURCE.md
    • 新增文档,详细说明 Hugging Face Daily Papers 源连接器和适配器 API
  • docs/archive/PROJECT_ISSUE_BACKLOG_legacy.md
    • 重命名并移动到 docs/archive
  • docs/archive/README.md
    • 新增归档目录的 README,列出已归档文档和维护约定
  • docs/archive/issues/190-settings-push-channel-ui.md
    • 重命名并移动到 docs/archive/issues
  • docs/archive/issues/191-dashboard-digest-card-enhancement.md
    • 重命名并移动到 docs/archive/issues
  • docs/proposals/agentswarm-design.md
    • 新增一份详细的 AgentSwarm 平台设计提案
  • docs/runbooks/daily_push_ops.md
    • 新增每日推送操作手册,涵盖渠道配置、Telegram Webhook、质量审计和故障排查
  • scripts/audit_daily_push_reports.py
    • 新增 Python 脚本,用于审计每日推送报告的质量覆盖率
  • src/paperbot/api/main.py
    • 导入并包含了新的 push_commands 路由器
  • src/paperbot/api/routes/init.py
    • push_commands 添加到 __all__ 列表中
  • src/paperbot/api/routes/push_commands.py
    • 新增 FastAPI 路由器,用于 Telegram 命令 Webhook,处理订阅和摘要检索
  • src/paperbot/application/services/paper_search_service.py
    • 修改了 _paper_key,优先使用稳定的身份键(DOI, arXiv)进行去重
  • src/paperbot/infrastructure/adapters/hf_daily_adapter.py
    • 增强了适配器,增加了 get_dailyget_trending 方法
    • 从外部 URL 中提取 arXiv ID,以改进去重逻辑
  • src/paperbot/infrastructure/connectors/hf_daily_papers_connector.py
    • 更新了连接器,增加了内存缓存、API 调用重试逻辑
    • 新增了按不同排序模式检索每日和热门论文的方法
  • src/paperbot/infrastructure/push/init.py
    • 导出了 TelegramSubscriptionStore
  • src/paperbot/infrastructure/push/apprise_notifier.py
    • 实现了带指数退避的重试逻辑
    • 新增了错误代码映射和推送通知的幂等性功能
  • src/paperbot/infrastructure/push/telegram_subscription_store.py
    • 新增类,用于 Telegram 摘要订阅的轻量级持久化
  • tests/unit/test_apprise_notifier.py
    • 新增单元测试,用于 AppriseNotifier 中的重试逻辑、错误代码映射和幂等性
  • tests/unit/test_audit_daily_push_reports.py
    • 新增单元测试,用于每日推送报告审计脚本
  • tests/unit/test_hf_daily_adapter.py
    • 新增单元测试,用于 HFDailyAdapter 的新方法和 arXiv ID 提取
  • tests/unit/test_hf_daily_papers_connector.py
    • 新增单元测试,用于 HFDailyPapersConnector 的缓存、趋势模式和错误降级
  • tests/unit/test_paper_search_service_rrf.py
    • 新增单元测试,验证 RRF 去重优先使用共享的 arXiv 身份
  • tests/unit/test_push_channel_e2e.py
    • 新增端到端测试,用于推送通知渠道,包括成功和失败场景
  • tests/unit/test_push_commands_route.py
    • 新增单元测试,用于 Telegram 命令 API 端点
  • web/.gitignore
    • 新增 Playwright 测试结果和缓存的忽略条目
  • web/README.md
    • 将“DeepCode Studio”的描述更新为“AgentSwarm Studio”
  • web/e2e/papers.spec.ts
    • 新增 Playwright 端到端测试,用于论文页面
  • web/e2e/research.spec.ts
    • 新增 Playwright 端到端测试,用于研究页面
  • web/e2e/smoke.spec.ts
    • 新增 Playwright 冒烟测试,用于各种网页
  • web/package-lock.json
    • 更新 package-lock.json 以包含 Playwright 依赖项
  • web/package.json
    • 新增 Playwright 作为开发依赖项
    • 新增用于端到端测试的脚本
  • web/playwright.config.ts
    • 新增 Playwright 配置文件,用于端到端测试
Activity
  • 此拉取请求引入了一个重要的功能史诗,“每日推送史诗 179”,涉及重大的新开发和架构变更。
  • 创建了新的文档,包括 AgentSwarm 的详细设计提案和每日推送操作手册。
  • 更新并重组了现有文档。
  • 新增了用于 Telegram 推送命令和上下文生成的新 API 端点。
  • 核心服务和基础设施组件通过缓存、重试机制和改进的去重逻辑等新功能得到了增强。
  • 新增了一个用于审计每日推送报告的 Python 脚本。
  • Web 前端已更新以反映新的 AgentSwarm 品牌,并现在包含一套使用 Playwright 进行的全面端到端测试。
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@coderabbitai

coderabbitai Bot commented Mar 3, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/daily-push-epic-179

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request significantly enhances and refactors the 'Daily Push' feature (Epic 179), improving system robustness and scalability by introducing new features such as Hugging Face Daily Papers as a data source and Telegram command hooks for daily digest management. A security audit, however, identified a high-severity Broken Access Control (IDOR) vulnerability in the Telegram command endpoint and a medium-severity CORS misconfiguration in the main API setup. These critical security issues must be addressed before merging to prevent unauthorized access to user data and potential cross-origin attacks. Additionally, the code review noted overall high quality, with improvements in apprise push reliability, paper deduplication logic, and extensive testing, alongside comprehensive documentation. Minor suggestions were made for refining exception handling and addressing hardcoded configurations to further enhance robustness and flexibility.

Comment on lines +86 to +89
async def telegram_command(body: TelegramCommandRequest):
store = TelegramSubscriptionStore()
command, scope, value = _parse_telegram_command(body.text)
subscriptions = store.list_subscriptions(chat_id=body.chat_id)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

security-high high

The /api/push/telegram/command endpoint is vulnerable to Insecure Direct Object Reference (IDOR). It accepts a chat_id directly from the request body and uses it to list, subscribe, or unsubscribe users without any authentication or verification that the request actually comes from Telegram or the owner of the chat_id. An attacker could exploit this to disclose sensitive subscription data or modify subscriptions for any user by guessing or obtaining their chat_id.

To remediate this, implement a verification mechanism for the webhook. For Telegram, you should use a secret token in the webhook URL and verify it in the handler, or validate that the request originates from Telegram's official IP ranges.

async def dispatch(self, task: SwarmTask) -> AgentResult:
"""Dispatch a task to the best agent."""
adapter = self._select_adapter(task)
session = await self.session_mgr.get_or_create(adapter, task.workspace)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

dispatch 方法中,使用了 self.session_mgr,但它并未在 __init__ 方法中被初始化。为了保持设计文档的严谨性,建议在 __init__ 中添加 session_mgr 的初始化逻辑,例如:

def __init__(self, adapters: Dict[str, AgentAdapter], session_mgr: SessionManager, config: RouterConfig):
    self.adapters = adapters
    self.session_mgr = session_mgr
    self.config = config

Comment on lines +54 to +57
try:
payload = json.loads(file.read_text(encoding="utf-8"))
except Exception:
continue

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

这里的异常捕获过于宽泛(except Exception),可能会掩盖一些意料之外的错误。建议捕获更具体的异常,例如 json.JSONDecodeErrorIOError,并考虑在捕获异常时打印一条警告日志,以便于调试。

        except (json.JSONDecodeError, IOError) as e:
            print(f"Warning: Could not load or parse {file.name}: {e}")
            continue


router = APIRouter()

_REPORTS_DIR = Path("./reports/dailypaper")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

报告目录 _REPORTS_DIR 被硬编码为 ./reports/dailypaper。这会降低代码的灵活性和可测试性。建议通过配置(例如,从环境变量或统一的配置对象)来获取此路径,以便在不同环境中轻松修改。同时需要 import os

Suggested change
_REPORTS_DIR = Path("./reports/dailypaper")
_REPORTS_DIR = Path(os.getenv("PAPERBOT_REPORTS_DIR", "./reports/dailypaper"))

Comment on lines +25 to +30
try:
payload = json.loads(self._path.read_text(encoding="utf-8"))
if isinstance(payload, dict):
return payload
except Exception:
return {}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

这里的异常捕获过于宽泛(except Exception),可能会掩盖一些意料之外的错误,例如权限问题。建议捕获更具体的异常,如 json.JSONDecodeErrorIOError,并考虑在捕获后记录警告,以便于问题排查。

Suggested change
try:
payload = json.loads(self._path.read_text(encoding="utf-8"))
if isinstance(payload, dict):
return payload
except Exception:
return {}
try:
payload = json.loads(self._path.read_text(encoding="utf-8"))
if isinstance(payload, dict):
return payload
except (json.JSONDecodeError, IOError):
# logger.warning("Failed to load subscription store at %s", self._path)
return {}

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends PaperBot’s “daily push” ecosystem by adding push-channel resiliency (retries/idempotency/error codes), a Telegram command webhook + subscription persistence, and a Hugging Face Daily Papers source upgrade (cache + trending + identity-based dedup), alongside Playwright E2E scaffolding and supporting docs/tests.

Changes:

  • Add Playwright E2E setup for the Next.js web app (config, scripts, smoke/spec tests, ignored artifacts).
  • Implement Telegram /subscribe|/unsubscribe|/list|/today command endpoint with a lightweight JSON subscription store.
  • Improve push delivery reliability (retry/backoff, idempotency, normalized error codes) and strengthen HF Daily ingestion (cache, trending ranking, arXiv identity inference, RRF dedup update).

Reviewed changes

Copilot reviewed 30 out of 34 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
web/playwright.config.ts Adds Playwright test runner configuration + optional Next.js dev server startup.
web/package.json Adds E2E test scripts and Playwright dev dependency.
web/package-lock.json Locks @playwright/test / playwright dependencies.
web/e2e/smoke.spec.ts Adds basic route smoke tests for core pages.
web/e2e/research.spec.ts Adds minimal E2E assertions for the research page.
web/e2e/papers.spec.ts Adds minimal E2E assertions for the papers page.
web/README.md Updates product feature naming (“AgentSwarm Studio”).
web/.gitignore Ignores Playwright output folders (reports, traces, blob-report).
tests/unit/test_push_commands_route.py Adds unit tests for Telegram command endpoint behaviors.
tests/unit/test_push_channel_e2e.py Adds mocked “all channels” push E2E tests with retry/error mapping.
tests/unit/test_paper_search_service_rrf.py Adds RRF dedup test preferring shared arXiv identity across sources.
tests/unit/test_hf_daily_papers_connector.py Adds connector tests for cache, trending modes, and graceful degradation.
tests/unit/test_hf_daily_adapter.py Adds adapter tests for daily/trending methods and arXiv identity inference.
tests/unit/test_audit_daily_push_reports.py Adds tests for new audit script helpers (markdown + CSV outputs).
tests/unit/test_apprise_notifier.py Extends notifier tests for retry behavior, error-code mapping, idempotency.
src/paperbot/infrastructure/push/telegram_subscription_store.py Implements file-backed Telegram subscription persistence.
src/paperbot/infrastructure/push/apprise_notifier.py Adds retry/backoff, idempotency fingerprinting, and error-code mapping.
src/paperbot/infrastructure/push/init.py Exports TelegramSubscriptionStore from push package.
src/paperbot/infrastructure/connectors/hf_daily_papers_connector.py Adds cache/metrics, trending ranking, and degraded-mode handling.
src/paperbot/infrastructure/adapters/hf_daily_adapter.py Adds daily/trending adapter methods + arXiv identity extraction from external URLs.
src/paperbot/application/services/paper_search_service.py Makes dedup key prefer stable identities (DOI/arXiv/etc.) over title hash.
src/paperbot/api/routes/push_commands.py Adds Telegram command webhook endpoint for subscriptions + /today titles.
src/paperbot/api/routes/init.py Registers new push_commands route module export.
src/paperbot/api/main.py Includes the new Push router under /api.
scripts/audit_daily_push_reports.py Adds a CLI tool to sample and audit digest-card coverage across reports.
docs/runbooks/daily_push_ops.md Adds ops runbook for channel config, Telegram webhook, audit, and triage.
docs/proposals/agentswarm-design.md Adds AgentSwarm design proposal document.
docs/archive/issues/191-dashboard-digest-card-enhancement.md Archives historical issue draft.
docs/archive/issues/190-settings-push-channel-ui.md Archives historical issue draft.
docs/archive/README.md Adds documentation archive index and conventions.
docs/archive/PROJECT_ISSUE_BACKLOG_legacy.md Archives legacy backlog as historical reference.
docs/HF_DAILY_SOURCE.md Documents HF Daily connector/adapter APIs, cache, and metrics.
docs/AGENTSWARM_TODO.md Renames/updates TODO doc title to AgentSwarm Studio.
README.md Updates top-level README to reflect AgentSwarm + repro context endpoints and docs links.
Files not reviewed (1)
  • web/package-lock.json: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

score, record = candidate
date_key = _record_date(record)
if mode == "new":
return (date_key.timestamp(), date_key, record.upvotes)

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In _candidate_sort_key, the mode == "new" branch calls date_key.timestamp(). When _record_date() falls back to datetime.min (e.g., missing/invalid submitted_on_daily_at and published_at), datetime.min.timestamp() can raise on some platforms/Python builds (out-of-range timestamp). Consider sorting directly on the datetime value (or guarding timestamp() with a safe fallback) to avoid hard failures when dates are missing.

Suggested change
return (date_key.timestamp(), date_key, record.upvotes)
try:
date_ts = date_key.timestamp()
except (OverflowError, OSError, ValueError):
# Fallback for out-of-range or otherwise invalid datetimes
# (e.g., datetime.min on platforms where .timestamp() fails).
date_ts = float("-inf")
return (date_ts, date_key, record.upvotes)

Copilot uses AI. Check for mistakes.
Comment thread web/e2e/papers.spec.ts
);
const count = await importBtn.count();
// At least some action button should be present
expect(count).toBeGreaterThanOrEqual(0);

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

expect(count).toBeGreaterThanOrEqual(0) is always true (locator counts are never negative), so this test will never fail even if no import/export actions exist. If the intent is to assert at least one relevant button/link is present, use a > 0 assertion (or assert on a specific expected control).

Suggested change
expect(count).toBeGreaterThanOrEqual(0);
expect(count).toBeGreaterThan(0);

Copilot uses AI. Check for mistakes.
details.append(
{
"url": channel.url,
"ok": False,

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the except path for per-channel digest pushes, the details row omits the attempts field, while the success and retry-handled failure paths always include it. To keep the result schema consistent (and avoid downstream consumers having to special-case), include attempts (e.g., 1 or 0 depending on where it failed) and consider also including skipped: False for symmetry with the idempotency path.

Suggested change
"ok": False,
"ok": False,
"attempts": 0,
"skipped": False,

Copilot uses AI. Check for mistakes.
Inspect per-channel payload from push result:
- `ok`: final status
- `attempts`: retry attempts used
- `error_code`: normalized code (`rate_limited`, `timeout`, `auth_failed`, `downstream_unavailable`)

Copilot AI Mar 3, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The runbook lists a limited set of error_code values, but AppriseNotifier._map_error_code() and the idempotency path can also emit network_error, delivery_failed, and idempotent_replay (and successful sends currently set error_code to an empty string). Please update this section to reflect the full set of codes that can appear in push_daily_digest() results so operators can triage consistently.

Suggested change
- `error_code`: normalized code (`rate_limited`, `timeout`, `auth_failed`, `downstream_unavailable`)
- `error_code`: normalized code; one of `""` (success), `rate_limited`, `timeout`, `auth_failed`, `downstream_unavailable`, `network_error`, `delivery_failed`, `idempotent_replay`

Copilot uses AI. Check for mistakes.
jerry609 added a commit that referenced this pull request Mar 4, 2026
* Feat/daily push epic 179 (#218)

* feat(push): implement Epic #179 — daily push optimization

Multi-channel push infrastructure with structured digest cards:

- #187: Integrate HF upvotes into Judge scoring prompt
- #180: Add digest_card extraction (highlight/method/finding/tags)
  with new LLM prompt, email template rendering, markdown output
- #181: MinerU Cloud API client for PDF figure extraction
- #182: Apprise multi-channel push layer with YAML config
- #183-185: Channel formatters (Telegram MarkdownV2, Discord Rich
  Embed, WeCom markdown+news, Feishu/Lark interactive card)
- #186: RSS 2.0 + Atom feed endpoints (/api/feed/daily.xml, .atom)

Also creates follow-up issues #190 (Push Channel Settings UI)
and #191 (Dashboard Digest Card Enhancement).

56 new tests, all passing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: integrate MinerU figure extraction into CLI and ARQ worker daily-paper workflow

Refs #179

* fix(daily-push): enable MinerU flags in ARQ cron payload (refs #181)

* feat(push): wire channel formatters into apprise digest delivery (refs #182 #183 #184 #185)

* feat(feed): add keyword RSS, feed cache, and figure enclosure support (refs #186)

* feat(mineru): add extraction result cache for daily push figure pipeline (refs #181)

* feat(push): add telegram bot command subscription endpoint (refs #191)

* fix(push): add retry/backoff for channel delivery failures (refs #191)

* feat(hf): add trending modes, cache, and arxiv identity dedupe (refs #193)

* feat(push): add idempotency and error-code mapping for channel delivery (refs #191)

* test(push): add mock channel e2e and failure-injection coverage (refs #191)

* docs(push): add audit script and ops runbook for acceptance closure (refs #192)

* docs: update README for AgentSwarm execution transition

* docs: archive stale docs and rename AgentSwarm todo

* docs: add AgentSwarm design proposal + web Playwright e2e setup

- Add docs/proposals/agentswarm-design.md covering multi-agent
  orchestration architecture, adapter pattern, session management,
  skills ecosystem, and OpenCode/OpenClaw/oMo integration (refs #197, #214)
- Add Playwright e2e test scaffolding for web dashboard (smoke,
  papers, research specs)
- Update web/.gitignore for Playwright artifacts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(studio): fix context pack generation, duplicate import UX, and CLI chat errors (#223)

* fix(studio): fix context pack generation, duplicate import UX, and CLI chat errors

- 支持内联标题/摘要,以绕过 PaperInputRouter 获取 studio 论文 ID

- 使上下文包生成 SSE 流期间的数据库持久化操作不再致命

- 从库中导入重复论文时显示错误消息

- 将左侧文件面板宽度缩小至约 18%(默认宽度);移除默认模板文件

- 为 Claude CLI 添加 --verbose 标志,以兼容 stream-json 输出

Related to #222

* fix(studio): fix context pack generation, duplicate import UX, and CLI chat errors
- 修改Gemini AI review代码问题

* fix(studio): fix context pack generation, duplicate import UX, and CLI chat errors
- 修改Gemini AI review代码问题

---------

Co-authored-by: Jerry Zhang <1772030600@qq.com>

* fix(web): correct package.json scripts JSON syntax

* chore(gitignore): block nested .env secrets and keep examples

* docs(env): add MinerU key and figure extraction env templates

* refactor(mineru): standardize on v4 task API for daily push (#229)

* fix(mineru): support v4 async task extraction flow

* refactor(mineru): standardize on v4 task API for daily push (#179)

* feat(push): render MinerU main figure in email via inline fallback

* docs(readme): update email push demo screenshot

* docs(readme): refresh Phase 6 daily push descriptions

* fix(security): harden runbook allowed-dir path validation

* fix(review): resolve security and reliability findings from AI review

* fix(codeql): harden studio chat project_dir normalization

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Boyu liu <oor2020@163.com>
jerry609 added a commit that referenced this pull request Mar 4, 2026
* Feat/daily push epic 179 (#218)

* feat(push): implement Epic #179 — daily push optimization

Multi-channel push infrastructure with structured digest cards:

- #187: Integrate HF upvotes into Judge scoring prompt
- #180: Add digest_card extraction (highlight/method/finding/tags)
  with new LLM prompt, email template rendering, markdown output
- #181: MinerU Cloud API client for PDF figure extraction
- #182: Apprise multi-channel push layer with YAML config
- #183-185: Channel formatters (Telegram MarkdownV2, Discord Rich
  Embed, WeCom markdown+news, Feishu/Lark interactive card)
- #186: RSS 2.0 + Atom feed endpoints (/api/feed/daily.xml, .atom)

Also creates follow-up issues #190 (Push Channel Settings UI)
and #191 (Dashboard Digest Card Enhancement).

56 new tests, all passing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: integrate MinerU figure extraction into CLI and ARQ worker daily-paper workflow

Refs #179

* fix(daily-push): enable MinerU flags in ARQ cron payload (refs #181)

* feat(push): wire channel formatters into apprise digest delivery (refs #182 #183 #184 #185)

* feat(feed): add keyword RSS, feed cache, and figure enclosure support (refs #186)

* feat(mineru): add extraction result cache for daily push figure pipeline (refs #181)

* feat(push): add telegram bot command subscription endpoint (refs #191)

* fix(push): add retry/backoff for channel delivery failures (refs #191)

* feat(hf): add trending modes, cache, and arxiv identity dedupe (refs #193)

* feat(push): add idempotency and error-code mapping for channel delivery (refs #191)

* test(push): add mock channel e2e and failure-injection coverage (refs #191)

* docs(push): add audit script and ops runbook for acceptance closure (refs #192)

* docs: update README for AgentSwarm execution transition

* docs: archive stale docs and rename AgentSwarm todo

* docs: add AgentSwarm design proposal + web Playwright e2e setup

- Add docs/proposals/agentswarm-design.md covering multi-agent
  orchestration architecture, adapter pattern, session management,
  skills ecosystem, and OpenCode/OpenClaw/oMo integration (refs #197, #214)
- Add Playwright e2e test scaffolding for web dashboard (smoke,
  papers, research specs)
- Update web/.gitignore for Playwright artifacts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(studio): fix context pack generation, duplicate import UX, and CLI chat errors (#223)

* fix(studio): fix context pack generation, duplicate import UX, and CLI chat errors

- 支持内联标题/摘要,以绕过 PaperInputRouter 获取 studio 论文 ID

- 使上下文包生成 SSE 流期间的数据库持久化操作不再致命

- 从库中导入重复论文时显示错误消息

- 将左侧文件面板宽度缩小至约 18%(默认宽度);移除默认模板文件

- 为 Claude CLI 添加 --verbose 标志,以兼容 stream-json 输出

Related to #222

* fix(studio): fix context pack generation, duplicate import UX, and CLI chat errors
- 修改Gemini AI review代码问题

* fix(studio): fix context pack generation, duplicate import UX, and CLI chat errors
- 修改Gemini AI review代码问题

---------

Co-authored-by: Jerry Zhang <1772030600@qq.com>

* fix(web): correct package.json scripts JSON syntax

* chore(gitignore): block nested .env secrets and keep examples

* docs(env): add MinerU key and figure extraction env templates

* refactor(mineru): standardize on v4 task API for daily push (#229)

* fix(mineru): support v4 async task extraction flow

* refactor(mineru): standardize on v4 task API for daily push (#179)

* feat(push): render MinerU main figure in email via inline fallback

* docs(readme): update email push demo screenshot

* docs(readme): refresh Phase 6 daily push descriptions

* fix(security): harden runbook allowed-dir path validation

* fix(review): resolve security and reliability findings from AI review

* fix(codeql): harden studio chat project_dir normalization

* docs(readme): restructure README for professional presentation

- Add centered hero header with badges (CI, Roadmap, License, Python, Next.js)
- Replace verbose 18-row feature table with categorized bullet lists
- Move Roadmap Phase 1-6 content to pinned issue #232
- Move module maturity matrix to Roadmap #232
- Consolidate screenshots into collapsible sections
- Remove inline API endpoint table (40+ rows) and directory tree
- Add Contributing section with Roadmap link
- Streamline Getting Started with collapsible config details
- Add repo topics for GitHub discoverability

References: vLLM, Docling, PaperQA2, R2R README patterns

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Boyu liu <oor2020@163.com>
@jerry609
jerry609 deleted the feat/daily-push-epic-179 branch March 10, 2026 02:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants