diff --git a/CLAUDE.md b/CLAUDE.md
index 5c7c67ab6..615707841 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -272,11 +272,11 @@ Anyhunt/
2. **实施**:聚焦单一问题,不盲改
3. **测试**:新功能必须编写单元测试,修复 bug 需补充回归测试
4. **校验(风险分级)**:按变更风险执行,避免低风险改动重复跑全量流水线:
- - **L0(低风险)**:纯样式/文案/布局微调、无状态流与业务逻辑变更
+ - **L0(低风险)**:纯样式/文案/布局微调、无状态流与业务逻辑变更
可跳过全量 `lint/typecheck/test:unit`,按需做手工验证
- - **L1(中风险)**:组件交互、状态管理、数据映射、非核心逻辑重构
+ - **L1(中风险)**:组件交互、状态管理、数据映射、非核心逻辑重构
至少运行受影响包的 `typecheck` 与 `test:unit`
- - **L2(高风险)**:核心业务逻辑、跨包接口、后端模块、构建/基础设施改动
+ - **L2(高风险)**:核心业务逻辑、跨包接口、后端模块、构建/基础设施改动
必须运行以下命令并全部通过:
```bash
diff --git a/apps/anyhunt/admin/www/CLAUDE.md b/apps/anyhunt/admin/www/CLAUDE.md
index a4687b9bd..aea5202b2 100644
--- a/apps/anyhunt/admin/www/CLAUDE.md
+++ b/apps/anyhunt/admin/www/CLAUDE.md
@@ -8,6 +8,7 @@ Anyhunt Dev 管理后台,用于系统监控与运营管理,需管理员权
## 最近更新
+- Video Transcript 运维看板(2026-03-06):新增 `/video-transcripts` 页面,覆盖 overview/resources/tasks/config 与 local runtime switch;Queues 页面用户可见文案统一英文并复用 `formatRelativeTime`
- Build/Reasoning 类型链路收敛(2026-03-02):`model-form.ts` 调用 `resolveReasoningConfigFromThinkingLevel` 前统一将 `providerType` 归一为 `string | undefined`,消除 `string | null` 漂移;Dockerfile 改为复制完整 workspace 并统一执行 `pnpm build:packages`,根治容器内 `@moryflow/model-bank` 解析漂移导致的 TS2307。
- LLM Model 弹窗 reasoning 改造(2026-02-27):表单从 `effort` 选择切换为 `thinking level` 合同驱动(来自 `@moryflow/model-bank`),UI 展示等级只读参数摘要,提交时在单点 mapper 完成 `level -> reasoning(effort/maxTokens/includeThoughts)` 映射。
- 前端组件优化(Props 收敛专项):完成高 props 组件对象化改造(`digest-welcome` 三卡片、`digest-topics` 两列表、`queues/QueueJobsPanel`、`llm` 三弹窗、`users/GrantConfirmDialog`),统一为 `viewModel + actions`;多状态 UI 继续使用状态片段化 `renderContentByState + switch`;复扫结果 `Props >= 8` 组件数降为 0,校验 `typecheck + test:unit + lint + build` 通过
@@ -98,22 +99,23 @@ Anyhunt Dev 管理后台,用于系统监控与运营管理,需管理员权
## 功能列表
-| 功能 | 路径 | 说明 |
-| ----------------- | ----------------- | -------------------------- |
-| `dashboard/` | `/` | 系统概览与统计 |
-| `users/` | `/users` | 用户管理 |
-| `subscriptions/` | `/subscriptions` | Subscription list |
-| `orders/` | `/orders` | Order history |
-| `jobs/` | `/jobs` | Crawl/batch job monitoring |
-| `queues/` | `/queues` | BullMQ queue status |
-| `browser/` | `/browser` | Browser pool instances |
-| `logs/requests` | `/logs/requests` | Unified request logs |
-| `logs/users` | `/logs/users` | User behavior from logs |
-| `logs/ip` | `/logs/ip` | IP monitoring from logs |
-| `digest-topics/` | `/digest/topics` | Digest Topics 精选管理 |
-| `digest-reports/` | `/digest/reports` | Digest 举报管理 |
-| `digest-welcome/` | `/digest/welcome` | Digest Welcome 配置与页面 |
-| `llm/` | `/llm` | LLM Providers/Models 配置 |
+| 功能 | 路径 | 说明 |
+| -------------------- | -------------------- | --------------------------- |
+| `dashboard/` | `/` | 系统概览与统计 |
+| `users/` | `/users` | 用户管理 |
+| `subscriptions/` | `/subscriptions` | Subscription list |
+| `orders/` | `/orders` | Order history |
+| `jobs/` | `/jobs` | Crawl/batch job monitoring |
+| `queues/` | `/queues` | BullMQ queue status |
+| `video-transcripts/` | `/video-transcripts` | Video transcript operations |
+| `browser/` | `/browser` | Browser pool instances |
+| `logs/requests` | `/logs/requests` | Unified request logs |
+| `logs/users` | `/logs/users` | User behavior from logs |
+| `logs/ip` | `/logs/ip` | IP monitoring from logs |
+| `digest-topics/` | `/digest/topics` | Digest Topics 精选管理 |
+| `digest-reports/` | `/digest/reports` | Digest 举报管理 |
+| `digest-welcome/` | `/digest/welcome` | Digest Welcome 配置与页面 |
+| `llm/` | `/llm` | LLM Providers/Models 配置 |
## Feature Module Structure
diff --git a/apps/anyhunt/admin/www/src/App.tsx b/apps/anyhunt/admin/www/src/App.tsx
index 642258bc6..11268b080 100644
--- a/apps/anyhunt/admin/www/src/App.tsx
+++ b/apps/anyhunt/admin/www/src/App.tsx
@@ -5,7 +5,6 @@
*
* [PROTOCOL]: 本文件变更时,需同步更新所属目录 CLAUDE.md
*/
-
import { AppProviders } from '@/app/AppProviders';
import { AppRouter } from '@/app/AppRouter';
diff --git a/apps/anyhunt/admin/www/src/app/admin-routes.tsx b/apps/anyhunt/admin/www/src/app/admin-routes.tsx
index 1ae1b6db9..cae4b2501 100644
--- a/apps/anyhunt/admin/www/src/app/admin-routes.tsx
+++ b/apps/anyhunt/admin/www/src/app/admin-routes.tsx
@@ -11,6 +11,7 @@ import {
TriangleAlert,
Globe,
Brain,
+ Clapperboard,
CreditCard,
LayoutDashboard,
Layers,
@@ -74,6 +75,7 @@ const SubscriptionsPage = lazy(() => import('@/pages/SubscriptionsPage'));
const JobsPage = lazy(() => import('@/pages/JobsPage'));
const JobDetailPage = lazy(() => import('@/pages/JobDetailPage'));
const QueuesPage = lazy(() => import('@/pages/QueuesPage'));
+const VideoTranscriptsPage = lazy(() => import('@/pages/VideoTranscriptsPage'));
const ErrorsPage = lazy(() => import('@/pages/ErrorsPage'));
const LogsRequestsPage = lazy(() => import('@/pages/logs/LogsRequestsPage'));
const LogsUsersPage = lazy(() => import('@/pages/logs/LogsUsersPage'));
@@ -189,6 +191,17 @@ export const ADMIN_PROTECTED_ROUTES: AdminProtectedRoute[] = [
icon: Layers,
},
},
+ {
+ id: 'video-transcripts',
+ path: 'video-transcripts',
+ component: VideoTranscriptsPage,
+ nav: {
+ groupId: 'operations',
+ path: '/video-transcripts',
+ label: 'Video Transcripts',
+ icon: Clapperboard,
+ },
+ },
{
id: 'browser',
path: 'browser',
diff --git a/apps/anyhunt/admin/www/src/features/CLAUDE.md b/apps/anyhunt/admin/www/src/features/CLAUDE.md
index c3255205c..83141ad30 100644
--- a/apps/anyhunt/admin/www/src/features/CLAUDE.md
+++ b/apps/anyhunt/admin/www/src/features/CLAUDE.md
@@ -8,6 +8,7 @@
## 最近更新
+- Video Transcript Feature(2026-03-06):新增 `video-transcripts/` 模块,对接 `/api/v1/admin/video-transcripts/*` 的 overview/resources/tasks/config,并提供 local runtime switch mutation
- LLM Feature 表单映射修复(2026-02-27):`forms/model-form.ts` 的已存储 reasoning 反向映射改为 `normalizeReasoningEffort(level.value)`,修复 `max` 等级与 `xhigh` effort 的语义匹配不一致。
- LLM Feature 合同化(2026-02-27):`forms/model-form.ts` 改为 `thinking level` 驱动,删除 `KNOWN_REASONING_EFFORTS` 作为主事实源;`toLlmReasoningConfig` 集中完成 `level -> reasoning` 映射并保留 `rawConfig` 透传。
- Props 收敛专项:`digest-topics`(`AllTopicsListContent/FeaturedTopicsListContent`)、`queues`(`QueueJobsPanel`)、`users`(`GrantConfirmDialog`)完成 `viewModel + actions` 对象化收敛;调用页同步去胶水 props,保持多状态片段化 `switch` 分发
@@ -38,20 +39,21 @@ feature-name/
## 功能清单
-| 功能 | 说明 | API 入口 |
-| ----------------- | --------------------------- | ------------------------------ |
-| `dashboard/` | 系统概览 | `/api/v1/admin/dashboard` |
-| `users/` | 用户管理(含 Credits 充值) | `/api/v1/admin/users` |
-| `subscriptions/` | 订阅管理 | `/api/v1/admin/subscriptions` |
-| `orders/` | 订单管理 | `/api/v1/admin/orders` |
-| `jobs/` | 任务监控 | `/api/v1/admin/jobs` |
-| `queues/` | 队列监控 | `/api/v1/admin/queues` |
-| `browser/` | 浏览器池状态 | `/api/v1/admin/browser` |
-| `logs/` | 请求日志与行为分析 | `/api/v1/admin/logs/*` |
-| `llm/` | LLM Providers/Models 配置 | `/api/v1/admin/llm/*` |
-| `digest-topics/` | Digest 话题管理 | `/api/v1/admin/digest/topics` |
-| `digest-reports/` | Digest 举报管理 | `/api/v1/admin/digest/reports` |
-| `digest-welcome/` | Welcome 配置 | `/api/v1/admin/digest/welcome` |
+| 功能 | 说明 | API 入口 |
+| -------------------- | --------------------------- | ----------------------------------- |
+| `dashboard/` | 系统概览 | `/api/v1/admin/dashboard` |
+| `users/` | 用户管理(含 Credits 充值) | `/api/v1/admin/users` |
+| `subscriptions/` | 订阅管理 | `/api/v1/admin/subscriptions` |
+| `orders/` | 订单管理 | `/api/v1/admin/orders` |
+| `jobs/` | 任务监控 | `/api/v1/admin/jobs` |
+| `queues/` | 队列监控 | `/api/v1/admin/queues` |
+| `video-transcripts/` | 视频转写可观测 | `/api/v1/admin/video-transcripts/*` |
+| `browser/` | 浏览器池状态 | `/api/v1/admin/browser` |
+| `logs/` | 请求日志与行为分析 | `/api/v1/admin/logs/*` |
+| `llm/` | LLM Providers/Models 配置 | `/api/v1/admin/llm/*` |
+| `digest-topics/` | Digest 话题管理 | `/api/v1/admin/digest/topics` |
+| `digest-reports/` | Digest 举报管理 | `/api/v1/admin/digest/reports` |
+| `digest-welcome/` | Welcome 配置 | `/api/v1/admin/digest/welcome` |
## 轮询刷新示例
diff --git a/apps/anyhunt/admin/www/src/features/queues/components/QueueActionConfirmDialog.tsx b/apps/anyhunt/admin/www/src/features/queues/components/QueueActionConfirmDialog.tsx
index 67a89a065..7a434f926 100644
--- a/apps/anyhunt/admin/www/src/features/queues/components/QueueActionConfirmDialog.tsx
+++ b/apps/anyhunt/admin/www/src/features/queues/components/QueueActionConfirmDialog.tsx
@@ -38,12 +38,12 @@ export function QueueActionConfirmDialog({
{stats.waiting}
-等待
+Waiting
{stats.active}
-处理中
+Active
{stats.failed}
-失败
+Failed
Success Rate
+{overviewQuery.data.today.successRate}%
+Failure Rate
+{overviewQuery.data.today.failureRate}%
+Fallback Trigger Rate
++ {overviewQuery.data.today.cloudFallbackTriggerRate}% +
+Local Within 10m
++ {overviewQuery.data.today.localWithinTimeoutRate}% +
+Avg Duration
++ {overviewQuery.data.today.averageDurationSec.toFixed(1)}s +
+Budget Gate Triggered
++ {overviewQuery.data.today.budgetGateTriggered} +
+VIDEO_TRANSCRIPT_LOCAL_ENABLED
++ Source: {configQuery.data.source} + {configQuery.data.overrideRaw ? ` (${configQuery.data.overrideRaw})` : ''} +
+No audit records yet.
+ )} + > + ) : ( +No runtime config data.
+ )} +Used
++ ${resourcesQuery.data.budget.usedUsd.toFixed(4)} / $ + {resourcesQuery.data.budget.dailyBudgetUsd.toFixed(2)} +
+Remaining
++ ${resourcesQuery.data.budget.remainingUsd.toFixed(4)} +
+No budget data.
+ )} +Local Queue
++ {resourcesQuery.data.queues.local.name} +
++ waiting: {resourcesQuery.data.queues.local.waiting} +
+active: {resourcesQuery.data.queues.local.active}
+failed: {resourcesQuery.data.queues.local.failed}
+Cloud Fallback Queue
++ {resourcesQuery.data.queues.cloudFallback.name} +
++ waiting: {resourcesQuery.data.queues.cloudFallback.waiting} +
++ active: {resourcesQuery.data.queues.cloudFallback.active} +
++ failed: {resourcesQuery.data.queues.cloudFallback.failed} +
+No queue data.
+ )} +No live local nodes.
+ )} +No tasks yet.
+ )} +No articles found
- {model.filter !== 'all' ? 'Try changing the filter' : 'Check back later for new content'} + {model.filter !== 'all' + ? 'Try changing the filter' + : 'Check back later for new content'}
邮箱
- + {site.owner.email}发布时间
-{site.publishedAt ? formatDateTime(site.publishedAt) : '未发布'}
++ {site.publishedAt ? formatDateTime(site.publishedAt) : '未发布'} +
过期时间
-{site.expiresAt ? formatDateTime(site.expiresAt) : '永久'}
++ {site.expiresAt ? formatDateTime(site.expiresAt) : '永久'} +
Base URL
- {provider.baseUrl || 默认} + {provider.baseUrl || ( + 默认 + )}
数据范围
- {isLoading ?{rangeLabel}
} + {isLoading ? ( +{rangeLabel}
+ )}{server.name}
- {getStatusText( - server.status, - statusLabels, - server.toolCount, - server.error - )} + {getStatusText(server.status, statusLabels, server.toolCount, server.error)}
Verified tools ({toolNames.length})
++ Verified tools ({toolNames.length}) +
+
{model.subdomainMessage}
)} @@ -132,7 +137,12 @@ export const PublishSuccessStep = ({ publishedUrl }: PublishSuccessStepProps) =>