docs(design): DEAI-2 逐条处理情况与不做原因;补下载器原因码

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-29 21:10:46 +08:00
1 parent 8cc2e86935
commit 6e68ea5a9d
5 files changed
+94 -2

No files matched your search

+4 -1
View File
@@ -25,6 +25,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "~
import { Textarea } from "~/components/ui/textarea.tsx";
import { errorMessage } from "~/lib/api.ts";
import { actorText } from "~/lib/labels.ts";
import { humanizeReason } from "~/lib/reasons.ts";
import { useSse, useSseStatus } from "~/lib/sse.ts";
import { formatDateTime } from "~/lib/utils.ts";
@@ -377,7 +378,9 @@ function DecisionCard({ d }: { d: Decision }) {
</span>
</div>
<h3 className="mt-2 text-body font-medium break-words text-foreground">{d.title}</h3>
{d.summary ? <p className="mt-1 text-caption break-words text-muted-foreground">{d.summary}</p> : null}
{d.summary ? (
<p className="mt-1 text-caption break-words text-muted-foreground">{humanizeReason(d.summary)}</p>
) : null}
<GroupReleases d={d} />
<div className="mt-3">
<Evidence d={d} />
+1 -1
View File
@@ -179,7 +179,7 @@ export default function OrganizeRecordPage() {
<StatusBadge tone={RECORD_STATUS_TONE[r.status]}>{RECORD_STATUS_LABEL[r.status]}</StatusBadge>
<span className="text-meta text-muted-foreground tabular-nums">
{[
`${TRIGGER_LABEL[r.trigger]}${ACTION_LABEL[r.action]}`,
`${ACTION_LABEL[r.action]} · ${TRIGGER_LABEL[r.trigger]}`,
r.counts.total ? `${r.counts.succeeded}/${r.counts.total} 个文件成功` : null,
r.counts.failed ? `${r.counts.failed} 个失败` : null,
r.counts.skipped ? `${r.counts.skipped} 个跳过` : null,
+37
View File
@@ -0,0 +1,37 @@
import { existsSync } from "node:fs";
import { chromium } from "playwright-core";
const OUT = "/opt/uhd_media_tool-deai2/apps/web/test/screenshots/deai2";
const PAGES = [
["01-home", "/console"],
["02-inbox", "/console/inbox"],
["03-schedules", "/console/schedules"],
["04-agent-run", "/console/agent/a01dccf0-383f-46a9-acec-c2ca3cf571f8"],
["05-organize-detail", "/console/organize/33000000-0000-4000-8000-000000000903"],
["06-download-detail", "/console/downloads/33000000-0000-4000-8000-000000000802"],
["07-tasks", "/console/tasks"],
["08-settings-interface", "/console/settings#interface"],
];
const exe = ["/usr/bin/chromium", "/usr/bin/google-chrome"].find((p) => existsSync(p));
const browser = await chromium.launch({ executablePath: exe, headless: true, args: ["--no-sandbox"] });
for (const [tag, port] of (process.env.ONLY === "after" ? [["after", 5192]] : [["before", 5191], ["after", 5192]])) {
const base = `http://127.0.0.1:${port}`;
for (const [mode, vp, theme] of [["desk-light", { width: 1440, height: 900 }, "light"], ["desk-dark", { width: 1440, height: 900 }, "dark"], ["mobile", { width: 390, height: 844 }, "light"]]) {
const ctx = await browser.newContext({ viewport: vp, colorScheme: theme, deviceScaleFactor: mode === "mobile" ? 2 : 1 });
await ctx.addInitScript((t) => localStorage.setItem("umt-theme", t), theme);
const page = await ctx.newPage();
await page.goto(`${base}/login`, { waitUntil: "networkidle" });
await page.fill("#username", "w31-admin");
await page.fill("#password", "deai2-shots-pass");
await page.click('button[type="submit"]');
await page.waitForURL((u) => u.pathname.startsWith("/console"), { timeout: 20_000 });
for (const [name, path] of PAGES) {
if (tag === "before" && name === "08-settings-interface") continue;
await page.goto(base + path, { waitUntil: "networkidle" }).catch(() => {});
await page.waitForTimeout(1500);
await page.screenshot({ path: `${OUT}/${name}-${mode}-${tag}.png`, fullPage: true });
}
await ctx.close();
}
}
await browser.close();
console.log("done");
+50
View File
@@ -320,3 +320,53 @@
5. **首页是否删掉「运行状态」「计划」两块**,只在异常时出现。
6. **「收录」「建档」两个词是否全站退场**,换成「加入媒体库 / 在媒体库 / 已下载」。
7. **Agent 会话里「模型说的(未经核查)」这层防护是否保留**。建议保留一个很轻的标记(回复旁一行「以下是模型的说法」),删掉另外两处。
## 6. DEAI-2 处理情况(2026-09-29)
用户拍板(见 `docs/plan/00-first-version-plan.md`):「版本目标」→「收录版本」;「Agent 上游」→「模型服务」;界面上的 Agent → 「智能体」;技术信息默认折叠(设置 → 界面可默认展开);首页只留三块;计划页维护类收成「数据清理」、智能体巡检置顶;「未经核查」只在最终汇报留一处。术语落地见 [glossary.md](glossary.md)。
### P0
| # | 状态 | 说明 |
| --- | --- | --- |
| 1 | 完成 | 原因码表 `packages/contracts/src/reasons.ts`,服务端整理记录 message、冲突事项标题/摘要与前端(整理记录、下载时间线、待处理摘要、任务详情)共用;原码进「技术信息」 |
| 2 | 完成 | 「指定作品」主按钮:搜媒体库 + TMDB,走已有 decision resolve(local_entity / manual_tmdb);整理类事项打开重新整理,整理成功后自动关闭事项 |
| 3 | 完成 | 首页状态行按数据说话,0 订阅写「还没有订阅。去搜索添加」 |
| 4 | 部分 | 下载详情在「下载完成但最近一次整理失败」时单独提示入库失败并链到待处理;下载列表行状态未改——需要服务端在下载任务上带最近整理结果,QB-1 正在改整理服务,留给合并后另做 |
| 5 | 完成 | 只读对账移出首页,放进设置 → 自动化 →「高级」 |
| 6 | 完成 | 统一为「没识别出作品」(事项);未确认身份的资源叫「未识别」 |
### P1
| # | 状态 | 说明 |
| --- | --- | --- |
| 1 | 完成 | 见提交说明;对话组件结构不动(另有代理出易用性方案) |
| 2 | 完成 | 删口号;悬浮按钮只在无侧栏的窄屏出现,抽屉打开时不再显示胶囊 |
| 3 | 完成 | 默认隐藏系统任务(可一键显示),标题不用 ID |
| 4 | 完成 | 维护类合成「数据清理」组;自动任务按分类折叠并记忆;说明去表名 |
| 5 | 完成 | |
| 6 | 完成 | 约 14 处页描述删除或改一句 |
| 7 | 完成 | 首页、站点卡、下载、待处理、文件管理、整理记录 |
| 8 | 完成 | RSS、媒体库、建档 / 收录、资产、账本、纳管、哨兵、快照;「外部身份」一词在作品详情改「匹配的 TMDB 条目」,其余处保留 |
| 9 | 完成 | UUID、字段来源、别名全集、路径核验 |
### P2
| # | 状态 | 说明 |
| --- | --- | --- |
| 1 | 完成 | `formatUsd`、`formatDuration` |
| 2 | 完成 | |
| 3 | 部分 | 自动化分区的只读对账 / 存储预算 / 流水保留 / 缓存有效期收进「高级」;会话目录与 fake 脚本只在开发构建显示;没有在 contracts 加 `advanced` 标记(纯前端即可) |
| 4 | 完成 | 进程、趋势、最大表折叠;图例同名序列加序号 |
| 5 | 完成 | |
| 6 | 完成 | |
| 7 | 完成 | |
| 8 | 不做 | 用户栈数据,不是代码 |
### 页面级条目中不做的
- 05b 站点概况的配置回显、05c 资源行「已识别,无收录版本」、「实时补查」按钮位置:DETAIL-1 / SEARCH-3 正在改站点详情与资源列表,只改了名词(抓取、去站点搜),结构留给它们。
- 10 整理记录里连续的 0 文件失败行合并:需要服务端按下载任务聚合,放到 QB-1 合并之后。
- 12 媒体库页签只留「作品 / 未识别」、「未命中订阅」不进未识别:DH-1 正在改身份服务,避免冲突。
- 13-settings-agent MCP 区块的能力计数与接入说明移到文档:保留,只改了一句说明。
- 14 「已下线实例 N 个」文案:已随进程区折叠,文案不改。
+2
View File
@@ -38,6 +38,8 @@ const REASONS: Record<string, ReasonText> = {
already_in_library: { text: "已在媒体库里" },
main_not_transferred: { text: "主文件没有整理,附属文件一起跳过" },
timeout: { text: "操作超时", action: "稍后重试" },
downloader_unavailable: { text: "下载器连不上", action: "在设置 → 下载器里测试连接" },
downloader_error: { text: "下载器报错", action: "查看下载器日志" },
};
/**