{{ t('nav.quota', { gb: formatQuotaGb(user?.remaining_quota_gb) }) }} {{ t('nav.impersonating') }} {{ t('nav.tag', { tag: user.company_tag }) }} {{ user?.username }}

{{ t('auth.login') }}

{{ t('auth.loginSubtitle') }}

{{ t('auth.noAccount') }}

{{ t('auth.register') }}

{{ t('auth.registerSubtitle') }}

{{ t('auth.hasAccount') }}

{{ t('dashboard.myTasks') }}

{{ t('dashboard.dateZipTitle') }}

{{ t('dashboard.dateZipHint') }}

{{ t('dashboard.quickSelect') }}
{{ t('dashboard.selected') }} {{ d }}

{{ t('dashboard.recentExports') }}

{{ t('dashboard.exportRetention') }}

{{ t('dashboard.show') }}
{{ t('dashboard.loadingExports') }}
{{ t('dashboard.noExports') }}
{{ item.filename || '-' }} {{ exportStatusLabel(item.status) }} {{ exportTypeLabel(item.export_type) }}
{{ t('dashboard.createdAt') }}{{ formatTime(item.created_at) }} {{ t('dashboard.updatedAt') }}{{ formatTime(item.updated_at) }} {{ t('dashboard.expiresAt') }}{{ formatTime(item.expires_at) }}
{{ item.error_message }}
{{ t('dashboard.download') }}

{{ t('dashboard.historyTasks') }}

{{ t('dashboard.noTasks') }}

{{ taskFilter ? t('dashboard.noTasksFilter') : t('dashboard.noTasksHint') }}

{{ getStatusIcon(task.status) }}
#{{ task.task_number }} {{ task.video_name }}
{{ getStatusBadge(task.status).text }}  {{ taskStepText(task) }} [{{ stageLabel(task.failed_stage) }}]
{{ taskProgress(task) }}% {{ task.slice_count }} {{ t('dashboard.segments') }}
{{ t('dashboard.pagination', { total: taskTotal, page: taskPage, pages: taskTotalPages }) }}

{{ t('upload.title') }}

{{ t('upload.intro') }}

{{ t('upload.pickFolder') }}

{{ t('upload.folderHintVideo') }}

{{ t('upload.folderHintTactile') }}

{{ t('upload.groupsFound', { count: folderGroups.length }) }}

{{ t('upload.checkpointHint') }}
{{ g.folderName }}
Video: {{ g.video?.name || t('upload.missing') }} | Left: {{ g.left?.name || t('upload.missing') }} | Right: {{ g.right?.name || t('upload.missing') }} | Meta: {{ g.meta?.name || t('upload.none') }}
{{ g.uploadDetail }}
{{ uploadGroupStatusLabel(g.uploadStatus) }}
{{ uploadStatusText }}
{{ t('upload.progressGroups', { cur: uploadGroupIndex + 1, total: uploadGroupTotal, fileCur: uploadFileIndex + 1, fileTotal: uploadFileTotal }) }}
{{ uploadTotalProgress }}% {{ uploadFileName }}

#{{ selectedTask.task_number }} {{ selectedTask.video_name }}

{{ getStatusBadge(selectedTask.status).text }}
{{ taskStepText(selectedTask) }} {{ taskProgress(selectedTask) }}%

{{ t('taskDetail.pipelineStages') }}

{{ stageLabel(s.stage) }}
{{ stageStatusLabel(s.status) }} ({{ t('stage.retry', { count: s.retry_count }) }}) · {{ stageDurationText(s, selectedTask.status) }}
{{ s.error_message }}
{{ t('taskDetail.taskId') }}{{ selectedTask.id }}
{{ t('taskDetail.taskNo') }}{{ selectedTask.task_number }}
{{ t('taskDetail.fileSize') }}{{ formatSize(selectedTask.file_size) }}
{{ t('taskDetail.sliceCount') }}{{ selectedTask.slice_count || '-' }}
{{ t('taskDetail.createdAt') }}{{ formatTime(selectedTask.created_at) }}
{{ t('taskDetail.updatedAt') }}{{ formatTime(selectedTask.updated_at) }}
{{ t('taskDetail.completedAt') }}{{ formatTime(selectedTask.completed_at) }}
{{ t('taskDetail.errorMsg') }}{{ selectedTask.error_message }}
{{ t('taskDetail.failedStage') }}{{ stageLabel(selectedTask.failed_stage) }}
{{ t('taskDetail.exportExpired') }}
{{ downloadStatusText || t('taskDetail.fetchingLinks') }}

{{ t('taskDetail.downloadFiles') }}

{{ t('taskDetail.compressedVideo') }} {{ t('dashboard.download') }}
{{ t('taskDetail.resultBundle') }} {{ t('dashboard.download') }}
{{ t('taskDetail.globalFiles') }}
{{ t('taskDetail.segmentFiles') }}
{{ t('taskDetail.segment', { idx: segIdx }) }}
{{ t('taskDetail.zipGenerating') }} {{ t('taskDetail.downloadPreZip') }}

{{ t('taskDetail.qwenResult') }}

{{ prettyJson(selectedTask.qwen_result_json) }}

{{ t('admin.title') }}

{{ stats.total_users }}
注册用户
{{ stats.total_tasks }}
总任务数
{{ stats.pending_tasks + stats.processing_tasks }}
进行中
{{ stats.completed_tasks }}
已完成
{{ stats.failed_tasks }}
失败

