import type { SourcesInfo } from "@@/apis/crawler/type"
-import { listSourcesApi, restartCrawlerApi } from "@@/apis/crawler"
+import { createRssApi, listSourcesApi, restartCrawlerApi } from "@@/apis/crawler"
import { useSessionScope } from "@@/composables/useSessionScope"
import { formatTime } from "@@/utils/text"
import { Monitor, RefreshRight } from "@element-plus/icons-vue"
@@ -9,6 +9,22 @@ import CalendarSourcePanel from "./components/CalendarSourcePanel.vue"
import SourcePanel from "./components/SourcePanel.vue"
import { useCrawlerLogs } from "./composables/useCrawlerLogs"
+const rssVisible = ref(false)
+const rssSaving = ref(false)
+const rssDraft = reactive({ name: "", url: "", interval_seconds: 300 })
+async function addRss() {
+ if (rssSaving.value) return
+ rssSaving.value = true
+ sessionScope.assertCurrent()
+ try {
+ await createRssApi({ ...rssDraft })
+ if (!sessionScope.isCurrent()) return
+ rssVisible.value = false
+ await refresh()
+ } finally {
+ rssSaving.value = false
+ }
+}
const sessionScope = useSessionScope()
// 连续失败达到该次数时卡片告警
@@ -89,6 +105,22 @@ onMounted(async () => {
+
+
+
+
+
+
+
+
+
+ 保存订阅
+
+
+
+
+ 新增 RSS/Atom 订阅
+
diff --git a/web/src/pages/home/index.vue b/web/src/pages/home/index.vue
index e91328d..8f34513 100644
--- a/web/src/pages/home/index.vue
+++ b/web/src/pages/home/index.vue
@@ -1,15 +1,36 @@
@@ -158,9 +235,9 @@ onBeforeUnmount(() => {
- 新闻风险观察
+ 72小时新闻阅读与研判
- 加密市场事件、证据与条件情景
+ 跨领域信息、事实核验、市场与社会趋势
@@ -176,11 +253,13 @@ onBeforeUnmount(() => {
24 小时
48 小时
+
+ 72 小时
7 天
- 分析起点:2026-10-26 00:00 北京时间
+ 仅处理新流程首次启用后发布或源站修订的新闻
@@ -191,10 +270,14 @@ onBeforeUnmount(() => {
- 已分析 {{ overview.coverage.done }} / {{ overview.coverage.total }} 条 · 待处理 {{ overview.coverage.pending }} · 处理中 {{ overview.coverage.processing }} ·
+ 初筛完成 {{ overview.coverage.done }} / {{ overview.coverage.total }} 条 · 待处理 {{ overview.coverage.pending }} · 处理中 {{ overview.coverage.processing }} ·
失败 {{ overview.coverage.failed }}
+ 事件总结:完成 {{ overview.stage2.done ?? 0 }} · 待更新 {{ overview.stage2.pending ?? 0 }} · 处理中 {{ overview.stage2.processing ?? 0 }} · 失败 {{ overview.stage2.failed ?? 0 }}
+
+ 阅读编排:{{ overview.stage3.state === 'processing' ? '处理中' : overview.stage3.state === 'failed' ? '失败' : overview.stage3.pending ? '等待聚合更新' : '已更新' }}
+
Worker 心跳:{{ formatTime(overview.heartbeat) }} · 数据读取:{{ formatTime(overview.as_of) }}
@@ -202,52 +285,66 @@ onBeforeUnmount(() => {
-
- AI 综合判断 · 未来数小时至 24 小时
- 尚无最新判断
-
-
+ 近72小时完整阅读清单 · 按优先级排序
-
- {{ labels[overview.scenario.direction] }}
- {{ overview.scenario.summary }}
-
- 触发条件:{{ overview.scenario.conditions }}
反向因素:{{ overview.scenario.counter_factors }}
不确定性:{{ overview.scenario.uncertainty }}
-
- 依据事件 #{{ id }}
-
-
- 生成于 {{ formatTime(overview.snapshot_at) }},历史补分析不代表当时预测。
-
-
-
- {{ symbol }}:{{ overview.quotes[symbol]?.lastPrice ?? '不可用' }} · 24h {{ overview.quotes[symbol]?.priceChangePercent ?? '-' }}%快照 {{ formatTime(overview.quotes.at) }}
-
-
+
+ 生成于 {{ formatTime(overview.briefing.as_of) }} · 共 {{ overview.briefing.reading.length }} 个重要包
+
+
+
+ {{ (readingPage - 1) * 20 + index + 1 }}. {{ readingTitle(row.id) }}
+
+
{{ row.reason }} · 优先级 {{ row.priority }} · 依据版本 {{ row.revision }}
+
+
+ 拓展阅读
+
+
+ {{ readingTitle(row.id) }}
+ {{ row.reason }}
+
+
+ 综合判断:{{ overview.briefing.synthesis.summary }}
+ 市场影响:{{ overview.briefing.synthesis.market }}
+
+
{{ index === 0 ? '未来24~72小时' : '未来1~4周' }}:{{ trend.summary }}
+
成立条件:{{ trend.conditions }}
反向证据:{{ trend.counter_evidence }}
关注点:{{ trend.watchpoints }}
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
- {{ event.result.verification === 'insufficient' ? '信息不足,无法判断' : starText(event.stars) }}
- {{ labels[event.result.verification] }}
+ {{ event.result?.verification === 'insufficient' ? '信息不足,无法判断' : starText(event.risk_stars) }}
+ {{ labels[event.result?.verification ?? "unknown"] }}
- {{ labels[event.result.direction] }}
+ {{ labels[event.result?.direction ?? "unknown"] }}
最新进展 {{ formatTime(event.updated_at) }}
+ {{ event.error ? "更新失败,保留上次总结" : "总结更新中" }}
{{ event.title }}
- {{ event.result.summary }}
+ {{ event.result?.summary }}
- {{ event.entities.join(' · ') }} · 历史最高 {{ starText(event.peak_stars) }}
+ 重要性 {{ event.importance_stars }} 星 · {{ event.tags.join(" · ") }} · {{ event.entities.join(' · ') }} · {{ event.article_count }} 篇相关文章 · 历史最高 {{ starText(event.peak_stars) }} · 总结 {{ formatTime(event.analyzed_at) }}
@@ -255,12 +352,12 @@ onBeforeUnmount(() => {
-
+
-
+
@@ -276,7 +373,46 @@ onBeforeUnmount(() => {
接口未返回可选模型,可手动填写模型 ID。
-
+
+
+
+
+
+
+
+
+
+
+ 刷新列表
+
+
+ {{ secondModelsError }}
+
+
+
+
+
+
+
+
+
+
+
+ 刷新列表
+ {{ thirdError }}
+
+
+
+
+
+
+
+ 创建默认新闻 Skills 草稿
+
+
+ 编辑与发布 Skills
+
+
当前状态:{{ settings.enabled ? '已启用' : '已关闭' }}
保存并暂停分析
@@ -289,13 +425,41 @@ onBeforeUnmount(() => {
{{ detail.event.title }}
-
+
+
+ {{ detail.event.result.summary }}
事实:{{ detail.event.result.facts }}
时间线:{{ detail.event.result.timeline }}
+ 资产影响:{{ detail.event.result.asset_impacts }}
相关意见:{{ detail.event.result.opinions }}
+ 不确定性:{{ detail.event.result.uncertainty }}
+
+ 来源 #{{ ref.article_id }}:{{ ref.quote }}
+
+
+
{{ detail.event.result?.counter_evidence }}
关注点:{{ detail.event.result?.watchpoints }}
+
+
{{ claim.verdict }} {{ claim.statement }}
+ 来源 {{ ref.article_id }}:{{ ref.quote }}
+
+
+
+
+ 相关包 #{{ relation.id }} · {{ relation.relation }}
+ {{ relation.reason }}
+
+
核验工具与证据
+
{{ record.kind }} · {{ formatTime(record.fetched_at) }}
{{ record.data }}
+
+
总结版本
+
+ v{{ version.revision }} · {{ version.model }} · {{ version.state }} · {{ formatTime(version.analyzed_at) }}
+
{{ version.error || version.result?.summary }}
+
+
相关文章
{{ item.input.title || '原始新闻' }}
{{ item.input.source }} · 发布 {{ formatTime(item.input.published_at) }} · 进展 {{ formatTime(item.input.progress_at) }} · 分析 {{ formatTime(item.analyzed_at) }} · {{ item.model }} {{ item.historical ? '· 补分析' : '' }}
- {{ starText(item.result.stars) }} · {{ labels[item.result.verification] }}
+ {{ starText(item.result.risk_stars) }} · {{ labels[item.result.verification] }}
{{ item.result.summary }}
依据:{{ item.result.reasoning }}
{{ item.result.evidence }}
不确定性:{{ item.result.uncertainty }}
@@ -304,6 +468,9 @@ onBeforeUnmount(() => {
+
+
+
{{ item.input.title }}{{ item.error }}
重试
diff --git a/web/src/pages/news/components/NewsRisk.vue b/web/src/pages/news/components/NewsRisk.vue
index 1e26bf4..d977d8d 100644
--- a/web/src/pages/news/components/NewsRisk.vue
+++ b/web/src/pages/news/components/NewsRisk.vue
@@ -1,11 +1,12 @@