1553 lines
203 KiB
Plaintext
1553 lines
203 KiB
Plaintext
---
|
||
title: 待测试
|
||
description: 当前项目已实现功能的手工验证清单与未确认边界
|
||
---
|
||
|
||
# 待测试
|
||
|
||
## HTTP API 错误码与 OpenAPI
|
||
|
||
- 路径仍是 `/api`。不做 `/api/v1` 双挂;前后端一起发布。
|
||
- 失败信封增加 `reason`。配额是 HTTP 403 / `code` 40301 / `reason=quota_exceeded`,不再用 400。限流是 429 / 42901 / `rate_limited`。
|
||
- `GET /api/openapi.yaml` 提供 OpenAPI 3.0。不要生成 TS 客户端替换 `http`。
|
||
- [x] `cd backend && go test ./internal/handler/ ./internal/service/ ./cmd/server/ -count=1`
|
||
- [x] `cd web && bun test test/api-request.test.ts`
|
||
- [ ] 登录后走素材库、画布、任务中心:Cookie 仍有效,请求仍打 `/api/...`。
|
||
- [ ] 打开已有图片/视频资源 URL(`/api/resources/.../file`)仍能加载。
|
||
- [ ] 文本任务 SSE 与系统渠道流式仍逐条到达。
|
||
- [ ] 账号配额打满时前端能用 `reason === "quota_exceeded"` 区分,而不是当可重试 429。
|
||
|
||
## JSON 字符串类型与素材写入合同
|
||
|
||
- 上游 JSON 不再把数字/布尔伪装成空字符串。`optionalJSONString` / `requireJSONString` / `firstJSONString` 在字段类型错误时返回 `expected string, got T`。视频 / 音频 / 声明式协议的任务 ID 走这条路径。
|
||
- `stringField` 仍用于可选查找(status、error.message、SSE 增量)。缺字段或类型错误对该键视为空,避免异构上游把整段解析打爆。
|
||
- 用户库素材写入强制 `kind`、`coverUrl`、`tags`(字符串数组)和按类型完整的 `data`。前端 `parseAssetRecord` 拒绝不完整记录,素材库页不再读时 `normalizeAssetRecord`。
|
||
- 已入库、缺 `tags` 或 `data` 的历史 payload:GET 仍原样返回;登录快照或素材库分页会解析失败。没有读时补丁,需要重新保存或清洗。
|
||
- [x] `cd backend && go test ./internal/service/ -count=1`
|
||
- [x] `cd web && bun test test/asset-record.test.ts test/asset-storage-revision.test.ts test/user-scoped-generation-persistence.test.ts`
|
||
- [ ] 上传/生成一条完整素材后刷新:素材库、画布引用、跨端同步仍可用。
|
||
- [ ] 用数字 `id` 的视频/音频上游(若有)应看到类型错误,而不是“没有返回任务 ID”。
|
||
- [ ] 本地 IndexedDB 若仍是缺 `tags` 的旧缓存,打开素材库应失败而不是 tags 变成 `[]`。
|
||
|
||
## 巨型文件按能力/容器拆分
|
||
|
||
- `provider.go` 只保留调度、水合和共享类型。文本 / 图片 / 视频遗留 / 音频 / HTTP / 声明式协议分别在 `provider_text.go`、`provider_image.go`、`provider_video.go`、`provider_audio.go`、`provider_http_client.go`、`provider_protocol.go`。未导出函数仍同包,测试无需改 import。
|
||
- 画布助手:容器 `canvas-assistant-panel.tsx`;展示层 `canvas-assistant-panel-views.tsx`;`onlineToolToOps` 在 `canvas-assistant-online-tools.ts`;影视续写边界在 `canvas-cinematic-continuation.ts`。测试仍从面板文件 re-export 取值。
|
||
- 创作页:`create/index.tsx` 只做提交和会话状态;历史抽屉、Composer、消息视图在 `creation-workspace.tsx`。
|
||
- 画布页时间线入轨从 `project.tsx` 抽到 `use-canvas-timeline-asset-insert.ts`。页面仍装配工作区 JSX。
|
||
- [x] `cd backend && go test ./internal/service/ -count=1`
|
||
- [x] `cd web && bun test test/generation-task-local.test.ts test/user-scoped-generation-persistence.test.ts test/generation-task-materializer.test.ts test/create-library-button.test.ts test/create-canvas-handoff.test.ts`
|
||
- [ ] 画布在线助手:发一条会改画布的指令、确认工具、影视项目续写/刷新恢复,行为与拆分前一致。
|
||
- [ ] 创作页空态/对话流、历史抽屉重命名删除、素材库插入仍可用。
|
||
- [ ] 画布时间线弹窗内从素材库/项目资产插入音视频仍直连入轨;图片仍提示先插入画布。
|
||
|
||
## 前端 HTTP 与产品浮层壳
|
||
|
||
- 业务 JSON 模块统一走 `http.get/post/put/patch/delete`,不再写 `request(apiClient.*)`。CSV / 诊断包 zip 走 `http.raw`。资源 404 缓存认 `ApiError.status`,不再看已经解包后的 axios 错误。
|
||
- image / video / audio 渠道请求经 `createChannelTransport`;语音合成走 `postBlob`,避免把音频当 JSON 解析。
|
||
- 自带外壳的产品弹窗改用 `AppModal flush`;技能编辑和管理员用户详情改用 `AppDrawer`。不要再复制 `padding: 0` 的 Modal styles。
|
||
- [x] `cd web && bun test test/api-request.test.ts test/http-ownership.test.ts`
|
||
- [ ] 登录后打开素材库、画布上传、风格选择、技能详情、渠道模型编辑:弹窗主题、关闭、内部滚动与改造前一致。
|
||
- [ ] 上传资源、导出管理日志 CSV、导出诊断包:仍走同一登录 Cookie,失败文案可读。
|
||
- [ ] 用音频渠道生成一条语音:应得到音频,而不是 JSON 解析错误。
|
||
|
||
## 产品 LLM 任务收进官方提示词目录
|
||
|
||
- 短剧一句话生成和技能库 AI 草稿不再把整段指令写在页面里。前端只传 `promptTemplateOperation` 与变量;服务端按启用模板 + 用户偏好编译,并校验 JSON 契约 `short-drama-outline/v1` / `skill-draft/v1`。
|
||
- 画布预设、反推提示词、工作流起步稿、文本改写、视频操作包装、字幕高亮指令集中在 `web/src/lib/prompts`。在线 Agent 系统提示词和读写工具名单集中在 `canvas-agent-protocol` / `canvas-agent-tools`,在线写门控与本地日志分类共用同一份读工具列表。
|
||
- 批改管线、提示词优化器、肖像比对等插件内指令仍留在各自模块,下一刀再收。
|
||
- [x] `go test ./internal/service/ -run 'TestPromptOperationCatalog|TestRenderShortDrama|TestValidatePromptTemplateResultShortDrama|TestValidatePromptTemplateResultSkillDraft|TestValidatePromptTemplateResultCharacter' -count=1`
|
||
- [x] `cd web && bun test test/prompt-catalog-ownership.test.ts test/canvas-agent-workflow.test.ts`
|
||
- [ ] 重启后端后,设置 → 提示词偏好和管理后台提示词模板应出现「短剧大纲」「技能草稿」。改平台默认或用户追加后,项目页一句话生成和技能草稿应吃到新文案,JSON 结构仍能导入章节 / 填入编辑器。
|
||
- [ ] 在线画布助手仍先读上下文再写;本地助手只读工具日志分类不变。画布预设、反推提示词、工作流缺省 prompt 文案与改造前一致。
|
||
|
||
## 最小 ESLint 只锁已退场的 AntD API
|
||
|
||
- `web` 增加 `bun run lint`。不是风格检查:只禁止再 `import { Empty } from "antd"`,以及静态 `Modal.confirm(`。
|
||
- 解析器用 `@babel/eslint-parser` + TypeScript preset。`typescript-eslint` 8 在仓库的 TypeScript 7 上会直接拒绝启动,所以没有用它。
|
||
- CI Quality / Web checks 在 typecheck 之后跑 `bun run lint`。
|
||
- [x] `cd web && bun run lint`:通过。
|
||
- [ ] CI 确认 Web checks 出现 lint 步骤且现有 PR 能过。
|
||
|
||
## web / canvas-agent 只认 bun.lock
|
||
|
||
- 删除遗留的 `web/pnpm-lock.yaml` 和 `canvas-agent/pnpm-lock.yaml`。同一套 `node_modules` 被 pnpm 覆盖过,会把 Tiptap 和 `lightningcss` 装成两套版本。
|
||
- `web/package.json` 去掉仅给 pnpm 用的 `overrides` 副本,并声明 `packageManager: bun@1.3.9`。仓库内 Canvas Agent 安装/构建改写为 `bun install` / `bun run build`;对外仍用 `npx -y @ddcat666/open-ai-canvas-agent`。
|
||
- CI 在 `bun install --frozen-lockfile` 之前拒绝 `pnpm-lock.yaml` / `package-lock.json` / `yarn.lock`。
|
||
- [x] `bun test test/package-manager-lockfile.test.ts`。
|
||
- [ ] 干净目录执行 `cd web && bun install --frozen-lockfile` 与 `cd canvas-agent && bun install --frozen-lockfile`,不要再用 pnpm/npm 装前端依赖。
|
||
|
||
## 确认框与空态退场静态 API
|
||
|
||
- 命令式确认不再使用静态 `Modal.confirm`(拿不到 App 主题和上下文)。画布取消任务、方舟素材上传、任务中心删除本机记录改为 `App.useApp().modal.confirm`。行内危险操作仍用 `Popconfirm`。
|
||
- 全库最后一处 AntD `Empty`(渠道排序弹窗)改为 `EmptyState`。插件中心筛选空态和提示词偏好空列表也接到 `EmptyState`。工作区整页空态仍用 `WorkspaceState`(信号图标),画布引导空态保持产品专用实现。
|
||
- [x] `bun test test/ui-kit-retirement.test.ts test/channel-presentation.test.tsx test/plugin-state-switch.test.ts`。
|
||
- [ ] 画布取消进行中任务、上传到方舟素材库:确认框明暗主题与页面一致,确认后仍执行原操作。
|
||
- [ ] 任务中心删除本机记录:确认框主题正确,只删本机记录不删素材。
|
||
- [ ] 管理后台渠道「设置排序」在无条目时显示 EmptyState;插件中心清空筛选后的空态可点「清除筛选」。
|
||
|
||
## 官方视频 InterfaceType 只走声明式插件
|
||
|
||
- `runVideoTask` 对已有官方插件的接口类型不再回退到手写协议。生产注入插件注册表;单测未注入时会补官方包。显式放入空注册表则报「…视频插件未安装」。
|
||
- 覆盖的接口:`minimax-video`、`gemini-veo`、`novita-video`、`newapi-channel-1`、`newapi-channel-2`、`xai-video`、`volcengine-ark-video`、`volcengine-jimeng-video`、`newapi`、`agnes-video`。任务恢复也只查询声明式 adapter,不再回退 `queryNewAPIChannel2VideoTask`。
|
||
- 仍保留的手写路径只有:空 InterfaceType 的 OpenAI 风格 multipart `/videos`、模型名含 `grok` 的 JSON `/videos`、BaseURL 含 `/api/plan/v3` 的 Ark Plan、模型名含 seedance 的 Seedance `/videos`。
|
||
- 插件契约与旧手写实现不一致处按插件为准:MiniMax 时长必须 4–15 秒且不再把 `720`/`1440p` 映射成 `768P`/`2K`;Channel 2 不再做 grok 单图/音频校验;xAI 结果 URL 不可达时不再回退 `/videos/{id}/content`;Channel 1 音频 `type` 跟随宿主 role(当前为 `reference_audio`)。
|
||
- [x] `go test ./internal/service/ ./internal/protocol/ -count=1`:通过。
|
||
- [ ] 用 MiniMax / Veo / Novita / NewAPI Channel 1+2 / xAI / 方舟 / 即梦视频各跑一条生成,确认创建、轮询、下载仍走对应官方插件路径。
|
||
- [ ] 卸掉某个官方视频插件后再提交同类型任务,应看到「…视频插件未安装」,而不是静默改走另一套协议。
|
||
- [ ] Channel 2 创建后短暂 `task_not_exist` 仍应延期查询,不要二次创建。
|
||
|
||
## 列表分页查询改为 page + pageSize
|
||
|
||
- 业务列表查询不再使用 `page_size`、`project_id`、`folder_id`、`media_type`、`unit_id` 或管理端 `limit`。查询名和分页响应字段统一为 camelCase:`page`、`pageSize`,以及 `projectId` / `folderId` / `mediaType` / `unitId`。
|
||
- 技能库列表信封同步改为 `totalCount`、`hasMore`、`nextOffset`、`pageSize`。技能条目、安装表单、技能包文件与 GitHub 安装请求也已改为 camelCase;`createdAt` / `updatedAt` / `lastCheckedAt` / `lastSyncedAt` 为 RFC3339。内置技能种子文件仍是仓库内部 snake_case,读取后转换成对外合同。
|
||
- Eagle 素材连接器、Dreamina 本地任务和肖像比对仍走对方自己的 `limit`/`offset`,不纳入这次契约。
|
||
- [ ] 登录后翻页素材库、画布库、项目资产、技能库和积分流水,确认请求查询是 `pageSize` 而不是 `page_size`/`limit`。
|
||
- [ ] 管理后台用户、渠道、日志、公告、兑换码、计费、支付订单、对账和存储资源列表翻页正常,响应里是 `pageSize`。
|
||
- [ ] 技能库列表、详情、创建/编辑、ZIP/GitHub 安装:确认接口字段是 `skillId`、`skillName`、`createdAt` 等 camelCase,时间是 ISO 字符串而不是 unix 毫秒。
|
||
- [ ] 画布 @技能 提及和技能运行时仍能解析已加入技能。
|
||
|
||
## 前端测试改为全目录自动发现
|
||
|
||
- `web/package.json` 的 `test` 脚本从手工枚举约 100 个文件改为 `bun test`,CI 的 `bun run test` 会跑到此前从未进闸门的用例(含素材弹窗、上传边界、同步文案等)。
|
||
- 打开闸门前修了过时源码快照,以及:无入边时 `@图片1` 可引用节点自身;账号切换中止进行中请求的测试不再因 localforage 缺驱动而误失败。
|
||
- [x] `bun test`:全目录应通过。
|
||
- [ ] CI Quality / Web checks 确认 `bun run test` 覆盖新增文件且无顺序依赖失败。
|
||
|
||
## 写路径诚实化(存储直传 / 云端同步 / 计费退款 / 转码终态)
|
||
|
||
- 资源直传失败按 `ApiError.retryable` 分类:401/403/400/413 等永久失败当场抛出;429/5xx 与断网允许退回 IndexedDB,由云端同步用同一幂等键重传。UI 不得把 `pendingRemoteUpload` 说成已保存到服务器。
|
||
- 素材页、素材弹窗还原、批量上传、画布保存在云端同步失败时会排队 `scheduleRemoteUserDataSync`,文案改为「本地已保存,云端同步失败:…将自动重试」。LibTV/TapNow 导入仍只在本地写失败时回滚,云端失败不回滚已写入的节点。
|
||
- 系统渠道代理:退款或待核对写失败会打进程日志;退款失败会转 `uncertain`,避免订单停在 running。空 `billingOrderID` 不再假装退款。
|
||
- 播放转码终态回写失败会重试 3 次并打日志;`mark none` 写失败会恢复内存状态,避免前端把空状态当成 processing 轮询。
|
||
- Responses→Chat Completions 回退只认 404/405/501,不再把 502/503/504 当成“接口不存在”。
|
||
- [x] `bun test test/resource-upload-boundary.test.ts test/user-data-sync-message.test.ts`;`go test ./internal/service/ -run 'TestShouldFallbackTextToChat|TestPersistPlaybackResource'`。
|
||
- [ ] 登录后上传一张图时断开后端:应看到本地已保存+将自动重试,而不是“已保存”。恢复后端后素材应出现在云端。
|
||
- [ ] 用错误密码/过期登录上传:应直接报鉴权失败,文件不应静默进“稍后同步”。
|
||
- [ ] 画布导入 LibTV 后人为让同步失败:节点保留,出现云端失败提示。
|
||
- [ ] 系统渠道明确 4xx 后核对计费订单已退款;退款写库失败时订单应进入待核对。
|
||
|
||
## 引用素材库弹窗新增媒体类型筛选
|
||
|
||
- `AssetLibraryPickerModal` 左侧在「分类」之上新增「媒体类型」分组:全部类型 / 图片 / 视频 / 音频(可选文本)。媒体类型在分类之前收窄数据源,左侧分类计数、网格和分页描述同一批素材。
|
||
- 新增 `mediaKinds` prop 声明可选类型,只有一种或调用方已用 `remoteKind` 锁定类型时不展示该分组;新增 item 字段 `mediaKind`,缺省时按本地素材或插件素材的 kind 推断,角色卡这类非媒体条目在筛选生效时不出现。
|
||
- 远端素材库按服务端 `kind` 过滤并重置到第一页;`remoteKind` 仍是调用方的硬约束,媒体筛选不会覆盖它。
|
||
- 各入口传参:创作首页与项目主图沿用默认/图片单类型;画布插入素材、画布项目资产、短剧制造引用个人素材声明含文本的四类;角色三视图与角色声音已由 `remoteKind` 锁定,不展示分组。
|
||
- [x] `bun run typecheck`、`bun test test/canvas-asset-picker.test.ts test/create-library-button.test.ts test/asset-ingest.test.ts test/assets-page-batch-toolbar.test.ts`:23 passed。
|
||
- [ ] 创作首页「参考内容」:切换图片/视频/音频,确认分类计数、网格和分页一致,翻页后筛选保持。
|
||
- [ ] 画布「插入素材」「项目资产」:确认文本类型可筛选,角色卡在筛选非全部时不出现。
|
||
- [ ] 短剧制造「引用个人素材」以及角色三视图/声音绑定:确认前者有媒体类型分组、后两者没有。
|
||
- [ ] 窄屏(≤680px)下左栏横向滚动,媒体类型与分类合并成一排后仍可点选。
|
||
|
||
## 画布顶栏提示被生成任务面板遮挡
|
||
|
||
- 现象:画布右上角有进行中任务时,顶栏按钮的悬浮提示被「生成任务」面板压住,文字读不全。
|
||
- 原因:顶栏是 `--z-toolbar`(30) 的绝对定位浮层,会为子元素建立层叠上下文;顶栏提示原来是行内绝对定位、`--dock-tooltip-z`(140) 只在该上下文内生效,实际仍低于 `--z-panel-floating`(80) 的任务面板。提示向下展开的位置又正好落在 `--canvas-topbar-offset`(72px) 的面板顶边。
|
||
- 修复:`CanvasTopBarTooltip` 改用 Ant Design `Tooltip`(portal 到浮层层级),与专注模式工具栏、节点悬浮工具的提示实现一致;底部 dock 的提示向上展开,不受影响,保持原样。
|
||
- 视觉变化:顶栏提示改用全局浮层配色(`--popover`),不再是 dock 提示的自定义样式。
|
||
- [x] `bun run typecheck` 通过。未做浏览器验证:复现需要画布上有进行中的生成任务。
|
||
- [ ] 登录画布并发起一个生成任务,逐个悬停顶栏按钮,确认提示显示在任务面板之上、明暗主题下都可读。
|
||
- [ ] 确认菜单类按钮(画布菜单、导入第三方画布、媒体性能)的下拉仍能正常打开。
|
||
|
||
## 远端素材未归一化导致的 tags undefined
|
||
|
||
- 现象:部分素材的 `tags` 是 `undefined`,首页点击「参考内容」时页面报「当前页面没有正常加载,Cannot read properties of undefined (reading 'join')」。
|
||
- 原因:素材在服务端是不透明 payload,早期记录没有 `tags` 字段。本地缓存、登录快照和素材库页面都会走 `normalizeAssetRecord`,但 `user-data-sync` 的 `acceptRemoteAssets`(素材选择弹窗分页、按 ID 拉取引用素材)把服务端原样对象直接写进 store。
|
||
- 修复:`acceptRemoteAssets` 与登录快照都在写入前归一化,并让 acknowledged 基线复用同一份对象。顺带修掉登录时 store 存归一化副本、基线存原始副本导致这些素材被永久标记为待上传的差异。
|
||
- [x] `bun test test/user-scoped-generation-persistence.test.ts test/asset-storage-revision.test.ts test/asset-remote-sync.test.ts test/canvas-asset-picker.test.ts`:58 passed;`bun run typecheck` 通过。
|
||
- [ ] 登录后在首页点击「参考内容」,翻页浏览历史素材,确认不再白屏。
|
||
- [ ] 观察一次同步周期,确认历史素材没有被反复回传服务端。
|
||
|
||
## 声明式协议插件丢失系统指令
|
||
|
||
- 现象:短剧「AI 生成章节」报「AI 没有返回有效的章节内容,请重试」。上游请求只带一条 user 消息,要求输出 JSON 的系统指令被丢弃,模型返回散文,前端解析不到章节。
|
||
- 原因:`manifestRequestValues` 构造的 `request.messages` 不包含 `request.instructions`,而 OpenAI 系官方插件(chat-completion、deepseek-chat、atlascloud-chat 等 26 个)只映射 `request.messages`。
|
||
- 修复:宿主在 `request.messages` 前补一条 system 消息(请求本身已有 system 消息时不重复);`openai-responses` 和 `google-gemini-generate-content` 改为过滤 system 角色,改用各自的 `instructions` / `systemInstruction` 字段,与 `anthropic-messages` 一致。
|
||
- 需要重新打包并重装的官方插件:`openai-responses`、`google-gemini-generate-content`。其余 OpenAI 系插件只需后端升级,无需重装。
|
||
- [x] `go test ./internal/protocol/ ./internal/service/`:通过。
|
||
- [ ] 登录后用 DeepSeek 等 chat-completion 渠道跑「开始一部新短剧 → AI 生成章节」,确认章节正常导入。
|
||
- [ ] Claude、Gemini、OpenAI Responses 渠道各跑一次文本生成,确认系统指令生效且没有重复出现在正文里。
|
||
|
||
## 画布智能引用
|
||
|
||
- [ ] 在简洁、专业模式及展开提示词面板中打开智能引用,检查明暗主题、弹层宽度和开关状态。
|
||
- [ ] 输入素材名称、`image1` 或独立序号,按 Tab 和点击候选项均能插入正确引用;关闭 AutoLink 后不再提示。
|
||
- [ ] 一键引用全文保留重复指代,跳过已有引用、重名和“约2秒”等普通文本;无匹配时按钮禁用。
|
||
- [ ] 长提示词滚动、移动光标、中文输入和切换节点后,引用插入位置正确;素材原有双击预览正常。
|
||
|
||
## 图片节点打光与镜头控制
|
||
|
||
- 图片节点支持基于原图的打光与镜头控制;确认操作只生成明确的编辑请求,不修改源节点内容。
|
||
- 打光支持光位、俯仰、亮度、光色、轮廓光和预设;镜头控制由声明式参数构建提示词,生成结果保留对应操作元数据。
|
||
- [ ] 登录画布后分别执行打光与镜头控制,确认新节点、连线、模型配置、失败状态和窄屏菜单行为正确。
|
||
- [ ] 检查明暗主题、键盘焦点、弹窗滚动、复制提示词与自定义模板;确认取消操作不会触发生成。
|
||
|
||
## v1.2.8.rc1 候选版本发布
|
||
|
||
- 发布版本与镜像标签分别为 `v1.2.8.rc1` 和 `1.2.8.rc1`;GitHub Release 应标记为预发布,不能被当作正式版本推荐,也不覆盖已发布的 `latest`。
|
||
- 待验证:前后端镜像的 Linux amd64/arm64 构建、Release 更新器附件与校验文件,以及实际部署后的版本展示和核心流程。本次发布不自动部署服务,构建成功不代表业务验收通过。
|
||
- [ ] 拉取 `ghcr.io/ddcat-ai/open-ai-canvas-web:1.2.8.rc1` 与 `ghcr.io/ddcat-ai/open-ai-canvas-backend:1.2.8.rc1`,验证 amd64/arm64 manifest、容器内版本和提交信息,以及 `docker-compose.deploy.yml` 使用 `CANVAS_IMAGE_TAG=1.2.8.rc1` 启动。
|
||
|
||
## 框选工具栏精简与自适应整理
|
||
|
||
- 多选悬浮栏默认只保留对齐、等距、分镜组和批量连接;横向/纵向/宫格/连线排列和引用组改到工具栏设置里,需要时再打开。
|
||
- 框选多个节点后,在节点或画布空白处右键会出现「自适应整理画布」:保持现有相对占位,把间距至少加到约 56px,不按媒体类型重排。
|
||
- 右键已选中的节点不再拆掉多选。
|
||
- [ ] 登录画布框选一组松散节点,确认悬浮栏变短,右键整理后左右上下关系不变、间距变大,撤销可恢复。
|
||
- [ ] 工具栏设置里仍能重新打开隐藏的排列入口。
|
||
|
||
## 画布抓手 / 框选胶囊开关
|
||
|
||
- 主工具栏左侧的抓手工具和区域选择合并为一个胶囊开关:选中项是白色圆形滑块,未选项直接落在纯黑轨道上;左右留白比参考图更松。
|
||
- 默认仍是区域选择;切换到抓手后空白处拖动平移画布,切回后空白处拖动框选。空格 / 中键临时平移不受影响。
|
||
- 旧工具栏偏好里的 `tool-move` / `tool-box-select` 会合并成 `tool-canvas-mode`;两个都隐藏时开关才隐藏。
|
||
- [ ] 登录画布验证明暗主题、开关切换后光标和拖动语义、工具栏设置中的显隐与排序。
|
||
- [ ] 触屏或窄屏下开关仍可点按,不与 dock 横向滚动冲突。
|
||
|
||
## 画布本地媒体转换节点(PR #446)
|
||
|
||
- 合并本地媒体转换节点与 Canvas Agent Runtime:灰度、Canny、AI 线稿、Depth Anything V2、OpenPose;官方插件注册;图片输入约束、结果指纹与缓存。
|
||
- 合并冲突处理:保留主分支连线创建菜单的展开描述样式,并补上「转换」选项。
|
||
- 修复:完成后的转换结果可进入下游生成参考图;stale 写入不再覆盖 processing;hover「转换」识别 `storageKey` 媒体;pose `personCount` 允许 0。
|
||
- 已知边界:抠图(cutout)与视频转换仍标记为暂不可用;插件开关未像肖像排查那样隐藏创建入口。
|
||
- 修复:POSIX 主机上 Windows 风格绝对路径环境变量不再被 `path.resolve` 错误拼接工作目录。
|
||
- [x] `bun test test/media-conversion.test.ts`:7 passed。
|
||
- [x] canvas-agent depth/lineart/pose 路径覆盖测试:通过。
|
||
- [ ] 登录画布:图片 → 转换(灰度/Canny)→ 下游图片生成,确认参考图实际进入请求。
|
||
- [ ] 本机 Agent:深度 / 线稿 / 姿态转换;无人物姿态显示 skipped。
|
||
- [ ] 更换上游图片后转换节点变 stale,重新运行后下游可继续生成。
|
||
|
||
## Agent 聊天附件、局部重绘次数与多图展开
|
||
|
||
- Agent 输入框附件改为 80px 预览,标签在图片下方,不再盖住画面;点击/双击放大,可用 `@图片N` 插入正文,鼠标移开后图片保持可见。
|
||
- **在线 Agent**(画布助手面板)选中节点引用同步改为 80px 预览、点击放大、`@图片N` 插入,并接入输入框 `@` 候选;预览走 `storageKey` 解析,避免 blob 失效导致黑块。引用列表与画布选区解耦,逐个点选图片会累积到 Agent,不再只能保留最后一张。
|
||
- 提示词内联 `@图片N` 芯片恢复紧凑尺寸(约 22px 高 / 18px 缩略图),不再撑高整行文本。
|
||
- 图片/视频节点提示词面板的参考素材改为 44px 横向胶囊(缩略图 + `@标签`),单行左右滑动;「参考图 · N」移到标题栏「图片/视频生成」后面;**单击缩略图预览**,**点击 `@标签` 插入引用**。
|
||
- 画布局部重绘:核心区只保留笔刷、修改要求、生成张数;模型/质量/尺寸/比例收进「高级生成设置」折叠区,侧栏限高滚动,底部操作栏固定。
|
||
- 画布局部重绘增加模型选择、尺寸和生成张数;张数大于 1 时按多图组并行出图并默认展开。
|
||
- 局部重绘多图取消时清掉未出图的占位节点;单路失败不影响其余并行任务,部分失败会提示并保留成功结果。
|
||
- 重新生成会把源节点的参考图连线带到新结果,避免提示词里的 `@图片` 缩略图丢失。
|
||
- 管理员尺寸预设每个分辨率档位提供全选/全不选;左侧档位标题列加宽,4K / 8 个比例分行显示不再挤成「4K8 个比例」。
|
||
- 新的多图组默认展开成 4 张,不再叠在旧结果上;取消或重生成会清掉没有结果的占位子图,已有结果拆成独立节点。
|
||
- [ ] 登录画布验证 Agent 附件放大、`@` 插入、局部重绘侧栏不溢出且高级设置可折叠、局部重绘多张、改提示词重生成后参考图仍在,以及 4 张结果直接铺开。
|
||
- [ ] 管理员尺寸预设页确认 1K/2K/4K 左侧标题不换行、全选/全不选可用。
|
||
|
||
## 刷新画布后提示词引用缩略图恢复
|
||
|
||
- 修复参考图可见、正文 `@引用` 图片却加载失败:图片地址异步解析完成后,即使提示词未变化,也按引用 ID 同步正文缩略图,不再保留旧地址。
|
||
- 仅替换发生变化的预览元素,保留引用标签、文字和光标;地址不变时复用现有图片,不触发提示词保存。
|
||
- [x] 真实浏览器挂载实际编辑器,验证失效 blob 地址切换到有效图片后解码成功、光标和标签保持、相同地址复用图片,且没有触发 onChange。
|
||
- [ ] 在登录后的真实画布中刷新页面,确认原有参考图及正文引用均恢复;覆盖素材库引用和多个引用。
|
||
|
||
## 连线目标节点 3D 倾斜反馈
|
||
|
||
- 拖动连线进入现有合法目标吸附区时,目标节点按接近点倾斜,最大约 5°,以接近点作为支点;支持单条和批量连线,不扩大连线命中区域或改变节点坐标。移出、完成或取消后恢复,普通 hover、点击和选中不启用此效果。
|
||
- 性能降级模式、拖动节点和系统减弱动态效果下不启用倾斜。修复逐帧传入鼠标坐标导致目标节点 memo 失效的问题:仅在进入目标时锁定接近点,同一目标内移动保持引用和倾斜不变,切换、退出或取消时更新;连线端点仍按原有 RAF 节奏更新。
|
||
- [x] 方向、边界、缩放、600 次同目标移动引用稳定性及相邻连线/媒体专项共 40 项测试通过,前端构建通过。真实浏览器验证样式在普通/选中状态为 `none`,目标状态为 3D 变换,清除后恢复 `none` 和 `will-change: auto`。
|
||
- [ ] 在用户出现卡顿的大画布复验连线延迟和渲染开销;独立浏览器渲染计数实验初始计数异常为零,未获得有效的渲染次数对比,不能据此认定性能验收通过。
|
||
- [ ] 登录画布验证不同缩放下从各方向接近目标、完成、Escape 取消、窗口失焦,以及批量连线的合法/非法目标切换。
|
||
|
||
## 画布视频悬停预览
|
||
|
||
- 鼠标停留 350ms 后静音播放前 3 秒,播放完恢复静态封面;短视频结束即停止,不循环。触屏、按键拖拽以及系统减弱动态效果下不自动播放,点击播放仍使用完整播放器。
|
||
- 同时仅一个悬停预览(包括待加载任务),快速划过不解析视频地址;离开、滚轮、按下鼠标、键盘操作、窗口失焦、页面隐藏、节点离开视口或画布变换均释放播放器。手动播放优先,悬停不触发整文件后台缓存。
|
||
- [x] 悬停生命周期与相邻媒体专项测试共 31 项通过,前端完整构建通过;真实浏览器以 4.2 秒本地生成视频验证静音播放及约 3 秒后播放器移除。此验证不依赖登录,也不等同于完整画布验收。
|
||
- [ ] 在真实大画布中验收大量视频节点下的快速划过、拖拽、缩放、慢网和跨域失败,记录目标设备的帧率与内存;本地专项测试不代表所有设备的性能保证。
|
||
|
||
预览使用原视频,3 秒限制是播放时长而非下载字节上限;实际网络流量取决于浏览器缓冲、源视频码率和服务端 Range 支持。
|
||
|
||
## 任务详情、章节资产与请求明细
|
||
|
||
- [x] 前端专项回归覆盖图片自引用、任务同步边界、章节三类资产解析及相邻媒体逻辑;无角色章节允许保留场景和道具,缺失必填字段仍报错。
|
||
- [x] 后端 repository、service、handler 测试通过,覆盖请求/下载筛选及导出、章节资产输出校验。
|
||
- [x] 视频首帧组件使用浏览器内生成的视频验证:输出 400×225 缩略图,卸载后释放对象 URL;此项不等同于登录态任务页面验收。
|
||
- [ ] 登录后打开画布任务和短剧任务详情,确认不再因详情读取触发画布同步而报 `record not found`。
|
||
- [ ] 检查生成图片的提示词面板:不含自身引用,原有上游素材引用仍保留。
|
||
- [ ] 使用真实文本模型提取章节,确认角色、场景、道具均进入待确认资产,重复提取与刷新恢复不重复入库。
|
||
- [ ] 请求明细默认仅请求,切换仅下载/全部后,分页、检索、CSV 导出一致。
|
||
- [ ] 视频任务列表和网格检查已有封面、无封面、跨域失败、滚动懒加载及明暗主题。
|
||
- [ ] “参考 LibTV 的深度动作捕捉”尚未实现,需确认对应功能入口、截图或预期输入输出。
|
||
|
||
本轮不涉及数据库迁移;前后端需一起更新,后端重启后才会提供新章节提取模板和日志筛选参数。
|
||
|
||
## 文件上传占位、真实进度与磨砂流光
|
||
|
||
- 图片、视频按本地读取的真实宽高比占位;音频、TXT / Markdown 文本使用各自节点尺寸。普通 multipart 与大文件分片上传回传真实字节进度,磨砂和流光随百分比逐渐变淡;传输 100% 后显示保存处理中,不能当作服务端保存成功。
|
||
- 四类文件共用上传、拖入、替换及失败重试流程;完成后填入同一节点,上传弹窗提前关闭,批量仍按顺序处理。纯剪贴板文字直接插入,不伪造网络上传过程。文本按 UTF-8 读取,不支持 PDF / Word 文档解析。
|
||
- 上传失败保留明确错误和重新选择入口;替换失败保留原资源;上传中删除节点不会在完成后重新插入;刷新后中断占位转为错误。减弱动态效果设置下禁用流光和淡出过渡;媒体本地降级明确提示尚未上传到服务器。
|
||
- [x] 占位、进度浓度、四类文件、错误状态、相邻回归与普通/分片传输模拟测试通过,前端类型检查和完整构建通过;静态渲染与模拟传输不等同于真实网络及浏览器视觉验收。
|
||
- [ ] 慢速网络下验证横图、竖图、视频、音频、TXT / Markdown、拖入和替换:比例正确,遮罩随实际进度变淡,完成前后位置稳定,右上角与节点状态同步。补验大于 50MB 的分片上传及保存失败。
|
||
- [ ] 验证明暗主题、上传失败重试、刷新中断、上传中拖动或删除节点,以及系统减弱动态效果;未确认真实网络上传的浏览器交互。
|
||
|
||
## 上传图片保护与画布浮层顺序(#438 / #436)
|
||
|
||
- 上传/导入的纯图片素材不再显示生成框和生成设置入口;空白生成节点、已有生成结果和显式复制/版本节点仍保留配置入口。替换上传会清除旧生成落点状态。
|
||
- 人物质感操作创建独立图片编辑节点,通过入边引用原图;底部添加与外观面板接入统一浮层管理,打开或交互时置顶。
|
||
- [x] 图片素材判定、人物质感节点构造、入口接线、浮层接线及相邻布局/引用测试共 24 项通过;前端完整构建通过。浏览器访问现有服务进入登录页,尚未完成登录后的交互验证,也未调用真实生成接口。
|
||
- [ ] 上传、拖入和替换图片,确认原图没有生成框;执行人物质感、局部重绘、裁剪、放大与表情编辑,确认原图保留、结果生成到新节点并有原图连线。
|
||
- [ ] 先打开节点编辑框,再打开底部添加/外观菜单,确认后打开的面板在上层;再次点击节点编辑框能置顶,键盘操作、明暗主题和菜单关闭正常。
|
||
|
||
## 可视化排序与注册限流
|
||
|
||
- [x] 排序使用完整列表快照与事务保存,回归验证取消前的本地移动、过期快照、重复 ID、跨渠道修改及非管理员拒绝;价格和模型能力保持不变。
|
||
- [x] 验证验证码 SMTP 失败后可重试、同邮箱 60 秒冷却、429 响应的 Retry-After、小时窗口剩余时间与前端目录顺序。
|
||
- [x] 浏览器确认渠道和模型的“设置排序”、上下移动后保存及取消、用户端同时采用渠道与模型顺序;默认选择保留,临时顺序已恢复。拖动手势尚未单独做浏览器自动化验证。
|
||
- [x] 最终部署后日志记录 4 次验证码请求成功、3 次注册成功;自动化使用模拟 SMTP,未代替用户发送测试邮件。
|
||
- [x] 上线验收发现旧定时清理漏掉全局外观引用,启动时误删过期 Logo;已精确恢复原记录和文件,并验证清理保留四类外观资源、配置异常时拒绝清理。
|
||
- [ ] 用户继续验收不同邮箱服务商的收件体验及较多用户共用网络的情况。
|
||
|
||
## 系统渠道排序与前台别名
|
||
|
||
- [x] 系统渠道及模型列表保存排序、刷新后持久化的浏览器验收通过;自动化验证分页前排序、别名筛选及相同值按创建时间和 ID 排列。
|
||
- [x] 用户端模型设置与创作模型选择器沿用目录顺序;浏览器验证渠道换序、模型移至末尾、别名显示和清空回退,临时配置已恢复。
|
||
- [x] 自动化回归验证排序独立保存不改价格、启用状态或能力版本,普通用户无权保存排序,不能跨渠道修改模型;前端会话归一化保留目录顺序与当前所选模型。
|
||
- [x] SQLite 与独立 PostgreSQL 内存盘环境验证版本 8 升级至 9、重复迁移和默认值;生产迁移后业务指纹一致,保留数据库备份及已验证启动的 schema 9 兼容回滚程序。
|
||
|
||
## Tiptap 依赖版本对齐
|
||
|
||
- Tiptap 核心、React、扩展及间接依赖统一锁定为 `3.28.0`,同步 Bun 与 pnpm 锁文件;显式声明 `pm` 和 `extensions`,避免 pnpm 保留旧 peer 解析。此项不修改编辑器业务代码和 UI 样式。
|
||
- [ ] 使用 `pnpm install --frozen-lockfile` 后启动 `pnpm dev`,打开画布文本编辑器与项目章节编辑页,确认没有依赖预打包缺失导出错误。
|
||
- [ ] 验证正文编辑、标题、列表、颜色、高亮、撤销重做、保存后重新打开,以及明暗主题外观。
|
||
|
||
## v1.2.7 正式版本发布
|
||
|
||
- 版本与镜像标签分别为 `v1.2.7` 和 `1.2.7`;发布流程构建前后端 Linux amd64/arm64 镜像并生成 GitHub Release、双架构 Host Updater 与 SHA256 校验文件,同时更新主分支 `latest` 镜像。
|
||
- 本次发布目标是提供可用镜像,不自动部署服务、不修改线上数据库或运行配置。发布前应确认主分支质量检查、双架构镜像与 Release 附件均成功。
|
||
- [ ] 拉取 `ghcr.io/ddcat-ai/open-ai-canvas-web:1.2.7` 与 `ghcr.io/ddcat-ai/open-ai-canvas-backend:1.2.7`,验证 amd64/arm64 manifest、容器内版本和提交信息,以及 `docker-compose.deploy.yml` 使用 `CANVAS_IMAGE_TAG=1.2.7` 启动。
|
||
- [ ] 部署后验收登录、插件中心、文本节点、多角度编辑器、对象存储参考素材、模型批量操作、任务轮询、系统性能页面和真实生成链路;升级前备份数据库与数据目录。
|
||
|
||
## 创作页面附件缩略图
|
||
|
||
- 聊天消息与分镜简报附件的放大图标样式排除 `.cached-resource-image-shell`,避免缓存图片容器被误设为透明和绝对定位;悬停与键盘聚焦仍显示放大图标。
|
||
- [ ] 在真实创作会话中确认远端图片加载后无需悬停即可显示,移开鼠标后保持可见,点击可放大;同时确认分镜简报附件、本地图片和视频预览正常。
|
||
|
||
## MiniMax H3 分辨率能力与价格档
|
||
|
||
- 视频能力比较复用请求意图和价格档的分辨率别名归一规则,修复 MiniMax H3 供应线路配置 2K 价格档后,前台模型声明 2K 时误报「创作端参数超出供应线路能力:vquality」。内部价格档仍使用归一值,MiniMax 请求保持官方参数 `resolution: "2K"`。
|
||
- [x] 回归测试在修复前复现相同保存校验错误,修复后通过;相关能力匹配、线路覆盖和 MiniMax 专项测试通过。模拟 HTTP 请求验证 2K 与内部 1440p 均发送 2K,未声明的 4K 仍被拒绝,图片 quality 参数不受视频别名影响。
|
||
- [ ] 在实际 `/admin/channels` 配置 768P / 2K 价格档后,于 `/admin/models` 保存包含 2K 的模型能力,确认创作端可选并正确报价;未调用真实收费生成接口或部署服务。
|
||
|
||
## 对象存储优先发送媒体 URL
|
||
|
||
- 开启对象存储后,参考图、视频、音频发给上游时:协议支持 URL 就优先发对象存储签名链接;协议必须传文件字节时仍走 Base64 或 multipart。不会在上游失败后再自动重发一次生成。
|
||
- 强制 URL:NewAPI 系列、火山方舟视频、MiniMax 视频,以及声明需要公网媒体 URL 的插件协议。优先 URL:chat-completion、openai-response、claude-api、Grok 图片、火山方舟图片、xAI/Novita/Grok/Seedance 视频等。Gemini 图片、Gemini Veo、带蒙版的 OpenAI 图片编辑继续走字节。
|
||
- 本地资源在“优先 URL”协议下仍读成 Base64;对象存储资源签发失败、资源不存在或未就绪会直接报错,不会伪装成“不支持 URL”。存储桶不必公开读,使用短期签名链接即可。
|
||
- [x] 后端专项测试覆盖协议策略、OSS 强制 URL、本地强制 URL,以及 preferURL 时对象存储走签名 URL、本地回退 Base64。
|
||
- [ ] 用户浏览器验收:开启 OSS/COS/七牛/S3 后,图生图或视频参考素材应发对象存储 URL;Gemini 或蒙版编辑仍发文件字节。签名失败不能变成静默回退 Base64。
|
||
|
||
## 管理后台系统性能
|
||
|
||
- 管理后台「系统配置」新增独立「系统性能」页面,集中展示主机与 Go 进程、数据目录所在磁盘、系统/进程内存、数据库连接池与 Schema、PostgreSQL 统计、Redis 运行状态和运行时缓存 key 数量;连接地址、账号、密码、DSN 与 Redis URL 不返回前端。
|
||
- 页面提供 15 秒自动刷新、手动刷新、降级提示和紧凑 KPI。SQLite 环境明确隐藏 PostgreSQL 专属统计,Redis 未配置时显示单实例本地协调状态;macOS 无可靠系统可用内存时降级展示 Go 堆内存,避免把未知可用量误报为 100% 占用。
|
||
- 缓存维护仅接受 `runtime` scope,通过 Redis `SCAN + UNLINK` 清理请求频控、渠道失败/熔断和线路临时禁用四类白名单;保留活动并发租约、跨实例目录版本以及用户、任务、素材、模型配置和数据库数据,同时清理可重建的进程内读缓存并写入管理员审计。
|
||
- [x] 后端专项测试覆盖管理员权限、SQLite/无 Redis 状态、非法 scope 拒绝、本地缓存清理和审计写入;专项竞态测试、handler 路由注册、repository/service 和前端生产构建通过。Redis 白名单删除与保留边界的集成用例已实现,但本机无 `redis-server`,本轮自动跳过。
|
||
- [x] 浏览器 mock 已验证 PostgreSQL + Redis 完整态、SQLite + 本地协调降级态、桌面浅色与 390px 深色布局、无横向溢出,以及缓存清理二次确认文案;未调用真实清理接口。
|
||
- [ ] 在真实部署的 `/admin/settings/system-performance` 验证 PostgreSQL 统计、Redis 指标、自动刷新和 Redis 断连降级;仅在测试环境执行缓存清理,确认流量高峰期间不影响活动并发租约和业务数据。
|
||
|
||
## 图片组预览、连线菜单与尺寸设置
|
||
|
||
- 折叠图片组背板读取真实子图,排除当前主图、最多显示五张,并复用资源缓存与视口懒加载;未完成的子图保留占位背板。
|
||
- 连线创建菜单的说明与禁用原因可换行,菜单限制在视口宽高内并允许纵向滚动。隔离组件页已通过浏览器确认真实图片背板与长说明显示。
|
||
- 管理员固定展示 1K / 2K / 4K 三组,可选择或手动输入每档比例,等价比例归一去重;1K + 16:9 自动换算为 1824x1024,已有精确像素保持原值。未配置分档时,从已有尺寸按总像素推导档位(例如 1920x1080 为 2K)。
|
||
- 图片协议的尺寸参数独占首行,输出数量与可选参数移到下方;每个分辨率档位用横向比例卡片直接点选,额外比例通过输入框添加,默认输出也改为直接点选,不再使用比例下拉框。窄容器自动改为单列,视频协议布局保持不变。
|
||
- 后台未保存的新增模型表单已验证:比例选中/取消、32:18 等价去重、17:11 添加与像素展示、0:9 错误提示、默认输出切换、Enter 添加而非提交表单;1440px 桌面尺寸卡片独占整行,390px 明暗主题和长比例标签无横向溢出,焦点轮廓可见。验证后已取消表单、放弃测试修改并恢复原主题。截图工具未成功,本轮布局依据浏览器 DOM 几何测量与交互结果,视觉效果仍待人工确认。
|
||
- 画布、创作和短剧生产接入同一“分辨率 → 宽高比 → 像素展示”组件。用户端仅显示协议支持且已配置比例的档位:例如 2K 比例为空时隐藏 2K,允许自定义也不额外显示空档位;剩余按钮等宽填充。管理员仍保留三档配置入口。允许自定义时开放比例或像素输入,切档尽量保持比例;重新打开保留真实自定义尺寸展示,不将已隐藏档位的旧尺寸伪装成其他档位选中,也不自动改写尺寸。
|
||
- 空档位隐藏已在隔离组件页验证:仅配置 1K/4K 时无 2K 按钮,选择 4K 返回 3840x2160;仅一档时按钮铺满可用宽度,全空时隐藏分辨率标题和按钮,保留自动尺寸与自定义入口。未保存模型或发起生成,真实路由仍待人工复验。
|
||
- 比例请求配置 aspect_ratio;精确像素配置 size。独立分辨率字段由对应模型协议适配,仅比例不能保证输出像素。模型声明的精确像素预设不受自定义尺寸的 16 倍数对齐限制,保持原值发送,其余尺寸边界继续校验。
|
||
- 浏览器隔离组件页已确认:旧比例配置切 4K 实际交给请求转换函数的是 3840x2160;自定义 2:1 后切 2K 保持比例;0:9 显式报错且不改已选值;管理员输入 32:18 去重、17:11 自动计算并同步用户选项;Grok 禁用 4K。390px 视口内的 264px 面板在明暗主题下测得无横向溢出,含长比例标签。以上不等同于真实上游生成或三个路由的完整验收。
|
||
- 前端 29 项尺寸、协议及能力专项测试和生产构建通过,包含空档位隐藏、比例无下拉框、禁用状态与图片/视频布局隔离回归;此前后端尺寸预设、能力规格转换及图片任务相关测试通过,覆盖默认组合拒绝、跨档位比例拒绝及 JSON 往返,本轮纯 UI 改造未重跑后端。构建仍有既有的大分包与无效动态导入警告。
|
||
- [ ] 复验画布、创作、短剧真实路由中的模型切换、保存后重开、默认档位与比例组合、明暗主题和键盘交互;管理员真实保存由用户确认后执行。
|
||
- [ ] 用真实模型确认新增尺寸是否受上游支持、实际输出与计费档位是否一致;本次未修改已保存模型配置或执行收费生成。
|
||
|
||
## Issue #432 多角度编辑器
|
||
|
||
- 多角度编辑器改为居中 Modal,复用遮罩点击、Escape 和关闭按钮的取消行为,不再定位到节点底部或随节点拖拽卸载。
|
||
- #428、#429、#432 的定向源码回归检查与前端生产构建通过;浏览器访问现有服务停在登录页,未完成真实登录态交互验收。构建保留现有大分包和混合静动态导入警告。
|
||
- [ ] 人工复验不同缩放和明暗主题下的位置、遮罩与 Escape 关闭、重新打开重置参数、预设与角度拖动;本轮不执行收费生成。
|
||
|
||
## Issue #429 文本节点选中
|
||
|
||
- 普通文本和富文本预览恢复鼠标事件冒泡,单击进入节点选中和编辑面板流程;编辑中的输入框仍隔离拖拽和滚轮。
|
||
- [ ] 人工复验正文单击、标题拖拽、富文本、组合键多选、双击编辑和正文滚动。
|
||
|
||
## Issue #428 插件协议分类
|
||
|
||
- 分类筛选同时限制展示分区,避免音视频协议在音频筛选结果中重复展示;全部分类仍展示各自支持的能力分区。
|
||
- [ ] 人工复验 AutoDL 在音频、视频和全部分类中的展示,以及搜索、状态筛选和详情入口。
|
||
|
||
## 画布多图分组与展开动画
|
||
|
||
- 新生成的多图组默认展开,直接看到全部结果;仍可手动收起,复制图片或替换节点生成多图时保留分组归属、收起和设置主图。
|
||
- 子图入场动画仅在主动展开图片组时触发;普通选择、拖动或重新进入视口不播放入场动画,快速切换展开与收起时清理上一轮动画状态。
|
||
- 22 项相关测试及前端生产构建通过,包含子图普通挂载、选中与展开/收起的组件渲染回归;浏览器已确认本地画布可加载,尚未复验截图中的多图场景。
|
||
- [ ] 人工确认多图生成后的堆叠预览、数量按钮展开/收起、子图点击与拖动、主图切换,以及保存后重新打开画布。已有画布保留用户保存的展开状态。
|
||
|
||
|
||
## PR #426 本地整合验收
|
||
|
||
- 保留主分支图片尺寸选择器、后台尺寸预设布局、插件分类筛选、文本节点单击编辑、多角度居中弹窗、附件缩略图、站点外观与系统性能页面;接入 PR 的 UI 组件族和创作会话交互。
|
||
- 创作结果添加到画布前继续校验全部结果均有归属明确的素材记录,避免部分结果尚未落库时只转交部分素材;测试同步到消息级结果组件。
|
||
- 本次不接入 PR 新增的用户彻底删除功能,移除其按钮、客户端调用、路由和级联实现,原有停用/启用及素材回收站功能保持不变。临时 SQLite 回归已复现原实现成功返回后残留镜头修订和素材展示记录;其资源物理清理、账务保留与事务边界需单独完善后再接入。
|
||
- 无新增数据库迁移,不运行开发服务、不操作真实用户数据、不推送远程或部署。
|
||
- [x] 前端生产构建、前端主测试及主分支交互/外观和剪辑专项测试通过;后端 `go test ./...` 全量通过。
|
||
- [ ] 浏览器验收:明暗主题下图片分辨率/比例、自定义尺寸、后台模型能力预设、插件分类、文本节点编辑、多角度弹窗、附件常显、创作历史与完整结果转交画布。
|
||
- [ ] 确认后台用户管理保留查看/编辑/启用/停用入口,不展示未完成的用户彻底删除功能;实际生成与剪辑链路由用户验证后再决定是否推送。
|
||
|
||
## UI 组件同角色迁移(P0,2026-09-06)
|
||
|
||
依据 `docs/plans/ui-kit-consumption-audit.md` 实施:主界面/后台同角色控件统一消费 `components/ui`,消除 antd 与 ui 双观感。变更范围:Tooltip 29 处、Switch 10 处、朴素单选 Select 12 处、Checkbox.Group 1 处迁移至 ui 族;同步清理 globals.css 中 3 段 antd Checkbox 死选择器。antd `Switch`/`Checkbox`/`Tooltip` 全库归零;Empty/Alert/Badge/状态 Tag 维持零。
|
||
|
||
- [x] `tsc --noEmit` + `vite build` 通过(跳过与本次无关的 build:bridge 预构建)。
|
||
- [x] 代码级核对:`size="small"→"sm"`、`mouseEnterDelay` 秒→`delay` ms(ui 契约)、`id`/`htmlFor`→`ariaLabel`(ui Select 不接收 id)、`rootClassName` 死类删除、CheckboxGroup 泛型对齐;antd import 行同步剔除。
|
||
- [ ] 浏览器目验(待用户确认):
|
||
- [ ] Switch(ui 版):画布节点配置面板、字幕弹窗、工具栏显隐设置、人像抠图弹窗「浏览器调试」开关、图片/视频生成设置面板——尺寸/轨道/焦点态与设置页、后台开关一致。
|
||
- [ ] Tooltip(ui 版):后台左侧栏折叠提示、项目详情页签栏与新建按钮、画布各图标按钮、技能/插件/设置页——悬停提示正常、无溢出裁剪(ui 版外层 span 包裹)。
|
||
- [ ] Select(ui 版):后台邮件/存储设置、用户编辑抽屉、皮肤主题编辑器、画布页布局切换、项目详情设置、设置页与技能编辑/安装——下拉观感与尺寸、placeholder、暗色模式正常;skill 模板/皮肤阴影下拉值回显正确。
|
||
- [ ] CheckboxGroup(ui 版):脚本节点右键「显示列」选择器——勾选/反选、列显隐即时生效,无残留 antd 勾选样式。
|
||
- [ ] 已知保留(非本次改动,不判回归):搜索/多选 Select(约 24 处)与画布 11 处 Segmented 维持 antd,ui 能力缺口补足前不迁移。
|
||
## v1.2.6.rc3 候选版本发布
|
||
|
||
- 本版本在 rc2 基础上纳入此前未提交的模型编辑弹窗、协议浏览器、后台切页与画布网格源码及相邻回归测试;版本为 `v1.2.6.rc3`,镜像标签为 `1.2.6.rc3`,不覆盖 rc2。
|
||
- 默认前端测试命令已接入模型编辑表单、价格档、前台模型与画布网格回归;最终 `bun run test` 的 39 + 4 + 1120 + 1 项测试全部通过,前端生产构建通过,仍有既有包体积与混合静动态导入警告。
|
||
- 隔离组件页使用明确的测试协议数据完成浅色桌面、390px 暗色窄屏、协议搜索选择与详情联动、长内容滚动和固定底栏验收;后台编辑器跨页签必填校验能定位基本信息,取消修改会确认且可继续编辑。校验期间无 XHR/fetch 请求及控制台错误,不代表真实路由或后端保存已验收。
|
||
- 本轮相对 rc2 无后端源码变更,未重跑后端全量;rc2 记录的既有后端测试失败仍不视为解决。
|
||
- 标签推送后的远程质量检查中,后端全量与支付插件检查通过,前端被 9 个文件的格式检查阻断。主分支追加格式修复,并将协议浏览器静态回归的定位条件改为忽略换行缩进;本地 1164 项前端测试复跑通过。已推送的 rc3 标签不改写,该补充提交不改变应用业务逻辑。
|
||
- [ ] 发布产物验收:前后端 Linux amd64/arm64 镜像、双架构更新器校验和、部署 Compose 附件以及镜像内版本和提交信息。
|
||
- [ ] 部署后验收:实际模型新增/编辑保存、真实协议与计费组合、后台路由切换、画布缩放以及登录和任务生成。本次不部署、不写入真实模型配置、不执行收费生成。
|
||
|
||
## v1.2.6.rc2 候选版本发布
|
||
|
||
- 发布版本与镜像标签分别为 `v1.2.6.rc2` 和 `1.2.6.rc2`,GitHub Release 应标记为预发布。发布范围包含 PR #423 合并后的远程主分支,不包含本地未提交改动。
|
||
- 发布前代码验证:前端完整测试与生产构建通过;后端相关专项通过,全量测试仍有 4 项在合并前基线同样失败,另一次素材清理测试出现 SQLite 表锁且独立复跑通过,不将后端全量标记为全绿。
|
||
- [ ] 发布产物验收:前后端 Linux amd64/arm64 镜像、Release 双架构更新器、SHA256SUMS 与部署 Compose 附件,以及镜像内版本和提交信息。
|
||
- [ ] 部署后验收:版本展示、登录、画布任务恢复、图片规格报价、真实邮件与生成流程;本次仅发布镜像和附件,不部署服务或修改线上数据库。
|
||
|
||
## 缓存回源与任务队列止血
|
||
|
||
- 已加入进程内有界读缓存:SSE 按用户、任务、游标合并回源;并发策略短缓存;路由版本短缓存和目录回源失败冷却。强校验的计费、配额、权限读取不改为缓存。
|
||
- worker 改为可续期全局槽位和每次领取独立 owner;数据库进度、终态、完成事务、延迟回查检查有效租约;旧执行者条件更新失败后不继续退款和完成会话。渠道槽位等待改为有上限的随机退避。
|
||
- 已通过定向回归与缓存 / 租约 race 检查,覆盖突发同 key 合并、失败冷却、容量与正文预算、取消、缓存失效、用户 / 游标隔离、调用者副本和旧 owner 写入拒绝。完整 repository / handler 测试通过;完整 service 仍有 4 项既有失败,已在 HEAD 隔离副本复现(渠道私网策略 2 项、视频恢复策略 2 项),不将其标记为全绿。
|
||
- [ ] Redis Lua 与 PostgreSQL 双实例故障注入、长任务续租、worker 强退后恢复及真实 SSE 重连验收;本地缺少 Redis 服务且 Docker daemon 未运行,尚未执行真实 Redis / PostgreSQL 集成测试。
|
||
- [ ] 线上故障时段取证及灰度效果确认;本次没有部署、清缓存或重投任务,不能认定早间事故已修复。
|
||
- [ ] 独立 worker、可靠投递、渠道前置队列、全部回调 owner 校验、业务 Redis 缓存、请求链路日志和事件驱动 SSE 属于后续阶段。范围、上线风险及验收步骤见“开发文档 → 任务缓存与队列稳定性”。
|
||
|
||
## 后台模型编辑与紧凑布局
|
||
|
||
- [x] 模型编辑改为固定操作栏的高弹窗,按基本信息、能力与参数、积分定价分组;隐藏页签校验失败时定位到对应页签,未保存修改关闭前确认。
|
||
- [x] 基本信息采用双列字段,次要说明收进提示;价格档的定价方式、计费方式与金额横向排列,规格条件单独展开,启用状态收进档位标题栏。
|
||
- [x] 引用与限制改为左侧标签、右侧数字框,支持/默认开关横排,压缩卡片头部和行距,卡片按内容高度展示;样式限定后台编辑弹窗,不改变设置页的共享组件布局。
|
||
- [x] 调用协议由下拉框改为固定高度的内嵌协议浏览器:支持按协议名称、厂商和请求路径搜索,以单选列表切换,右侧持续展示当前协议的请求、请求体、响应方式和来源;约 30 个视频协议下仍保持弹窗高度稳定。
|
||
- [x] 管理后台“前台模型”和用户端“自定义渠道”的新增/编辑统一为居中分组弹窗;前台模型的供应线路改为可搜索单选浏览器。自定义渠道把连接信息、模型与能力合并为一个可滚动页面,不显示页签;调用协议仅在渠道内模型的“编辑模型使用配置”中选择,用户自定义模型不提供积分定价。
|
||
- [x] 隔离组件验收已覆盖前台模型新增、类型切换、线路添加与详情联动,以及自定义渠道新增、完成后重新编辑、渠道内模型协议搜索切换和嵌套编辑;验收适配窄屏单列布局,未向后端写入测试数据。统一改造后的 46 项相关回归测试和前端生产构建通过。
|
||
- [x] 协议选择专项与后台 UI 回归共 27 项通过,前端生产构建通过;浏览器已确认当前协议选中态、协议详情和 `sora` 搜索筛选正常,未执行协议切换或保存。
|
||
- [x] 31 项相关回归测试和前端构建通过。浏览器验证引用数量字段可编辑并恢复原值,未支持参数的默认开关仍禁用;桌面与 390px 窄屏无横向溢出,底部操作栏可见、长内容可滚动。未保存模型或触发收费上游测试。
|
||
- [ ] 人工确认紧凑布局、浅色主题、新增/编辑实际保存、协议切换和规格计费组合;当前真实路由受前台模型与自定义渠道功能开关限制,本轮只在隔离组件页完成交互验收。
|
||
- [ ] 后台切页已移除入场透明度动画并收敛为持久布局内的 Suspense 边界;冷/热路由切换的闪屏效果仍需浏览器复验。
|
||
|
||
## 邮箱域名白名单与公告自动提醒(PR #417)
|
||
|
||
- 新增注册邮箱域名白名单:默认常见服务商、空列表不限制、精确域名匹配;发送注册验证码及提交注册都会校验,已有账号找回密码不受限制。保存失败不覆盖既有配置。
|
||
- 公告允许仅标题发布;工作区自动提示未读公告,支持关闭本次及今日不再提醒。保留弹窗按需加载;主动打开后即使已读同步失败,关闭也不会立刻重新弹出。
|
||
- 合并沿用主分支历史迁移方案,不重复执行迁移或重写版本 6 的历史记录;未修改用户数据库,历史升级仍需备份及 PostgreSQL 实际环境验收。
|
||
- 已通过前端构建及本次相关后端数据库、handler、service 专项测试;公告提醒前端回归使用静态契约检查,不等同于浏览器交互验收。
|
||
- 基线复测确认既有失败:后端渠道私网策略 2 项、视频恢复策略 2 项,以及前端工作区加载骨架断言 1 项;本次不修改这些无关逻辑。
|
||
- 待人工验证:邮箱设置保存/清空/刷新及错误展示、仅标题公告发布与重新发布、明暗主题、窄屏弹窗、跨日提醒、不同账号的今日免打扰隔离,以及网络失败后的手动关闭与重试。
|
||
|
||
## v1.2.6.rc1 候选版本发布
|
||
|
||
- 发布版本与镜像标签分别为 `v1.2.6.rc1` 和 `1.2.6.rc1`;GitHub Release 应标记为预发布,不能被当作正式版本推荐。
|
||
- 待验证:前后端镜像的 Linux amd64/arm64 构建、Release 更新器附件与校验文件,以及实际部署后的版本展示和核心流程。本次发布不自动部署服务,构建成功不代表业务验收通过。
|
||
|
||
## 历史迁移 6 编号冲突
|
||
|
||
- 已修复历史 `asset_library_folders` 占用版本 6 导致启动失败的问题:保留既有记录,精确验证名称与校验和后,在版本 7 补齐播放副本字段;现行数据库迁移顺序不变。
|
||
- 已验证 SQLite 数据库测试:历史版本升级、目录数据与迁移时间保留、播放字段实际补齐、重复执行、未知名称/校验和及冲突记录拒绝;未直接修改用户数据库。
|
||
- 待验证:实际部署备份后的迁移与后端重启,以及 PostgreSQL 历史数据库升级。回退必须使用匹配备份与代码,不能直接修改 `schema_migrations`。
|
||
|
||
## 登录与个人库按需加载
|
||
|
||
- 登录不调用全量 snapshot;画布库每页 40 条摘要、服务端搜索排序;详情、导出和重命名按 ID 加载。素材选择按页读取,画布引用素材每批最多 100 个 ID。
|
||
- 已验证:前端构建、账号持久化专项 50 项测试、后端分页与批量读取隔离测试、handler 包测试。待新后端加载代码后验证登录首页网络、分页滚动、搜索、跨页选择、导出、重命名及失败重试;本轮浏览器连接中断,未取得改造后请求数。
|
||
- 后端 service 包更大范围测试有 4 项失败:`TestChannelFromRequestStoresAndClearsHeaders`、`TestRuntimeConcurrencyUsesEnvironmentFallback`(私网地址策略),`TestOnlyResumableNewAPIChannel2VideoDeadlinesStayRunning`、`TestResumableVideoDeadlineUsesResolvedSystemChannelProtocol`(视频恢复策略);未借本次分页优化调整这些逻辑。
|
||
- 待验证:新账号无缓存时的生成回填、历史创作转画布、项目图片与声音选择、跨设备编辑冲突和 PostgreSQL 查询。
|
||
- 边界:Vite 开发模块请求不能当作业务 API 数量;本地 IndexedDB 仍整体恢复,后端仍解析当前页完整画布。增量会话不基于未加载数据推断删除或自动归档素材。
|
||
|
||
## 提示词编辑器顶栏精简
|
||
|
||
- 标题改为“图片生成 / 视频生成”等无底色文本;“提示词模板”和“润色”右对齐,辅助操作默认透明,仅悬停、展开或键盘聚焦时强调。
|
||
- 参考数量移到缩略图行,纯图片引用显示“参考图”,混合引用显示“参考素材”;保留预览、插入引用和移除连接行为。
|
||
- [x] 前端生产构建通过;浏览器确认图片普通面板与放大面板的标题、参考数量位置,以及模板菜单展开。
|
||
- [ ] 确认明暗主题、窄窗口、视频及音频面板的显示;启用润色插件后检查入口与原有优化流程。当前验证环境未启用该插件,未触发生成或收费操作。
|
||
|
||
## 画布浮层平移同步
|
||
|
||
- [ ] 连续平移、缩放时,节点工具条与提示词卡片逐帧跟随,结束后不回跳;调整窗口宽度后仍正确定位。
|
||
- [ ] 顶部空间不足时工具条仍避让提示词卡片;明暗主题下移动无模糊残影,菜单、输入和键盘操作正常。
|
||
- 实现:卡片改用逐帧视口事件和 transform 定位,尺寸变化使用最新视口;工具条合并重复通知并缓存尺寸,交互期间关闭浮层滤镜。
|
||
- [x] 工具条及媒体性能专项测试 31 项通过,前端生产构建通过;浏览器连续平移与缩放采样中,卡片与节点间距约 10px、工具条与节点间距 30px,未出现定位回跳。大画布性能、不同设备上的残影观感仍待确认。
|
||
|
||
## 图片与视频节点工具条重组
|
||
|
||
- [ ] 图片:局部重绘、人像调整(表情/质感)、多角度、图片工具(构图与尺寸/拆分与标记),预览与下载为图标操作。
|
||
- [ ] 视频:截取片段、字幕、提取素材(画面/音频)、进入剪辑;替换素材收进更多,移除节点单独分组。
|
||
- [ ] 调整尺寸明确为插值放大而非 AI 超分;未实现的超分入口不再展示。裁剪、标注、放大、宫格和音频结果名称保留源素材名。
|
||
- [ ] 窄画布折叠工具与剪辑入口,顶部空间不足时工具条保持在可视范围;检查明暗主题、滚轮不穿透和点击后关闭。
|
||
- [x] 工具条专项测试覆盖分组、文案、空态、简洁模式、忙碌禁用和动作派发;前端类型检查与生产构建通过(存在分包体积及混合导入警告)。
|
||
- [x] 已在现有开发服务确认图片菜单分组、方向键进入菜单、Escape 关闭并返回触发按钮;390px 视口下工具条为单行且不越界。
|
||
- [x] 已确认视频四个一级入口及提取素材菜单;边缘节点工具条避让生成面板后可正常点击。
|
||
- [ ] 素材预览端到端验证受当前资源接口 500、本机 Agent 连接失败影响;不将界面验证视为媒体链路全部通过。
|
||
- [ ] 真实素材端到端复核:局部重绘与表情生成、质感设置、音频提取保留原声、项目时间线定位;本次不自动触发收费模型任务。
|
||
|
||
## 验证码邮件
|
||
|
||
- [ ] 邮件配置保存自定义发件名称后,新发送的注册验证码邮件发件名称、标题和正文保持一致;密码重置验证码邮件同样使用该名称。
|
||
- [ ] 发件名称留空或使用默认名称时,验证码邮件继续继承站点品牌名称;再次修改自定义发件名称后,新邮件使用最新名称。
|
||
|
||
## 画布任务恢复
|
||
|
||
- [ ] 缺少任务 ID 的节点,通过当前项目最近 100 条任务摘要的 `clientContext.nodeId` 恢复;完成后正常回填。超出发现范围的旧任务不保证自动恢复。
|
||
- [x] 回归覆盖任务摘要节点关联、敏感输入不泄露,以及前端在没有完整输入时读取节点 ID。
|
||
|
||
## 图片规格价格
|
||
|
||
- [ ] 仅配置 1K、2K、4K 三档价格(无统一兜底),画布逐一切换分辨率,显示与对应档位一致的积分价格。
|
||
- [ ] 分别配置文生图、图生图规格价格;添加、移除参考图或角色参考后,报价与实际生成命中对应档位。
|
||
- [ ] 新建图片节点时,报价使用节点模型默认规格,而不是全局旧参数;刷新后再次核对。
|
||
- [ ] 配置统一价格时仍正常兜底;未配置且没有兜底的规格不能被计为其他档位价格。
|
||
- [x] 合并检查补修:缺少质量参数时按有效尺寸匹配档位;不把空参数转为 `"<nil>"`;面板保留实际生成的“自动”参数,不以价格表第一档替换请求规格。
|
||
- [x] PR #423 合并验证:前端完整测试脚本 1139 项通过、生产构建通过;后端邮件、任务摘要和图片计价专项通过。后端全量仍有 4 项既有失败(私网上游校验 2 项、视频恢复策略 2 项),已在未合并的 `main` 基线上复现;最后一轮另有资源清理测试 SQLite 表锁失败,该项在合并分支与基线单独复跑均通过。未为通过测试而放宽安全或恢复策略。
|
||
- [ ] 真实 SMTP 投递、浏览器刷新恢复和收费生成仍待人工验证。本次不触发外部邮件或收费请求。
|
||
|
||
## NewAPI Video Generations Channel 2 轮询恢复
|
||
|
||
- [x] 官方插件兼容从 `data.task_id` 和 `data.taskId` 读取上游任务 ID;Channel 2 创建成功后首次查询等待 2 秒,仅将结构化 `400 task_not_exist` 识别为上游同步延迟,并按 2 秒、3 秒、5 秒、5 秒退避复查同一任务。
|
||
- [x] 短期重试耗尽后,Worker 保留本地任务 `running`、原 `provider_request_id` 和计费状态,延后 15 秒继续查询;恢复过程不重复发送创建请求、不切换渠道,也不立即失败或退款。其他接口类型、HTTP 状态和错误码仍按原失败语义处理。
|
||
- [x] 合并补修为跨轮次 `task_not_exist` 增加 5 分钟总同步上限;超过上限进入明确失败态并释放任务与计费资源,正常 pending/running 长视频仍可跨执行窗口恢复。
|
||
- [x] Channel 2 终态响应兼容 `data.result_url`、`data.video_url`、`data.output_url`、`data.url`、`data.metadata.url` 及对应的 `data.data.*` 嵌套路径;API 调用日志在该接口下优先记录嵌套真实任务 ID。协议与日志富化专项回归测试通过。
|
||
- [ ] 使用真实 Channel 2 分别验证上游任务 ID 短暂不可见和生成耗时 500 至 600 秒的任务:本地不再提示“模型服务拒绝了请求”,创建请求只出现一次,后续始终查询同一 Provider Task ID,最终视频正常回写;真实参数错误仍应及时失败。
|
||
- [ ] 使用返回 `SUCCESS` 且视频地址位于 `data.result_url` 或 `data.data.video_url` 的真实任务,确认不再提示“声明式协议已完成但没有返回结果”,并在当前 OSS 配置下成功下载并持久化为本地资源。
|
||
|
||
## 编辑器(M2 命令状态机)
|
||
|
||
- [x] 命令协议黄金文件:`editor-commands` 8 个黄金 op(addClip/moveClip/trimClip/splitClip/removeClip/setClipProperty/addSubtitle/removeSubtitle)全量快照比对通过;未知 op、非法 payload 一律抛错(fail-closed)且输入不可变。
|
||
- [x] 快照撤销:`editor-history` 有界 200 层,undo 后新命令清空 redo;边界测试(0 层/200 层/undo 后 redo 清空)通过。
|
||
- [x] 命令状态机 store:`editor-store` 命令入队→reducer→新状态,手势预览(previewGesture 连续预览/commitGesture 一次性入历史/cancelGesture 丢弃),1.5s 防抖保存(保存层依赖注入),保存串行链防旧快照覆盖,失败置 saveError 且保持 dirty;11 项测试通过。
|
||
- [ ] 浏览器冒烟(待用户确认):项目详情 → 剪辑成片 → 编辑器,拖拽片段移动、拖拽边缘裁剪(trim-start/trim-end)、撤销/重做按钮与缩放按钮;松手提交后可一次撤销;刷新后本地时间线(localforage scope 隔离)保留;状态栏显示 未保存/保存中/已保存/保存失败。
|
||
- [ ] M2.4 手势与画布拖拽不冲突(时间线容器 `data-canvas-no-zoom`),快捷键(Cmd/Ctrl+Z)与全局冲突项待 M3 统一处理。
|
||
|
||
## 编辑器(M3 预设插件八连)
|
||
|
||
- [x] 命令层新增 `rebuildSubtitleClips`(9 个黄金 op):从节点权威 subtitleEntries 重建字幕快照,确定性 id(nodeId:subtitle:index)重复导入原地替换;非法 entries(index/startMs/endMs/text/重复 index)与非法轨道(非字幕轨/无字幕轨)fail-closed;黄金文件追加用例通过(26 项)。
|
||
- [x] M3.1~M3.4:timeline-panel(选中联动 + 撤销/重做/缩放 UI)、preview-monitor(buildTimelineRenderPlan 预览)、inspector(setClipProperty 可撤销)、asset-ingest(addClip 入轨)插件与 editor.tsx 三段式接线已提交。
|
||
- [x] M3.5 subtitle-tools:SRT 粘贴导入(parseSrt → rebuildSubtitleClips 重建快照)、当前时间线字幕导出 .srt(serializeSrtEntries 往返一致);AI 高亮占位(M6 接入)。
|
||
- [x] M3.6 transcription:确定性 mock 转写(mockTranscriptionEntries 同输入同输出,3 项测试),结果按 ADR-0004 协议重建到字幕轨道;M4 替换真实任务客户端。
|
||
- [x] M3.7 export:渲染计划(buildTimelineRenderPlan 与画布同源)+ ffmpeg.wasm 降级导出(exportTimelineToMp4 带进度);悬空 nodeId 源按计划跳过。
|
||
- [x] M3.8:editor.tsx 全 8 槽三段式渲染(左素材/转写,中预览/时间线,右检查器/字幕/导出/AI)+ ai-assistant 占位(M6);typecheck 零错误、专项 53/53、全量 build 通过。
|
||
- [ ] 浏览器三段式冒烟(待用户确认):编辑器六个区域(时间线/预览/检查器/素材库/字幕/转写/导出)逐区域可见可操作;拖拽/裁剪/撤销重做回归;SRT 导入导出往返;mock 转写落轨;导出面板显示渲染计划。
|
||
|
||
## M5(编辑器插件权限执行,fail-closed)
|
||
|
||
|
||
- [x] M5.1:`plugin-permission-check.ts` 新建——8 插槽→最小权限表(timeline.read/timeline.command/export.run 三类域)+ `pluginMayRenderEditorSlot`/`assertEditorPermission` fail-closed 判定;测试 10 用例(表完整性/空权限拒绝/未注册拒绝/缺权限拒绝含 missing 域/editor-shell 真实回归 8 插槽可渲染)全绿。
|
||
- [x] M5.2 执行路径接入:editor.tsx SlotStack 渲染前过滤——缺权限插槽不渲染、改显一行诊断条(含缺失域);editor-shell manifest 权限补全为 timeline.read/timeline.command/export.run;tsc 全绿、全量 bun test 失败集与改动前一致(零新增回归)。边界:宿主全局命令(editor-commands,v1 语义)与宿主 UI 手势不经过此校验,仅 v2 插件插槽贡献与后续 M6 AI 命令代发通道受约束——ADR-0007「v1 权限语义一字不动」。
|
||
- [ ] M5 浏览器验证(待用户确认):停用/注册一个缺 timeline.command 权限的第三方插件时对应面板被拒渲染并显示诊断;editor-shell 全部 8 面板正常。
|
||
|
||
## M6(AI 编辑助手:schema + 摘要 + 面板)
|
||
|
||
- [x] M6.1:`ai-command-schema.ts` 新建——AI 命令 JSON 解析(容忍 markdown fence/前后杂讯/字符串内括号)、批级 dry-run 预检(走 M2 命令注册表,任一非法整批拒绝并报下标与 op)、12-op LLM 提示词契约(`AI_EDITING_OP_CATALOG` + `buildAiEditingSystemPrompt`)、`AI_COMMAND_SCHEMA_VERSION` 版本化;`ai-commands.golden.json` 固化 op 集与 registry 黄金同步(漂移即测试失败);20 用例全绿。
|
||
- [x] M6.2:`timeline-summary.ts` 新建——确定性中文摘要(轨道按 order 排序逐行、片段逐行含 id/kind/时间区间、字幕字数统计、空态提示);片段行数超限折叠(SUMMARY_MAX_CLIP_LINES);同输入同输出;10 用例全绿。
|
||
- [x] M6.3:`editor-ai-assistant.tsx` 从占位替换为真实 AI 助手——右上悬浮对话面板(OpenAI Canvas 风格):面板内文本模型选择器(`effective.textModels` 即文本能力模型目录,选择即 `updateConfig("textModel", …)` 持久化并在请求时同时覆写 `config.model/textModel`,绕过默认/误配图像模型的根因)、消息流(user/assistant/error/preview 四类气泡 + 思考中占位)、空态引导(示例意图文案,点击建议指令 chips 即发送,跨轮记忆)、底部输入条;顶部工具栏常驻 Sparkles 入口(aria-pressed 切换)。宿主链路:`buildAiEditingSystemPrompt(summarizeTimeline(project))` 喂上下文 → 流式增量渲染 → `parseAiCommandPlan` → `validateAiCommandBatch` dry-run(任一非法整批拒绝,同步 registry 校验、不落盘)→ ≤3 条 `dispatch` 直执行 / >3 条渲染 diff 预览卡片「确认执行(N)/ 放弃」→ 解析/校验拒绝时错误气泡可「修正后重试」(`failTurn` 回填 `FAILED_MARK`,历史含用户文本不重发;registry 直执行本身 fail-closed——拒绝写入 `saveError` 顶部提示,同步 dispatch 不抛错故不回填 FAILED_MARK)。修复了上一版文件的重复/截断函数(appendToEntry 双定义、settleAnswer 三声明等);typecheck 零错误、编辑器/插件相关测试通过、生产构建通过。
|
||
- [ ] 浏览器冒烟(待用户确认,需真实文本渠道):顶部工具栏 AI 图标开关面板 → 切换面板内模型下拉(无可用模型时展示禁用态)→ 输入自然语言;确认 ≤3 条指令直接执行且可撤销(撤销按条回退,N 条需 N 次撤销)、>3 条出现预览确认卡片(放弃不动时间线、确认后预览卡转为执行汇报、重复点击不再二次提交)、模型输出非法 JSON 时错误气泡出现「修正后重试」并回填失败标记、ESC/关闭按钮收起面板后再次打开会话仍在。
|
||
|
||
## M4(后端转写/渲染任务)
|
||
|
||
- [x] M4.1 执行侧(e9d1b8ad):本地 whisper.cpp HTTP(`CANVAS_WHISPER_BASE_URL`)转写;语音数据不出本机;未配置时任务明确失败并提示设置;`processClaimedTask` 顶部按类型分叉、旁路计费/模型路由,20 分钟超时;ffmpeg 预处理 16k 单声道 wav;`verbose_json` 解码/`formatSRTTimestamp`/`buildTimelineSRT` 单测 PASS。
|
||
- [x] M4.1 创建 API(bf26ebb1):`POST /api/timeline/transcriptions`(注册于 `RegisterTaskRoutes`)→ `CreateTimelineTranscriptionTask`:draining 503 → feature 门控 → 资源归属/可转写类型校验 → 配额入队(local/whisper.cpp,无 billing order);活跃任务上限 → 可读 400;测试 3 项 PASS。
|
||
- [x] M4.2 渲染任务(3f16d13b):`POST /api/timeline/renders` → `CreateTimelineRenderTask`:`buildRenderPlan` 校验 ≥1 可渲染媒体 → 配额入队(local/ffmpeg);worker 分叉 `processTimelineRender`(60 分钟超时):ffmpeg 合成 → 产物写资源存储 → `ResultJSON{resourceId,...}`;计划/失败快路径测试 PASS。
|
||
- [x] M4.3 前端字幕回写(fd5e8139):`timeline-tasks.ts` 客户端 + `editor-transcription.tsx` 真实任务替换 mock;资源范围放宽到音视频;`resourceId` 由 `storageKey` 推导;`waitForGenerationTask` 显式 25 分钟超时轮询;结果 segments → SrtEntry → `rebuildSubtitleClips` 落字幕轨;typecheck 通过。
|
||
- [x] M4.1 运行时端到端(2026-09-04,真实 whisper.cpp):`brew install whisper-cpp` + `ggml-base.bin`,whisper-server `127.0.0.1:8082`(`-l auto`);后端注入 `CANVAS_WHISPER_BASE_URL=http://127.0.0.1:8082` 重启;真实 mp4 资源经 worker 队列(status=queued → running → succeeded 100%)跑通:ffmpeg 16k mono 提取 → `/inference` verbose_json → 中文分段含 start/end/text 入库,与 `transcription_whisper.go` 解码协议一致。失败路径(未配置)此前 5 条任务均按设计报“撰写失败未配置本地转写服务”。启动步骤已写入 `local-development.mdx`,脚本 `scripts/start-whisper-local.sh`。
|
||
- [ ] 浏览器端到端(待用户确认;本机 whisper-server 已就绪,直接重试转写即可):媒体面板选音视频素材 → 转写 → 进度可见 → 完成后字幕分段入轨可编辑;错误路径(未配置/删除素材/非音视频/活跃任务上限/功能未开放)提示可读。
|
||
- [x] M4.2 渲染前端接线:`timeline-tasks.ts` 增 `createTimelineRenderTask`(timeline 整传 TimelineProject v2,与后端 renderProject 契约同构);`editor-export.tsx` 主路径改提交 `POST /api/timeline/renders` → `waitForGenerationTask` 轮询(62min)→ ResultJSON.resourceId 内嵌预览/下载;ffmpeg.wasm 降级保留;tsc 全绿、无新增测试失败。
|
||
- [ ] M4.2 渲染浏览器验证(待用户确认,需 ffmpeg 可用):导出面板「渲染成片(服务端)」→ 轮询进度 → 完成后内嵌预览/下载渲染产物;无后端时「本地导出」ffmpeg.wasm 仍可用。
|
||
- [ ] 文档回写(已提交):`docs/plans/m4-transcription-render-design.md` §2 决策 3/4/5 按“单一池 + 类型分叉”与旁路终态修正;端点统一为复数 `/api/timeline/transcriptions` 与 `/api/timeline/renders`(注册于 `RegisterTaskRoutes`);`auth.go` 前缀白名单补 `timeline`。
|
||
|
||
## 编辑器 UI 打磨(主题/布局/导入媒体)
|
||
|
||
- [x] 主题联动修复:globals.css `.dark` 块未闭合导致 `.editor-workbench` 规则被 CSS 嵌套吞并、浅暗主题三栏配色反转;补齐花括号后编译产物恢复顶层两规则,director token 明暗两主题齐备。
|
||
- [x] 播放条修复:预览卡与时间线卡容器补 `flex flex-col`,恢复 absolute 播放条的高度链。
|
||
- [x] 时间线右端截断修复:内容宽度改为 `trackWidth + 标签列(160px)`,标尺左列占位与轨道标签列改为 sticky(`left-0` + 不透明底),滚动到最右端时末端片段完整可见;容器宽度监听改用 ResizeObserver。
|
||
- [x] 顶部栏图标化:删除「剪辑工作台」标题 + Film 图标 + 分隔线等死图标;导出按钮改为纯图标(aria-label/title 保留)。
|
||
- [x] 媒体导入失败修复:`linkProjectAsset` 原来只认 assets 表记录,而上传只落 resources 表,导入必然 404。后端 `LinkProjectAsset` 在资产不存在时按资源元数据(storageKey/mimeType/kind/宽高/时长/状态)合成资产记录并幂等补齐(`UpsertAsset`),`Title` 透传原始文件名;资源与资产都不存在时仍 fail-closed。前端导入调用补传 `title: file.name`。
|
||
- [x] 后端新增 `TestLinkProjectAssetCreatesAssetFromUploadedResource` 与 `TestLinkProjectAssetMissingResourceKeepsFailingClosed` 专项测试;前端 typecheck、生产构建、后端全量测试通过。
|
||
- [ ] 用户浏览器 re-test(第 35 条):媒体面板中导入的素材与项目资产分组显示、筛选 Tab 切换、分组折叠与资产行展开;浅色/深色主题切换后媒体面板配色与编辑面板一致;时间线横跨整个编辑面板宽度,拖动分隔条调整高度正常。
|
||
- [x] 对象存储上传降级:OSS 上传失败(密钥失效、配置错误、网络故障、设置被删)自动回退本地存储并同步改写资源记录,本地媒体导入不再因外部存储故障整体失败;覆盖新上传与重试两条路径。专项测试 2 个(OSS 不可用降级成功 + 本地路径不受他人 OSS 设置影响),后端全量测试通过。
|
||
- [ ] 用户浏览器 re-test(对象存储降级):重新启动后端后再次导入视频,应显示成功且素材出现在媒体面板;资源走本地存储(`provider=local`)。
|
||
- [x] 编辑器 UI 打磨(第 36 条 5 项):① 时间线/监视器分隔条拖拽方向反转(上拖=时间线变大);② 导出按钮图标去蓝(灰白描边风格),媒体面板来源徽章去蓝,轨道类型徽章保留语义色;③ 时间线 pxPerMs 独立化(不再随时长漂移),末片段向右拖轨道随内容等比扩展不再被钉住(新增守护测试 3 例);④ 监视器控制条重做为 Concat 风格:回到开头/退 1s/播放/进 1s/到结尾五键传输组 + 播放速度展开菜单(0.5x/1x/1.5x/2x)+ 进度条,全部灰白描边;⑤ 检查器重做为 Concat 风格:分组小标题(片段/基本/转场)+ 紧凑控件 + sunken 滑块(新增 .editor-slider),全部使用 director token 随主题联动。
|
||
- [ ] 用户浏览器 re-test(第 36 条):上拖分隔条时间线变大;导出按钮与监视器控制条图标均为灰白描边风格;时间线末片段可正常向右拖拽且轨道随内容扩展;监视器速度菜单展开选择生效;检查器分组与滑块在明暗两主题下配色一致(无主题不同步)。
|
||
- [x] 媒体面板改版:资产按来源分组(「本地上传」/「项目素材」),顶部提供 全部/项目素材/本地上传 筛选 Tab;分组头可折叠、资产行可展开查看详情(类型/分类/来源/预览文本)并一键添加到时间线;每项带来源徽章与计数徽章。后端 `projectAssetSummary` 透出 `source`(上传链路写入 `uploaded`),前端 `ProjectAsset` 类型补 `source?: string`,仅展示层使用,后端读取不再查询本地存储。
|
||
- [x] 概览成片完成度接线:项目概览指标新增 `renderSucceededCount`(repository 聚合 SQL 子查询 `tasks` 表 `type=timeline_render` 且成功的计数),概览「剪辑成片」步骤卡的 complete 态由写死的 false 改为 `renderSucceededCount > 0`,提示文案随计数/就绪情况切换;新增后端专项测试 1 个、前端类型检查通过。
|
||
- [ ] 用户浏览器 re-test(概览完成度):渲染成功一次后刷新概览,「剪辑成片」卡应显示已输出 N 个成片且步骤完成态点亮;删除该成片对应任务后计数回退。
|
||
- [x] 时间线横跨编辑面板全宽:时间线卡从内容区独立出来,与左栏+预览+右栏同处编辑面板,横跨从左到右全宽(含拖拽高度分隔条);左栏收窄到 256px、右栏 320px,为全宽时间线腾出空间。
|
||
- [x] 主题明暗一致性:媒体面板分组/筛选/徽章/展开详情全部使用 director token(surface/control-hover/dock-fg/sequencer-border),无新增硬编码色值;后端 `source` 字段不参与任何配色。前端 typecheck、生产构建、后端全量测试通过。
|
||
- [x] 时间线面板补齐 Concat 风格工具栏与编辑交互(对齐第 2 条 runbook 与 `Concat/desktop/.../TimelinePanel.tsx`):新增 选择/剃刀 工具切换(剃刀点击分割、非字幕片段、边缘留 100ms)、播放头时码只读显示与标尺拖动 scrub、分割播放头处、删除选中片段、磁吸开关(默认开)、加轨道下拉(视频/音频/字幕,`addTrack` 黄金命令确定性生成 id/order/label,undo/redo 可重放)、适应宽度(`getFitTimelineZoom`);工具栏布局重排为 Concat 顶部条结构。`editor-commands.ts` golden ops 由 9 增到 10(`addTrack`)。
|
||
- [x] 磁吸失效修复:片段拖拽移动分支原本只保留「左边缘目标与右边缘目标同时命中」的结果,单边命中(如最后一个片段右边缘无目标)或双目标取整后偏移为 0(原始位置已在目标上)时整组吸附被丢弃,表现为「第一个和第二个片段能吸附、后续片段与剃刀分割出的片段都吸不住」。改为以 `computeSnap` 返回的 `targets.length` 判定命中、左右候选独立比较取更近者,单边命中与零偏移命中均可正常吸附。
|
||
- [ ] 用户浏览器 re-test(时间线工具栏与磁吸):拖拽任意片段(含剃刀分割出的片段)靠近其他片段边缘或播放头时磁吸生效且可吸附回自身原位置;剃刀点击在指针处分割;分割按钮在播放头落在片段中段时可用;删除选中片段后再次拖拽正常;加轨道后新轨道带确定性标签与序号;适应宽度后内容恰好铺满可视宽度;磁吸关闭后拖拽自由、无取整跳动。
|
||
- [x] 工具按钮选中态样式修正:时间线工具栏 选择/剃刀/磁吸 的按下态原来是蓝色背景块,改为「仅图标变 accent 色、无背景块」;颜色职责收敛为 `TOOL_FG_IDLE` / `TOOL_FG_ACTIVE` 两常量(唯一来源),工具栏与加轨道下拉不再散落重复的颜色字面量。
|
||
- [x] 监视器播放条重构(Concat 布局):删除叠加在画面底部的渐变进度条与 `<input type=range>` scrub;改为画面下方独立一行 `grid h-11 grid-cols-[1fr_auto_1fr]`:左 播放头/总时长时码、中 回开头/退 1s/播放暂停/进 1s/到结尾(播放态仅图标变 accent)、右 速度菜单(0.5x/1x/1.5x/2x,带 Gauge 图标与展开箭头)。
|
||
- [ ] 用户浏览器 re-test(选中态与播放条):点击 选择/剃刀/磁吸 时只看到图标变色(无蓝底块),深色/浅色主题一致;监视器底部控制条不悬浮于画面、无进度条,播放态播放图标变主题强调色,速度菜单展开/选择生效,拖拽分隔条改变监视器高度时画面区域与控制条高度正常。
|
||
- [x] 轨道操作按钮(Concat 对齐):时间线轨道行头新增「移除轨道」X 按钮(hover/键盘 focus 显现,danger 强调,仅该 kind 非最后一条时可用);新增 `removeTrack` 黄金命令——每类轨道至少保留一条(删除该 kind 最后一条会被守卫拒绝),删除时级联移除轨道上全部片段、无悬挂引用,undo/redo 可重放;`editor-commands.ts` golden ops 10→11(`removeTrack`),新增 3 条单测(级联删除并保留其余 / 最后一条拒绝 / 未知 trackId 拒绝)。
|
||
- [x] 资源上传 400 修复:`POST /api/resources` 在文件超过 MaxBytesReader 上限(单文件限制 50MB +1MB 缓冲)时 `FormFile` 返回英文 `http: request body too large` → 现翻译为与 service 配额校验一致的中文「单个上传文件必须小于 50MB」(`backend/internal/handler/user_data.go`),前端可正常展示失败原因而非裸 400。
|
||
- [x] antd Modal `maskClosable` deprecation 清理:5 处改用 `mask={{ closable: … }}`(canvas-upload-modal / asset-library-picker-modal / projects index「AI 生成章节」/ skill-editor-drawer / skill-install-modal)。
|
||
- [ ] 用户浏览器 re-test(轨道移除与上传):hover 轨道行头出现 X,点击移除非最后一条轨道后其与片段消失且可 undo;该 kind 仅剩一条时行头不出现 X;移除轨道后选中片段同步取消;导入超过 50MB 的本地视频不再报 400、可正常入库(见下方分片导入复测)。
|
||
- [x] 本地媒体导入对齐 Concat 分片化:前端 `uploadResourceFile` 超过 50MB 自动切分片上传(8MB/片、失败整传重试、回调进度);后端新增分片会话三接口 `POST /api/resources/uploads`(开始)、`PUT /api/resources/uploads/:id/chunks/:index`(逐片原始二进制)、`POST /api/resources/uploads/:id/complete`(合并落库,复用 UploadResourceFile 幂等/落盘/探测,保留上传中唯一键 → 提示“上传中请稍候”);单片上限 8MB 使文件整体不再受 multipart 单请求限制,普通本地视频可导入。
|
||
- [x] 上传默认配额放宽:运行时默认策略 `DailyUploadMB` 200→2048、`StoredFileGB` 2→20(管理员后台仍可调回);`UploadResourceFile` 经 `reserveChunkedUploadQuota` 豁免单文件大小上限、仅受日/总量约束;`upload_quota_test.go` 对总量文案、daily 上限文案与逻辑按新默认同步,`resource_upload_session.go` 分片会话(内存 TTL 90min、并发/单片限长防护、超总量提前拒绝),新增路由注册测试。
|
||
- [ ] 用户浏览器 re-test(分片导入):本地选择 >50MB 的视频导入成功并入库(进度可见、失败自动整传重试);断网重连后重试完成;<50MB 小文件仍走原 multipart 路径无回归;重复导入同一文件命中幂等返回原资源不重复占额度;超日限/总量时提示中文配额文案。
|
||
- [ ] 用户浏览器 re-test(第 35 条):媒体面板中导入的素材与项目资产分组显示、筛选 Tab 切换、分组折叠与资产行展开;浅色/深色主题切换后媒体面板配色与编辑面板一致;时间线横跨整个编辑面板宽度,拖动分隔条调整高度正常。
|
||
- [x] 轨道可见/静音开关(Concat 行头对齐):轨道行头补齐 eye(显示/隐藏轨道)与 volume(静音/取消静音)按钮,与移除 X 三按钮同组(行头加宽 w-40→w-48);关闭态图标变 accent 色(无背景块),轨道名与片段区随隐藏降透明度;新增 `setTrackFlag` 黄金命令(flag 白名单 visible/muted,golden ops 11→12),隐藏轨道(visible=false)上的片段不再参与监视器预览合成(getClipAtTime 过滤);新增 3 条单测(目标轨设置且其余不受影响、muted 独立于 visible、未知轨道/flag/非布尔拒绝),输入不可变校验。
|
||
- [ ] 用户浏览器 re-test(轨道可见/静音):行头 hover 出现三按钮组;点 eye 隐藏轨道后监视器该轨画面消失、轨道行与轨道名变淡、再点恢复;点 volume 静音后图标变 accent(音频在 M4 播放/导出阶段生效);仅剩一条轨道时无移除 X;以上操作均可一步 undo。
|
||
## 任务预览、文本创作与首屏加载优化
|
||
|
||
- [x] 任务列表视频改为后端海报字段与前端懒加载图片占位,列表本身不再挂载视频源;后端安全 URL、视频海报专项测试通过。
|
||
- [x] 图片、视频、文字节点的编辑面板统一定位在节点下方;文本创作新增默认开启的流式输出与默认关闭的思考开关,并完成前后端协议、推理内容解析和专项测试。
|
||
- [x] 创作输入支持一键清空,生成结果刷新后保持展开,“生成同款”入口移至结果标题区,对话文字默认左对齐。
|
||
- [x] 匿名首屏移除画布、素材、插件、用户数据同步和品牌视频的提前加载;生产预览的请求数由 203 降至 71,前端生产构建与相关专项测试通过。
|
||
- [x] 首屏骨架屏替换为平台 Logo、分镜、文字稿和时间线组成的创作动画,并支持减少动态效果偏好。
|
||
- [ ] 使用真实登录态分别生成 Responses、Chat Completions 与 Claude 文本,验证流式开关、思考内容、刷新后的结果展开状态和历史消息左对齐。
|
||
- [ ] 在任务中心打开含海报、无海报两类视频任务,确认列表滚动时不下载视频正文,进入详情后才加载并播放视频。
|
||
- [ ] 在画布底部边缘分别选择图片、视频和文字节点,确认编辑面板仍固定在节点下方且控件可通过画布滚动或平移访问。
|
||
- [ ] 在弱网、浅色/深色主题及 `prefers-reduced-motion` 下刷新首页,确认 Logo 创作动画清晰、无闪屏且登录后工作区模块正常按需加载。
|
||
|
||
## 生成结果项目资产同步限流恢复
|
||
|
||
- [x] 生成成功后的自动资产同步会识别后端 HTTP 429,读取 `Retry-After` 并在可取消等待后重试;普通校验失败仍立即上抛,专项测试与前端生产构建通过。
|
||
- [ ] 在启用常规素材/画布写入频控的部署环境连续完成一批图片、视频或音频生成,确认结果先保留在画布,临时 429 不再立即显示为项目资产同步失败,等待频控窗口后资产自动出现在项目资产库。
|
||
|
||
## 平台外观管理
|
||
|
||
## 支付插件跨平台构建
|
||
|
||
- [x] 微信与支付宝 provider 已使用同一 target-aware 构建脚本完成 `CGO_ENABLED=0` 的 linux/amd64、linux/arm64 交叉编译;目录 provider 与 `.yingce-plugin` 内 provider 的 ELF 架构和内容一致性校验通过。
|
||
- [x] 包内外产物一致性、完整包摘要缓存、同版本 provider 更新失效、未完成解包恢复等专项测试通过;RPC 错误映射的跨平台单元测试通过。
|
||
- [ ] 在 Linux CI 完成无文件、无权限、错误格式、异常退出与无效 JSON 的 RPC 进程测试,并使用 Docker Buildx/QEMU 执行 `payment-package-smoke` 的 amd64/arm64 双平台构建,确认目标容器内两个 provider 均能真实执行无效 JSON 冒烟请求。
|
||
- [ ] 保留含旧 Mach-O runtime 的生产 `/data` 卷升级到修复镜像,确认启动后自动选择新 package digest,管理后台保存微信和支付宝配置进入真实凭证校验。
|
||
|
||
## 站点及外观与皮肤主题
|
||
|
||
管理后台“系统配置 → 站点及外观”统一品牌、登录页、SEO、首页收尾/备案和皮肤主题,并让公开配置在应用渲染前完成解析;以下真实浏览器与媒体场景需要持续确认:
|
||
|
||
- [x] 后端专项与全量测试通过,覆盖内置默认值、管理员权限、资源类型/归属、公开 URL 不泄漏资源 ID、媒体字节嗅探、删除保护与路由注册。
|
||
- [x] 前端专项测试、后台回归测试、TypeScript 检查和生产构建通过,覆盖初始 HTML 品牌中立、自定义视频不回退内置封面、不安全 URL 回退、单 Logo 深浅主题复用、双 Logo 主题选择、外框关闭与登录场景固定使用深色 Logo。
|
||
- [x] 站点名已覆盖注册邮件、密码重置邮件、继承型发件人名称、诊断说明、批量导出、插件与协议文档中的运行时品牌文案;技术兼容键继续保留稳定值。
|
||
- [x] SEO、版权、ICP备案和主题库通过前后端归一化、持久化、公开投影、metadata/页脚和亮暗语义令牌专项测试;经典皮肤不写覆盖变量且由服务端锁定,三套初始扩展主题可编辑或删除。
|
||
- [x] 主题库支持从经典或当前主题完整复制、改名、新建、编辑、删除、启用和统一保存;每套包含浅/深各 50 项颜色与 17 项控件参数,公开接口只投影当前主题。
|
||
- [x] 危险删除、系统警告、错误/成功/信息状态与全站 Ant Switch 已统一消费主题语义色;开关有可编辑的开/关轨道、悬停和滑块色,并以边界与外环增强开启态辨识。主题卡按频次显示全部去重色,取色器只由色块直接触发。
|
||
- [x] 生产站 `/register` 与 `/forgot-password` 在 1440×900、1280×800、430×932、390×844 下无横向溢出,页面标题、SEO 描述、Open Graph 和版权均使用当前自定义站点名,正文无内置品牌残留。
|
||
- [ ] 使用管理员账号依次保存品牌名、英文品牌标识、登录页标题/说明、浅色 PNG/WebP Logo、可选深色 Logo、外框开关、MP4/WebM 视频与封面,确认工作台和登录页立即更新,刷新后保持一致。
|
||
- [ ] 在已登录管理后台从经典主题复制一套自定义主题,修改名称、浅色/深色、按钮 hover/active/focus、输入框、开关开/关轨道与滑块、选中卡、警告/危险色、图标、圆角、阴影和动效;保存刷新后确认保持,再删除测试主题并恢复运营方实际选择。
|
||
- [ ] 在浅色/深色下检查后台、创作页、插件页和设置页的开关开启/关闭状态,确认颜色、滑块、边界与外环均清晰;检查删除主题、普通危险按钮、确认弹窗、warning/error message 和状态徽标均随主题色变化且文字对比可读。
|
||
- [ ] 保存 SEO 标题/描述/关键词、版权与ICP备案开关,确认 metadata 和公共页脚刷新后同步;备案链接只指向 `https://beian.miit.gov.cn/`。
|
||
- [ ] 分别只上传浅色 Logo、只上传深色 Logo、同时上传两套 Logo,并切换浅色/深色主题,确认单图自动复用、双图按主题选择;开启“禁用 Logo 后面的圆角矩形外框”后确认工作台和管理后台导航只显示等比放大到原外框可用区域的 Logo,布局不跳动。
|
||
- [ ] 在“对象存储”中点击“使用品牌标识”,确认只更新当前路径前缀草稿;未点击或未保存时保留服务端已有前缀,历史资源读取不受影响。
|
||
- [ ] 保存一套自定义品牌后点击“恢复影策默认”,确认品牌名称、英文标识、Logo、登录页文案和媒体立即恢复内置值,自定义素材文件仍保留在存储资源中。
|
||
- [ ] 清空浏览器缓存并以慢速网络打开 `/login`、`/register` 和 `/forgot-password`,确认加载阶段不出现内置品牌名、Logo、favicon 或视频封面闪烁。
|
||
- [ ] 更换品牌视频但不上传封面,确认首帧出现前只显示中性深色背景;再配置封面,确认只显示当前自定义封面。
|
||
- [ ] 在存储资源页尝试删除当前浅色 Logo、深色 Logo、视频和封面,确认显示“外观”引用并保留文件;解除绑定后可正常删除。
|
||
- [ ] 将公开配置接口模拟为超时或 5xx,确认 4 秒内结束等待并完整回退内置外观,应用仍可进入。
|
||
|
||
## 画布导入同步、素材回收站与历史
|
||
|
||
- [x] 画布压缩包导入会先校验媒体完整性,并统一通过远端同步入口上传资源;失败时保持脏状态和自动重试,不再把浏览器本地 storage key 误报为已同步。
|
||
- [x] 素材回收站使用独立归档状态;彻底删除复用服务端引用校验与资源删除 Outbox,自动过期清理不会旁路业务引用。
|
||
- [x] 已删除画布历史改为按用户 scope 存入 IndexedDB;删除失败不记录历史,共享素材不会因删除单个画布被错误归档。
|
||
- [ ] 使用两个账号分别删除画布并切换登录,确认历史记录和回收站素材不串账号;刷新后记录仍在,清理历史只影响当前账号。
|
||
- [ ] 删除仍被其他画布或项目引用的回收站素材,确认服务端拒绝并显示引用来源;解除引用后彻底删除,确认资源记录进入 Outbox 并最终清理物理对象。
|
||
- [ ] 导入包含图片、视频、音频的真实画布压缩包,分别模拟上传中断和服务端保存失败,确认进度遮罩最终关闭、页面可离开且恢复网络后自动重试。
|
||
|
||
## 邮箱找回密码
|
||
|
||
- [ ] 后端专项测试验证验证码用途隔离、错误和过期验证码拒绝、单次消费、bcrypt 密码更新,以及重置事务撤销全部旧登录会话。
|
||
- [x] 前端专项测试和生产构建验证登录页入口、独立找回路由、验证码倒计时、新密码表单及账户邮件设置文案。
|
||
- [ ] 使用真实 SMTP 账号发送一次注册验证码和一次密码重置验证码,确认发件身份、正文、投递结果和 10 分钟有效期符合配置。
|
||
- [ ] 在桌面、窄屏和键盘操作下确认“忘记密码?”与密码标签同行右对齐,找回页没有横向溢出,焦点顺序和提示信息清晰。
|
||
- [ ] 使用两个浏览器会话登录同一账号后重置密码,确认两个旧会话都失效,旧密码无法登录且新密码可登录。
|
||
- [ ] 分别使用未知邮箱、禁用账号和 Linux.do-only 账号请求验证码,确认公开响应不泄露账号是否存在或是否可找回。
|
||
|
||
## 服务升级运行基础
|
||
|
||
- 完整架构、状态机、Release 清单、备份和回退边界见 `docs/design/dynamic-update.md`。
|
||
- [x] 后端新增权威 BuildInfo、`schema_migrations`、独立 `migrate-schema` 命令、分层健康检查以及可停止 Worker;专项 Go 测试通过。
|
||
- [x] 生产 Compose 在 Backend 前运行一次性迁移服务,并使用 `CANVAS_AUTO_MIGRATE=false` 阻止业务进程隐式修改 Schema;Backend 收到 SIGTERM 后进入 drain、停止领取任务并等待活动任务。
|
||
- [ ] 使用 PostgreSQL 部署执行一次无迁移启动和一次跨版本迁移,确认 migrate 成功后 Backend 才启动,checksum 漂移和高版本 Schema 均会阻止旧 Backend 就绪。
|
||
- [ ] 在存在图片、视频和文本长任务时发送 SIGTERM,确认 readiness 立即返回 503、新任务被拒绝、已领取任务在宽限期内完成,超时后租约可由重启实例恢复。
|
||
- [ ] 构建带版本参数的前后端镜像,确认 `/api/system/version`、管理后台版本、OCI Commit 和 Release Tag 一致。
|
||
|
||
## 画布视频静态首帧
|
||
|
||
- [x] 普通上传与生成视频会在入库时串行截取并持久化 400px JPEG 首帧;历史视频仅在可见、未选中且浏览器空闲时单并发补图,选中媒体或离开视口会取消后台解码。
|
||
- [x] 未选中视频只挂载静态图片,单选后才创建真实播放器;专项测试、TypeScript 检查、生产构建通过,本地画布刷新后 3 个历史视频首帧仍可显示。
|
||
- [ ] 用户在包含本地上传、模型生成和外部无 CORS 视频的真实画布中确认首帧画面、刷新持久化与降级图标;连续平移、缩放和切换视频时确认最多只有一个播放器且没有明显闪烁。
|
||
|
||
## 自由空白画布与画布外观
|
||
|
||
- [x] 线网格与点阵改为屏幕坐标下的固定间距背景,移除缩放时的密度、点大小和偏移更新;节点与连线仍按原视口平移缩放,网格颜色和透明度不变。
|
||
- [x] 固定背景新增渲染与实时视口回归测试,覆盖缩放范围、原点阵阈值、正负平移及空白模式;相关测试分组运行共 49 项通过,前端生产构建通过(保留既有分包警告)。
|
||
- [ ] 在浅色、深色及自定义主题下连续滚轮缩放、触控板捏合与拖动画布,确认背景无密度跳变或闪烁;切换空白/线网格/点阵后复验,确认节点与连线位置正常。
|
||
- [x] 新建画布引导新增“自由空白画布”主入口;进入后显示中央空白起始框和加号,不创建占位节点。
|
||
- [x] 中央加号复用底部工具栏的添加命令,当前浏览器已确认文本、绘图、分镜、背板、文件夹、图片、视频、导演台、音频、工作流、上传文件和素材库入口完整显示。
|
||
- [x] 自由起点按画布持久化,当前浏览器刷新后仍停留在自由空白起始框;浅色、深色两种主题已完成常规桌面尺寸验收。
|
||
- [x] 浅色画布固定为 `#EDEEEE`,深色画布固定为中性灰 `#262626`;原项目的节点、起始框、工具浮层、边框和阴影颜色保持不变。
|
||
- [x] 画布外观增加“自定义”主题,可调整背景颜色、背景明亮度、网格颜色和网格强度;不开放节点、工具浮层、边框和阴影任意改色。
|
||
- [x] 自定义主题增加“浅色界面/深色界面”,复用原项目对应的节点和工具浮层样式;切换界面样式不覆盖自定义画布和网格颜色。
|
||
- [x] 原“网格透明度”改名为“网格强度”,保持 `0%` 最淡、`100%` 最明显。
|
||
- [x] 颜色选择器与合法的 `#RRGGBB` 输入实时写入当前画布;点击面板外只关闭面板,不撤销刚才的颜色。
|
||
- [x] HEX 输入支持三位/六位、可带或不带 `#`;输入编辑不会被父级状态覆盖,选择新背景色时明亮度归零以精确显示输入色。
|
||
- [x] 删除背景透明度控件并忽略旧存储字段;背景明亮度改为沿 OKLCH 亮度轴调整,`0%` 精确保留输入色码。
|
||
- [x] 自定义主题继承进入前的浅色或深色基础界面;同一基础主题可以恢复上次自定义配置,跨深浅主题则重新继承。
|
||
- [x] 第一次进入或重置自定义主题时,明亮度默认为 `0%`、网格颜色默认为 `#B6B3B3`、网格强度默认为 `70%`;已有用户保存值不被覆盖。
|
||
- [x] 当前画布外观随画布项目保存;“保存为默认”写入当前浏览器并按账号 scope 隔离,不跨设备同步。
|
||
- [x] 深色点阵和线稿网格同步调整为 `rgba(205,205,205,0.28)`,浅色网格与网格图层渲染透明度保持既有值,并有专项回归断言。
|
||
- [x] 自由空白画布与外观专项自动化测试通过,前端生产构建通过。
|
||
- [ ] 在用户当前登录的 Edge 中验收颜色选择器、十六进制输入、明亮度调节、深浅主题继承和本机账号默认值。
|
||
- [ ] 在窄屏和触屏尺寸检查三张起始卡、中央起始框、加号菜单的换行、滚动与点击目标;确认菜单不遮挡底部工具栏。
|
||
- [ ] 由产品验收浅色/深色固定底色,以及原节点和工具浮层恢复后的最终视觉观感。
|
||
- [ ] 从自由起点分别新建每种内置节点和插件节点,并从上传、素材库各导入一次素材,确认第一个节点创建后起始框消失且刷新后节点数据不丢失。
|
||
|
||
## 画布拖线创建节点落点
|
||
|
||
- [x] 从普通节点连接端拖到空白处创建节点时,松手点改为新节点靠近来源一侧的边缘中点;单击快捷创建和批量连接仍保留原布局。位置计算与批量连接专项测试、TypeScript 检查和前端生产构建通过。
|
||
- [ ] 分别从节点右侧输出端和左侧输入端拖线创建图片、视频、文本与音频节点,确认新节点向松手点外侧展开,连线落在边缘中点且不会回头遮挡拖线区域。
|
||
- [ ] 单击连接加号创建节点,确认仍自动放在相邻位置并保留 96px 间距;使用批量连接创建节点,确认原有落点和连接关系不变。
|
||
|
||
## 素材库网格密度
|
||
|
||
- [x] 素材库桌面端缩小卡片并改为每行 6 张;新增素材占首格,默认每页 35 项,可切换 70/105 项,首屏正好组成 6×6 完整网格;中窄屏按 4/3/1 列收敛,前端生产构建通过。
|
||
- [ ] 在 1280px、1440px、1920px 与窄屏下检查图片、视频、音频、文本、模型和新增素材卡片,确认标题、徽标、批量选择和操作菜单不拥挤或溢出。
|
||
|
||
## 短剧长篇项目分页读取
|
||
|
||
- [x] 短剧工作台已拆分项目核心、制作概览、章节摘要、当前章节生产包、画布分页、资产分页和候选分页接口;章节列表不返回正文,当前章节生产包不返回其他章节镜头和产物。
|
||
- [x] 资产库按目录/分类分页,候选角色单独分页;分镜工作台资产栏服务端分页,当前章节响应只携带镜头已绑定资产;项目设置仅在打开主图选择器时读取图片资产。
|
||
- [x] 新增章节、镜头、章节产物、画布、项目目录资产、候选资产和项目任务组合索引;后端聚合/隔离/分页专项测试与前端生产构建通过。
|
||
- [ ] 导入至少 1000 章、每章 10 个镜头的测试项目,分别打开概览、章节、分镜、画布、资产和设置页,确认首屏请求不再出现整项目详情响应,切章只读取目标章节生产包。
|
||
- [ ] 在浏览器网络面板记录上述页面的响应体积、请求耗时和内存占用;连续切换 30 个章节、翻阅 10 页画布和资产,确认 React Query 缓存及 DOM 数量没有持续异常增长。
|
||
- [ ] 在资产超过 80 项、角色候选超过 24 项、画布超过 40 张时验证分页、分类、目录、候选确认、镜头资产绑定和主图选择;确认新增、移动、删除、确认后总数与当前页自动刷新。
|
||
- [ ] 使用 SQLite 与 PostgreSQL 各执行一次大项目冒烟,确认新增组合索引成功创建,概览聚合、章节隔离和分页顺序一致。
|
||
|
||
## 多文件技能包库
|
||
|
||
- [x] 后端新增技能版本与文件索引,支持单个 Markdown、ZIP 和公开 GitHub 仓库安装;ZIP 路径越界、软链接、重复路径、文件数、单文件大小和总解压大小均在写入前校验,后端全量测试通过。
|
||
- [x] 技能详情改为约 82vw × 82vh 的弹窗,左侧支持多层文件树,右侧支持 Markdown 预览、源码、代码/文本及媒体文件查看;前端生产构建通过。
|
||
- [x] 在线 Agent 只在系统上下文保留技能元数据,并通过入口、文件清单、单文件读取和搜索工具渐进式加载;本机 Agent 只把用户本轮显式提及的完整技能包写入临时目录,321 项 Agent 测试与 TypeScript 构建通过。
|
||
- [x] 新增统一 Skill Runtime:画布、创作页和短剧工作台共用同一技能选择、引用解析、版本/文件来源记录与上下文预算;普通生成只加载 `SKILL.md` 和入口直接引用的相关文本,在线 Agent 使用渐进工具,本机 Agent 使用原生完整包,专项测试与前端类型检查通过。
|
||
- [ ] 分别安装无 Frontmatter 的单个 Markdown、两个用户提供的示例 ZIP,确认名称/简介推断、文件树层级、中文路径、预览/源码切换和相对 Markdown 链接正确。
|
||
- [ ] 使用公开 GitHub 仓库的默认分支、指定分支和子目录安装技能,修改仓库后手动同步并等待一次后台检查,确认 commit、版本、检查时间、同步时间和失败信息准确。
|
||
- [ ] 在浅色、深色、常规桌面、窄屏下检查大弹窗尺寸、双栏滚动、文件筛选、长路径、省略文本、键盘焦点和媒体预览;确认弹窗不会触发画布缩放或快捷键。
|
||
- [ ] 在线 Agent 使用示例技能完成一次任务,确认先读 `SKILL.md`,仅在入口引用时读取对应 reference;本机 Agent 确认 scripts/assets 保持目录结构、turn 完成后临时目录被清理,且聊天历史不出现完整技能正文。
|
||
- [ ] 分别在画布图片/视频/文本生成、创作页文本/图片/视频、短剧分镜图/动作预演/镜头视频中选择示例技能,确认任务只记录本轮技能版本和实际读取文件,不重复注入历史消息,也不加载 `scripts/`、`assets/` 或整个技能包。
|
||
- [x] 画布、创作页和 Agent 共用的 `@` 引用菜单改为真实光标定位,输入框或页面滚动、尺寸变化时同步更新;向上弹出按实际内容高度贴边。技能候选改为工作流图标、名称、说明、版本和文件数的统一信息行,专项测试和前端生产构建通过。
|
||
- [ ] 登录后分别在高输入框首行、末行、滚动后的中间行输入 `@`,确认菜单与光标保持约 8px 间距;在浅色/深色及窄屏下确认技能说明、版本、文件数和键盘选中态清晰可读。
|
||
|
||
## 短剧分镜工作流 v2
|
||
|
||
- [x] 章节角色提取增加候选名称幂等:重复待确认角色、已经确认角色和别名不会再次创建;Agent 来源不能创建角色候选。数据库 schema v3 为候选增加 `name_key` / `source` 并建立待确认唯一索引,后端专项测试通过。
|
||
- [x] 资产分类统一为角色、场景、道具、素材、其他;旧服饰/武器/配饰映射为道具,旧画风和通用媒体映射为素材。项目资产页、画布资产菜单、素材选择器和 Agent 合同已同步,前端生产构建与专项测试通过。
|
||
- [x] 分镜工作台左栏调整为“章节 → 镜头 → 资产”并默认打开章节;项目资产页和分镜资产栏新增防抖名称搜索;镜头默认编号统一为“镜头01”,仅精确匹配旧 `SC.数字` 的默认标题会转换,自定义标题保持不变。
|
||
- [x] 后端新增镜头版本、镜头产物和生产任务上下文;分镜修改与资产版本变更会局部将旧产物标记为 `stale`,专项测试通过。
|
||
- [x] 短剧工作流调整为“剧情与章节 → 资产拆分 → 分镜脚本 → 黑白动作预演 → 视频生成 → 交付与打包”,旧 v1 实例保留,新章节使用 v2。
|
||
- [x] 项目工作台新增独立分镜工作流路由,支持初始化章节流程、新增镜头、保存分镜版本、绑定资产版本、查看预演/视频版本和交付缺失状态;前端生产构建通过。
|
||
- [x] 镜头轨道按当前制作阶段显示待生成、生成中、已生成和生成失败状态,状态标签固定在卡片右下角;横向镜头只在轨道内部滚动,不再撑宽脚本区或挤出产物预览。制作概览六个流程节点改为独立可点击卡片;前端类型检查、生产构建与相关专项测试通过。
|
||
- [x] 分镜生成设置接入统一模型选择、能力和计价链路,支持前台模型、系统模型与用户自定义模型;切换模型会归一画幅、分辨率/画质和时长,MiniMax-H3 的旧 `720` 会切换为 `768P`。项目设置可保存默认生图/视频模型;后端全量测试、MiniMax 回归测试和前端生产构建通过。
|
||
- [x] 单镜生成改为任务提交后立即返回,不同镜头可并行进入排队/生成状态;角色卡主图、绑定声音样本和场景资产会按 `图片N` / `音频N` 编译进提示词。MiniMax 项目资产使用 `reference_image` / `reference_audio`,仅显式首尾帧节点使用帧角色;产物固定绑定任务提交时的镜头版本。前后端全量测试与生产构建通过。
|
||
- [x] 视频图片语义统一为首帧、尾帧和普通参考图三类,并贯穿前端直连、后端任务与声明式协议;Agnes、Seedance `/videos`、火山方舟、NewAPI 媒体任务、xAI 和 MiniMax 不再按图片数量误猜项目角色资产。Gemini Veo、Novita 等仅支持起始图的协议会明确拒绝 `reference_to_video`,不再静默降级成首帧。
|
||
- [ ] 在真实项目中初始化一个已有章节,确认不会误用旧 v1 工作流,刷新和切换章节后阶段、镜头和当前版本保持一致。
|
||
- [ ] 在同一章节准备待生成、生成中、已生成和生成失败镜头,确认灰、蓝、绿、红标签始终显示在卡片右下角;增加到几十个镜头后确认只有底部轨道横向滚动,中间脚本和右侧产物预览仍完整可见。
|
||
- [ ] 在浅色、深色、常规桌面和窄屏下检查制作概览六张流程卡片的边界、间距、完成态、悬停和键盘焦点,确认跳转目标正确。
|
||
- [ ] 连续保存同一镜头多个版本并绑定不同资产版本,确认只有该镜头的动作预演和视频转为过期,其他镜头不受影响。
|
||
- [ ] 使用画布任务和项目任务分别登记镜头产物,确认 `production_task_links` 正确记录 Project、Canvas、Unit、Shot 和 WorkflowStep,且账号归属校验有效。
|
||
- [ ] 在浅色、深色、窄屏和常规桌面验证阶段导航、镜头列表、表单、检查器、媒体预览和长章节内容滚动。
|
||
- [ ] 在角色与资产页分别搜索已确认资产和待确认角色,再切换分类、目录和分页;确认关键词重置到第一页、空态明确且没有重复请求抖动。进入分镜工作台确认左栏顺序、默认章节页和资产搜索一致。
|
||
- [ ] 打开包含旧 `SC.01` 默认标题和用户自定义标题的项目,确认前者显示为“镜头01”且编号旁不重复,后者原样保留;新增镜头和章节生成镜头都直接使用中文编号。
|
||
- [ ] 在项目设置分别选择系统、用户自定义的默认生图/视频模型,刷新后进入分镜图、动作预演和镜头视频,确认项目默认优先、已下架模型回退全局默认;切换 Seedance、MiniMax-H3 等能力不同的模型时,画幅、时长、分辨率和本次预计积分立即更新,并与实际账单一致。
|
||
- [ ] 连续选择两个镜头并分别提交视频生成,确认两个镜头独立显示“正在提交/生成中”,第二个任务不会被第一个全局锁阻止;刷新页面后两个任务状态都能恢复,完成产物分别绑定各自提交时的镜头版本。
|
||
- [ ] 给镜头绑定带主图和声音样本的角色卡及场景资产,使用 MiniMax-H3 生成并检查请求日志:文本包含 `【资产参考】`、角色声音说明和台词,角色/场景图片为 `reference_image`、声音为 `reference_audio`,请求不再出现误判的 `first_frame`,画幅和 `768P` / `2K` 与界面选择一致。
|
||
- [ ] 使用同一镜头资产依次切换 Agnes 2.5、Seedance `/videos`、火山方舟、NewAPI 媒体任务和 xAI,确认单张角色图仍走 reference 字段;再切换 Gemini Veo、Novita,确认提交前给出“不支持 reference_to_video”的明确提示,而不是把角色图当起始帧生成。
|
||
- [ ] 当前“资产拆分 AI、多宫格生成提交、批量视频任务、后端交付包”仍是后续阶段,界面不得显示为已完成或可用。
|
||
|
||
## 角色声音素材绑定
|
||
|
||
- [x] 角色卡声音绑定移除无效的预设声音下拉框,改为从素材库选择或实时上传声音样本;支持 MP3、WAV、M4A/AAC、FLAC、OGG/Opus 和 WebM 音频。前后端共同校验资源归属、完成状态、资源类型和格式白名单,画布生成引用会保留资源真实 MIME 与文件扩展名。
|
||
- [ ] 在角色卡分别选择素材库已有音频并上传 MP3、WAV、M4A/AAC、FLAC、OGG/Opus、WebM 样本,确认选择器格式标签、浏览器试听、绑定、版本历史和刷新后的声音状态一致;再验证不支持格式、伪装扩展名、视频 WebM、未完成资源和其他账号资源均被拒绝。
|
||
- [ ] 使用绑定了不同格式声音样本的角色执行画布生成,确认请求中的参考音频使用资源真实 MIME 和对应文件扩展名,不再统一伪装成 MP3;生成成功、失败及刷新恢复后引用关系不丢失。
|
||
|
||
## 短剧章节后台生成与项目头部
|
||
|
||
- [x] “提取角色”和“生成到分镜制作”继续使用后端任务中心,确认配置后立即关闭弹窗;章节按钮按任务真实开始时间每秒显示“已运行 X分钟XX秒”,任务完成后恢复可点击并显示“已生成”。刷新页面后会按章节从任务中心恢复运行计时和完成态,并接管尚未写回的角色或分镜结果。
|
||
- [x] 项目名称、状态、六个项目导航、章节选择和新建画布操作已注册到全局公用头部,项目内容区不再重复占用一整行头部;相关专项测试、TypeScript 检查与前端生产构建通过。
|
||
- [ ] 在真实慢任务中分别启动角色提取和章节分镜,确认弹窗立即关闭、按钮计时连续增长、可编辑正文和切换章节,完成后按钮显示“已生成”且仍可再次运行。
|
||
- [ ] 在任务运行中和任务刚完成尚未写回结果时分别刷新项目,确认对应章节继续显示累计计时或“已生成”,成功结果会自动写回;再检查无新角色、生成失败和重新生成替换确认场景的按钮恢复、错误提示和旧分镜保护。
|
||
- [ ] 在浅色、深色、常规桌面和窄屏下检查全局头部:项目名、状态、项目导航、右侧全局操作和新建画布/章节选择不重叠,导航可横向滚动,内容区高度确实增加。
|
||
|
||
## 画布生成副本与结果落点
|
||
|
||
- [x] 图片、视频节点右键菜单新增“创建生成副本”:副本保留提示词、模型参数、首尾帧设置和原有参考入边,但不加入原节点的参数版本族。
|
||
- [x] 图片与视频生成统一使用结构化结果落点;生成副本、复制粘贴节点和参数变体直接回填当前节点,普通已有媒体再次生成继续创建新版本,不再依赖节点标题判断。
|
||
- [x] 参考入边复用、图片/视频原地生成策略专项测试、TypeScript 检查与前端生产构建通过。
|
||
- [ ] 分别对带一张、多张参考图及首尾帧设置的图片和视频使用“创建生成副本”,确认副本提示词、模型参数、参考缩略图和连线与原节点一致;连续生成多次时只更新副本自身,不新增下一级节点。
|
||
- [ ] 对普通已有图片、普通已有视频、参数变体和旧版复制节点分别生成,确认普通媒体创建并行版本,参数变体和复制节点原地更新;刷新画布后结果落点不改变。
|
||
|
||
## 画布生成结果命名
|
||
|
||
- [x] 快捷键复制节点生成图片后保留 `_copyN`,参数变体生成图片后保留 `A/B/C/D` 版本标识;批量输出追加结果序号。
|
||
- [x] 下载文件名继续使用节点标题,因此复制、参数变体和同批多图结果不会再生成相同文件名。
|
||
- [ ] 分别使用快捷键复制和“创建参数变体”生成图片,确认生成中、生成完成和刷新画布后标题标识不丢失。
|
||
- [ ] 下载原图、复制结果、多个参数变体和同批多图结果,确认浏览器不会再提示同名文件覆盖。
|
||
|
||
## 画布生成进度与全屏视频控件
|
||
|
||
- [x] 移除图片、视频任务进入模型调用时统一写入的假 35%;排队、后端接管和连接上游阶段只显示真实阶段文案,不再显示伪造百分比。
|
||
- [x] 后端从图片、视频上游成功的创建与轮询响应中识别 `progress`、`percent`、`percentage`、`completion` 及常见百分比变体,支持数字、百分数字符串和 0~1 小数;进度单调写回任务,前端既有 2 秒轮询会同步到画布节点。
|
||
- [x] 画布视频节点保留紧凑控件;进入全屏后恢复完整顶部控制组,底部按钮调整为 52px 操作目标,同时放大图标、时间文字、进度轨道和拖动滑块。
|
||
- [ ] 分别使用会返回整数百分比、小数进度、百分数字符串和不返回进度的图片/视频渠道生成,确认前三者按上游实时增长,不返回进度的渠道仅显示阶段文案且不会卡在固定百分比;刷新页面后继续从后端任务恢复最新进度。
|
||
- [ ] 在桌面、窄屏和触屏设备全屏播放横版、竖版视频,确认播放/暂停、音量、时间、画中画、设置、全屏退出和进度拖动尺寸清晰且不会遮挡字幕。
|
||
|
||
## 视频画面与片段提取
|
||
|
||
- [x] 视频节点“尾帧截取”已合并为“提取画面”,支持首帧、当前帧、尾帧和最多 30 个自选时间点;批量结果保留来源节点与时间点元数据。
|
||
- [x] “截取重生成”已调整为“截取片段”,默认只创建片段素材;可选同时创建待生成节点,但不会自动提交生成任务。
|
||
- [x] 多张提取图片会保持全部选中,可继续使用画布现有批量连接能力自行创建并连接生成节点。
|
||
- [ ] 在真实视频节点提取首帧、多个中间帧和尾帧,确认画面、时间标记、网格布局、来源连线和多选状态正确。
|
||
- [ ] 选择接近重复的时间点、超过 30 个时间点及部分帧解码失败场景,确认去重、上限提示和部分成功反馈正确。
|
||
- [ ] 分别验证“只创建视频片段”和“同时创建待生成节点”,确认前者不要求模型,后者创建后不会自动扣费或启动任务。
|
||
- [ ] 选中多张提取图片后新建视频生成节点,确认批量连线和手动生成流程可用。
|
||
|
||
## 画布节点搜索
|
||
|
||
- [x] 搜索结果改为紧凑媒体行,图片、视频、绘图优先显示真实缩略图,文本节点显示内容片段;素材类型、尺寸、时长、文件大小和模型按可用信息摘要展示。
|
||
- [x] 节点新增可持久化创建时间与最后编辑时间;旧画布按项目时间建立迁移基线,素材 URL/尺寸后台恢复不会误记为用户编辑。
|
||
- [x] 默认按最近编辑排序,支持节点、章节、镜头、模型和标签搜索,以及方向键选择、Enter 定位、Esc 关闭。
|
||
- [ ] 在含图片、视频、音频、绘图、文本、分镜和插件节点的真实画布验证缩略图、摘要、时间和排序;确认失效媒体能降级为类型图标。
|
||
- [ ] 在窄屏、常规桌面、浅色和深色主题验证行密度、长标题截断、时间列布局、滚动与键盘焦点。
|
||
|
||
## 画布素材批量插入与右键菜单动效
|
||
|
||
- [x] 画布素材库复用既有多选能力,一次确认后按三列网格批量创建节点并选中全部新增节点;本地素材与插件来源共用同一 payload 转换路径。
|
||
- [x] 时间线素材入口继续保持单选,图片和文本不会被误当作可直接入轨媒体。
|
||
- [x] 右键主菜单、添加节点子菜单、菜单项、图标与箭头已移除位移和缩放动画,只保留淡入、颜色变化与 Spotlight 光影跟随;专项测试、TypeScript 检查与生产构建通过。
|
||
- [ ] 在画布空白处右键后缓慢移动光标经过各菜单项,确认菜单、文字、图标和箭头位置稳定,光影仍跟随光标,主菜单与子菜单打开时不跳动。
|
||
- [ ] 从画布工具栏和右键菜单分别打开素材库,混选图片、视频、音频、文本及插件来源素材,确认一次插入全部节点、顺序稳定、节点不重叠且全部保持选中。
|
||
- [ ] 从时间线打开素材库,确认仍只能单选;音视频可直接入轨,图片或文本会保留弹窗并显示明确错误。
|
||
|
||
## 画布本机 Agent 连接教程
|
||
|
||
- [x] 未连接、连接中和连接失败时,Agent 对话正文由连接教程替代;连接成功后自动恢复原聊天或历史区域,不清空消息和线程状态。
|
||
- [x] 教程按 macOS/Linux 与 Windows 生成安装、构建和启动命令,并将当前网页 Origin 写入 `FRAMEFIELD_TRUSTED_WEB_ORIGINS`;命令生成专项测试、前端类型检查与生产构建通过。
|
||
- [x] 页面明确区分网页侧边栏 Codex、外部 Codex/Claude Code MCP 与尚未验证的 Hermes/WorkBuddy,不再把 Codex 插件误写成本机侧边栏前置条件。
|
||
- [x] 画布全局 `Cmd/Ctrl+C` 在存在真实文字选区时交还浏览器处理,不再把 Agent 消息、日志或 Markdown 文本复制误判成节点复制;快捷键边界专项测试通过。
|
||
- [ ] 在 Windows、macOS 和 Linux 分别复制并执行教程命令,确认 Runtime 能连接当前线上 Origin,平台自动识别和手动切换均正确。
|
||
- [ ] 在未连接、自动重试、Origin 未授权、连接成功和运行中断后重连状态下验证教程与对话区域切换;确认原消息、历史会话和待确认工具调用不丢失。
|
||
- [ ] 在 360px 窄面板、常规宽度、浅色和深色主题下确认命令块可横向滚动、复制按钮可见、教程不遮挡画布。
|
||
- [ ] 在 Agent 回复、运行日志、代码块和普通 Markdown 中分别框选文字后使用右键复制及 `Cmd/Ctrl+C`,确认系统剪贴板内容正确;无文字选区时 `Cmd/Ctrl+C` 仍复制所选画布节点。
|
||
|
||
## 画布复制粘贴命名
|
||
|
||
- [x] 节点首次复制粘贴使用“原名称_copy1”,后续按当前画布已有最大序号递增。
|
||
- [x] 复制已有 `_copyN` 副本时回到原始名称计算,避免生成 `_copy1_copy1`;旧版空格 `Copy` 后缀已有兼容测试。
|
||
- [ ] 在画布中连续粘贴单个节点、多个同名节点和包含子节点的背板,确认名称依次递增且节点关系不变。
|
||
|
||
## 画布媒体下载文件名
|
||
|
||
- [x] 图片、视频和音频下载统一使用“画布名_节点名_yyyyMMdd.扩展名”,中文名称和跨平台非法字符已有专项测试覆盖。
|
||
- [x] 扩展名优先按媒体 MIME 类型判断,并兼容远程 URL 后缀;JPEG、WebM 和 MOV 已有专项测试覆盖。
|
||
- [x] 前端 TypeScript 检查与生产构建通过。
|
||
- [ ] 在浏览器中分别下载本地上传、生成结果、LibTV 导入和 TapNow 导入的图片与视频,确认文件名、日期和实际媒体格式一致。
|
||
- [ ] 在同一天重复下载同名节点,确认浏览器的重名处理不会覆盖用户已有文件。
|
||
|
||
## 创作输入区参考内容管理
|
||
|
||
- [x] 自动化覆盖首个、中间和末尾参考内容按稳定 ID 独立删除,且删除后其余顺序保持不变。
|
||
- [x] 折叠态提供明确的“查看全部”入口,展开态提供图片、视频、音频、文件筛选、清空全部和收起入口。
|
||
- [x] 在桌面浏览器验证上方“参考内容”打开素材选择、折叠堆叠态中间卡片删除、展开态任意卡片删除、筛选、拖动排序和收起。
|
||
- [ ] 在真实登录数据下验证“清空全部素材”同步移除全部附件引用,不影响技能引用和素材库原始文件。
|
||
- [ ] 在触屏及窄窗口验证删除按钮无需悬停也可见,素材轨道可横向浏览且不会遮挡提示词和底部控制区。
|
||
- [ ] 在创作首页选择图片或视频生成并修改画幅、质量、时长或生成数量后切换到其他工作区再返回,确认上次的创作类型和各自参数仍保留;切换到不支持某个已保存参数的模型时,确认该参数仅回退为当前模型默认值;生成结果点击“添加到画布”后确认仍能按现有交接流程进入画布。
|
||
|
||
## 首页生成图片预览交互
|
||
|
||
- [x] 首页图片预览改为与画布共用 `CanvasImagePreview`,移除首页独立的 `scale/offset` 和拖拽边界计算;前端 TypeScript 检查与生产构建通过。
|
||
- [ ] 在首页生成结果、参考图片、故事板图片和画布图片节点中分别打开预览,确认遮罩、移动、滚轮缩放、缩放范围、关闭和再次打开后的初始状态一致;本次尚未完成真实浏览器交互验收。
|
||
- [ ] 在首页提示词输入框中分别粘贴截图、从网页复制的图片和带文字的剪贴板内容,确认图片自动加入参考内容、普通文字仍能正常粘贴,超出当前模型参考数量上限时提示明确且不会重复添加。
|
||
|
||
## Agnes Video 2.5 JSON 协议
|
||
|
||
- [x] 前端专项测试确认 Agnes 创建请求使用 `application/json`,不再发送 `input_reference[]`、`resolution_name`、`preset` 或像素型 `size`。
|
||
- [x] 后端专项测试确认内置 `host:agnes-video` 插件直接进入 Agnes JSON 协议执行器,不再回退到 OpenAI 风格 multipart;旧渠道能力读取时会收紧为官方 4–12 秒和 720P/960P/2K 档位。
|
||
- [x] Agnes 插件升级到 `1.2.0`:公共层像素画幅(如 `1280x720`)只转换为 `aspect_ratio: "16:9"`,公共层分辨率(如 `720`/`720p`)只转换为 `size: "720P"`,不再把两类字段混用。
|
||
- [x] 后端专项测试确认自定义渠道和系统渠道均允许官方 `/agnesapi?video_id=...&model_name=...` 轮询,并将该路径转发到 Agnes 主机根路径。
|
||
- [x] Agnes 完成态兼容 2.5 的 `metadata.url` 与 V2.0 的顶层 `url`;前端 provider 和后端协议专项测试均已覆盖。
|
||
- [ ] 使用真实 Agnes API Key 分别验证文生视频、单张首帧、三张图片 reference、视频/音频 reference;确认 `metadata.url` 可播放并且失败信息可见。
|
||
- [ ] 使用 Agnes Video V2.0 完成一次真实任务,确认顶层 `url` 能进入视频资源保存流程,不再报“没有 metadata.url”。
|
||
- [ ] 在系统渠道中验证 4 秒与 12 秒边界、720P/960P/2K、横竖画幅,以及 2.5 Flash 的 720P/最多 5 图/不支持视频限制。
|
||
|
||
## 画布生成按钮价格
|
||
|
||
- [x] 系统渠道价格按当前 operation、分辨率、时长、图片数量、质量和画幅匹配价格档,并按图片数量或视频秒数计算本次积分;逻辑前台模型继续使用后端报价。
|
||
- [x] 画布生成按钮改为价格与圆形生成操作一体式胶囊,保留完整无障碍标签;价格匹配专项测试与前端生产构建通过。
|
||
- [ ] 在画布中分别选择按次图片模型、按秒视频模型和前台逻辑模型,确认修改数量、时长、分辨率和参考素材后价格立即更新且与实际账单一致。
|
||
- [ ] 在浅色/深色主题及生成中、禁用状态下确认胶囊价格可读、圆形操作区清晰且不挤压模型与参数控件。
|
||
|
||
## 系统渠道模型批量删除
|
||
|
||
- [x] 管理员可勾选最多 100 个渠道模型并一次删除;任一模型仍被活动线路或进行中任务引用时整批拒绝,不产生部分删除。
|
||
- [x] 合并补修将兼容 `models_json` 的重建收进删除事务,并由 repository 在取得渠道写锁后读取当前启用模型;模型保存后的目录同步也复用同一锁定入口,避免并发管理员操作用事务外旧快照覆盖较新的模型目录。
|
||
- [x] 后端批量删除与引用拒绝专项测试、前端管理页回归测试和格式检查通过。
|
||
- [ ] 在 PostgreSQL 测试环境由两个管理员并发执行模型新增、启停和批量删除,确认 `channel_models` 与渠道 `models_json` 最终一致,删除失败时列表不发生部分变化。
|
||
|
||
## 系统渠道默认积分价格
|
||
|
||
- [x] 新建渠道模型默认使用“所有规格统一价格”,管理员只需填写一次积分;1K/2K/4K、画幅和生成方式差异定价收进可选的“按规格定价”。
|
||
- [x] 系统渠道直连、前台逻辑模型按渠道计价和失败切换线路均按任务实际规格匹配价格档;缺失价格档 ID 不再被误转成 `"<nil>"`。
|
||
- [x] 后端全量测试、价格表单专项测试和前端生产构建通过。
|
||
- [ ] 在 `/admin/channels` 新建图片和视频模型,仅填写统一价格后分别生成不同质量、尺寸、分辨率和时长,确认都命中默认价格。
|
||
- [ ] 在默认价格之外新增一个 2K 或指定分辨率价格,确认精确规格优先、其他规格继续使用默认价格;关闭“可供用户使用”后该档不再参与匹配。
|
||
|
||
## 系统渠道模型 Logo
|
||
|
||
- [x] 后端保存系统渠道模型 Logo,并通过脱敏模型目录下发;前端类型检查与生产构建通过。
|
||
- [ ] 在 `/admin/channels` 的模型管理中新增和编辑模型,确认 Logo 可选择、清除并在列表中立即更新。
|
||
- [ ] 关闭“前台模型”功能后刷新创作端,确认模型选择器显示系统渠道模型配置的 Logo,浅色和深色主题下均清晰可见。
|
||
|
||
## 提示词位置型资源引用与缩略图
|
||
|
||
提示词中的画布连接使用 `@图片N`、`@视频N`、`@音频N`、`@文本N` 等位置型槽位,不再把节点 ID 写入提示词;创作页附件对用户仍显示同类编号,但内部使用稳定附件身份,避免删除中间项后引用错位。以下场景仍需要在浏览器中由用户确认:
|
||
|
||
- [x] 29 项提示词引用专项测试、TypeScript 检查与生产构建通过。
|
||
- [x] 旧 `@[node:节点ID]` 仅做读取迁移;新写入、配置组装、故事板物化、Agent 建图和快捷生成均只生成位置型引用。
|
||
- [x] 图片、视频、音频、文本和角色分别独立计数;生成时按当前连线顺序解析槽位,删除连线不再删除提示词。
|
||
- [x] 只有 `storageKey` 的图片/视频引用会异步解析预览地址;生成中按钮使用节点强调色与可见旋转动画。
|
||
- [ ] 在画布中连接图片 A 并写入 `@图片1`,删除 A 的连线后连接图片 B,确认提示词不变、缩略图切换到 B、生成请求使用 B。
|
||
- [ ] 混合连接两张图片、一段音频和一段文本,确认标签依次为 `@图片1`、`@音频1`、`@图片2`、`@文本1`,调整不同类型的连线不会串号。
|
||
- [ ] 打开包含旧 `@[node:...]` 的画布节点,确认面板自动迁移成可见位置标签,保存和后续编辑不再出现节点 ID。
|
||
- [ ] 使用只有 `storageKey`、没有 `content` 的本地图片和服务端资源图片,确认顶部参考栏、行内引用和放大预览均能显示。
|
||
- [ ] 点击生成,确认按钮保持节点强调色并显示连续旋转动画,不再出现纯红色空圆。
|
||
- [ ] 在 `/create` 添加至少三张参考图,并在提示词中重复引用 `@图片2`;拖动参考内容轨道中的另一张图片覆盖行内缩略图,确认提示词文本保持不变且所有 `@图片2` 缩略图同步刷新。
|
||
- [ ] 从本机拖入图片覆盖行内缩略图,确认上传期间不能发送,上传成功后原编号保持,上传失败时旧图和旧提示词不变。
|
||
- [ ] 分别测试图片模式、视频模式和文本模式,确认只有图片引用可成为替换目标,视频、音频、文件和技能引用不会误触发。
|
||
- [ ] 替换一个已经位于参考轨道中的图片,确认附件不会重复,其他引用仍指向正确素材。
|
||
- [ ] 确认浅色/深色主题、窄窗口和同一图片多次出现时,拖入高亮与“替换”遮罩清晰且不遮挡相邻文字。
|
||
|
||
## 已有图片节点图生图引用
|
||
|
||
- [x] 已有图片节点显式使用 `@图片1` 时会把节点自身作为参考图提交;未显式引用时仍保持文生图语义。
|
||
- [x] 无法解析的 `@图片N`、`@视频N`、`@音频N` 等画布引用会在提交前报错,不再静默丢失素材。
|
||
- [x] 后端专项测试确认 OpenAI Images 图生图使用 `POST /v1/images/edits` 和 `multipart/form-data`,并携带图片文件、模型、提示词、尺寸及响应格式。
|
||
- [ ] 在线上画布打开一张已有图片,输入“将 `@图片1` 图片变清晰”并生成,确认任务日志包含参考图、请求路径为 `/v1/images/edits`、Content-Type 为 `multipart/form-data`。
|
||
- [ ] 在同一图片节点移除 `@图片1` 后再次生成,确认请求恢复为 `/v1/images/generations`,不会隐式携带旧图片。
|
||
|
||
## 画布图片与音频组合的视频模型选择
|
||
|
||
- [x] 图片或角色与音频组合时继续按 `image_to_video` 匹配,音频仅作为附加参考;纯音频仍按 `audio_to_video`,包含参考视频时仍按 `reference_to_video`。
|
||
- [x] 模型选择专项测试覆盖“支持图生视频且允许参考音频”的模型,不再错误提示“不支持全模态参考”。
|
||
- [ ] 在线上画布只连接一张图片和一段音频,确认支持图生视频与参考音频的视频模型可选择,并能正常提交生成任务。
|
||
- [ ] 分别验证纯音频、图片加音频、视频加音频三种输入,确认模型筛选和任务 operation 依次为 `audio_to_video`、`image_to_video`、`reference_to_video`。
|
||
|
||
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
|
||
|
||
## 工作区、Agent、画布复制、模型配置与创作附件修复
|
||
|
||
- [x] 前端 TypeScript 检查与生产构建通过;提示词引用、创作附件和侧栏主题专项测试通过。
|
||
- [x] 空间工作区与普通页面的左侧菜单统一使用 `--workspace-navigation`,不再随路由切换表面色。
|
||
- [x] 本机 Agent 输入框改为 Enter 换行、Cmd/Ctrl+Enter 发送;本轮模型失败会保留原请求快照并提供手动重试,不重复插入用户消息。
|
||
- [x] 文本节点展示区支持框选复制,复制文本在 Clipboard API 不可用时使用兼容回退;图片节点右键增加“复制图片”,非 PNG 图片会转为 PNG 后写入系统剪贴板。
|
||
- [x] 后台模型配置的章节标题与内容、价格档匹配条件与计费状态均改为上下结构。
|
||
- [x] 创作页附件删除按钮隔离 Reorder 拖拽事件;附件引用使用稳定 token,删除第三张不会让第四、第五张引用串位。
|
||
- [ ] 在普通列表页、创作页、空间工作区之间切换,确认左侧菜单明暗色调始终一致,折叠与移动端展开状态无闪色。
|
||
- [ ] 在本机 Agent 输入多行文本,确认 Enter 只换行、Cmd/Ctrl+Enter 和发送按钮正常提交;模拟模型中途失败后点击“重试本轮”,确认沿用原会话、文本、图片和技能且不重复用户气泡。
|
||
- [ ] 在画布文本节点中拖选部分文字并复制;分别右键 PNG、JPEG、服务端 `storageKey` 图片执行“复制图片”,确认可粘贴到系统应用。
|
||
- [ ] 在后台打开文本、图片、视频模型配置,确认所有章节为纵向阅读顺序,宽屏和窄屏都没有左右主从栏或价格档竖分隔线。
|
||
- [ ] 在创作页上传 5 张参考图,展开后依次删除第 3、5、1 张,确认每张都能就地删除,轨道不触发拖拽,提示词中的其余引用仍指向原附件。
|
||
|
||
## Agnes AI 官方视频协议
|
||
|
||
- [x] Agnes 协议已启用,覆盖 `agnes-video-v2.0`、`agnes-video-2.5`、`agnes-video-2.5-flash` 的官方创建字段、状态、失败信息和 `metadata.url` 结果解析。
|
||
- [x] 轮询使用同一 Base URL 主机的根路径 `/agnesapi`,专项测试确认 `https://apihub.agnes-ai.com/v1` 不会被拼成错误的 `/v1/agnesapi`。
|
||
- [x] Flash 的 720P、最多 5 张图片、禁止参考视频规则已在请求前强校验;协议与 provider service 专项测试通过。
|
||
- [ ] 使用真实 Agnes API Key 分别完成 V2.0 文生视频、单图生视频、2.5 关键帧、2.5 reference、2.5 Flash 的创建与轮询冒烟。
|
||
- [ ] 验证真实失败任务能显示官方 `error.message`,429/5xx 保持现有上游错误语义,生成成功后视频能进入影策资源保存流程。
|
||
|
||
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
|
||
|
||
## 插件分层管理
|
||
|
||
- [ ] 管理员在 `/admin/plugins` 停用官方应用插件后,普通用户的有效状态和新请求同时被阻止;重新开放后保留原个人启用选择。
|
||
- [ ] 两个普通用户分别启用和停用同一官方应用插件,确认状态、Eagle 配置和工作流入口互不串号。
|
||
- [ ] 普通用户不能切换系统协议或管理员上传插件;关闭“向普通用户显示系统插件”后,两类插件均不可见。
|
||
- [ ] 用户停用 RunningHub / ComfyUI 后不能提交新任务,但已接收任务、Bridge 轮询、心跳和结果回传可以完成。
|
||
- [ ] 管理员上传、停用、启用和卸载自定义插件后,插件包、平台状态、用户状态与审计日志一致。
|
||
- [ ] 验证 `/plugins` 与 `/admin/plugins` 的浅色/深色主题、窄屏、空态、筛选、上传弹窗和开关失败回滚。
|
||
|
||
## RunningHub 与 ComfyUI Bridge 工作流
|
||
|
||
- [x] 后端全量测试、前端类型检查、Canvas Agent 构建和原生 Bridge Go 测试通过。
|
||
- [x] 工作流插件停用状态覆盖设置入口、画布创建、配置面板、任务创建、管理 API 和 worker 执行校验。
|
||
- [x] 覆盖后端重启后请求领取、结果先落库再恢复、原请求 ID 幂等复用,以及 RunningHub API Key 不进入 URL 的自动化测试。
|
||
- [ ] 使用真实 RunningHub Workflow 和 App 分别验证参数发现、图片/视频/音频输入映射、提交、轮询、取消和结果下载。
|
||
- [ ] 使用真实 ComfyUI API 工作流验证 Bridge 注册、心跳、领取、完成、取消和大文件结果回传。
|
||
- [ ] 在 Bridge 执行中重启后端,确认结果回传成功且任务不重复执行;在请求未领取时重启后端,确认原请求继续投递。
|
||
- [ ] 验证浅色/深色主题、窄屏设置页、画布工作流节点和任务中心状态展示。
|
||
|
||
## AI 提示词优化器
|
||
|
||
当前代码和生产构建已完成,但以下场景仍需要在真实配置和不同窗口尺寸下由用户确认:
|
||
|
||
- [x] `web` 前端 TypeScript 检查与生产构建通过。
|
||
- [x] 优化面板打开、关闭不再等待 Popover 入场或退出动效。
|
||
- [ ] 在 `/create` 中分别测试图片和视频模式的打开、发送、取消、失败重试和关闭。
|
||
- [ ] 在图片、视频画布节点中测试优化入口、结果采用和原提示词回填。
|
||
- [ ] 逐项测试五种优化方式,确认模式切换不会丢失当前输入。
|
||
- [ ] 测试优化模型切换,并确认目标生成模型与优化模型显示和请求职责分离。
|
||
- [ ] 测试已连接图片、文本参考,以及“结合参考”没有参考内容时的提示和禁用状态。
|
||
- [ ] 测试长提示词、长优化结果、滚动、拖动和四边缩放;确认窗口接近边缘时不会跑出视口。
|
||
- [ ] 测试浅色/深色主题和窄窗口布局,确认按钮、输入框和结果文本仍可读且可操作。
|
||
- [ ] 使用自定义文本渠道实际发送一次,确认渠道、模型和权限配置正确时不会误报“必须指定系统渠道和模型”。
|
||
|
||
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
|
||
|
||
## 肖像可识别性排查画布插件
|
||
|
||
首版画布节点、本机签名运行时、本地 ONNX 预检、百度候选链路、模型作业协调器和四种报告导出已接入;以下边界仍需要真实环境确认:
|
||
|
||
- [x] Agent TypeScript 构建、Web TypeScript 检查通过。
|
||
- [x] 本机任务持久化、幂等、取消/重试清理、候选 URL 安全校验和报告转义测试通过。
|
||
- [x] Markdown、无脚本 HTML、DOCX 共用检测结论、本地预检、六维特征、修改建议和失败候选说明;报告结构回归测试通过。
|
||
- [ ] 使用固定真人/虚拟人图片建立 Python 原实现与 TS 实现的检测框、embedding 和风险金标。
|
||
- [ ] 在安装 `det_10g.onnx`、`w600k_r50.onnx` 的 Windows 环境完成直接比对和本地仅模式验证。
|
||
- [ ] 在系统 Chrome/Edge 可用环境完成百度识图、验证码、页面结构变化和候选下载失败验证。
|
||
- [ ] 配置支持双图输入的项目视觉模型,验证 Path A、Path B、模型租约、并发、取消和页面重开恢复。
|
||
- [ ] 浏览器确认插件首次关闭、旧节点只读、明暗主题、窄屏、键盘焦点和候选添加到画布。
|
||
|
||
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
|
||
|
||
## 画布节点自动整理
|
||
|
||
自动整理入口和布局提交逻辑已完成,以下场景仍需要在实际画布中手工确认:
|
||
|
||
- [x] `web` 前端 TypeScript 检查与生产构建通过。
|
||
- [x] 画布底部视图控制中显示“自动整理节点”按钮。
|
||
- [x] 布局纯函数专项测试覆盖有连线、无连线、选中子集、不同尺寸、锁定节点,以及文本/图片/视频/音频四类泳道。
|
||
- [ ] 无选中节点时,确认多个顶层节点横向保持连线层级,纵向按文本、图片、视频、音频分区;无连线时同类节点各自在独立网格中排列。
|
||
- [ ] 选中节点时,确认只移动选中的可移动节点,未选中节点保持原位。
|
||
- [ ] 确认锁定节点、容器节点和折叠批次隐藏子节点不会被移动。
|
||
- [ ] 点击“撤销”确认可以恢复整理前的位置,并确认刷新画布后布局仍能保存。
|
||
- [ ] 在浅色/深色主题、窄窗口和节点数量较多的画布中确认底部按钮可见、可操作且不遮挡主要内容。
|
||
|
||
## 分镜脚本资产关联
|
||
|
||
1. 在同一画布放入角色、场景图片、参考视频和音频后生成分镜,确认各镜头只关联模型返回的真实画布资产,不出现失效或编造 ID。
|
||
2. 分镜卡片按“序号、时长、视频提示词、台词/旁白、关联资产”五列显示;图片、视频和音频缩略图可点击并打开对应预览。
|
||
3. 从单个镜头及批量入口创建视频节点,确认脚本行输出和每个关联资产都自动连到视频节点,重复同步不会产生重复连线。
|
||
4. 打开视频节点提示词,确认关联资产以标准 `@资产` 缩略图展示,生成请求能解析图片、视频和音频引用。
|
||
5. 修改镜头资产关联后再次同步,确认已移除的托管资产连线被清理,而用户手工创建的普通连线仍保留。
|
||
|
||
## 零价免费模型
|
||
|
||
1. 管理员设置启用系统渠道模型的按次价格为 `0` 后,普通用户刷新设置即可看到并成功创建任务。
|
||
2. 前台逻辑模型使用统一按次价格 `0` 后,普通用户可见并能成功创建任务。
|
||
3. 零价任务完成后,账单状态为已结算,用户可用积分和预留积分均不变化。
|
||
4. 零价 Token 任务在上游未返回 usage 时仍能以 `0` 结算;正价 Token 任务继续依赖 usage 结算。
|
||
5. 管理端提交任一负价格仍会被拒绝。
|
||
6. 未勾选价格已配置的默认零价模型仍不会向普通用户公开。
|
||
|
||
## 用户诊断包导出
|
||
|
||
当前实现已完成前后端链路、脱敏和设置页 UI,但仍需要真实环境验证下载链路和不同错误场景:
|
||
|
||
- [x] `web` 前端 TypeScript 检查与生产构建通过。
|
||
- [x] 诊断服务已覆盖脱敏、ZIP 结构和跨用户任务拒绝测试。
|
||
- [x] 设置页桌面布局和 680px 窄屏布局已完成浏览器预览。
|
||
- [ ] 登录后从设置页导出成功,确认 ZIP、诊断编号和文件名均可用。
|
||
- [ ] 从失败任务详情进入诊断页,确认 `taskId`、`projectId` 和对应日志范围正确带入。
|
||
- [ ] 后端未重启或接口未部署时,确认前端能显示可操作的错误提示,而不是原始 Blob/502 文案。
|
||
- [ ] 验证浅色/深色主题、15 分钟到 24 小时范围、长问题描述和导出中的 loading 状态。
|
||
|
||
## Eagle 素材库
|
||
|
||
- [x] 增加素材无文件夹、无标签时的空集合归一化单元测试。
|
||
- [ ] 使用真实 Eagle 服务验证无文件夹素材、无标签素材、文件夹路径和预览引用。
|
||
|
||
## Windows 本地开发
|
||
|
||
- [ ] 在一台依赖已安装和一台全新工作区分别运行 `.\scripts\start-local.ps1`。
|
||
- [ ] 验证端口被占用时脚本会安全退出,且不会关闭已有进程或使用正式开发数据目录。
|
||
|
||
## 画布生成结果资源恢复
|
||
|
||
- [x] `web` 前端 TypeScript 检查与生产构建通过。
|
||
- [ ] 模拟图片生成任务已成功但结果下载失败,确认节点显示“重新加载资源”和“重新生成”两个按钮。
|
||
- [ ] 点击“重新加载资源”,确认只重新查询并消费原任务结果,不创建新的生成任务或重复扣费。
|
||
- [ ] 模拟视频结果落盘/OSS 上传失败后再次加载,确认恢复成功会清除错误状态并保留原任务信息。
|
||
- [ ] 点击“重新生成”,确认仍走原有生成重试流程;普通生成失败仍只显示“重新生成”。
|
||
|
||
## 数据同步与资源删除重构
|
||
|
||
- [x] 前端远端基线、登录 hydrated 屏障、上传并发编辑和删除持久化回归测试通过。
|
||
- [x] Generation 失败只回滚生成字段,保留同节点并发标题编辑;重复 Generation 仍按明确 effect key 幂等。
|
||
- [x] 资源引用识别改为显式字段合同,未登记的字段名和自由文本不会被推断为资源引用。
|
||
- [x] 后端素材删除改为数据库事务 + `resource_deletion_jobs` Outbox,数据库失败时物理文件保持不动。
|
||
- [x] Outbox Worker 本地文件删除、对象不存在幂等成功和失败退避测试通过。
|
||
- [x] 画布上传、媒体工具产物、导演台输出、ZIP 导入和时间线直连媒体统一先写入素材库;远端同步按“素材后端确认后再保存画布”的顺序执行。
|
||
- [x] 后端保存画布时校验 `assetId`、资源归属、就绪状态和素材资源一致性;素材更新、替换与删除不能破坏已有画布引用。
|
||
- [x] 登录会修复历史画布缺失的素材记录与 `assetId`;后台按状态保留期回收无任何业务引用的资源,并通过删除 Outbox 清理物理对象。
|
||
- [x] 账号容量只统计 `ready` 资源并按物理对象去重,上传中、失败记录和重复 Resource 行不会形成虚假容量占用。
|
||
- [ ] 在个人画布分别上传图片、视频、音频和时间线媒体,刷新后确认 `/assets` 均可见对应素材、画布 `assetId` 不丢失,账号容量只增长一次。
|
||
- [ ] 使用修复前已有“画布存在资源但素材缺失”的账号登录,确认素材自动补建并同步;再准备超过 24 小时且无任何引用的孤儿对象,确认后台最终删除资源记录和物理对象、容量同步下降。
|
||
- [ ] 模拟资源上传成功后立即断网,确认画布结构不会以缺失素材的状态写入服务端;恢复网络后自动重试完成素材与画布同步。
|
||
- [ ] 使用真实 OSS 配置验证对象删除成功、权限失败后的退避重试和多实例租约接管。
|
||
- [ ] 浏览器真实环境验证登录快照慢响应期间工作区保持不可写,以及删除后立即刷新不复活素材。
|
||
|
||
## S3 兼容存储
|
||
|
||
- [x] 后端 S3 单次上传、Range 读取、预签名地址、Session Token、幂等删除、配置版本和迁移清单自动化测试通过。
|
||
- [x] 前端 S3 预设、关键字段重测判断、默认 `open-ai-canvas` 路径前缀、TypeScript 检查和生产构建通过。
|
||
- [x] 平台或用户从未保存 OSS 配置时,后端统一返回标准化默认值(含 `s3Preset: custom`);缺省读取回归测试与后端全量测试通过。
|
||
- [x] 腾讯云 COS 连接测试固定通过服务端 Endpoint 执行写入、Range 读取和删除,不再误走可选 CDN;COS 鉴权失败会返回可操作且不泄露上游详情的提示,专项回归测试通过。
|
||
- [ ] 使用全新数据库登录管理员并打开 `/admin/settings/storage`,确认页面直接显示服务器本地存储且可切换阿里云 OSS、腾讯云 COS、七牛云 Kodo 和 S3 兼容存储。
|
||
- [ ] 使用真实腾讯云 COS 配置测试成功与错误 SecretKey 两种场景;同时填写 CDN 加速域名时确认连接测试仍走 COS Endpoint,错误凭据提示为鉴权失败而非“系统处理失败”。
|
||
- [ ] 分别使用 AWS S3、Cloudflare R2、Backblaze B2 和 RustFS 完成写入、Range 读取、删除及历史资源恢复验证。
|
||
- [ ] 验证 Path Style 开启时强制路径寻址,关闭时 AWS 使用虚拟主机寻址、其他自定义 Endpoint 自动使用路径寻址。
|
||
- [ ] 验证平台切换到本机后只影响新上传,历史 S3 资源仍可读取和删除;个人 S3 停用后正确回退平台存储。
|
||
- [ ] 验证同一 S3 修改 Bucket、Endpoint、Region、前缀或 Path Style 时,留空 Secret 和 Session Token 可继续复用,并要求重新连接测试。
|
||
- [ ] 使用私网 RustFS 验证浏览器同源代理,以及提交给模型上游时转换为影策公网 HTTPS 短时地址;未配置公网 HTTPS 地址时应明确拒绝。
|
||
- [ ] 验证管理员关闭个人 S3 后不再接受个人新上传,但已有个人 S3 资源仍可读取和删除。
|
||
|
||
## 3D 导演台时间轴关键帧删除与快捷键
|
||
|
||
关键帧删除入口、全局快捷键和交互控件守卫已接入,以下场景仍需要在浏览器中由用户确认:
|
||
|
||
- [x] `web` TypeScript 检查、导演台专项测试与全量前端测试通过。
|
||
- [x] 关键帧删除覆盖对象 transform、对象骨骼和摄影机三类轨道;未命中时返回同一场景引用,不记历史、不产生修订。
|
||
- [x] 时间轴关键帧为可 Tab 聚焦的真实 button;点击或 Enter/Space 只选择并定位播放头,Delete/Backspace 或顶栏删除按钮才删除,避免普通点击误删。
|
||
- [x] 所选关键帧可切换保持、线性、平滑缓动;缓动同时作用于对象/摄影机 Transform 与骨骼旋转插值,旧数据默认线性。
|
||
- [x] 切换镜头/摄影机或外部删除关键帧后会清除陈旧选择,顶栏缓动和删除控件不会继续修改不可见轨道。
|
||
- [x] 全局快捷键在输入框、按钮、链接、role 型控件、可编辑区域及其子元素内一律不解析;仅在动作真正执行时 `preventDefault`。
|
||
- [x] 鼠标点选场景对象、dock 工具、模式按钮、快速添加和顶栏图标按钮后会释放焦点,全局快捷键立刻可用;键盘激活(Enter/Space)保留焦点,Tab 序列不断。
|
||
- [ ] 在真实画布中记录多个关键帧后逐个删除,确认删除的是目标帧、其余帧顺序不变,且「撤销」能恢复。
|
||
- [ ] 折叠对象轨道后仅通过汇总轨删除关键帧,确认收起状态下仍可删除。
|
||
- [ ] 用键盘 Tab 走到关键帧上按 Enter/Space,确认只选择并把播放头定位到该帧;再按 Delete,确认删除的是该关键帧而不是整个对象。
|
||
- [ ] 对同一段动画依次选择保持、线性、平滑缓动,确认播放结果明显不同,撤销可恢复上一个缓动设置。
|
||
- [ ] 选中摄影机关键帧后切换到使用另一台摄影机的镜头,确认旧选择和顶栏缓动/删除控件立即消失。
|
||
- [ ] 确认浅色/深色主题下关键帧的悬停环与焦点环可见,命中区易于点中。
|
||
- [ ] 逐个验证 W/E/R、Delete/Backspace、H、Escape、Ctrl/Cmd+Z、Ctrl/Cmd+Shift+Z、Ctrl/Cmd+Y 和空格;确认在标题输入框内输入这些字符不会触发快捷键。
|
||
- [ ] 在场景列表点选一个对象后直接按 Delete,确认删除的是该对象;再点 dock 的「旋转」后按 W,确认能切回移动。
|
||
- [ ] 用键盘 Tab 走到场景对象行按 Enter 选中,确认焦点仍停在该行、可继续 Tab 到下一项。
|
||
|
||
## 3D 导演台场景模板与四模式骨架
|
||
|
||
新建场景模板和摆场/姿态/动画/摄影机四个一级模式已接入,以下场景仍需要在浏览器中由用户确认:
|
||
|
||
- [x] `web` TypeScript 检查、导演台专项测试与全量前端测试通过。
|
||
- [x] 导演台 P0 Chrome E2E 全部通过;场景 A 已同步为「默认摆场不显示时间轴与 AutoKey,切到动画模式后 AutoKey 默认关闭」。
|
||
- [x] 五个模板结构确定、每次实例 id 独立、对象 XZ 占位两两不相交,判据与 `resolveDirectorPlacement` 一致。
|
||
- [x] 空场景不含任何演员;未知模板 id 回落到空场景。
|
||
- [x] 模板不改动 `DirectorScene` 结构与 `version`;`mode` 只存在于工作台 store,不写入场景。
|
||
- [x] 离开动画模式会停止播放并关闭 Auto Key,并把渲染视图夹回当前模式允许的集合。
|
||
- [x] 动画模式会根据 Transform 关键帧绘制可见演员与摄影机的空间轨迹,包含起终点、方向和当前播放进度;隐藏演员及零长度轨迹不显示。
|
||
- [x] 播放头按镜头 FPS 而非固定 60 次/秒更新,跨过镜头末尾时保留余量;轨迹长度只在对象/摄影机内容变化时重算。
|
||
- [x] 「按运镜生成轨迹」只更新首尾关键帧,保留手工中间帧、关键帧 ID 与 easing,并提示切到动画模式继续编辑。
|
||
- [x] 截图/录制绑定开始时的场景快照;上传完成后重新核验节点与镜头,并只把预览引用合入最新场景,不用旧快照覆盖并发编辑。
|
||
- [ ] 从工具栏和画布右键菜单分别新建镜头,确认都会先弹出模板选择,且右键位置会作为新节点位置。
|
||
- [ ] 逐个使用五个模板新建镜头,确认空场景没有演员,单人/双人/走位演员数量正确,产品镜头含产品主体、背景板和侧面道具且没有演员。
|
||
- [ ] 确认双人对话两名演员面对面、走位三名演员互不重叠、产品镜头道具不穿模。
|
||
- [ ] 打开一个已保存的镜头,确认不弹模板选择、场景内容未被改写。
|
||
- [ ] 在摆场模式确认时间轴、Auto Key、记录关键帧、骨骼与姿势预设、深度/法线视图都不可见。
|
||
- [ ] 在姿态模式选中演员,确认骨骼与姿势入口出现;未选中演员时不出现;确认不会自动产生关键帧。
|
||
- [ ] 在动画模式开启 Auto Key 并开始播放,再切到其他模式,确认播放停止、Auto Key 关闭,且场景没有被继续写入关键帧。
|
||
- [ ] 在动画模式为演员和摄影机分别记录至少两枚位置不同的 Transform 关键帧,确认轨迹、起终点、方向锥和当前进度点可见;隐藏演员后其轨迹同步消失,离开动画模式后全部轨迹消失。
|
||
- [ ] 在摄影机模式确认右栏固定显示镜头/摄影机检查器,对齐视图与运镜可用,深度/法线视图可选。
|
||
- [ ] 在摄影机已有关键帧且播放头不在 0 秒时执行「摄影机对齐当前视图」,确认当前帧立即保持新机位,旧关键帧仍在且撤销可恢复。
|
||
- [ ] 在摄影机已有首尾帧和至少一枚带缓动的手工中间帧时执行「按运镜生成轨迹」,确认只更新首尾位置,中间帧、缓动与撤销历史都保留。
|
||
- [ ] 开始截图或白膜录制后切换活动镜头、删除源节点或继续编辑场景,确认旧输出被拒绝或安全合并,不写进另一项目、不复活节点、不覆盖新编辑。
|
||
- [ ] 确认模式切换不丢失草稿、撤销历史和保存状态,切换后标题与保存指示器仍正确。
|
||
- [ ] 确认浅色/深色主题下模式按钮的选中态、悬停态与焦点环可见,选中态不是主操作色。
|
||
- [ ] 在窄窗口(小于 lg 断点)确认模式切换仍可见可点击。
|
||
|
||
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
|
||
|
||
## 3D 导演台取景模式(3D/CAM/五个正交视图)
|
||
|
||
新增 `viewMode`(自由/机位/顶前后左右五个正交轴向)取景切换,独立于摆场/姿态/动画/摄影机四个一级模式;以下场景仍需要在浏览器中由用户确认:
|
||
|
||
- [x] `web` TypeScript 检查通过;`director-view-modes.test.ts`、`director-modes.test.ts`、`director-template-mode-wiring.test.ts` 专项测试通过。
|
||
- [x] 三台相机对象(自由观察、机位、正交)互相独立持有,切换 `viewMode` 只挪动视口的活动相机指针,源码层面确认不共享可变状态。
|
||
- [x] 正交轴向使用真正的 `THREE.OrthographicCamera`,取景来自场景内容包围盒,而非把透视相机换个角度伪装;取景解算与视口接线均有专项测试覆盖退化场景(空场景、非法数值)。
|
||
- [ ] 逐个切换 3D/CAM/顶视/前视/后视/左视/右视,确认画面确实是对应视角,正交视图没有透视畸变。
|
||
- [ ] 放入大比例背景板和旋转后的长道具,逐个切换正交视图,确认对象完整进入画面,不再因只按对象中心构图而裁切。
|
||
- [ ] 在自由视角环绕后切到机位或任一正交视图,再切回自由视角,确认之前的环绕位置原样恢复,没有被拉回默认机位。
|
||
- [ ] 在机位视图播放/拖动时间轴,确认摄影机运镜正确预览;切到正交视图确认环绕已锁定、拖拽无效。
|
||
- [ ] 确认取景切换器(3D/CAM/TOP/FRONT/BACK/LEFT/RIGHT 七个按钮)可键盘 Tab 到达、Enter/Space 激活,`aria-pressed` 状态正确朗读。
|
||
- [ ] 确认切换取景模式不产生新的撤销历史记录,也不触发保存/未保存提示。
|
||
- [ ] 在机位或正交视图下点击「导出预览图」「录制白膜视频」,确认导出流程仍正常完成(不因当前相机是正交投影而失败)。
|
||
- [ ] 确认浅色/深色主题下取景切换器的选中态、悬停态与焦点环可见。
|
||
- [ ] 在窄窗口(小于 lg 断点)确认取景切换器仍可见可点击,不与其他浮层重叠遮挡。
|
||
|
||
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
|
||
|
||
## 3D 导演台首次引导与窄屏属性面板
|
||
|
||
首次引导已接入真实登录用户 scope,并按 Issue #305 改为“添加演员 → 移动 → 调姿 → 轨迹 → CAM → 应用”六步;以下场景仍需要浏览器确认:
|
||
|
||
- [x] 引导进度按认证用户 ID 隔离,不回落 guest;重启入口在加载期间也可用,重置失败会重新读取原进度。
|
||
- [x] 已跳过或已结束的引导可从标题栏重新开始;最后一步使用“结束引导”中性文案,不宣称用户已经完成实际任务。
|
||
- [x] 小于 `lg` 断点时右侧属性区移动到工作区下方且可滚动,不再直接隐藏姿势与骨骼控制。
|
||
- [x] `director-onboarding.test.ts` 专项测试与 `web` TypeScript 检查通过。
|
||
- [ ] 使用两个真实账号分别推进、跳过和重启引导,确认进度互不串号;切换账号时旧读取结果不会闪现。
|
||
- [ ] 从新账号首次打开导演台,逐步完成添加演员、移动、姿态、两枚 Transform 关键帧、CAM 构图与应用,确认六步文案都指向真实可见入口。
|
||
- [ ] 在引导加载期间连续点击“重新开始引导”,再模拟 IndexedDB 写入失败与恢复,确认界面不会永久隐藏或假装推进。
|
||
- [ ] 在窄窗口检查摆场、姿态、动画、摄影机四种模式:标题栏可横向到达,底部属性面板可滚动,时间轴与引导不互相遮挡。
|
||
|
||
用户确认上述场景后,再将对应条目移动到功能文档的已验证范围。
|
||
|
||
## 模型请求失败日志完整性
|
||
|
||
模型请求日志已补齐 HTTP 失败关联、错误搜索与请求前失败兜底;以下场景仍需要在管理后台由用户确认:
|
||
|
||
- [x] HTTP 非 2xx 日志同时保留节点使用的中文错误归类和上游原始错误详情。
|
||
- [x] API 调用日志关键词搜索覆盖 `errorCode` 与 `error`,可按节点中文提示、上游错误或错误码定位。
|
||
- [x] 参数校验、协议构造、路由准备等请求尚未发出的最终失败会补记 `request_not_sent`,且不保存任务输入、API Key 或请求正文。
|
||
- [x] 已有真实 HTTP 调用日志的任务不会重复补记请求前失败日志。
|
||
- [ ] 在画布分别触发一次成功请求、一次上游 400 和一次本地参数校验失败,确认 `/admin/logs` 均能看到对应记录,并可按节点错误文案搜索。
|
||
|
||
## 渠道视频分辨率枚举兼容
|
||
|
||
画布已将渠道声明的分辨率视为不透明枚举,不再把带方向或本地化后缀的值静默回退为 `720p`;以下场景仍需浏览器确认:
|
||
|
||
- [x] 前端分辨率规范化、画布选中态、价格匹配与请求映射专项测试通过。
|
||
- [x] AutoDL 插件 `1.0.2` 已改用通用 `lower` 并通过协议包测试;宿主仅保留旧 `1.0.1` 清单所需的兼容 shim。
|
||
- [x] Manifest 工作流的视频能力改为按 `parameters` 投影:只声明分辨率时不再补画幅能力,也不会继续提交旧的全局 `size`。
|
||
- [x] 同时支持分辨率和画幅的渠道按当前比例与分辨率推导只读宽高,例如 `16:9 + 720P = 1280×720`、`16:9 + 1080P = 1920×1080`、`16:9 + 4K = 3840×2160`。
|
||
- [x] `web` TypeScript 检查与生产构建通过。
|
||
- [x] 后端允许视频能力明确省略画幅,并通过全量 Go 测试;前端能力投影、尺寸计算和画布模型专项测试通过。
|
||
- [ ] 在画布选择 `480p竖`、`768p竖`、`480p横`、`768p横`,确认按钮选中态、底部摘要和重新打开后的状态一致。
|
||
- [ ] 分别提交四个枚举值,确认请求中的 `resolution` 与插件声明一致,且其他标准 `720p`、`1080p` 渠道不受影响。
|
||
- [ ] 使用仅声明 `resolution` 的 AutoDL 工作流,确认画布和创作页不显示画幅/尺寸,生成请求不包含无意义的 `aspectRatio`。
|
||
- [ ] 使用同时声明画幅与分辨率的渠道,依次切换 `16:9` 下的 720P、1080P、4K 及 `9:16`,确认宽高展示随选择即时更新且请求仍按渠道协议发送比例与分辨率。
|
||
|
||
## 画布生成重复提交保护
|
||
|
||
画布生成入口已增加节点级同步提交锁,并为手动生成记录“提示词、模型、参数、参考素材”指纹;以下场景仍需浏览器确认:
|
||
|
||
- [x] 连续三次调用同一节点只执行一次的专项测试通过;提示词、模型、参数或参考素材变化会产生不同指纹。
|
||
- [x] `web` TypeScript 检查、21 个相关专项测试与生产构建通过。
|
||
- [ ] 在同一节点快速连续点击三次生成,确认任务中心只新增一个任务,且不会重复扣除积分。
|
||
- [ ] 首次任务完成后不修改提示词、模型、参数和参考素材,再次点击生成,确认出现“再次生成相同内容”二次确认;取消不创建任务,确认后只创建一个新任务。
|
||
- [ ] 分别修改提示词、模型、分辨率/时长和参考素材后生成,确认视为新内容,不弹重复确认。
|
||
- [ ] 执行分镜批量生成、Agent 自动生成和显式重试,确认不会被手动重复确认弹窗阻塞。
|
||
|
||
## 画布快捷键中心
|
||
|
||
画布搜索已统一为 `Ctrl/Cmd + F`,专注模式调整为 `Shift + Ctrl/Cmd + F`;原快捷键长列表已改为可搜索、可分类的快捷键中心。以下场景仍需浏览器确认:
|
||
|
||
- [x] 快捷键目录筛选专项测试、`web` TypeScript 检查与生产构建通过。
|
||
- [ ] 在 Windows 和 macOS 分别按 `Ctrl/Cmd + F`,确认打开画布节点搜索且不会触发浏览器页内查找。
|
||
- [ ] 按 `Shift + Ctrl/Cmd + F`,确认进入或退出专注模式;按 `Ctrl/Cmd + K` 不再打开节点搜索,并保留工作区命令面板入口。
|
||
- [ ] 打开快捷键中心,分别搜索“粘贴”“缩放”和“Alt L”,确认结果与分类计数正确,清空搜索后恢复完整列表。
|
||
- [ ] 确认浅色/深色主题下标题、分类选中态、搜索焦点环、键帽和滚动区域清晰可见。
|
||
- [ ] 在窄窗口确认分类可横向滚动、快捷键列表改为单列,弹窗不超出视口且长内容仅在列表区滚动。
|
||
|
||
## 管理后台在线更新
|
||
|
||
管理后台已新增“系统配置 → 系统更新”,并通过宿主机 Host Updater 执行强制备份、迁移、切换、健康验证和失败回退;以下场景需要在真实 Linux Docker Compose 服务器完成最终确认:
|
||
|
||
- [x] 后端 Host Updater、Unix Socket 客户端、管理员 API、版本比较和状态持久化相关测试通过。
|
||
- [x] 前端 TypeScript 检查、生产构建、侧栏入口、更新器未安装空态、更新器连接态、GitHub Release 日志、浅色/深色主题浏览器验收通过。
|
||
- [x] Compose 配置校验、systemd 安装脚本语法和 Release 二进制构建命令通过。
|
||
- [ ] 在生产更新前生成 PostgreSQL + 数据目录 ZIP,确认 `.partial` 不会被当作有效备份,最终 ZIP 可打开且 SHA-256、元数据、`database.dump`、`backend-data.tar` 均有效。
|
||
- [ ] 从首个在线更新版本升级到包含 schema v2 的测试版本,确认旧服务先 drain,迁移服务独占执行,目标 build version 和 schema version 在稳定窗口内一致。
|
||
- [ ] 人为让目标版本健康检查失败,确认自动恢复旧 Compose、旧镜像和数据库备份;旧版本因 schema 过高拒绝启动时,必须在数据库恢复完成后才能重新健康。
|
||
- [ ] 在拉取镜像、创建备份、迁移、启动和健康检查阶段分别模拟失败,确认停服前失败不会改变运行版本,停服后失败进入回退,回退失败明确显示“需人工介入”。
|
||
- [ ] 更新期间刷新页面、关闭浏览器和 Backend 短暂不可用,确认宿主机操作不中断,恢复后日志与最终状态完整。
|
||
|
||
## 大型画布媒体节点性能
|
||
|
||
大型画布已修复 LibTV 图片强制并发加载、缩略图反向覆盖原始尺寸、节点操作 Context 失稳和小范围平移频繁卸载媒体节点的问题;以下场景仍需使用真实大型画布确认:
|
||
|
||
- [x] 前端专项测试覆盖 LibTV 延迟加载、尺寸回写保护、节点渲染滞回、Context 稳定引用,以及缩放/平移期间不得隐藏节点壳;TypeScript 检查与生产构建通过。
|
||
- [ ] 导入包含数百个图片、视频节点的 LibTV 画布,确认初次打开不会同时加载全部图片,平移和反向平移时已显示图片不再反复闪烁或重新解码。
|
||
- [ ] 在自动、性能、画质三种模式下分别缩放和平移,确认操作期间视口内节点持续可见,远离视口的节点仍会卸载,选中、拖动、连线和节点尺寸保持正确。
|
||
- [ ] 使用浏览器 Performance 与 Network 面板记录导入前后数据,确认平移期间主线程长任务、图片并发请求和节点重复渲染明显下降。
|
||
|
||
## 大型画布进入详情性能
|
||
|
||
画布列表进入详情已增加详情模块预取、点击即时反馈和可中断的数据恢复渲染;节点引用改为一次建图索引,列表封面结果按节点数组缓存,避免延迟随节点数快速放大。以下场景仍需使用真实大型画布确认:
|
||
|
||
- [x] 专项测试覆盖详情模块预取、点击反馈时序、批量引用索引语义;TypeScript 检查与生产构建通过。
|
||
- [ ] 首次打开应用后悬停并点击包含数百节点的 LibTV 画布,确认卡片立即出现“正在打开”,随后进入详情加载态,不再数秒无反馈。
|
||
- [ ] 分别使用空画布、100 节点和数百节点画布记录从点击到详情可见的耗时,确认增长接近线性且列表返回后再次进入更快。
|
||
|
||
## 画布保存被历史素材阻断
|
||
|
||
- [x] 素材远端同步会在发送副本中移除超过后端约束的历史 `primaryVersionId`,合法项目资产版本 UUID 原样保留,本地素材对象不被修改。
|
||
- [x] 后端 36 字符强校验保持不变;前端专项测试覆盖非法历史值清理、合法 UUID 保留与本地对象不可变。
|
||
- [ ] 使用曾出现“素材主版本 ID 不能超过 36 个字符”的账号编辑并保存画布,确认云端同步成功,刷新后画布布局仍然存在。
|
||
|
||
## 独立素材共享文件删除
|
||
|
||
- [x] 素材删除不再把另一条素材共用同一资源文件误判为素材实体引用;删除当前素材时保留其他素材仍使用的资源记录与物理文件。
|
||
- [x] 项目、镜头等真实业务引用仍会阻止素材删除;后端专项测试覆盖两个独立素材共享同一资源的删除场景。
|
||
- [ ] 在素材库删除曾由同一生成结果产生的重复素材,确认当前素材删除成功,其他素材仍可预览和下载;实际仍关联项目或镜头的素材继续显示引用来源。
|
||
|
||
## 管理后台存储资源
|
||
|
||
管理后台已新增资源列表、筛选、去重容量统计、预览下载和安全批量删除;以下场景仍需使用真实资源数据确认:
|
||
|
||
- [x] 后端专项测试覆盖管理员权限、筛选校验、共享对象去重统计、历史本地资源预览、部分删除成功、公告/画布引用阻止、共享物理对象保留、审计失败事务回滚和 100 项上限。
|
||
- [x] `web` TypeScript 检查通过;只读阶段与删除阶段均复用同一资源页面和统一 API 客户端。
|
||
- [ ] 在 `/admin/resources` 分别按资源 ID、对象路径、用户 ID、类型、状态和存储类型筛选,确认分页与筛选 chip 一致。
|
||
- [ ] 预览并下载本地、阿里云 OSS、腾讯云 COS、七牛云 Kodo 和 S3 的图片、视频、音频与普通文件,确认 Range、登录 Cookie 和错误提示正确。
|
||
- [ ] 选择一个仍被公告、素材、画布、项目、风格、工作流或镜头产物引用的资源,确认删除结果显示真实引用来源且业务数据和物理对象均保留。
|
||
- [ ] 批量选择“可删除、仍被引用、不存在”三类资源,确认只删除安全项,列表和统计刷新,审计事件与 outbox 数量一致。
|
||
- [ ] 创建两条共享同一物理对象的资源记录,只删除其中一条,确认另一条仍能预览且物理对象未清理;两条同时删除时确认只产生一个物理删除任务。
|
||
- [ ] 模拟对象存储暂时失败,确认资源记录事务仍成功、删除任务保留并重试,恢复后物理对象最终清理。
|
||
|
||
## 画布素材上传幂等
|
||
|
||
画布上传、远端用户数据同步与后端资源写入已使用同一逻辑上传身份,避免腾讯云 COS 等对象存储因自动同步、并发请求或响应丢失产生重复对象:
|
||
|
||
- [x] 前端回归测试补充“内嵌图片上传期间继续编辑”,要求同一 `coverUrl/dataUrl` 跨同步批次只调用一次资源上传。
|
||
- [x] 后端专项测试覆盖相同上传身份复用就绪资源,以及失败重试保持原资源 ID 和对象路径。
|
||
- [ ] 在腾讯云 COS 测试桶上传图片后连续移动节点、修改标题并刷新页面,确认后台始终只有一条资源记录和一个物理对象。
|
||
- [ ] 在 COS 已接收上传后中断浏览器响应,再恢复网络触发自动同步,确认返回原资源 ID,用户存储用量不增加。
|
||
- [ ] 使用两个标签页并发提交相同 `X-Idempotency-Key`,确认一个请求完成上传,另一个复用结果或返回可重试冲突,不生成第二个对象路径。
|
||
|
||
## 短剧分镜工作流工作台
|
||
|
||
短剧工作流已按镜头生产重构为单层项目工作台,并将资产绑定、镜头编辑、生成预览和整集镜头轨道放入同一视口;以下场景仍需用户在真实项目数据与模型渠道下确认:
|
||
|
||
- [x] 工作流路由保留系统全局侧栏和顶栏;项目头部压缩为单行,移除额外六阶段横条,项目导航入口改为“分镜制作”。
|
||
- [x] 项目详情 API 对旧后端可能缺失的工作流、镜头版本、产物、引用、候选资产和文件夹数组统一规范为空数组;使用缺失这些字段的响应完成浏览器复现,页面正常加载且控制台无错误。
|
||
- [x] 未初始化章节不再显示阻断式居中空态;镜头编辑器可直接查看和保存,首次真实生成时按当前章节自动建立工作流记录。
|
||
- [x] 分镜脚本、黑白动作预演、视频生成共用资产栏、镜头表单、预览/历史栏和底部镜头轨道;前端生产构建通过。
|
||
- [x] 模型、时长、画幅、分辨率和镜头语言合并为默认折叠的“生成设置”,模型提示词与接戏信息合并为默认折叠的“生成补充”;折叠摘要会显示当前关键参数,浏览器展开/收起验证通过。
|
||
- [x] 删除项目头部重复且发生重叠的“新增分镜”入口,只保留底部镜头轨道中的新增卡片;1280px 与 1680px 浏览器检查无横向溢出,系统全局侧栏保持可见。
|
||
- [x] 右侧产物阶段从标题旁的隐藏下拉框改为常驻三段切换,分镜图、动作预演和镜头视频始终可见;1280px 与 1680px 下切换路由、阶段文案、最新/历史状态和全局侧栏浏览器验证通过。
|
||
- [x] 底部镜头卡片取消悬浮上移和向外扩张的选中阴影,改为不改变坐标与尺寸的底色、边框和内描边反馈;右侧移除“复制参数”“入素材库”,仅保留并排的重新生成与下载,1280px 浏览器悬浮和布局验证通过。
|
||
- [x] 镜头编辑器改为脚本优先顺序:镜头名称与画面、镜头资产、表演与动作、对白/旁白优先展示,生成规格和模型补充保持折叠;字段统一为画幅、镜头时长、机位角度、运镜方式、排除内容和接戏备注等生产术语。
|
||
- [x] 编辑器标题实时反映镜头名称与“已保存/有未保存修改/保存中”状态;无修改时禁止重复保存,切换或新增镜头前会拦截未保存修改。浏览器交互验证通过。
|
||
- [x] 镜头保存使用真实版本写接口;资产点击绑定具体版本;生成统一进入后端任务生命周期,成功后登记对应镜头产物;下载使用带登录凭据的资源接口。
|
||
- [x] “生成设置”新增技能库多选,分镜图、动作预演和镜头视频统一通过 Skill Runtime 解析,任务与镜头产物记录技能版本和实际引用文件。
|
||
- [x] 镜头资产支持再次点击或从已绑定标签取消引用;解绑使用归属校验的独立写接口,并使该镜头旧产物失效。动态提示词复用画布 `@` 引用编辑器,已绑定图片和角色会按实际参考图顺序解析后提交;后端全量测试、前端专项测试和生产构建通过。
|
||
- [x] 镜头生成资产解析改为同时保留绑定版本视觉快照与当前角色卡声音配置;角色主图、场景图和声音样本按 `图片N` / `音频N` 写入 `【资产参考】`,并自动补充声音画像与镜头台词。历史角色版本 + 新版声音绑定的后端/前端专项回归通过。
|
||
- [x] 镜头编辑器底部在“保存脚本”左侧新增“删除镜头”;二次确认后原子清理该镜头的脚本版本、资产引用、生成产物、候选资产和生产任务关联,压紧剩余镜头顺序并自动切换到相邻镜头。
|
||
- [ ] 使用包含角色、场景、道具和画风的真实项目,确认左侧分类、绑定状态、参考素材标签和镜头切换保持一致。
|
||
- [ ] 分别删除首个、中间、末尾和唯一镜头,确认二次提示、相邻镜头切换、空态、镜头编号、总镜数以及刷新后的数据一致;有未保存修改时确认提示明确且取消不会丢失内容。
|
||
- [ ] 在同一镜头绑定角色和场景后输入 `@`,确认菜单、行内缩略图和生成请求中的“图片 N”顺序一致;分别从左侧资产行和已绑定标签取消引用,确认刷新后状态一致,旧 token 会阻止生成并提示重新选择或删除引用。
|
||
- [ ] 使用“分镜绑定角色旧版本、角色卡随后绑定声音”的真实项目生成镜头视频,确认请求包含旧版角色主图、场景图、当前声音样本、声音画像和镜头台词,且媒体角色为参考资产而非首帧。
|
||
- [ ] 配置一个图片模型和一个视频模型,分别生成分镜预览、动作预演与视频,确认任务中心、镜头历史、最新预览和阶段状态同步更新。
|
||
- [ ] 在浅色/深色主题及 1280px、1050px、760px 三个断点检查项目导航、表单滚动、右侧预览和底部镜头轨道,确认没有遮挡或不可达控件。
|
||
- [ ] 验证下载视频、复制生成参数、将任务物化产物加入项目素材库、章节切换与新增分镜;确认失败任务展示真实错误且不会伪造产物成功。
|
||
|
||
## 章节分镜生成到分镜制作
|
||
|
||
剧情章节的分镜入口已从“在画布中分镜”纠正为“生成到分镜制作”;生成结果直接写入镜头脚本,并在本章已有分镜时执行显式替换确认。以下场景仍需使用真实项目与已安装技能确认:
|
||
|
||
- [x] 章节正文、项目画风、当前角色版本和项目资产统一进入 `agent_storyboard_rows` 任务;分镜生成继续经过 `Skill Runtime` 的 `shortDrama` profile,并记录实际技能版本和引用文件。
|
||
- [x] 本章待确认角色也会进入分镜上下文;模型在 `characterIds` 中返回角色名称时,已确认角色自动映射到真实资产版本,待确认或未知角色降级为仅名称引用,不再触发结构修复请求或报废整份分镜。后端专项测试、前端映射测试与生产构建通过。
|
||
- [x] 分镜任务结果映射到镜头画面、动作、对白、景别、机位、运镜、图片/动态提示词与接戏备注;模型返回的项目资产关联随镜头在同一替换事务中保存。
|
||
- [x] 本章无分镜时直接写入“分镜制作”并跳转到分镜图阶段;已有分镜时展示镜头、脚本版本、资产引用、生成产物和候选资产影响数量,生成失败不修改旧数据。
|
||
- [x] 技能多选框占满弹窗内容宽度;专项测试、TypeScript 检查、后端服务测试和前端生产构建通过。
|
||
- [ ] 选择 1 至 4 个已安装技能生成真实章节,确认任务中心中的技能版本、文件来源和生成结果一致,完成后进入对应章节的“分镜制作 / 分镜图”。
|
||
- [ ] 使用已提取但尚未确认资产的“张振天、张天昊”重新生成真实章节,确认镜头正常落库、提示词保留角色名称;确认角色资产后再次生成,确认同名角色自动带上真实资产与版本 ID。
|
||
- [ ] 对已有镜头、历史脚本、资产引用和生成产物的章节重新生成,分别验证取消替换、模型生成失败和确认替换:前两者保留旧数据,确认替换后旧关联被移除且新资产引用可用。
|
||
- [ ] 在 560px 及更窄视口打开设置弹窗和技能下拉框,确认选择器、选项面板、长技能名称和替换警告没有横向溢出。
|
||
|
||
## 短剧项目导航与制作概览
|
||
|
||
项目设置、章节导航、制作概览、镜头轨道和画布新增入口已按长篇短剧工作流重构;以下场景仍需使用登录态真实项目确认:
|
||
|
||
- [x] 项目新增 `cover_resource_id`,服务端校验资源归属、就绪状态和图片类型;项目主图被资源删除流程识别为直接引用。章节新增持久化 `word_count`,新建、导入、更新和旧数据迁移均维护字数摘要;后端全量测试通过。
|
||
- [x] 项目设置可从个人图片素材、项目图片素材或实时上传中设置主图;项目列表优先显示主图,未设置时回退画风示意图。分镜制作头部改为上一章、搜索定位、下一章的虚拟章节导航;前端生产构建通过。
|
||
- [x] 修复项目更新仓储遗漏 `cover_resource_id`,避免接口返回“主图已更新”但数据库字段仍为空;回归测试同时校验设置与移除主图后的数据库重读结果,后端全量测试通过。
|
||
- [x] 剧情章节列表去除装饰性侧边表达并显示状态、字数、画布数;制作概览新增六阶段标准流程、当前指标、制作缺口和可点击快速入口;底部镜头卡增加画面、加粗时长、镜头参数、产物版本与绿色成功状态。
|
||
- [x] 画布空白区域双击改为直接打开已有新增节点面板,并保留双击位置作为节点落点;原“适配内容”能力继续由缩放控制区提供。
|
||
- [x] 项目分镜视频页完成首屏请求治理:项目详情与七个子视图按路由加载,命令面板、更新日志、公告正文和画布创建运行时改为交互后加载,视频预览点击后才取流;真实登录项目生产构建实测首屏 75 个请求(59 个静态资源、13 个 API、3 个其他),首屏不请求 MP4,Console 无错误。
|
||
- [ ] 在项目设置分别从个人素材、项目素材和上传图片设置主图,刷新项目列表后确认图片一致;替换、移除主图后确认回退逻辑正确,尝试删除当前主图资源时确认显示项目引用来源。
|
||
- [ ] 使用 2500 章项目搜索章节序号和标题,确认定位弹窗桌面端为 5 列、默认每页 100 章,搜索区与分页区保持同一表面;连续切换上一章、下一章并刷新页面,确认当前位置、总章数、字数和路由一致。
|
||
- [ ] 在制作概览点击剧情、资产、分镜、预演、视频、交付和三个快速入口,确认跳转到正确章节及阶段,真实镜头产物数量与完成状态一致。
|
||
- [ ] 在浅色、深色主题和 1280px、1680px 宽度检查镜头卡,确认时长明显、标题与镜头参数不溢出、“已生成”为绿色且选中态仍使用工作台强调色。
|
||
- [ ] 在画布不同缩放和平移位置双击空白处,确认新增节点面板直接打开,选择文本、图片、视频和扩展节点后落点接近双击位置;双击节点、弹窗和其他浮层不应触发新增。
|
||
## 工作台首页创作仪表盘改造
|
||
|
||
参考模板 Dashboard 将 `/home` 首页重构为创作仪表盘(欢迎区 + 统计卡 + 活跃度/素材图表 + 最近项目表格),以下场景仍需要浏览器确认:
|
||
|
||
- [x] `web` 前端 TypeScript 检查通过;旧首页样式类已随页面重写移除。
|
||
- [ ] 登录用户确认欢迎区显示用户名、主操作跳转 `/projects?create=1`、打开画布按钮在未登录时引导登录。
|
||
- [ ] 确认统计卡数值与项目/画布/素材/任务页面一致:进行中项目、自由画布、素材资产、本周任务。
|
||
- [ ] 确认创作活跃度图表随 7/14/30 天切换刷新,生成任务与画布更新两个系列与任务中心/画布列表一致。
|
||
- [ ] 确认素材构成环形图按类型统计正确,无素材时显示空态文案。
|
||
- [ ] 确认最近项目表格的搜索、状态筛选、排序与分页行为,行点击进入项目概览;无项目时显示创建入口。
|
||
- [ ] 确认快捷创建与工作流面板入口可用,工作流提示显示最近项目阶段与章节完成度。
|
||
- [ ] 验证浅色/深色主题与窄窗口(表格横向滚动、统计卡换行)下可读可操作。
|
||
|
||
## 编辑器 Concat 风格打磨第 36 条(5 项 UI)
|
||
|
||
已实施完成,需要浏览器最终确认:
|
||
|
||
- [x] 前端 TypeScript 检查通过;`web/test/timeline-view.test.ts` 3 个守护测试通过;git 工作区干净。
|
||
- [ ] 时间线面板与监视器的分隔条拖拽方向:向上拖拽时间线面板应变大(已反转,拖拽中无反向)。
|
||
- [ ] 顶部工具栏图标(含导出)与时间线轨道徽标、片段未选中态不再使用蓝色填充,风格与 img-10 参考统一;片段选中态仍以 accent 蓝标识。
|
||
- [ ] 时间线最后一个片段可向左、向右双向拖拽,右侧不再固定不动;拖动过程中时间刻度不漂移(pxPerMs 仅由缩放决定)。
|
||
- [ ] 监视器底部控制条为 Concat img-14 风格:SkipBack/StepBack/Play/StepForward/SkipForward 五键 + 变速菜单(0.5x–2x)+ 进度条行与时间码;图标在恒黑监视器上为白色,无蓝色。
|
||
- [ ] 右侧检查器为 Concat img-15 风格:属性行水平排列(标签左、控件右)、Section 分组标题、输入框 h-7 rounded-[7px]、凹嵌式滑块;浅色/深色主题下均无主题不同步。
|
||
|
||
## 媒体导入失败根治(分片上传 + OSS 降级修复)
|
||
|
||
已实施,代码/单测/编译验证通过,需要浏览器最终确认:
|
||
|
||
- [ ] 后端 `go build`/`go vet` 通过;`resource_test.go` 新增 OSS body close 回归测试通过;handler/service 包测试通过。
|
||
- [ ] 重新导入 >50MB 视频(如 92MB 样例),确认前端分片上传(POST /uploads → PUT chunks → POST complete)全程无 400,且进度条显示百分比。
|
||
- [ ] OSS 配置密钥仍不匹配(历史 403 SignatureDoesNotMatch)时,确认上传自动降级写入本地存储(provider=local)并导入成功,不再报"导入失败"。
|
||
- [ ] 在用户设置里修正阿里云 OSS AccessKeySecret(当前配置的密钥从未验证通过,8/16 起所有 OSS 上传均 403)后,确认资源改回写入 OSS。
|
||
- [ ] 确认配额默认值已放宽(日 2048MB、总量 20GB,仅当无 runtime_policy 记录时生效);超过日配额时前端提示为中文而非裸 400。
|
||
|
||
## 上传媒体监视器播放(H.265 播放副本 + 真实播放驱动 + 时长链路)
|
||
|
||
阶段 C 根治:本地 H.265 原件服务端转 H.264 播放副本(provider=local 专属,无 ffmpeg 则保持原样),
|
||
监视器 <video> 真实播放驱动(不再纯时间码),时间线 transport 与监视器共享,上传携带真实时长。
|
||
代码/单测/编译验证通过(后端 go build/vet/test、前端 tsc 全绿),需浏览器最终确认:
|
||
|
||
- [ ] 拖入上传的 H.265 视频(92MB 样例,资源 rowid 54/55)到时间线,点播放:画面真实播放、有声音(不再黑屏/静音);首次 onError 后出现"正在生成兼容版本"提示并轮询,转码完成后自动切 H.264 副本继续播放。
|
||
- [ ] 监视器播放时时间线播放头同步推进;拖动时间线播放头(scrub)监视器画面即时跳转;暂停/继续/变速(0.5x–2x)后时间线与监视器仍一致。
|
||
- [ ] 轨道静音开关生效:视频所在轨道 muted 时监视器无声,取消静音恢复声音;轨道隐藏(可见性关闭)的片段不再参与预览。
|
||
- [ ] 拖入时长 >5s 的视频片段,其时间线长度等于视频真实时长(不再固定 5s 截断);时长探测上传的新素材在资源卡片/片段均显示真实时长。
|
||
- [ ] 播放副本就绪前(processing)视频黑屏时出现"正在生成兼容版本(H.264)…"浮层 + "下载原片用本地播放器观看"链接;生成失败显示失败文案而非一直转圈。
|
||
- [ ] 时间线 scrub/播放/变速往返 10 次以上无卡死、无播放头回跳、无 setState-after-unmount 报错(Console 无告警)。
|
||
|
||
## MPEG-4 Part 2 播放死循环 + 画布产物素材同步(待浏览器验收)
|
||
|
||
已实施,代码/单测/编译验证通过(后端 go vet/test、前端 tsc 全绿),需浏览器最终确认:
|
||
|
||
- [ ] 导入 MPEG-4 Part 2(mp4v)视频(如 07ee…mp4 sprite/header damaged 样例)后拖入时间线:不再出现"正在生成兼容版本"提示闪烁死循环;损坏文件转码失败后显示终止性文案(不再反复回退重试);正常 mp4v 文件自动生成 H.264 副本并可播放。
|
||
- [ ] 存量回归(backend 重启生效):重启后端后,旧规则遗留的 none 存量视频被自动重判——H.264 保持可播;损坏 mp4v(如 c326/07ee…)自动尝试转码并以失败终态呈现终止性文案,不再直接抛"视频编码此浏览器暂不支持"。
|
||
- [ ] 打开剪辑器进入已含画布产物(selected+ready 的 storyboard/action_board/分镜/导出成片)的项目:素材自动并入"项目素材"组展示(不再单列"画布素材"分组/页签/来源徽章),再次进入/刷新不产生重复素材。
|
||
- [ ] 项目素材库页与剪辑器素材面板对本轮新同步的画布素材均可见;下载/删除画布素材不影响对应画布产物资源。
|
||
|
||
## 管理后台用户彻底删除(硬删,2026-09-06)
|
||
|
||
已实施,后端 go build/vet/test 与前端改动文件 tsc 通过,需浏览器最终确认:
|
||
|
||
- [ ] /admin/users 操作列出现「删除用户」(垃圾桶图标、红色、二次确认);当前登录管理员(自己)行内该按钮置灰不可点。
|
||
- [ ] 删除 `cdptest`(disabled、无任务/项目/素材、仅 1 条赠送积分流水,本地库唯一无内容用户):确认弹窗点「彻底删除」后行从列表移除、总数减一、若打开着详情抽屉则自动关闭;列表搜索/筛选后不再出现该用户。
|
||
- [ ] 对 `yorkchiu`(有任务/项目/素材等业务内容)点删除:提示「该用户仍有任务/项目/素材等业务数据,无法彻底删除,请先清理相关内容或改用停用」,用户未被删除。
|
||
- [ ] 对存在 billing_orders/payment_orders 的用户(生产真实付款场景)点删除:提示「该用户存在资金流水/账单数据,无法彻底删除,请改用停用」。
|
||
- [ ] 删除后审计事件落库(audit-events 页签可见 user.purge);DB 中 users 行及 auth_sessions/user_identities 等关联行已物理清除。
|
||
- [ ] 既有「停用/重新启用」语义未受影响:停用入口仍走 DELETE /admin/users/:id(保留用户主体),重新启用可用。
|
||
## 画布默认框选与移动期性能优化
|
||
|
||
- [x] 默认工具改为“区域选择”;空白处左键拖动框选,抓手工具拖动平移。Space + 左键、中键和触控板双指手势保留为导航路径;专项测试、类型检查和生产构建通过。
|
||
- [x] 框选移动期只通过 Leafer 选区与 DOM 差量标记预览命中节点,不再逐帧提交 React `selectedNodeIds`;抬手使用最终指针坐标计算并只提交一次。
|
||
- [x] 可选节点空间索引按不可变节点数组引用缓存;折叠画框子节点和未展开批次子节点继续排除。50k 节点空间索引回归测试通过。
|
||
- [x] 登录态真实项目浏览器确认:默认区域选择为激活状态,左键框选不移动视口;抓手工具可平移;区域选择激活时滚动手势继续平移画布。
|
||
- [ ] 使用真实 MacBook 触控板复测双指横向/纵向滑动、捏合缩放及 Space + 左键临时抓手,并在 500、2000、5000 个可见节点画布记录连续框选帧率和输入延迟。
|
||
|
||
## BoardUI 吸收落地:AI 助手工作态/发送态动效(2026-09-06)
|
||
|
||
已实施,改动文件 tsc 零错误 + Vite dev 模块编译 200,需浏览器视觉验收:
|
||
|
||
- [ ] 打开画布 AI 助手面板(本地 Agent / 云端助手)触发生成:顶部状态区显示 3×3 对角波光点阵指示器 + 阶段文案 + 秒数计时(替代原打字机“正在推演…”);点阵节奏流畅不刺眼,与画布主题明暗模式均协调。
|
||
- [ ] 发送消息后输入胶囊出现主题色呼吸光环(1.6s 周期透明/亮起循环),回复到达后消失;光环不遮挡输入与按钮点击(pointer-events 透传)。
|
||
- [ ] 系统开启“减弱动态效果(prefers-reduced-motion)”时:点阵静止为静态帧、无计时闪烁感、胶囊无光环;无 console 报错。
|
||
- [ ] 快速连续发送/取消多次无 setState-after-unmount、无定时器泄漏(Console 无告警);长时间等待秒数计时平滑(tabular-nums 不跳动)。
|
||
- [ ] 后台运营健康卡(/admin 分析页)活跃用户/生成任务/服务质量三卡数值刷新时平滑滚动;系统减弱动效时直接跳变不滚动。
|
||
|
||
## 首页创作入口收敛:单会话承载分镜(2026-09-06)
|
||
|
||
决策:删除顶部「连续对话 / 镜头创作」双模式切换与独立分镜工作台;单一对话消息流承载一切创作,视频消息自动按发送顺序编号为镜头(镜头轨道),右上角「镜头时间线」抽屉按镜跳转回看。已实施(tsc 零错误 + Vite 模块编译 200,CSS 死样式已清理),需浏览器验收:
|
||
|
||
- [ ] 顶栏不再出现「连续对话/镜头创作」切换;只有一个对话入口(新建/历史按钮保留在右侧)。
|
||
- [ ] 空会话(无历史)时提示「发送一条视频消息自动成为第 1 镜」,入口自然无模式概念。
|
||
- [ ] 连续发送两条视频消息:用户消息依次带「镜 1」「镜 2」徽标;同 mode 的视频生成结果也带对应镜号徽标,且镜头顺序与发送顺序一致。
|
||
- [ ] 视频生成中(pending)消息流显示进行中提示;完成后显示视频 + 镜号徽标 +「生成同款」按钮,失败可重试。
|
||
- [ ] 点击顶栏「镜头时间线」:下拉列出全部镜头(镜号 + 用户提示 + 完成/生成中/失败/待生成状态),点击任意镜头平滑滚动到该消息锚点;空轨道显示引导文案。
|
||
- [ ] 下拉点击镜头后自动关闭;点击外部区域可关闭下拉。
|
||
- [ ] 时间线列表镜头状态随消息流刷新(生成中→完成)实时更新;生成失败的镜头状态为「生成失败」红色标记。
|
||
- [ ] 新建/历史/重试/生成同款在收敛后行为与原来一致;无 console 报错;切主题/切窗口尺寸(窄屏 rail 下拉不溢出)正常。
|
||
|
||
(注:上一版「分镜模式计划路线胶囊 + 活动行」验收项已随分镜独立工作台删除而移除——收敛后视频等待提示由消息流内进行中文案承担。)
|
||
|
||
## 创作页通知中心(2026-09-06,已于当日移除——见文末「移除页面级任务通知按钮」)
|
||
|
||
决策:铃铛入口 + 通知面板,从当前 `CreationConversation.messages` 状态迁移推导任务完成/失败通知(无新后端、无新类型);空态顶部与多轮会话工具栏两处均可进入同一面板;未读计数徽标 + 全部已读 + 点击通知定位到所属会话消息。已实施(tsc 零错误),需浏览器验收:
|
||
|
||
- [ ] 空会话顶部与多轮会话右上角工具栏均有铃铛入口;存在未读时铃铛显示红色数字徽标,全部已读后徽标消失。
|
||
- [ ] 发送文本/图片/视频任一生成任务,任务完成(或失败)后通知面板出现对应行(状态小点 + 生成类型/文案 + 时间),行序新→旧。
|
||
- [ ] 生成进行中的任务不在面板出现“完成”行;失败任务行呈错误态文案与颜色。
|
||
- [ ] 「全部已读」后所有行标记已读、铃铛计数清零;单行读状态随点击/已读动作变化。
|
||
- [ ] 点击通知行:若该会话当前未打开则切换打开对应会话,并滚动定位到涉及的那条消息;面板随之关闭。
|
||
- [ ] 通知来源跨会话:多个历史会话各自完成的任务都能汇总到同一面板;删除会话后其通知不再出现。
|
||
- [ ] 无任何通知(从未生成过或全部已读且清空)时面板显示「暂无新通知」空态,无伪造行。
|
||
- [ ] 面板开合、点击外部关闭、明暗主题切换均正常;无 console 报错。
|
||
|
||
## 首页图标撞车与布局统一(2026-09-06)
|
||
|
||
决策:顶栏全局公告中心保留 Bell(系统公告语义);创作页任务通知图标由 Bell 改为 ClipboardList(任务清单语义),消除同屏「双铃铛」;空态右上操作组中任务按钮与历史按钮统一为同一规格(36px、同底色、同 hover 抬起),多轮态工具栏内任务按钮与相邻工具栏按钮规格本就一致。已实施(tsc 零错误),需浏览器验收:
|
||
|
||
- [ ] 首页(创作页)任意状态:右上区域不再出现两枚相同铃铛——顶栏公告为 Bell,页面任务通知为 ClipboardList(任务清单图标)。
|
||
- [ ] 空态页右上仅一枚「历史」按钮:32px 幽灵透明底、hover 同底色、focus-visible 描边;任务通知入口已移除、无残留。
|
||
- [ ] 多轮会话工具栏右侧为「新建/历史」按钮,形态一致(32px 透明、hover 同底色),与顶栏公告铃铛语义可区分。
|
||
- [ ] 明暗主题切换后按钮组配色跟随语义 token 变化,无突兀色块。
|
||
|
||
## hero 主卡去彩色外框 + 用户消息右侧气泡(2026-09-06,对齐 boardui)
|
||
|
||
决策:①空态 hero 主卡原以 accent34%/62% 混色外框强调,观感像多余描边线——改为中性 `creation-border`(hover `border-strong` + accent 柔阴影上浮),强调由右上光晕承担,消除「外框线」感;②消息区用户消息原与 AI 同为左侧无气泡长块,无对话主客节奏——改为右侧气泡列(整列 flex-end + margin-left auto、正文 fit-content 气泡 `accent10% over surface`、`r-lg` 圆角右下小角),meta/附件/引用随列右置,与左侧 AI 文本流对称。纯 CSS 改造,JSX 未动。tsc + bun run build 通过,需浏览器验收:
|
||
|
||
- [ ] 空态页:hero 主卡外框为极淡中性细线(明暗主题各验),不再有明显彩色描边;hover 仅轻提 + 柔影,无生硬变色;右上光晕仍在。
|
||
- [ ] 会话态发一条消息:用户正文呈右侧圆角气泡(右下小角),时间戳/复制钮/引用随气泡右对齐;AI 回复仍在左侧无气泡文本流,两侧形成对称对话节奏。
|
||
- [ ] 长用户消息不破版:气泡 max-width 86% 内换行;附件/引用 chips 右置不溢出。
|
||
- [ ] 明暗主题切换:气泡底色(accent 10% over surface)在两种主题下都清晰可辨、不过浓。
|
||
|
||
## 会话工具栏视觉统一重构(2026-09-06,幽灵按钮)
|
||
|
||
决策:创作页会话态工具栏与空态右上操作钮统一为一套「全透明幽灵按钮」规范——32px 高、透明底、muted 灰、hover 才显 surface-hover 底色、focus-visible accent 描边、图标与文字同用 caption 字号/space-4 尺寸;镜头计数胶囊仅在有镜头时显示(无镜头不再显示孤零零的 0),计数徽标为 accent 小胶囊(底色 14% mix、tabular-nums)。已实施(tsc 零错误),需浏览器验收:
|
||
|
||
- [ ] 会话工具栏左侧「镜头时间线」按钮:无边框透明底、hover 出现浅灰底;有分镜时右侧显示 accent 色计数胶囊,无分镜时按钮后不再出现「0」胶囊。
|
||
- [ ] 会话工具栏右侧新建/历史两按钮:同为 32px 透明幽灵、hover 同底色,间距均匀。
|
||
- [ ] 空态右上「历史」与多轮态工具栏按钮视觉同源(同高、同圆角、同 hover、同 focus 描边)。
|
||
- [ ] 空态与工具栏按钮 hover、focus 三态在明暗主题下均可辨识,图标不与文字基线错位。
|
||
- [ ] 移动端窄屏时空态按钮组仍等大(40px 触摸目标)。
|
||
|
||
## 首页空态卡列与输入框对齐、图标瓦片统一(2026-09-06)
|
||
|
||
决策:空态「推荐区(hero 主卡 + 快捷卡)」由 920px 收窄为 820px,与艺术横幅、输入框两端完全对齐;卡内图标瓦片从 36px/r-sm/纯文字色改为与输入框「参考」按钮同源规格——34px、r-md 圆角、creation-border 边框 + surface-muted 浅底 + muted 图标色、icon 16px/2px 描边,hover 卡片时瓦片亮起,暗色主题有独立适配;输入框参考按钮圆角 9px 同步 token 化为 var(--r-md)。已实施(tsc 零错误),需浏览器验收:
|
||
|
||
- [ ] 空态页艺术横幅、输入框、「推荐卡」左右边缘完全对齐(同一中轴 820px 列),不再出现卡宽于输入框的情况。
|
||
- [ ] hero 主卡图标瓦片与下方三张快捷卡瓦片大小一致(34px/icon16px)、配色一致(同边框同浅底同 muted 灰),与输入框内「参考」按钮视觉同源。
|
||
- [ ] 悬停任意卡片时瓦片边框/底色/图标色同步亮起;明暗主题切换后瓦片与卡列配色正常(暗色有 rgba 适配不刺眼)。
|
||
- [ ] 主卡与小卡靠主卡 accent 边框与文案层级区分主次,不再靠瓦片尺寸/颜色差异。
|
||
- [ ] 窄屏(<860px)下推荐卡与输入框同步退化为单列自适应,两端仍对齐。
|
||
|
||
## 移除页面级任务通知按钮(2026-09-06)
|
||
|
||
决策:创作页右上「任务通知」按钮(ClipboardList + 未读徽标 + 通知面板)整体移除——任务成败已由会话流内联状态与镜头时间线承担,跨会话查看由「历史对话」抽屉承担,页面级入口冗余。删除范围:CreationNotificationBell 组件、通知推导状态与扫描逻辑、creation-bell-* 全部样式、空态与工具栏两处挂载;顶栏系统公告铃铛(全局)保留。已实施(tsc 零错误),需浏览器验收:
|
||
|
||
- [ ] 空态页右上仅剩「历史」一枚按钮;多轮会话工具栏右侧仅「新建」「历史」;无 ClipboardList 残留图标。
|
||
- [ ] 无任务通知相关 console 报错;生成任务成败仍以消息流内联状态与镜头时间线呈现。
|
||
- [ ] 顶栏系统公告铃铛(红点)不受影响,与页面级入口不再混淆。
|
||
|
||
## 历史对话抽屉:行操作菜单 v2 + 行内重命名 + 时间让位(2026-09-06)
|
||
|
||
v2(用户反馈首版难看后重做):菜单改用 antd Dropdown(placement=bottomRight 自动翻转防溢出、全局 token 化浮层明暗自适应),菜单项纯文字无图标(重命名 / 删除对话[红]),对齐 boardui agent-chat-history 的「纯文字菜单项」形态;行尾时间改为**共槽让位**:普通态仅显示相对时间(刚刚/n 分钟前/n 小时前/n 天前,>7 天回退「M月D日」),hover/键盘聚焦时时间淡出、同一位置浮现 26px「⋯」按钮(永不共显);模式标签下沉到摘要行前缀(chip→文字微标签);选中态 = 行底色 9% + hover 升 14%(对齐 boardui hover 即预览选中);删除仍走确认弹窗;行内重命名改为无边框透明输入(hover 底色容器),自动聚焦全选、Enter 提交 / Esc 还原 / blur 提交、空标题不提交、120 字上限并持久化。旧版自制浮层 CSS 全部清除。样式全 token 化 + color-mix 明暗自适应 + prefers-reduced-motion 降级 + 触屏常显「⋯」。tsc 零错误,需浏览器验收:
|
||
|
||
- [ ] 打开历史抽屉:普通态行尾只显示相对时间(简洁);hover 行时时间淡出、「⋯」浮现(26px);键盘 Tab 聚焦「⋯」按钮直接可见;触屏设备「⋯」常显。
|
||
- [ ] 点击「⋯」:antd 浮层下拉含「重命名」「删除对话」(删除红字),明暗主题下浮层背景/圆角/阴影与全局一致;点击外部或按 Esc 关闭;底部行开菜单浮层自动向上翻转不溢出抽屉。
|
||
- [ ] 行内重命名:标题变透明输入框(自动聚焦全选);Enter 提交生效并持久化(刷新仍为新标题)、Esc 还原、点击别处 blur 提交;空标题不提交。
|
||
- [ ] 删除走确认弹窗,确认后该行消失;重命名/删除后排序与分组不变;选中行底色可辨。
|
||
- [ ] 明暗主题均无图标错位/文字重叠;无 console 报错。
|
||
|
||
|
||
## AI 消息代码块外壳 B1(2026-09-06)
|
||
|
||
自研代码块渲染组件 AiMessageCodeBlock(components/ai/ai-message-code-block.tsx,替换 streamdown components.pre 映射,全站消息统一受益):顶部 34px 工具条 = 左侧语言标签(取自 language-*,未知显示 code,小号大写等宽)+ 右侧复制按钮(复制成功反馈「已复制」1.6s);正文滚动容器保留;圆角/边框/底色走 token + color-mix 明暗自适应(容器 r-md、5% 前景底、11% 边框),pre 内透明继承;prefers-reduced-motion 关闭过渡。语法高亮暂缓(调研发现 streamdown@2.5.0 运行时不消费 @streamdown/code 插件,方案待定)。tsc 零错误,需浏览器验收:
|
||
|
||
- [ ] 让 AI 回复含多行代码(如 markdown 围栏 ```ts```):代码块顶部有语言标签 + 复制按钮,点复制后变「已复制」,粘贴内容正确(不含语言标记行)。
|
||
- [ ] 代码块圆角/边框/底色在明暗主题均可辨;长代码横向滚动不破版;流式输出中代码块容器稳定不跳动、复制按钮可用。
|
||
- [ ] 消息中的行内代码(如 `const x`)样式不受影响;画布 Agent 消息里的代码块同样获得新外壳。
|