基础设施快照

{{ nodeOverview.summary.temporal_workers_online }}/{{ nodeOverview.summary.temporal_workers_total }}
Temporal Worker(在线/总数)
{{ nodeOverview.summary.task_queues_with_pollers }}/{{ nodeOverview.summary.task_queues_total }}
Task Queue(有轮询/总数)
{{ nodeOverview.services?.overall === 'ok' ? '正常' : '降级' }}
本实例 API
{{ nodeOverview.summary.api_peers_healthy }}/{{ nodeOverview.summary.api_peers_total }}
API 集群(健康/总数)

管道实时统计

管道 运行中 成功 失败 重试中 等待中
{{ stageLabel(s.stage) }} {{ s.running }} {{ s.success }} {{ s.failed }} {{ s.retrying }} {{ s.pending }}

失败任务

#{{ task.task_number }} {{ task.video_name }}
{{ stageLabel(task.failed_stage) }} {{ task.error_message }}

暂无失败任务

用户管理

用户名 角色 状态 公司标签 剩余额度(GB) 进行中 已完成 失败 总计 注册时间 操作
{{ u.username }} {{ u.is_admin ? '管理员' : '普通' }} {{ u.is_active ? '正常' : '禁用' }} {{ u.company_tag || '-' }}
{{ u.active_task_count }} {{ u.completed_task_count }} {{ u.failed_task_count }} {{ u.task_count }} {{ formatTime(u.created_at) }}

注册码管理

{{ item.code }}
角色:{{ item.role === 'admin' ? '管理员' : '用户' }} | 标签:{{ item.company_tag || '-' }} | 状态:{{ item.is_used ? '已使用' : '未使用' }}

基础设施总览

更新时间:{{ formatTime(nodeOverview.generated_at) }}
{{ nodeOverview.summary?.temporal_workers_online || 0 }}/{{ nodeOverview.summary?.temporal_workers_total || 0 }}
Temporal Worker(在线/总数)
{{ nodeOverview.summary?.task_queues_with_pollers || 0 }}/{{ nodeOverview.summary?.task_queues_total || 0 }}
Task Queue(有轮询/总数)
{{ (nodeOverview.platform_nodes || []).length }}
平台执行节点(Lease)
{{ (nodeOverview.inference_nodes || []).length }}
推理节点(已注册)

本实例 API 与依赖

实例 ID {{ nodeOverview.services.api_instance?.instance_id }}
部署角色 {{ nodeOverview.services.api_instance?.deploy_role || 'api' }}
监听地址 {{ nodeOverview.services.api_instance?.listen_addr }}
整体状态 {{ nodeOverview.services.overall === 'ok' ? '正常' : '降级' }}
数据库 {{ nodeOverview.services.api_instance?.database }}
Redis {{ nodeOverview.services.api_instance?.redis }}
Temporal {{ nodeOverview.services.api_instance?.temporal }} {{ nodeOverview.services.api_instance?.temporal_address }}

LB 后端 API 节点

节点地址保存在数据库(RDS),在此增删改查;健康检查通过各实例 /health 探测。

名称 地址 启用 健康 版本 延迟(ms) DB / Temporal 操作
{{ row.probe.healthy ? '正常' : '异常' }} {{ row.probe?.version || '—' }} {{ row.probe?.latency_ms ?? '—' }} {{ row.probe.detail.database }} / {{ row.probe.detail.temporal }} {{ row.probe?.error || '—' }}
暂无 API 节点,请添加

Temporal Task Queue

队列 轮询器 在线轮询 积压 可达
{{ q.name }} {{ q.pollers || 0 }} {{ q.online_pollers || 0 }} {{ q.backlog || 0 }} {{ q.reachable !== false ? '是' : '否' }}

平台执行节点(Lease)

节点ID 运行任务数 过期Lease 最近心跳 状态分布
{{ n.node_id }} {{ n.running_tasks }} {{ n.stale_leases || 0 }} {{ formatTime(n.latest_heartbeat_at) }} {{ status }}: {{ count }}
暂无运行中的平台执行节点

Temporal Worker 状态

V2 使用 Temporal 调度;需运行 go run ./cmd/worker 且 API 能连上 Temporal。

Worker 标识 在线 最近轮询 Task Queue
{{ w.worker_name }} {{ w.online ? '在线' : '离线' }} {{ formatTime(w.last_access_at) }} {{ (w.queue_names || []).join(', ') || '-' }}
未发现 Temporal Worker。请确认 Temporal 已启动且 Worker 进程在运行。

推理节点健康

名称 地址 健康 队列 处理中 待处理
{{ s.name || '-' }} {{ s.url }} {{ s.healthy ? '正常' : '异常' }} {{ s.queue_size || 0 }} {{ s.processing_tasks || 0 }} {{ s.pending_tasks || 0 }}

系统日志

{{ formatTime(log.created_at) }} [{{ logLevelText(log) }}] {{ log.source || 'unknown' }}: {{ log.message || '' }} ({{ log.task_id.substring(0,8) }})
暂无日志

推理服务器状态

{{ srv.name || srv.url }}
{{ srv.url }}
离线: {{ srv.error }}
队列: {{ srv.queue_size || 0 }} | 处理中: {{ srv.processing_tasks || 0 }} | 待处理: {{ srv.pending_tasks || 0 }}
原始状态 JSON
{{ prettyJson(srv.raw_status) }}

未配置推理服务器

{{ toastMsg }}