{ "$schema": "本文件为 T8-penguin-canvas 节点清单防丢失锁,任何节点删减都需要在 roadmap.md 中说明并更新本文件。", "version": "2.5.0", "lastUpdated": "2026-07-10-v250-route-jimeng-ps-batch-release", "electronReleaseV250": { "version": "2.5.0", "status": "electron-release", "date": "2026-07-10", "description": "v2.5.0 Electron 自动更新版:收口随机路由并发执行、即梦 CLI v1.4.10 图像批量与 Seedance 新模型/分辨率、批量打标图图入口与输出路径查看、以及 Photoshop 画布发送队列和插件资产渲染。", "highlights": [ "随机路由节点新增 executionMode / randomRouteExecutionMode,支持并发生成和顺序生成;默认并发触发本次随机命中的多路下游,未命中分支继续不进入运行队列。", "即梦 CLI 图像生成支持 text2image / image2image 的 generate_num 参数,一次生成 1-10 张图;参数可从 providerParams.generate_num、generateNum 或 n 传入并做 1-10 限制。", "即梦 CLI 视频模型兼容 Seedance 2.0 mini、seedance2.0_vip 4K、Seedance 1.5 Pro / 1.0 Fast / 1.0 新命名,并保留旧 3.x Web 命名别名映射。", "批量打标节点新增图图打标器入口、最近打标文件定位和全部输出绝对路径查看;顶部独立“图图打标器”卡片也可打开 https://zhaotutu.xyz。", "批量打标输出目录打开逻辑从“打开旧 batch-tags 目录”改为优先定位最近生成文件,浏览器授权目录和上传副本目录会给出明确提示。", "画布素材右键“发送到 Photoshop”改为调用后端 /api/photoshop-bridge/send-to-photoshop 队列,前端提示用户查看 PS 面板置入状态。", "Photoshop bridge 状态接口返回 canvasFrontendUrl,PS 插件“打开 T8 画布”使用前端地址而不是后端 API 端口;资产缩略图改用 UXP 可渲染的数据源。", "PS 插件 placeImage 只在 Photoshop 确认新增图层后上报完成,避免画布显示发送成功但 PS 没有置入图像。", "Electron 后置打包继续校验 resources/tools/photoshop-bridge/plugin,确保新版 PS 插件源码随自动更新包分发。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "electron/_post_build.cjs", "backend/src/config.js", "backend/src/providers/jimengCli.js", "backend/src/providers/registry.js", "backend/src/routes/batchTags.js", "backend/src/routes/files.js", "backend/src/routes/photoshopBridge.js", "backend/src/server.js", "features.json", "README.md", "release-notes/v2.5.0.md", "src/App.tsx", "src/components/ApiSettings.tsx", "src/components/Canvas.tsx", "src/components/MaterialContextMenu.tsx", "src/components/nodes/BatchTaggerNode.tsx", "src/components/nodes/ImageNode.tsx", "src/components/nodes/RandomRouteNode.tsx", "src/components/nodes/VideoNode.tsx", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/services/api.ts", "src/services/imageOps.ts", "src/styles/index.css", "src/types/canvas.ts", "src/utils/advancedProviders.ts", "src/utils/randomRoute.ts", "src/utils/topologicalSort.ts", "tests/advancedProviderFrontend.test.ts", "tests/advancedProviders.test.ts", "tests/batchTagger.test.ts", "tests/canvasTutorialPluginInstall.test.ts", "tests/jimengCliProvider.test.ts", "tests/mediaMaterialDeleteUi.test.ts", "tests/photoshopBridge.test.ts", "tests/randomRoute.test.ts", "tools/photoshop-bridge/plugin/manifest.json", "tools/photoshop-bridge/plugin/index.html", "tools/photoshop-bridge/plugin/style.css", "tools/photoshop-bridge/plugin/js/boot.js", "tools/photoshop-bridge/plugin/js/state.js", "tools/photoshop-bridge/plugin/js/net.js", "tools/photoshop-bridge/plugin/js/ps.js", "tools/photoshop-bridge/plugin/js/app.js" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.5.0 npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.5.0.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.5.0.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.5.0 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.5.0", "photoshopPlugin": "Electron extraResources 会复制 tools/photoshop-bridge 到 resources/tools/photoshop-bridge;v2.5.0 后置与发布校验确认 plugin/manifest.json、index.html、style.css、boot/state/net/ps/app 脚本均在包内。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、nodemap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "飞书多维表格本轮仍是规划 / 实验内容,不纳入 v2.5.0 公开提交和 Electron 发布;backend/src/routes/feishuBitable.js、src/components/nodes/FeishuBitable*、tests/feishuBitable.test.ts 等未跟踪文件不得 stage。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从本地发布工作区打包这些 sidecar。", "Photoshop UXP 插件源码 tools/photoshop-bridge/plugin/** 继续允许公开提交;本轮必须在 Electron 安装包内完成资源存在性校验。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。" ], "verification": [ "node --test --test-reporter=dot tests\\randomRoute.test.ts tests\\jimengCliProvider.test.ts tests\\batchTagger.test.ts tests\\canvasTutorialPluginInstall.test.ts tests\\photoshopBridge.test.ts tests\\advancedProviders.test.ts tests\\advancedProviderFrontend.test.ts tests\\mediaMaterialDeleteUi.test.ts tests\\directorStoryboard.test.ts tests\\videoOpsIntegration.test.cjs tests\\videoEditNode.test.ts tests\\videoEditTimeline.test.ts", "node -c backend\\src\\providers\\jimengCli.js", "node -c backend\\src\\providers\\registry.js", "node -c backend\\src\\routes\\batchTags.js", "node -c backend\\src\\routes\\files.js", "node -c backend\\src\\routes\\photoshopBridge.js", "node -c backend\\src\\routes\\videoOps.js", "node -c backend\\src\\server.js", "node -c electron\\_post_build.cjs", "node -c electron\\main.cjs", "node -c electron\\preload.cjs", "node -c tools\\photoshop-bridge\\plugin\\js\\boot.js", "node -c tools\\photoshop-bridge\\plugin\\js\\state.js", "node -c tools\\photoshop-bridge\\plugin\\js\\net.js", "node -c tools\\photoshop-bridge\\plugin\\js\\ps.js", "node -c tools\\photoshop-bridge\\plugin\\js\\app.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8')); JSON.parse(require('fs').readFileSync('tools/photoshop-bridge/plugin/manifest.json','utf8'))\"", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.5.0 npm run dist:release", "npm run release:verify -- v2.5.0" ] }, "electronReleaseV249": { "version": "2.4.9", "status": "electron-release", "date": "2026-07-10", "description": "v2.4.9 Electron 自动更新维护版:修复视频剪辑转场后源视频音频错位、重叠和尾段无声问题,并给导演分镜台补齐 seedance-2.0-mini 模型;Electron 打包继续校验 Photoshop 插件随包分发。", "highlights": [ "视频剪辑合成不再把已绑定源视频的音频拆出来按旧 timeline 位置二次混音,避免拖动片段后再加转场导致声音重叠或位移。", "源视频原声会跟随 xfade / acrossfade 后的真实片段时长进入合成,转场压缩时间线后尾段仍保持可听。", "独立音频轨和 BGM 仍会在最终阶段叠加到保留的源视频原声上,不覆盖原始视频声音。", "新增真实 ffmpeg 回归测试,构造两段带不同频率音频的视频并验证 xfade 后第二段尾部仍有声音。", "导演分镜台模型列表新增 seedance-2.0-mini,和 SD2.0 节点的 Seedance 2.0 模型选项保持一致。", "Electron 后置打包继续检查 resources/tools/photoshop-bridge/plugin,确保新版 PS 插件目录随自动更新安装包分发。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "backend/src/routes/videoOps.js", "src/components/nodes/DirectorStoryboardNode.tsx", "features.json", "README.md", "release-notes/v2.4.9.md", "tests/directorStoryboard.test.ts", "tests/videoOpsIntegration.test.cjs", "tools/photoshop-bridge/plugin/manifest.json", "tools/photoshop-bridge/plugin/index.html", "tools/photoshop-bridge/plugin/style.css", "tools/photoshop-bridge/plugin/js/boot.js", "tools/photoshop-bridge/plugin/js/state.js", "tools/photoshop-bridge/plugin/js/net.js", "tools/photoshop-bridge/plugin/js/ps.js", "tools/photoshop-bridge/plugin/js/app.js" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.4.9 npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.4.9.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.4.9.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.4.9 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.4.9", "photoshopPlugin": "Electron extraResources 会复制 tools/photoshop-bridge 到 resources/tools/photoshop-bridge;v2.4.9 继续通过后置与发布校验确认 plugin/manifest.json、index.html、style.css、boot/state/net/ps/app 脚本均在包内。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、nodemap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从本地发布工作区打包这些 sidecar。", "Photoshop UXP 插件源码 tools/photoshop-bridge/plugin/** 继续允许公开提交;本轮无插件源码改动,但必须在 Electron 安装包内完成资源存在性校验。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。" ], "verification": [ "node -c backend\\src\\routes\\videoOps.js", "node --test --test-reporter=dot tests\\directorStoryboard.test.ts tests\\videoOpsIntegration.test.cjs tests\\videoEditNode.test.ts tests\\videoEditTimeline.test.ts tests\\photoshopBridge.test.ts", "node -c electron\\_post_build.cjs", "node -c electron\\main.cjs", "node -c tools\\photoshop-bridge\\plugin\\js\\boot.js", "node -c tools\\photoshop-bridge\\plugin\\js\\state.js", "node -c tools\\photoshop-bridge\\plugin\\js\\net.js", "node -c tools\\photoshop-bridge\\plugin\\js\\ps.js", "node -c tools\\photoshop-bridge\\plugin\\js\\app.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8')); JSON.parse(require('fs').readFileSync('tools/photoshop-bridge/plugin/manifest.json','utf8'))\"", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.4.9 npm run dist:release", "npm run release:verify -- v2.4.9" ] }, "electronReleaseV248": { "version": "2.4.8", "status": "electron-release", "date": "2026-07-08", "description": "v2.4.8 Electron 自动更新版:补齐插件安装入口、批量打标保存与模型体验、视频素材 RH 能力轨、Photoshop 插件 0.1.3 打包校验,并收口 ComfyUI 应用制作工具、IME 输入、聚合解析运行时和视频剪辑临时入口。", "highlights": [ "顶部工具条在“画布教程”左侧新增独立“插件安装”按钮,集中说明 Photoshop UXP、Figma Bridge 与网页图片反推 Chrome 扩展安装路径。", "批量打标节点补齐素材队列单项删除、LLM/Vision 预设模型、自定义模型、ModelScope Qwen3-VL 235B 推荐、统一触发词、TXT/JSON 互斥和原素材目录保存。", "批量打标系统提示词按训练素材输出收口:TAG、描述、短句由顶部打标方式控制,JSON 模式按 Ideogram-4 结构化 caption 输出,不再把 TXT/JSON 写成同一内容。", "上传素材和输出素材在视频类型下新增首尾帧获取、英伟达极速超分、FlashVsr 质量超分按钮,复用 RH 工具箱能力层和持久化 manifest。", "视频剪辑节点临时隐藏“打开剪辑台”按钮,并修复片段选中、短片段时间线预览、浅色 RH 主题按钮像说明文字的问题。", "Photoshop 插件升级到 0.1.3:新增 boot.js 启动诊断、资产分页、搜索输入高度和面板边界护栏,Manifest v5 label 改为 Adobe 示例兼容对象格式。", "Electron 后置打包校验新增 Photoshop plugin/js/boot.js,确保新的 PS 插件诊断脚本随自动更新包一起分发。", "ComfyUI 应用制作工具修复同一配置项重复出现且删除不掉的问题;聚合解析运行时归档解压增加 Node extract-zip 兜底,降低抖音解析“运行时归档解压失败”。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "electron/preload.cjs", "electron/_post_build.cjs", "backend/src/config.js", "backend/src/routes/batchTags.js", "backend/src/routes/files.js", "backend/src/utils/runtimeArchive.js", "scripts/check-rh-toolbox-release.cjs", "features.json", "README.md", "release-notes/v2.4.8.md", "src/App.tsx", "src/components/Canvas.tsx", "src/components/MaterialContextMenu.tsx", "src/components/PromptExpandModal.tsx", "src/components/PromptTextarea.tsx", "src/components/RhVideoCapabilityRail.tsx", "src/components/nodes/BatchTaggerNode.tsx", "src/components/nodes/CodexCliAgentNode.tsx", "src/components/nodes/MentionPromptInput.tsx", "src/components/nodes/OutputNode.tsx", "src/components/nodes/UploadNode.tsx", "src/components/nodes/VideoEditNode.tsx", "src/data/rhToolboxManifest.ts", "src/services/imageOps.ts", "src/services/rhToolboxCapabilities.ts", "src/styles/index.css", "src/styles/theme-rh.css", "src/utils/batchTagger.ts", "src/utils/comfyuiApps.ts", "src/utils/imeComposition.ts", "src/utils/rhToolboxCapabilities.ts", "src/vite-env.d.ts", "tests/batchTagger.test.ts", "tests/canvasTutorialPluginInstall.test.ts", "tests/codexCliAgent.test.ts", "tests/comfyuiProvider.test.ts", "tests/grokOAuthAgent.test.ts", "tests/imeComposition.test.ts", "tests/mediaMaterialDeleteUi.test.ts", "tests/photoshopBridge.test.ts", "tests/promptEditor.test.ts", "tests/rhToolbox.test.ts", "tests/runtimeArchive.test.ts", "tests/themeRegistry.test.ts", "tests/videoEditNode.test.ts", "tools/photoshop-bridge/plugin/manifest.json", "tools/photoshop-bridge/plugin/index.html", "tools/photoshop-bridge/plugin/style.css", "tools/photoshop-bridge/plugin/js/boot.js", "tools/photoshop-bridge/plugin/js/state.js", "tools/photoshop-bridge/plugin/js/net.js", "tools/photoshop-bridge/plugin/js/ps.js", "tools/photoshop-bridge/plugin/js/app.js" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.4.8 npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.4.8.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.4.8.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.4.8 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.4.8", "photoshopPlugin": "Electron extraResources 会复制 tools/photoshop-bridge 到 resources/tools/photoshop-bridge;v2.4.8 后置与发布校验必须确认 plugin/js/boot.js、assetPager、manifest 0.1.3 和 UXP 面板护栏均在包内。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、nodemap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及超过 GitHub 普通 Git 限制的 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从当前本地工作区打包这些 sidecar。", "Photoshop UXP 插件源码 tools/photoshop-bridge/plugin/** 继续允许公开提交;它只连接本机 localhost / 127.0.0.1 的有限端口范围,不包含用户密钥、Cookie、私有计费或远端中转配置。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。" ], "verification": [ "node --test --test-reporter=dot tests\\canvasTutorialPluginInstall.test.ts tests\\batchTagger.test.ts tests\\rhToolbox.test.ts tests\\runtimeArchive.test.ts tests\\videoEditNode.test.ts tests\\mediaMaterialDeleteUi.test.ts tests\\photoshopBridge.test.ts tests\\comfyuiProvider.test.ts tests\\imeComposition.test.ts tests\\promptEditor.test.ts tests\\codexCliAgent.test.ts", "node --test --test-reporter=dot --test-name-pattern \"topbar canvas tutorial panel\" tests\\updateMdRegressions.test.ts", "node -c backend\\src\\routes\\batchTags.js", "node -c backend\\src\\routes\\files.js", "node -c backend\\src\\utils\\runtimeArchive.js", "node -c electron\\_post_build.cjs", "node -c electron\\main.cjs", "node -c electron\\preload.cjs", "node -c tools\\photoshop-bridge\\plugin\\js\\boot.js", "node -c tools\\photoshop-bridge\\plugin\\js\\state.js", "node -c tools\\photoshop-bridge\\plugin\\js\\net.js", "node -c tools\\photoshop-bridge\\plugin\\js\\ps.js", "node -c tools\\photoshop-bridge\\plugin\\js\\app.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8')); JSON.parse(require('fs').readFileSync('tools/photoshop-bridge/plugin/manifest.json','utf8'))\"", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.4.8 npm run dist:release", "npm run release:verify -- v2.4.8" ] }, "electronReleaseV247": { "version": "2.4.7", "status": "electron-release", "date": "2026-07-07", "description": "v2.4.7 Electron 自动更新热修版:继续收口 Photoshop 联动体验,修复 T8 Photoshop Link 面板紧凑宽度下刷新 / 连接按钮文字竖排的问题,并补强插件 UI 自动化覆盖资产库、生成、设置、PS 当前画面上传回 T8 与画布发送到 PS。", "highlights": [ "修复 Photoshop 插件资产页刷新按钮、设置页连接按钮在 430px 宽面板下被挤成竖排的问题。", "插件按钮增加 white-space nowrap、稳定最小宽度和 flex 固定宽度,输入框 / 下拉框允许在同一行内收缩,窄面板下关键操作保持可读。", "Playwright Photoshop 插件 QA 扩展到资产库加载、资产置入 PS、设置页、PS 当前画面上传回 T8、生成 provider/model、生成结果展示、生成后置入 PS 和画布命令队列置入 PS。", "单元测试新增插件中文按钮不换行和紧凑按钮最小宽度护栏。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.4.7.md", "tests/photoshopBridge.test.ts", "tools/photoshop-bridge/plugin/manifest.json", "tools/photoshop-bridge/plugin/style.css" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.4.7 npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.4.7.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.4.7.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.4.7 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.4.7", "photoshopPlugin": "Electron extraResources 会复制 tools/photoshop-bridge 到 resources/tools/photoshop-bridge;v2.4.7 后置与发布校验需要确认 plugin/style.css 带按钮不换行护栏。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及超过 GitHub 普通 Git 限制的 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从当前本地工作区打包这些 sidecar。", "Photoshop UXP 插件源码 tools/photoshop-bridge/plugin/** 继续允许公开提交;它只连接本机 localhost / 127.0.0.1 的有限端口范围,不包含用户密钥、Cookie、私有计费或远端中转配置。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。" ], "verification": [ "node --test --test-reporter=dot tests\\photoshopBridge.test.ts", "node -c backend\\src\\routes\\photoshopBridge.js", "node -c backend\\src\\server.js", "node -c backend\\src\\config.js", "node -c electron\\_post_build.cjs", "node -c tools\\photoshop-bridge\\plugin\\js\\state.js", "node -c tools\\photoshop-bridge\\plugin\\js\\net.js", "node -c tools\\photoshop-bridge\\plugin\\js\\ps.js", "node -c tools\\photoshop-bridge\\plugin\\js\\app.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8')); JSON.parse(require('fs').readFileSync('tools/photoshop-bridge/plugin/manifest.json','utf8'))\"", "Playwright Photoshop 插件 mock UI QA 带 UXP manifest fetch 权限门禁,确认连接、资产 / 生成 / 设置页、PS 当前画面上传、生成结果展示、置入命令完成和无 Agent 页。", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.4.7 npm run dist:release", "npm run release:verify -- v2.4.7" ] }, "electronReleaseV246": { "version": "2.4.6", "status": "electron-release", "date": "2026-07-07", "description": "v2.4.6 Electron 自动更新热修版:修复 T8 Photoshop Link 在 Photoshop UXP Manifest v5 下访问本机 T8 后台被 Permission denied / Manifest entry not found 拦截的问题;插件网络白名单改为带协议和端口的本机 origin,并增加 18766-18776 本机端口 fallback。", "highlights": [ "修复 T8 Photoshop Link 连接 http://127.0.0.1:18766/api/photoshop-bridge/status 时被 UXP manifest 网络权限预检拦截的问题。", "Photoshop 插件 manifest 的 requiredPermissions.network.domains 改为显式允许 http://127.0.0.1:18766-18776 与 http://localhost:18766-18776,并继续禁止 all 权限和远端网络白名单。", "插件连接 T8 后台时会在本机端口范围内 fallback:如果 18766 被旧 node src/server.js 或其他旧后端占用返回 404,会自动尝试后续端口并保存成功端口。", "Photoshop 插件 mock UI QA 增加 UXP manifest fetch 权限门禁模拟,避免浏览器环境误放过真实 Photoshop UXP 才会出现的 Manifest entry not found。", "回归测试新增 manifest 本机端口白名单和 net.connect fallback 断言,锁定用户安装插件后无法连接的真实场景。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.4.6.md", "tests/photoshopBridge.test.ts", "tools/photoshop-bridge/plugin/manifest.json", "tools/photoshop-bridge/plugin/js/net.js" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.4.6 npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.4.6.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.4.6.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.4.6 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.4.6", "photoshopPlugin": "Electron extraResources 会复制 tools/photoshop-bridge 到 resources/tools/photoshop-bridge;v2.4.6 后置与发布校验需要确认 plugin/manifest.json 带本机端口白名单、js/net.js 带 fallback 逻辑。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及超过 GitHub 普通 Git 限制的 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从当前本地工作区打包这些 sidecar。", "Photoshop UXP 插件源码 tools/photoshop-bridge/plugin/** 继续允许公开提交;它只连接本机 localhost / 127.0.0.1 的有限端口范围,不包含用户密钥、Cookie、私有计费或远端中转配置。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。" ], "verification": [ "TDD 红灯:node --test --test-reporter=dot tests\\photoshopBridge.test.ts 先失败于 manifest 缺 http://127.0.0.1:18767 与 net.connect 未 fallback。", "node --test --test-reporter=dot tests\\photoshopBridge.test.ts", "node -c tools\\photoshop-bridge\\plugin\\js\\state.js", "node -c tools\\photoshop-bridge\\plugin\\js\\net.js", "node -c tools\\photoshop-bridge\\plugin\\js\\ps.js", "node -c tools\\photoshop-bridge\\plugin\\js\\app.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8')); JSON.parse(require('fs').readFileSync('tools/photoshop-bridge/plugin/manifest.json','utf8'))\"", "当前源码临时后端端口 18991 冒烟:/api/photoshop-bridge/status 返回 service=t8-photoshop-bridge,/api/photoshop-bridge/image-providers 返回脱敏 provider 列表。", "Playwright Photoshop 插件 mock UI QA 带 UXP manifest fetch 权限门禁,确认连接、资产 / 生成 / 设置页、生成结果展示、置入命令完成和无 Agent 页。", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.4.6 npm run dist:release", "npm run release:verify -- v2.4.6" ] }, "electronReleaseV245": { "version": "2.4.5", "status": "electron-release", "date": "2026-07-07", "description": "v2.4.5 Electron 自动更新版:新增 Photoshop UXP 联动插件与 /api/photoshop-bridge 本机桥接,支持 PS 图层回传画布、画布图像发送到 Photoshop、插件内资产浏览和扩展 API 图像生成 / 编辑;同时修复随机路由透传素材时误自动生成独立输出素材节点。", "highlights": [ "新增 T8 Photoshop Link UXP 插件,Electron 包会携带 resources/tools/photoshop-bridge/plugin,用户可用 Adobe UXP Developer Tool 导入 manifest.json。", "后端新增 /api/photoshop-bridge,提供状态、资产库、扩展图像 provider 列表、PS base64 上传、PS->画布消息队列、画布->PS 命令队列和插件内图像生成 / 编辑接口。", "发送素材弹窗新增“发送到 Photoshop”,只接收图像素材,成功后进入本机命令队列并由 PS 面板自动置入当前文档。", "Photoshop 面板保留资产、生成、设置三个页签;资产页浏览最近输出 / 上传素材 / 资源库图像,生成页复用 T8 扩展 API 图像模型并支持当前图层参考图编辑。", "PS->画布和画布->PS 队列均有 in-flight、complete、fail、lease 和重试,避免生成或置入过程中断后任务丢失。", "Electron 后置检查新增 backend-enc/routes/photoshopBridge.t8c 与 Photoshop 插件静态文件检查,自动更新包不会漏带 PS 联动能力。", "随机路由作为透传节点时加入 auto-output 跳过列表,并清理旧版本自动生成的未移动 output-auto 节点,避免后面已有生成节点时额外弹出输入素材输出节点。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "backend/src/server.js", "backend/src/routes/photoshopBridge.js", "electron/_post_build.cjs", "features.json", "README.md", "release-notes/v2.4.5.md", "src/components/Canvas.tsx", "src/components/SendMaterialsModal.tsx", "src/services/api.ts", "src/utils/photoshopBridge.ts", "tests/photoshopBridge.test.ts", "tests/randomRoute.test.ts", "tools/photoshop-bridge/plugin/manifest.json", "tools/photoshop-bridge/plugin/index.html", "tools/photoshop-bridge/plugin/style.css", "tools/photoshop-bridge/plugin/js/state.js", "tools/photoshop-bridge/plugin/js/net.js", "tools/photoshop-bridge/plugin/js/ps.js", "tools/photoshop-bridge/plugin/js/app.js" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.4.5 npm run dist:release(本轮来自用户明确发布授权)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.4.5.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.4.5.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.4.5 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.4.5", "photoshopPlugin": "Electron extraResources 会复制 tools/photoshop-bridge 到 resources/tools/photoshop-bridge;后置脚本校验 plugin/manifest.json、index.html、style.css、js/state.js、js/net.js、js/ps.js、js/app.js。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及超过 GitHub 普通 Git 限制的 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从当前本地工作区打包这些 sidecar。", "Photoshop UXP 插件源码 tools/photoshop-bridge/plugin/** 是本轮公开发布范围;它只连接本机 localhost / 127.0.0.1,不包含用户密钥、Cookie、私有计费或远端中转配置。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "2026-07-07 R525 正式发布授权:本轮来自用户明确要求更新 skill.md / features.json、推送 GitHub、打包 Electron、发布自动更新新版 Release,并注意把新的 PS 插件打包进去,允许设置 T8_RELEASE_APPROVAL=release-2.4.5。" ], "verification": [ "node --test --test-reporter=dot tests\\photoshopBridge.test.ts tests\\randomRoute.test.ts tests\\updateMdRegressions.test.ts", "node -c backend\\src\\routes\\photoshopBridge.js", "node -c backend\\src\\server.js", "node -c backend\\src\\config.js", "node -c electron\\_post_build.cjs", "node -c tools\\photoshop-bridge\\plugin\\js\\state.js", "node -c tools\\photoshop-bridge\\plugin\\js\\net.js", "node -c tools\\photoshop-bridge\\plugin\\js\\ps.js", "node -c tools\\photoshop-bridge\\plugin\\js\\app.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8')); JSON.parse(require('fs').readFileSync('tools/photoshop-bridge/plugin/manifest.json','utf8'))\"", "Playwright mock 检查 Photoshop 插件资产 / 生成 / 设置页、生成结果展示、置入命令完成和无 Agent 页", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.4.5 npm run dist:release", "npm run release:verify -- v2.4.5" ] }, "electronReleaseV244": { "version": "2.4.4", "status": "electron-release", "date": "2026-07-06", "description": "v2.4.4 Electron 自动更新版:新增随机路由节点,支持 1-100 动态输出口与精确随机命中分支执行;补齐上传多素材打散按钮常显,并修复微信输入法组合输入时 Prompt 多出拼音字母的问题。", "highlights": [ "工具节点新增“随机路由”,左侧接受任意上游素材,右侧按 total_outputs 动态生成 1-100 个输出口。", "random_pass_count 每次运行都会精确随机命中不重复输出口,未命中分支不进入运行队列;支持单节点 RUN、批量运行、组运行和循环器下游链路。", "随机路由会透传文本、图像、视频、音频和 3D 素材字段,命中输出口在节点 UI 内高亮,并记录上次路由结果。", "上传素材节点的合集打散按钮改为常显,上传多个视频、图片或音频后无需悬停也能直接拆成独立素材节点。", "富文本 Prompt 输入框抽出 IME 组合输入保护工具,微信输入法提交中文时会清理前置泄漏拼音,避免图像节点输入框多出英文字母。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.4.4.md", "src/components/Canvas.tsx", "src/components/NodeActionBar.tsx", "src/components/nodes/LoopNode.tsx", "src/components/nodes/MentionPromptInput.tsx", "src/components/nodes/RandomRouteNode.tsx", "src/components/nodes/UploadNode.tsx", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/types/canvas.ts", "src/utils/imeComposition.ts", "src/utils/nodePlacement.ts", "src/utils/randomRoute.ts", "tests/imeComposition.test.ts", "tests/mediaCollection.test.ts", "tests/randomRoute.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.4.4 npm run dist:release(本轮来自用户明确发布授权)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.4.4.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.4.4.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.4.4 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.4.4" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及超过 GitHub 普通 Git 限制的 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从当前本地工作区打包这些 sidecar。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "2026-07-06 R524 正式发布授权:本轮来自用户明确要求更新 skill.md / features.json、推送 GitHub、打包 Electron 并发布自动更新 Release,允许设置 T8_RELEASE_APPROVAL=release-2.4.4。" ], "verification": [ "node --test --test-reporter=dot tests\\randomRoute.test.ts tests\\imeComposition.test.ts tests\\mediaCollection.test.ts", "node -c backend\\src\\config.js", "node -c electron\\_post_build.cjs", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8'))\"", "Playwright 截图检查随机路由 10 输出口 RUN 命中 2 个与 100 输出口布局", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.4.4 npm run dist:release", "npm run release:verify -- v2.4.4" ] }, "electronReleaseV243": { "version": "2.4.3", "status": "electron-release", "date": "2026-07-06", "description": "v2.4.3 Electron 自动更新版:上传素材节点移除 20MB 应用层上传限制,/api/files/upload 不再给 multer 设置 fileSize,上限仅受磁盘、系统和运行环境约束。", "highlights": [ "上传素材节点支持大体积本地图片、视频、音频和通用素材,不再因超过 20MB 显示“请压缩后重试”。", "后端 /api/files/upload 移除 multer limits.fileSize;config.MAX_FILE_SIZE 保留为 0,作为“不设置应用层大小上限”的明确配置语义。", "上传错误处理移除 LIMIT_FILE_SIZE / file_too_large 专用分支,避免继续把大文件误判成 20MB 超限。", "回归测试锁定上传接口不再包含 fileSize 限制、LIMIT_FILE_SIZE、file_too_large 和 20MB 超限文案。", "已做 21MB multipart 实际上传冒烟,接口返回 200 success,并清理测试生成的 input 临时文件。", "Electron 自动更新仍发布 NSIS 安装包、blockmap 与 latest.yml,安装继续使用前台向导。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "backend/src/routes/files.js", "features.json", "README.md", "release-notes/v2.4.3.md", "tests/imageLoadingPerformance.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.4.3 npm run dist:release(本轮来自用户明确发布授权)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.4.3.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.4.3.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.4.3 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.4.3" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及超过 GitHub 普通 Git 限制的 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从当前本地工作区打包这些 sidecar。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "2026-07-06 R523 正式发布授权:本轮来自用户明确要求更新 skill.md / features.json、推送 GitHub、打包 Electron 并发布自动更新 Release,允许设置 T8_RELEASE_APPROVAL=release-2.4.3。" ], "verification": [ "node --test --test-reporter=dot tests\\imageLoadingPerformance.test.ts", "node -c backend\\src\\routes\\files.js", "node -c backend\\src\\config.js", "node -c electron\\_post_build.cjs", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8'))\"", "真实后端上传冒烟:临时端口 POST /api/files/upload 上传 21MB 文件返回 200 success", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.4.3 npm run dist:release", "npm run release:verify -- v2.4.3" ] }, "electronReleaseV242": { "version": "2.4.2", "status": "electron-release", "date": "2026-07-06", "description": "v2.4.2 Electron 自动更新版:新增批量打标节点,支持图像 / 视频批量导入、上游素材收集、TAG / 描述 / 短句 / JSON 打标、txt/json 同名前缀 sidecar 保存,并补齐 ModelScope Qwen3-VL 235B 真实 API 验证与 Electron 打包路由护栏。", "highlights": [ "工具箱新增“批量打标”节点,支持本地多文件、文件夹 webkitdirectory、拖拽和上游 image / video / text prompt 素材进入队列。", "打标模式覆盖 TAG、自然语言描述、短句 caption、标准 JSON 和自定义 Prompt;输出保存到 output/batch-tags,按原素材文件名前缀生成 .txt / .json sidecar。", "后端新增 /api/batch-tags/tag,复用扩展 API provider 与 LLM 多模态 normalizer;视频默认 frames 关键帧抽帧,并保留 URL / Base64 高级模式。", "ModelScope 扩展 API 推荐 Qwen/Qwen3-VL-235B-A22B-Instruct,误选 Qwen/Qwen3-235B-A22B 文本模型时会自动切到 VL 视觉模型。", "节点支持并发 1-4、失败继续、重试失败项、本地停止队列、打开输出目录和节点 outputText / metadata 结果输出。", "已用真实贞贞 LLM 独立 Key与真实 ModelScope Key 验证打标 API;已用 Playwright 截图确认批量打标节点布局无明显溢出。", "Electron 后置检查新增 backend-enc/routes/batchTags.t8c,避免桌面端用户包漏带批量打标后端能力。" ], "releaseFiles": [ ".gitignore", "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "electron/_post_build.cjs", "backend/src/config.js", "backend/src/server.js", "backend/src/routes/batchTags.js", "features.json", "README.md", "release-notes/v2.4.2.md", "src/components/Canvas.tsx", "src/components/NodeActionBar.tsx", "src/components/nodes/BatchTaggerNode.tsx", "src/components/nodes/LoopNode.tsx", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/types/canvas.ts", "src/utils/batchTagger.ts", "src/utils/nodePlacement.ts", "tests/batchTagger.test.ts", "tests/batchProcessor.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.4.2 npm run dist:release(本轮来自用户明确发布授权)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.4.2.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.4.2.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.4.2 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.4.2" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及超过 GitHub 普通 Git 限制的 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从当前本地工作区打包这些 sidecar。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "2026-07-06 R522 正式发布授权:本轮来自用户明确要求更新 skill.md / features.json、推送 GitHub、打包 Electron 并发布自动更新 Release,允许设置 T8_RELEASE_APPROVAL=release-2.4.2。" ], "verification": [ "node --test --test-reporter=dot tests\\batchTagger.test.ts tests\\batchProcessor.test.ts tests\\advancedProviders.test.ts tests\\advancedProviderFrontend.test.ts tests\\llmVideoInput.test.ts", "node -c backend\\src\\routes\\batchTags.js", "node -c backend\\src\\server.js", "node -c electron\\_post_build.cjs", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8'))\"", "真实 API 测试:贞贞 LLM 独立 Key + ModelScope Qwen/Qwen3-VL-235B-A22B-Instruct", "Playwright 截图检查批量打标节点布局", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.4.2 npm run dist:release", "npm run release:verify -- v2.4.2" ] }, "electronReleaseV241": { "version": "2.4.1", "status": "electron-release", "date": "2026-07-05", "description": "v2.4.1 Electron 自动更新版:修复扩展 API 平台 Agnes AI 专用图像编辑字段兼容,imageUrls / imageUrl / image 等别名都会按官方格式进入 extra_body.image,并补齐路由级回归和真实 API 验证。", "highlights": [ "Agnes AI 专用适配器继续使用 /v1/images/generations JSON;图像编辑参考图统一写入 extra_body.image,response_format 统一写入 extra_body.response_format。", "扩展平台图像编辑入口兼容 images、image、imageUrl、image_url、imageUrls、image_urls、referenceImages、reference_images,避免部分入口传图字段不一致导致 Agnes 图生图失败或退化。", "无参考图且请求 b64_json 时才使用 return_base64;不向 Agnes 图生图发送顶层 response_format 或 tags。", "已用真实 Agnes API 验证专用扩展平台文生图与 imageUrls 别名图像编辑均成功返回远端 URL 并转存本地输出。", "新增 Agnes adapter 单测和 /api/proxy/external/image 路由级回归,锁定专用 Agnes 图像编辑请求体。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "backend/src/providers/agnes.js", "features.json", "README.md", "release-notes/v2.4.1.md", "tests/agnesProvider.test.ts", "tests/externalProvidersGenerationRoute.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.4.1 npm run dist:release(本轮来自用户明确发布授权)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.4.1.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.4.1.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.4.1 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.4.1" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及超过 GitHub 普通 Git 限制的 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从当前本地工作区打包这些 sidecar。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "2026-07-05 R521 正式发布授权:本轮来自用户明确要求更新 skill.md / features.json、推送 GitHub、打包 Electron 并发布自动更新 Release,允许设置 T8_RELEASE_APPROVAL=release-2.4.1。" ], "verification": [ "node --test --test-reporter=dot tests\\openaiCompatibleProvider.test.ts tests\\agnesProvider.test.ts tests\\externalProvidersGenerationRoute.test.ts tests\\advancedProviders.test.ts tests\\advancedProviderFrontend.test.ts", "node --test --test-reporter=dot tests\\promptTemplateLibrary.test.ts tests\\generationStopControls.test.ts tests\\imageModelMapping.test.ts tests\\geminiOfficialImageRoute.test.ts tests\\modelUsageHelp.test.ts tests\\resourceLibraryDrawer.test.ts tests\\electronPackaging.test.ts", "node -c backend\\src\\providers\\agnes.js", "node -c backend\\src\\providers\\openaiCompatible.js", "node -c backend\\src\\routes\\externalProviders.js", "node -c backend\\src\\routes\\proxy.js", "node -c backend\\src\\server.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8'))\"", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.4.1 npm run dist:release", "npm run release:verify -- v2.4.1" ] }, "electronReleaseV240": { "version": "2.4.0", "status": "electron-release", "date": "2026-07-05", "description": "v2.4.0 Electron 自动更新版:修复 Agnes 在 OpenAI 兼容配置下图像编辑 503,提示词库 / 素材右键分类弹窗改为 Electron 内联表单,并给图像、视频、SD2.0 节点补齐停止生成。", "highlights": [ "Agnes 专用适配器和 OpenAI 兼容配置 Agnes 均按官方文档走 /v1/images/generations JSON;参考图放入 extra_body.image,response_format 放入 extra_body.response_format,不再误用 /v1/images/edits multipart。", "已用真实 Agnes API 验证文生图与 Data URI 图像编辑两条路径成功返回输出 URL;保留普通 OpenAI 兼容平台带参考图时的 /v1/images/edits multipart 行为。", "提示词库和素材右键菜单不再调用 window.prompt();新增模板分类、资源分类、缺失提示词补录和分类重命名均改为内联表单,避免 Electron 报 prompt() is not supported。", "图像、视频、SD2.0 节点生成中显示停止按钮;停止会取消本地轮询并让旧任务回包失效,用户可立即重新发起新任务,远端已提交任务仍可能自然完成。", "版本号按三段 0-9 规则从 2.3.9 进位到 2.4.0,并继续发布 NSIS 安装包、blockmap 与 latest.yml 自动更新资产。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "backend/src/providers/openaiCompatible.js", "features.json", "README.md", "release-notes/v2.4.0.md", "src/components/MaterialContextMenu.tsx", "src/components/PromptTemplateLibraryModal.tsx", "src/components/nodes/ImageNode.tsx", "src/components/nodes/VideoNode.tsx", "src/components/nodes/SeedanceNode.tsx", "tests/openaiCompatibleProvider.test.ts", "tests/promptTemplateLibrary.test.ts", "tests/generationStopControls.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.4.0 npm run dist:release(本轮来自用户明确发布授权)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.4.0.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.4.0.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.4.0 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.4.0" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及超过 GitHub 普通 Git 限制的 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从当前本地工作区打包这些 sidecar。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "2026-07-05 R520 正式发布授权:本轮来自用户明确要求更新 skill.md / features.json、推送 GitHub、打包 Electron 并发布自动更新 Release,允许设置 T8_RELEASE_APPROVAL=release-2.4.0。" ], "verification": [ "node --test --test-reporter=dot tests\\openaiCompatibleProvider.test.ts tests\\agnesProvider.test.ts tests\\externalProvidersGenerationRoute.test.ts tests\\advancedProviders.test.ts tests\\advancedProviderFrontend.test.ts tests\\promptTemplateLibrary.test.ts tests\\generationStopControls.test.ts", "node --test --test-reporter=dot tests\\imageModelMapping.test.ts tests\\geminiOfficialImageRoute.test.ts tests\\modelUsageHelp.test.ts tests\\resourceLibraryDrawer.test.ts tests\\electronPackaging.test.ts", "node -c backend\\src\\providers\\openaiCompatible.js", "node -c backend\\src\\routes\\proxy.js", "node -c backend\\src\\server.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8'))\"", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.4.0 npm run dist:release", "npm run release:verify -- v2.4.0" ] }, "electronReleaseV239": { "version": "2.3.9", "status": "electron-release", "date": "2026-07-04", "description": "v2.3.9 Electron 自动更新版:补齐 Gemini 官方图像模型 generateContent 链路、OpenAI 兼容 /v1/images/edits、资源库分类本地上传,并发布完整剪辑台宽屏实底体验与 ffprobe/xfade 打包校验。", "highlights": [ "图像节点香蕉2新增 gemini-3.1-flash-lite-image,香蕉 Pro 新增 gemini-3-pro-image;两个精确模型使用 Gemini 官方 /v1/models/{model}:generateContent JSON 格式,旧 nano-banana-pro / 2k / 4k / fal 等模型继续保持原统一图像格式。", "Gemini 官方图像返回解析新增 candidates[].content.parts[].inlineData 支持,并覆盖上游同步转异步任务后 data.data[].url 的 SUCCESS 结果;lite 模型固定提交官方支持的 1K 图像尺寸。", "OpenAI 兼容扩展新增 /v1/images/edits:图像生成带参考图时自动提交 multipart 编辑请求,无参考图继续走 /v1/images/generations;API 设置说明同步补充 edits 端点。", "资源库“我的资产”新增本地上传按钮,用户选择具体分类后可上传本地图像、视频、音频或全景资产到该分类,避免误入全部分类。", "完整视频剪辑台继续收口为 screen-first 宽屏实底布局,补齐 63 个转场、音频曲线、任务失败/取消提示、快捷键安全态和多主题布局验收。", "Electron 打包资源新增 shared/videoTransitions.json 与 ffprobe sidecar,后置检查会验证 ffprobe JSON 探测和 packaged ffmpeg 对 native xfade 转场目录的支持。" ], "releaseFiles": [ "package.json", "package-lock.json", "electron/main.cjs", "electron/_post_build.cjs", "backend/src/config.js", "backend/src/providers/llmMedia.js", "backend/src/providers/openaiCompatible.js", "backend/src/routes/proxy.js", "backend/src/routes/videoOps.js", "features.json", "README.md", "release-notes/v2.3.8.md", "release-notes/v2.3.9.md", "shared/videoTransitions.json", "src/components/ApiSettings.tsx", "src/components/ResourceLibraryDrawer.tsx", "src/components/nodes/VideoEditNode.tsx", "src/config/portTypes.ts", "src/providers/models.ts", "src/services/api.ts", "src/services/videoOps.ts", "src/utils/nodePlacement.ts", "src/utils/videoEdit.ts", "src/utils/videoTimeline.ts", "tests/advancedProviderFrontend.test.ts", "tests/electronPackaging.test.ts", "tests/externalProvidersGenerationRoute.test.ts", "tests/geminiOfficialImageRoute.test.ts", "tests/imageModelMapping.test.ts", "tests/openaiCompatibleProvider.test.ts", "tests/resourceLibraryDrawer.test.ts", "tests/videoEditNode.test.ts", "tests/videoEditTimeline.test.ts", "tests/videoOpsIntegration.test.cjs", "tests/videoTransitions.test.cjs" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.3.9 npm run dist:release(本轮来自用户明确发布授权)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.3.9.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.3.9.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.3.9 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.3.9" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "backend/src/routes/vibex.js、src/components/nodes/RHToolRunnerPanel.tsx、tests/rechargeModalLayer.test.ts、update.md、vibex.zip、本地素材 / 缓存目录以及超过 GitHub 普通 Git 限制的 ffmpeg / ffprobe 本地 sidecar 继续保持未提交;Electron Release 资产从当前本地工作区打包这些 sidecar。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "2026-07-04 R519 正式发布授权:本轮来自用户明确要求更新 skill.md / features.json、推送 GitHub、打包 Electron 并发布自动更新 Release,允许设置 T8_RELEASE_APPROVAL=release-2.3.9。" ], "verification": [ "node --test --test-reporter=dot tests\\imageModelMapping.test.ts tests\\geminiOfficialImageRoute.test.ts tests\\modelUsageHelp.test.ts tests\\openaiCompatibleProvider.test.ts tests\\externalProvidersGenerationRoute.test.ts tests\\resourceLibraryDrawer.test.ts tests\\advancedProviderFrontend.test.ts tests\\electronPackaging.test.ts", "node --test --test-reporter=dot tests\\videoEditNode.test.ts tests\\videoEditTimeline.test.ts tests\\videoOpsIntegration.test.cjs tests\\videoTransitions.test.cjs", "node -c backend\\src\\routes\\proxy.js", "node -c backend\\src\\routes\\videoOps.js", "node -c backend\\src\\server.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8'))\"", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.3.9 npm run dist:release", "npm run release:verify -- v2.3.9" ] }, "electronReleaseV238": { "version": "2.3.8", "status": "electron-release", "date": "2026-06-25", "description": "v2.3.8 Electron 自动更新版:新增高质量视频剪辑核心节点,完善宽屏实底剪辑台、63 个 ffmpeg xfade 转场、跨画布视频追加、ffmpeg 异步合成、批量素材 RH 并发 1-10、教程第十四弹、Gemini 正式模型名与 videoOps 打包校验。", "highlights": [ "新增核心视频剪辑节点:支持多视频上传、上游导入、跨画布追加、单片段预览、缩略图时间线、片段排序、入点/出点裁剪、拆分、转场、滤镜、音频策略和下载成片。", "视频剪辑节点与独立剪辑台改为 screen-first 宽屏实底布局:顶部大屏预览,底部素材篮 / 时间线细剪 / 输出处理三栏 LIST,避免细长高塔和半透明叠层。", "内置 63 个视频转场,其中 62 个为真实 ffmpeg native xfade 转场;合成时使用 xfade + acrossfade,不再用插黑/插白假转场兜底。", "新增 /api/video-ops probe / compose / jobs / cancel,复用打包 ffmpeg 输出 /files/output/video_edit_*.mp4,并支持异步合成进度与取消任务。", "视频剪辑节点输出标准 videoUrl / videoUrls / directVideoUrl / directVideoUrls,可继续连接输出素材节点或其他视频节点。", "发送弹窗新增视频剪辑目标模式,上传素材、输出素材、VibeX 回传和普通视频结果可追加到当前画布或跨画布指定视频剪辑节点。", "批量素材处理 RH 并发下拉扩展到 1-10,继续保持单策略处理和并发状态标记。", "顶部画布教程新增第十四弹,说明 VibeX 联动、增强 Chrome 反推插件、目标框、批量素材处理和大画布性能优化。", "贞贞 API 图像模型名同步 Gemini 正式版:gemini-3-pro-image、gemini-3-pro-image-2k、gemini-3-pro-image-4k、gemini-3.1-flash-image 等去掉 preview 后缀。", "Electron 后置检查新增 backend-enc/routes/videoOps.t8c,避免视频剪辑后端能力在用户包中遗漏。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "electron/_post_build.cjs", "backend/src/config.js", "backend/src/server.js", "backend/src/routes/proxy.js", "backend/src/routes/videoOps.js", "features.json", "README.md", "release-notes/v2.3.8.md", "src/App.tsx", "src/components/Canvas.tsx", "src/components/SendMaterialsModal.tsx", "src/components/nodes/BatchProcessorNode.tsx", "src/components/nodes/VideoEditNode.tsx", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/providers/models.ts", "src/services/videoOps.ts", "src/types/canvas.ts", "src/utils/nodePlacement.ts", "src/utils/sendMaterials.ts", "src/utils/videoEdit.ts", "tests/batchProcessor.test.ts", "tests/imageModelMapping.test.ts", "tests/modelUsageHelp.test.ts", "tests/updateMdRegressions.test.ts", "tests/videoEditNode.test.ts", "tests/videoOpsIntegration.test.cjs" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.3.8 npm run dist:release(仅在用户明确要求发布时使用)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.3.8.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.3.8.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.3.8 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.3.8", "webImageReverseExtensionInstallDir": "安装后从 Electron 安装目录的 resources/extension/web-image-reverse/ 作为 Chrome 加载已解压扩展程序的目录。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "网页图片反推 Chrome 插件源码与 RunningHub/VibeX 桥接脚本继续保持在公开提交内;浏览器已安装状态、真实 API Key 和本地调试数据不进入仓库。", "backend/src/routes/vibex.js 仍为本地 VibeX 静态适配,不进入公开 GitHub 和 Electron 用户包。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "npm run dist:release 与 npm run release:github 默认拒绝执行发布;必须设置 T8_RELEASE_APPROVAL=release-2.3.8,且只能在用户明确要求发布后设置。", "2026-06-25 R517 正式发布:本轮来自用户明确发布授权,允许设置 T8_RELEASE_APPROVAL=release-2.3.8 运行 Electron 打包与 GitHub Release 上传链路。" ], "verification": [ "node --test tests\\videoEditNode.test.ts tests\\videoOpsIntegration.test.cjs tests\\batchProcessor.test.ts tests\\imageModelMapping.test.ts tests\\modelUsageHelp.test.ts tests\\updateMdRegressions.test.ts", "node -c backend\\src\\routes\\videoOps.js", "node -c backend\\src\\routes\\proxy.js", "node -c backend\\src\\server.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8')); JSON.parse(require('fs').readFileSync('package.json','utf8')); JSON.parse(require('fs').readFileSync('package-lock.json','utf8'))\"", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "git diff --cached --check", "T8_RELEASE_APPROVAL=release-2.3.8 npm run dist:release", "npm run release:verify -- v2.3.8" ] }, "videoEditNodeDev": { "version": "2.3.8", "status": "included-in-electron-release", "date": "2026-06-25", "description": "新增核心节点“视频剪辑”:用宽屏实底剪辑台收集多个视频、裁剪排序、缩略图时间线、创作者预设、63 个高质量 xfade 转场、滤镜和音频策略,并通过本地 ffmpeg 合成为标准视频素材。", "highlights": [ "新增 video-edit 节点类型、核心节点注册、video / audio 输入输出端口和 1120x640 宽屏默认尺寸。", "视频剪辑节点后续升级为 1120x640 宽屏节点;独立剪辑台采用顶部大屏 + 底部三栏 LIST deck,覆盖 pixel / rh / farm-story / saint-seiya 全主题实机截图验收。", "视频剪辑节点支持上传多个视频、从上游视频导入、单 video 预览、缩略图时间线、片段拖拽排序、入点 / 出点裁剪、选中片段一键拆分、转场、滤镜、音频策略、下载成片和可选自动创建输出素材节点。", "转场目录沉淀 63 个选项,后端 videoOps 使用 ffmpeg xfade 和音频 acrossfade 输出高质量跨片段转场,并在 Electron 打包中全量校验 shared/videoTransitions.json、ffprobe/ffmpeg sidecar 与每个 native xfade 名称。", "输出预设新增抖音/快手、B站/YouTube、方形社媒、3:4 竖版海报、4:3 横版展示、21:9 电影宽屏、2:1 宽幅/全景;按用户要求不提供 4:5 预设。", "一键模板新增快速混剪、口播混剪、产品展示、前后对比和批量合集,快速套用比例、转场、滤镜和音频策略。", "合成流程改为异步任务:前端显示进度与后端消息,支持取消合成;后端 /api/video-ops/compose 支持 async 模式并通过 jobs 轮询返回结果。", "发送弹窗新增“视频剪辑”模式,视频素材可追加到当前画布或跨画布的指定视频剪辑节点;没有目标时自动新建。", "后端新增 /api/video-ops probe / compose / jobs / cancel,复用打包 ffmpeg,输出 /files/output/video_edit_*.mp4。", "真实 ffmpeg 集成测试覆盖音轨结构不一致的视频拼接、新比例 target size 和异步 compose job 轮询结果,确认会为无音频片段补静音轨后稳定 concat。", "完整剪辑台新增音频淡入淡出与音量曲线:时间线 item、预览、底部音频快控和 ffmpeg timeline audio mix 统一支持 flat / linear-up / linear-down / duck。", "完整剪辑台最终回归补强导出边界:不可合成状态统一显示明确阻断提示,按钮外入口和批量套餐导出不再静默返回,小屏 QA 覆盖空素材提示不遮挡输出面板。", "完整剪辑台最终回归补强任务异常提示和快捷键状态:失败 / 取消 job 会在右侧输出面板内稳定提示,小屏 QA 覆盖失败、取消、空素材和正常布局;忙碌态或快捷键面板打开时编辑类快捷键不会误改时间线。", "完整剪辑台最终总体验收完成:真实浏览器覆盖响应式小屏、异常 job、快捷键输入态、面板态、多选/框选、批量属性、吸附、播放头、裁剪、轨道同步、PIP 拖动和预览效果,关键截图人工复核未发现重叠或布局错位。" ], "files": [ "src/types/canvas.ts", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/utils/nodePlacement.ts", "src/utils/videoEdit.ts", "src/utils/videoTimeline.ts", "src/services/videoOps.ts", "src/components/nodes/VideoEditNode.tsx", "src/components/Canvas.tsx", "src/components/SendMaterialsModal.tsx", "src/utils/sendMaterials.ts", "backend/src/server.js", "backend/src/routes/videoOps.js", "tests/videoEditNode.test.ts", "tests/videoEditTimeline.test.ts", "tests/videoOpsIntegration.test.cjs", "roadmap.md" ], "verification": [ "node --test --test-reporter=dot tests\\videoEditNode.test.ts tests\\videoEditTimeline.test.ts", "node --test --test-reporter=dot --test-name-pattern \"job notices|blocks editing shortcuts\" tests\\videoEditNode.test.ts", "node --test --test-reporter=dot tests\\videoOpsIntegration.test.cjs", "node --test --test-reporter=dot tests\\videoOpsIntegration.test.cjs tests\\videoTransitions.test.cjs", "node --check artifacts\\video-edit-qa\\verify-workbench-responsive.cjs", "node artifacts\\video-edit-qa\\verify-workbench-responsive.cjs", "node artifacts\\video-edit-qa\\verify-workbench-track-item-move.cjs", "node artifacts\\video-edit-qa\\verify-workbench-layout-v7.cjs", "node artifacts\\video-edit-qa\\verify-workbench-playhead-seek.cjs", "node artifacts\\video-edit-qa\\verify-workbench-track-item-trim.cjs", "node artifacts\\video-edit-qa\\verify-workbench-track-sync.cjs", "node artifacts\\video-edit-qa\\verify-workbench-pip-drag.cjs", "node artifacts\\video-edit-qa\\verify-workbench-preview-effects.cjs", "node -c backend\\src\\routes\\videoOps.js", "node -c backend\\src\\server.js", "npm run type-check" ] }, "electronReleaseV237": { "version": "2.3.7", "status": "electron-release", "date": "2026-06-25", "description": "v2.3.7 Electron 自动更新版:修复网页图片反推 Chrome 插件在 Electron 安装包场景下无法直接回传本地画布的问题,并保留生成目标框回填能力。", "highlights": [ "网页图片反推插件发送提示词、图片或图文结果时,会优先通过本机 /api/vibex-bridge/messages 桥接投递给正在运行的 Electron 画布,不再误开 127.0.0.1 错误页。", "插件仍兼容开发环境的浏览器画布标签页注入;当没有可用画布标签页时才回退本地桥接,桥接失败后才尝试打开浏览器画布。", "Electron 画布轮询 VibeX 本地桥接队列时现在同时识别 t8:vibex-result 与 t8:web-image-result,两条链路互不影响。", "网页反推结果进入 Electron 后复用原有生成目标框逻辑:当前选中生成目标框时优先回填图片或提示词,不会只创建普通输出素材节点。", "新增网页反推本地桥接与生成目标框回填回归测试,覆盖 Chrome 插件、后端桥接路由和 Canvas 轮询导入。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.3.7.md", "backend/src/routes/vibexBridge.js", "extension/scripts/background.js", "src/components/Canvas.tsx", "tests/vibexBrowserBridge.test.ts", "tests/webImageReverseToCanvas.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.3.7 npm run dist:release(仅在用户明确要求发布时使用)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.3.7.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.3.7.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.3.7 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.3.7", "webImageReverseExtensionInstallDir": "安装后从 Electron 安装目录的 resources/extension/web-image-reverse/ 作为 Chrome 加载已解压扩展程序的目录。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "网页图片反推 Chrome 插件源码与 RunningHub/VibeX 桥接脚本必须保持在公开提交内:extension/manifest.json、extension/scripts/background.js、extension/scripts/content.js、extension/scripts/runninghub-bridge.js、extension/styles/content.css;浏览器已安装状态、真实 API Key 和本地调试数据不进入仓库。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "npm run dist:release 与 npm run release:github 默认拒绝执行发布;必须设置 T8_RELEASE_APPROVAL=release-2.3.7,且只能在用户明确要求发布后设置。", "2026-06-25 R514 正式发布:本轮来自用户明确发布授权,允许设置 T8_RELEASE_APPROVAL=release-2.3.7 运行 Electron 打包与 GitHub Release 上传链路。" ], "verification": [ "node --test tests\\webImageReverseToCanvas.test.ts tests\\vibexBrowserBridge.test.ts", "node -c extension\\scripts\\background.js", "node -c extension\\scripts\\content.js", "node -c extension\\scripts\\runninghub-bridge.js", "node -c backend\\src\\routes\\vibexBridge.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8'))\"", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "T8_RELEASE_APPROVAL=release-2.3.7 npm run dist:release", "npm run release:verify -- v2.3.7" ] }, "electronReleaseV236": { "version": "2.3.6", "status": "electron-release", "date": "2026-06-25", "description": "v2.3.6 Electron 自动更新版:收口 VibeX 插件安装提示、批量素材处理单策略与并发状态显示、顶部教程第十三弹和左下角模型注意事项更新。", "highlights": [ "VibeX 工作台顶部补充网页图片反推 Chrome 插件的安装目录与步骤说明,提示用户从 Electron 安装目录的 resources/extension/web-image-reverse/ 加载已解压扩展。", "网页图片反推 / RunningHub / VibeX 桥接 Chrome 插件 manifest 版本升级到 1.1.0;Electron 打包继续通过 extraResources 带上 extension/**,post-build 校验 manifest、background、content、runninghub-bridge 和样式文件。", "批量素材处理节点改为一次只启用一种处理策略,避免同时启用抠图、扩图、高清放大后实际链路不清晰。", "批量素材处理素材队列新增等待、处理中、完成和失败状态标记,并发执行时用户可以直接看到当前处理到哪个素材。", "左下角模型注意事项更新:补充 Seedance2.0 mini、原生4K、满血 720P,以及 FAL / Seedance 预扣后多退少补说明。", "顶部画布教程更新到第十三弹,覆盖牧场物语主题、放置栏收缩、图像编辑 Shift 等比例 / 实心图形 / 抠图、网页图片反推插件、历史记录和 Agnes 多模态能力。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.3.6.md", "extension/manifest.json", "extension/scripts/background.js", "extension/scripts/content.js", "extension/scripts/runninghub-bridge.js", "extension/styles/content.css", "src/App.tsx", "src/components/Canvas.tsx", "src/components/nodes/BatchProcessorNode.tsx", "src/components/nodes/VibeXNode.tsx", "src/utils/batchProcessor.ts", "tests/batchProcessor.test.ts", "tests/modelUsageHelp.test.ts", "tests/updateMdRegressions.test.ts", "tests/vibexBrowserBridge.test.ts", "tests/vibexIntegration.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.3.6 npm run dist:release(仅在用户明确要求发布时使用)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.3.6.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.3.6.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.3.6 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.3.6", "webImageReverseExtensionInstallDir": "安装后从 Electron 安装目录的 resources/extension/web-image-reverse/ 作为 Chrome 加载已解压扩展程序的目录。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、vibex/** 本地完整子项目、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "网页图片反推 Chrome 插件源码与 RunningHub/VibeX 桥接脚本必须保持在公开提交内:extension/manifest.json、extension/scripts/background.js、extension/scripts/content.js、extension/scripts/runninghub-bridge.js、extension/styles/content.css;浏览器已安装状态、真实 API Key 和本地调试数据不进入仓库。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "npm run dist:release 与 npm run release:github 默认拒绝执行发布;必须设置 T8_RELEASE_APPROVAL=release-2.3.6,且只能在用户明确要求发布后设置。", "2026-06-25 R513 正式发布:本轮来自用户明确发布授权,允许设置 T8_RELEASE_APPROVAL=release-2.3.6 运行 Electron 打包与 GitHub Release 上传链路。" ], "verification": [ "node --test tests\\vibexIntegration.test.ts tests\\vibexBrowserBridge.test.ts tests\\batchProcessor.test.ts tests\\modelUsageHelp.test.ts tests\\updateMdRegressions.test.ts", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8'))\"", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "T8_RELEASE_APPROVAL=release-2.3.6 npm run dist:release", "npm run release:verify -- v2.3.6" ] }, "electronReleaseV235": { "version": "2.3.5", "status": "electron-release", "date": "2026-06-25", "description": "v2.3.5 Electron 自动更新版:发布 VibeX 工作台与线上/插件回传链路,补齐批量素材处理 RH 能力层并发执行,并为 100+ 节点大画布增加轻量化性能护栏。", "highlights": [ "新增 VibeX 工作台节点:默认嵌入线上 VibeX 页面,支持自适应尺寸、手动缩放、注册 / 切换 RunningHub 入口和新窗口打开。", "Electron 针对 VibeX RunningHub 登录做了专用适配:独立登录窗口、Token 同步、嵌入 iframe 刷新和下拉菜单定位修复,避免登录后又回到未登录态。", "VibeX 线上结果可通过 postMessage 发送回当前画布,T8 会创建文本 / 图像 / 视频 / 音频输出素材节点;Chrome 插件增加 RunningHub 页面桥接脚本,支持网页版 RunningHub/VibeX 把结果转发到本地画布。", "Electron 打包会随安装包带上网页图片反推插件目录 resources/extension/web-image-reverse/,post-build 会校验 manifest、background、content、runninghub-bridge 和样式文件都存在。", "Electron 加密与 post-build 增加线上 VibeX 发布护栏:本地静态适配路由 backend/src/routes/vibex.js 不会被编译进安装包,产物出现 backend-enc/routes/vibex.t8c 会直接阻断发布。", "批量素材处理节点完善 RH 能力层:批量抠图、批量扩图和高清放大全部走 RH 工具箱能力,不再回落到低质量本地处理;支持本地并发、RH 并发、失败重试和失败后继续。", "批量素材处理新增抠图后比例、扩图预设、高清倍率、打开输出文件夹和清晰错误提示,完成后仍只更新本节点结果,不自动把输出素材铺满画布。", "大画布性能优化:生成历史抽屉关闭时只计算轻量计数,导出资源包时再完整收集;大节点量拖动画布 / 拖节点时会隐藏非选中节点的端口、缩放点和悬浮操作条,并暂停非焦点节点动画。", "生成目标框可把框内图像输出给下游并提供下载;上传音频禁止 .m4a 并给出转换提示;SD2.0 / 贞贞 API 补充 doubao-seedance-2.0-mini 与 native4K 分辨率。", "网页图片反推、VibeX 桥接、批量处理、图像编辑标注、清晰文字渲染和大画布性能都补充了对应回归测试。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "electron/_post_build.cjs", "backend/src/config.js", "backend/src/server.js", "backend/src/routes/proxy.js", "backend/src/routes/vibexBridge.js", "features.json", "README.md", "release-notes/v2.3.5.md", "docs/vibex-online-send-to-t8-bridge.js", "docs/vibex-send-to-t8-gallery-button.md", "extension/manifest.json", "extension/scripts/background.js", "extension/scripts/content.js", "extension/scripts/runninghub-bridge.js", "extension/styles/content.css", "src/components/Canvas.tsx", "src/components/CanvasToolbar.tsx", "src/components/LoopingVideo.tsx", "src/components/nodes/BatchProcessorNode.tsx", "src/components/nodes/GenerationTargetNode.tsx", "src/components/nodes/ImageEditModal.tsx", "src/components/nodes/OutputNode.tsx", "src/components/nodes/SeedanceNode.tsx", "src/components/nodes/UploadNode.tsx", "src/components/nodes/VibeXNode.tsx", "src/components/nodes/useUpstreamMaterials.ts", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/services/generation.ts", "src/services/rhToolboxCapabilities.ts", "src/styles/index.css", "src/types/canvas.ts", "src/utils/batchProcessor.ts", "src/utils/canvasCreativeWorkflow.ts", "src/utils/generationHistory.ts", "src/utils/mediaCollection.ts", "src/utils/nodePlacement.ts", "src/utils/uploadMediaValidation.ts", "src/utils/vibexBridge.ts", "tests/advancedProviderFrontend.test.ts", "tests/batchProcessor.test.ts", "tests/canvasCreativeWorkflow.test.ts", "tests/canvasNodeIdDialog.test.ts", "tests/canvasTextRendering.test.ts", "tests/generationHistory.test.ts", "tests/imageEditAnnotationTools.test.ts", "tests/imageLoadingPerformance.test.ts", "tests/rhToolbox.test.ts", "tests/uploadMediaValidation.test.ts", "tests/vibexBrowserBridge.test.ts", "tests/vibexElectronFramePatch.test.ts", "tests/vibexElectronSso.test.ts", "tests/vibexIntegration.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.3.5 npm run dist:release(仅在用户明确要求发布时使用)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.3.5.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.3.5.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.3.5 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.3.5", "webImageReverseExtensionInstallDir": "安装后从 Electron 安装目录的 resources/extension/web-image-reverse/ 作为 Chrome 加载已解压扩展程序的目录。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/**、本地维护者工具源码和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "网页图片反推 Chrome 插件源码与 RunningHub/VibeX 桥接脚本必须保持在公开提交内:extension/manifest.json、extension/scripts/background.js、extension/scripts/content.js、extension/scripts/runninghub-bridge.js、extension/styles/content.css;浏览器已安装状态、真实 API Key 和本地调试数据不进入仓库。", "VibeX 线上嵌入和本地桥接只发布通用节点、后端桥接路由、插件转发脚本和对接文档;线上账号、Cookie、用户登录态与测试凭据不进入仓库。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "npm run dist:release 与 npm run release:github 默认拒绝执行发布;必须设置 T8_RELEASE_APPROVAL=release-2.3.5,且只能在用户明确要求发布后设置。", "2026-06-25 R512 正式发布:本轮来自用户明确发布授权,允许设置 T8_RELEASE_APPROVAL=release-2.3.5 运行 Electron 打包与 GitHub Release 上传链路。" ], "verification": [ "node --test tests\\vibexIntegration.test.ts tests\\vibexElectronSso.test.ts tests\\vibexElectronFramePatch.test.ts tests\\vibexBrowserBridge.test.ts tests\\batchProcessor.test.ts tests\\uploadMediaValidation.test.ts", "node --test tests\\generationHistory.test.ts tests\\imageLoadingPerformance.test.ts tests\\canvasCreativeWorkflow.test.ts tests\\imageEditAnnotationTools.test.ts tests\\advancedProviderFrontend.test.ts tests\\rhToolbox.test.ts tests\\canvasNodeIdDialog.test.ts tests\\canvasTextRendering.test.ts", "node -c backend\\src\\routes\\vibexBridge.js", "node -c backend\\src\\routes\\proxy.js", "node -c backend\\src\\server.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8'))\"", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "T8_RELEASE_APPROVAL=release-2.3.5 npm run dist:release", "npm run release:verify -- v2.3.5" ] }, "vibexExtensionInstallNoticeV236Dev": { "version": "2.3.6", "status": "included-in-electron-release", "date": "2026-06-25", "description": "VibeX 工作台顶部补充网页图片反推 Chrome 插件的打包目录与安装说明,并把插件 manifest 版本提升到 v1.1.0;该能力已纳入 v2.3.6 自动更新发布。", "sourceFiles": [ "src/components/nodes/VibeXNode.tsx", "extension/manifest.json", "tests/vibexIntegration.test.ts", "tests/vibexBrowserBridge.test.ts" ], "capabilities": [ "VibeX 工作台顶部显示打包版插件目录 resources/extension/web-image-reverse/。", "VibeX 工作台顶部提示 Chrome 扩展程序 -> 开发者模式 -> 加载已解压 的安装路径。", "网页图片反推 / RunningHub VibeX 桥接 Chrome 插件版本号升级为 1.1.0。" ], "verification": [ "node --test tests\\vibexIntegration.test.ts tests\\vibexBrowserBridge.test.ts" ] }, "electronReleaseV234": { "version": "2.3.4", "status": "electron-release", "date": "2026-06-23", "description": "v2.3.4 Electron 自动更新版:补齐 Cowart 启发画布创作工作流的标注改图执行链路,并增强当前画布资源包 manifest 的资源库、缩略图和生成历史摘要。", "highlights": [ "图像编辑画板新增“标注改图”:用户可用箭头、框线、圆形、菱形、标号和文字标出修改意图,一键发送干净原图 + 标注合成图。", "输出素材节点和上传素材节点接入标注改图执行链路,复用现有图像生成代理,默认在当前节点右侧创建干净结果。", "如果用户同时选中生成目标框,标注改图结果会优先填入目标框,延续先摆位置再生成的轻量 Cowart 工作流。", "标注改图结果保留来源节点、干净原图、标注图、说明文字、标注数量、模型信息和结果 URL 等结构化元数据,便于追踪和二次编辑。", "当前画布资源包导出增强:manifest 额外包含资源库分类 / 素材索引、缩略图引用和生成历史摘要,导入时可识别并刷新资源库状态。", "网页图片反推 Chrome 插件源码继续纳入公开发布边界,确保右键反推、生成图片和发送回画布链路不漏。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.3.4.md", "extension/manifest.json", "extension/scripts/background.js", "extension/scripts/content.js", "extension/styles/content.css", "src/utils/canvasCreativeWorkflow.ts", "src/components/Canvas.tsx", "src/components/nodes/ImageEditModal.tsx", "src/components/nodes/OutputNode.tsx", "src/components/nodes/UploadNode.tsx", "tests/canvasCreativeWorkflow.test.ts", "tests/imageEditAnnotationTools.test.ts", "tests/webImageReverseToCanvas.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.3.4 npm run dist:release(仅在用户明确要求发布时使用)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.3.4.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.3.4.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.3.4 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.3.4" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/** 和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "网页图片反推 Chrome 插件源码必须保持在公开提交内:extension/manifest.json、extension/scripts/background.js、extension/scripts/content.js、extension/styles/content.css;浏览器已安装状态、真实 API Key 和本地调试数据不进入仓库。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "npm run dist:release 与 npm run release:github 默认拒绝执行发布;必须设置 T8_RELEASE_APPROVAL=release-2.3.4,且只能在用户明确要求发布后设置。", "2026-06-23 R510 正式发布:本轮来自用户明确发布授权,允许设置 T8_RELEASE_APPROVAL=release-2.3.4 运行 Electron 打包与 GitHub Release 上传链路。" ], "verification": [ "node --test tests\\canvasCreativeWorkflow.test.ts tests\\webImageReverseToCanvas.test.ts tests\\placementShelf.test.ts tests\\themeRegistry.test.ts tests\\imageEditAnnotationTools.test.ts tests\\rhCutoutSurface.test.ts tests\\drawingBoardInteractions.test.ts tests\\drawingBoardCutout.test.ts tests\\rhToolbox.test.ts", "node -c backend\\src\\routes\\externalProviders.js", "node -e \"JSON.parse(require('fs').readFileSync('features.json','utf8'))\"", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "T8_RELEASE_APPROVAL=release-2.3.4 npm run dist:release", "npm run release:verify -- v2.3.4" ] }, "electronReleaseV233": { "version": "2.3.3", "status": "electron-release", "date": "2026-06-23", "description": "v2.3.3 Electron 自动更新版:发布 Cowart 启发的轻量画布创作工作流,新增生成目标框、选区生成图像、网页反推回填目标框和当前画布资源包 manifest。", "highlights": [ "右上快捷栏和画布右键菜单新增“生成目标框”,用户可先摆好 AI 结果位置,再把上游文本/图像或提示词生成结果填入指定框内。", "生成目标框支持替换到框内或保留版本到右侧输出节点,只保存结果 URL、版本记录和来源节点 ID,避免大素材重复写入画布状态。", "网页图片反推回传时如果当前选中生成目标框,图片结果优先填入目标框,提示词模式会写入目标框 prompt,不再额外散落节点。", "选中多个文本、图像或输出素材节点后,右键“选区生成图像”会在选区右侧创建已带提示词和参考图的图像生成节点。", "当前画布资源包导出轻量 JSON manifest,包含画布状态、素材引用、缺失报告和可复制文件列表,不写入 base64、大文件内容、API Key 或私有配置。", "标注改图请求契约会同时保留干净原图和标注合成图,要求模型应用标注意图并移除箭头、框线、标号和编辑痕迹。", "网页图片反推 Chrome 插件源码继续纳入公开发布边界,确保右键反推、生成图片和发送回画布链路不漏。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.3.3.md", "extension/manifest.json", "extension/scripts/background.js", "extension/scripts/content.js", "extension/styles/content.css", "src/utils/canvasCreativeWorkflow.ts", "src/components/nodes/GenerationTargetNode.tsx", "src/components/Canvas.tsx", "src/components/CanvasToolbar.tsx", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/utils/nodePlacement.ts", "src/types/canvas.ts", "src/styles/index.css", "tests/canvasCreativeWorkflow.test.ts", "tests/webImageReverseToCanvas.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.3.3 npm run dist:release(仅在用户明确要求发布时使用)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.3.3.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.3.3.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.3.3 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.3.3" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/** 和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "网页图片反推 Chrome 插件源码必须保持在公开提交内:extension/manifest.json、extension/scripts/background.js、extension/scripts/content.js、extension/styles/content.css;浏览器已安装状态、真实 API Key 和本地调试数据不进入仓库。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "npm run dist:release 与 npm run release:github 默认拒绝执行发布;必须设置 T8_RELEASE_APPROVAL=release-2.3.3,且只能在用户明确要求发布后设置。", "2026-06-23 R509 正式发布:本轮来自用户明确发布授权,允许设置 T8_RELEASE_APPROVAL=release-2.3.3 运行 Electron 打包与 GitHub Release 上传链路。" ], "verification": [ "node --test tests\\canvasCreativeWorkflow.test.ts tests\\webImageReverseToCanvas.test.ts tests\\placementShelf.test.ts tests\\themeRegistry.test.ts tests\\imageEditAnnotationTools.test.ts tests\\rhCutoutSurface.test.ts tests\\drawingBoardInteractions.test.ts tests\\drawingBoardCutout.test.ts tests\\rhToolbox.test.ts", "node -c backend\\src\\routes\\externalProviders.js", "npm run type-check", "npm run public:check", "npm run rh-toolbox:check", "npm run build", "T8_RELEASE_APPROVAL=release-2.3.3 npm run dist:release", "npm run release:verify -- v2.3.3" ] }, "electronReleaseV232": { "version": "2.3.2", "status": "electron-release", "date": "2026-06-23", "description": "v2.3.2 Electron 自动更新版:继续收口 v2.3.1 后的网页图片反推插件、RH 自动抠图、放置栏隐藏、主题折叠避让和牧场物语连线层级反馈。", "highlights": [ "网页图片反推插件修正发送模式:只发图片不再同时发送提示词,图文一起发送时提示词写入输出素材节点,只发提示词仍生成文本节点。", "网页图片反推浮层新增“生成图片”按钮,用户可修改反推提示词后直接按当前提示词调用 T8 后端 ModelScope 生图,并把新图发送回画布。", "ModelScope 网页反推后端固定使用 qwen-web 同款 Qwen/Qwen3-VL-235B-A22B-Instruct 视觉模型,并在模型返回无法读取图片时停止继续生图。", "画板节点和图像编辑弹窗新增 RH 自动抠图,调用 RH 工具箱高清抠图应用层,结果直接替换选中图片或当前底图。", "图像编辑按住 Shift 绘制矩形、圆形、圆角矩形和菱形时按原图自然像素比例锁定,竖图上也能画出正圆和正方形。", "左下放置栏可从截图位置的小按钮隐藏,也可从左侧统一控制条展开/折叠;新加入节点会自动恢复放置栏。", "侧边栏收缩后,牧场物语顶部看板 / 快捷栏 / 公告栏和圣斗士顶部栏会避让折叠按钮,不再重叠。", "牧场物语主题修复 ReactFlow 端口、缩放点和连线剪裁点层级,入口/出口不会被节点内容吞掉,剪裁点不会盖在节点内容上。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.3.2.md", "backend/src/routes/externalProviders.js", "extension/manifest.json", "extension/scripts/background.js", "extension/scripts/content.js", "extension/styles/content.css", "src/components/Canvas.tsx", "src/components/edges/DeletableEdge.tsx", "src/components/nodes/DrawingBoardNode.tsx", "src/components/nodes/ImageEditModal.tsx", "src/styles/index.css", "src/styles/theme-farm-story.css", "src/styles/theme-saintseiya.css", "tests/imageEditAnnotationTools.test.ts", "tests/placementShelf.test.ts", "tests/rhCutoutSurface.test.ts", "tests/themeRegistry.test.ts", "tests/webImageReverseToCanvas.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.3.2 npm run dist:release(仅在用户明确要求发布时使用)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.3.2.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.3.2.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.3.2 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.3.2" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/** 和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "新的网页图片反推 Chrome 插件源码必须进入公开提交:extension/manifest.json、extension/scripts/background.js、extension/scripts/content.js、extension/styles/content.css;但浏览器已安装状态、真实 API Key 和本地调试数据不进入仓库。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "npm run dist:release 与 npm run release:github 默认拒绝执行发布;必须设置 T8_RELEASE_APPROVAL=release-2.3.2,且只能在用户明确要求发布后设置。", "2026-06-23 R507 正式发布:本轮来自用户明确发布授权,允许设置 T8_RELEASE_APPROVAL=release-2.3.2 运行 Electron 打包与 GitHub Release 上传链路。" ], "verification": [ "node --test tests\\webImageReverseToCanvas.test.ts tests\\placementShelf.test.ts tests\\themeRegistry.test.ts tests\\imageEditAnnotationTools.test.ts tests\\rhCutoutSurface.test.ts tests\\drawingBoardInteractions.test.ts tests\\drawingBoardCutout.test.ts tests\\rhToolbox.test.ts", "node -c backend\\src\\routes\\externalProviders.js", "npm run type-check", "npm run build", "npm run public:check", "npm run rh-toolbox:check", "T8_RELEASE_APPROVAL=release-2.3.2 npm run dist:release", "npm run release:verify -- v2.3.2" ] }, "cowartInspiredCanvasWorkflow": { "version": "2.3.4", "status": "electron-release", "date": "2026-06-23", "description": "Cowart 启发的轻量画布创作工作流已随 v2.3.4 Electron 自动更新版补齐:生成目标框、选区 AI 上下文、网页反推回填目标框、标注改图执行链路和当前画布资源包增强 manifest 已形成可用闭环。", "sourceFiles": [ "src/utils/canvasCreativeWorkflow.ts", "src/components/nodes/GenerationTargetNode.tsx", "src/components/Canvas.tsx", "src/components/CanvasToolbar.tsx", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/utils/nodePlacement.ts", "src/styles/index.css", "tests/canvasCreativeWorkflow.test.ts", "src/components/nodes/ImageEditModal.tsx", "src/components/nodes/OutputNode.tsx", "src/components/nodes/UploadNode.tsx", "tests/imageEditAnnotationTools.test.ts" ], "capabilities": [ "右上快捷栏和画布右键菜单可创建“生成目标框”,用户先摆好位置、尺寸和提示词,再选择替换到框内或保留版本到右侧输出节点。", "生成目标框可接收上游文本和图像参考,运行时复用现有 /api/proxy/image 生图链路,结果只保存 URL、版本记录和来源节点 ID。", "网页图片反推回传时如果当前选中生成目标框,图片结果优先填入目标框,提示词模式会写入目标框 prompt,不再额外铺开节点。", "选中多个文本/图像/输出节点后,右键可在选区右侧创建已带提示词和参考图的图像生成节点,保持选区包围盒和默认落点逻辑。", "图像编辑画板可直接“标注改图”,输出干净原图和标注合成图;输出素材节点与上传素材节点会调用图像生成链路生成干净改图结果。", "标注改图结果默认落在来源节点右侧;如果用户选中生成目标框,则结果优先写入目标框,并保留 annotationEdit 结构化元数据。", "当前画布资源包导出默认生成轻量 JSON manifest,包含 canvas、资源清单、缺失报告、资源库快照、缩略图引用和生成历史摘要,不写入 base64、大文件内容、API Key 或私有配置。" ], "verification": [ "node --test tests\\canvasCreativeWorkflow.test.ts tests\\imageEditAnnotationTools.test.ts tests\\webImageReverseToCanvas.test.ts", "npm run type-check", "npm run build", "T8_RELEASE_APPROVAL=release-2.3.4 npm run dist:release", "npm run release:verify -- v2.3.4" ] }, "electronReleaseV231": { "version": "2.3.1", "status": "electron-release", "date": "2026-06-22", "description": "v2.3.1 Electron 自动更新版:集中发布 v2.3.0 后的用户反馈修复,覆盖 Agnes AI、ModelScope 网页图片反推、生成历史记录、牧场物语主题面板与画板布局、图像编辑常用形状、界面字体设置、ComfyUI 输入约束和复制粘贴落点。", "highlights": [ "ModelScope 网页图片右键反推会先由后端下载普通 http(s) 图片并转成 data:image base64 再发送给视觉模型,避免外链不可读时生成与原图无关的提示词。", "Agnes AI 扩展平台补齐 LLM、图像、视频调用链路;视频节点支持比例、分辨率、时长、帧率和帧数覆盖,并强化任务失败信息与临时限流重试。", "右上快捷栏新增历史记录入口,按图像、视频、音频、文本和 3D 分类查看当前画布生成内容;记录层只保存轻量索引,避免大素材重复写入画布状态。", "牧场物语主题修复右侧控制台双栏展开、折叠态顶部看板、公告栏位置、画布提示气泡、画板节点底部高度和快捷工具独立操作等问题。", "牧场物语主题建筑美术资源与可放置预览继续美化,减少默认几何占位感,更贴近轻量牧场经营画风。", "图像编辑与画板节点补齐直线、箭头、矩形、圆角矩形、圆形、菱形等常用形状,支持实心填充和 Shift 等比例绘制,并修正箭头三角端点位置。", "3D 全景节点比例选项收敛为 21:9、2:1 和自定义,减少生成全景时的无关比例干扰。", "设置页新增界面字体设置能力,支持更适合大画布缩放阅读的默认字体与自定义字体。", "ComfyUI 超市 / 工作流导入不再强制要求上游图片或提示词,按工作流映射配置决定需要的输入。", "跨画布生成完成时,非当前画布在左侧列表显示轻量红点提醒,切换到对应画布后自动清除。", "复制 / 连边粘贴到鼠标位置时,复制内容包围盒左上角对齐鼠标,不再让节点中心落在鼠标处。", "修复高层弹窗上方残留左侧快捷栏搜索按钮的问题,避免浮层被画布悬浮控件穿透。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.3.1.md", "backend/src/providers/agnes.js", "backend/src/providers/adapters.js", "backend/src/providers/comfyui.js", "backend/src/providers/registry.js", "backend/src/routes/externalProviders.js", "extension/manifest.json", "extension/scripts/background.js", "extension/scripts/content.js", "extension/styles/content.css", "src/App.tsx", "src/components/ApiSettings.tsx", "src/components/Canvas.tsx", "src/components/CanvasToolbar.tsx", "src/components/FarmCanvasLayer.tsx", "src/components/FarmStoryPanel.tsx", "src/components/GenerationHistoryPanel.tsx", "src/components/Sidebar.tsx", "src/components/nodes/DrawingBoardNode.tsx", "src/components/nodes/ImageEditModal.tsx", "src/components/nodes/Panorama3DNode.tsx", "src/components/nodes/VideoNode.tsx", "src/components/nodes/useUpdateNodeData.ts", "src/services/comfyuiApps.ts", "src/services/generation.ts", "src/stores/canvas.ts", "src/stores/theme.ts", "src/styles/index.css", "src/styles/theme-farm-story.css", "src/types/canvas.ts", "src/utils/advancedProviders.ts", "src/utils/canvasClipboard.ts", "src/utils/comfyuiWorkflow.ts", "src/utils/farmCanvas.ts", "src/utils/generationHistory.ts", "src/utils/panorama3d.ts", "src/utils/uiFont.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.3.1 npm run dist:release(仅在用户明确要求发布时使用)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.3.1.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.3.1.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.3.1 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.3.1" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录、artifacts/** 和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "npm run dist:release 与 npm run release:github 默认拒绝执行发布;必须设置 T8_RELEASE_APPROVAL=release-2.3.1,且只能在用户明确要求发布后设置。", "2026-06-22 R506 正式发布:本轮来自用户明确发布授权,允许设置 T8_RELEASE_APPROVAL=release-2.3.1 运行 Electron 打包与 GitHub Release 上传链路。" ], "verification": [ "node --test tests\\canvasClipboard.test.ts", "node --test tests\\webImageReverseToCanvas.test.ts tests\\agnesProvider.test.ts tests\\generationHistory.test.ts tests\\imageEditAnnotationTools.test.ts tests\\drawingBoardInteractions.test.ts tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\advancedProviders.test.ts tests\\advancedProviderFrontend.test.ts tests\\comfyuiProvider.test.ts tests\\comfyuiAppsManifest.test.ts tests\\panorama3d.test.ts", "npm run type-check", "npm run build", "npm run public:check", "npm run rh-toolbox:check", "T8_RELEASE_APPROVAL=release-2.3.1 npm run dist:release", "npm run release:verify -- v2.3.1" ] }, "canvasPasteTopLeftAnchor": { "version": "2.3.0-dev", "status": "implemented-dev", "date": "2026-06-22", "description": "修复画布节点复制粘贴到鼠标位置时以节点中心对齐的问题,普通粘贴和连边粘贴现在以复制内容包围盒左上角对齐鼠标落点。", "sourceFiles": [ "src/utils/canvasClipboard.ts", "tests/canvasClipboard.test.ts", "features.json", "skill.md" ], "capabilities": [ "Ctrl+V / Ctrl+Shift+V 粘贴到鼠标位置时,复制包围盒左上角对齐当前画布鼠标锚点,不再让节点中心落在鼠标处。", "多选节点、整组节点和未测量尺寸节点仍保持原相对间距,整体作为一个视觉单元移动。", "Ctrl+D 快速复制继续使用旧的 40x40 固定偏移,避免影响快速复制肌肉记忆。" ], "verification": [ "node --test tests\\canvasClipboard.test.ts" ] }, "webImageReverseVisionDataUrlFix": { "version": "2.3.0-dev", "status": "implemented-dev", "date": "2026-06-22", "description": "网页图片右键反推修复:普通 http(s) 图片进入 ModelScope 视觉模型前,后端先下载校验并转为 data:image base64,避免视觉模型拿不到原图后生成无关提示词。", "sourceFiles": [ "backend/src/routes/externalProviders.js", "tests/webImageReverseToCanvas.test.ts", "features.json", "skill.md" ], "capabilities": [ "保持浮层和返回画布使用原始 sourceImageUrl 展示来源图,但视觉模型实际收到的是后端读取后的 data URL。", "远程图片下载带 30 秒超时、image content-type / 扩展名校验和 20MB 上限,避免把不可识别内容或过大文件送入反推链路。", "默认反推指令补充“必须基于可见内容,读不到不要编造”,减少无法取图时产生与原图无关的提示词。", "回归测试新增普通 http 图片场景,断言 /v1/chat/completions 的 image_url.url 不再是原始 URL,而是 data:image/png;base64。" ], "verification": [ "node --test tests\\webImageReverseToCanvas.test.ts" ] }, "farmPanelClosedParityDrawingBoardFrame": { "version": "2.3.0-dev", "status": "implemented-dev", "date": "2026-06-22", "description": "牧场物语主题修复右侧控制台折叠后顶部牧场看板异常展开的问题,并让画板节点主体按真实主题头部高度自适应,避免最后一层区域比前面短。", "sourceFiles": [ "src/components/FarmStoryPanel.tsx", "src/styles/theme-farm-story.css", "src/components/nodes/DrawingBoardNode.tsx", "tests/farmCanvas.test.ts", "tests/themeRegistry.test.ts", "tests/drawingBoardInteractions.test.ts" ], "capabilities": [ "顶部牧场看板在右侧控制台展开和折叠时都保持 monitor 信息白名单,只额外通过 panel-state 标记 open / closed,不再因折叠态显示木材、石头、工具等二级信息。", "折叠态顶部牧场看板继续避让右侧控制台宽度和顶部工具栏,避免切到右侧快捷栏或异常撑宽。", "画板节点主体改为 flex 填充剩余高度,不再硬编码扣除 58px 头部高度,牧场物语主题下左侧图层 / 当前图层 / 底部操作区高度保持一致。" ], "verification": [ "node --test tests\\drawingBoardInteractions.test.ts", "node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts", "node --test tests\\themeRegistry.test.ts", "npm run type-check" ] }, "generationHistoryShortcut": { "version": "2.3.0-dev", "status": "implemented-dev", "date": "2026-06-22", "description": "快捷栏新增历史记录入口,按图像、视频、音频、文本和 3D 分类查看当前画布已生成内容,并以轻量索引方式避免大素材重复写入画布状态。", "sourceFiles": [ "src/utils/generationHistory.ts", "src/components/GenerationHistoryPanel.tsx", "src/components/CanvasToolbar.tsx", "src/components/Canvas.tsx", "src/styles/index.css", "tests/generationHistory.test.ts" ], "capabilities": [ "右上快捷栏新增历史记录按钮,按钮显示当前画布可查看的历史数量,打开后只控制历史抽屉,不联动展开右侧工具栏或其他面板。", "历史记录从当前画布节点数据派生轻量索引,只保存 URL、来源节点、标题和短文本预览,不复制图片、视频、音频、3D 文件本体或长文本正文。", "历史抽屉支持全部、图像、视频、音频、文本、3D 分类;图片懒加载,视频仅 metadata 预载,音频不预载,长列表分页显示更多。", "每条历史记录支持定位来源节点,复用画布节点中心定位能力并选中来源节点,方便从历史内容回到生成位置。", "索引层设置总量、单分类和首屏可见上限,避免大量生成记录导致抽屉一次性渲染过多内容。" ], "verification": [ "node --test tests\\generationHistory.test.ts", "npm run type-check", "npm run build" ] }, "webImageReverseToCanvas": { "version": "2.3.0-dev", "status": "implemented-dev", "date": "2026-06-22", "description": "新增 Chrome 扩展式网页图片右键反推生图链路:网页图片右键可调用 T8 后端 ModelScope 视觉模型反推提示词,再调用 ModelScope 生图,并把提示词、生成图片或两者一起发送回当前画布。", "sourceFiles": [ "extension/manifest.json", "extension/scripts/background.js", "extension/scripts/content.js", "extension/styles/content.css", "backend/src/routes/externalProviders.js", "src/components/Canvas.tsx", "tests/webImageReverseToCanvas.test.ts" ], "capabilities": [ "Chrome Manifest V3 扩展新增图片右键菜单,注入网页浮层展示原图、反推提示词、生成图像和发送按钮。", "后端新增 /api/proxy/external/web-image,默认使用已启用的 ModelScope 扩展平台配置,先走 Qwen/Qwen3-VL-235B-A22B-Instruct 多模态 chat/completions 反推,再复用现有 ModelScope images/generations 异步生图和本地输出保存链路。", "网页浮层支持三种发送模式:只发送提示词、只发送生成图片、提示词和生成图片一起发送。", "发送回画布通过受控 window postMessage 完成,Canvas 端只接收 source=t8-web-image-extension 的 t8:web-image-result 消息,并按 messageId 去重;提示词生成文本节点,图片生成输出素材节点。", "对 blob: 网页图片做内容脚本侧 data URL 转换;普通 http(s) 图片由后端下载校验并转为 data:image base64 后再发送给视觉模型,data:image 保持直传。" ], "verification": [ "node --test tests\\webImageReverseToCanvas.test.ts", "node --test tests\\webImageReverseToCanvas.test.ts tests\\externalProvidersGenerationRoute.test.ts tests\\advancedProviders.test.ts tests\\advancedProviderFrontend.test.ts", "npm run type-check", "npm run build", "真实 ModelScope Key 通过本地环境变量完成 /api/proxy/external/web-image 联调:Qwen/Qwen3-VL-235B-A22B-Instruct 成功反推中文提示词,Tongyi-MAI/Z-Image-Turbo 成功生成 1 张图并保存本地输出;Key 未写入源码、配置或测试文件。", "Headless Chrome CDP 冒烟通过:打开 http://127.0.0.1:11422 后模拟 t8:web-image-result,ReactFlow 节点数从 2 增至 4,并可见网页反推提示词。" ] }, "agnesAdvancedProvider": { "version": "2.3.0-dev", "status": "implemented-dev", "date": "2026-06-22", "description": "扩展 API 新增 Agnes AI 免费模型 API 接入,覆盖 LLM、图像和视频节点;设置页提供 Base URL、API Keys 页面、模型与基础使用说明,视频节点增加 Agnes 专用帧率 / 帧数参数控制。", "sourceFiles": [ "backend/src/providers/agnes.js", "backend/src/providers/adapters.js", "backend/src/providers/registry.js", "src/components/ApiSettings.tsx", "src/components/nodes/VideoNode.tsx", "src/types/canvas.ts", "src/utils/advancedProviders.ts", "tests/agnesProvider.test.ts", "tests/advancedProviderFrontend.test.ts", "tests/advancedProviders.test.ts" ], "capabilities": [ "内置 Agnes AI 扩展提供商,默认 Base URL 为 https://apihub.agnes-ai.com/v1,默认模型为 agnes-2.0-flash、agnes-image-2.1-flash / agnes-image-2.0-flash、agnes-video-v2.0。", "LLM 节点走 OpenAI 兼容 /v1/chat/completions,图像节点走 /v1/images/generations 并使用 OpenAI JSON URL 返回模式。", "视频节点走 /v1/videos 提交异步任务,轮询 /agnesapi,并兼容 Agnes 官方 completed 结果字段 remixed_from_video_id 作为最终 video/mp4 URL;本机 /files/input 或 127.0.0.1 参考图会先转成 Agnes 视频接口接受的 base64 图片内容,避免远端任务访问不到本地地址。", "设置页新增 Agnes AI 使用说明和 API Keys 页面入口;保存并启用后,用户可在图像 / 视频 / LLM 节点的高级来源选择 Agnes AI。", "Agnes 视频参数支持比例、分辨率、时长、帧率和 8n+1 帧数覆盖,默认按节点设置自动换算 width、height、num_frames 和 frame_rate。", "Agnes LLM 适配按长响应等待,不再落回 OpenAI 兼容适配器 8 秒默认超时;视频任务失败会展开上游 error/message 对象,避免显示 [object Object],轮询遇到 HTTP 429/临时 5xx 时继续等待下一轮。", "真实外部验证已使用本地配置 Key 完成,Key 未写入源码、配置或测试文件。" ], "verification": [ "node --test tests\\agnesProvider.test.ts tests\\advancedProviders.test.ts tests\\advancedProviderFrontend.test.ts tests\\advancedProviderSettingsRoute.test.ts tests\\externalProvidersGenerationRoute.test.ts tests\\openaiCompatibleProvider.test.ts", "node -c backend\\src\\providers\\agnes.js; node -c backend\\src\\providers\\registry.js; node -c backend\\src\\providers\\adapters.js", "真实 Agnes LLM adapter 调用 agnes-2.0-flash 返回 T8 Agnes adapter LLM OK(验证长超时有效)", "真实 Agnes 图像 adapter 调用 agnes-image-2.1-flash 返回 platform-outputs.agnes-ai.space 图片 URL", "真实 Agnes 视频 adapter 调用 agnes-video-v2.0 + 本机 /files/input 参考图任务轮询 completed 后返回 platform-outputs.agnes-ai.space video/mp4,HEAD 200 且 content-type 为 video/mp4;本机参考图 base64 转换与 429 轮询重试由 tests\\agnesProvider.test.ts 锁定" ] }, "electronReleaseV230": { "version": "2.3.0", "status": "electron-release", "date": "2026-06-22", "description": "v2.3.0 Electron 自动更新版:牧场物语主题阶段性可玩版本已完成本地验收、Electron 打包与 GitHub Release 发布;v2.3.0 现在作为 latest.yml 自动更新源,安装继续使用前台 NSIS 向导。", "highlights": [ "新增第 13 套强识别主题「牧场物语主题」:草地网格、木牌节点、农具端口、麻绳 / 水渠 / 田埂连线、镰刀剪线、牧场 MiniMap 标记和主题音乐 preset。", "新增全画布牧场养成层:用户可在 ReactFlow 世界坐标里开垦、播种、浇水、过天、收获、完成订单、建造建筑、放置装饰和移动对象,不限制在小面板内。", "牧场玩法形成 10 分钟闭环:初始资源、4 种作物、金币 / 种子 / 水量 / 木材 / 石头、每日订单、天气 / 节庆、轻量惊喜事件、长期目标、漂亮度评分和成就摘要。", "牧场控制台重排为“上方监控看板 + 右侧可折叠控制台 + 顶部快捷工具”,减少面板堆叠和找按钮成本;右侧栏目默认折叠并持久化用户习惯。", "顶部快捷工具新增牧场控制台按钮,并把常用操作映射到信息栏下方:选择、锄地、播种、浇水、收获、铲除、建造、装饰、移动、删除。", "修复牧场主题点击落点漂移,牧场对象使用 ReactFlow 世界坐标和视口转换,画布缩放 / 平移后点击位置与实际落点一致。", "道路和木栅栏支持自动衔接视觉,单个对象和连续对象显示更自然,减少相邻对象叠得杂乱的问题。", "缺水、成熟、枯萎、订单、来访、建筑收益等状态支持从面板自动跳转到最近目标,并通过短闪、MiniMap 路线和低遮挡反馈确认位置。", "牧场 HUD 和反馈系统加强:短反馈、今日小目标、每日总结、连击奖励、奖励印章、建筑收益、稻草人守护、资源预期标签和完成回执都可见可读。", "浅色 / 深色主题可读性统一加固,顶部监控栏、快捷工具、右侧控制台、按钮、TAB、展开卡片和小字号标签都避免灰字、重叠和裁切。", "顶部监控看板新增优先卡白名单护栏,防止主优先入口被降噪规则隐藏,并用单行 grid 固定图标、短标题、目标和进度标签的排版。", "真实浏览器最终复核补齐右侧控制台 header 品牌字可读性护栏,FARM STORY 从 9px 提升到 11px,浅色 / 夜间都无低于阈值小字、无顶部重叠。", "大画布性能护栏继续收口:牧场渲染层输出可见对象数、虚拟化状态和渲染 margin 诊断属性,方便验收时确认远处对象没有全量挂 DOM。", "大画布稻草人守护性能继续收口:守护候选按可视区加渲染 margin 和 6 格守护半径裁剪,并输出 scarecrow object count / render margin 诊断属性。", "非牧场主题性能护栏继续收口:FarmCanvasLayer 外层先判断 farm-story,再挂运行时组件,避免普通主题进入牧场大画布重计算。", "非牧场主题性能护栏继续收口:FarmStoryPanel 外层先判断 farm-story,再挂右侧控制台运行时组件,避免普通主题进入牧场控制台重计算。", "第五阶段非发布最终验收补齐:修正 themeRegistry 中过期稻草人全量扫描断言,组合回归 28/28 通过,并完成真实 Chrome 浅色 / 夜间冒烟。", "第五阶段状态审计完成:farmStoryCanvasTheme 从 roadmap-development 切到 user-acceptance,当前只等待用户验收反馈或明确发布授权。", "第五阶段完成审计复核完成:2026-06-22 R496 新鲜复跑非发布组合回归 28/28、type-check、features.json parse 和 git diff --check,并复核 R494 浏览器 QA 产物仍为浅色 / 夜间 pass。", "2026-06-22 R498 正式发布:用户明确授权打包 Electron 并发布 v2.3.0 自动更新版,发布链路允许设置 T8_RELEASE_APPROVAL=release-2.3.0 通过确认闸。", "完成真实浏览器截图验收:浅色 / 深色均确认顶部监控看板不和右上快捷栏重叠,顶部快捷工具不被垂直裁切,右侧控制台不越界。", "公开版本同步到 2.3.0:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.3.0.md 同步;本次生成 Electron 安装包、blockmap 与 latest.yml,并发布 GitHub Release 自动更新资产。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.3.0.md", "src/theme/types.ts", "src/theme/defaultTemplates.ts", "src/components/ThemeTemplateManager.tsx", "src/components/ThemeMusicToggle.tsx", "src/components/Canvas.tsx", "src/components/FarmCanvasLayer.tsx", "src/components/FarmStoryPanel.tsx", "src/components/Sidebar.tsx", "src/components/edges/DeletableEdge.tsx", "src/styles/theme-farm-story.css", "src/utils/farmCanvas.ts", "src/utils/farmSound.ts", "backend/src/routes/canvas.js", "backend/src/routes/themes.js", "backend/src/achievements/store.js", "shared/achievementManifest.json", "tests/farmCanvas.test.ts", "tests/themeRegistry.test.ts", "tests/themeRoutes.test.ts", "tests/achievements.test.ts" ], "packaging": { "script": "T8_RELEASE_APPROVAL=release-2.3.0 npm run dist:release(仅在用户明确要求发布时使用)", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.3.0.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.3.0.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.3.0 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。", "releaseUrl": "https://github.com/T8mars/T8-penguin-canvas/releases/tag/v2.3.0" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。", "npm run dist:release 与 npm run release:github 默认拒绝执行发布;必须设置 T8_RELEASE_APPROVAL=release-2.3.0,且只能在用户明确要求发布后设置。", "2026-06-22 R498 正式发布:本轮来自用户明确发布授权,允许设置 T8_RELEASE_APPROVAL=release-2.3.0 运行 Electron 打包与 GitHub Release 上传链路。", "2026-06-21 R489 仅补牧场可视区渲染诊断属性和测试记录;不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-21 R490 仅补牧场道路 / 栅栏连接 map 可视区裁剪和测试记录;不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-21 R491 仅补牧场稻草人守护候选可视区 + 半径裁剪和测试记录;不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-21 R492 仅补 FarmCanvasLayer 非牧场主题轻量 wrapper 和测试记录;不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-22 R493 仅补 FarmStoryPanel 非牧场主题轻量 wrapper 和测试记录;不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-22 R494 仅补陈旧测试契约修正、组合回归、Chrome/CDP 浏览器冒烟和记录;不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-22 R495 仅补 user-acceptance 状态切换、验收护栏测试和记录;不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-22 R496 仅补完成审计复核、非发布验收命令和记录;不运行 Electron 打包、GitHub Release、tag 或 push,不触碰 3D 全景。" ], "verification": [ "2026-06-22 R498: node --test tests\\electronPackaging.test.ts tests\\resourceLibraryDrawer.test.ts (7/7 pass)", "2026-06-22 R498: node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts tests\\achievements.test.ts (38/38 pass)", "2026-06-22 R498: npm run rh-toolbox:check (pass: 11 tools / 9 categories)", "2026-06-22 R498: npm run public:check (pass)", "2026-06-22 R498: npm run type-check (pass)", "2026-06-22 R498: git diff --check (pass with LF/CRLF warnings only)", "2026-06-22 R498: npm run build (pass; retained empty react-vendor and chunk-size warnings)", "2026-06-22 R498: T8_REQUIRE_AI_WATERMARK_RUNTIME=1 T8_REQUIRE_PARSEHUB_RUNTIME=1 T8_REQUIRE_RUNTIME_ARCHIVES=1 T8_REQUIRE_UPDATE_ARTIFACTS=1 npm run dist (pass; generated installer 1178230140 bytes, blockmap 1228827 bytes, latest.yml 2.3.0)", "2026-06-22 R498: win-unpacked T8-PenguinCanvas.exe 15s smoke alive; title=贞贞的无限画布(企鹅共创版)", "2026-06-22 R496: node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts (28/28 pass, fresh completion audit)", "2026-06-22 R496: npm run type-check (pass)", "2026-06-22 R496: features.json parse check (pass)", "2026-06-22 R496: git diff --check (pass with LF/CRLF warnings only)", "2026-06-22 R496: inspected artifacts\\farm-story-r494-browser\\farm-story-browser-qa-r494.json (light/dark pass; no toolbar overlap, no panel offscreen, tinyTextCount 0)", "2026-06-22 R495: node --test --test-name-pattern \"Farm Story phase 5 acceptance guard\" tests\\themeRegistry.test.ts (red before status switch; expected roadmap-development mismatch)", "2026-06-22 R495: node --test --test-name-pattern \"Farm Story phase 5 acceptance guard\" tests\\themeRegistry.test.ts (pass after user-acceptance switch)", "2026-06-22 R495: features.json parse check (pass)", "2026-06-22 R494: node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts (first run 27/28 pass; stale scarecrow assertion exposed)", "2026-06-22 R494: node --test --test-name-pattern \"Farm Story theme mounts canvas chrome\" tests\\themeRegistry.test.ts (pass, ~458s)", "2026-06-22 R494: node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts (28/28 pass, ~595s)", "2026-06-22 R494: Chrome/CDP browser QA artifacts/farm-story-r494-browser/farm-story-browser-qa-r494.json (light/dark pass; screenshots farm-story-r494-light.png / farm-story-r494-dark.png)", "2026-06-22 R494: npm run type-check (pass)", "2026-06-22 R493: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~655s)", "2026-06-22 R493: npm run type-check (pass)", "2026-06-21 R492: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~637s)", "2026-06-21 R492: npm run type-check (pass)", "2026-06-21 R491: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~643s)", "2026-06-21 R491: npm run type-check (pass)", "2026-06-21 R490: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~616s)", "2026-06-21 R490: npm run type-check (pass)", "2026-06-21 R489: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~640s)", "2026-06-21 R489: npm run type-check (pass)", "2026-06-21 R488: Chrome Playwright browser QA artifacts/farm-story-r488-browser/farm-story-browser-qa-r488.json (light/dark pass; screenshots farm-story-light-r488.png / farm-story-dark-r488.png)", "2026-06-21 R488: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~256s)", "2026-06-21 R488: node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts (28/28 pass, ~859s)", "2026-06-21 R488: npm run type-check (pass)", "node --test --test-name-pattern \"Farm Story phase 5 acceptance guard|Farm Story browser QA keeps top quick actions\" tests\\themeRegistry.test.ts", "node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts (28/28 pass)", "node --test tests\\achievements.test.ts (10/10 pass)", "node --test tests\\electronPackaging.test.ts (6/6 pass)", "node -c backend\\src\\routes\\canvas.js && node -c backend\\src\\routes\\themes.js && node -c backend\\src\\achievements\\store.js", "npm run rh-toolbox:check", "npm run public:check", "npm run type-check", "npm run build", "git diff --check", "npm run encrypt", "npm run dist:release 曾误创建远端 v2.3.0,随后已按用户要求删除 release 并清理远端 tag;latest 已确认回到 v2.2.9", "scripts/dist-release.cjs 与 scripts/release-github.cjs 已加 T8_RELEASE_APPROVAL=release-2.3.0 发布确认闸,防止未授权误发布", "2026-06-22 R498: 发布前确认 gh 已登录 T8mars、远端 v2.3.0 tag 不存在、GitHub latest 为 v2.2.9;本轮将按用户授权发布 v2.3.0。" ] }, "electronReleaseV229": { "version": "2.2.9", "status": "electron-release", "date": "2026-06-17", "description": "v2.2.9 Electron 自动更新版:继续收口导演分镜台首尾帧桥接、分镜输入复用、RH 工具箱持久化、上传/输出图像能力轨、Codex 生图工作台登录入口和模型注意事项;本次打包 Electron 并发布 GitHub Release / latest.yml 自动更新资产。", "highlights": [ "导演分镜台每个分镜新增复用输入:可从其他分镜一键应用提示词、负向提示词、@ 素材提及、帧模式、图像 / 视频 / 音频素材和素材顺序。", "导演分镜台首尾帧桥接默认折叠关闭,用户勾选后才展开当前相邻分镜的桥接设置,减少普通分镜编辑区占用。", "导演分镜台首尾帧桥接提示词新增 50 条通用高质量预设,支持套用、保存自定义、导入和导出 JSON。", "导演分镜台分镜视频和桥接视频使用独立输出绑定 key,避免桥接生成或重新获取后覆盖 S2 等普通分镜视频输出。", "导演分镜台时间线拖拽继续加固,右侧拖拽条和桥接分隔把手都标记为 resize handle,画布按钮拦截逻辑不会吞掉拖拽。", "RH 工具箱新增持久化 manifest,制作器保存后的应用会写入本地数据文件,RH 工具箱节点和图像能力轨会读取并合并,打包前自动同步到发布 manifest。", "RH 工具箱发布检查和 Electron 后置检查改为按 manifest 动态校验所有启用工具及 WebAppId,避免新增工具打包时遗漏。", "上传素材 / 输出素材图像能力轨新增扩图和消除主体;扩图提供常用分辨率选择,点击画布空白可关闭选择框,并会把真实 LIST 选项值传给 RH。", "Codex 生图工作台新增登录入口、刷新状态、命令复制和 Codex 可执行路径配置,和 Codex CLI Agent 一样可独立完成登录后使用。", "左下角特别注意事项更新到 2026.06.17,补充 gpt-image-2 的 azure 特价分组、2K / 4K 稳定性说明和质量参数说明。", "Electron 安装包继续使用 normal 压缩,保留 tools/ffmpeg sidecar 并排除重复 @ffmpeg-installer 运行时,降低 NSIS mmap 失败风险。", "公开版本同步到 2.2.9:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.2.9.md 同步;本次生成 Electron 安装包、blockmap 与 latest.yml,并发布 GitHub Release 自动更新资产。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "electron/_post_build.cjs", "backend/src/config.js", "backend/src/routes/settings.js", "features.json", "README.md", "release-notes/v2.2.9.md", "scripts/check-rh-toolbox-release.cjs", "scripts/sync-rh-toolbox-manifest.cjs", "src/components/Canvas.tsx", "src/components/RhImageCapabilityButton.tsx", "src/components/RhImageCapabilityRail.tsx", "src/components/nodes/CodexImageConjureNode.tsx", "src/components/nodes/DirectorStoryboardNode.tsx", "src/components/nodes/RHToolboxNode.tsx", "src/data/rhToolboxManifest.ts", "src/services/api.ts", "src/services/rhToolboxCapabilities.ts", "src/utils/directorStoryboard.ts", "src/utils/rhToolbox.ts", "src/utils/rhToolboxCapabilities.ts", "tests/codexImageConjure.test.ts", "tests/directorStoryboard.test.ts", "tests/electronPackaging.test.ts", "tests/modelUsageHelp.test.ts", "tests/rhToolbox.test.ts" ], "packaging": { "script": "npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.2.9.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.2.9.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.2.9 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。" ], "verification": [ "node --test tests\\*.test.ts", "npm run type-check", "npm run rh-toolbox:check", "npm run public:check", "npm run build", "git diff --check", "npm run dist:release", "npm run release:verify" ] }, "electronReleaseV228": { "version": "2.2.8", "status": "electron-release", "date": "2026-06-17", "description": "v2.2.8 Electron 自动更新版:继续收口导演分镜台、3D 全景分镜提示板、画板自由尺寸、资源库参考图和通用 @ 素材提及输入;本次打包 Electron 并发布 GitHub Release / latest.yml 自动更新资产。", "highlights": [ "导演分镜台时间线拖拽调时长更稳:右侧拖拽条和中间 ↔ 分隔把手都可调整分镜秒数,ReactFlow 不会抢走拖拽事件,范围继续锁定 4-15 秒。", "导演分镜台首尾帧桥接改为相邻镜头独立后期任务:生成全部只跑主镜头,S1-S2 / S2-S3 等桥接可分别设置、并发生成、重新获取并按对应镜头输出。", "导演分镜台输出节点只展示对应分镜或桥接的提示词和视频,修复多个视频链接/提示词混在一起导致用户分不清的问题。", "导演分镜台支持从资源库导入图像、视频、音频,并修复素材区无法拖动排序的问题。", "通用 @ 素材提及输入支持紧贴文字触发,例如 女人@ 可直接弹出素材列表,选择后自动补前置空格避免提示词粘连。", "上传素材来自资源库时也能作为图像节点参考图正常识别,避免本地上传可用而资源库拖出丢参考图。", "3D 全景分镜提示板实时预览改为白字、小字号并与最终输出一致;场景输入框支持回车换行,预设提示词支持插入、保存、导入和导出。", "画板节点自由尺寸输入不再被旧下限打断,新增保持原图像素尺寸入口,适合小图、长图和原尺寸编辑。", "宫格剪裁继续加固 2x2 单图拆分,只输出一组 4 张素材,不再重复生成多个相同输出节点。", "Electron 安装包继续保留 tools/ffmpeg sidecar,排除重复的 @ffmpeg-installer 运行时,并将安装器压缩从 store 调整为 normal,避免 NSIS 超过 Windows 编译器内存映射上限。", "公开版本同步到 2.2.8:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.2.8.md 同步;本次生成 Electron 安装包、blockmap 与 latest.yml,并发布 GitHub Release 自动更新资产。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.2.8.md", "backend/src/routes/proxy.js", "src/components/Canvas.tsx", "src/components/nodes/DirectorStoryboardNode.tsx", "src/components/nodes/DrawingBoardNode.tsx", "src/components/nodes/MentionPromptInput.tsx", "src/components/nodes/OutputNode.tsx", "src/components/nodes/Panorama3DNode.tsx", "src/components/nodes/mediaMentions.ts", "src/utils/directorStoryboard.ts", "src/utils/drawingBoardSizing.ts", "src/utils/panorama3d.ts", "tests/batchProcessor.test.ts", "tests/directorStoryboard.test.ts", "tests/drawingBoardInteractions.test.ts", "tests/drawingBoardSizing.test.ts", "tests/electronPackaging.test.ts", "tests/imageReferencePersistence.test.ts", "tests/outputMaterialPersistence.test.ts", "tests/panorama3d.test.ts", "tests/promptEditor.test.ts" ], "packaging": { "script": "npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.2.8.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.2.8.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.2.8 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码和公开打包产物。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。" ], "verification": [ "node --test tests\\*.test.ts", "npm run type-check", "npm run rh-toolbox:check", "npm run public:check", "npm run build", "git diff --check", "npm run dist:release", "npm run release:verify" ], "multiAgentHandoff": { "date": "2026-06-17", "purpose": "上下文压缩或多 Agent 接力时使用的 v2.2.8 现场摘要;用户当前只要求同步 skill.md 与 features.json,不要求继续打包、发布或提交。", "sourceState": { "pushedCommits": [ "d36afd7 Release v2.2.8", "e75032f Fix v2.2.8 Electron package size" ], "localReleasePatch": [ "package.json build.compression 已从 store 调整为 normal,用于降低 NSIS installer payload 的 mmap 压力。", "tests/electronPackaging.test.ts 已锁定 compression=normal、保留 tools/ffmpeg sidecar 并排除重复 @ffmpeg-installer。", "features.json 与 release-notes/v2.2.8.md 已补充 Electron 包体压缩和 ffmpeg 去重说明。" ], "doNotAccidentallyCommit": [ "skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录和私有计费/支付/充值/分组令牌实现仍禁止进入公开提交。", "当前未跟踪的 .electron-builder-cache*、artifacts/、comfyui-anima-t8/、hermes-agent/、update.md、src/components/nodes/RHToolRunnerPanel.tsx 不是 release 资产,接力时不要误提交。" ] }, "releasePackagingState": { "status": "v2.2.8 release 打包尚未完成;本字段只是交接记录,不代表 GitHub Release 已发布。", "lastFailures": [ "第一次 npm run dist:release 失败于 NSIS makensis: Internal compiler error #12345 error creating mmap the size of 1210605027。", "第二次排除重复 @ffmpeg-installer 后仍失败于 NSIS makensis,mmap size 降到 1194530553。" ], "nextIfUserAsksRelease": [ "先重新检查 staged diff、公开边界和密钥扫描。", "提交并推送 compression=normal 的本地补丁。", "安全清理失败的 dist_electron/win-unpacked、T8-PenguinCanvas-Setup-2.2.8.exe、blockmap 和临时 nsis.7z。", "重跑 npm run dist:release;若 normal 仍失败,再考虑 maximum 压缩或拆分大型 runtime 资产。" ] }, "directorStoryboardDurationDrag": { "status": "源码侧已加固;如果用户仍反馈拖不动,优先确认运行中的页面/安装包是否已经加载最新构建。", "implementation": [ "src/components/nodes/DirectorStoryboardNode.tsx::beginDurationResize 负责分镜右侧窄拖拽条。", "src/components/nodes/DirectorStoryboardNode.tsx::beginBridgeSeparatorInteraction 负责中间 ↔ 桥接分隔把手,点击进入桥接,拖动则调整前一个分镜时长。", "两条路径都使用 nodrag/nopan、capture 事件和 window 级 pointer/mouse move/up 兜底,避免 ReactFlow 抢拖拽。", "src/utils/directorStoryboard.ts::calculateDirectorTimelineDragDuration 继续把时长限制在 4-15 秒。" ], "verification": [ "node --test tests\\directorStoryboard.test.ts 通过 19/19。", "npm run type-check 通过。" ] }, "recentVerificationEvidence": [ "压缩补丁后 node --test tests\\electronPackaging.test.ts 通过。", "npm run public:check 通过。", "git diff --check 通过。" ] } }, "electronReleaseV227": { "version": "2.2.7", "status": "electron-release", "date": "2026-06-16", "description": "v2.2.7 Electron 自动更新版:新增导演分镜台并收口素材操作、侧边栏隐藏、放置栏、3D 全景分镜提示板、宫格编辑拖拽和宫格剪裁去重等工作流细节;本次打包 Electron 并发布 GitHub Release / latest.yml 自动更新资产。", "highlights": [ "新增导演分镜台节点:支持分辨率设置、每个分镜 4-15 秒时长、单镜头提示词、多参考图/视频/音频素材、@ 素材提及和面向 Seedance 2.0 多参考图流程的并发生成,分镜完成即可单独输出。", "侧边栏支持 H 快捷键和主题化折叠按钮,隐藏后画布悬浮控制与放置栏自动贴左,减少小屏幕占用。", "放置栏新增一键清空,并在节点右键菜单中支持将当前节点加入放置栏;清空后不会因为后续拖入新节点而恢复旧缓存。", "上传素材和输出素材新增单素材删除与复制到剪贴板入口;多图横版预览保持横向比例,操作按钮移到缩略图上方,避免遮挡下载按钮。", "3D 全景节点新增分镜提示板,开启后可在快照下方拼接黑底白字提示词框,提示词区域高度根据输入行数自适应,避免多行文字被截断。", "宫格编辑支持从浏览器外文件夹、画布上传素材和输出素材拖入任意格子;宫格剪裁修复单张 2x2 图被重复输出多个 4 图输出节点的问题。", "LLM / Vision 对话路径放宽长回答输出限制,配套补齐视频输入和扩展 provider 回归测试。", "Codex 相关节点与大画布素材收集继续做性能收口,降低添加 Codex 节点后画布拖动卡顿。", "公开版本同步到 2.2.7:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.2.7.md 同步;本次生成 Electron 安装包、blockmap 与 latest.yml,并发布 GitHub Release 自动更新资产。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.2.7.md", "backend/src/providers/openaiCompatible.js", "backend/src/routes/proxy.js", "src/App.tsx", "src/components/Canvas.tsx", "src/components/MaterialContextMenu.tsx", "src/components/nodes/CodexCliAgentNode.tsx", "src/components/nodes/DirectorStoryboardNode.tsx", "src/components/nodes/GridEditorNode.tsx", "src/components/nodes/LLMNode.tsx", "src/components/nodes/OutputNode.tsx", "src/components/nodes/Panorama3DNode.tsx", "src/components/nodes/UploadNode.tsx", "src/components/nodes/useUpstreamMaterials.ts", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/services/generation.ts", "src/styles/index.css", "src/types/canvas.ts", "src/utils/directorStoryboard.ts", "src/utils/gridEditor.ts", "src/utils/imageClipboard.ts", "src/utils/keyboardShortcuts.ts", "src/utils/mediaCollection.ts", "src/utils/panorama3d.ts", "src/utils/upstreamMaterialBuckets.ts" ], "packaging": { "script": "npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.2.7.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.2.7.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.2.7 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码和公开打包产物。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。" ], "verification": [ "node --test tests\\directorStoryboard.test.ts tests\\gridEditor.test.ts tests\\mediaMaterialDeleteUi.test.ts tests\\placementShelf.test.ts tests\\sidebarCollapse.test.ts tests\\outputMaterialPersistence.test.ts tests\\mediaCollection.test.ts tests\\panorama3d.test.ts tests\\llmVideoInput.test.ts tests\\advancedProviderFrontend.test.ts tests\\codexCliAgent.test.ts tests\\keyboardShortcuts.test.ts tests\\groupUpstreamMaterials.test.ts", "npm run type-check", "npm run rh-toolbox:check", "npm run public:check", "npm run build", "git diff --check", "npm run dist:release", "npm run release:verify" ] }, "electronReleaseV226": { "version": "2.2.6", "status": "electron-release", "date": "2026-06-15", "description": "v2.2.6 Electron 自动更新版:修复动漫标签大师和艺术风格大师没有完整走主题的问题,让两个灵感节点在强主题、模板主题和样式主题下统一读取 --t8-* 主题语义变量;本次打包 Electron 并发布 GitHub Release / latest.yml 自动更新资产。", "highlights": [ "动漫标签大师的节点本体、图库弹窗、lightbox 预览层新增 data-theme-visual / data-theme-style / data-theme-template 主题桥接,内部 --atm-* 变量改为读取 --t8-bg-node、--t8-bg-panel、--t8-accent、--t8-border-strong 等语义变量。", "艺术风格大师的节点本体、图库弹窗、lightbox 预览层新增同样主题桥接,内部 --asm-* 变量不再只支持浅色 / 深色,灌篮高手、火影、EVA、RH、OP 等强主题下不会露出默认青绿色 / 白色内部风格。", "补充动漫标签大师与艺术风格大师主题回归测试,防止后续只改节点私有颜色变量而漏接全局主题系统。", "公开版本同步到 2.2.6:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.2.6.md 同步;本次生成 Electron 安装包、blockmap 与 latest.yml,并发布 GitHub Release 自动更新资产。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.2.6.md", "src/styles/index.css", "tests/animeTagMaster.test.ts", "tests/artistStyleMaster.test.ts" ], "packaging": { "script": "npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.2.6.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.2.6.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.2.6 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码和公开打包产物。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。" ], "verification": [ "node --test tests\\artistStyleMaster.test.ts tests\\animeTagMaster.test.ts", "npm run type-check", "npm run rh-toolbox:check", "npm run public:check", "npm run build", "git diff --check", "npm run dist:release", "npm run release:verify" ] }, "electronReleaseV225": { "version": "2.2.5", "status": "electron-release", "date": "2026-06-15", "description": "v2.2.5 Electron 自动更新版:修复创作台背景层完成后消失和编辑态选中/拖动问题,继续收口 RH 工具箱图像能力中间层、RH 后台任务取消、高清放大4K 输出解析和模型注意事项;本次打包 Electron 并发布 GitHub Release / latest.yml 自动更新资产。", "highlights": [ "创作台背景层改为完成态只读展示层 + 编辑态可操作层:完成后仍位于节点下方显示,编辑时可选中、拖动、等比缩放和旋转。", "创作台背景补齐导入/导出、隐藏恢复、Delete/Backspace 删除、原比例放置、50 款高质量边框和多色边框选择,并调整面板位置避免被放置栏遮挡。", "RH 图像能力中间层继续完善:上传素材和输出素材图像节点左侧能力轨支持抠图与 4K,新增能力继续复用 RH_IMAGE_CAPABILITY_PRESETS / runRhImageCapabilityBatch。", "修复 RH 高清放大4K 输出链路:image-upscale-4k 指向 WebAppId 2066353965784199169,默认 plus 实例,并递归提取 RunningHub 输出 URL。", "修复 RH 系列停止语义:RunningHub、RH工具箱、RH超市和上传/输出素材左侧 RH 能力轨停止时都会调用 RunningHub /task/openapi/cancel,避免后台任务继续运行。", "RH 工具箱列表按标题 / WebAppId / id 去重,避免制作器草稿导致同名工具重复出现。", "终端日志补强 RH 提交、轮询、取消和输出解析路径;取消接口返回 HTML 时提示后端未命中或需要重启,而不是裸 JSON 解析错误。", "左下角模型注意事项文案更新,补充 FAL、Seedance、Grok、Sora、Suno、LLM 等模型分组和扣费/退费说明。", "公开版本同步到 2.2.5:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.2.5.md 同步;本次生成 Electron 安装包、blockmap 与 latest.yml,并发布 GitHub Release 自动更新资产。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.2.5.md", "backend/src/routes/canvas.js", "backend/src/routes/proxy.js", "backend/src/routes/resources.js", "scripts/check-rh-toolbox-release.cjs", "src/components/Canvas.tsx", "src/components/CreativeDeskLayer.tsx", "src/components/NodeActionBar.tsx", "src/components/RhImageCapabilityButton.tsx", "src/components/RhImageCapabilityRail.tsx", "src/components/nodes/OutputNode.tsx", "src/components/nodes/RHToolboxNode.tsx", "src/components/nodes/RHToolsNode.tsx", "src/components/nodes/RunningHubNode.tsx", "src/components/nodes/UploadNode.tsx", "src/data/rhToolboxManifest.ts", "src/services/api.ts", "src/services/generation.ts", "src/services/rhToolbox.ts", "src/services/rhToolboxCapabilities.ts", "src/stores/runBus.ts", "src/styles/index.css", "src/styles/theme-slamdunk.css", "src/types/canvas.ts", "src/utils/creativeDesk.ts", "src/utils/imageNaturalSize.ts", "src/utils/rhToolbox.ts", "src/utils/rhToolboxCapabilities.ts", "tests/creativeDesk.test.ts", "tests/modelUsageHelp.test.ts", "tests/rhToolbox.test.ts" ], "packaging": { "script": "npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.2.5.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.2.5.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.2.5 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码和公开打包产物。", "Release 资产只上传 NSIS 安装包、blockmap 与 latest.yml。" ], "verification": [ "node --test tests\\rhToolbox.test.ts tests\\creativeDesk.test.ts tests\\mediaMetadataDisplay.test.ts tests\\canvasMouseInteractions.test.ts tests\\aiWatermarkRunner.test.ts tests\\comfyuiAppNodes.test.ts tests\\comfyuiProvider.test.ts tests\\updateMdRegressions.test.ts", "npm run type-check", "npm run rh-toolbox:check", "npm run public:check", "npm run build", "git diff --check", "npm run dist:release", "npm run release:verify" ] }, "sourceReleaseV224": { "version": "2.2.4", "status": "source-only", "date": "2026-06-15", "description": "v2.2.4 GitHub 源码版:收口创作台背景层、RH 工具箱图像能力中间层、AI 去水印停止/CUDA 兼容、上传/输出素材媒体元信息和 ComfyUI 应用制作器稳定性;本次只推公开源码,不打包 Electron,不发布 GitHub Release / latest.yml 自动更新资产。", "highlights": [ "新增创作台背景层:左侧控制轨进入编辑,支持从资源库放置图片、透明度、边框、等比缩放、旋转、层级和持久化,背景位于节点下方不挡创作。", "RH 工具箱升级为可调度图像能力中间层:上传素材和输出素材图像节点改用左侧 RH 能力轨,内置抠图和高清放大4K小按钮,不再挤占节点顶部。", "新增 RH 图像能力预设和批处理服务:内置 cutout/upscale/expand 预设位,upscale 已绑定 image-upscale-4k,默认串行、每张最多 3 次尝试、支持取消和部分成功输出,后续高清化/扩图可复用同一入口。", "修复 RH 停止只停本地的问题:RunningHub、RH工具箱、RH超市和上传/输出素材左侧 RH 能力轨都会在停止时调用 RunningHub cancel,并等待远端取消成功后才清本地状态;提交中点停止会在 taskId 返回后立即取消后台任务,query/cancel 复用提交时的 API Key,取消接口返回 HTML 时会提示后端未命中/需重启而不是裸 JSON 解析错误。", "修复 RH 高清放大4K 指向正确 WebAppId 2066353965784199169 并默认 plus 实例;开发环境会合并制作器最新草稿,同时按标题/WebApp/ID 清理旧重复草稿,工具箱列表和筛选结果都不会再显示两个同名工具。", "AI 去水印节点补齐停止能力;追加隐形处理时可中止长任务,选择 CUDA 但随包 PyTorch 为 CPU-only 时会回退/提示兼容原因,避免用户被长堆栈卡住。", "上传素材和输出素材节点新增媒体元信息展示:图片显示分辨率,视频显示分辨率和时长,音频显示时长,保持紧凑节点布局。", "ComfyUI 应用制作器继续修复控件手势边界和参数映射稳定性,降低点击标签无响应、参数被改乱等问题。", "公开版本同步到 2.2.4:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.2.4.md 同步;本次不打包 Electron,不发布 GitHub Release。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.2.4.md", "backend/src/routes/aiWatermark.js", "backend/src/routes/canvas.js", "backend/src/routes/proxy.js", "backend/src/tools/aiWatermark/runner.js", "src/components/Canvas.tsx", "src/components/CreativeDeskLayer.tsx", "src/components/MediaMetadataBadge.tsx", "src/components/NodeActionBar.tsx", "src/components/RhImageCapabilityButton.tsx", "src/components/RhImageCapabilityRail.tsx", "src/data/rhToolboxManifest.ts", "src/components/nodes/ComfyUIAppMakerNode.tsx", "src/components/nodes/ComfyUIStoreNode.tsx", "src/components/nodes/OutputNode.tsx", "src/components/nodes/RemoveAiWatermarkNode.tsx", "src/components/nodes/RHToolboxNode.tsx", "src/components/nodes/RHToolsNode.tsx", "src/components/nodes/RunningHubNode.tsx", "src/components/nodes/UploadNode.tsx", "src/services/aiWatermark.ts", "src/services/rhToolbox.ts", "src/services/rhToolboxCapabilities.ts", "src/stores/runBus.ts", "src/types/canvas.ts", "src/utils/comfyuiApps.ts", "src/utils/creativeDesk.ts", "src/utils/mediaMetadata.ts", "src/utils/rhToolboxCapabilities.ts", "src/styles/index.css", "tests/aiWatermarkRunner.test.ts", "tests/canvasMouseInteractions.test.ts", "tests/comfyuiAppNodes.test.ts", "tests/comfyuiProvider.test.ts", "tests/creativeDesk.test.ts", "tests/mediaMetadataDisplay.test.ts", "tests/rhToolbox.test.ts", "tests/updateMdRegressions.test.ts" ], "sourceOnly": { "githubPush": true, "electronPackaging": false, "githubRelease": false, "blockedCommands": [ "npm run dist:release", "npm run dist", "npm run release:github", "npm run release:verify" ] }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、Electron 缓存目录、comfyui-anima-t8/** 参考 clone 和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码。", "本次不生成安装包、blockmap、latest.yml,也不创建或更新 GitHub Release。" ], "verification": [ "node --test tests\\rhToolbox.test.ts tests\\creativeDesk.test.ts tests\\mediaMetadataDisplay.test.ts tests\\canvasMouseInteractions.test.ts tests\\aiWatermarkRunner.test.ts tests\\comfyuiAppNodes.test.ts tests\\comfyuiProvider.test.ts tests\\updateMdRegressions.test.ts", "npm run type-check", "npm run rh-toolbox:check", "npm run public:check", "npm run build", "git diff --check", "浏览器本地预览冒烟:http://localhost:4175/ 页面正常挂载,控制台无 error" ] }, "sourceReleaseV223": { "version": "2.2.3", "status": "source-only", "date": "2026-06-15", "description": "v2.2.3 GitHub 源码版:继续收口动漫标签大师 Danbooru / Gelbooru 在线图库体验,本次只推公开源码,不打包 Electron,不发布 GitHub Release / latest.yml 自动更新资产。", "highlights": [ "动漫标签大师在线源保持 provider/source 模型,分类只保留画师 / Artist、作品 IP / Copyright、角色 IP / Character、General / Meta,不再把 Danbooru / Gelbooru 混进分类。", "修复在线结果被前端通用搜索按名称重排的问题,Danbooru / Gelbooru 列表保留后端按 post_count 返回的热门顺序。", "补齐在线搜索回车触发、分页、返回标签列表、分类搜索不串回画师、搜索默认空值、紧凑搜索按钮和按钮文字居中。", "Gelbooru 未登录兜底继续使用公开 autocomplete / HTML,候选集合按 post_count 降序整理;预览失败不再显示误导性占位图,并保留 3 次预览重试。", "在线卡片和弹层收口长文本溢出、预览小眼睛、100% 悬停预览、标签输出只保留 Tags / Prompt 两行。", "公开版本同步到 2.2.3:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.2.3.md 同步;本次不打包 Electron,不发布 GitHub Release。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.2.3.md", "src/data/animeTagMasterManifest.ts", "src/utils/animeTagMaster.ts", "src/components/nodes/AnimeTagMasterNode.tsx", "src/styles/index.css", "backend/src/routes/animeTags.js", "tests/animeTagMaster.test.ts" ], "sourceOnly": { "githubPush": true, "electronPackaging": false, "githubRelease": false, "blockedCommands": [ "npm run dist:release", "npm run dist", "npm run release:github", "npm run release:verify" ] }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、Electron 缓存目录、comfyui-anima-t8/** 参考 clone 和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器、FAL 应用制作工具和维护者本机调试素材仍为本地开发工具,不进入公开源码。", "本次不生成安装包、blockmap、latest.yml,也不创建或更新 GitHub Release。" ], "verification": [ "node --test tests\\animeTagMaster.test.ts", "node -c backend\\src\\routes\\animeTags.js", "npm run type-check", "npm run build", "npm run public:check", "git diff --check" ] }, "animeTagMasterOnlineGalleryV223Dev": { "version": "2.2.3-dev", "status": "implemented-dev", "date": "2026-06-14", "description": "动漫标签大师在线图库二次重构:Danbooru / Gelbooru 不再作为分类,在线源改为 provider/source;在线分类新增 provider-aware General / Meta,Danbooru 实际请求 meta,Gelbooru / Galbooru 实际请求 general。", "highlights": [ "移除 ANIME_TAG_MASTER_CATEGORIES 中的 在线图库 Danbooru / 在线图库 Gelbooru,节点分类下拉不再被站点名称污染。", "新增在线 tag 分类浏览:画师 / Artist、作品 IP / Copyright、角色 IP / Character、General / Meta,并支持搜索、字母筛选、刷新和分页。", "新增 /api/anime-tags/tags、/api/anime-tags/tags/refresh、/api/anime-tags/posts,支持先分页浏览 tag,再点进 tag 分页查看作品图片、提示词和来源链接。", "Danbooru 使用站点可接受的产品 UA,避免 Node fetch 触发 Cloudflare 403;Gelbooru 未配置 user_id/api_key 时直接走公开 autocomplete / HTML 兜底,并正确识别 autocomplete 的 category 字段,避免节点加载空白。", "节点顶部来源选择 Danbooru / Gelbooru 时同步在线 provider;真实本地接口已验证 Danbooru tag/post、Gelbooru tag/post 均返回非空。", "保留旧 /api/anime-tags/search 兼容入口,但前端在线图库面板优先使用新的 tag/post 分层加载。" ], "sourceFiles": [ "roadmap.md", "skill.md", "features.json", "src/data/animeTagMasterManifest.ts", "src/utils/animeTagMaster.ts", "src/components/nodes/AnimeTagMasterNode.tsx", "src/styles/index.css", "backend/src/routes/animeTags.js", "tests/animeTagMaster.test.ts" ], "verification": [ "node --test tests\\animeTagMaster.test.ts", "node -c backend\\src\\routes\\animeTags.js", "npm run type-check", "npm run build", "git diff --check" ] }, "electronReleaseV222": { "version": "2.2.2", "status": "electron-release", "date": "2026-06-14", "description": "v2.2.2 Electron 自动更新发布:在 v2.2.1 源码版基础上把维护者已封装的 RH 工具箱真实 AI 应用纳入用户包,并补齐打包前 manifest preflight、打包后前端 bundle 标记检查、动漫标签大师在线预览与艺术风格短提示词修复。", "highlights": [ "RH 工具箱从禁用模板升级为正式内置 5 个 RunningHub AI 应用:高清抠图、图案提取V10、Bernini 图生视频+音效、bernini 图像编辑、Bernini 文生视频+音效,用户包不再依赖开发态制作器 localStorage。", "新增 scripts/check-rh-toolbox-release.cjs 与 npm run rh-toolbox:check,发布前校验 manifest 非空、真实启用工具、分类、输入 / 输出映射、select 选项、危险 token 和 hash。", "npm run dist:release 在 build + encrypt 前强制执行 RH 工具箱发布清单检查;electron/_post_build.cjs 在打包后继续扫描制作器泄漏,并确认前端产物包含 5 个 RH 工具及 WebAppId 标记。", "动漫标签大师在线图库继续收口 Danbooru / Gelbooru / Galbooru 懒加载预览、分类结构和节点内滚动展示;艺术风格大师输出风格提示词带名称前缀。", "保留 v2.2.1 的资源库、任务完成提示音、输出素材持久化、图像裁切比例、Codex / 生图工作台输入预览和俄罗斯方块主题修复。", "公开版本同步到 2.2.2:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.2.2.md 同步;本次生成 Electron 安装包、blockmap 与 latest.yml,并发布 GitHub Release 自动更新资产。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.2.2.md", "scripts/check-rh-toolbox-release.cjs", "scripts/dist-release.cjs", "electron/_post_build.cjs", "src/data/rhToolboxManifest.ts", "tests/rhToolbox.test.ts" ], "packaging": { "script": "npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.2.2.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.2.2.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.2.2 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器仍为本机开发工具,不进入公开源码和公开打包产物;用户包只读取 src/data/rhToolboxManifest.ts 中的发布 manifest。", "发布 manifest 只包含 WebApp ID、分类、字段映射、默认参数和输出协议,不包含 RunningHub API Key、curl、localStorage 草稿或制作器源码。" ], "verification": [ "node --test tests\\artistStyleMaster.test.ts tests\\animeTagMaster.test.ts tests\\resourceLibraryPanorama.test.ts tests\\rhToolbox.test.ts tests\\taskCompletionSound.test.ts tests\\taskCompletionSoundRoute.test.ts tests\\nodeAlign.test.ts tests\\imageCropAspect.test.ts tests\\outputMaterialPersistence.test.ts tests\\textNodeResize.test.ts tests\\canvasCenterShortcut.test.ts tests\\themeRegistry.test.ts tests\\apiSettingsTheme.test.ts", "node -c backend\\src\\routes\\animeTags.js", "node -c scripts\\check-rh-toolbox-release.cjs", "node -c electron\\_post_build.cjs", "npm run rh-toolbox:check", "npm run type-check", "npm run build", "npm run public:check", "git diff --check", "npm run dist:release" ] }, "sourceReleaseV221": { "version": "2.2.1", "status": "source-only", "date": "2026-06-14", "description": "v2.2.1 GitHub 源码版:继续收口灵感之源、资源库、工具节点、Codex / 生图工作台、RH 工具箱、图像裁切、任务提示音和画布快捷体验;本次不打包 Electron,不发布 GitHub Release 自动更新资产。", "highlights": [ "艺术风格大师补齐素材右键保存风格、自定义图片上传、分类 / 流派筛选与节点内滚轮浏览,输出风格提示词 / 图片可稳定生成对应 OutputNode;风格提示词收敛为单行「风格提示词, Use this as a visual style reference...」格式,避免输出冗长元信息。", "新增并完善动漫标签大师节点,按 comfyui-anima-t8 思路懒加载 Danbooru / Gelbooru 等图库,支持标签 / 图像输出、自定义分类、导入导出和素材右键保存。", "资源库分类新增 / 重命名 / 删除恢复可用,任务完成提示音支持设置页上传自定义音频,顶部快捷栏新增输出素材持久化开关。", "画布交互修复 Home 键回到画布中心、文本节点长文缩放溢出、对齐 / 整理顺序颠倒、图像编辑裁切比例默认撑满和俄罗斯方块主题节点顶部残影。", "RH 工具箱每次读取 NodeList 都以当前 WebAppId 为准,不再混入上一次应用字段;修复 fieldType: TEXT 被误判为 Prompt 导致 aspect_ratio / quality 等 LIST 下拉为空的问题,制作器保存和旧工具节点运行时都会补齐 select 选项;用户节点隐藏调试映射块但保持参数映射完整。", "Codex CLI Agent 简约模式和 Codex 生图工作台继续补齐上游图片预览、排序、删除和图像模式 / LLM 模式边界;模型帮助新增 gpt-image-2-vip 注意事项。", "公开版本同步到 2.2.1:package.json、package-lock.json、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.2.1.md 同步;本次只推 GitHub 源码。" ], "releaseFiles": [ "package.json", "package-lock.json", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.2.1.md" ], "sourceOnly": { "githubPush": true, "electronPackaging": false, "githubRelease": false, "blockedCommands": [ "npm run dist:release", "npm run dist", "npm run release:github", "npm run release:verify" ] }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器与 FAL 应用制作工具仍为本地开发工具,不进入公开源码。", "真实 Grok OAuth 私有调用、New API 分组令牌等私有能力继续通过本机 ignored local-private 扩展 / 加密链路处理。" ], "verification": [ "node --test tests\\artistStyleMaster.test.ts tests\\animeTagMaster.test.ts tests\\resourceLibraryPanorama.test.ts tests\\rhToolbox.test.ts tests\\taskCompletionSound.test.ts tests\\taskCompletionSoundRoute.test.ts tests\\nodeAlign.test.ts tests\\imageCropAspect.test.ts tests\\outputMaterialPersistence.test.ts tests\\textNodeResize.test.ts tests\\canvasCenterShortcut.test.ts tests\\themeRegistry.test.ts tests\\apiSettingsTheme.test.ts", "node -c backend\\src\\routes\\animeTags.js", "npm run type-check", "npm run build", "npm run public:check", "git diff --check" ] }, "sourceReleaseV220": { "version": "2.2.0", "status": "source-only", "date": "2026-06-14", "description": "v2.2.0 GitHub 源码版:收口灵感之源艺术风格大师、批量素材去黑/白/透明边、Codex CLI Agent 与 Codex 生图工作台输入预览和输出链路、俄罗斯方块主题大屏/拖动残影/难度曲线;本次不打包 Electron,不发布 GitHub Release 自动更新资产。", "highlights": [ "左侧新增「灵感之源」分类和「艺术风格大师」节点,迁移 qiaomu 艺术家风格库,支持搜索、流派/分类筛选、lightbox、方向键切换、复制画家提示词、自定义风格和导入导出。", "艺术风格大师节点输出按钮可直接生成风格提示词或风格图片 OutputNode;节点缩略图改为内部滚轮浏览,长分类和长画家名不再撑出节点;自定义风格支持本地上传图片并保存到用户库。", "批量素材处理优先修复去除边框能力:支持黑边、白边、透明边和自动检测,支持自动裁切、手动像素与 gap 类滑动调整,并在结果中显示裁掉像素。", "Codex CLI Agent 简约模式和 Codex 生图工作台补齐上游图像预览、排序和删除,修复简约模式图像输出误落文本的问题,并保留创作台素材区原有逻辑。", "俄罗斯方块主题继续修复节点拖动顶部残影、大屏游戏模式布局、关卡速度和技能消耗曲线,同时保留隐藏奖励影片与通关过场。", "公开版本同步到 2.2.0:package.json、package-lock.json、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.2.0.md 同步;本次只推 GitHub 源码。" ], "releaseFiles": [ "package.json", "package-lock.json", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.2.0.md" ], "sourceOnly": { "githubPush": true, "electronPackaging": false, "githubRelease": false, "blockedCommands": [ "npm run dist:release", "npm run dist", "npm run release:github", "npm run release:verify" ] }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器与 FAL 应用制作工具仍为本地开发工具,不进入公开源码。", "真实 Grok OAuth 私有调用、New API 分组令牌等私有能力继续通过本机 ignored local-private 扩展 / 加密链路处理。" ], "verification": [ "node --test tests\\artistStyleMaster.test.ts tests\\batchProcessor.test.ts tests\\codexCliAgent.test.ts tests\\codexImageConjure.test.ts tests\\themeRegistry.test.ts tests\\updateMdRegressions.test.ts", "node -c backend\\src\\routes\\imageOps.js", "npm run type-check", "npm run build", "npm run public:check", "git diff --check" ] }, "electronReleaseV219": { "version": "2.1.9", "status": "electron-release", "date": "2026-06-13", "description": "v2.1.9 Electron 自动更新发布:在 v2.1.8 源码版基础上继续收口俄罗斯方块主题、Codex / Grok Agent、FAL 超市新增模型、隐藏奖励影片和多主题可读性,并重新打包安装包、blockmap 与 latest.yml。", "highlights": [ "俄罗斯方块主题新增大屏游戏模式、99 关通关 10 秒仪式感过场、隐藏奖励影片解锁提示、开发检查点、平滑速度 / 技能消耗曲线、Guard 随机清障、新形状和独立颜色。", "Tetris / RH / 幽游白书 / 龙珠 / 科技风隐藏奖励影片以加密 .t8media 随桌面端分发,成就完成后可在影片馆播放。", "Codex CLI Agent 稳定简约模式和创作台:LLM / IMG 双模式、默认模型切换、IMG 默认 imagegen Skill、创作台会话记忆、模板 / Skill / 参考素材注入、产物库删除 / 清空 / 批量删除、文本复制和自动滚动。", "Codex 生图工作台继续保留队列、公共图库、模板 / 片段工具、参数快捷 Chip、历史记录和输出素材衔接。", "Grok Agent 修复视频任务链路:SSE 轮询不再误判中止,视频轮询延长到 15 分钟,状态错误带出 request id 和最后状态;优先新版 /v1/videos/{request_id} 查询,并补齐编辑 / 延长入口。", "FAL 超市新增 Bernini R、Luma Ray / Uni、BRIA、Nemotron ASR、Pixelcut 等模型入口,参数、分类、输入输出和测试覆盖同步更新。", "继续修复批量素材处理、AI 消除水印、上传 / 输出素材预览、主题侧边栏、Codex / Grok 创作台深浅色可读性和输出发布链路。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.1.9.md" ], "packaging": { "script": "npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.1.9.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.1.9.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.1.9 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器与 FAL 应用制作工具仍为本地开发工具,不进入公开源码和公开打包产物。", "真实 Grok OAuth 私有调用、New API 分组令牌等私有能力继续通过本机 ignored local-private 扩展 / 加密链路处理。" ], "verification": [ "node --test tests\\tetrisEngine.test.ts tests\\themeRegistry.test.ts tests\\batchProcessor.test.ts tests\\codexCliAgent.test.ts tests\\codexImageConjure.test.ts tests\\grokOAuthAgent.test.ts tests\\grokVideo15.test.ts tests\\aiWatermarkRunner.test.ts tests\\achievements.test.ts tests\\updateMdRegressions.test.ts tests\\electronPackaging.test.ts tests\\falToolbox.test.ts", "node -c backend\\src\\routes\\codexCli.js", "node -c backend\\src\\utils\\codexCliRunner.js", "node -c backend\\src\\routes\\grokOAuth.js", "node -c backend\\src\\routes\\aiWatermark.js", "npm run type-check", "npm run build", "npm run public:check", "git diff --check", "npm run dist:release" ] }, "sourceReleaseV218": { "version": "2.1.8", "status": "source-only", "date": "2026-06-13", "description": "v2.1.8 GitHub 源码版:收口俄罗斯方块主题、批量素材处理、Codex CLI Agent / Codex 生图工作台、Grok Agent 视频修复、AI 消除水印升级和多主题可读性修复;本次不打包 Electron,不发布 GitHub Release 自动更新资产。", "highlights": [ "俄罗斯方块主题补齐 Korobeiniki 默认音乐、方块化画布/节点/连线/小地图和 10x20 小游戏体验,关卡、障碍、技能、存档和视觉反馈持续增强。", "工具箱新增批量素材处理节点,覆盖多文件/文件夹导入、批量改名、去黑边、抠图、扩图、高清放大、格式转换和打开输出文件夹。", "Codex CLI Agent 支持简约模式和创作台:LLM/IMG 双模式、Skill 调用、项目 Skill、模板工坊、产物库、参考素材可视化、流式对话、文本复制、产物发布和深色主题可读性修复。", "Codex 生图工作台节点面向 imagegen 流程,提供队列、公共图库、模板/片段工具、参数快捷 Chip、批量历史和画布输出衔接。", "Grok Agent 修复视频任务轮询、模式高亮、产物库删除/清空/批量删除和深色主题可读性;视频节点补齐 grok-1.5-video-6s/10s/15s 的 Zhenzhen New size 参数。", "AI 消除水印跟进 remove-ai-watermarks 新版能力,补齐前端节点、后端路由和本地 runtime 文档;同时修复素材拖动、预览、侧边栏主题可读性和输出产物链路。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.1.8.md" ], "sourceOnly": { "githubPush": true, "electronPackaging": false, "githubRelease": false, "latestYml": false, "note": "按用户要求只推 GitHub 源码,不运行 npm run dist:release,不打包 Electron,不创建或更新 GitHub Release。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器与 FAL 应用制作工具仍为本地开发工具,不进入公开源码和公开打包产物。", "真实 Grok OAuth 私有调用、New API 分组令牌等私有能力继续通过本机 ignored local-private 扩展 / 加密链路处理。" ], "verification": [ "node --test tests\\tetrisEngine.test.ts tests\\themeRegistry.test.ts tests\\batchProcessor.test.ts tests\\codexCliAgent.test.ts tests\\codexImageConjure.test.ts tests\\grokOAuthAgent.test.ts tests\\grokVideo15.test.ts tests\\aiWatermarkRunner.test.ts tests\\achievements.test.ts tests\\updateMdRegressions.test.ts tests\\electronPackaging.test.ts", "node -c backend\\src\\routes\\codexCli.js", "node -c backend\\src\\utils\\codexCliRunner.js", "node -c backend\\src\\routes\\grokOAuth.js", "node -c backend\\src\\routes\\aiWatermark.js", "npm run type-check", "npm run build", "npm run public:check", "git diff --check" ] }, "electronReleaseV217": { "version": "2.1.7", "status": "electron-release", "date": "2026-06-11", "description": "v2.1.7 Electron 自动更新发布:收口 ComfyUI Workflow 识别、排除规则备份、百度/夸克 WebDAV 上传、ComfyUI 超市端口裁切、Grok Video 默认模型显示和圣斗士主题细节修复。", "highlights": [ "ComfyUI API Workflow 字段识别增强,前端制作器、图像节点和后端 provider 共享 prompt/image/video/audio/ControlNet/UNet/CLIP Vision/FPS/guidance 等常见字段规则。", "ComfyUI 自动映射排除规则支持 JSON 导入导出,设置页和 ComfyUI 应用制作工具节点都可复用同一份规则备份。", "百度网盘与夸克网盘上传补齐 WebDAV 网关方案,支持配置检查、自动建目录、PUT 上传和更明确的错误提示。", "ComfyUI 超市节点外层不再裁切 React Flow 入口/出口端口,强主题下左右连接点保持可见。", "视频节点 Grok Video 默认模型显示为 grok-video-3(新版1.5),后台模型映射保持 grok-video-3 不变。", "圣斗士主题继续修正冥界雷达、浅/深色可读性和小地图元素位置,避免主题 UI 遮挡创作画布。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.1.7.md" ], "packaging": { "script": "npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.1.7.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.1.7.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.1.7 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器与 FAL 应用制作工具仍为本地开发工具,不进入公开源码和公开打包产物。", "真实 Grok OAuth 私有调用继续通过本机 ignored local-private 扩展 / 加密链路处理,公开仓库只保留安全外壳。" ], "verification": [ "node -c backend\\src\\cloudUploads\\settings.js", "node -c backend\\src\\cloudUploads\\uploader.js", "node -c backend\\src\\providers\\comfyui.js", "node --test tests\\cloudUploads.test.ts tests\\comfyuiProvider.test.ts tests\\comfyuiImageNode.test.ts tests\\comfyuiAppsManifest.test.ts tests\\comfyuiAppNodes.test.ts tests\\grokVideo15.test.ts tests\\modelUsageHelp.test.ts tests\\saintSeiyaBattle.test.ts tests\\achievements.test.ts", "npm run type-check", "npm run build", "npm run public:check", "npm run dist:release", "npm run release:verify" ] }, "tetrisCanvasTheme": { "status": "implemented", "date": "2026-06-11", "description": "新增俄罗斯方块主题:十二套内置主题中的强识别 Tetris Canvas,包含浅色奶白彩块、深色街机霓虹、方块化节点/工具栏/小地图/连线,以及右上角可玩的 10x20 俄罗斯方块小游戏。", "highlights": [ "新增 visualStyle=tetris、iconPack=tetromino-well、canvasPattern=tetris-stack、nodeFrame=arcade-cabinet-card 和 block-drop 合成主题音乐 preset。", "TetrisPanel 挂在 CanvasToolbar 子扩展位,默认展开、可折叠,展开面板相对按钮定位 right:0,不使用 fixed 大遮罩,避免挡住 RUN 和核心工具栏。", "小游戏使用纯逻辑 tetrisEngine:10x20 棋盘、7-bag、公平出块、墙踢旋转、幽灵落点、暂存、硬降、消行计分、99 级速度递增和本地最高分/局面恢复。", "键盘只在 Tetris 面板 hover 或 focus 且目标不是 input/textarea/select/contenteditable 时截获方向键、空格、Shift/C、P、R;鼠标离开、窗口失焦、画布移动或节点拖动时自动暂停。", "成就系统新增 tetris 主题轨道和 tetris.game_started / line_clear / tetris_clear / level_reached / game_over 摘要事件,只保存计数与等级,不保存棋盘、Prompt 或资源 URL。" ], "files": [ "src/utils/tetrisEngine.ts", "src/components/TetrisPanel.tsx", "src/components/TetrisThemeButton.tsx", "src/styles/theme-tetris.css", "src/theme/types.ts", "src/theme/defaultTemplates.ts", "src/components/ThemeTemplateManager.tsx", "src/components/ThemeMusicToggle.tsx", "src/components/Canvas.tsx", "shared/achievementManifest.json", "backend/src/achievements/store.js", "tests/tetrisEngine.test.ts", "tests/themeRegistry.test.ts", "tests/achievements.test.ts" ], "verification": [ "node --test tests\\tetrisEngine.test.ts tests\\themeRegistry.test.ts", "node --test tests\\achievements.test.ts", "node -c backend\\src\\achievements\\store.js", "npm run type-check", "npm run build" ] }, "farmStoryCanvasTheme": { "status": "electron-release", "date": "2026-06-18", "description": "牧场物语主题已随 v2.3.0 Electron 自动更新版发布:新增第 13 套强识别 Farm Story Canvas 主题,把主题色、木牌节点、牧场地图底纹、端口/连线/剪线语义、MiniMap 摘要标记、牧场 HUD、右侧控制台和全画布种植/建造/装饰养成层组合成一套可玩的画布牧场体验。", "protocol": { "visualStyle": "farm-story", "iconPack": "farm-tools", "canvasPattern": "pasture-map", "nodeFrame": "farm-sign-card", "musicPreset": "farm-breeze" }, "highlights": [ "新增 visualStyle=farm-story、iconPack=farm-tools、canvasPattern=pasture-map、nodeFrame=farm-sign-card 和 farm-breeze 合成主题音乐 preset;前端类型、内置模板、主题管理器、主题音乐、后端主题导入白名单和路由行为测试均已覆盖。", "FarmCanvasState 使用 ReactFlow 世界坐标和稀疏存档,支持开垦、播种、浇水、过一天、收获、订单、建筑、装饰、移动、资源库图片转招牌/画架/海报墙装饰,并通过前后端 sanitizer 保留安全摘要。", "牧场玩法层已形成 10 分钟闭环:初始资源、4 种作物、天气/节庆、每日总结、动物每日产出、NPC 来访委托、轻量惊喜池、长期目标卡、漂亮度评分与等级奖励、成就事件和轻音效占位。", "牧场强主题覆盖画布部件:木牌节点 7 态、端口类型分型、连接线 rope/water/path 三语义、SHIFT 镰刀剪线和中点切断反馈、MiniMap 单地图叠加标记和高密度聚合、重负载拖动降级、HUD live ticker 和最近农活反馈。", "本阶段 v2.3.0 已正式作为 Electron 自动更新版发布:2026-06-21 R483 完成真实浏览器浅色/深色截图验收并修复顶部快捷栏垂直裁切,R484 同步 release notes、公开版本号和本地 Electron 打包验证,R498 在用户明确授权后发布 GitHub Release v2.3.0 / latest.yml 自动更新资产。", "2026-06-21 R486 继续收口顶部监控看板:每日路线从长串文本改为低占用焦点胶囊,按开始 / 下一步 / 收尾 / 明日开局显示当前行动,保留旧路线摘要数据并补齐浅色 / 夜间可读样式。", "2026-06-21 R487 修复顶部监控降噪白名单:monitor-brief 主优先卡进入白名单,并显式 inline-grid 排版,避免左侧优先入口空白或图标 / 文字挤乱。", "2026-06-21 R488 完成真实浏览器浅色 / 夜间最终复核:右侧控制台 header 的 FARM STORY 品牌字从 9px 提升到 11px,并补 CSS 护栏;Chrome QA 确认顶部看板、快捷栏和右上工具栏不重叠、不裁切,夜间无灰字小字回归。", "2026-06-21 R489 完成 Phase 7 非发布性能护栏:FarmCanvasLayer 根层输出可见对象数、虚拟化状态和渲染 margin,并继续只用 visibleObjects.map() 挂载可视区对象。", "2026-06-21 R490 继续 Phase 7 非发布性能收口:道路 / 栅栏连接 map 改为从 visibleObjects 构建,并输出 connection object count 诊断。", "2026-06-21 R491 继续 Phase 7 非发布性能收口:稻草人守护候选改为可视区 + 渲染 margin + 6 格守护半径裁剪,并输出 scarecrow object count / render margin 诊断。", "2026-06-21 R492 继续 Phase 7 非发布性能收口:FarmCanvasLayer 拆出非牧场主题轻量 wrapper,普通主题不再进入牧场 runtime 重计算。", "2026-06-22 R493 继续 Phase 7 非发布性能收口:FarmStoryPanel 拆出非牧场主题轻量 wrapper,普通主题不再进入牧场控制台 runtime 重计算。", "2026-06-22 R494 完成 Phase 7 非发布最终验收:修正 themeRegistry 中过期稻草人全量扫描断言,组合回归 28/28 通过,并完成真实 Chrome 浅色 / 夜间冒烟。", "2026-06-22 R495 完成非发布完成态审计:当前剩余硬边界只包含用户验收反馈和明确发布授权,主题状态切换为 user-acceptance。", "2026-06-22 R496 完成非发布完成审计复核:新鲜复跑组合回归、type-check、features.json parse 与 git diff --check,并复核 R494 浏览器 QA 产物,确认第五阶段仍处于可用户验收状态。", "2026-06-22 R498 正式发布:用户明确授权打包 Electron 并发布自动更新版,v2.3.0 GitHub Release 成为桌面端 latest 更新源。" ], "files": [ "src/theme/types.ts", "src/theme/defaultTemplates.ts", "src/components/ThemeTemplateManager.tsx", "src/components/ThemeMusicToggle.tsx", "src/components/Canvas.tsx", "src/components/FarmCanvasLayer.tsx", "src/components/FarmStoryPanel.tsx", "src/components/Sidebar.tsx", "src/components/edges/DeletableEdge.tsx", "src/styles/theme-farm-story.css", "src/utils/farmCanvas.ts", "src/utils/farmSound.ts", "backend/src/routes/canvas.js", "backend/src/routes/themes.js", "backend/src/achievements/store.js", "shared/achievementManifest.json", "tests/farmCanvas.test.ts", "tests/themeRegistry.test.ts", "tests/themeRoutes.test.ts", "tests/achievements.test.ts" ], "verification": [ "2026-06-22 R498: node --test tests\\electronPackaging.test.ts tests\\resourceLibraryDrawer.test.ts (7/7 pass)", "2026-06-22 R498: node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts tests\\achievements.test.ts (38/38 pass)", "2026-06-22 R498: npm run rh-toolbox:check (pass: 11 tools / 9 categories)", "2026-06-22 R498: npm run public:check (pass)", "2026-06-22 R498: npm run type-check (pass)", "2026-06-22 R498: git diff --check (pass with LF/CRLF warnings only)", "2026-06-22 R498: npm run build (pass; retained empty react-vendor and chunk-size warnings)", "2026-06-22 R498: T8_REQUIRE_AI_WATERMARK_RUNTIME=1 T8_REQUIRE_PARSEHUB_RUNTIME=1 T8_REQUIRE_RUNTIME_ARCHIVES=1 T8_REQUIRE_UPDATE_ARTIFACTS=1 npm run dist (pass; generated installer 1178230140 bytes, blockmap 1228827 bytes, latest.yml 2.3.0)", "2026-06-22 R498: win-unpacked T8-PenguinCanvas.exe 15s smoke alive; title=贞贞的无限画布(企鹅共创版)", "2026-06-22 R496: node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts (28/28 pass, fresh completion audit)", "2026-06-22 R496: npm run type-check (pass)", "2026-06-22 R496: features.json parse check (pass)", "2026-06-22 R496: git diff --check (pass with LF/CRLF warnings only)", "2026-06-22 R496: inspected artifacts\\farm-story-r494-browser\\farm-story-browser-qa-r494.json (light/dark pass; no toolbar overlap, no panel offscreen, tinyTextCount 0)", "2026-06-22 R495: node --test --test-name-pattern \"Farm Story phase 5 acceptance guard\" tests\\themeRegistry.test.ts (red before status switch; expected roadmap-development mismatch)", "2026-06-22 R495: node --test --test-name-pattern \"Farm Story phase 5 acceptance guard\" tests\\themeRegistry.test.ts (pass after user-acceptance switch)", "2026-06-22 R495: features.json parse check (pass)", "2026-06-22 R494: node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts (first run 27/28 pass; stale scarecrow assertion exposed)", "2026-06-22 R494: node --test --test-name-pattern \"Farm Story theme mounts canvas chrome\" tests\\themeRegistry.test.ts (pass, ~458s)", "2026-06-22 R494: node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts (28/28 pass, ~595s)", "2026-06-22 R494: Chrome/CDP browser QA artifacts/farm-story-r494-browser/farm-story-browser-qa-r494.json (light/dark pass; screenshots farm-story-r494-light.png / farm-story-r494-dark.png)", "2026-06-22 R494: npm run type-check (pass)", "2026-06-22 R493: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~655s)", "2026-06-22 R493: npm run type-check (pass)", "2026-06-21 R492: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~637s)", "2026-06-21 R492: npm run type-check (pass)", "2026-06-21 R491: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~643s)", "2026-06-21 R491: npm run type-check (pass)", "2026-06-21 R490: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~616s)", "2026-06-21 R490: npm run type-check (pass)", "2026-06-21 R489: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~640s)", "2026-06-21 R489: npm run type-check (pass)", "2026-06-21 R488: Chrome Playwright browser QA artifacts/farm-story-r488-browser/farm-story-browser-qa-r488.json (light/dark pass; no tiny text below 10.5px)", "2026-06-21 R488: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~256s)", "2026-06-21 R488: node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts (28/28 pass, ~859s)", "2026-06-21 R488: npm run type-check (pass)", "2026-06-21 R487: node --test --test-name-pattern \"farm render layer\" tests\\farmCanvas.test.ts (pass, ~240s)", "2026-06-21 R487: node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts (28/28 pass, ~318s)", "node --test tests\\farmCanvas.test.ts tests\\themeRegistry.test.ts tests\\themeRoutes.test.ts", "node --test tests\\achievements.test.ts", "node -c backend\\src\\routes\\canvas.js", "node -c backend\\src\\routes\\themes.js", "node -c backend\\src\\achievements\\store.js", "npm run type-check (2026-06-21 R487 pass)", "2026-06-22 R498: 发布前确认 gh 已登录 T8mars、远端 v2.3.0 tag 不存在、GitHub latest 为 v2.2.9;本轮将按用户授权发布 v2.3.0。" ], "releaseBoundary": [ "features.json、README.md、release-notes/v2.3.0.md 和 docs/theme-design-guide.md 只记录公开主题协议、源码文件和验收边界。", "skill.md 与 roadmap.md 仍为私有协作文档,不进入公开提交;local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现仍禁止进入公开源码。", "浏览器截图验收已在 2026-06-21 R483 完成:Chrome Headless/CDP 在 127.0.0.1:11422/18766 下覆盖浅色与深色,确认 FarmStoryPanel、顶部看板、快捷工具、右上快捷栏和夜间可读性不重叠、不裁切。", "release-notes/v2.3.0.md、README.md、package/lock、vite、Electron main、后端 APP_VERSION 和本地 Electron 打包验证已在 2026-06-21 R484 完成;2026-06-22 R498 已获用户明确发布授权,允许发布 GitHub Release v2.3.0 / latest.yml 自动更新资产。", "2026-06-21 R486 仅调整 FarmStoryPanel 顶部每日路线显示和主题 CSS,不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-21 R487 仅补顶部监控优先卡白名单、CSS 版式护栏和静态测试记录;不改后端、不碰 3D 全景、不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-21 R488 仅补右侧控制台 header 品牌字可读性 CSS 护栏、真实浏览器截图 QA 和私有/公开记录;不改后端、不碰 3D 全景、不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-21 R489 仅补 FarmCanvasLayer 可视区渲染诊断属性和测试记录;不新增存档字段、不改后端、不碰 3D 全景、不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-21 R490 仅补 FarmCanvasLayer 连接 map 可视区裁剪、connection count 诊断属性和测试记录;不新增存档字段、不改后端、不碰 3D 全景、不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-21 R491 仅补 FarmCanvasLayer 稻草人守护候选可视区 + 半径裁剪、scarecrow count / margin 诊断属性和测试记录;不新增存档字段、不改后端、不碰 3D 全景、不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-21 R492 仅补 FarmCanvasLayer 非牧场主题轻量 wrapper、runtime 拆分和测试记录;不新增存档字段、不改后端、不碰 3D 全景、不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-22 R493 仅补 FarmStoryPanel 非牧场主题轻量 wrapper、runtime 拆分和测试记录;不新增存档字段、不改后端、不碰 3D 全景、不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-22 R494 仅补陈旧测试契约修正、组合回归、Chrome/CDP 浏览器冒烟和记录;不新增存档字段、不改后端、不碰 3D 全景、不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-22 R495 仅补 user-acceptance 状态切换、验收护栏测试和记录;不新增存档字段、不改后端、不碰 3D 全景、不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-22 R496 仅补完成审计复核、非发布验收命令和记录;不新增存档字段、不改运行逻辑、不改后端、不碰 3D 全景、不运行 Electron 打包、GitHub Release、tag 或 push。", "2026-06-22 R498 正式发布:本轮允许设置 T8_RELEASE_APPROVAL=release-2.3.0 打包 Electron 并上传 GitHub Release;公开源码仍禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/** 和私有计费/支付/充值实现。" ] }, "resourceLibraryDrawerPromptFix": { "status": "source-only", "date": "2026-06-22", "description": "R497 资源库抽屉交互热修:将 7 个资源库大分类下的子分类新增 / 重命名,以及资源条目重命名,从浏览器原生 window.prompt 改为抽屉内应用弹窗,避免部分 Electron / 浏览器环境里 prompt 被拦截、失焦或表现为点击无反应;删除分类仍保留原确认流程。", "rootCause": "分类新增和重命名依赖 window.prompt,而删除依赖 window.confirm;用户环境中原生 prompt 可能被窗口策略或焦点策略拦截,因此会出现删除可用但新增 / 重命名无反应。", "highlights": [ "ResourceLibraryDrawer 新增 categoryDialog 状态:新建分类和重命名分类都在资源库抽屉内弹出输入框,支持回车提交、Esc / 点击遮罩取消、空名提示和成功后刷新分类。", "新建分类成功后自动选中新分类;重命名分类保持当前分类上下文并刷新列表。", "资源条目重命名同步改为 itemRenameDialog 应用内弹窗,资源库抽屉内不再依赖 window.prompt,避免同类环境问题复发。", "新增 tests/resourceLibraryDrawer.test.ts 静态回归,锁定资源库抽屉不得出现 window.prompt,并要求分类弹窗和条目重命名弹窗的测试标记存在。" ], "files": [ "src/components/ResourceLibraryDrawer.tsx", "tests/resourceLibraryDrawer.test.ts", "features.json" ], "releaseBoundary": [ "本次只推公开源码,不打包 Electron,不运行 dist / dist:release,不创建 GitHub Release,不创建 tag,不上传 latest.yml。", "skill.md 已本地补充私有协作记录,但按项目规范不进入公开提交;roadmap.md、local-private/**、hermes-agent/**、comfyui-anima-t8/**、Electron 缓存目录和 artifacts/** 仍禁止进入公开源码。" ], "verification": [ "2026-06-22 R497: node --test tests\\resourceLibraryDrawer.test.ts (red before item prompt removal, pass after in-app dialogs)", "2026-06-22 R497: npm run type-check (pass)", "2026-06-22 R497: git diff --check -- src\\components\\ResourceLibraryDrawer.tsx tests\\resourceLibraryDrawer.test.ts (pass with LF/CRLF warnings only)" ] }, "batchProcessorNode": { "status": "implemented", "date": "2026-06-11", "nodeType": "batch-processor", "category": "toolbox", "description": "工具箱新增“批量素材处理”节点:支持多文件、整个文件夹和上游素材批量进入节点内队列,批量执行命名归档、去除上下黑边、批量抠图、批量扩图、高清放大和格式转换;完成后只在节点内显示进度、完成反馈和失败报告,不自动生成 OutputNode,避免画布被大量素材铺满。", "ports": { "inputs": [ "image", "video", "audio", "model3d" ], "outputs": [] }, "capabilities": [ "导入方式覆盖多文件选择、文件夹 webkitdirectory、拖拽和连接上游 image/video/audio/model3d 素材。", "命名支持使用原名字,也支持改名字模板:{name}、{index}、{n}、{kind}、{folder},并可设置起始序号、补零位数和图片输出格式。", "图像批处理首版覆盖去除上下黑边、现有 remove-bg 抠图通道、扩画布到常用比例、Sharp 本地高清放大和 PNG/JPG/WEBP 转换。", "视频、音频和 3D 素材首版执行批量命名归档,后续可继续扩展转码、抽帧、音量规格化、模型格式转换等批处理。", "完成后可在节点左下角直接打开 output/batch 文件夹查看本次批处理结果。", "节点内维护 batchProcessorItems、batchProcessorProgress 和 batchProcessorResults;不写 imageUrls/videoUrls/audioUrls/outputText,不触发画布自动外挂素材节点。" ], "sourceFiles": [ "src/components/nodes/BatchProcessorNode.tsx", "src/utils/batchProcessor.ts", "src/services/imageOps.ts", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/components/Canvas.tsx", "src/components/NodeActionBar.tsx", "src/utils/nodePlacement.ts", "backend/src/routes/imageOps.js", "backend/src/routes/files.js", "tests/batchProcessor.test.ts" ], "verification": [ "node --test tests\\batchProcessor.test.ts", "node -c backend\\src\\routes\\imageOps.js", "node -c backend\\src\\routes\\files.js", "npm run type-check", "npm run build" ] }, "batchTaggerNode": { "status": "electron-release-v2.4.2", "date": "2026-07-06", "releaseVersion": "2.4.2", "nodeType": "batch-tagger", "category": "toolbox", "description": "工具箱新增“批量打标”节点:支持图像 / 视频多文件、文件夹和上游素材批量进入队列,调用贞贞 LLM 独立 Key或扩展 API 视觉模型生成 TAG、自然语言描述、短句或标准 JSON,并按原素材文件名前缀保存到 output/batch-tags 的 .txt / .json sidecar 文件。", "ports": { "inputs": [ "image", "video", "text" ], "outputs": [ "text", "metadata" ] }, "capabilities": [ "导入方式覆盖本地多文件、文件夹 webkitdirectory、拖拽和连接上游 image/video 素材。", "打标模式覆盖 TAG、自然语言描述、短句 caption、标准 JSON 和自定义 Prompt。", "默认支持贞贞 LLM 独立 Key;扩展 API 支持 OpenAI 兼容、ModelScope、火山、Agnes 等 LLM provider,其中 ModelScope 会推荐 Qwen/Qwen3-VL-235B-A22B-Instruct。", "视频默认使用关键帧抽帧,另提供 URL 和 Base64 高级模式;远端 API 已提交的请求无法真正中断,停止按钮会取消本地队列和后续回写。", "输出 sidecar 使用原素材同名前缀,支持 .txt / .json、失败继续、重试失败项、并发 1-4、覆盖开关和打开 output/batch-tags。", "节点输出 outputText 与 metadata,便于下游继续使用批量结果;大素材本体不写入画布数据。" ], "sourceFiles": [ "src/components/nodes/BatchTaggerNode.tsx", "src/utils/batchTagger.ts", "backend/src/routes/batchTags.js", "backend/src/server.js", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/components/Canvas.tsx", "src/components/NodeActionBar.tsx", "src/components/nodes/LoopNode.tsx", "src/utils/nodePlacement.ts", "tests/batchTagger.test.ts" ], "verification": [ "node --test tests\\batchTagger.test.ts", "node -c backend\\src\\routes\\batchTags.js", "npm run type-check", "真实 API 测试:贞贞 LLM 独立 Key + ModelScope Qwen/Qwen3-VL-235B-A22B-Instruct", "Playwright 截图检查批量打标节点布局" ] }, "randomRouteNode": { "status": "electron-release-v2.4.4", "date": "2026-07-06", "releaseVersion": "2.4.4", "nodeType": "random-route", "category": "utility", "description": "工具节点新增“随机路由”:左侧接受任意数量、任意类型上游素材,右侧动态生成 1-100 个输出口;每次运行按 random_pass_count 精确随机命中不重复输出口,只继续执行命中口后面的下游分支,未命中分支保持不运行。", "ports": { "inputs": [ "any" ], "outputs": [ "any" ] }, "capabilities": [ "total_outputs 默认 10,支持 1-100;random_pass_count 默认 1,并自动限制在 1-total_outputs。", "所有输出口透传同一份上游聚合素材,支持文本、图像、视频、音频和 3D 模型字段。", "每次 RUN 都重新随机,命中输出口在节点 UI 中高亮,并记录上次路由和下游执行节点数。", "Canvas 批量运行、组运行和节点浮动 RUN 都会先触发随机路由节点本身,再由随机路由按本轮命中结果调度下游子图,避免未命中分支误执行。", "随机路由可出现在循环器下游;循环器内部排序会让随机路由节点接管自己的分支。" ], "sourceFiles": [ "src/components/nodes/RandomRouteNode.tsx", "src/utils/randomRoute.ts", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/types/canvas.ts", "src/components/Canvas.tsx", "src/components/NodeActionBar.tsx", "src/components/nodes/LoopNode.tsx", "src/utils/nodePlacement.ts", "tests/randomRoute.test.ts" ], "verification": [ "node --test tests\\randomRoute.test.ts", "npm run type-check", "npm run build", "Playwright 截图和 DOM 检查随机路由节点布局与 10/100 输出口状态" ] }, "codexCliCreatorAgent": { "status": "implemented", "date": "2026-06-12", "nodeType": "codex-cli-agent", "category": "codex", "description": "新增 Codex CLI 创作者 Agent 节点:把本机 Codex CLI 接入画布,面向创作者提供流式对话、提示词增强、图像/视频/音频/3D 产物规划、Skill 调用、项目 Skill 创建、版本树和产物入库。", "ports": { "inputs": [ "text", "image", "video", "audio" ], "outputs": [ "text", "image", "video", "audio", "model3d" ] }, "capabilities": [ "简约生成模式保留一个 Prompt 输入、创作预设、Skill 选择和一键运行,适合快速生成提示词、脚本或素材方案。", "Codex 创作台模式提供流式消息、运行事件、产物库、版本树、质量检查和项目 Skill 抽屉,适合连续创作与多轮修改。", "后端 /api/codex-cli 封装 Codex CLI status、skills、skills/project 和 agent/stream 路由,使用 SSE 返回 turn.started、message.delta、tool.progress、artifact.completed 等事件。", "运行前读取 codex features list,只有当前 CLI 明确支持的 feature 才发送 --enable,避免 plan_tool / web_search 等未知开关导致任务失败。", "状态刷新成功会清理旧的 404/登录/旧 feature 错误;节点标题区提供明确拖动面,输入和按钮继续保留 nodrag。", "Electron 后置检查锁住 routes/codexCli.t8c 与 utils/codexCliRunner.t8c,避免桌面包漏路由后出现 /api/codex-cli 404。", "Skill 扫描覆盖 CODEX_HOME 全局 Skills、用户 .agents/skills、项目 .agents/skills 和节点工作区项目 Skills;节点内可创建当前项目专用 Skill。", "产物解析覆盖文本、图片、视频、音频和 3D 模型 URL;发布后写回节点标准输出字段,也可保存到资源库。" ], "sourceFiles": [ "src/components/nodes/CodexCliAgentNode.tsx", "src/services/codexCli.ts", "backend/src/routes/codexCli.js", "backend/src/utils/codexCliRunner.js", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/components/Canvas.tsx", "src/components/Sidebar.tsx", "src/components/NodeActionBar.tsx", "src/utils/nodePlacement.ts", "electron/_post_build.cjs", "tests/codexCliAgent.test.ts" ], "verification": [ "node --test tests\\codexCliAgent.test.ts", "node --test tests\\electronPackaging.test.ts", "node -c backend\\src\\utils\\codexCliRunner.js", "node -c backend\\src\\routes\\codexCli.js", "node -c electron\\_post_build.cjs", "npm run type-check", "npm run build", "npm run public:check" ] }, "codexImageConjureNode": { "status": "implemented", "date": "2026-06-12", "nodeType": "codex-image-conjure", "category": "codex", "description": "新增 Codex 生图工作台节点:参考 ilab-gpt-conjure 的生图工作台信息架构,保留项目内 Codex CLI / imagegen 生成链路,并独立维护提示词模板、片段、公共图库和本地任务队列。", "ports": { "inputs": [ "text", "image" ], "outputs": [ "image", "text" ] }, "capabilities": [ "节点只面向 Codex CLI 生图,不暴露 OpenAI 兼容 API Provider,默认强制启用 imageGeneration 并注入 imagegen Skill。", "提示词模板和片段使用独立 t8-codex-image-conjure-prompts schema,可导入 ilab webui-prompt-template-pack,也可导出备份。", "公共图库读取资源库图像,可把图库图片和上游图片作为参考图传入 Codex CLI。", "支持任务队列、历史记录、批数、数量、并发、停止运行、自动发布、提示词持久化和素材持久化。", "模板工坊和片段工坊支持新建、保存/重命名、删除、导入和导出,创作者可以维护自己的生图语料。", "完成反馈提供发布、发送画布、入库、继续改、变体和下载动作;简约节点不在完成区渲染大预览图,生成结果直接发布到标准 image/text 输出,后续由输出素材节点展示。" ], "sourceFiles": [ "src/components/nodes/CodexImageConjureNode.tsx", "src/services/codexImageConjure.ts", "src/utils/codexImageConjure.ts", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/components/Canvas.tsx", "src/components/Sidebar.tsx", "src/utils/nodePlacement.ts", "tests/codexImageConjure.test.ts" ], "verification": [ "node --test tests\\codexImageConjure.test.ts", "npm run type-check", "npm run build" ] }, "artistStyleMasterNode": { "status": "implemented", "date": "2026-06-13", "nodeType": "artist-style-master", "category": "inspiration", "description": "左侧新增「灵感之源」分类和「艺术风格大师」节点:迁移 joeseesun/qiaomu-artist-style 本地 383 个艺术家风格参考,面向设计和生图创作提供可搜索、可筛选、可管理的风格提示词与风格图片输出。", "ports": { "inputs": [ "text" ], "outputs": [ "text", "image" ] }, "capabilities": [ "内置 qiaomu 艺术家风格清单与缩略图,支持按英文名、中文名、流派、中文流派、分类、标签和风格描述搜索。", "节点保持简洁:只展示当前选中风格、搜索、流派/分类筛选、输出模式和常用缩略图;节点缩略图列表在固定高度内容器内滚轮浏览,完整图库在外部弹层打开,避免撑高节点。", "图库支持缩略图网格、点击 lightbox 大图、方向键左右切换、Esc 关闭、一键复制画家名称提示词和输出风格提示词。", "运行模式提供「输出风格提示词」与「输出风格图片」两种,节点内两个快捷按钮和底部运行按钮都会生成标准 OutputNode 文本或图片素材;文本只输出当前风格提示词和固定英文 visual reference 句子,图片输出同时携带 directImageUrl/imageUrl 兼容字段。", "支持用户保存当前风格、新增/编辑/删除自定义风格、新增/重命名/删除分类,新增自定义风格可直接上传本地图片并保存到用户库,也可用 t8-artist-style-master@1 JSON 导入导出,便于换版本迁移。", "上传素材节点和输出素材节点的图片素材支持右键「保存风格到艺术风格大师」:输出素材优先自动带出来源提示词,上传素材可手动填写;保存前必须在确认窗里修改或确认风格提示词。", "节点、图库弹层和 lightbox 使用 artist-style-master 命名空间 CSS 变量,覆盖浅色/深色主题文字、按钮、输入框和边框对比度,避免主题切换后文字不可读。" ], "sourceFiles": [ "src/components/nodes/ArtistStyleMasterNode.tsx", "src/components/MaterialContextMenu.tsx", "src/data/artistStyleMasterManifest.ts", "src/utils/artistStyleMaster.ts", "public/artist-style-master/generated/*.webp", "public/artist-style-master/generated/thumbs/*.webp", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/components/Canvas.tsx", "src/components/Sidebar.tsx", "src/utils/nodePlacement.ts", "src/styles/index.css", "tests/artistStyleMaster.test.ts" ], "verification": [ "node --test tests\\artistStyleMaster.test.ts", "npm run type-check", "npm run build" ] }, "animeTagMasterNode": { "status": "implemented", "date": "2026-06-14", "nodeType": "anime-tag-master", "category": "inspiration", "description": "左侧「灵感之源」新增「动漫标签大师」节点:基于 comfyui-anima-t8 的 Danbooru / Gelbooru 在线图库懒加载思路,面向动漫创作提供标签检索、参考图浏览、自定义标签库和一键输出能力。", "ports": { "inputs": [ "text", "image" ], "outputs": [ "text", "image" ] }, "capabilities": [ "内置动漫创作常用标签库,覆盖角色人设、姿势动作、表情情绪、服装配饰、构图镜头、画风质感、光影场景、质量增强和负面排除等分类。", "支持按英文标签、中文名、分类、标签、描述搜索,支持按分类和来源筛选;节点内只展示精简缩略图,完整图库通过外部弹层打开,避免节点被撑高。", "Danbooru 与 Gelbooru / Galbooru 在线图库采用懒加载搜索:用户输入标签后通过 /api/anime-tags 同源代理按需拉取公开预览图,不提前打包大图库,适合后续扩展更多图库源。", "Gelbooru 优先使用 DAPI;未配置 user_id/api_key 或接口拒绝时自动切到公开 HTML 兜底解析,并通过 /api/anime-tags/image 代理预览图,减少 CORS、热链和鉴权导致的空白。", "运行模式提供「输出标签」和「输出图像」两种,按钮和运行动作都会生成标准 OutputNode;图像输出携带 directImageUrl/imageUrl/directImageUrls/imageUrls,便于后续节点继续接线。", "图库支持点击缩略图进入 lightbox、方向键左右切换、Esc 关闭、复制标签提示词;每张卡片展示中文翻译、原始标签、分类、来源和属性信息。", "支持用户新增、编辑、删除自定义动漫标签,新增/重命名/删除分类,上传本地参考图保存到自定义库,并用 t8-anime-tag-master@1 JSON 导入导出迁移。", "上传素材节点和输出素材节点的图片素材支持右键「保存动漫标签到动漫标签大师」:自动带出来源提示词时也必须经过确认弹窗,用户可手动修改名称、分类、标签、提示词和负面提示词后保存。", "节点、图库弹层和 lightbox 使用 anime-tag-master 命名空间 CSS 变量,覆盖浅色/深色主题文字、按钮、输入框和边框对比度。" ], "sourceFiles": [ "src/components/nodes/AnimeTagMasterNode.tsx", "src/components/MaterialContextMenu.tsx", "src/data/animeTagMasterManifest.ts", "src/utils/animeTagMaster.ts", "backend/src/routes/animeTags.js", "backend/src/server.js", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/components/Canvas.tsx", "src/components/Sidebar.tsx", "src/utils/nodePlacement.ts", "src/styles/index.css", "tests/animeTagMaster.test.ts" ], "verification": [ "node --test tests\\animeTagMaster.test.ts", "npm run type-check", "npm run build" ] }, "comfyuiExcludeRulesBackup": { "status": "implemented", "date": "2026-06-11", "description": "ComfyUI 自动映射排除规则支持 JSON 导入导出,覆盖设置页面扩展 API 的 ComfyUI 设置和 ComfyUI 应用制作工具节点。", "highlights": [ "排除采样器参数、排除模型加载、排除尺寸批量等规则可以一键导出为 t8-comfyui-field-exclude-rules JSON。", "导入兼容新 JSON、旧数组、纯文本规则和常见字段名,用户换版本或换设备时不用重新手填。", "导入后会立即重新计算自动映射字段,设置页与制作工具节点使用同一套解析规则。" ], "files": [ "src/utils/comfyuiWorkflow.ts", "src/components/ApiSettings.tsx", "src/components/nodes/ComfyUIAppMakerNode.tsx", "tests/comfyuiProvider.test.ts", "tests/comfyuiAppsManifest.test.ts" ], "verification": [ "node --test tests\\comfyuiProvider.test.ts tests\\comfyuiAppsManifest.test.ts", "npm run type-check", "npm run build" ] }, "comfyuiWorkflowRecognition": { "status": "implemented", "date": "2026-06-11", "description": "本地 ComfyUI API Workflow 自动识别增强:从少数标准节点扩展到通用自定义节点字段,保证制作器、设置页和后端提交使用同一套映射规则。", "highlights": [ "自动识别 prompt / positive_prompt / negative_prompt / caption / instruction 等文本字段,仍优先通过 sampler 连接修正正负 Prompt。", "自动识别 image / mask / reference_image / control_image / image_path 等图片输入,并支持 image1 之后的更多编号;视频和音频输入同样支持 videoN / audioN。", "补齐 ControlNet、UNet、CLIP Vision、Style Model、Upscale Model、帧率、帧数、FPS、guidance、shift、strength、weight 等常见自定义节点参数。", "ComfyUI 应用制作器会把新识别到的非媒体参数暴露为可调用户参数;图像节点 ComfyUI 面板同步显示这些字段。", "后端 ComfyUI provider 使用同等识别规则,即使保存的 workflow 没有 fields 映射,也能在提交前自动 patch 自定义字段。" ], "files": [ "src/utils/comfyuiWorkflow.ts", "src/utils/comfyuiApps.ts", "src/components/nodes/ImageNode.tsx", "backend/src/providers/comfyui.js", "tests/comfyuiProvider.test.ts", "tests/comfyuiImageNode.test.ts", "tests/comfyuiAppsManifest.test.ts" ], "verification": [ "node -c backend\\src\\providers\\comfyui.js", "node --test tests\\comfyuiProvider.test.ts tests\\comfyuiImageNode.test.ts tests\\comfyuiAppsManifest.test.ts", "npm run type-check" ] }, "netdiskWebdavUpload": { "status": "implemented", "date": "2026-06-11", "description": "云端上传目标补齐百度网盘与夸克网盘真实上传:公开版走 WebDAV 网关方案,复用素材右键上传入口,不依赖不稳定 Cookie 抓包接口。", "highlights": [ "百度网盘 / 夸克网盘设置页从预留字段改为 WebDAV 地址、用户名、密码/令牌、网盘目录和公共域名配置,并补充 Alist / CloudDrive2 / rclone 使用说明。", "后端新增 WebDAV 自动建目录、PUT 文件上传、配置检查临时写入并删除测试文件,保证检查能验证真实写入权限。", "云上传错误分类新增 WebDAV 认证、Endpoint、目录冲突、空间不足等可执行中文提示;右键菜单继续按启用目标显示。", "云端上传摘要将 COS、OSS、百度 WebDAV、夸克 WebDAV 四类目标都计入 supportedUploadCount。" ], "files": [ "backend/src/cloudUploads/settings.js", "backend/src/cloudUploads/uploader.js", "src/components/ApiSettings.tsx", "src/types/canvas.ts", "tests/cloudUploads.test.ts" ], "verification": [ "node -c backend\\src\\cloudUploads\\settings.js", "node -c backend\\src\\cloudUploads\\uploader.js", "node --test tests\\cloudUploads.test.ts" ] }, "electronReleaseV216": { "version": "2.1.6", "status": "electron-release", "date": "2026-06-11", "description": "v2.1.6 Electron 自动更新发布:打包 v2.1.5 源码能力并补齐 Grok OAuth Agent 快捷生成、Fal 超市状态徽章、RH RED 上传模式持久化、圣斗士冥界雷达与 GPT Image 2 尺寸快捷模型等热修。", "highlights": [ "Grok OAuth Agent 小节点可在不打开 Grok 创作台的情况下简易生成,文本 / 图像 / 视频 / 音频结果统一写入 OutputNode,不再把大结果堆在节点内部。", "Grok OAuth Agent 左右输入 / 输出端口样式加固,避免被节点外框裁切。", "Fal 超市右上角移除“待命”徽章,超市首页保留模型能力说明和预扣 3.4 币提示。", "RH 隐藏 RED 上传模式改为节点级持久化,删除素材后仍保持 RED 模式,不自动退回普通上传节点。", "圣斗士冥界篇雷达 / 小地图重绘,宝箱和巡查指针固定在主题雷达框内,巡查钟盘保持居中并避免跑出地图。", "GPT Image 2 新增 gpt-image-2-2K 与 gpt-image-2-4K 两个贞贞 API 快捷模型,不走 FAL,保留原 gpt-image-2 使用方式。" ], "releaseFiles": [ "package.json", "package-lock.json", "vite.config.ts", "vite.config.js", "electron/main.cjs", "backend/src/config.js", "features.json", "README.md", "release-notes/v2.1.6.md" ], "packaging": { "script": "npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.1.6.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.1.6.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.1.6 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、hermes-agent/**、Electron 缓存目录和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "RH 工具箱制作器与 FAL 应用制作工具仍为本地开发工具,不进入公开源码和公开打包产物。", "真实 Grok OAuth 私有调用继续通过本机 ignored local-private 扩展 / 加密链路处理,公开仓库只保留安全外壳。" ], "verification": [ "node --test tests\\saintSeiyaBattle.test.ts tests\\grokOAuthAgent.test.ts tests\\achievements.test.ts", "npm run type-check", "npm run build", "npm run public:check", "npm run dist:release", "npm run release:verify" ] }, "sourceReleaseV215": { "version": "2.1.5", "status": "source-only", "date": "2026-06-09", "description": "v2.1.5 只推 GitHub 源码,不打包 Electron,不发布 GitHub Release / latest.yml。重点收口 FAL 超市、3D 模型素材链路、RH 工具箱运行端易用性、圆盘菜单、Grok OAuth Agent 公开外壳和圣斗士主题首版。", "includedPublicScope": [ "Fal 超市公开节点与 FAL 通用 manifest / submit / query 链路,保留现有图像、视频等节点内的 FAL 功能不删除。", "3D 素材上传、3D 模型预览、OutputNode 3D 模型分区,以及自动输出到 3D 预览节点的链路。", "RH 工具箱运行端首页轻量按钮、悬停说明区、Prompt/text 默认值直显、inputSchema 字段直显和本地素材输入。", "Grok OAuth Agent 公开外壳和后端 hook 路由;真实 OAuth / xAI 调用仍由 local-private 私有扩展提供。", "长按鼠标中键圆盘菜单与自定义入口,左下角控制栏位置收敛。", "圣斗士主题增强:圣衣收集、宝箱、小地图、20-30 秒自动战斗、经验升级、冥界篇隐藏模式、10 秒过场动画和成就奖励影片大屏播放。", "公开检查脚本新增制作器源码拦截,避免 RH 工具箱制作器 / FAL 应用制作工具误入公开提交。" ], "excludedPrivateDevScope": [ "不提交 src/components/nodes/RHToolboxMakerNode.tsx 的本地制作器改动。", "不提交 src/components/nodes/FalToolboxMakerNode.tsx 的本地制作器源码。", "不提交 src/utils/rhToolboxDeveloper.ts 或 src/utils/falToolboxDeveloper.ts 的本地制作器辅助源码;公开运行节点仅保留私有动态加载入口。", "不提交 skill.md、roadmap.md、local-private/**、hermes-agent/** 或 Electron 缓存目录。", "本次不运行 npm run dist:release,不生成安装包、blockmap、latest.yml,也不创建 GitHub Release。" ], "verification": [ "node --test tests\\rhToolbox.test.ts tests\\falToolbox.test.ts tests\\grokOAuthAgent.test.ts tests\\radialMenu.test.ts tests\\saintSeiyaBattle.test.ts tests\\achievements.test.ts tests\\updateMdRegressions.test.ts", "npm run type-check", "npm run build", "npm run public:check" ] }, "gptImage2ZhenzhenSizeVariants": { "status": "implemented", "date": "2026-06-10", "description": "GPT Image 2 节点新增 gpt-image-2-2K 与 gpt-image-2-4K 两个贞贞 API 尺寸快捷模型,不走 FAL,其他用法与 gpt-image-2 保持一致。", "paths": [ "src/providers/models.ts", "src/components/nodes/ImageNode.tsx", "backend/src/routes/proxy.js", "tests/imageModelMapping.test.ts", "features.json" ], "capabilities": [ "GPT2 具体模型下拉新增 gpt-image-2-2K 和 gpt-image-2-4K。", "选择 gpt-image-2-2K / gpt-image-2-4K 时,前端自动把尺寸切换为 2K / 4K。", "后端提交时把这两个别名归一为上游真实模型 gpt-image-2,并强制对应 image_size,避免误传别名给贞贞 API。", "两个新选项不注册到 FAL_REGISTRY,不会走 gpt-image-2-fal 的 FAL 队列协议。", "分类独立 API Key 和 New API 分组令牌仍按 gpt-image 系列匹配。" ] }, "rhToolboxMakerUsability": { "status": "implemented-dev-tooling", "date": "2026-06-09", "description": "RH工具箱制作器升级为开发态管理台:保存后可直接显示到 RH工具箱,并支持草稿库和自定义分类管理。", "paths": [ "src/components/nodes/RHToolboxMakerNode.tsx", "src/components/nodes/RHToolboxNode.tsx", "src/utils/rhToolboxDeveloper.ts", "tests/rhToolbox.test.ts", "features.json", "skill.md" ], "capabilities": [ "制作器新增发布检查卡,明确显示是否缺 WebApp ID、启用状态、节点显示、输入映射或输出声明。", "保存按钮改为“保存并显示”,保存成功后 RH工具箱节点会自动清空搜索 / 分类过滤并选中新工具。", "发布检查卡内新增主保存按钮,保存结果直接显示草稿数 / 可见数,避免用户滚到底部才知道是否成功。", "开发草稿事件会携带完整 manifest,并在 localStorage 写入失败时使用当前页面内存兜底,RH工具箱收到事件后优先用事件 manifest 刷新。", "RH工具箱节点在开发环境会定时轻量刷新开发草稿,避免保存事件被 HMR 或旧节点实例吞掉后右侧仍无反应。", "保存运行时判断改为 DEV 或页面存在 RH工具箱制作器根节点即可写入,避免制作器已显示但保存函数误判非开发环境。", "制作器左右两栏改成节点内部滚动,读取 RH 字段后不会把草稿库、保存按钮和 JSON 区挤出节点外。", "制作器内新增草稿库,可编辑、打开或删除已保存 RH 工具草稿。", "制作器内新增自定义分类管理,可新建、重命名、删除分类,分类下拉显示名称和 ID。", "RH工具箱分类改为固定大类 + 可维护小类:大类固定为图像、视频、音频、3D、文本;制作器新建的是大类下的小类。", "RH工具箱首页去掉快捷接入位和 idle 待命徽章,工具改为类似 RH超市的轻量双列按钮,只显示应用名;开发环境下 hover 才显示编辑入口。", "RH工具箱首页补齐和 RH超市一致的悬停说明区:鼠标移到工具按钮上时,底部显示工具名和说明 description,未悬停时显示可用工具数量提示。", "RH工具箱运行页会把 inputSchema 中的 Prompt、图像、视频、音频字段直接渲染出来:文本字段支持提示词模板库、放大编辑和 @ 素材引用,媒体字段支持节点内上传或继续使用左侧上游素材。", "RH工具箱 Prompt/text 字段会把工具模板里的 defaultValue 直接显示为可编辑内容,新选择工具时同步写入本地输入并作为默认发送值,用户无需重新手打默认提示词。", "RH工具箱制作器移除按钮名和强调色配置,新保存工具完全跟随当前主题,不再由单个工具自定义颜色破坏画布主题。", "RH工具箱默认 manifest 和 quick action 协议不再保留 quickActionLabel / ui.accent,按钮文案统一用工具标题,颜色统一由当前画布主题决定。", "根因修复:RH工具箱运行页只显示 inputSchema/userParams 中声明的字段;制作器读取 RH 应用字段时会自动把图片/视频/音频字段补进素材输入,把 Prompt/文本字段补进 Prompt 区,把数字/选择/布尔字段补进用户参数,保存时也会兜底补齐。", "分类管理补齐小类基础维护能力:读取已生成小类、改名、改所属大类、调整顺序、上移/下移、保存和删除。", "内置模板小类 image-tools / video-tools / text-tools / audio-tools / model3d-tools 不进入制作器分类管理和 RH工具箱小类筛选;小类只由维护者手动新建,旧工具仍可在对应大类的“全部”里显示。" ], "devOnly": true }, "saintSeiyaTheme": { "status": "implemented-theme-redesign", "date": "2026-06-09", "description": "圣斗士主题重做为完整强视觉:十二宫 / 冥界篇双主题、圣域星图画布、圣衣箱节点、宝箱小地图、战斗面板、经验升级和 12 黄金圣衣解锁冥界篇。", "paths": [ "roadmap.md", "src/data/saintSeiyaCloths.ts", "src/utils/saintSeiyaBattle.ts", "src/stores/saintSeiyaSanctuary.ts", "src/components/SaintSeiyaSanctuary.tsx", "src/styles/theme-saintseiya.css", "src/theme/types.ts", "src/theme/defaultTemplates.ts", "src/components/ThemeTemplateManager.tsx", "src/components/ThemeMusicToggle.tsx", "src/App.tsx", "src/components/Canvas.tsx", "src/components/Sidebar.tsx", "shared/achievementManifest.json", "backend/src/achievements/store.js", "tests/saintSeiyaBattle.test.ts", "tests/achievements.test.ts", "features.json" ], "capabilities": [ "内置主题 saint-seiya,普通模式显示圣域 / 十二宫视觉,集齐 12 件黄金圣衣后可切换冥界篇隐藏模式。", "主题视觉从小面板扩展到全局:顶部栏、侧栏、画布主体、ReactFlow 背景、节点、输入框、按钮、连线、端口、控制条和小地图都会进入圣域星图 / 圣衣箱风格。", "普通模式使用深蓝圣域星空、金色十二宫罗盘、青色小宇宙光效和大理石圣衣箱节点;冥界模式切换为暗紫黑日蚀、红色冥界能量和金色星座环。", "新增回归测试锁住 Saint Seiya 主题必须覆盖 .t8-app-shell、.t8-sidebar、.t8-canvas-shell、react-flow__pane、react-flow__minimap 和冥界模式。", "大地图每 60 秒刷新一个宝箱,宝箱 10 秒未开启消失;宝箱标记叠加在右下角 ReactFlow 小地图上,避免出现第二张小地图,并支持点击跳转。", "开启宝箱需要画布中心保持 3 秒,随后进入对应青铜 / 白银 / 黄金圣斗士试炼。", "圣域罗盘改成顶部可折叠横向 HUD:不再挡左下角侧栏,显示等级、经验、当前黄金宫、圣衣计数和宝箱状态。", "圣域罗盘新增十二黄金宫独立进度 UI:白羊到双鱼各有独立符号、宫位、图案、特效名和解锁文案,已收集 / 下一宫 / 未解锁状态一眼可见。", "战斗按 Lv1-99、HP/MP/ATK/DEF/SPD、圣衣加成、胜负经验和招式消耗自动结算;开启试炼后系统会优先释放当前最强可用招式,胜利才会获得圣衣。", "战斗结算从一次性字符串升级为结构化事件队列,前端按节奏逐行播放入场、架势、攻击、格挡、反击、胜负和奖励,并同步显示 HP / 小宇宙条。", "战斗数值重做为 20-30 秒自动试炼节奏:青铜 8 回合、白银 9 回合、黄金 10 回合,每回合包含小宇宙交锋和双方行动,伤害按剩余回合节奏控制,避免秒杀或瞬间刷完。", "每个招式会映射独立 effectId、视觉特效家族和 WebAudio 音效 cue,覆盖流星、庐山龙气、冰结、锁链、凤凰、雷光、银河、水晶、巨角、冥界、六道、天秤兵装、赤针、黄金箭、圣剑、玫瑰和护壁。", "战斗日志改为贴右侧快捷栏下方的临时浮层,仅战斗时显示;结算后显示 3、2、1 倒计时并自动隐藏,不再占用顶部圣域罗盘或画布创作空间。", "获得青铜 / 白银 / 黄金圣衣会触发不同等级的解锁演出;黄金圣衣会读取对应十二宫专属视觉配置,突出每件黄金圣衣的差异。", "黄金圣衣按十二宫顺序推进:白羊、金牛、双子、巨蟹、狮子、处女、天秤、天蝎、射手、山羊、水瓶、双鱼,不能跳关随机获得。", "12 黄金圣衣全收集后触发十二星座黄金圣衣集结 / 雅典娜归来过场动画、开启冥界篇,并记录隐藏成就;奖励影片本地以 .t8media 加密保存,解锁后通过成就影片馆解密播放。", "切换进入冥界篇会重新播放十二黄金圣衣集结 / 雅典娜归来过场,过场时长统一为 10 秒。", "主题成就抽屉在圣斗士 / 冥界模式下使用专属高对比 token,修复深色、浅色和冥界浅色模式中灰白字不清楚的问题。", "成就主题详情和影片馆不再内嵌小视频;点击播放会打开圣斗士大屏奖励舞台,带星图、小宇宙背景和大尺寸 video 播放器。", "圣域篇默认音乐为 saint-seiya-pegasus-fantasy.mp3,冥界篇默认音乐为 saint-seiya-hades-last-holy-war.mp3;Hades 浅色模式额外加固节点、输入框、快捷栏和圣域罗盘文字对比度。", "首批数据包含 5 件青铜、12 件白银、12 件黄金圣衣;黄金圣衣包含原作常用招式名。" ], "verification": [ "node --test tests\\saintSeiyaBattle.test.ts tests\\achievements.test.ts", "npm run type-check", "npm run build" ] }, "falToolboxPromptInputs": { "status": "implemented", "date": "2026-06-09", "description": "修复 Fal 超市详情页只显示 Prompt:text 却没有本地输入框的问题;FAL 工具的文字输入和文字参数统一接入 Prompt 编辑器能力。", "paths": [ "src/components/nodes/FalToolboxNode.tsx", "src/services/falToolbox.ts", "src/utils/falToolbox.ts", "tests/falToolbox.test.ts", "features.json" ], "capabilities": [ "Fal 超市工具的 text input 会渲染为节点内 Prompt 编辑区,支持提示词模板库、放大编辑和 @ 引用上游图片/视频/音频。", "本地 Prompt 有内容时直接写入对应 FAL payload key;本地为空时继续使用左侧连入的上游文本,不破坏原有文本连线流程。", "text/textarea 类型用户参数也改用同一套 Prompt 编辑器,负向提示词等字段可使用模板和放大编辑。", "运行时保存 lastPrompt/promptResolved,方便后续输出素材右键保存到提示词模板库时带回实际提示词。" ], "verification": [ "npm run type-check", "node --test tests\\falToolbox.test.ts" ] }, "fal3dMaterialPipeline": { "status": "implemented", "date": "2026-06-09", "description": "修复 Fal 超市 3D 模型产物被输出素材当图片渲染导致图裂的问题,并把 3D 模型作为独立素材类型接入上传、输出、自动外挂和预览链路。", "paths": [ "src/utils/mediaCollection.ts", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/types/canvas.ts", "src/components/Canvas.tsx", "src/components/nodes/FalToolboxNode.tsx", "src/components/nodes/Model3DPreviewNode.tsx", "src/components/nodes/OutputNode.tsx", "src/components/nodes/UploadNode.tsx", "src/components/nodes/useHasAutoOutput.ts", "tests/falToolbox.test.ts", "features.json" ], "capabilities": [ "新增 model3d 媒体类型,统一使用 modelUrl/modelUrls/directModelUrl/directModelUrls 字段,不再把 .glb/.gltf/.obj/.fbx/.stl/.usdz/.zip 放进图片预览。", "素材资源分类新增 3D素材上传节点;3D模型预览节点也移入素材资源分类,并显示当前模型下载地址。", "Fal 超市和画布自动输出识别 3D 模型后会自动创建 3D模型预览节点,普通图像/视频/音频输出链路保持不变。", "OutputNode 新增 3D模型分区,可下载模型文件,也可拆分为多个 3D模型预览节点。", "Model3DPreviewNode 加固错误处理,Three.js 加载、渲染和释放异常会转成友好错误,不再导致 React 节点崩溃。" ], "verification": [ "node --test tests\\falToolbox.test.ts", "npm run type-check", "npm run build" ] }, "grokOAuthAgentPublicShell": { "status": "implemented-agent-studio", "date": "2026-06-10", "description": "新增独立 GROK OAuth 分类与 Grok OAuth Agent 节点,并升级为“画布小节点 + Grok 创作台”形态;公开版只包含节点 UI、类型、端口、统一事件协议、后端 hook 路由和友好错误,真实 OAuth 登录、token 刷新及 xAI/Grok 调用必须由 local-private 私有扩展提供。", "paths": [ "backend/src/routes/grokOAuth.js", "backend/src/server.js", "src/services/grokOAuth.ts", "src/components/nodes/GrokOAuthAgentNode.tsx", "src/components/Canvas.tsx", "src/components/Sidebar.tsx", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/types/canvas.ts", "tests/grokOAuthAgent.test.ts", "features.json" ], "capabilities": [ "侧边栏新增 GROK OAuth 分类,包含 Grok OAuth Agent 主节点,不混入现有图像/视频/LLM/音频节点。", "节点支持流式聊天、图像、视频、TTS、STT 五种模式,读取上游 text/image/video/audio 与节点内 Prompt;产物默认进入 Grok 创作台产物库,不再自动把所有结果写入 outputText/imageUrls/videoUrls/audioUrls。", "画布上的节点保持小巧,只显示登录状态、素材数、消息数、产物数、打开创作台、简易生成和发布最新;完整对话、参数、素材预览和产物卡放在 createPortal 打开的 Grok 创作台中。", "画布小节点新增简易 Prompt 生成区:不进入 Grok 创作台也能填写 Prompt、使用提示词模板库、放大编辑和 @ 引用素材,并支持 /image /video /audio /tts /stt。", "小节点简易生成完成后不会写入 agentMessages / agentArtifacts;文本、图像、视频、音频会直接覆盖标准 outputText/imageUrls/videoUrls/audioUrls 输出字段,由右侧输出素材节点展示。", "产物卡支持图像/视频/音频/文本预览、下载、复制 Prompt 和“发布到画布输出”;只有发布后才写入标准 text/image/video/audio 输出字段并触发下游 OutputNode。", "Grok 创作台 Prompt 支持 Enter 直接运行、Shift+Enter 换行;运行时会使用输入框最新文本,避免刚输入后回车跑旧 prompt。", "Grok 创作台新增“提示词持久化”开关,默认关闭:任务验证通过并发送后自动清空 Prompt 和 @ 引用;开启后保留输入,方便连续微调。", "对话上下文默认从 12 条提升到 30 条,最大可调到 80 条;超过上下文条数的旧对话会压缩进 grokContextSummary,并作为 system 长期记忆注入后续聊天,避免硬切历史导致突然失忆。", "新对话和清空全部会同步重置 grokContextSummary / grokContextCompressedCount,防止跨会话带入旧记忆。", "Grok 创作台支持本地上传图片、视频、音频作为 Agent 输入,并可在素材池删除本地上传素材。", "发布产物时只写入主产物 URL,同时清空 urls/generatedImages/direct* 等旧输出通道,并锁定已发布产物卡,避免点击“发布最新”后一次生成多个相同 OutputNode。", "旧版本节点中已经存在的 outputText/imageUrls/videoUrls/audioUrls 会在首次打开时迁移为 agentArtifacts,并清空旧标准输出,避免老画布继续输出爆炸。", "后端新增 /api/grok-oauth/status、login/start、login/poll、login/complete、logout、agent/stream、chat/stream、image、video/submit、video/status、audio/tts、audio/stt 公共路由。", "agent/stream 统一输出 message.delta、tool.started、tool.progress、artifact.completed、artifact.failed、done 事件;图像、视频、TTS、STT 即使底层是一次性或轮询,也会包装为统一 Agent 事件流。", "chat/stream 兼容 SSE 增量;图像/视频/音频生成结果若由私有模块返回远程 URL 或 data URL,公共路由会统一保存到输出目录后返回 /files/output 路径。", "视频模式对齐 Hermes xAI 规则:默认 grok-imagine-video 走文生视频,grok-imagine-video-1.5-preview 标注为图生视频专用,缺少上游图片时前端直接给出友好提示。", "修复状态刷新 effect 在清空旧错误时误 abort 视频轮询的问题,避免图生视频刚提交就显示“已中止 Grok OAuth 任务”。" ], "privateBoundary": [ "公开仓库不得加入 Grok OAuth client secret、token、cookie、会员调用细节和真实 xAI 请求代码。", "真实实现应通过 local-private/extensions/backend/index.cjs 注册 grokOAuth.* hooks;Electron 打包继续沿用现有 ignored local-private 加密扩展方案。", "私有模块缺失时,节点和 API 必须返回:Grok OAuth 私有模块未启用,请使用带私有模块的本地版本。" ], "verification": [ "node --test tests\\grokOAuthAgent.test.ts", "npm run type-check", "npm run build" ] }, "electronReleaseV214": { "version": "2.1.4", "status": "electron-release", "date": "2026-06-08", "description": "v2.1.4 Electron 自动更新发布:集中打包 Figma Bridge 可用化、云端上传连通性、Prompt/@ 媒体引用、放置栏恢复、顶部画布教程入口和 LLM 默认模型调整,并按规范创建 GitHub Release 自动更新资产。", "highlights": [ "Figma Bridge 随后端自动启动,发送到 Figma 前会兜底确保 localhost:3845 bridge 在线;Figma 插件对本机图片改为 fetch 二进制后 figma.createImage(bytes),避免 image failed 引用卡片。", "发送素材弹窗在 Figma 按钮附近常驻插件导入路径提示:开发版 tools\\figma-bridge\\plugin\\manifest.json,打包版 resources\\tools\\figma-bridge\\plugin\\manifest.json。", "腾讯云 COS / 阿里云 OSS 配置检查改为 signed GET ?location 真实连通测试,上传错误透传 Code / Message / RequestId 和签名、权限、Region、Bucket 等分类提示;设置页补充云厂商控制台入口与 SecretKey 创建提醒。", "Prompt / @ 引用修复:中文输入、即梦 CLI 节点本地 Prompt、文本节点读取下游生成节点旁路图像 / 视频 / 音频素材,以及 token kind 校验全部补齐。", "左下角放置栏支持从已有画布素材节点回填最近素材,空列表也保持外壳,避免刷新后看起来消失。", "顶部栏新增“画布教程”入口,整理第一弹到第九弹 Bilibili / Youtube 教程;“最新应用 · RunningHub”移除“获取 RH ApiKey”快捷入口。", "LLM 新建节点默认模型调整为下拉第二项 gemini-3.5-flash;旧画布已有 model 字段不被强制迁移。" ], "sourceSync": [ "package.json / package-lock.json", "vite.config.ts / vite.config.js", "electron/main.cjs APP_VERSION", "backend/src/config.js APP_VERSION", "features.json", "README.md", "release-notes/v2.1.4.md" ], "packaging": { "script": "npm run dist:release", "installer": "dist_electron/T8-PenguinCanvas-Setup-2.1.4.exe", "blockmap": "dist_electron/T8-PenguinCanvas-Setup-2.1.4.exe.blockmap", "latestYml": "dist_electron/latest.yml", "updater": "GitHub Release v2.1.4 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "releaseBoundary": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/** 和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "Electron 用户包可在本机 dist:release 时包含 ignored local-private 加密扩展;GitHub Source code zip/tar.gz 不包含这些源码。", "发布前必须运行 npm run public:check 并检查 staged 文件列表。" ], "verification": [ "node --test tests\\updateMdRegressions.test.ts tests\\electronPackaging.test.ts tests\\cloudUploads.test.ts tests\\promptEditor.test.ts tests\\apiSettingsTheme.test.ts tests\\advancedProviderFrontend.test.ts", "npm run type-check", "npm run build", "npm run public:check", "npm run dist:release", "npm run release:verify" ] }, "falToolboxRoadmapAndPhase1": { "status": "phase-1-to-5-first-pass-implemented", "date": "2026-06-08", "description": "新增 FAL 工具箱分类规划与首轮实现:Fal超市作为独立节点复制现有和已核验的 FAL 模型能力,FAL应用制作工具仅开发环境可见;补 3D模型预览节点承接 model3d 输出;保留原图像/视频等节点内已有 FAL 功能,不做删除或替换。", "paths": [ "roadmap.md", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/types/canvas.ts", "src/components/Canvas.tsx", "src/components/NodeActionBar.tsx", "src/components/nodes/FalToolboxNode.tsx", "src/components/nodes/FalToolboxMakerNode.tsx", "src/components/nodes/Model3DPreviewNode.tsx", "src/data/falToolboxManifest.ts", "src/services/falToolbox.ts", "src/utils/falToolbox.ts", "src/utils/falToolboxDeveloper.ts", "backend/src/routes/proxy.js", "electron/_post_build.cjs", "tests/falToolbox.test.ts" ], "constraints": [ "现有 /image/fal/* 与 /video/fal/* 路由继续保留。", "Fal超市使用新的 /api/proxy/fal-toolbox/submit 与 /api/proxy/fal-toolbox/query。", "FAL应用制作工具通过 import.meta.env.DEV 注册,并由 electron/_post_build.cjs 检查不进入用户包。", "公开源码不得包含私有计费、分组令牌和不可开源实现。", "Fal超市 3D 工具统一输出 modelUrls / model3d;3D模型预览内置 glb/gltf/obj/stl/fbx/usdz loader,zip 作为打包容器保留下载入口。" ], "capabilities": [ "FAL工具箱侧边栏分类包含 Fal超市、3D模型预览,以及开发环境限定的 FAL应用制作工具。", "Fal超市工具目录首轮扩展到 40+ 个已核验 endpoint,覆盖 GPT/Nano/Grok/Sora/Veo、Ideogram、Krea、Recraft、Seedream、Seedance、PixVerse、HeyGen、Topaz、Lyria、Seed Speech、MiniMax Speech、Hyper3D、Hunyuan 3D、Trellis 等。", "工具 manifest 支持 sourceIndex 输入映射、点路径 payload、payloadKey 和 omitValues,可表达第 1 张/第 2 张参考图、嵌套参数、server_default 不发送、自定义字段覆盖等常见 FAL schema。", "Fal超市支持收藏、最近使用、分类/搜索筛选、前端轮询瞬时错误最多 3 次重试。", "FAL应用制作工具支持粘贴 schema/OpenAPI 片段推断 inputSchema 和 userParams,生成开发态 localStorage 草稿,生产包由 post-build 阻止泄漏。", "3D模型预览节点接 model3d 输入,支持 glb/gltf/obj/stl/fbx/usdz Three.js 预览、自动旋转、切换多模型、下载原模型和当前角度快照输出图像。" ], "verification": [ "node --test tests\\falToolbox.test.ts", "node --check backend\\src\\routes\\proxy.js", "npm run type-check", "npm run build" ] }, "canvasTutorialTopbarPanel": { "status": "implemented", "date": "2026-06-14", "description": "顶部栏在“最新应用”左侧新增“画布教程”入口,按第一弹到第十四弹整理 T8 画布教程 Bilibili / Youtube 链接;“最新应用 · RunningHub”弹窗移除“获取 RH ApiKey”快捷入口,只保留 RunningHub 国内/海外站和邀请码提示。", "paths": [ "src/App.tsx", "tests/updateMdRegressions.test.ts", "features.json", "skill.md" ], "tutorials": [ { "title": "基础功能教程第一弹1.2.3版", "bilibili": "https://www.bilibili.com/video/BV18sG76AE9Y/", "youtube": "https://www.youtube.com/watch?v=V8oCBhemmCQ" }, { "title": "教程第二弹(循环系统,RH超市等)", "bilibili": "https://www.bilibili.com/video/BV1CVGx6kEMV/", "youtube": "https://www.youtube.com/watch?v=hSpoXclezqw" }, { "title": "教程第三弹(节点回避算法,资产库,自定义主题等)", "bilibili": "https://www.bilibili.com/video/BV1qeVP6kEZi/", "youtube": "https://www.youtube.com/watch?v=oJUbD88kvnk" }, { "title": "教程第四弹(RH主题隐藏模式Red,素材集节点,导演节点三件套,多角度可视化,图像对比,高级版多宫格剪裁)", "bilibili": "https://www.bilibili.com/video/BV1gfGm6HERH/", "youtube": "https://www.youtube.com/watch?v=9Bn0BjsfwlE" }, { "title": "教程第五弹(人造人系统,灵魂画手控制系统,贞贞无限画布!火影忍者,EVA,幽游白书主题,设计师专属优化多画布及Eagle发送)", "bilibili": "https://www.bilibili.com/video/BV1KhVY6MEFP/", "youtube": "https://www.youtube.com/watch?v=_lmRmlPZ2y0" }, { "title": "教程第六弹(灌篮高手主题上线!新Red隐藏模式,姿势大师节点,全新交互及连线方式)", "bilibili": "https://www.bilibili.com/video/BV1RjVZ69En1/", "youtube": "https://www.youtube.com/watch?v=pSLqhcpmpn8" }, { "title": "教程第七弹(即梦CLI调用,Seedance2.0不卡人脸!支持modelscope免费版生成,OpenAI兼容调用,RH超市,画板功能再升级!宫格编辑!新增AI检测消除功能)", "bilibili": "https://www.bilibili.com/video/BV18eVz68ENs/", "youtube": "https://www.youtube.com/watch?v=PQ5rKtOZ-tM" }, { "title": "教程第八弹(本地Comfyui植入贞贞的无限画布!超简单超好用!新增足球小将主题,视频解析功能,节点对齐,即梦CLI修复多参,免费版魔搭API Lora支持,素材黏贴新模式,APIKEY导入导出功能)", "bilibili": "https://www.bilibili.com/video/BV1ha7R6DES5/", "youtube": "https://www.youtube.com/watch?v=LViGXsMTFhs" }, { "title": "教程第九弹(新增3D全景功能及资产库,一键自动更新功能,输入框放大按钮,修复即梦CLI的多参问题,AI去水印节点功能升级,新增聚合解析功能,可获取17个平台无水印视频,优化启动速度,优化画布加载如慢加载,支持自定义快捷键设置)", "bilibili": "https://www.bilibili.com/video/BV1gSEA6GEDQ/", "youtube": "https://www.youtube.com/watch?v=-nmX9oB-MX" }, { "title": "教程第十弹(3D全景功能增强,Figma联动,支持阿里云Oss及腾讯云Cos,新增放置栏,修正新香蕉的模型映射,上传素材的上限从10M到20M,新增veo-omni模型,新增提示词模板系统及增强功能,comfyui支持remote模式,新增newapi分组令牌高级模式,LLM/VISIOIN节点支持流式删除,分类独立APIKEY支持删除功能,新增画布教程模块,支持上游文本联动生成节点@模式,即梦CLI模型补全,素材支持直接拖到浏览器外文件夹)", "bilibili": "https://www.bilibili.com/video/BV1N9Eg6QEHs/", "youtube": "https://www.youtube.com/watch?v=zIW7PbEWQAs" }, { "title": "教程第十一弹(新增圣斗士星矢双主题,加强本地comfyui节点和参数解析,修复不支持LIST的问题,新增画布内图片素材按鼠标左右键拖动到文件夹,新增Fal超市功能,新增grok agent节点,含创作台和简易版,新增3D素材上传和预览功能)", "bilibili": "https://www.bilibili.com/video/BV1gGEz6VEDA/", "youtube": "https://www.youtube.com/watch?v=oRT59Qf65KY" }, { "title": "教程第十二弹(grok agent的节点修复图生视频功能,新增视频延展及视频编辑功能,新增codex cli agent节点,简约模式和创作台模式,新增Codex生图工作台节点,新增自定义快捷圆盘,FAL超市新增10多个新模型,视频节点新增3个grok video 1.5模型,解锁成就系统所有隐藏模式的奖励影片,新增俄罗斯方块主题及小游戏)", "bilibili": "https://www.bilibili.com/video/BV1phJs6oE2g/", "youtube": "https://www.youtube.com/watch?v=BKV8YA-kKK4" }, { "title": "教程第十三弹(新增牧场物语主题及养成游戏,放置栏可收缩,修复侧边栏按钮常驻BUG,3D全景节点新增2:1尺寸,修复部分用户无法新增资源库分类,新增画板及图像编辑功能shift正圆,正方形及实心素材,抠图功能等,新增chrome插件支持任意网络图像反推生成并发送画布,新增跨画布完成通知,优化comfyui节点,新增自定义系统字体,支持agens apikey多模态模型免费使用,新增历史记录)", "bilibili": "https://www.bilibili.com/video/BV1tYjy6jEuG/", "youtube": "https://www.youtube.com/watch?v=AH24lGHA9E0" }, { "title": "教程第十四弹(新增VibeX联动发送功能及节点,增强chrome反推插件(需更新安装,支持vibex以及修复反推发送问题),修复ID连线方式,新增区域连线方式,新增目标框节点,重写画布底层大幅度优化节点太多卡顿问题,图像编辑模式画板新增标签改图功能,全局去掉字体模糊效果,批量素材节点完善扩图,高清放大,抠图等功能(需填写RH APIKEY))", "bilibili": "https://www.bilibili.com/video/BV1mj7h6CEYx/", "youtube": "https://www.youtube.com/watch?v=wCOoTtuxQPM" } ], "verification": [ "node --test tests\\updateMdRegressions.test.ts", "npm run type-check", "npm run build" ] }, "figmaBridgeImportHotfix": { "status": "implemented", "date": "2026-06-08", "description": "修复 Figma Bridge 首次使用和重复启动报错:Figma manifest 不再声明 127.0.0.1:3845,改用 Figma 接受的 localhost:3845,并补 documentAccess=dynamic-page;bridge 对 Figma 暴露的 assetUrl 固定为 localhost;bridge 重复启动遇到 EADDRINUSE 时会探测已有 T8 bridge,新版本会保留状态窗口,旧版本会提示关闭旧窗口后重启。", "paths": [ "tools/figma-bridge/server.cjs", "tools/figma-bridge/start-figma-bridge.cmd", "tools/figma-bridge/plugin/manifest.json", "tools/figma-bridge/plugin/code.js", "tools/figma-bridge/plugin/ui.html", "tools/figma-bridge/README.md", "backend/src/routes/figma.js", "backend/src/utils/figmaBridge.js", "README.md", "tests/updateMdRegressions.test.ts" ], "notes": [ "Figma 开发插件导入时 localhost:端口可用,127.0.0.1:端口会被当前 manifest 校验拒绝。", "T8 Bridge 是 Figma Plugin,不是 Widget;如果导入时报 manifest.containsWidget 必须为 true,说明选到了 Widgets / Import widget from manifest,需要改用 Plugins / Import plugin from manifest。", "Bridge 实际监听默认使用 127.0.0.1,避免 Windows localhost 只绑定到 IPv6;对 Figma 暴露的 assetUrl 固定使用 localhost。", "如果启动脚本提示 already running 且保持状态窗口,说明新版 bridge 已经在 3845 端口运行,用户直接回 Figma 运行插件即可。", "如果插件面板提示 Old bridge detected,需要关闭旧 bridge 窗口或旧 node.exe,再重新启动 start-figma-bridge.cmd。", "插件主脚本使用保守语法并内置 showUI / notify 兜底;如果 Figma 没有把 ui.html 注入为 __html__,code.js 会直接使用内联完整 Bridge UI,不再停在“未绑定 UI”诊断页。", "start-figma-bridge.cmd 在 node 0 退出时也会暂停显示状态,避免用户双击后窗口一闪而过;若仍红条,需要查看 DevTools Console 第一条 code.js 报错。", "后端启动和 /api/figma/import 发送前都会自动确保 localhost:3845 bridge 在线,用户通常不需要手动运行 npm run figma:bridge。", "发送内容弹窗会在“发送到 Figma”按钮附近常驻提示:打开 Figma 桌面软件,走 Plugins / 插件 -> Development -> Import plugin from manifest...,导入 tools\\figma-bridge\\plugin\\manifest.json;打包版插件位于应用目录 resources\\tools\\figma-bridge\\plugin\\manifest.json。", "Figma 插件对 localhost/127.0.0.1 图片改用 fetch 二进制 + figma.createImage(bytes),避免 createImageAsync(localhost) 失败后只生成 image failed 引用卡片。" ] }, "cloudUploadCosConnectivityFix": { "status": "implemented", "date": "2026-06-08", "description": "腾讯云 COS 上传排查增强:配置检查从仅校验字段改为 signed GET ?location 真实连通测试;COS 上传签名抽为统一 V5 签名 helper,URL path 使用严格 percent-encode;COS/OSS XML 错误会提取 Code/Message/RequestId 并透传到前端提示。", "notes": [ "COS 不需要单独填写 AppID;Bucket 名形如 t8-1312665347,其中 1312665347 已是 AppID。", "腾讯云 SecretKey 只在新建密钥时显示一次,旧密钥列表只能看到 SecretId;用户找不到 SecretKey 时必须新建一组 CAM API 密钥。", "密钥输入框如果误传浏览器密码点/星号,后端会当作 masked secret 保留旧值,避免覆盖真实密钥。", "API 设置页 COS / OSS 配置块直接提供腾讯云 API 控制台、腾讯云对象存储、阿里云 AccessKey 控制台和阿里云 OSS 控制台入口,降低用户找入口成本。" ], "paths": [ "backend/src/cloudUploads/settings.js", "backend/src/cloudUploads/uploader.js", "backend/src/routes/cloudUploads.js", "src/components/ApiSettings.tsx", "src/components/MaterialContextMenu.tsx", "src/services/api.ts", "tests/cloudUploads.test.ts" ], "verification": [ "node -c backend\\src\\cloudUploads\\uploader.js", "node -c backend\\src\\routes\\cloudUploads.js", "node --test tests\\cloudUploads.test.ts", "真实 COS signed location 连通测试:bucket=t8-1312665347, region=ap-nanjing 通过" ] }, "cloudUploadOssEndpointAuthFix": { "status": "implemented", "date": "2026-06-08", "description": "阿里云 OSS 上传修复:Endpoint 支持 oss-cn-beijing / cn-beijing 等简写并归一为 oss-cn-beijing.aliyuncs.com;配置检查和上传统一使用 Header Authorization 签名,避免 URL Query V1 签名被 Bucket 策略拒绝。", "notes": [ "用户在设置页填 oss-cn-beijing 或 cn-beijing 都会保存为 oss-cn-beijing.aliyuncs.com;历史设置未重新保存时上传路径也会再次归一。", "阿里云 OSS 配置检查不再把 OSSAccessKeyId 写入 URL,改为 Date + Authorization 头。", "真实测试使用 bucket=t8star / endpoint=oss-cn-beijing 完成 signed location 检查、上传小文件和删除测试对象;聊天里暴露过的测试 AccessKey 应尽快禁用或轮换。" ], "paths": [ "backend/src/cloudUploads/settings.js", "backend/src/cloudUploads/uploader.js", "tests/cloudUploads.test.ts", "skill.md" ], "verification": [ "node -c backend\\src\\cloudUploads\\settings.js", "node -c backend\\src\\cloudUploads\\uploader.js", "node --test tests\\cloudUploads.test.ts", "真实 OSS 测试:bucket=t8star, endpoint=oss-cn-beijing 配置检查、上传、删除测试对象通过" ] }, "figmaBridgeLocalTool": { "status": "implemented-local-tool", "date": "2026-06-08", "description": "发送到 Figma 不再只预留 localhost 接口;项目内置 tools/figma-bridge 本机服务和 Figma 开发插件,用户运行 npm run figma:bridge 并在 Figma 导入 plugin/manifest.json 后即可把画布素材导入当前 Figma 文件。", "paths": [ "tools/figma-bridge/server.cjs", "tools/figma-bridge/start-figma-bridge.cmd", "tools/figma-bridge/plugin/manifest.json", "tools/figma-bridge/plugin/code.js", "tools/figma-bridge/plugin/ui.html" ], "protocol": [ "T8 后端启动时自动拉起 localhost:3845 bridge;发送前再次兜底确保 bridge 在线。", "T8 后端 POST http://127.0.0.1:3845/import 将素材放入本机队列。", "Figma 插件轮询 /claim,导入图像和文本;视频 / 音频以引用卡片保留素材地址。", "Bridge 通过 /asset/:jobId/:itemId 代理本机 input/output 素材,Figma 插件侧只访问 manifest 允许的 localhost:3845。" ], "packaging": [ "package.json build.extraResources 复制 tools/figma-bridge 到 Electron resources/tools/figma-bridge。", "electron/_post_build.cjs 检查 bridge server、启动脚本和插件 manifest/code/ui 是否存在。" ] }, "sourceReleaseV213": { "version": "2.1.3", "status": "source-only", "date": "2026-06-08", "description": "v2.1.3 源码发布:按新版 dreamina CLI help 权威确认即梦 CLI 图像 seedream-4.7 与完整 Seedance 2.0 视频模型变体,补齐默认模型列表、旧设置迁移、后端 model_version 参数和设置页提示。本次只推 GitHub 源码,不打包 Electron,不创建或更新 GitHub Release 自动更新资产。", "highlights": [ "已按用户提供的 curl 安装方式更新本机 dreamina CLI 到 C:\\Users\\Administrator\\bin\\dreamina.exe;新版安装包未提供单独 tools.json,安装后的 SKILL.md 明确要求以 dreamina -h / 子命令 -h 为权威来源。", "dreamina text2image -h 与 image2image -h 已确认支持 model_version=4.7;即梦 CLI 图像模型新增 seedream-4.7,后端提交时会写入 --model_version=4.7。", "即梦 CLI 默认图像模型补充 seedream-4.7 / seedream-4.6 / seedream-4.5 / seedream-5.0,并保留旧 jimeng-image-2k / jimeng-image-4k 兼容值。", "dreamina text2video -h 与 multimodal2video -h 已确认 Seedance 2.0 支持 seedance2.0fast_vip / seedance2.0_vip / seedance2.0fast / seedance2.0;默认列表和旧空列表设置迁移已补齐。", "按 CLI 帮助同步 Seedance 2.0 分辨率边界:只有 seedance2.0_vip 允许 1080p,其余 Seedance 2.0 变体提交时固定 720p,避免 CLI 参数报错。", "API Key 设置页即梦 CLI 模型提示同步展示 seedream-4.7 与完整 Seedance 2.0 变体,降低用户手填模型名的成本。" ], "sourceSync": [ "package.json / package-lock.json", "vite.config.ts / vite.config.js", "electron/main.cjs APP_VERSION", "backend/src/config.js APP_VERSION", "features.json", "README.md", "release-notes/v2.1.3.md" ], "releaseBoundary": [ "本次只推 GitHub 源码,不运行 npm run dist:release,不打包 Electron,不发布 GitHub Release 或 latest.yml。", "公开提交继续禁止 skill.md、roadmap.md、local-private/** 和任何私有计费/支付/充值/分组令牌实现进入 GitHub。" ], "verification": [ "C:\\Users\\Administrator\\bin\\dreamina.exe -h", "C:\\Users\\Administrator\\bin\\dreamina.exe text2image -h", "C:\\Users\\Administrator\\bin\\dreamina.exe image2image -h", "C:\\Users\\Administrator\\bin\\dreamina.exe text2video -h", "C:\\Users\\Administrator\\bin\\dreamina.exe multimodal2video -h", "node --test tests\\advancedProviders.test.ts tests\\advancedProviderFrontend.test.ts tests\\jimengCliProvider.test.ts tests\\updateMdRegressions.test.ts", "node --test tests\\*.test.ts", "npm run type-check", "npm run build", "npm run public:check", "git diff --check" ] }, "sourceReleaseV212": { "version": "2.1.2", "status": "source-only", "date": "2026-06-08", "description": "v2.1.2 源码发布:集中修复 update.md 中的 LLM 结果删除、@ 素材提及、文本分割提示词模板、大画布框选、组框级联删除、提示词模板分类保存、Figma 本机发送、左下角放置栏和素材外拖文件夹体验。本次按用户要求只推 GitHub 源码,不打包 Electron,不创建或更新 GitHub Release 自动更新资产。", "highlights": [ "LLM 节点支持手动删除某条 assistant 流式结果;删除后同步刷新 outputText / text / generatedImages / imageUrls,后续生成不会让旧结果复活。", "MentionPromptInput 修复 @ / 全角@即时弹出时机;文本节点新增上游图像、视频、音频输入与素材提及预览,文本分割节点接入统一提示词模板和放大编辑器。", "大画布框选结束时根据屏幕拖拽起止点重新映射 flow 矩形复核选区,降低节点很多时误选远处节点的问题。", "组框右键新增“删除组和内容”,会合并 data.memberIds 与几何范围内成员节点,并清理所有相关连线。", "素材右键保存到提示词模板库时可选择模板分类,也可即时新建模板分类;模板库继续支持分类新增、重命名、删除、导入导出。", "发送弹窗新增“发送到 Figma”,后端 /api/figma/import 只允许 localhost 桥接,和 Eagle 一样不把本地素材发送到远端代理。", "新增左下角放置栏:发送、粘贴和自动输出的素材节点会登记映射,折叠显示最近 5 个,展开显示最近 20 个;拖动放置栏卡片会移动原节点到落点,不复制节点。", "图像、视频、音频素材写入 DownloadURL / text/uri-list 拖拽数据,支持从浏览器直接拖到外部文件夹。", "RunningHub 上传链路补静态回归,确认 /files/input/* 上传节点素材和 /files/output/* 输出素材都支持 upload-asset 转 RH fileName。", "即梦 CLI seedream 4.7 飞书文档当前环境无法打开,本次按“不猜模型名”原则仅记录阻塞,待可访问文档或明确 CLI 模型值后再补。" ], "sourceSync": [ "package.json / package-lock.json", "vite.config.ts / vite.config.js", "electron/main.cjs APP_VERSION", "backend/src/config.js APP_VERSION", "features.json", "README.md", "release-notes/v2.1.2.md" ], "releaseBoundary": [ "本次只推 GitHub 源码,不运行 npm run dist:release,不打包 Electron,不发布 GitHub Release 或 latest.yml。", "公开提交继续禁止 skill.md、roadmap.md、local-private/** 和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "新增 Figma 后端路由已加入 Electron 后置加密资源检查,但本次不生成 Electron 用户包。" ], "verification": [ "node --test tests\\updateMdRegressions.test.ts tests\\promptTemplateLibrary.test.ts tests\\electronPackaging.test.ts", "npm run type-check", "npm run build", "npm run public:check", "git diff --check" ] }, "sourceReleaseV211": { "version": "2.1.1", "status": "source-only", "date": "2026-06-08", "description": "v2.1.1 源码发布:新增 New API 分组令牌高级模式所需的公开扩展插槽和 providerParams 透传,补齐分类独立 API Key 清空按钮,修复 Nano Banana 2 真实上游模型映射。本次按用户要求只推 GitHub 源码,不打包 Electron,不创建或更新 GitHub Release 自动更新资产。", "highlights": [ "公开源码新增 LocalSettingsAddonSlot / LocalNodeAddonSlot 与后端 runtimeHooks,供本机 ignored 私有扩展接入 New API 分组令牌 UI 和按节点分组选择;公开仓库本身不包含私有分组令牌实现。", "图像、视频、Seedance、音频节点把 providerParams 透传到后端代理,后端可通过通用 hook 解析分组令牌;普通用户不启用高级模式时仍只使用原贞贞通用 Key / 分类独立 Key。", "FAL 图像和视频路线固定使用通用贞贞 API Key,不参与 New API 分组令牌,避免 fallback 模型因分组选择走错 Key。", "分类独立 API Key 设置为每个系列增加清空按钮,支持保存后明确清空单个分类 Key,而不是只能覆盖或显示。", "Nano Banana 2 UI 仍显示 nano-banana-2 (Flash),真实上游提交修正为 gemini-3.1-flash-image;旧画布保存的 nano-banana-2 会在前端和后端兜底归一。", "后端增加无效令牌缓存失效 hook,私有分组令牌扩展可在 New API 后台删除/重建令牌后自动丢弃旧 key,避免继续复用过期缓存。" ], "sourceSync": [ "package.json / package-lock.json", "vite.config.ts / vite.config.js", "electron/main.cjs APP_VERSION", "backend/src/config.js APP_VERSION", "features.json", "README.md", "release-notes/v2.1.1.md" ], "releaseBoundary": [ "本次只推 GitHub 源码,不运行 npm run dist:release,不打包 Electron,不发布 GitHub Release 或 latest.yml。", "公开提交继续禁止 skill.md、roadmap.md、local-private/** 和任何私有计费/支付/充值/分组令牌实现进入 GitHub。", "Electron 用户包如需带入 ignored local-private 分组令牌实现,必须后续重新走加密打包和 release 验证流程。" ], "verification": [ "node --test tests\\imageModelMapping.test.ts tests\\advancedProviderFrontend.test.ts tests\\apiSettingsTheme.test.ts tests\\electronPackaging.test.ts tests\\grokVideo15.test.ts tests\\localExtensionHooks.test.ts", "npm run type-check", "npm run build", "npm run public:check" ] }, "sourceReleaseV210": { "version": "2.1.0", "status": "source-only", "date": "2026-06-07", "description": "v2.1.0 源码发布:提示词模板库升级为可携带图像 / 视频 / 音频配套素材的媒体模板库,Remote ComfyUI 收口为默认关闭的高危开关,并补齐 Web + 后端 Docker 部署入口。本次按用户要求只推 GitHub 源码并合并 main,不打包 Electron,不创建或更新 GitHub Release 自动更新资产。", "highlights": [ "提示词模板库支持从图像、视频、音频、文本、输出素材和素材集右键保存模板,自动带入原 Prompt、标题、标签、媒体类型和配套媒体引用。", "模板库预览改为轻量懒加载策略,图像缩略图右上角 hover 显示小眼睛,可按 100% 查看原图细节,避免模板数量过多时首屏卡顿。", "全局提示词模板服务补齐媒体附件协议、导入导出兼容和资源库保存链路,旧纯文字模板继续兼容。", "Remote ComfyUI 默认保持关闭,仅允许 localhost / 127.0.0.1;可信远端地址必须通过单个 ComfyUI 配置的 allowRemote 高危开关,或后端环境变量 T8_COMFYUI_ALLOW_REMOTE / T8_COMFYUI_ALLOW_PRIVATE 显式开启。", "新增 Dockerfile、docker-compose.yml 与 .dockerignore,Docker 部署只包含 Web 前端 + Express 后端,不包含 Electron;compose 默认挂载 userdata 并开启容器场景所需的远端 ComfyUI 环境变量。", "ComfyUI 地址安全校验集中到 backend/src/providers/comfyuiAccess.js,registry 归一化、连接测试和真实运行共用同一策略,避免配置 UI 与后端执行分裂。", "感谢 @fm9394 在 PR #11 中提供 Remote ComfyUI 与 Docker 部署方向;本版参考其目标后重新按项目安全边界实现,保留默认本机安全策略。" ], "prAcknowledgement": { "pullRequest": "https://github.com/T8mars/T8-penguin-canvas/pull/11", "author": "fm9394", "note": "感谢 PR #11 对 Remote ComfyUI 与 Docker 部署方向的贡献;本次公开版本采用默认关闭的高危开关方案,兼容环境变量,不直接放开所有远端地址。" }, "sourceSync": [ "package.json / package-lock.json", "vite.config.ts / vite.config.js", "electron/main.cjs APP_VERSION", "backend/src/config.js APP_VERSION", "features.json", "README.md", "release-notes/v2.1.0.md" ], "releaseBoundary": [ "本次只推 GitHub 源码并合并 main,不运行 npm run dist:release,不打包 Electron,不发布 GitHub Release 或 latest.yml。", "公开提交继续禁止 skill.md、roadmap.md、local-private/** 和任何私有计费/支付/充值实现进入 GitHub。", "Docker 产物面向 Web + 后端源码部署;Electron 自动更新包如需发布,必须后续重新走 clean public worktree 与正式 release 流程。" ], "verification": [ "node --test tests\\promptTemplateLibrary.test.ts tests\\advancedProviders.test.ts tests\\comfyuiProvider.test.ts tests\\externalProvidersRoute.test.ts tests\\dockerComposeConfig.test.ts", "npm run type-check", "npm run build", "npm run public:check", "git diff --check" ] }, "electronReleaseV209": { "version": "2.0.9", "status": "electron-release", "date": "2026-06-07", "description": "v2.0.9 集中发布 3D 全景导演台后续能力、Sora2 Zhenzhen API 双通道、Veo Omni 默认模型、上传与画布持久化稳定性修复,并按规范打包 Electron 自动更新版本。", "highlights": [ "3D 全景节点继续升级导演台:多人彩色小人、100+ 动作预设、自然语言动作生成、关键帧时间轴、序列帧素材集、遮挡参考、画面关节拖拽和全屏参数台形成闭环。", "视频节点 Sora2 保留原 FAL 通道,同时新增 Zhenzhen API 通道;Sora2 拥有独立分类 API Key,不再和 Veo 共用独立 Key 设置。", "视频节点主分类显示名从 Veo 3.1 调整为 Veo,并把 `veo-omni-10s` 设为 Veo 分类默认具体模型;旧 Veo3.1 / Veo FAL 入口继续保留。", "Veo Omni 对齐 zhenzhen `/v1/videos` multipart 协议:前端模型值为 `veo-omni-10s`,后端提交时映射为 `omni_flash-10s`,使用 `input_reference` 与 `/v1/videos/{task_id}` 查询。", "上传素材接口上限对齐 20MB,并在超限时返回 413 JSON 错误,避免大 PNG 上传被误报 HTTP 500。", "画布持久化增加 BOM/NUL 清洗、canvas 文件扫描兜底和原子写入,降低崩溃或死机后画布列表丢失的概率。", "模型注意事项文本更新为当前图像、视频、音频、LLM 模型分组说明;公开源码继续排除 skill.md、roadmap.md、local-private/** 和私有计费/支付/充值实现。" ], "sourceSync": [ "package.json / package-lock.json", "vite.config.ts / vite.config.js", "electron/main.cjs APP_VERSION", "backend/src/config.js APP_VERSION", "features.json", "README.md", "release-notes/v2.0.9.md" ], "electronRelease": { "script": "npm run dist:release", "assets": [ "dist_electron/T8-PenguinCanvas-Setup-2.0.9.exe", "dist_electron/T8-PenguinCanvas-Setup-2.0.9.exe.blockmap", "dist_electron/latest.yml" ], "updater": "GitHub Release v2.0.9 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "publicSafety": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、私有充值 UI/路由/API/密钥进入 GitHub。", "发布前必须运行 npm run public:check 并检查 staged 文件列表。", "Electron 用户包可在本机 dist:release 时包含 ignored local-private 加密扩展;GitHub Source code zip/tar.gz 不包含这些源码。" ], "verification": [ "node --test tests\\*.test.ts", "npm run type-check", "npm run build", "npm run public:check", "npm run dist:release", "npm run release:verify", "win-unpacked 启动冒烟" ] }, "electronReleaseV208": { "version": "2.0.8", "status": "electron-release", "date": "2026-06-06", "description": "v2.0.8 聚焦火山 Seedance 2.0 任务结果解析、隐藏模式成就补记、七龙珠神龙体验与 Electron 自动更新发布稳定性,按规范打包并发布新的自动更新版本。", "highlights": [ "火山引擎 Seedance 2.0 任务完成后兼容顶层 content、result/content、mp4_url、output_url、src/path 与 JSON 字符串里的视频 URL,修复“任务完成但没有返回视频”的误报。", "补充火山 Seedance 2.0 真实最低配置冒烟:doubao-seedance-2-0-fast-260128、4s、480p、首帧图生视频可返回视频地址;日志和文档不得泄漏 API Key 或完整签名 URL。", "隐藏模式成就链路继续加固:统计关闭提示、重新开启后的隐藏状态补记、七龙珠神龙与 RH 隐藏模式事件统一进入成就进度。", "七龙珠神龙模式补齐隐藏音乐、普通/神龙双模式切换、神龙主题可读性和雷达倒计时/收集状态体验。", "火山引擎 API 设置继续补充 Ark API Key 与模型开通提示,ModelNotOpen / 401 等错误给出更明确的中文说明。", "发布继续遵守公开源码安全边界:GitHub 源码和 Source code 包不包含计费/支付/充值实现,本机 Electron 自动更新包可通过 ignored local-private 加密扩展带入本地私有能力。" ], "sourceSync": [ "package.json / package-lock.json", "vite.config.ts / vite.config.js", "electron/main.cjs APP_VERSION", "backend/src/config.js APP_VERSION", "features.json", "README.md", "release-notes/v2.0.8.md" ], "electronRelease": { "script": "npm run dist:release", "assets": [ "dist_electron/T8-PenguinCanvas-Setup-2.0.8.exe", "dist_electron/T8-PenguinCanvas-Setup-2.0.8.exe.blockmap", "dist_electron/latest.yml" ], "updater": "GitHub Release v2.0.8 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "publicSafety": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、私有充值 UI/路由/API/密钥进入 GitHub。", "发布前必须运行 npm run public:check 并检查 staged 文件列表。", "Electron 用户包可在本机 dist:release 时包含 ignored local-private 加密扩展;GitHub Source code zip/tar.gz 不包含这些源码。" ], "verification": [ "node --test tests\\volcengineProvider.test.ts tests\\achievements.test.ts tests\\dragonBallRadar.test.ts tests\\advancedProviderFrontend.test.ts tests\\apiSettingsTheme.test.ts", "npm run type-check", "npm run build", "npm run public:check", "npm run dist:release", "npm run release:verify", "win-unpacked 启动冒烟" ] }, "electronReleaseV207": { "version": "2.0.7", "status": "electron-release", "date": "2026-06-05", "description": "v2.0.7 集中发布七龙珠神龙隐藏模式过场、3D 全景机位/热点、火山引擎修复、成就仪式感与本地私有扩展拆分,并按规范打包 Electron 自动更新版本。", "highlights": [ "七龙珠隐藏模式神龙过场改为项目内透明 PNG 资产 src/assets/theme-dragonball/shenron-dragon.png,配合雷达扫描、能量雾、光束和七龙珠聚合动画。", "龙珠雷达进入顶部工具栏,支持展开/折叠;七颗龙珠收集、15 分钟单球倒计时、3 秒停留收集、特殊音效和隐藏模式成就事件保持稳定。", "3D 全景节点新增观看机位书签、默认视线中心、热点导览和跨全景节点跳转;生成提示词会合并观看者站位与视线中心。", "火山引擎扩展 API 对齐 Infinite-Canvas 的 Seedream / Seedance 调用路径,修复连接检测、Seedance 2.0 视频提交 404 等问题。", "成就系统增强主题详情、完成度、隐藏模式仪式感和本地持久化,避免更新后累计时长丢失。", "画板、提示词编辑器、宫格编辑滚轮、ModelScope 多 LoRA 总权重、Topaz / 去AI水印提示等体验继续修复。", "本地私有扩展拆分完成:GitHub 公开源码不包含计费/支付/充值实现,本机开发和本机 Electron 打包可通过 ignored local-private 扩展带入。" ], "sourceSync": [ "package.json / package-lock.json", "vite.config.ts / vite.config.js", "electron/main.cjs APP_VERSION", "backend/src/config.js APP_VERSION", "features.json", "README.md", "release-notes/v2.0.7.md" ], "electronRelease": { "script": "npm run dist:release", "assets": [ "dist_electron/T8-PenguinCanvas-Setup-2.0.7.exe", "dist_electron/T8-PenguinCanvas-Setup-2.0.7.exe.blockmap", "dist_electron/latest.yml" ], "updater": "GitHub Release v2.0.7 作为 latest.yml 自动更新源;安装继续使用前台 NSIS 向导,不静默安装。" }, "publicSafety": [ "公开源码继续禁止 skill.md、roadmap.md、local-private/**、私有充值 UI/路由/API/密钥进入 GitHub。", "发布前必须运行 npm run public:check 并检查 staged 文件列表。", "Electron 用户包可在本机 dist:release 时包含 ignored local-private 加密扩展;GitHub Source code zip/tar.gz 不包含这些源码。" ], "verification": [ "node --test tests\\*.test.ts", "npm run type-check", "npm run build", "npm run public:check", "npm run dist:release", "npm run release:verify", "win-unpacked 启动冒烟" ] }, "sourceReleaseV206": { "version": "2.0.6", "status": "source-only", "description": "本次按用户要求只更新并推送 GitHub 源码,不打包 Electron,不创建或更新 GitHub Release 自动更新资产。", "readmeUpdates": [ "README 当前版本与 badge 同步到 v2.0.6。", "README 功能亮点节点数同步为 50。", "README「配置 API Key」表格补充扩展平台 API Key / Token,覆盖 OpenAI 兼容、ModelScope、火山引擎、即梦 CLI 等高级来源。", "README「配置 API Key」表格补充本地 ComfyUI,说明默认地址 http://127.0.0.1:8188 且需要先启动本机 ComfyUI。", "README 补充传统 Key、扩展平台密钥和本地 ComfyUI 配置都会保存到 data/settings.json,并继续脱敏展示。" ], "sourceSync": [ "package.json / package-lock.json", "vite.config.ts / vite.config.js", "electron/main.cjs APP_VERSION", "backend/src/config.js APP_VERSION", "features.json", "README.md" ], "notIncluded": [ "未执行 Electron 打包。", "未生成 T8-PenguinCanvas-Setup-2.0.6.exe、blockmap 或 latest.yml。", "未发布 GitHub Release 自动更新版本。" ], "verification": [ "node --test tests\\advancedProviderFrontend.test.ts tests\\modelscopeProvider.test.ts tests\\apiSettingsTheme.test.ts", "npm run type-check", "npm run build", "git diff --check" ] }, "panorama3dCameraNavigation": { "version": "2.0.6-dev", "status": "implemented", "description": "3D 全景节点新增摄像机机位书签、生成时观看者站位/初始视线中心提示词、全景热点导览与跨 3D 全景节点跳转。", "sourceFiles": [ "src/utils/panorama3d.ts", "src/components/nodes/Panorama3DNode.tsx", "src/components/Canvas.tsx", "tests/panorama3d.test.ts" ], "dataFields": [ "panoramaViewerPosition", "panoramaViewCenter", "panoramaCameraViews", "panoramaActiveCameraViewId", "panoramaHotspots" ], "capabilities": [ "预设正前、左侧、右侧、背面、天顶、地面视角。", "保存当前 Yaw / Pitch / FOV 为机位,支持跳转、设为默认和删除。", "文生/图生全景时把观看者站位和初始视线中心合并进实际发送提示词。", "热点支持保存当前中心或点击画面取点,热点可跳转当前全景视角或其他 3D 全景节点。", "拖动画面期间只更新本地 Three.js 视角,松手后再落盘节点数据,降低画布拖拽卡顿风险。" ], "developerRule": "3D 全景的“摄像机位置”只表示单张全景贴图内的观看方向与 FOV,不要用假的 xyz 平移误导用户。后续扩展导览、热点、资源库 metadata 或导出协议时统一复用 src/utils/panorama3d.ts 的 PanoramaCameraView / PanoramaHotspot / prompt context 工具函数;拖动或自动旋转期间不要高频写 ReactFlow 节点 data。", "verification": [ "node --test tests\\panorama3d.test.ts", "npm run type-check", "npm run build" ] }, "topazLocalUpscale": { "version": "2.0.5", "status": "implemented", "description": "工具箱新增两个本地 Topaz 节点:Topaz图像高清化调用用户本机 Topaz Gigapixel AI / Gigapixel 8,Topaz视频高清化调用用户本机 Topaz Video AI 自带 ffmpeg.exe 做放大与补帧。", "nodes": [ { "type": "topaz-image-upscale", "label": "Topaz图像高清化", "category": "toolbox", "ports": { "inputs": [ "image" ], "outputs": [ "image" ] }, "runtime": "用户本机已安装并登录 Topaz Gigapixel AI / Gigapixel 8;默认查找 C:\\Program Files\\Topaz Labs LLC\\Topaz Gigapixel AI\\gigapixel.exe,也可在节点内填写路径。", "cli": "gigapixel --scale -i -o --dn/--sh/--cm/--fr/--pds --model ; std/fidelity/lowres/recovery 自动追加 --mv 2。", "sourceReference": "D:\\ComfyUI-aki-v1.3\\节点临时\\ComfyUI-GigapixelAI\\gigapixel.py" }, { "type": "topaz-video-upscale", "label": "Topaz视频高清化", "category": "toolbox", "ports": { "inputs": [ "video" ], "outputs": [ "video" ] }, "runtime": "用户本机已安装并登录 Topaz Video AI;必须使用 Topaz Video AI 自带 ffmpeg.exe,默认目录 C:\\Program Files\\Topaz Labs LLC\\Topaz Video AI。", "cli": "ffmpeg -y -hide_banner -nostdin -strict 2 -hwaccel auto -i -vf tvai_up=...,tvai_fi=... -c:v hevc_nvenc ...;GPU 编码失败时回退 CPU mpeg4。", "sourceReference": "D:\\ComfyUI-aki-v1.3\\节点临时\\ComfyUI-TopazVideoAI\\topaz_video_node.py", "videoLogicFix": "放大和补帧在 T8 中合并为同一次 Topaz ffmpeg filter chain,不再依赖中间视频复制,避免同时开启时走错智能多帧/中间输出分支。" } ], "sourceFiles": [ "backend/src/tools/topaz/runner.js", "backend/src/routes/topaz.js", "src/services/topaz.ts", "src/components/nodes/TopazImageUpscaleNode.tsx", "src/components/nodes/TopazVideoUpscaleNode.tsx", "src/config/nodeRegistry.ts", "src/config/portTypes.ts", "src/types/canvas.ts", "src/components/Canvas.tsx", "src/components/NodeActionBar.tsx", "src/components/nodes/LoopNode.tsx", "src/utils/nodePlacement.ts" ], "packaging": { "bundledSoftware": "不打包 Topaz 商业软件、不加入 package.json build.extraResources;只加密并检查 backend-enc/routes/topaz.t8c 与 backend-enc/tools/topaz/runner.t8c。", "electronCompatibility": "Electron 用户包通过本机路径调用用户已安装 Topaz;自动更新不需要额外 updater 代码,下一版打包时 encrypted backend 会包含新 route / runner。" }, "developerRule": "后续同步 Topaz / ComfyUI 上游更新时,只更新 backend/src/tools/topaz/runner.js 的模型列表、CLI 参数和错误提示,不要把 Topaz 软件或模型打进仓库/安装包;视频放大+补帧必须继续保持单次 filter chain,新增参数要补 tests/topazLocal.test.ts。", "verification": [ "node -c backend\\src\\tools\\topaz\\runner.js", "node -c backend\\src\\routes\\topaz.js", "node -c backend\\src\\server.js", "node --test tests\\topazLocal.test.ts", "npm run type-check", "npm run build" ] }, "promptTemplateLibrary": { "version": "2.1.0", "status": "implemented", "roadmap": "roadmap.md::全局提示词模板库(参考 Infinite-Canvas)", "description": "全局图像/视频提示词模板库,参考 Infinite-Canvas 模板按钮体验,面向创作者提供可检索、可管理、可导入导出、可保存资源库的高价值 Prompt 起点;v2.1.0 起自定义模板可携带 image/video/audio 配套素材附件,图像、视频、音频、输出素材可右键连同原 Prompt 一起保存到模板库。", "topLevelKinds": [ "image", "video" ], "builtinCategories": { "image": [ "人像 / 角色", "产品 / 电商", "分镜 / 宫格", "场景 / 世界观", "风格 / 光影", "海报 / 品牌", "全景 / VR", "参考 / 重绘" ], "video": [ "电影镜头", "运镜 / 镜头运动", "角色动作", "产品短片", "社媒 / 广告", "转场 / 特效", "音乐 / 声音", "图生视频 / 首尾帧" ] }, "minimumBuiltinTemplatesPerCategory": 100, "curationQuality": { "matrix": "每个内置小类使用 10 个真实使用场景 × 10 个专业技法/镜头方法生成 100 条,不再使用低价值同标题换词模板;视频模板场景必须是主体+具体动作,而不是地点/氛围词。", "sources": [ "优先纳入 Infinite-Canvas 原始高质量预设", "图像模板按主体、环境、构图、光线、材质、约束组织", "视频模板参考 Seedance 2.0 提示词写法,按主体与动作、场景与氛围、镜头执行、时间节奏、稳定约束组织" ], "guards": [ "tests/promptTemplateLibrary.test.ts 会检查每类数量", "同一分类内标题不得重复", "同一分类内正负向正文不得重复", "用户可见标题不得出现上游仓库名前缀,也不得用 21:9、2x2、3x3 这类比例/网格规格开头", "视频内置模板不得出现“主题 / 创作目标 / 场景语境”式空泛提示,必须包含主体与动作、镜头执行和稳定约束" ] }, "infiniteCanvasSeeds": [ "多机位九宫格", "多机位九宫格 4K", "剧情推演四宫格", "角色脸部三视图", "产品三视图", "连贯分镜网格", "电影级光影校正", "角色设定参考表", "六种基础表情胸像", "全景 VR 图" ], "sourceFiles": [ "src/data/promptTemplateLibrary.ts", "src/services/promptTemplateLibrary.ts", "src/components/PromptTemplateLibraryModal.tsx", "src/components/MaterialContextMenu.tsx", "src/components/PromptTextarea.tsx", "src/components/nodes/MentionPromptInput.tsx", "src/components/nodes/OutputNode.tsx" ], "storage": { "customLibrary": "localStorage:t8-prompt-template-library-v1", "resourceLibrarySave": "api.addResourceSet({ materialSetKind:'text' }),优先保存到资源库 set 分类「提示词模板」;若模板带 image/video/audio 附件,会把配套素材一并保存为素材集成员,并额外写入 metadata JSON 便于后续恢复。", "importExportSchema": "t8-prompt-template-library" }, "capabilities": [ "图像/视频双库切换", "中英文切换", "分类侧栏和搜索", "内置/我的筛选", "新建/编辑/删除我的模板", "隐藏和恢复内置模板", "新建/重命名/删除自定义分类", "替换/追加/正负向完整套用", "复制正向/复制正负向", "导入/导出我的模板 JSON", "保存模板到资源库文本素材集", "自定义模板保留 image/video/audio 轻量媒体附件协议", "节点素材右键保存到提示词模板库", "模板详情仅加载当前模板附件,图片附件 hover 小眼睛可 100% 查看" ], "integration": [ "PromptTextarea 增加 promptTemplateKind 可选入口", "MentionPromptInput 增加 promptTemplateKind 可选入口,并保持 @ 图像/视频/音频素材引用可用", "图像、视频、SD2.0、音频、LLM、3D 全景、预设图像、文本节点、RunningHub、RH 工具箱、ComfyUI 超市参数已接入", "图像、视频、SD2.0、音频、LLM 和输出素材把生成 Prompt 写入 data-prompt-template-*,供右键保存模板使用" ], "developerRule": "后续新增面向创作的 prompt 输入框时,优先使用 PromptTextarea 或 MentionPromptInput 并传入 promptTemplateKind='image' 或 'video';配置型 JSON/列表字段不要显示模板库按钮。新增媒体素材卡片若有生成 Prompt,应补 data-prompt-template-kind/category/prompt/negative 属性,让右键保存到模板库能带走配套素材。新增内置小类必须同步 tests/promptTemplateLibrary.test.ts,保证每个内置小类至少 100 条模板,且同类标题/正文不重复;用户可见标题不能出现 Infinite-Canvas 等上游来源前缀,也不能用 21:9、2x2、3x3 这类规格数字开头;视频模板必须写成 Seedance 可执行结构:主体与动作、场景与氛围、镜头执行、时间节奏、稳定约束,禁止只写地点、情绪、风格或“创作目标”;严禁用机械换词凑数量。", "verification": [ "node --test tests\\promptTemplateLibrary.test.ts", "node --test tests\\promptEditor.test.ts tests\\promptTemplateLibrary.test.ts", "npm run type-check", "npm run build" ] }, "firstTierRoadmapContinuation": { "version": "2.0.5", "status": "implemented", "notesFile": "docs/roadmap-priority-notes.md", "description": "按 roadmap.md 第一梯队继续收口:全局提示词大编辑器第二阶段、3D 全景体验、成就系统轻量留存、聚合解析授权助手。", "scope": [ "提示词大编辑器支持 JSON / 行列表两类配置型长文本,并接入 API 设置、ComfyUI 应用制作、RH 工具箱制作与 RH 工具编辑弹窗。", "3D 全景节点在贴图加载后做接缝/比例轻量质量检测,给用户展示接缝分数、比例提示和修正建议。", "成就系统补齐资源库保存、工作流保存事件,重复入库不刷计数;成就抽屉新增导入 JSON 与今日主题建议。", "聚合解析节点授权区域升级为三步式向导,桌面端明确说明官方登录页授权后回到节点检测,无需用户理解或手动复制 Cookie。" ], "promptEditorContract": { "components": [ "src/components/PromptExpandModal.tsx", "src/components/PromptTextarea.tsx" ], "editorKinds": [ "text", "json", "lines" ], "developerRule": "后续新增 prompt、workflow JSON、模型列表、排除规则、字段映射等长文本输入,必须优先使用 PromptTextarea 或 MentionPromptInput 的放大编辑能力;JSON/行列表类字段要显式传 editorKind,避免用户在窄输入框里编辑复杂配置。" }, "panorama3dContract": { "qualityUtil": "src/utils/panorama3d.ts::estimatePanoramaImageQuality", "developerRule": "3D 全景只做轻量客户端质量提示,不阻断用户继续使用;保存资源库仍必须保留原图 URL、panorama metadata 和全景分类,接缝检测失败时要给 unknown 状态而不是报错。" }, "achievementRetentionContract": { "events": [ "resource.saved", "workflow.saved" ], "ui": [ "成就导入 JSON", "今日主题建议" ], "developerRule": "新增留存事件只能记录非内容字段,例如 kind/category/nodeType/计数;严禁记录 prompt、短链、Cookie、完整文件名、资源 URL 或用户正文。重复保存、重复导入、重复运行导致的刷计数必须有去重或业务 guard。" }, "aggregateParserAuthContract": { "ui": "src/components/nodes/AggregateParserNode.tsx::authSteps", "developerRule": "聚合解析授权体验默认面向不懂 Cookie 的普通用户:优先引导打开官方登录页、回到节点检测授权、直接解析或保存授权;Web 模式只提供手动兜底,不得暗示可以自动读取浏览器 Cookie。" }, "verification": [ "node --test tests\\promptEditor.test.ts tests\\panorama3d.test.ts tests\\achievements.test.ts tests\\aggregateParser.test.ts", "npm run type-check", "npm run build" ] }, "secondTierComfyUiContinuation": { "version": "2.0.5", "status": "implemented", "notesFile": "docs/roadmap-priority-notes.md", "description": "第二梯队第一块收口:ComfyUI 本地 API 简化接入、ComfyUI 超市和应用制作工具的新手体验增强。", "scope": [ "内置基础文生图 API Workflow 样例,ComfyUI 超市打开即可看到可学习模板。", "API 设置页 ComfyUI 区和 ComfyUI 应用制作工具均支持一键载入样例。", "新增 ComfyUI 导入检查清单,提示 API Workflow 格式、Prompt、负向、尺寸、模型字段和输出节点状态。", "ComfyUI 超市运行前检查上游素材数量,缺图片/视频/音频时直接提示用户连接素材。", "后端 ComfyUI adapter 将缺模型、缺自定义节点、ComfyUI 未启动、workflow 校验失败和超时转成可执行中文提示。" ], "sourceFiles": [ "src/utils/comfyuiWorkflow.ts", "src/data/comfyuiAppManifest.ts", "src/components/ApiSettings.tsx", "src/components/nodes/ComfyUIAppMakerNode.tsx", "src/components/nodes/ComfyUIStoreNode.tsx", "backend/src/providers/comfyui.js" ], "developerRule": "后续新增 ComfyUI 样例或应用必须走 t8-comfyui-app-manifest 与 analyzer 映射,不给单个 workflow 写节点组件专用分支;后端错误提示必须保持可执行,优先告诉用户启动 ComfyUI、安装自定义节点或把模型名改成本机文件名。", "next": [ "ControlNet / OpenPose / Mask / Video 专用映射来源", "从 ComfyUI 历史任务导入当前 prompt/workflow", "更多经过标注的内置样例应用" ], "verification": [ "node --test tests\\comfyuiProvider.test.ts tests\\comfyuiAppNodes.test.ts tests\\apiSettingsTheme.test.ts tests\\advancedProviders.test.ts tests\\advancedProviderFrontend.test.ts", "node -c backend\\src\\providers\\comfyui.js", "npm run type-check", "npm run build" ] }, "remainingRoadmapContinuation": { "version": "2.0.5", "status": "implemented", "notesFile": "docs/roadmap-priority-notes.md", "description": "继续收口除暂缓项外的剩余 roadmap:云端上传 COS/OSS 可诊断性、RH 工具箱快捷入口底座、宫格编辑字幕条。", "scope": [ "云端上传新增 classifyCloudUploadError,将 COS/OSS 签名/密钥、Bucket/Region/Endpoint、权限、网络和素材解析错误转成可执行中文提示,并由上传路由返回 code/hint/statusCode。", "RH 工具箱新增 buildRhToolboxQuickActions,按 image/video/text/audio surface 生成快捷入口矩阵;节点内显示快捷接入位,启用工具可跳转运行,未配置模板显示待配置。", "宫格编辑新增字幕条第一版:节点支持字幕开关、字幕高度、条底色、字色和单格字幕输入;后端 grid-compose 为单格预留字幕区并输出带字幕 PNG。" ], "sourceFiles": [ "backend/src/cloudUploads/uploader.js", "backend/src/routes/cloudUploads.js", "src/utils/rhToolbox.ts", "src/components/nodes/RHToolboxNode.tsx", "src/utils/gridEditor.ts", "src/components/nodes/GridEditorNode.tsx", "backend/src/routes/imageOps.js" ], "developerRule": "后续继续做非暂缓项时,优先复用本轮底座:云上传错误统一走 classifyCloudUploadError;图像/视频/文本/音频节点接 RH 快捷按钮时走 buildRhToolboxQuickActions,不按工具名硬编码;宫格编辑新增标题/模板时继续扩展 gridEditor utils 与 grid-compose 协议,不在节点和后端写两套字段。", "next": [ "图像/视频/文本/音频节点内真正嵌入 RH 快捷按钮,并处理替换/追加输出策略。", "云端上传批量上传、上传结果写入资源库 metadata、预签名/Markdown 复制。", "宫格编辑单格裁切/平移/旋转、分镜标题、资源库模板。" ], "verification": [ "node --test tests\\cloudUploads.test.ts tests\\rhToolbox.test.ts tests\\gridEditor.test.ts", "node -c backend\\src\\cloudUploads\\uploader.js", "node -c backend\\src\\routes\\cloudUploads.js", "node -c backend\\src\\routes\\imageOps.js", "npm run type-check", "npm run build" ] }, "packaging": { "description": "Electron NSIS 桌面端打包链路(v1.2.1 起标准化, 严禁未明确指令主动打包)。完整产物拓扑: app.asar(electron/{main,loader,preload}.cjs + node_modules) + app.asar.unpacked(node_modules/sharp + @img) + resources/backend-enc/*.t8c(extraResources, asar 外) + resources/frontend(extraResources, asar 外)。前端版本号由 vite define 注入 __APP_VERSION__、Sidebar 左下角自动同步。", "scripts": { "encrypt": "cross-env ELECTRON_RUN_AS_NODE=1 electron electron/encrypt.cjs (必须用 Electron 内置 Node, 否则 V8 字节码版本不匹配)", "prepack:enc": "npm run build && npm run encrypt (vite 前端产物 + bytenode .jsc + T8ENC1 加密 → build/backend-enc/*.t8c)", "prepack:runtimes": "node scripts/prepare-runtime-archives.cjs (把 tools/remove-ai-watermarks-runtime 与 tools/parsehub-pythonlibs 打成 tools/runtime-archives/*.zip,防止 NSIS 安装时复制几万散文件)", "dist:dir": "npm run prepack:enc && npm run prepack:runtimes && electron-builder --win --x64 --dir && node electron/_post_build.cjs (只出 win-unpacked 目录, 不打 NSIS)", "dist": "npm run prepack:enc && npm run prepack:runtimes && electron-builder --win --x64 && node electron/_post_build.cjs (出最终 T8-PenguinCanvas-Setup-${version}.exe)", "dist:release": "node scripts/dist-release.cjs (注入 T8_REQUIRE_AI_WATERMARK_RUNTIME=1、T8_REQUIRE_PARSEHUB_RUNTIME=1、T8_REQUIRE_RUNTIME_ARCHIVES=1 与 T8_REQUIRE_UPDATE_ARTIFACTS=1,本地构建并上传 GitHub Release 自动更新资产)", "release:github": "node scripts/release-github.cjs (复用当前 dist_electron 产物创建/更新 GitHub Release)", "release:verify": "node scripts/verify-github-release.cjs (校验 GitHub Release 是否包含 installer/blockmap/latest.yml)" }, "runtimeEnvVars": { "T8PC_PACKAGED": "1=打包模式 / 0=开发模式 (由 main.cjs 在 startBackend 注入)", "T8PC_USER_DATA": "app.getPath('userData') 路径 = %APPDATA%/t8-penguin-canvas, 后端数据/输入/输出/缩略图全部位于此", "T8PC_FRONTEND_DIST": "打包模式 = path.join(process.resourcesPath, 'frontend'); 开发模式 = /dist", "T8PC_RES": "打包模式 = process.resourcesPath; 开发模式 = ", "T8_PARSEHUB_PYTHON": "可选,覆盖聚合解析节点使用的 Python 3.12 解释器路径", "T8_PARSEHUB_LIB_PATHS": "可选,覆盖 ParseHub Python 依赖搜索路径;正式包首次使用会把 resources/tools/runtime-archives/parsehub-pythonlibs.zip 解压到 runtime-cache 后使用", "T8_RUNTIME_ARCHIVES_DIR": "可选,覆盖内置运行时归档搜索目录;默认打包为 resources/tools/runtime-archives", "T8_RUNTIME_CACHE_DIR": "可选,覆盖运行时归档解压缓存目录;默认打包模式为 %APPDATA%/t8-penguin-canvas/runtime-cache", "T8_ENABLE_LOCAL_PRIVATE": "可选,0=强制关闭本机 local-private/extensions 私有扩展;默认只要本机 ignored 私有扩展存在,开发环境和本机打包 release 都会自动带入。GitHub/clean clone 因为没有 local-private 目录,所以不会带充值实现。" }, "version": "2.5.0", "semverVersion": "2.5.0", "versionNumberPolicy": "T8 版本号仍采用 x.y.z 三段,但每一段只允许 0-9;任一段到 9 后下一次发布必须向左进位,禁止任一段出现两位数字。例:1.9.9 的下一版必须是 2.0.0。", "versionNote": "v1.3.0 起统一采用三段阶段号 x.y.z;当前发布版本为 v2.5.0,收口随机路由并发执行、即梦 CLI v1.4.10 图像批量与 Seedance 新模型/分辨率、批量打标图图入口与输出路径查看、以及 Photoshop 画布发送队列和插件资产渲染;公开源码仍排除本地私有计费/支付/充值/分组令牌实现。", "installer": "v2.5.0 作为 Electron 自动更新发布版本:npm run dist:release 与 npm run release:github 继续带 T8_RELEASE_APPROVAL=release-2.5.0 防误触闸,只有用户明确要求发布后才能设置该变量并发布自动更新资产。", "updaterInstallMode": "自动更新下载完成后不得静默安装:main.cjs 必须设置 autoInstallOnAppQuit=false,显式安装调用 quitAndInstall(false,true);electron/build-resources/installer.nsh 通过 SetSilent normal 让新版 NSIS 安装器即使收到旧客户端传入的 /S 也尽量切回前台安装向导。", "installerShortcutPolicy": "安装完成后必须创建桌面和开始菜单快捷方式:package.json build.nsis.createDesktopShortcut 必须为 \"always\",createStartMenuShortcut 必须为 true;electron/build-resources/installer.nsh 必须保留 customInstall 兜底 CreateShortCut \"$newStartMenuLink\" 与 \"$DESKTOP\\${SHORTCUT_NAME}.lnk\",防止更新安装/keepShortcuts 路径遗漏入口。", "updaterEntryPolicy": "顶栏桌面更新入口不得只因 window.t8pc.updater 缺失就静默消失;Electron UA 或 t8pc.getInfo/openExternal 可用时必须显示诊断入口,提示重新安装完整桌面包,Web/纯浏览器环境才隐藏。状态为 not-available 时按钮仍保留“更新”字样,避免用户误以为自动更新入口被删除。", "publicReleasePolicy": { "github": "GitHub 公开源码只保留通用画布、生成节点、扩展平台、资源库、主题、ComfyUI/RH 工具箱、云端上传等能力;本地私有计费/支付/充值能力不得进入公开仓库。", "neverStage": [ "roadmap.md", "skill.md", "backend/src/routes/recharge.js", "src/components/Recharge*.tsx", "src/private/recharge/**", "backend/src/private/recharge/**", "private/recharge/**", "local-private/**", "recharge.private.*", "data/recharge*.json", "backend/data/recharge*.json" ], "prePushScan": "每次推送前运行 npm run public:check,并检查 staged 文件不包含 roadmap.md、skill.md、私有扩展目录、私有 UI、私有路由、支付路径、密钥字段或中文充值实现;本地开发和打包若需要私有能力,只能通过 ignored local-private/extensions 扩展加载。" }, "localPrivateExtensions": { "status": "implemented-v2.1.3-source", "purpose": "把本机私有计费/支付能力从已跟踪公开文件中拆出,避免每次 Git 推送都需要手动拆 hunk。", "publicHooks": [ "backend/src/extensions/localExtensions.js 只负责发现并注册本地私有后端扩展,不包含具体业务逻辑。", "vite.config.ts/js 通过 virtual:t8-local-extensions 默认映射到 src/extensions/emptyLocalExtensions.tsx;本机 ignored 扩展存在时自动映射到 local-private/extensions/frontend/index.tsx,设置 T8_ENABLE_LOCAL_PRIVATE=0 或 T8_DISABLE_LOCAL_EXTENSIONS=1 才关闭。", "electron/encrypt.cjs 默认加密 backend/src;本机 ignored 后端扩展存在且未被显式禁用时,会额外加密 local-private 后端扩展到 build/backend-enc/local-private。", "electron/_post_build.cjs 会在本机 ignored build hook 存在且未被显式禁用时自动运行;具体密钥与分发检查放在 ignored local-private/extensions/build/post-build.cjs。" ], "gitSafety": [ ".gitignore 统一忽略 /local-private/**,旧私有路由和私有 UI 路径仍保持忽略兜底。", "scripts/check-public-clean.cjs / npm run public:check 会扫描 staged 路径和 diff,防止误提交私有文件或实现关键字。", "公开文件 backend/src/config.js、backend/src/server.js、src/App.tsx、src/services/api.ts、electron/_post_build.cjs 不应再保留私有业务 diff。", "v2.1.1 源码推送时继续用 scripts/check-public-clean.cjs 扫描 staged 路径和新增文本,skill.md / roadmap.md / local-private/** 不进入公开提交。" ] }, "checklist": [ "运行 npm run encrypt 前确认已 npm install bytenode 且使用 Electron 内置 Node", "backend/src/ 任何文件修改后必须重新 npm run encrypt 再打包", "main.cjs 的窗口标题 / log 窗口 / IPC version 三处版本号,以及 backend/src/config.js APP_VERSION 必须与 package.json 同步", "安装包必须创建桌面和开始菜单快捷方式:createDesktopShortcut=\"always\"、createStartMenuShortcut=true,installer.nsh customInstall 兜底 CreateShortCut 不得删除", "_post_build.cjs 验证后端 .t8c 必存在: server/config + routes/{canvas,settings,proxy,externalProviders,files,imageOps,resources,themes,eagle,figma,aiWatermark,cloudUploads,parseHub,achievements,batchTags} + achievements/store + providers/{registry,mediaResolver,llmMedia,adapters,openaiCompatible,modelscope,volcengine,comfyui,jimengCli} + cloudUploads/{settings,uploader} + tools/aiWatermark/{runner,media} + utils/duckPayload/parseHubBridge", "_post_build.cjs 必须验证 providers/llmMedia.t8c 与 resources/tools/ffmpeg/ffmpeg.exe;LLM 视频输入默认使用内置 ffmpeg sidecar 按整段视频均匀抽取可配置数量的关键帧发送给 LLM,native-base64 / compressed-base64 模式才缩放压缩后转原生 video_url Base64,用户包不得依赖系统 PATH 自带 ffmpeg", "_post_build.cjs 验证 resources/frontend/index.html + assets/ 必存在", "_post_build.cjs 必须检查 resources/shared/achievementManifest.json;成就后端加密包会从该共享 manifest 读取规则,Electron extraResources 不能漏带 shared/achievementManifest.json", "_post_build.cjs 必须让 src/assets/theme-music/*.mp3 / *.mid 经 Vite 输出到 resources/frontend/assets,主题音乐默认静音且随前端资源一起打包", "_post_build.cjs 必须检查 resources/tools/runtime-archives/remove-ai-watermarks-runtime.zip 与 runtime-archives-manifest.json;旧展开目录 resources/tools/remove-ai-watermarks 仅保留兼容,不得作为默认打包方式", "_post_build.cjs 必须检查 resources/tools/parsehub-bridge/parsehub_bridge.py、resources/tools/runtime-archives/parsehub-pythonlibs.zip、backend-enc/routes/parseHub.t8c、backend-enc/utils/parseHubBridge.t8c 与 backend-enc/utils/runtimeArchive.t8c;正式发布脚本设置 T8_REQUIRE_PARSEHUB_RUNTIME=1 与 T8_REQUIRE_RUNTIME_ARCHIVES=1,缺少 ParseHub 依赖归档时必须失败", "_post_build.cjs 必须检查 RH工具箱制作器不得进入用户包;resources/frontend 内若出现 RHToolboxMakerNode、RH工具箱制作器 或 rh-toolbox-maker,打包后置检查必须失败", "dist:release 必须在 build + encrypt 前执行 npm run rh-toolbox:check;_post_build.cjs 必须确认 resources/frontend 内包含 image-cutout-v1、tuantiquv10、bernini1、berninituxiangbianji、bernini2 和对应 WebAppId,避免用户包丢失 RH 工具箱正式应用", "去AI水印 full runtime 不提交 Git;如需离线用户包,先把 Python/Torch/remove-ai-watermarks[gpu,detect,trustmark,lama] sidecar 放入 tools/remove-ai-watermarks-runtime,再执行 npm run prepack:runtimes 或 npm run dist;zip 归档也不提交 Git", "_post_build.cjs 自动清除任何意外混入的 resources/{app,backend}/src 明文目录", "GitHub 公开推送必须排除 roadmap.md、skill.md 与所有本地私有计费/支付/充值实现;执行 git add 前后都要用 publicReleasePolicy.prePushScan 的关键字检查 staged diff", "打包完成后必须实测启动 win-unpacked/T8-PenguinCanvas.exe 检查日志: 环境=production / 数据目录=AppData/t8-penguin-canvas / GET / 200", "打包成功后不上传 dist_electron 和 build 目录到 git (已在 .gitignore)" ] }, "canvasPerformance": { "version": "2.0.5", "description": "大画布启动、图片预览和拖动画布性能热修与后续开发规范。", "imagePreviewPipeline": { "frontend": "高频节点预览统一使用 SmartImage + previewImageUrl,本地 /files/input 与 /files/output 图片接近视口后才请求 /api/files/thumbnail,原始素材 URL 保留在 data-full-src 与拖拽/下载/下游数据中。", "backend": "backend/src/routes/files.js 提供 GET /api/files/thumbnail?url=&size=,用 sharp 生成 webp 缩略图并缓存到 THUMBNAILS_DIR,Cache-Control=immutable;同一 target 通过 thumbnailInflight 去重,生成并发由 T8PC_THUMBNAIL_CONCURRENCY 控制,默认 2、最高 4。", "upload": "POST /api/files/upload multipart 不设置应用层大小上限;上传素材节点可接收大体积本地素材,实际容量只受磁盘、系统和运行环境约束。", "exceptions": "裁剪、去水印框选、图片编辑、图片对比等依赖原图像素或细节的视图继续使用原图。" }, "edgeMotion": { "themes": [ "soccer-hero", "slamdunk", "dragon-ball", "saint-seiya" ], "policy": "强主题连线动画统一走 scoped 规范:闲置时写入 data-t8-edge-motion=scoped,普通连线只做静态主题化;只有选中边、悬停边、或与选中节点相连的边会获得 .t8-edge-theme-active 并启用 edge path 动画、运动球 SVG 或气功波流动效果。视口拖动、节点拖动或 prefers-reduced-motion 时写入/遵守 data-t8-edge-motion=reduced,禁用所有无限动画、filter、运动球和 SVG animateMotion;当一次选中导致活跃边超过 DECORATIVE_EDGE_MOTION_LIMIT 时,只保留直接选中/悬停边动效,避免 36+ 条边一起运动。" }, "startup": { "devStrictMode": "开发环境默认不包 React StrictMode,设置 VITE_T8_STRICT_MODE=1 可恢复双挂载诊断。", "appShellLazyLoad": "src/App.tsx 必须懒加载 Canvas 与非首屏弹窗/抽屉,Canvas 内 nodeTypes 通过 lazyCanvasNode 动态导入节点组件;首屏只加载外壳、侧栏、Canvas 骨架和当前画布实际出现的节点类型。", "viteDevWarmup": "vite.config.ts 对 react/react-dom/@xyflow/react/lucide-react/zustand 做 optimizeDeps.include,并用 server.warmup 预热 main/App/Canvas 与 Image/Upload/Output 常用节点,避免第一次打开页面才集中 transform。", "autosave": "节点拖动期间自动保存跳过中间帧,拖动结束后触发一次最终快照保存;加载画布时只做一次基线 JSON.stringify,旧快照节点数单独缓存,避免重复 parse/stringify 大画布。" }, "canvasPersistence": { "crashRecovery": "backend/src/routes/canvas.js 读取 JSON 时剥离 UTF-8 BOM 和 NUL;canvas_list.json 缺失或解析失败时扫描 data/canvas_*.json 兜底恢复有效画布列表,避免死机中断写入后侧栏直接显示 0。", "atomicWrites": "画布列表、新建空画布、PUT 保存画布和自动保存镜像统一通过临时文件 + rename 原子写入,降低系统死机或进程崩溃导致 JSON 被 NUL 覆盖的概率。" }, "developmentContract": { "nodes": [ "新增节点只要在画布内展示本地图片预览,必须使用 SmartImage 或 previewImageUrl;只有裁剪、编辑、对比、去水印框选、像素测量等依赖原图细节或 naturalWidth/naturalHeight 的界面可直接加载原图。", "节点 data 中必须保存原始素材 URL,缩略图 URL 只允许用于 img/src 展示;拖拽、下载、上传到云端、资源库入库、下游传递和生成请求不得把缩略图当原图。", "图片列表默认 lazy/async,固定最大预览尺寸;不要在节点 render 中同步创建 Image、Canvas、Video、Audio 或执行大 JSON/stringify/排序/拓扑扫描。", "新增业务节点必须在 Canvas.tsx 通过 lazyCanvasNode(() => import('./nodes/XxxNode')) 注册,除 PlaceholderNode、边、极少量基础壳组件外,禁止把重节点组件静态 import 到 Canvas 首屏模块图。", "节点内部需要读取上游素材时优先复用 useUpstreamMaterials、useOrderedMaterials、MaterialPreviewSection 等现有聚合组件,避免每个 render 全量遍历 ReactFlow nodes/edges。", "长任务、轮询、RAF、定时器、全局事件、ResizeObserver、MutationObserver 必须只在必要状态开启,并在 unmount/状态切换时清理;隐藏、未运行、未 ready 的节点不得持续占用 RAF。", "节点拖动、画布移动、批量选择期间不得触发昂贵副作用;会改变节点尺寸的媒体加载应有稳定容器、aspect-ratio 或 max-height,避免加载后大面积布局抖动。" ], "themes": [ "主题连线动效必须可降级且默认 scoped:普通边静态;选中边、悬停边、选中节点相关边才允许 .t8-edge-theme-active 动画、filter、drop-shadow、运动粒子和 SVG animateMotion。", "主题 CSS 不得给所有节点、所有边或大面积背景套高成本 filter/backdrop-filter/box-shadow 动画;强风格效果应放在少量静态背景层或 .t8-edge-theme-active / hover / selected 状态。", "画布背景水印、纹理和主题地图必须 pointer-events:none、低 z-index、轻量静态化;不得覆盖图片/视频/文本预览,也不得随每帧 transform 重绘复杂滤镜。", "MiniMap、Controls、HUD、右键菜单和浮动条必须跟随全局变量适配主题;新增主题要在 100+ 节点、36+ 边、拖动画布、拖动节点场景检查不卡顿。", "主题音乐、视频背景、粒子、运动球等装饰默认静音/静态/按需启用,不能在进入画布时批量解码大媒体或创建大量动画实例。" ], "verification": [ "新增节点含图片预览时必须补或更新 tests/imageLoadingPerformance.test.ts,锁定 SmartImage/previewImageUrl 使用。", "新增重节点、弹窗或抽屉时必须补或更新 tests/imageLoadingPerformance.test.ts,锁定 App/Canvas 的 lazy 边界,避免开发环境首屏重新退化为全量模块加载。", "新增主题动效必须至少在足球小将/灌篮高手/七龙珠同类压力下验证 data-t8-edge-motion=scoped 只让选中相关边运动,并验证 data-t8-edge-motion=reduced 与 prefers-reduced-motion 能完全停止动效。", "发布前至少跑 node --test tests\\imageLoadingPerformance.test.ts、npm run type-check、npm run build;若改 3D/Three.js 还要跑 tests\\panorama3d.test.ts。" ] }, "verification": [ "node --test tests\\imageLoadingPerformance.test.ts", "node --test tests\\panorama3d.test.ts", "node --test tests\\canvasPersistence.test.ts", "node -c backend\\src\\routes\\files.js", "node -c backend\\src\\routes\\canvas.js", "npm run type-check", "npm run build" ] }, "achievementSystem": { "version": "2.0.4", "status": "first-stage-implemented", "description": "十二套系统主题独立成就、有效创作时长、隐藏模式勋章与奖励影片系统。未提供素材的影片仍使用“待解锁 / 影片素材待提供”占位;已接入的圣斗士隐藏奖励以本地加密媒体解锁播放,俄罗斯方块主题记录小游戏摘要成就。", "manifest": { "sharedJson": "shared/achievementManifest.json", "frontendWrapper": "src/data/achievementManifest.ts", "themeTracks": [ "tech", "pixel", "op", "rh", "naruto", "eva", "yyh", "slamdunk", "soccer-hero", "dragon-ball", "saint-seiya", "tetris" ], "perThemeRules": "每个主题 5 条时长线(10m/1h/3h/10h/30h) + 3 条首批特色成就;定义由 manifest 展开,前后端共用同一 JSON,避免规则漂移。" }, "storage": { "file": "data/achievements.json", "route": "/api/achievements", "privacy": "只保存主题、节点类型、隐藏模式 kind、计数与最近摘要事件;不得保存 prompt、分享链接、资源 URL 或用户输入全文。" }, "frontend": { "store": "src/stores/achievements.ts", "tracker": "src/components/AchievementTracker.tsx", "entry": "src/components/AchievementButton.tsx", "drawer": "src/components/AchievementDrawer.tsx", "toast": "src/components/AchievementToast.tsx", "effectiveTimePolicy": "应用前台、document visible、窗口 focus、最近 90 秒内有 pointer/key/wheel/drag 操作才每 15 秒上报 theme.active_tick;单次最多累计 30 秒。" }, "events": [ "theme.active_tick", "theme.switched", "node.created", "node.run_success", "panorama.generated", "parsehub.resolved", "hidden_mode.enabled", "hidden_mode.used", "resource.saved", "workflow.saved", "tetris.game_started", "tetris.line_clear", "tetris.tetris_clear", "tetris.level_reached", "tetris.game_over" ], "hiddenModes": { "rh-duck": "NodeActionBar 长按 RUN 开启;UploadNode 鸭鸭解码成功产出时记录 used。", "yyh-portrait": "NodeActionBar 长按 RUN 开启;PortraitMasterNode 隐藏模式成功输出 Prompt 时记录 used,不能绕过现有未成年保护。" }, "filmPlaceholders": { "implemented": true, "lockedText": "待解锁", "unavailableText": "影片素材待提供", "nextPhase": "用户提供影片后再接 scripts/pack-achievement-films.cjs、tools/achievement-media/films、后端解密缓存与 Range 播放接口。" }, "developmentContract": [ "新增系统主题必须在 shared/achievementManifest.json 增加主题轨道、时长线可自动展开,特色成就必须用 condition 配置表达,避免散落 if 分支。", "新增隐藏模式必须同时补 hidden_mode.enabled 与 hidden_mode.used 两个真实事件源;开启事件只在切到启用状态时记录,关闭不刷成就。", "新增节点若要参与特色成就,只记录 nodeType / kind / category 等非内容字段;严禁把 prompt、短链、Cookie、资源 URL、用户文件名全文写入 achievements.json。", "成就 UI 必须保持轻量:顶部入口、右侧抽屉、小 toast,不弹全屏强打断,不阻塞节点运行或批量运行。", "修改成就规则、事件、UI 或后端路由后至少跑 node --test tests\\achievements.test.ts、node -c backend\\src\\achievements\\store.js、node -c backend\\src\\routes\\achievements.js、npm run type-check、npm run build。" ], "verification": [ "node --test tests\\achievements.test.ts", "node -c backend\\src\\achievements\\store.js", "node -c backend\\src\\routes\\achievements.js", "node -c backend\\src\\server.js", "npm run type-check", "npm run build" ] }, "layout": { "mode": "single-column-sidebar", "description": "画布管理 + 节点列表合并为一列 Sidebar,主体变为两栏布局(Sidebar + Canvas),紧凑化节省约 96px 横向空间。", "sidebarWidth": 256, "canvasPanel": { "collapsible": true, "defaultOpen": true, "maxHeight": 224 } }, "themes": { "description": "主题模板体系:内置科技风 / 像素糖果风 / OP 风格 / RH 风格 / 火影忍者风格 / EVA风格 / 幽游白书风格 / 灌篮高手风格 / 足球小将风格 / 七龙珠风格 / 圣斗士风格 / 俄罗斯方块主题十二套模板 × 浅色/深色模式,由 zustand theme store 持久化,data-theme-style + data-theme-mode + data-theme-visual 注入 html 根;新增节点应使用 ThemeToken CSS 变量与通用 t8-* 样式,避免逐节点硬编码主题。", "templateSystem": { "schema": "t8-theme-template", "version": 2, "defaultPath": "按平台由 backend/src/config.js 计算:Windows D:\\zhenzhen\\theme-templates,macOS/Linux ~/zhenzhen/theme-templates", "settingsKey": "themeTemplatePath", "backendRoute": "/api/themes/templates", "editable": true, "importExport": true, "deleteCustomOnly": true, "tokenFiles": [ "src/theme/types.ts", "src/theme/defaultTemplates.ts", "src/theme/applyTheme.ts", "src/theme/validateTheme.ts" ], "designContract": [ "所有主题必须提供 light/dark 两套 ThemeTokens,禁止只改色不校验明暗可读性", "新增 UI 优先使用 --t8-* / --theme-* CSS 变量和 .t8-themed-* 规范类,节点外壳交给 nodeFrame 自动适配", "端口、MiniMap、控制条、顶部栏、侧边栏、GroupBox、弹窗、资源库等全局组件必须跟随模板视觉,不允许单独只适配某个节点", "小型纯图标按钮必须使用 t8-mini-icon-button 或等价固定尺寸类,不能直接复用大号胶囊 t8-btn/px-btn,否则 OP、像素糖果等强风格主题会把按钮撑大变形", "本地保存、资源库、主题模板等默认路径必须由 backend/src/config.js 统一按平台计算,前端不得再次硬编码 D:\\zhenzhen;非 Windows 旧默认值由 settings 路由迁移,用户自定义路径不得覆盖", "官方主题浅色模式必须检查并覆盖老节点内部暗色工具类,如 text-white/*、bg-white/*、border-white/*、cyan/violet 标签和状态色,避免只改外壳导致字段、参数或实际发送文字不可读", "原生 select 的弹出层不会完全继承节点外壳样式;theme-core.css 必须提供基于 --t8-* 的基础 option 兜底,官方主题必须显式覆盖 select、.t8-select 以及 select option / option:checked 的背景、文字和 color-scheme,尤其浅色模式不能依赖旧节点 option.bg-zinc-900 或 text-white。", "默认科技风浅色模式同样必须保留 legacy node adapter;新增节点若使用 text-white/bg-zinc/bg-white 等暗色工具类或 inline 深色背景,必须同步接入主题变量或在 adapter 中兜底,避免经典白天模式残留黑卡片", "主题风格化元素使用 visuals.style / iconPack / canvasPattern / nodeFrame / headerMark 表达,避免把某个 IP 或图案写死在业务组件里", "自定义模板导入时必须通过 validateTheme/后端 normalizeTemplate,过滤未知枚举、过长字段和非法音乐 URL", "ThemeMusicToggle 与 ReactFlow Controls 必须同置于 .t8-control-rail,由全局变量统一定位和堆叠;主题 CSS 只能覆盖尺寸、颜色和视觉样式,不得分别硬编码 left/top/bottom 造成喇叭与缩放条漂移", "ReactFlow Controls 必须继承 .t8-canvas-shell 的 --t8-flow-controls-* 变量,主题只覆盖变量,不得让内置 controls 回退为白底白字或脱离 .t8-control-rail;新增主题必须同时检查音乐按钮、控制条和连线导航 HUD", "拖线中 Space 连线导航模式属于全局主题反馈:HUD、画布边缘脉冲、Controls 色值都必须跟随 --t8-flow-controls-accent,禁止在单主题里硬编码固定 cyan / white", "画布背景水印必须放在 .t8-canvas-shell::before/::after 背景层,z-index:0 且 pointer-events:none;ReactFlow 节点、边、浮层和 GroupBox 内容必须盖住水印,不能让装饰穿透到素材预览或画板内容上方", "强风格官方主题可为 light/dark 分别提供水印资产;若深色水印包含黑底终端、警告面板或厚重贴片,浅色模式必须改用透明底线稿 / 印章 / HUD 版本,避免浅色画布出现突兀深色块", "框选/节点右键菜单、空白右键快速添加菜单、拖线候选菜单和选中节点右上角 RUN/关闭浮动条都属于全局主题控件,必须使用 t8-context-menu / t8-node-action-bar 语义类和 visuals.style 作为视觉判断来源,禁止仅按 legacyStyle=像素/科技分支导致 OP、火影、EVA 等主题残留白底或绿色按钮", "全局菜单新增动作时必须检查 light/dark 与十二套官方主题的可读性;小图标和菜单图标仍需固定尺寸,避免 OP/像素风胶囊按钮把资源库、图像对比、批量下载等入口撑大", "主题动效必须接入画布 busy/reduced 状态:当 html[data-t8-edge-motion='reduced']、.t8-viewport-moving、.t8-node-dragging 或 prefers-reduced-motion 生效时,必须关闭无限边动画、filter、drop-shadow、粒子、运动球与 SVG animateMotion", "新增强风格主题必须做大画布性能验收:至少 100 个节点、36 条连线、拖动画布、拖动节点、MiniMap 与 Controls 可见场景;不得让装饰层、背景水印、连线动效或媒体预加载造成明显卡顿", "主题背景、水印和地图纹理必须优先静态化、轻量化和低成本绘制;禁止对全画布或所有边/节点持续应用高成本 backdrop-filter、blur、drop-shadow、mix-blend-mode 动画", "节点 NodeID 徽标属于 ReactFlow 节点外层通用浮层,必须使用 .t8-node-serial-badge 全局样式;位置必须由 useNodeSerialBadgeAnchor() 测量真实可见节点卡片右上角并写入 --t8-node-serial-anchor-left/top,主题只能覆盖 --t8-node-serial-offset-x/y,禁止按标题图标宽度硬编码 left/top 或直接依赖 ReactFlow 外层宽度,避免不同节点、不同主题、长标题和 ResizeObserver 测量差异导致角标遮挡或漂离节点。" ], "music": { "defaultMuted": true, "toggleComponent": "src/components/ThemeMusicToggle.tsx", "sources": [ "synth", "url", "upload" ], "uploadLimitMB": 20, "assetDir": "src/assets/theme-music", "builtInTracks": { "tech-default": "classic-one-summer-day.mp3", "pixel-candy": "pixel-theme-of-sss.mp3", "op-style": "op-battle-scars.mp3", "rh-style": "rh-tide.mp3", "rh-hidden": "rh-hidden-saya.mp3", "naruto-style": "naruto-shinsei-gyakuten.mp3", "eva-style": "eva-decisive-battle.mp3", "yyh-style": "yyh-unbalanced-kiss-piano.mp3", "yyh-hidden": "yyh-hidden-tonight.mp3", "slamdunk-style": "slamdunk-kimi-ga-suki.mp3", "soccer-hero-style": "soccer-tsubasa-burning-hero.mid", "dragon-ball-style": "dragonball-makafushigi-adventure.mp3", "dragon-ball-shenron-hidden": "dragonball-shenron-cha-la-head-cha-la.mp3", "saint-seiya-style": "saint-seiya-pegasus-fantasy.mp3", "saint-seiya-hades-hidden": "saint-seiya-hades-last-holy-war.mp3" }, "rule": "主题音乐默认静音,通常只在用户主动点击播放按钮后播放;RH 鸭鸭隐藏模式会自动切换 rh-hidden-saya.mp3,幽游白书肖像大师隐藏模式会自动切换 yyh-hidden-tonight.mp3,七龙珠神龙隐藏模式会自动切换 dragonball-shenron-cha-la-head-cha-la.mp3,圣斗士冥界篇会切换到 saint-seiya-hades-last-holy-war.mp3。模板编辑器支持上传替换,导出模板可携带 data:audio/*。" } }, "styles": { "tech": { "label": "科技风", "description": "玻璃拟态、细边框、冷色发光、circuit 画布纹理,内置默认音乐 One Summer's Day;v1.7.1 起科技风浅色模式内置 legacy node adapter,统一修正旧节点暗色工具类残留", "default": false }, "pixel": { "label": "像素糖果风", "description": "Pindou Studio 风格:奶油底 + 2px 黑描边 + 糖果色块 + 大圆角胶囊 + 硬阴影 (neo-brutalism)(v1.2.0 起为新用户默认主题,搭配 light 模式;像素风下全局禁用 backdrop-filter 避免字模糊;内置默认音乐 Theme Of SSS)", "default": true, "palette": { "bg": "#FAF3E7", "surface": "#FFFFFF", "muted": "#F1E8D5", "ink": "#1A1410", "accents": { "mint": "#A8E6C9", "mintDeep": "#4ECDC4", "pink": "#FFB5C5", "pinkDeep": "#FF89A7", "yellow": "#FFE08A", "violet": "#C7B8F0", "peach": "#FFCBA4", "sky": "#B8DCEC" } }, "primaryAccent": "mint", "radius": { "pill": 9999, "card": 16 }, "borderWidth": 2, "shadow": { "hard": "3px 3px 0 #1A1410", "press": "1px 1px 0 #1A1410" }, "fonts": [ "M PLUS Rounded 1c", "DotGothic16" ] }, "op": { "label": "OP风格", "description": "One Piece 航海冒险视觉模板:海图网格、悬赏令节点框、草帽半透明水印、红蓝金配色、OP iconPack、wanted nodeFrame;明暗模式均需保证正文不描边且可读。", "default": false, "visuals": { "style": "op", "iconPack": "op", "canvasPattern": "map", "nodeFrame": "wanted", "headerMark": "ONE PIECE" }, "music": "op-battle-scars.mp3" }, "rh": { "label": "RH风格", "description": "RunningHub 亲和视觉模板:黑绿高对比、荧光绿运行态、无边框卡片、云工作流网格、RUNNING MAP 小地图与 RH 工作台顶栏;明暗模式均需保持文字高对比。", "default": false, "visuals": { "style": "rh", "iconPack": "default", "canvasPattern": "hub", "nodeFrame": "hub-card", "headerMark": "RH" }, "music": "rh-tide.mp3;隐藏模式自动切换 rh-hidden-saya.mp3 并解除静音播放" }, "naruto": { "label": "火影忍者风格", "description": "热血忍者视觉模板:木叶护额品牌、卷轴节点卡片、火焰查克拉按钮、斜切控件、chakra 画布纹理与忍术阵水印;不使用胶囊风格,明暗模式均需保持节点长文本可读。", "default": false, "visuals": { "style": "naruto", "iconPack": "naruto", "canvasPattern": "chakra", "nodeFrame": "shinobi-scroll", "headerMark": "KONOHA" }, "music": "naruto-shinsei-gyakuten.mp3" }, "eva": { "label": "EVA风格", "description": "新世纪福音战士指挥所视觉模板:初号机紫、荧光同步绿、警戒橙红、MAGI 雷达、AT Field 几何纹理和装甲面板;MiniMap、SHIFT 剪线和主题音乐均需有独立识别。", "default": false, "visuals": { "style": "eva", "iconPack": "eva", "canvasPattern": "eva-grid", "nodeFrame": "eva-panel", "headerMark": "EVA" }, "music": "eva-decisive-battle.mp3" }, "yyh": { "label": "幽游白书风格", "description": "幽游白书灵界侦探视觉模板:暗紫青绿终端、灵丸能量、霓虹灵界地图、战斗卡片、REI MAP 小地图与灵界符号水印;浅色/深色都要保证工具属性、长文本、素材预览和全局菜单可读。", "default": false, "visuals": { "style": "yyh", "iconPack": "yyh", "canvasPattern": "spirit-map", "nodeFrame": "spirit-case", "headerMark": "REI GUN" }, "music": "yyh-unbalanced-kiss-piano.mp3;肖像大师隐藏模式自动切换 yyh-hidden-tonight.mp3 并解除静音播放" }, "slamdunk": { "label": "灌篮高手风格", "description": "灌篮高手热血篮球馆视觉模板:原创木地板球场、红黑球衣、计分牌节点、传球弧线、半场战术 MiniMap、篮球/哨子 SHIFT 剪线与战术板菜单;不使用官方角色图、漫画截图或队徽原图。", "default": false, "visuals": { "style": "slamdunk", "iconPack": "slamdunk", "canvasPattern": "court", "nodeFrame": "scoreboard-card", "headerMark": "BUZZER BEATER" }, "music": "slamdunk-kimi-ga-suki.mp3;默认静音,用户可在主题模板中上传替换授权音频" }, "soccerHero": { "label": "足球小将风格", "description": "足球热血绿茵视觉模板:原创整场球场、蓝白 10 号球衣、居中比分牌节点、传球轨迹、足球精灵、全场 MiniMap 与足球 SHIFT 剪线;不使用官方角色图、漫画截图或队徽原图。", "default": false, "visuals": { "style": "soccer-hero", "iconPack": "soccer", "canvasPattern": "pitch", "nodeFrame": "match-card", "headerMark": "GOLDEN GOAL" }, "music": "soccer-tsubasa-burning-hero.mid;MIDI 由 ThemeMusicToggle WebAudio 解析播放,golden-goal 仅作为兜底 preset;默认静音" }, "dragonBall": { "label": "七龙珠风格", "description": "七龙珠热血冒险视觉模板:原创胶囊公司设备面板、神龙雷达画布、七颗龙珠徽章、气功波连线、圆形雷达 MiniMap 与四星球 SHIFT 剪线;不使用官方角色图、动画截图或 Logo。", "default": false, "visuals": { "style": "dragon-ball", "iconPack": "dragon-ball", "canvasPattern": "dragon-radar", "nodeFrame": "capsule-card", "headerMark": "DRAGON RADAR" }, "music": "普通模式使用 dragonball-makafushigi-adventure.mp3;神龙隐藏模式使用 dragonball-shenron-cha-la-head-cha-la.mp3;ThemeMusicToggle 以 URL 音频播放,ki-burst / shenron-aura 仅作为合成兜底 preset;默认静音,用户可在主题模板中上传或填写授权音频 URL 替换,公开分发前确认音频授权边界" }, "saintSeiya": { "label": "圣斗士风格", "description": "圣斗士十二宫视觉模板:原创圣域星图、黄金圣衣宝箱、星座能量连线、圣域 / 冥界篇双模式、战斗升级与 12 黄金圣衣收集;不使用官方角色图、动画截图或 Logo。", "default": false, "visuals": { "style": "saint-seiya", "iconPack": "saint-seiya", "canvasPattern": "sanctuary-zodiac", "nodeFrame": "cloth-box-card", "headerMark": "SANCTUARY" }, "music": "普通模式使用 saint-seiya-pegasus-fantasy.mp3;集齐 12 黄金圣衣后解锁冥界篇并切换 saint-seiya-hades-last-holy-war.mp3;pegasus-cosmos / hades-eclipse 仅作为合成兜底 preset;默认静音,用户可在主题模板中上传或填写授权音频 URL 替换" }, "tetris": { "label": "俄罗斯方块主题", "description": "Tetris Canvas 强视觉模板:浅色奶白彩块、深色街机霓虹、方块拼接节点、积木网格画布、方块化 MiniMap、scoped 方块连线,以及右上角默认展开且可折叠的 10x20 可玩俄罗斯方块小游戏。", "default": false, "visuals": { "style": "tetris", "iconPack": "tetromino-well", "canvasPattern": "tetris-stack", "nodeFrame": "arcade-cabinet-card", "headerMark": "TETRIS STACK" }, "music": "Block Drop Sprint 合成循环;block-drop 作为原创 WebAudio preset,默认静音,用户可在主题模板中上传或填写授权音频 URL 替换" } }, "defaultStyle": "pixel", "defaultMode": "light", "modes": [ "dark", "light" ], "persistKey": "t8-canvas-theme", "htmlAttrs": [ "data-theme-style", "data-theme-mode" ] }, "repository": "https://github.com/T8mars/T8-penguin-canvas", "aiWatermarkRuntime": { "upstream": "https://github.com/wiltodelta/remove-ai-watermarks", "upstreamVersion": "0.11.0", "upstreamCommit": "c8bc4b7", "upstreamLicense": "Apache-2.0", "nodeType": "remove-ai-watermark", "category": "auxiliary", "fullInstall": "remove-ai-watermarks[gpu,detect,trustmark,lama,esrgan]", "runtimeResolutionOrder": [ "T8_REMOVE_AI_WATERMARKS_RUNTIME sidecar root", "打包后首次运行解压缓存 %APPDATA%/t8-penguin-canvas/runtime-cache/remove-ai-watermarks", "Electron resources/tools/remove-ai-watermarks", "T8_REMOVE_AI_WATERMARKS_BIN executable", "T8_REMOVE_AI_WATERMARKS_SRC source clone", "E:/PenguinPravite/_external/remove-ai-watermarks development clone", "PATH remove-ai-watermarks(.exe/.cmd)" ], "electronPackaging": { "sourceSlot": "tools/remove-ai-watermarks-runtime", "archiveSlot": "tools/runtime-archives/remove-ai-watermarks-runtime.zip", "packagedSlot": "resources/tools/runtime-archives/remove-ai-watermarks-runtime.zip", "runtimeCacheSlot": "%APPDATA%/t8-penguin-canvas/runtime-cache/remove-ai-watermarks", "trackedPolicy": "只提交 README 占位与规范,Python/Torch/模型文件继续由 .gitignore 排除", "strictEnv": "T8_REQUIRE_AI_WATERMARK_RUNTIME=1", "archiveStrictEnv": "T8_REQUIRE_RUNTIME_ARCHIVES=1", "acceptedEntrypoints": [ "remove-ai-watermarks.exe", "remove-ai-watermarks.cmd", "Scripts/remove-ai-watermarks.exe", "python.exe", "python/python.exe", ".venv/Scripts/python.exe", "bin/python" ] }, "upstreamUpdateRule": [ "不要复制上游算法源码到 T8;通过 CLI/Python 包能力探测消费上游。", "上游新增 mark 时优先依赖 watermark_registry.mark_keys() 动态暴露,前端只补充显示文案或兜底。", "上游新增 mode/options 时扩展 runner 参数映射、节点 UI 和 tests/aiWatermarkRunner.test.ts,不破坏旧画布数据字段。", "0.11.0 当前可见 mark 兜底为 auto/gemini/doubao/jimeng/samsung;Samsung Galaxy AI 标记由上游 registry 动态暴露时优先使用动态结果。", "0.10+ invisible 默认管线为 --pipeline controlnet;旧 default 在新版上游中等价/迁移为 --pipeline sdxl,T8 新节点默认 controlnet,旧画布 ctrlregen 继续迁移为 controlnet。", "0.11.0 T8 透出 --model、--guidance-scale、--upscaler lanczos/esrgan、--min-resolution、--controlnet-scale、--unsharp、--adaptive-polish/--no-adaptive-polish;--auto 已退役,不再作为主 UI 控件发送。", "上游 0.11.0 不再提供 face-restore extra;T8 不再展示 GFPGAN 脸部修复主控件。runner 仅对旧 0.8.9 runtime 继续版本感知兼容 --restore-faces,对 0.8.7 runtime 兼容 --protect-text / --protect-faces。", "新增 all 模式调用上游 full pipeline:可见标记 + 隐形水印 + 元数据;缺 GPU extra 时按上游设计明确失败,避免用户误以为 SynthID 已处理。", "未填写 strength 时由上游按 C2PA/SynthID 来源自适应 OpenAI/Google/未知强度,T8 UI 默认留空,不再诱导用户固定 0.30。", "媒体解析补齐 0.11 metadata 容器:HEIC / HEIF / JXL 归类为 image,MKA / OGA / Opus 归类为 audio,metadata-check / metadata-remove 可沿用同一素材解析入口。", "每次同步上游后必须重新跑 status/capability、代表性 process smoke、node --test tests/*.test.ts、npm run build 和 Electron 打包后置检查。" ] }, "parseHubRuntime": { "upstream": "https://github.com/z-mio/parsehub", "upstreamVersion": "2.0.24", "upstreamLicense": "MIT", "nodeType": "aggregate-parser", "category": "toolbox", "supportedPlatforms": [ "Twitter / X", "Instagram", "YouTube", "Facebook", "Threads", "Bilibili", "抖音", "TikTok", "微博", "小红书", "贴吧", "微信公众号", "快手", "酷安", "皮皮虾", "最右", "小黑盒" ], "runtimeResolutionOrder": [ "T8_PARSEHUB_PYTHON + T8_PARSEHUB_LIB_PATHS", "打包后首次运行解压缓存 %APPDATA%/t8-penguin-canvas/runtime-cache/remove-ai-watermarks + runtime-cache/parsehub-pythonlibs", "Electron resources/tools/parsehub-runtime", "Electron resources/tools/remove-ai-watermarks/python/python.exe + resources/tools/parsehub-pythonlibs", "开发环境 tools/remove-ai-watermarks-runtime/python/python.exe + tools/parsehub-pythonlibs", "系统 python / py -3.12 + 本地 ParseHub/src" ], "electronPackaging": { "bridgeSlot": "tools/parsehub-bridge", "dependencySlot": "tools/parsehub-pythonlibs", "archiveSlot": "tools/runtime-archives/parsehub-pythonlibs.zip", "packagedBridge": "resources/tools/parsehub-bridge", "packagedDependencies": "resources/tools/runtime-archives/parsehub-pythonlibs.zip", "runtimeCacheSlot": "%APPDATA%/t8-penguin-canvas/runtime-cache/parsehub-pythonlibs", "strictEnv": "T8_REQUIRE_PARSEHUB_RUNTIME=1", "archiveStrictEnv": "T8_REQUIRE_RUNTIME_ARCHIVES=1", "refreshCommand": "tools\\remove-ai-watermarks-runtime\\python\\python.exe -m pip install --upgrade --target tools\\parsehub-pythonlibs .\\ParseHub", "archiveCommand": "npm run prepack:runtimes" }, "complianceRule": [ "前端节点必须保留合规确认复选框和免责提醒;后端 /api/parsehub/resolve 必须要求 acceptedCompliance=true。", "聚合解析默认使用 download 模式保存到本地 output/parsehub;parse 只解析远端地址作为高级/调试模式保留。", "抖音等平台返回的远端 CDN 地址可能带防盗链、Cookie 或临时签名,浏览器直接打开 403 不一定代表解析错误;面向普通用户应优先使用本地输出 URL。", "Cookie / 代理为可选高级项,不写入日志,不自动保存到全局设置。" ], "upstreamUpdateRule": [ "ParseHub/ 是本地外部上游 clone,默认不 stage / commit / push。", "上游更新后先同步 ParseHub clone,再重新执行 refreshCommand 刷新 tools/parsehub-pythonlibs。", "若 ParseHub 返回结构变化,优先只改 tools/parsehub-bridge/parsehub_bridge.py 与 backend/src/utils/parseHubBridge.js 的归一化层,不改画布节点协议。", "每次更新至少跑 bridge status 自检、node --test tests/aggregateParser.test.ts、npm run type-check、npm run build;正式发布还需 dist:release 后置检查通过。" ] }, "achievementSystemRoadmap": { "status": "planned", "reference": "roadmap.md::主题成就 / 勋章 / 加密影片解锁系统路线(规划中,2026-06-04)", "scope": "十二套系统主题分别累计有效使用时长、隐藏模式探索、节点运行、资源库沉淀或主题小游戏摘要事件,并解锁主题勋章与影片馆内容。", "themeTracks": [ "tech", "pixel", "op", "rh", "naruto", "eva", "yyh", "slamdunk", "soccer-hero", "dragon-ball", "saint-seiya" ], "dataModel": { "localFile": "data/achievements.json", "manifest": "src/data/achievementManifest.ts", "profile": "本机匿名 profileId,仅本地使用;默认不接账号云同步。", "themeStatsFields": [ "activeSeconds", "lastActiveAt", "sessions", "nodesCreated", "runsSucceeded", "resourcesSaved", "hiddenModeActivations" ], "unlockState": [ "unlockedAchievements", "claimedMedals", "unlockedFilms", "preferences" ] }, "activeTimeRule": [ "只在应用窗口前台、document visible、最近 90 秒有 pointer/key/drag/wheel/canvas 操作时累计有效时长。", "心跳建议 15-30 秒合并上报,单次最多累计 30 秒,避免睡眠或后台一次补刷。", "切换主题时先结算旧 themeTrack,再进入新主题。" ], "hiddenModeHooks": [ "RH 主题 UploadNode 鸭鸭解码隐藏模式:长按 RUN 开启,解码成功后记录 hidden_mode.used。", "幽游白书主题肖像大师隐藏模式:长按 RUN 开启,成功输出隐藏肖像 prompt 后记录 hidden_mode.used。", "圣斗士主题集齐 12 黄金圣衣后开启冥界篇隐藏模式:切换进入冥界篇记录 hidden_mode.used。", "成就事件只记录类型、主题、计数和节点类型,不记录用户链接、Cookie、完整 prompt 或隐私内容。" ], "filmUnlockPlan": { "sourcePolicy": "影片原始文件放 private/achievement-films-src/ 并保持 ignored,不进入公开仓库。", "encryptedSlot": "tools/achievement-media/films/*.t8film + manifest.json", "packScript": "scripts/pack-achievement-films.cjs", "encryption": "AES-256-GCM,manifest 记录 filmId、主题、解锁规则、sha256、mime、时长与封面。", "playback": "解锁后后端解密到用户数据目录临时缓存,并复用 Range 播放逻辑供 video 标签拖动进度条。", "strictPackagingEnv": "T8_REQUIRE_ACHIEVEMENT_MEDIA=1" }, "retentionIdeas": [ "今日主题任务:每个主题给 1-3 个轻任务,只奖励成就经验,不阻塞画布。", "周常创作护照:一周内在 3 个不同主题各完成一次创作,解锁跨主题勋章或影片碎片。", "影片碎片机制:高价值影片用主题时长 + 特色成就 + 连续使用组合解锁,降低纯挂机收益。", "本地创作回顾:用户打开成就页时生成周报,展示主题时长、产出数量、常用节点和已获勋章。" ], "acceptance": [ "十二套主题分别累计时长,后台/无焦点/无交互不刷时长。", "每个主题至少 5 个时长成就、3 个特色成就、1 个主题大师勋章。", "未解锁影片无法播放;解锁后可播放、拖动进度条、继续播放和清缓存。", "加密影片原始素材不得进入 git、build 明文目录或 Electron resources。", "自动更新到带新影片的版本后,旧成就数据仍能解锁并播放新资源。" ] }, "totalNodes": 54, "phases": { "phase0": { "label": "基础设施", "status": "complete", "items": [ "Vite + React 19 + TS", "Tailwind", "前端 11422 / 后端 18766 代理", "Express 后端骨架" ] }, "phase1": { "label": "画布主体", "status": "complete", "items": [ "xyflow 画布", "Sidebar 节点添加", "画布 CRUD", "三套 API Key 设置" ] }, "phase2": { "label": "核心生成节点", "status": "complete", "items": [ "贞贞工坊 / LLM 代理", "图像/视频/音频/LLM 节点" ] }, "phase3": { "label": "异步任务节点", "status": "complete", "items": [ "视频轮询", "Suno 三模式", "RunningHub 工作流", "sharp 工具箱" ] }, "phase4": { "label": "全部 24 节点上线", "status": "complete", "items": [ "辅助 / 数据组织 / 特殊 / 画板 / 浏览器 / 抽帧" ] }, "phase5": { "label": "画布交互", "status": "complete", "items": [ "Undo/Redo", "复制/粘贴/删除", "导入导出 JSON", "工作流模板", "CanvasToolbar" ] }, "phase6": { "label": "批量执行 + 对齐辅助", "status": "complete", "items": [ "运行总线 zustand store", "useRunTrigger 节点接入", "拓扑排序串行批量运行", "snap-to-grid + 智能对齐辅助线" ] }, "phase7": { "label": "侧边栏合并", "status": "complete", "items": [ "CanvasManager 收纳到 Sidebar 顶部可折叠区", "移除独立画布管理列", "三栏→两栏布局" ] }, "phase8": { "label": "像素糖果风主题", "status": "complete", "items": [ "theme store 扩展 themeStyle(tech|pixel) 双轨", "theme-pixel.css 全套 CSS 变量 + 工具类(px-card/px-btn/px-chip/px-input/px-row/px-modal-mask)", "Sidebar / CanvasToolbar / ApiSettings 框架级像素化", "24 节点零侵入 CSS 兜底层(react-flow__node 全局覆盖)", "ReactFlow 背景点 / 边线 / 对齐辅助线 像素化校色", "顶部 Sparkles/Cpu 切换按钮 + localStorage 持久化" ] }, "phase9": { "label": "侧边栏分类重整", "status": "complete", "items": [ "图像节点 label 从 'ZhenzhenMagic' 改为 '图像生成' 避免误解", "runninghub + rh-config 从 core 抽出,新建独立 'RH' 分类", "NodeCategory 类型增加 'rh' 枚举值", "ImageNode 模型选择从 select 重构为 3 TAB 胶囊切换(GPT2 / 香蕉2 / 香蕉Pro),对应主项目 gpt-image-2-web Tab 0/1/2" ] }, "phase10": { "label": "上传节点 + 节点间联动(连接类型校验)", "status": "complete", "items": [ "新增 UploadNode 上传素材节点(图像/视频/音频三合一,动态输出端口色)", "创建端口语义注册表 src/config/portTypes.ts(7 种 PortType + 25 节点 inputs/outputs 声明)", "ReactFlow 接入 isValidConnection ⏱ 预览阶段拦截不兼容连接(如文本不能连到文本、音频不能连到图像节点的 image 入口)", "连线按上游输出类型自动染色(文本=sky / 图像=amber / 视频=rose / 音频=violet / metadata=cyan / config=indigo / any=slate)", "upload 节点 outputs 动态依赖 data.uploadType,未选择类型时不可连出", "relay 中继节点以 'any' 透传,可接任何输入 / 输出任何类型" ] }, "phase11": { "label": "FAL 渠道接入(gpt-image-2-fal + nano-banana-pro-fal)", "status": "complete", "items": [ "严格对齐 gpt-image-2-web 主项目 FAL Queue API 接入规范(SKILL.md §FAL模型渠道接入规范)", "models.ts 新增 FAL_REGISTRY/FalParamKind/isFalModel + gpt-fal/nbpro-fal 两类参数体", "后端新增独立路由 POST /api/proxy/image/fal/submit + GET /api/proxy/image/fal/query(零破坏,不混入 /image/submit)", "baseUrl/fal 前缀代理 queue.fal.run,response_url 域名一次性修复", "submit 同步直返 images[](saveRemoteImage 转存),异步返 requestId+responseUrl+endpoint", "query 轮询规范:HTTP 非200时 body.status=IN_QUEUE/IN_PROGRESS 视为 pending,真错误才抛", "gpt-fal 自定义尺寸 16 倍数对齐(snap16),image_size 7 档枚举 + custom", "nbpro-fal aspect_ratio×resolution(1K/2K/4K) + safety_tolerance(1严-6松) + enable_web_search + system_prompt + seed + image_mode(image_url/base64)", "ImageNode FAL UI 蓝色边框面板 + FAL 专属 state(falXxx/nbXxx)与原标准模型(aspectRatio/sizeLevel)完全隔离,maxRefs 动态切换(gpt-fal=5 / nbpro-fal=8)", "FAL 子模型保持原 TAB 分类(gpt-image-2-fal 在 GPT2 TAB,nano-banana-pro-fal 在 香蕉Pro TAB),对齐主项目'不新增 Tab'原则", "前端轮询 600×3s = 30min 上限" ] }, "phase12": { "label": "框选 + 右键组执行", "status": "complete", "items": [ "ReactFlow selectionKeyCode=['Control','Meta'] + selectionMode=Partial ⏱ 左键拖动仍为平移画布,仅 Ctrl(或 Cmd) + 左键拖动进入框选模式", "multiSelectionKeyCode=['Control','Meta','Shift'] 点击节点时叠加多选", "onSelectionContextMenu / onNodeContextMenu / onPaneContextMenu 统一调度右键菜单状态 contextMenu", "右键菜单项:组执行(N) / 复制 / 快速复制 / 删除;节点上右键未选中则自动单选此节点", "抽取 runNodesByOrder(subNodes, subEdges) 通用引擎:仅保留子集内部的边作为依赖,拓扑排序后串行调 runBus(复用 handleRunAll 逻辑)", "对齐主项目 PenguinPravite/components/PebblingCanvas/index.tsx 的 createGroup/executeGroup 设计思路(selection 临时组 + 可执行节点顺序执行)", "帮助弹窗提示:左键拖动 = 平移 / Ctrl+左键拖动 = 框选 / 右键点击 = 弹菜单" ] }, "phase13": { "label": "节点组容器(GroupBox)", "status": "complete", "items": [ "新增 nodeTypes.groupBox 独立节点类型: 半透明色块 + 圆角边框 + zIndex=-1 在普通节点之下", "新增 stores/groupBus.ts: requestExecute / requestDelete 请求总线解耦 GroupBoxNode 与 Canvas", "新增 components/nodes/GroupBoxNode.tsx: 双主题适配(科技风/像素糖果风) + 顶部标题栏 + 颜色选择器(12色) + 双击改名 + 右上角▶执行/X解散按钮", "默认名字: 'My favourite girl is Go Younjung'", "右键菜单新增 「打组」 项: 计算 bounding box 包裹 + 30px padding + 40px 标题高,随机选一个颜色,排除 groupBox 自身防止嵌套", "拖动联动: Canvas.onNodeDrag 拦截 type==='groupBox' 计算 dx/dy 同步偏移 memberIds 节点,实现「拖组带走所有成员」", "组执行: 复用 handleRunGroup(memberIds),仅保留成员子集内部边作为依赖,拓扑排序后串行调 runBus", "设计思路对齐 PenguinPravite/components/PebblingCanvas/NodeGroupBox.tsx (GROUP_COLORS 调色板 / headerHeight=40 / 双击改名)" ] }, "phase14": { "label": "Midjourney(Comfly) 渠道接入", "status": "complete", "items": [ "严格对齐 gpt-image-2-web/index.html runMJ(L4437-4716) 与 uploadMJImage(L4407)", "后端 proxy.js 新增三条独立路由:POST /api/proxy/mj/imagine(speed_map: turbo/fast/relax → mj-turbo/mj-fast/mj-relax)、GET /api/proxy/mj/task/:id?speed= (URL 中 ai.comfly.chat 重写为 ai.t8star.cn)、POST /api/proxy/mj/upload(sref/oref 参考图上传换 URL)", "providers/models.ts 新增 paramKind='mj' + IMAGE_MODELS 第 4 项 midjourney + MJ_VERSIONS(11 项,默认 v 8.1) + MJ_RATIOS(7 比例,默认 1:1) + MJ_SPEEDS(turbo/fast/relax) + MJ_SVS(0/1/2/3,sv≠'1' 时才追加 --sv) + isMjModel()", "services/generation.ts 新增 buildMjPrompt(prompt 拼装规则: --{model} --ar {ar} [--no X] [--c N] [--s N] [--iw N] [--sw N] [--cw N] [--sv N] [--sref URL] [--oref URL]) + submitMjImagine + queryMjTask + uploadMjImage + fileToBase64Pure(去 dataURL 前缀)", "payload 严格对齐 runMJ: base64Array+instanceId:''+modes:[]+notifyHook:''+prompt+remix:true+state:''+ar+no+c+s+iw+tile:false+r:null+video:false+sw+cw+sv+seed", "响应判定: code===1 成功、其它 code 视为未就绪 continue;status==='FAILURE' 抛错;status==='SUCCESS' 取 image_url(主图) + image_urls(JSON string 解析为 [{url}] 数组)", "ImageNode.tsx 检测 paramKind==='mj' 时切换为 MJ 专用配置面板:版本/比例/速度/--c/--s/--iw/--sw/--sv/seed/--no/maxPoll/pollInt + sref(2 张)/oref(2 张) 上传组,handleGenerate 增加 MJ 分支(主图参考走 base64Array,sref/oref 走 uploadMjImage 换 URL),保留原 GPT2/香虉2/香蕉Pro/FAL TAB 与原模型路径零破坏", "前端轮询 maxPoll=300×3s = 15min 上限(可配置 10~2000 与 1~30s)" ] }, "phase15": { "label": "跨节点素材拖拽(Ctrl+拖 图/视/音/文)", "status": "complete", "items": [ "stores/dragMaterial.ts 新建 zustand store + MaterialKind/MaterialPayload/MATERIAL_DROP_EVENT(CustomEvent 名) + start/move/end 三状态机", "hooks/useMaterialDropTarget.ts 新建: 节点 target 注册 hook,返回 dropProps {data-drop-kinds, data-node-id} + isAccepting,按 MATERIAL_DROP_EVENT 下发 onDrop", "hooks/useMaterialDragSource.ts 新建: 素材 source 注册 hook(选用),主路径仅靠 data-drag-* 属性 + capture 拦截启动", "components/MaterialDragOverlay.tsx 新建: createPortal(document.body) 渲染跟随鼠标的幽灵缩略图; 全局监听 mousemove/mouseup 更新位置与探测 hover target; 拖拽期 body cursor=grabbing+user-select:none", "关键修复: ReactFlow v12 在 Pane 用 onPointerDownCapture 启动 userSelection,需在 document 原生 capture 阶段同时拦截 pointerdown / mousedown(pointerdown 先于 mousedown),仅拦 mousedown 难以赢得事件", "拦截策略: 仅 Ctrl/Meta + 左键 + 首个指针生效; 用 elementsFromPoint 穿透任何覆盖层查找 [data-drag-source]; 命中后 e.preventDefault()+e.stopPropagation()+e.stopImmediatePropagation() 阻止 Pane 启动选区; 未命中则放行,保留 Ctrl 画布/组空白处原有框选逻辑", "命中检测同步升级: mousemove 中也用 elementsFromPoint 穿透 SelectionPane 查找 [data-drop-kinds] target 节点", "全部 source 素材元素标记 data-drag-source / data-drag-kind / data-drag-url / data-drag-preview / data-drag-node-id: OutputNode/UploadNode/ImageNode/VideoNode/AudioNode/LLMNode/SeedanceNode 缩略图与播放器全覆盖", "节点 target 能力映射表: OutputNode 接收全部(image/video/audio/text); ImageNode接image→referenceImages,text→prompt; VideoNode接image→localRefImages,text→prompt; AudioNode接audio→localRefAudio,text→prompt; LLMNode接image→pickedFiles,text→prompt; SeedanceNode接image/video/audio/text 全支持", "本地拖入字段: d.localRefImages(VideoNode/SeedanceNode) / d.localRefVideos(SeedanceNode) / d.localRefAudios(SeedanceNode) / d.localRefAudio(AudioNode); collectUpstream 合并去重上游与本地素材参与生成", "视觉反馈: target 节点 isAccepting=true 时根 div border-emerald-400 + boxShadow 双层绿色光晕; 幽灵缩略图 accept=true 边框转为 #22c55e", "按下 ESC 取消拖拽", "零破坏: 未点中 data-drag-source 时原有 Ctrl 框选、Ctrl+Shift 多选、右键菜单、节点拖动、Handle 连线、双击编辑、runBus、GroupBox 拖动联动均保持原样" ] }, "phase16": { "label": "侧边栏节点暂时隐藏(13 个)", "status": "complete", "items": [ "NodeMeta 类型新增可选字段 hidden?: boolean,仅控制 UI 入口可见性,不影响 nodeTypes 注册与已存在画布加载渲染", "NODE_GROUPS 各分类 filter 补充 && !n.hidden 过滤隐藏节点", "Canvas.tsx 端口拖出后的候选选择器(candidateMetas) 首行补充 if (meta.hidden) return [] 过滤", "隐藏节点清单(13 个)——特殊节点 5: multi-angle-3d/panorama-720/penguin-portrait/portrait-metadata/storyboard-grid; 工具节点 6: drawing-board/browser/image-compare/frame-extractor/remove-bg/upscale; 辅助节点 2: edit/video-output", "历史可见节点清单记录:该段为 v1.0 隐藏节点阶段的快照;当前权威清单以 features.json categories 与 src/config/nodeRegistry.ts 为准。", "左侧侧边栏、右键画布空白区快添加(QUICK_NODES=input+core)、从 Handle 拖出后出现的能力匹配候选菜单三个入口均不再出现隐藏节点", "需要重新启用某个节点时,只需在 nodeRegistry.ts 对应行删除 hidden: true 即可,零代码改动" ] }, "phase17": { "label": "RelayNode 全字段透传修复(文本/图像/视频/音频)", "status": "complete", "items": [ "问题症状: UploadNode→RelayNode→OutputNode 链路中,上传视频/音频时 RelayNode 显示 '无数据透传' 且 OutputNode 完全无反应", "根因: 原版 RelayNode 仅透传 prompt/imageUrl/urls 三个字段,UploadNode 写入的 videoUrl/audioUrl 被中继节点完全忽略,下游 useNodesData 自然读不到", "字段对齐: UploadNode 按 uploadType 写入 imageUrl/videoUrl/audioUrl; OutputNode 通过 useNodeConnections+useNodesData 订阅上游 prompt/outputText/reply/text + imageUrl/imageUrls/urls/generatedImages + videoUrl + audioUrl", "修复 1 透传范围扩展: RelayNode 收集文本(outputText>reply>prompt>text 优先级,pushUnique 去重)/图像(imageUrl 单 + imageUrls/urls/generatedImages 数组合并)/视频(videoUrl 首个命中)/音频(audioUrl 首个命中) 四类素材,自身 data 同步写出 prompt/imageUrl/imageUrls/urls/videoUrl/audioUrl 让下游一视同仁", "修复 2 死循环防护(对齐 §22.2): upstreamSignature useMemo 拼接所有透传字段,useEffect deps=[upstreamSignature] 避免无 deps 导致 setState 风暴; update() 前做 cur/next JSON 深度比较,只有真变化才写回", "修复 3 零上游主动清理: upstreamIds.length===0 时主动 update 把 prompt/imageUrl/imageUrls/urls/videoUrl/audioUrl 全部置 undefined,避免断开上游后 RelayNode 残留旧素材误导下游", "UI 显示: 节点内增加 📝(文本)/🖼(图)/🎬(视频)/🎵(音频) 四类指示器,无任何素材时显示 '无数据透传'", "零破坏: nodeTypes 注册 / 端口配置 / Sidebar 入口 / 拖出候选 / GroupBox / runBus / 跨节点拖拽 全部保持原样" ] }, "phase18": { "label": "节点拖出候选菜单 中继节点置顶", "status": "complete", "items": [ "从任意节点 Handle 拖出后弹出的 '连接到…' / '从…输入' 候选菜单中,把 relay(中继) 节点永远排在首位", "实现: Canvas.tsx pickerCandidates useMemo 末尾追加 .sort(),仅针对 type==='relay' 的项返回 -1/+1,其余项保持原 NODE_REGISTRY 顺序(稳定排序)", "体验考量: 中继节点是跨距离连线 / 多上游合并 / 下游分发的高频中转点,置顶后一眼可见,减少滚动查找" ] }, "phase19": { "label": "LLM 多模态 image_url 预处理(修复上游图片透传报错)", "status": "complete", "items": [ "问题症状: LLMNode 上游连接上传素材节点后发送报 'get file data from base64:/files/input/up_xxx.png failed: failed to decode base64 data'(convert_request_failed)", "根因: UploadNode 写入的 imageUrl 是本地后端相对路径 /files/input/up_xxx.png,LLMNode 直接放进 image_url.url 透传给上游贞贞工坊 /v1/chat/completions,但上游服务器无法访问本项目本地静态,拿到路径后错误地试图当 base64 解码导致崩溃", "修复: 后端 proxy.js 新增 normalizeLlmMessageImages(messages),在 /llm 路由进入上游前扫描 messages中所有 content 数组里的 image_url.url, /files/* 统一转成 data:image/xxx;base64,xxx dataURL inline; data:/http(s):// 保留原值", "对齐: 严格复用已有的 refToBananaImage helper(line 140-155),思路与 gpt-image-2-web chat 多模态参考图预处理一致", "失败处理: 本地拉 buffer 失败时报 400 '本地图片读取失败: 路径' 明确错误,避免上游误导报错", "零破坏: content 为字符串的普通文本消息不动;外网 http(s) URL 参考图不动;原本就是 data: 的 dataURL 不动;LLMNode 前端代码零修改" ] }, "phase20": { "label": "图像轮询超时拒 120s → 3600s(GPT2 / nano-banana / nano-banana-pro 标准路径)", "status": "complete", "items": [ "问题症状: GPT2 复杂 prompt 或多参考图任务在上游实际还未返图时,前端被 60×2s=120s 提前中断报超时", "修复 1 前端 ImageNode.tsx '原有标准路径' 轮询: maxPoll 60 → 1800,interval 保持 2000ms,上限 1800×2s = 3600s = 60 分钟", "修复 2 后端 proxy.js pollImageTask 默认 maxRetries 60 → 1800,与前端一致,避免 /api/proxy/image 同步代理路径仍 120s 早退", "适用范围: 仅影响 '标准异步任务轮询'(/v1/images/tasks/{tid});MJ / FAL / Seedance / Suno 等独立路径仍使用各自原有超时不变", "零破坏: 任务 status=success/failed 一旦返回仍会立即出循环,不会造成 60 分钟空转;只是上限抬高,正常任务无任何变化" ] }, "phase21": { "label": "Shift+拖拽剪刀模式 黑色未选中 edge 命中丢失修复", "status": "complete", "items": [ "问题症状: 按住 Shift 变剩刀拖拽时,黑色(未选中) edge 无法被剪断,只有粉色(选中/hover) edge 能被剪断", "根因: 原实现仅在每次 mousemove 事件的 当前鼠标点 单点调用 document.elementsFromPoint;鼠标快速拖动时单次事件间距可达 ≥20px,而像素主题黑色 edge stroke 仅 2.5px,鼠标会 'pixel-skip' 完全跳过该 edge", "根因二: 选中/hover 后粉色变粗 且 EdgeLabelRenderer 剩刀按钮区域略大,才造成看似 '只能剪粉色' 的错觉", "修复 1 插值采样命中: onCutMove 里按 上一点 → 当前点 的线段每 4px 一个采样点调用 elementsFromPoint(上限 60 点),完美涵盖快速拖动间隔", "修复 2 视觉+命中双保险: body.cut-mode 下 .react-flow__edge-path 加宽到 3.5px(原 2.5px),.react-flow__edge-interaction 加宽到 36px(原 24px)", "零破坏: 正常状态 edge 视觉不变、剩刀高亮、轨迹 SVG、DeletableEdge 点击按钮、selected 粉色 均不受影响" ] }, "phase22": { "label": "LLM 节点 上游图片实时预览与取同源发送", "status": "complete", "items": [ "问题症状: LLM 节点 接收上游 image 后 节点内无预览图 用户看不到发送将带什么图", "修复 1: LLMNode 引入 useUpstreamMaterials(id) hook (与 ImageNode/SeedanceNode/RelayNode 同一套机制),订阅上游图片变化实时重渲染", "修复 2: 在 本地图片(多模态) 区上方新增 上游图片 · N 预览栏,静态 40×40 缩略图 + 左上角 ↑ 标记 + 左边绿边框,hover 提示来源节点 id + 完整 url", "修复 3: 取同源 将 collectUpstream 从原手动遍历 edges/nodes 改为走 upstreamMats.images/texts,让 用户预览到什么 = 发送时带上什么,面象双动", "增强覆盖面: 原仅读 imageUrl/image/url + images/imageUrls;现跟随 hook 多读 urls/generatedImages 两个字段,接收范围与 ImageNode 一致", "可拖拽: 预览缩略图与本地选图一样支持 Ctrl+拖出 到其他节点(data-drag-source/kind/url + beginMaterialDrag)", "零破坏: 本地选图(pickedFiles)、会话历史(history)、拖拽接受(handleDrop)、补位 prompt(localPrompt)、文本输入、调用错误出口 全部原状保留" ] }, "phase23": { "label": "API Key 设置眼睛预览修复 + 8 类分类独立 Key (gpt-image / nano-banana / mj / veo / sora2 / grok / seedance / suno)", "status": "complete", "items": [ "问题症状 1: 打开 API Key 设置弹窗点眼睛无论如何都看不到已存 Key 明文——原 input 受控于用户输入为空且后端只返回脱敏字段时永远呢呢看不到", "修复 1: 新增 GET /api/settings/raw 前端调用 (services/api.ts getRawSettings),点眼睛 且 input 为空 且 已存 同时成立时 拉一次明文填回 input;同时 useRef 缓存避免重复请求;眼睛拉出明文后不修改则不重复提交(revealed===input 跳过)", "修复 2: ApiSettings 重构 —— 用 inputs/shows Record 统一 10 个 Key 状态;增加弹窗 max-h-[90vh] + overflow-y-auto 防防陈类列表爆高", "需求 2: 新增 8 类分类独立 Key,独立于贞贞工坊通用 Key (gpt-image 系列 / nano-banana 系列 / mj 系列 / veo 系列 / sora2 系列 / grok 系列 / seedance 系列 / suno 系列)", "后端 settings.js: DEFAULT_SETTINGS 增加 8 个字段 (gptImageApiKey/nanoBananaApiKey/mjApiKey/veoApiKey/soraApiKey/grokApiKey/seedanceApiKey/sunoApiKey),GET /api/settings 同步脱敏返回", "后端 proxy.js: 新增 pickApiKey(settings, hint) 按模型名/endpoint/路由名选择分类 key,未填时 fallback 到贞贞通用 Key;新增 applyClassifiedKey(settings, hint) 临时覆盖 settings.zhenzhenApiKey,后续原逻辑零侵入", "后端 router 注入点: /image · /image/submit · /image/status (可传 ?model=) · /image/fal/submit · /image/fal/query · /mj/* (三条,hint='mj') · /video/submit · /video/query · /video/fal/submit · /video/fal/query · /seedance/* (hint='seedance') · /audio/submit · /audio/query (hint='suno')", "前端 ApiSettings 分区展示: 上半区 三套通用 Key (贞贞/RH/LLM);下半区 分类独立 API Key (可选) · 未填时 fallback 提示“未设置 · 使用通用 Key”", "零破坏: 未增加分类 key 的用户 一切如旧;已增加的用户对应模型会优先走分类 key,贞贞通用 Key 仍充当后备" ] }, "phase24": { "label": "RunningHub AI 应用 全自动 nodeList 拉取 + 媒体输入输出全链路修复 (v1.1.0)", "status": "complete", "items": [ "问题症状五连: ①上传视频连上 RH 但提交还是应用默认视频 ②IMAGE 字段预览显示破图 ③同一 webappId 三个 RH 节点提交同一视频结果不一致 ④多产物塞进同一个 OutputNode 未分多节点 ⑤删除 OutputNode 后 RH 节点内才能看见视频", "根因 1: useEffect 同步上游 url 到 paramValues 时 if (!cur?.sourceFromUpstream) continue 跳过未交互字段,undefined 状态上游出现 url 也不会被进一步启用", "根因 2: IMAGE 预览原仅用扩展名正则 /\\.(png|jpe?g|webp|gif|bmp)$/i 判断,RH 内部 fileName 形如 api/xxx.png 也命中导致破图", "根因 3: React state 异步陷阱——用户连上上游后立刻点运行,handleRun 读到的 paramValues 还是旧值(默认 RH hash) → 提交默认 fileName → RH 走应用默认", "根因 4: autoOutput 创建 OutputNode 时面对 N 产物采用 needCount = items.length - existingOutputCount 逻辑,手动连接的无 pickKind OutputNode 会显示全部 → autoOutput 只补建差额", "根因 5额 Canvas autoOutput 提取产物时 d.urls.forEach(pushImg) 全部当图处理,RH 产出的 mp4 被推入 imgs → OutputNode pickKind='image' → 渲染时清空 videos → 0 项空白", "修复 1: useEffect 三态同步 —— sourceFromUpstream === true 持续跟进 / undefined 首次看到上游自动启用 / false 尊重用户取消", "修复 2: IMAGE 预览加 url 前缀白名单(http(s)://、/files/output/、/files/input/、/output/、/input/) + 扩展名 + onError 隐藏兼底", "修复 3: 新增 computeFreshValuesNow(list) 同步快照函数 —— handleRun 进入时重算最新 paramValues 快照后走主提交路径,绕过 React state 异步更新陷阱 + 打[RH/submit] [RH/poll] [RH/done] 完整调试日志", "修复 4: autoOutput 重写为「升级 + 补建」策略 —— 无 pickKind 且仅本节点单一连接的 OutputNode 升级为 pickKind+pickIndex,多上游聚合节点 (totalIncoming>1) 不动;剩余 items 补建为 auto OutputNode —— N 产物 → N 个独立 OutputNode 与其他生成节点对齐", "修复 5: Canvas autoOutput 按扩展名分流 d.urls 到 imgs/vids/auds(.mp4/.webm/.mov/.m4v/.mkv → vids,.mp3/.wav/.ogg/.m4a/.flac/.aac → auds,其他→imgs),主问题「删了 OutputNode 才看见视频」需修复", "修复 6: OutputNode 增加 upstreamSig 字符串签名 deps —— 解决 xyflow useNodesData 引用稳定陷阱 useMemo 不重算问题", "修复 7: 媒体字段拉取 nodeInfoList 后默认勾选「从上游自动获取」(IMAGE/VIDEO/AUDIO),上游未连时 value=''、勾选状态仍为 true,上游连入后同步 useEffect 自动填值", "修复 8: instanceType 输入框改为 select 下拉 [默认(空)/plus],默认不传 instanceType 字段走 RH 默认实例", "修复 9: resolveNodeInfoList 提交前最终兜底 —— 字段值看起来不是 url(可能 RH 默认 hash) + 上游有对应媒体 + sourceFromUpstream !== false → 强制覆盖为上游 url,避免 state 异步/race 导致仍提交默认 hash", "后端 proxy.js /upload-asset 路径白名单补全 4 种前缀 (/files/output/ · /output/ · /files/input/ · /input/),让上传节点产出的 /files/input/up_xxx.mp4 能被解析到 INPUT_DIR", "零破坏保证: 原有手动填 RH fileName + 主动取消从上游获取的用户 — sourceFromUpstream === false 不被任何层覆盖", "sk···规范沉淀: skill.md 章 42 (340行) 记录 RH apiCallDemo schema / fieldType 推断 / 后端 4 接口 / 三层防御 / SUCCESS 分流 / autoOutput 分流 / IMAGE 预览白名单 / instanceType / OutputNode upstreamSig / 调试日志 / 12 项接入 Checklist", "提交链: 38316f2(useEffect 三态 + upstreamSig) → 316b7a5(IMAGE 白名单) → e3e190b(computeFreshValuesNow + 日志) → c5a0ec1(autoOutput 升级+补建) → caae35f(d.urls 分流) → 7e76785(默认勾选) → bfb4f95(instanceType select) → 8e866c4(resolveNodeInfoList 兜底)" ] }, "phase25": { "label": "默认像素风(light) + RH钱包应用节点 + RH钱包独立 APIKEY (v1.1.x)", "status": "complete", "items": [ "主题默认: theme.ts 默认 style='pixel' / mode='light'(zustand persist 仅对清缓存或新用户生效,老用户保留旧值)", "侧栏隐藏 rh-config 节点(hidden:true 仅 UI 隐藏,nodeTypes 注册保留以兼容老画布)", "新增节点 type='runninghub-wallet' (label='RH钱包应用', icon='Wallet', color='violet', category='rh'),与 runninghub 节点共用 RunningHubNode.tsx 组件,通过 NodeProps.type 单点判定 useWallet=type==='runninghub-wallet'", "useWallet 全链路透传: services/generation.ts 4 个 API (submitRh/queryRh/fetchRhAppInfo/uploadRhAsset) 增加 useWallet?:boolean 形参,GET 加 ?wallet=1 query, POST 写进 body", "后端 proxy.js 抽 pickRhApiKey(settings, useWallet) 工具: useWallet→settings.rhWalletApiKey, 否则走原 rhApiKey||runninghubApiKey;4 处 RH 路由(submit/query/upload-asset/app-info)统一用工具 + 友好错误文案『未配置 RH 钱包 APIKEY』", "ApiSettings 在 RunningHub 与 LLM 之间插入新设置项: label『RH 钱包 APIKEY』, bullet bg-violet-400, 提示文案『注意: 本节点用于RH钱包应用,需要设置RH企业级-共享APIKEY』", "stores/apiKeys.ts DEFAULT 加 rhWalletApiKey:''; backend/settings.js DEFAULT_SETTINGS 加 rhWalletApiKey 并 GET /api/settings 同步脱敏返回", "配色: RH钱包应用节点用 violet 主调与默认 cyan RH 节点形成视觉对比, 图标改用 lucide-react Wallet", "零破坏: 未带 useWallet 标志(默认 false)的旧调用走原 rhApiKey 路径完全等价", "提交: bbe3495 feat(rh+theme)" ] }, "phase27": { "label": "Electron 打包链路 3 处根因修复 (v1.2.1) — bytenode .jsc loader 复刻 + asar 外 .t8c require 兜底 + 后端 config/server 打包模式适配", "status": "complete", "items": [ "症状: NSIS 安装后启动失败, 加载窗卡在『启动中...』, dbg.log 报 Cannot find module 'express', require stack 顶为 C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\t8pc-jsc\\xxx.jsc → resources/app.asar/electron/loader.cjs → main.cjs", "根因 1: loader.cjs 的 .t8c hook 把解密后的 V8 字节码写入 Temp\\t8pc-jsc\\.jsc 后用 require(tmpFile) 二次加载, bytenode 的 .jsc 内置 loader 把 tmpFile 当 fileModule, fileModule.require('express') 从 Temp 路径解析 node_modules 自然找不到 asar 内的 express", "根因 2: .t8c 实际存放在 resources/backend-enc/ (extraResources, asar 外), 其 fileModule.paths 沿 resources/backend-enc/node_modules → resources/node_modules → win-unpacked/node_modules 向上查找均不命中; express 等真正存在于 app.asar/node_modules", "根因 3: backend/src/config.js 完全未识别 T8PC_PACKAGED / T8PC_USER_DATA / T8PC_FRONTEND_DIST 三个环境变量, 数据写到只读区且 NODE_ENV 仍是 development; 同时 server.js 完全未注册前端静态托管, GET / 返回 'Cannot GET /'", "修复 1 (electron/loader.cjs): 重写 .t8c require hook, 完整复刻 bytenode 的 .jsc 加载逻辑 (generateScript + fixBytecode + readSourceHash 按 Node 版本动态拷贝 dummy 字节码 flag 区) → 用 vm.Script + cachedData 直接在原始 .t8c fileModule 上下文 runInThisContext + 手动 apply CommonJS wrapper [fileModule.exports, req, fileModule, filename, dirname, process, global], 完全跳过 tmpFile 二次 require", "修复 2 (electron/loader.cjs): 自定义 req(id) 包装 fileModule.require, 捕获 MODULE_NOT_FOUND 时回退到 loader.cjs 自身 require (loader.cjs 在 app.asar 内, 可解析 app.asar/node_modules/express|cors|multer|sharp); req.resolve 同步加同等兜底", "修复 3 (backend/src/config.js): 整文件重写, 引入 IS_PACKAGED = process.env.T8PC_PACKAGED === '1', DATA_ROOT = IS_PACKAGED ? T8PC_USER_DATA : PROJECT_DIR; 所有目录 BASE_DIR/DATA_DIR/INPUT_DIR/OUTPUT_DIR/THUMBNAILS_DIR + 三个 *_FILE 全部从 DATA_ROOT 派生; FRONTEND_DIST 优先读 T8PC_FRONTEND_DIST 否则 IS_PACKAGED ? '' : project/dist; NODE_ENV 在打包模式默认 production; 打包模式启动时 fs.mkdirSync(recursive) 自动建 4 个数据目录避免首次 ENOENT", "修复 4 (backend/src/server.js): 在 app.use('/api/image', imageOpsRouter) 之后 / 启动 listen 之前插入 if (config.IS_PACKAGED && config.FRONTEND_DIST && fs.existsSync(config.FRONTEND_DIST)) { app.use(express.static(config.FRONTEND_DIST)); app.get(/^\\/(?!api\\/|files\\/|input\\/|output\\/).*/, ...sendFile index.html) } — express.static 优先于 SPA 兑底, 兑底排除 api/files/input/output 4 个前缀避免吞掉接口", "修复 5 (electron/main.cjs): 把窗口标题 + log 窗口 + IPC info 三处版本号 v1.1.0 → v1.2.0 同步 package.json (后续永久规则: package.json bump 后必须同步检查 main.cjs)", "修复 6 (electron/_post_build.cjs): 已确认存在, 验证 7 个 .t8c 必存 + frontend/{index.html,assets} 必存 + 强制清除意外混入的 resources/{app,backend}/src 明文目录", "实测验证日志 (启动 dist_electron/win-unpacked/T8-PenguinCanvas.exe 完整成功证据): [backend] started in-process on http://127.0.0.1:18766 → 环境: production → 数据目录: C:\\Users\\Administrator\\AppData\\Roaming\\t8-penguin-canvas\\data → GET / 200 → GET /assets/index-*.js → GET /api/canvas → GET /api/settings → 窗口标题: 贞贞的无限画布(企鹅共创版)", "最终产物: dist_electron/T8-PenguinCanvas-Setup-1.2.0.exe (NSIS, 87.18 MB)", "沉淀: skill.md §47 完整记录 3 处根因 + 4 步修复 + 标准化打包 SOP + 6 项打包前必检 checklist + 调试技巧表, 作为下次打包唯一参考依据" ] }, "phase26": { "label": "RH LIST 字段识别 + 多素材协议约束修复 + 日志总线统一 + 像素风字模糊全局解 + ResizeNode 体验修正 (v1.2.0)", "status": "complete", "items": [ "RH LIST/SELECT/DROPDOWN/COMBO/ENUM 字段识别: extractFieldOptions 按 fieldData/options/list/values/enum/choices/items/selectOptions/dropdown 9 种候选 + [{label,value}]/[{name,value}] 对象数组解构 + fieldType=LIST 时 fieldValue 本身是数组的兜底", "KNOWN_FIELD_OPTIONS 词典兜底(commit 2d633a3): 当 RH apiCallDemo 实际返回 fieldType=TEXT 但参数名属于已知枚举(aspectRatio/aspect_ratio/ratio/resolution/size/mode/quality/instanceType/precision/scheduler/sampler) 时按词典生成下拉,fieldName 大小写不敏感", "extractDefaultValue 与 extractFieldOptions 配套,选项首项作默认值,避免 LIST 字段被当 string 提交", "字段头紧凑布局: 三段(fieldName / 类型徽标 / #nodeId) 改 gap-1 + 竖线分隔,避免大间距视觉割裂", "RH 多素材协议约束(commit 5dde07f → 98f2005 hotfix): RH nodeInfoList fieldValue 必须单 fileName,多行/逗号拼接会触发 'Custom validation failed for node' → 撤回多行拼接尝试,resolveNodeInfoList 加 strip multiline 兜底;协议层多图能力需依赖 webapp 模板内部多个 image 字段(单字段无法塞 N 张)", "RunningHubNode 接入 logBus(commit 4ae4570): import { logBus } from '../../stores/logs', src=`${useWallet?'rh-wallet':'rh'}:${id}`,9 处关键事件(fetchInfo info / submit info+success / poll每30s debug / done success / failed error / 轮询出错 warn / stop warn / override debug / strip multiline warn) 同步发到日志面板,修复『日志面板暂无日志』", "像素风字模糊全局解(commit 4ae4570): theme-pixel.css 增加 html[data-theme-style='pixel'] .react-flow__node * { backdrop-filter:none !important; -webkit-backdrop-filter:none !important } 全局兜底所有节点 inline blur,一次修复 18+ 节点;RunningHubNode/RhConfigNode 容器再按 isPixel 切换 var(--px-surface) 不透明背景双层防御", "ResizeNode 体验修正(commit 0f55c8d): 默认 fit 从 inside 改为 cover(sharp inside 是『等比缩放不超 W×H 不裁剪』,9:16 → 1024×1024 inside ≈ 576×1024 仍是 9:16 看似没变,违反『尺寸调整』直觉);FIT_OPTIONS 加中文 label[cover·裁剪铺满 / contain·包含留白 / inside·不超尺寸不裁剪 / fill·拉伸可变形];老存档 d?.fit==='inside' 仍保留", "ImageOpFrame 引入 useHasAutoOutput(id) hook(commit 0f55c8d): 下游连有 type==='output' 节点时不渲染 outImg/outUrls 内部预览,避免双显;影响范围 Resize/Upscale/Crop/GridCrop/Combine/RemoveBg 全部 ImageOpFrame 派生节点", "提交链: 4326319(LIST 识别) → 64b4ffa(多图素材) → 5dde07f(多行拼接 - 撤回) → 98f2005(hotfix 撤回) → 2d633a3(词典+紧凑) → 4ae4570(logBus+全局禁用 blur) → 0f55c8d(ResizeNode fit cover + 隐藏内部预览)" ] }, "phase28": { "label": "SHIFT 多线平移到目标节点失效修复 (Canvas bulkReconnect phantom pointerEvents:none + elementsFromPoint 兜底)", "status": "complete", "items": [ "现象: 多条连线按住 SHIFT 平移到其他节点失效 (Seedance2.0 完整连线集平移到另个 Seedance2.0 无反应)", "根因: phantom wrapper DOM 在 mouseup 瞬间盖在目标 handle 之上 (zIndex:9999 最高层 + xyflow .react-flow__node wrapper 随鼠标),导致 event.target.closest('.react-flow__handle') = null → 直接走 restoreOriginal 平移失效", "修复 A: phantom 节点加 style: { pointerEvents: 'none' } — 让 wrapper DOM 不响应鼠标事件,事件完整穿透到下层目标 handle", "修复 B: 新增 findHandleAt(cx, cy) 工具函数 — 用 document.elementsFromPoint(复数) 遍历坐标下命中所有元素,主动跳过 BULK_PHANTOM_ID 节点自身", "修复 C: 重写 onMouseUp 双层路径 — 先试 event.target 快路径,命中 phantom 时用 findHandleAt 兜底(A 失效时 B 仍能拾回 handle,双重保险)", "修复 D: onMouseMove 同步使用 findHandleAt 让 hover 高亮也跳过 phantom", "兼容性: 单线重连/SHIFT 拉新连线/SHIFT 剪刀/Alt 拖克隆/ESC 取消 全部未受影响; phantom 节点自身的边渲染 (SVG 层) 不受 wrapper pointerEvents 影响", "验收: SHIFT+多边起点 mousedown → phantom 出现,mousemove 高亮同方向 handle,mouseup 落在目标 handle → 边批量重连成功", "关键文件: src/components/Canvas.tsx (~1577 phantom style / ~1657 findHandleAt / ~1701 onMouseUp 双层)", "沉淀: skill.md §48 完整记录机制+根因+4 处修复+设计要点+验收清单" ] }, "phase29": { "label": "终端日志『暂无日志』反复失效修复 + 防再丢失规范 + Git rebase 灾难抢救", "status": "complete", "items": [ "问题历史: 此问题出现两次 — 首次修复 commit 4ae4570 (RH 接入 logBus),后被 d5430c2 灾难 rebase 连同 14833fa~295c700 累积良好内容 (RH 钱包节点/独立 APIKEY/v1.2.x 版本号/LICENSE/素材资源标题) 一同回退", "抢救动作: git tag backup-d449552-before-recovery 备份 → git reset --hard 295c700 回到健康点 → 重做 SHIFT 修复 + skill.md/features.json 文档 → force-with-lease push", "根因定位: useLogStore / TerminalPanel / logBus 三件套始终正常;问题只会出在『业务节点是否调用 logBus.xxx()』这一环,RH 节点重构频繁容易丢失", "三道防线 A: 顶部 import { logBus } 上方加 ⚠️ 警告注释,明确告知后续重构者不能删除", "三道防线 B: 9 个必设调用点表 (字段覆写 debug / submit info / taskId success / submit error / poll 进度 debug / done success / FAILED error / 轮询 catch warn / 用户停止 warn) — 代码与 skill.md §49.3 对齐", "三道防线 C: src 命名空间约定 `:${id}` (rh / audio / image / seedance / llm / ...),函数体顶端 const src 正上方加 ⚠️ 警告注释", "反重构检查表: 顶部 import / src / 9 调用点 / console+logBus 同行 / tsc 0 错误 / 手动验证面板计数 — 6 项必跑,与 skill.md §49.4 对齐", "经验教训: 永远不要随意 git pull --rebase 解决冲突;有冲突优先 merge 或新建分支;大量功能丢失时立即 git reflog 抢救;每次 push 前 git diff --stat HEAD 检查 deletions/insertions 比例", "关键文件: src/stores/logs.ts (不需改) / src/components/TerminalPanel.tsx (不需改) / src/components/nodes/RunningHubNode.tsx ⚠️高重构频繁区域", "沉淀: skill.md §49 完整记录问题历史/架构图/三道防线/反重构检查表/经验教训,作为业务节点重构唯一参考" ] }, "phase30": { "label": "Suno 双轨节点输出素材只显示 1 首歌修复 (OutputNode + Canvas autoOutput 双路径补 audioUrl_1)", "status": "complete", "items": [ "现象: SunoNode 右侧有两个 source handle (audio-0/audio-1, top 48%/52%) 输出两首歌,但边连到下游 OutputNode 后只显示『音频 (1)』", "根因: SunoNode (=AudioNode) 将两首歌分别写入 data.audioUrl 和 data.audioUrl_1,但 OutputNode 的 collected/upstreamSig/下游透传三处以及 Canvas.tsx autoOutput 都只读主轨 audioUrl,遗漏副轨 audioUrl_1", "差别说明: useUpstreamMaterials 业务节点 hook 已在 phase24/26 修复读双字段,所以 LLMNode/SeedanceNode 作下游能拿到两首;本次仅是展示链路遗漏", "修复 1 (OutputNode.tsx upstreamSig): 第 88 行下加 ud.audioUrl_1 字段签名,避免 useMemo 由于签名未变而不重算", "修复 2 (OutputNode.tsx collected): 第 158 行下加 pushUnique(out.audios, ud.audioUrl_1),双轨同时进入 collected.audios", "修复 3 (OutputNode.tsx 下游透传 effect): next/cur/changed 同步加 audioUrl_1: collected.audios[1] || '',避免多个 OutputNode 串联场景副轨丢失", "修复 4 (Canvas.tsx autoOutput 第 1937 行后): pushAud(d.audioUrl_1),让 items 数组多出 1 项 audio → autoOutput 自动补建第 2 个 OutputNode 并标 pickKind='audio'/pickIndex=1", "向后兼容: 单轨节点(语音合成等)只写 audioUrl,audioUrl_1 为 undefined → pushUnique/pushAud 会因 typeof !== 'string' 跳过,不影响", "验收: SunoNode 生成后 → 连 OutputNode 显示『音频 (2)』两个播放器; autoOutput 场景 → 自动创建 2 个独立 OutputNode 各含一首", "关键文件: src/components/nodes/OutputNode.tsx (4 处签名/collected/透传) / src/components/Canvas.tsx (1937 行 autoOutput)", "沉淀: skill.md §50 完整记录用户反馈/根因/4 处修复/设计要点/反重构检查表/经验教训" ] }, "phase31": { "label": "节点内 textarea/input/select 框选文字时整个节点跟着鼠标走的修复 (App.tsx 全局 MutationObserver 加 nodrag/nowheel)", "status": "complete", "items": [ "现象: TextNode/LLMNode/AudioNode 等节点内 textarea 按住鼠标拖动框选文字时,整个节点跟着鼠标走(节点拖动了)而不是选中文字", "根因: xyflow v12 节点拖动是通过 pointerdown 识别启动,传统 onMouseDown stopPropagation 拦不住 pointerdown(后者更早触发);官方机制是添加 `nodrag` className,xyflow 检测后不拦截", "项目现状: 14 个 textarea 分散在 12 个节点文件(TextNode/AudioNode/ImageNode/LLMNode×3/StoryboardGridNode/PresetImageNode/OutputNode/RunningHubNode/RhConfigNode/SeedanceNode/VideoNode/IdeaNode),逐个补 className 不可维护", "修复 (1 处全局处理): App.tsx 复用原有的全局 MutationObserver (原本仅用于 spellcheck=false),扩展为同时为所有 textarea/input/select 调 el.classList.add('nodrag', 'nowheel')", "querySelectorAll 扫描从 'textarea, input' 改为 'textarea, input, select' (SELECT 不设 spellcheck 但同样加 nodrag/nowheel)", "优点: 1)零侵入(classList.add 仅追加,保留原 className 和样式) 2)未来新增节点自动覆盖 3)复用现有 useEffect/MutationObserver,零额外性能损耗", "覆盖范围(修复后均正常): 文字框选/双击选词/三击选行/复制粘贴/textarea 内部滚轮滚动 → 节点不动", "不受影响: 节点头部/边框拖动节点仍正常 / Ctrl+拖画布框选多节点未受影响 / Sidebar 等非 ReactFlow 区域的 input 加 nodrag 无副作用", "关键文件: src/App.tsx (仅 1 个 useEffect 修改)", "验收: tsc 0 错误; TextNode 节点内 textarea 框选 [verse 1] 歌词 → 节点不动,文字高亮选中正常", "沉淀: skill.md §51 完整记录用户反馈/根因/1 处修复/为什么走全局/覆盖范围/反重构检查表/经验教训" ] }, "phase33": { "label": "图像编辑器 · 遮罩(mask) + 画板(brush) 模式扩展 (v1.2.4) — 双击上传/输出素材进入编辑弹窗后从 2 模式扩到 4 模式", "status": "complete", "items": [ "需求: 在已有『裁剪/宫格切分』两模式上叠加『遮罩』与『画板』两个新模式,参考 Infinite-Canvas/static/smart-canvas.html 的 imageEditModal 全模式交互,保证 UI 一致性/美观度/用户体验", "架构: 4 个 tab(crop/mask/brush/grid) + tab 快捷键 1/2/3/4; mask 单笔刷调节 2~300px + 橡皮(globalCompositeOperation=destination-out) + 撤销/恢复/清空; brush 4 工具(free/rect/ellipse/label) + 颜色选择器 + 笔刷 2~160px + 撤销/恢复/清空 + label 自增序号", "矢量化存储: DrawStroke 6 种 kind 全部存 fraction 坐标(0~1)不存 ImageData,窗口缩放/双主题切换/撤销恢复都不失真; mask/brush 各自一栈 50 深互不交叉污染", "产物协议: mask 同时上传原图与黑底白笔 mask 两张图(下游 OutputNode 自然平际创建 2 个输出节点 inpaint 就绪); brush 原图⊕画板离屏合成后产 1 张; meta 字段加 type:'mask'/'brush' + strokeCount", "后端零改动: 复用 [/api/files/upload-base64](file:///e:/PenguinPravite/T8-penguin-canvas/backend/src/routes/files.js) base64 dataURL 转存路径; 新增 [src/services/imageOps.ts](file:///e:/PenguinPravite/T8-penguin-canvas/src/services/imageOps.ts) uploadDataUrl(dataUrl,prefix) 统一上传通道", "跨域双保险: srcUrl 外链时 crossOrigin='anonymous' 加载 + fetchAndUpload(srcUrl,prefix) 本地转存避免 canvas tainted", "双主题 UI: tabs/工具行/footer 主按钮全重用现有 t8 token 与像素风 btnPrimary/btnBase/inputBg/accent;stage 内 canvas overlay 按原始分辨率渲染 + pointerEvents 仅 mask/brush 模式开启 + 跟随鼠标的笔刷预览圈", "键盘快捷键: Esc 关闭 / Ctrl+Z 撤销 / Ctrl+Shift+Z 或 Ctrl+Y 恢复 / 1·2·3·4 切模式 / [·] 调笔刷大小; 遇到 input/textarea 输入不拦截", "mask 模式原图自动 filter: brightness(.55) + 160ms transition,让画出的遮罩区域与背景形成明显对比; 画完不需点应用上面提示「不够产物」的空状态按钮禁用 + tooltip", "档件改动: src/components/nodes/ImageEditModal.tsx (EditMode 加 mask/brush + DrawStroke 77e2量类型 6 种 + 双独立撤销/恢复栈 + onDrawPointerDown/Move/Up + applyMask/applyBrush + UI 扩展) / src/services/imageOps.ts 新增 uploadDataUrl / src/styles/index.css 补 .img-edit-stage[data-mode] z-index 兑底", "沉淀: skill.md §53 完整记录 需求源/软定/交互表/文件清单/产物协议/防重构检查表/经验教训 7 节" ] }, "phase32": { "label": "节点四角同比例缩放 + width:100% 百分比循环导致连线/缩放失效修复 (TextNode/OutputNode/UploadNode)", "status": "complete", "items": [ "需求: TextNode/OutputNode/UploadNode 三个节点支持拖 4 角同比例缩放 + 鼠标悬停明显感知 UI + 主题适配(科技风×像素风 × 深色×浅色 = 4 套视觉)", "新建控件 src/components/nodes/ResizableCorners.tsx (80 行): 4 个 NodeResizeControl 划到 4 角,keepAspectRatio 全 true,仅 selected=true 时渲染", "src/styles/index.css 末尾追加 ~130 行 CSS: 4 套主题 .t8-resize-handle--{tech|pixel}-{dark|light} + hover 高亮(opacity 0.5→0.85→1 + scale 1.18 + accent 光晕) + 像素风 4 角硬阴影方向自动朝外", "初版邀请 Bug: root 用 width:'100%' + minHeight:'100%' 后用户反馈 上传节点无法连接下游 + 输出节点只能纵向拉大(keepAspectRatio 完全失效)", "根因: ReactFlow v12 节点 wrapper(.react-flow__node) absolute 定位 + 默认 width=auto 与 root width:100% 形成 CSS 百分比循环测量,浏览器 fallback 时 wrapper.measured.width 可能是 0", "连线失效机制: handleBounds 依赖 measured → measured.width≈0 → Handle 位置错位 → 鼠标点不到 → 无法连接", "纵长条机制: xyflow XYResizer onResizeStart 计算 aspectRatio = measured.width/measured.height = 0/h = 0 → 拖角时 distX = distY*0 = 0 → newWidth 始终 clamp 到 minWidth → 只能纵向拉 + 下方空白", "最终修复方案(本地 state 持有具体 px): 节点内部 useState({w: 初始 px, h: undefined}) + root style 读 size.w/size.h + ResizableCorners onResize 同步 setSize → root 始终有具体 px → wrapper measured 准确 → handleBounds 正确 + keepAspectRatio 正确", "各节点参数: TextNode {w:260, minWidth:220, minHeight:140, accent:#38bdf8 sky-400} / OutputNode {w:320, minWidth:260, minHeight:160, accent:teal-300} / UploadNode {w:260, minWidth:220, minHeight:180, accent:跟随上传类型端口色}", "内层 flex-1 条件化: 默认 root height=auto 时 flex-1 fallback 0 会导致内层缩塌 → 改为 `${size.h ? 'flex-1 min-h-0 overflow-auto' : ''}` size.h 未设时内层 block 跟随内容自然高,拖过后才启用 flex-1 撑满", "各主题表现: 科技风 圆角小方块+accent 色描边, hover 填充 accent 色 + color-mix 光晕; 像素风 黑描边+糖果色+2px 硬阴影(neo-brutalism), 4 角硬阴影方向自动朝外", "零破坏: 未选中时 ResizableCorners 不渲染 → 节点视图保持纯净; 拖动原有未动过的节点仍是初始默认 px,与之前 w-[260px]/width:320 等价", "关键文件: src/components/nodes/ResizableCorners.tsx(新增) / src/styles/index.css(+~130 行 CSS) / TextNode.tsx + OutputNode.tsx + UploadNode.tsx (root style + size state + onResize)", "验收: tsc 0 错误; 三个节点选中时 4 角出现主题适配 handle; 拖右下角 宽高同时同比例变化; 上传节点 source handle 可点击发起连线", "沉淀: skill.md §52 完整记录 需求/初版问题/用户反馈/根因(CSS 百分比循环)/最终修复/各节点参数/ResizableCorners 设计/反重构检查表/经验教训 9 节" ] }, "phase34": { "label": "图像编辑器 · 图层组合(compose) 模式 MVP (v1.2.5) — 双击进入编辑弹窗后由 4 模式扩至 5 模式, 多图层 PS 风组合", "status": "complete", "items": [ "需求: 在已有『裁剪/遮罩/画板/宫格切分』四模式上加一个『图层组合(compose)』模式, 支持拖入/复制粘贴多图、拖动/4角缩放/旋转把手、层级/锁/隐/不透、翻转、画布尺寸预设、撤销栈", "架构: tab=compose 快捷键 5; 独立 composeLayers 状态(ImageLayer[] x/y/w/h px 坐标) + selectedIds 多选 + canvasW/H 预设 + composeHistory/Future 50 深独立栈 + composeFitRef 同步中画布的 ResizeObserver fit", "交互: 拖动(move) / 4 角缩放(默认同比 Shift 自由 Alt 中心) / 顶部旋转把手(Shift 吸附 15°); 快捷键 Ctrl+Z/Y/A/D, Del, 方向键 1px(Shift+ 10px); 拖入文件/粘贴图片自动 uploadFileBlob 后添加为新图层", "产物协议: 离屏 canvas (canvasW × canvasH) 顺序遍历可见图层 → ctx.translate → rotate → scale(flip) → drawImage → toDataURL → uploadDataUrl(prefix='compose') → onProduce([url], { type:'compose', layerCount, canvasW, canvasH }); 返回 1 张合成 PNG → 下游自动生成 1 个新 OutputNode", "后端零改动: 复用现有 /api/files/upload 与 /api/files/upload-base64 两路上传。新增 [src/services/imageOps.ts](file:///e:/PenguinPravite/T8-penguin-canvas/src/services/imageOps.ts) uploadFileBlob(file, filename) 调 multipart 上传", "UI: 5 tab + header subtext 加 compose 文案; toolbar compose 段(添加图片/画布 W×H/预设 1:1·3:4·4:3·9:16·16:9/撤销恢复/图层计数); stage 3 列 flex(左 sidebar 200 图层列表 + 中画布 + 右 sidebar 220 选中属性面板 X/Y/W/H/旋转/不透/翻转/锁隐/层级/复制删除)", "双主题: 图层 outline=accent + 四角 12px 控手(黑描边+白底+accent边) + 顶部 14px 圆点旋转把手。画布棋盘透明背景(像素风产生黄+白,科技风产生灰阶); 输入框复用 inputStyle/btnBase/tabBtn token 与现有样式体系一致", "零破坏 mask/brush v1.2.4: 原 1481 行基线全部保留(EditMode 仅加一个 'compose'选项); 原 stage div 整块以 mode==='compose'?(...):(原 stage) 三元包裹不侵入; 原 undo/redo/pushHistory 只作用 mask|brush, compose 独立三套 composeUndo/Redo/pushComposeHistory", "v2.1+ 后续: AI 抠图(opRemoveBg) / 色键去背 / 8 角缩放 / 对齐分布 / 图层组(GroupLayer 创建/解组/折叠/锁隐传染/不透明度相乘)", "关键文件: src/components/nodes/ImageEditModal.tsx (1481→2464 行, +540 行 类型/state/refs/helpers/applyCompose/effects/UI 崵接) / src/services/imageOps.ts (+14 行 uploadFileBlob)", "验收: tsc 0 错误; v1.2.4 mask/brush 5 个错误修复事件以后反复检查过的 mask/brush 完整保留(grep mask|brush 194 处未动); compose 模式 添加图片/拖动/同比缩放/旋转/撤销/应用走通", "教训沉淀: 上轮最严重问题 —— 误认 855 行为基线重写 导致 1da744d 的 mask/brush 全丢失. 本轮严格遵徾 git reset --hard origin/main 后只崵接不重写", "沉淀: skill.md 后续记录 表面层 5 tab + state/effect 独立隔离 + 崵接 vs 重写 质量护栏、ResizeObserver fit 与 ref 同步、px-canvas-coord 与 fraction 两套坐标体系互不干扰" ] }, "phase35": { "label": "RH APIKEY 统一 + 设置面板获取 APIKEY 按钮 (v1.2.9.16)", "status": "complete", "items": [ "需求 1: 取消 RH 钱包应用 APIKEY 独立字段 —— 后端 DEFAULT_SETTINGS / GET 脱敏 / 前端 ApiSettings UI / ApiKeys store / canvas.ts 类型 / generation.ts 服务函数全链路移除 rhWalletApiKey 字段; 普通 RunningHub 节点与 RH 钱包应用节点统一读 settings.rhApiKey", "需求 2: 设置面板「贞贞工坊 APIKEY」下 baseUrl 右侧加 1 个「获取 APIKey」按钮 → 新窗口打开 https://ai.t8star.org/register?aff=dP7j", "需求 3: 设置面板「RunningHub APIKEY」下 baseUrl 右侧加 2 个按钮(国内 emerald 主调 + 国外 cyan 次调) → 新窗口打开对应 runninghub.cn / runninghub.ai 郀邀链接(inviteCode=rh-v1121)", "需求 4: 按钮 UI 双主题适配 —— 默认 emerald/cyan 色调 + 像素风 px-btn px-btn--mint / px-btn 两套外观; window.open(url, '_blank', 'noopener,noreferrer') 安全打开", "后端 proxy.js: pickRhApiKey(settings) 简化为单参 → settings.rhApiKey || settings.runninghubApiKey || ''; missingRhKeyError() 错误文案统一为「未配置 RunningHub API Key」; 4 条 RH 路由(submit/query/upload-asset/app-info) 不再读 body.useWallet 与 query.wallet=1", "后端 settings.js: DEFAULT_SETTINGS 移除 rhWalletApiKey 字段; GET /api/settings 脱敏返回不再含 rhWalletApiKey 项", "前端 services/generation.ts: RhSubmitRequest 接口去掉 useWallet 字段; queryRh / fetchRhAppInfo / uploadRhAsset 3 个函数去掉 useWallet 形参 + URL 不再拼接 &wallet=1", "前端 RunningHubNode.tsx: useWallet 变量仅保留 UI 区分(标题/图标/配色), 4 个 RH 调用(submitRh/queryRh/fetchRhAppInfo/uploadRhAsset)全部不再透传 useWallet", "前端 ApiSettings.tsx 核心改造: KeyField 联合移除 'rhWalletApiKey'; emptyMap/emptyShow 同步移除; COMMON_KEYS 由 4 项缩减为 3 项(贞贞/RH/LLM); 新增 linkBtnCls / linkBtnAltCls 双主题样式 + openExternal helper + renderGetKeyButtons(field) 函数; baseUrlNote 容器升级为 flex-wrap, 同时容纳 Lock 备注 与 获取 APIKey 按钮", "向后兼容: 老 settings.json 中残留的 rhWalletApiKey 字段仅被 loadSettings 允许但不再被任何路由消费, 老用户无需迁移", "零破坏: rh-config 节点仍 hidden:true 保留后門 / RH 钱包应用节点与普通 RH 节点 violet/cyan 颜色区分仍在 / 4 套主题(科技×像素×深色×浅色) 按钮样式均适配", "提交链: 9c9875d (11 文件 +112/-66 推送 origin/main; 后续静态打包 NSIS 安装包 + skill.md 第 56 章沉淀)" ] }, "phase36": { "label": "RH 工具节点 · 启动器化包装 RunningHub AI 应用 (v1.2.10 · v1.2.10.1–4 迭代)", "status": "complete", "items": [ "v1.2.10.0: RH 分类下新增第 3 个节点「RH 工具」,启动器式包装 RunningHub AI 应用 · 双视图·多实例共享·拼音搜索·独立 JSON 存储(rh-tool-categories.json + rh-tool-apps.json)", "v1.2.10.1: 按 RunningHubNode 一比一重写 RHToolsNode 运行逻辑 —— 修复实例类型/Handle遮挡/上游输入/音频输出/循环器只出1个结果 五个问题;portTypes.rh-tools 调为 inputs:[text,image,video,audio]/outputs:[image,video,audio];Canvas.EXECUTABLE_NODE_TYPES 加 'rh-tools';LoopNode/NodeActionBar EXEC_TYPES 同步”", "v1.2.10.2: 颜色改 cyan + 文件自动保存路径全链路 —— RHToolsNode/RHToolEditorModal/nodeRegistry violet → cyan;backend/src/config.js 加 DEFAULT_LOCAL_SAVE_DIR='D:\\zhenzhen';settings.js DEFAULT_SETTINGS.fileSavePath + ensureFileSavePath() 启动自动 mkdir;files.js 新增 POST /api/files/save-to-disk(支持 /files/output/* + /files/input/* + http(s)://* 三种协议、同名跳过、自动 mkdir -p);前端 ApiSettings 新增「文件自动保存路径」输入项(初始 D:\\zhenzhen);services/api.ts 新增 saveAssetToDisk(静默失败);OutputNode useEffect 监听 collected.{images,videos,audios} ref Set 去重触发 saveAssetToDisk —— 全局生成的图像/视频/音频自动复制到本地", "v1.2.10.3: 像素风走 RunningHubNode 同款糖果调色板 —— 9 个主题色变量(accent/accentSoft/ringColor/bg/surface/surfaceHover/text/subText/border)加 isPixel 分支走 var(--px-ink/--px-yellow/--px-surface/--px-muted/--px-ink-soft); 参数表 background 像素风用 var(--px-muted); 运行按钮 hover 像素风用 var(--px-yellow) —— 与左侧 RunningHub 节点视觉完全一致", "v1.2.10.4: RH 工具 → RH 超市 重命名 —— nodeRegistry label / RHToolsNode 头部标题 / RHToolEditorModal 弹窗头部 三处用户可见文案同步; type:'rh-tools' 与后端存储 key 不变以保证数据兼容", "后端路由清单: GET/POST/PUT/DELETE /api/settings/rh-tool-categories[/:id|/reorder] (5条) + GET/POST/PUT/DELETE /api/settings/rh-tool-apps[/:id|/reorder] (5条) + POST /api/files/save-to-disk (1条全局保存)", "验收: tsc EXIT=0; 从启动器 添加分类/应用 → 进入运行视图 → 上游连上后提交 → 输出预览 → 下游 OutputNode 接收 → 本地 D:\\zhenzhen 出现复制件 全路走通" ] }, "phase37": { "label": "节点落点防重叠 · 阿基米德螺线避让 + 向右扫描 + 兆底 (v1.2.10.5~8)", "status": "complete", "items": [ "v1.2.10.5: 节点落点算法初版(nodePlacement.ts) + 双 pass spiral + pendingPlacedNodes 多源累积器", "v1.2.10.6 hotfix3: reorder-grid 覆盖 placement 偏移修复 + onConnect 接入 placeSingleNode", "v1.2.10.6 hotfix4: 去掉 adaptiveStep(防止远距离偏移) + autoOutput gap=0(只防实际重叠) + reorder 用第一个节点作锚点(防止无限循环)", "v1.2.10.7: baseY 对齐源节点垂直中心(handle 位置),避免输出节点偏上", "v1.2.10.8: 螺线失败后加向右线性扫描(rightwardScan),避免跳过中间空地直接落到画布最右端", "最终架构: spiral(~400px) → rightwardScan(~3000px) → fallback(最右兜底)" ] }, "phase38": { "label": "算力充值系统迁移 (v1.2.10.9)", "status": "complete", "items": [ "从 gpt-image-2-web 迁移充值核心: 绑定网站用户 ID、档位列表、创建支付订单、支付回调、主动查单、转移算力、失败重试、订单记录", "后端新增 backend/src/routes/recharge.js,Express 路由挂载 /api/recharge/* 与 /pay/*,保留 HMAC 请求签名协议;v1.2.10.11 起公开仓库默认不携带代理密钥", "存储改为 JSON 文件 data/recharge.json + .recharge_device_id,避免引入 sqlite 原生依赖影响 Electron 打包", "档位仅保留正式 20/30/50/100/200/300/500 CP;余额查询暂不迁移", "前端新增 RechargeModal.tsx + services/api.ts recharge API,顶部工具条新增「充值」入口,四主题(tech/pixel × light/dark)走各自视觉分支", "打包校验 _post_build.cjs 新增 routes/recharge.t8c,backend/src 修改后需重新 npm run encrypt" ] }, "phase39": { "label": "充值确认弹窗 + 安全硬化 (v1.2.10.10)", "status": "complete", "items": [ "创建订单并付款前新增同主题 alertdialog,醒目提示「请核对绑定的用户ID,一旦充错无法退回!」,展示绑定 ID / 套餐 / 金额,用户二次确认后才调用创建订单接口", "后端 CORS 从全开放改为只允许 127.0.0.1/localhost 来源或无 Origin 请求,降低网页跨站驱动本地服务风险", "支付通知 /pay/notify 在缺少 DULUPAY_KEY 时直接 fail,避免空密钥 MD5 被伪造触发转额度", "订单号随机后缀从 3 bytes 提升到 8 bytes,降低碰撞和枚举风险", "GET /api/recharge/order/:orderId 与 /api/recharge/orders 返回脱敏摘要,不再回传 trade_no" ] }, "phase40": { "label": "GitHub 推送密钥清理规则 (v1.2.10.11)", "status": "complete", "items": [ "RECHARGE_DEFAULT_ENC 默认改为空字符串,公开仓库不再携带 AGENT_HMAC_KEY 或可逆代理配置", "充值代理配置改为仅通过 RECHARGE_AGENT_BASE_URL / RECHARGE_AGENT_HMAC_KEY / RECHARGE_WEBSITE_URL / RECHARGE_DULUPAY_KEY 等环境变量注入", "skill.md 追加 GitHub 推送前安全清单:严禁提交真实 HMAC、支付平台密钥、data 本地数据、build/dist_electron 打包产物与明文配置" ] }, "phase41": { "label": "本地私有充值配置恢复 (v1.2.10.12)", "status": "complete", "items": [ "新增 data/recharge.private.json 本地私有配置兜底,文件被 .gitignore 忽略,本地开发可继续使用充值 agent", "配置读取顺序为公开默认空配置 < data/recharge.private.json < RECHARGE_* 环境变量,GitHub 仍不携带真实 HMAC", "config.js 增加 RECHARGE_PRIVATE_FILE,recharge.js 增加私有配置读取与规范化逻辑" ] }, "phase42": { "label": "充值用户包密钥安全闸 (v1.2.10.13)", "status": "complete", "items": [ "用户分发 Electron 包不得携带 AGENT_HMAC_KEY / DULUPAY_KEY / RECHARGE_DEFAULT_ENC 可逆密文,充值全局密钥只能留在 VPS 或本地私有开发环境", "_post_build.cjs 新增充值密钥扫描:发现源码非空 RECHARGE_DEFAULT_ENC、resources/data/recharge.private.json、非空 AGENT_HMAC_KEY / DULUPAY_KEY 或遗留 ZZENC1 密文即失败", "skill.md 打包 SOP 追加用户充值包安全边界:当前客户端 HMAC 方案只适合本地私有测试,正式用户版需要 VPS 提供无需客户端 HMAC 的公开下单/查单接口" ] }, "phase43": { "label": "VPS 公开充值接口 + 三段阶段版本规则 (v1.3.0)", "status": "complete", "items": [ "充值系统切换到 VPS /public/recharge/* 公开下单、查单和重试接口,T8 桌面端只保存绑定用户、订单摘要与 order_token,不再携带或使用全局 agent HMAC", "版本规则废弃 4 段 display + 压缩 semver,改为统一三段 x.y.z;从 1.3.0 开始,阶段内 1.3.1 到 1.3.9,下个阶段为 1.4.0", "package.json、package-lock.json、vite.config.ts、vite.config.js、electron/main.cjs、features.json、README.md 已同步到 1.3.0;skill.md 仅本地更新且不得推送 GitHub" ] }, "phase44": { "label": "画布自动保存 + RH 超市导入导出 (v1.3.1)", "status": "complete", "items": [ "设置页新增 canvasAutoSavePath,默认 D:\\zhenzhen;画布每次内部保存成功后同步导出 JSON 到 /T8-penguin-canvas/canvases,便于更换版本后用现有导入功能恢复", "画布导出 JSON 升级为 schema=t8-penguin-canvas-export/version=2,包含 canvas 元信息与 viewport;导入兼容普通导出与自动保存备份", "RH 超市管理弹窗新增导出 / 导入按钮;导出分类和应用为 t8-rh-tools JSON,导入默认覆盖当前 RH 超市数据并保留备份内 id,方便旧画布继续匹配已选应用", "后端新增 POST /api/canvas/:id/auto-save、GET /api/settings/rh-tools/export、POST /api/settings/rh-tools/import;设置保存时自动 mkdir 本地保存路径" ] }, "phase45": { "label": "RH 超市节点本体导入导出入口 (v1.3.2)", "status": "complete", "items": [ "RHToolsNode 启动器视图在「增加 / 编辑」下方新增「导出 / 导入」按钮,用户在节点本体即可备份或恢复 RH 超市分类和应用", "导入入口复用现有 t8-rh-tools JSON 清洗与 replace 覆盖逻辑,并在覆盖前提示确认,导入结果在节点内以同主题状态条显示", "RHToolEditorModal 顶部导出 / 导入入口继续保留,节点本体和管理弹窗两处入口共享同一套备份格式与后端导入逻辑", "backend/src/config.js 新增 APP_VERSION,/api/status 返回值同步当前发布版本,便于打包冒烟测试确认运行的是最新包" ] }, "phase46": { "label": "RH 输出 SS_tools 鸭鸭图透明解码 (v1.3.3)", "status": "complete", "items": [ "新增 backend/src/utils/duckPayload.js,纯 Node + sharp 复刻 SS_tools 无密码鸭鸭图解码算法,按 k=2/6/8 三种 LSB 位宽解析 payload length 与 header", "只支持无密码鸭鸭图;检测到 password-protected payload 或非鸭鸭图时不报错、不阻断,保持原 RH 输出 PNG 正常落盘", "RunningHub 查询结果回收阶段接入透明解码:/api/proxy/runninghub/query 下载 RH 远端输出后先 tryDecodeDuckPayload,成功后按真实 ext 保存为图片 / 视频 / 音频", "支持 .binpng 视频载荷恢复:将隐藏的二进制 PNG raw RGB 还原为原视频 bytes,并按 mp4/mov/webm 等真实扩展名输出", "前端 RunningHubNode、RH钱包应用、RHToolsNode 零 UI 改动;三者共享 queryRh 结果,解码后依靠现有后缀分流自动写入 imageUrl / videoUrl / audioUrl", "electron/_post_build.cjs 增加 backend-enc/utils/duckPayload.t8c 必存在校验,防止 Electron 用户包漏掉解码模块", ".gitignore 增加 /SS_tools/,本地参考拷贝及 exe/rar/assets 不进入公开仓库" ] }, "phase47": { "label": "创作资源库 (v1.3.4)", "status": "complete", "items": [ "新增顶部「资源库」入口,打开右侧抽屉;图像 / 视频 / 音频 / 全景等类型独立 Tab、独立分类、搜索、收藏筛选与资源卡片管理", "任意上传或生成素材预览右键新增「加入资源库」菜单,可选择现有分类或新建分类;入库时复制一份到资源库目录,不依赖原 input/output 文件长期存在", "设置页新增 resourceLibraryPath,默认 D:\\zhenzhen\\resources;资源文件与 resource_library.json 元数据都保存在该路径,路径不存在时自动创建,方便更换版本后继续读取", "后端新增 backend/src/routes/resources.js,提供 /api/resources/categories、/api/resources/items、/api/resources/file/:id、/api/resources/thumb/:id;支持本地 input/output 复制、远端 URL 拉取、sha256 去重、删除资源库副本与图片缩略图生成", "远端 URL 入库增加安全护栏:本机/内网地址禁止拉取,30 秒超时,单个远端资源限制 512MB;本地 input/output 资源不受该限制", "资源库卡片支持图片缩略图、视频悬停播放预览、音频播放器、悬停放大、重命名、改分类、收藏、删除、插入画布;插入画布会创建带对应素材 URL 的 UploadNode", "资源库卡片保留 data-drag-source 协议,Ctrl+拖拽可继续投放到现有素材接收节点;双主题 UI 分别适配像素风与科技风", "electron/_post_build.cjs 增加 backend-enc/routes/resources.t8c 必存在校验,防止 Electron 用户包漏掉资源库后端" ] }, "phase48": { "label": "资源库像素风操作按钮优化 (v1.3.5)", "status": "complete", "items": [ "资源库卡片在像素风下取消「插入」文字胶囊,改为 32px 圆形加号图标按钮,避免音频卡片底部出现文字挤压和换行", "像素风插入 / 重命名 / 删除三个操作按钮统一为等尺寸圆形图标按钮,保留 title 与 aria-label,科技风仍保留「+ 插入」文字按钮", "公开版本同步到 1.3.5:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步" ] }, "phase49": { "label": "主题模板系统 + OP 风格 + 主题音乐 (v1.3.6)", "status": "complete", "items": [ "新增 ThemeTemplate v2:内置科技风、像素糖果风、OP 风格三套模板,模板包含 light/dark tokens、visuals 风格元数据与 music 配置", "新增主题模板管理器:设置页支持自定义模板路径,默认 D:\\zhenzhen\\theme-templates;支持导入、导出、复制、编辑、保存、删除自定义模板,后端 /api/themes/templates 负责 JSON 持久化与校验", "新增 OP 风格视觉:海图画布、悬赏令节点框、草帽半透明水印、OP 顶部栏/侧边栏/MiniMap/控制条/GroupBox/端口样式,并修复明暗模式文字可读性与端口悬停偏移", "新增主题音乐按钮:默认静音,位于控制条上方并与放大缩小条对齐;科技风默认 classic-one-summer-day.mp3,像素风默认 pixel-theme-of-sss.mp3,OP 风格默认 op-battle-scars.mp3,用户可在模板编辑器上传替换", "主题设计规范沉淀到 features.json 与本地 skill.md:新增节点和全局 UI 必须优先使用 ThemeTokens、visuals、通用 t8-* CSS 类和模板变量,避免每个节点重复写主题分支", "公开版本同步到 1.3.6:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步" ] }, "phase50": { "label": "节点右键菜单与 OP 浮层层级修复 (v1.3.7)", "status": "complete", "items": [ "修复节点非素材区域右键无响应:素材资源库右键菜单不再用 elementsFromPoint 穿透堆叠层查找 data-drag-source,只响应实际点击目标的最近素材元素,避免误拦截节点普通区域", "Canvas 增加 onContextMenuCapture 兜底:右键落在 .react-flow__node 内且不是素材预览时,统一打开原节点菜单,恢复复制、快速复制、删除、打组、组执行等操作", "OP 风格修复浮层被主题样式压回画布层的问题:theme-op.css 不再对 .t8-canvas-shell 的所有直接子元素强制 position:relative/z-index:1,只限定 ReactFlow 主画布层", "拖线候选菜单、节点右键菜单、空白画布右键菜单统一添加 data-canvas-floating-ui,并在 OP 风格下强制 fixed + 高 z-index,防止后续主题皮肤再次误伤浮层", "公开版本同步到 1.3.7:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步" ] }, "phase51": { "label": "图像对比工具节点升级", "status": "complete", "items": [ "复活原隐藏 image-compare 节点,正式显示为工具节点「图像对比」", "节点提供 A/B 两个图像输入口和一个 image 输出口;连入两张图后无需运行即可在节点内即时预览,输入口旁不再额外显示 A/B 小标签", "支持滑杆、并排、透明叠加、闪烁、差异热力图、差异聚焦 6 种对比方式,并提供 contain/cover/fill 对齐策略与变化比例统计", "热力图改为 A 图底图 + 差异暖色高亮;棋盘模式替换为更实用的差异聚焦,未变化区域降噪变暗、变化区域保留 B 图细节", "点击运行调用 POST /api/image/compare 生成静态对比结果图,写入 data.imageUrl;若旧后端未提供 compare 路由,前端自动用 canvas 兜底生成并上传 base64", "图像对比加入 Canvas 与 NodeActionBar 的可执行节点列表,支持选中运行、顶部 RUN 与批量运行" ] }, "phase52": { "label": "输出素材快捷图像对比 (v1.3.8)", "status": "complete", "items": [ "OutputNode 图像预览右上角新增快捷对比按钮,用户可直接从输出结果打开轻量对比弹窗。", "ImageCompareModal 固定当前输出图为结果图,自动从上游 referenceImages、localRefImages、mjSrefImages、mjOrefImages、RH paramValues、上游连接图片与当前输出其他图收集输入候选,多图通过缩略图切换。", "找不到输入图时仍打开弹窗,支持手动选择本地图像作为输入图,方便多参考图或外部原图场景。", "抽取 src/utils/imageCompare.ts 与 src/components/ImageCompareStage.tsx,ImageCompareNode 与快捷弹窗复用同一套绘制、差异统计、前端 fallback 导出逻辑。", "快捷弹窗支持滑杆、并排、叠加、闪烁、热力、聚焦 6 种模式,并可按当前模式下载对比结果 PNG。", "ImageCompareModal 走 t8-panel / t8-btn / t8-select / --t8-* 变量并使用 data-canvas-floating-ui,兼容科技风、像素糖果风、OP 风格浮层层级。", "公开版本同步到 1.3.8:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步。" ] }, "phase53": { "label": "同类型批量上传 + 素材合集打散 (v1.3.9)", "status": "complete", "items": [ "UploadNode 支持同类型多文件选择与拖拽批量上传,图像 / 视频 / 音频会分别写入 imageUrls / videoUrls / audioUrls,同时保留 imageUrl / videoUrl / audioUrl 兼容旧链路。", "上传节点运行时会把当前合集一次性输出为 OutputNode 合集,方便用户继续预览、连接或保存。", "UploadNode 与 OutputNode 的多素材标题区新增打散合集入口,可将图片 / 视频 / 音频合集拆成多个独立上传或输出节点,替代手动使用「从合集获取」逐个取素材。", "新增 src/utils/mediaCollection.ts 统一素材集合数据结构、文件名 / 大小 / mime 映射与批量节点摆放规则,避免上传和输出节点各自维护重复逻辑。", "新增 src/components/CollectionSplitButton.tsx,入口使用小型主题变量图标按钮,不复用 t8-btn 大按钮样式,避免 OP / 像素糖果风下被撑大或遮挡内容。", "公开版本同步到 1.3.9:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase54": { "label": "画布级粘贴/拖入素材生成上传节点 (v1.4.0)", "status": "complete", "items": [ "Canvas 支持在画布焦点下 Ctrl+V 粘贴剪贴板图像 / 视频 / 音频,自动上传到 /api/files/upload 并生成 UploadNode。", "支持把一个或多个素材文件直接拖到画布;拖入文件时阻止浏览器默认打开文件,落点按鼠标位置转换为画布坐标。", "同类型多文件自动写入同一个 UploadNode 合集,混合类型文件按 image / video / audio 分成多个 UploadNode,并继续复用 imageUrls / videoUrls / audioUrls 协议与后续打散功能。", "文本输入框、textarea、select 和 contenteditable 内的粘贴不会被画布拦截;原有节点 Ctrl+C / Ctrl+V / Ctrl+Shift+V 内部复制粘贴保持兼容。", "公开版本同步到 1.4.0:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase55": { "label": "生成文本框 @ 素材提及 (v1.4.1)", "status": "complete", "items": [ "新增 src/components/nodes/MentionPromptInput.tsx 与 mediaMentions.ts:在生成类文本输入中输入 @ 可弹出当前可引用素材列表,支持图像 / 视频 / 音频预览与键盘选择。", "ImageNode / VideoNode / SeedanceNode / AudioNode / LLMNode 接入 @ 素材提及;被提及素材在输入框内显示小方形预览图,下方保留“实际发送”预览,生成提交前按当前素材顺序稳定解析为 @image1 / @video1 / @audio1。", "RunningHubNode 同步接入 @ 素材提及,普通 RunningHub 与 RH钱包应用共享该能力;仅改 TEXT/STRING 类参数字段,媒体上传字段仍使用原有“从上游自动获取”和 uploadRhAsset 链路。", "RHToolsNode 的 RH超市应用运行视图同步接入 @ 素材提及,并保留原有主题变量 style,确保科技风 / 像素糖果风 / OP 风格下输入框视觉一致。", "中文 IME 输入在 contenteditable 中单独处理 compositionStart/compositionEnd,避免中文逐字截断;多次 @ 提及时保持光标位置、弹窗重开和 mention ranges 稳定。", "公开版本同步到 1.4.1:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase56": { "label": "充值付款链接稳定性 + Electron 外链兜底 (v1.4.2)", "status": "complete", "items": [ "充值后端彻底移除小额测试档,/api/recharge/plans 只返回 20/30/50/100/200/300/500 CP 七个正式档位。", "订单创建、主动查单和订单历史都会保存并回传 pending 订单的 pay_url,避免用户点击查询状态后扫码付款链接瞬间消失。", "RechargeModal 增加付款链接缓存、打开付款页、复制付款链接和订单历史“付”快捷按钮;如果 Electron/系统拦截新窗口,用户仍可复制链接到浏览器完成支付。", "Electron 主进程增加 http/https 外链白名单打开逻辑、setWindowOpenHandler、will-navigate 保护和 preload openExternal IPC,修复打包后二维码窗口不弹出的问题。", "修复主窗口 preload 路径为 preload.cjs,避免打包后的 Electron preload 文件名不一致。", "公开版本同步到 1.4.2:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase57": { "label": "宫格剪裁 gap 去缝可视预览 (v1.4.3)", "status": "complete", "items": [ "GridCropNode 增加 gap / 去缝间距控制,复用后端 /api/image/grid-crop 已有的 gap 裁切能力,运行时会按切线两侧裁掉缝隙区域。", "节点内新增上游图像预览:橙色实线显示宫格切线,半透明橙色带显示会被裁掉的 gap 区域,白色虚线显示 gap 两侧边界,用户调节时可即时感知效果。", "新增 2×2、3×3、2×3、1×4、4×1 常用预设,适合 MJ 四宫格、九宫格头像、横向/纵向分镜条等场景。", "ImageOpFrame 支持由子节点传入 inputImages,宫格剪裁预览和运行使用同一套上游图像来源,并兼容 imageUrl / imageUrls / urls / generatedImages。", "Canvas 新建 grid-crop 节点默认写入 rows=3、cols=3、gap=0;公开版本同步到 1.4.3,skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase58": { "label": "节点运行按钮首次点击兜底修复 (v1.4.4)", "status": "complete", "items": [ "修复未选中节点内部按钮首次点击可能只触发 ReactFlow 节点选中/拖拽启动、没有执行按钮 click 的问题。", "Canvas 在 document 原生 capture 阶段仅拦截 .react-flow__node 或 data-node-action-bar 内 button / role=button 的左键 pointerdown 与 mousedown,不 preventDefault,不影响按钮本身 click。", "NodeActionBar 增加 data-node-action-bar 标记并补 onPointerDown stopPropagation,让悬浮 RUN / STOP / 关闭按钮同样避开 ReactFlow pointerdown capture 抢事件。", "该兜底覆盖 Image / Video / Audio / LLM / RunningHub / RH超市 / 图像工具等所有节点内按钮,保留输入框、素材 Ctrl 拖拽、右键菜单、连线和画布框选原有行为。", "公开版本同步到 1.4.4:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase59": { "label": "宫格剪裁指定序号与批量拆分 (v1.4.5)", "status": "complete", "items": [ "GridCropNode 新增输出顺序:行优先、列优先、蛇形、反向;预览图上的编号会随顺序变化,方便用户明确第几格对应哪块画面。", "GridCropNode 新增导出序号输入,支持 1,3,5-8 等写法;填写后未选中的格子在预览中变淡,运行只输出指定格子。", "GridCropNode 新增上游合集批量拆分开关,默认仍只处理第 1 张上游图像;打开后会把上游合集中的每张图逐张宫格切分,并合并为一个输出合集。", "前端运行前按预览编号直接计算 rectsPx 传给 /api/image/grid-crop,确保旧后端或未重启后端也不会忽略输出顺序和导出序号。", "ImageOpFrame 新增 processAllInputs 批量处理能力,支持图像工具节点按需逐张处理全部上游图像并合并 urls/imageUrls 输出。", "Canvas 自动输出补过期清理:当宫格剪裁从 9 项变为 3 项时,会清理没有下游、未手动移动的过期自动 OutputNode,避免旧结果残留误导用户。", "后端 /api/image/grid-crop 同步支持 orderMode 与 exportIndexes,供新版后端直接排序与筛选;公开版本同步到 1.4.5,skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase60": { "label": "电影感组合器升级 (v1.4.6)", "status": "complete", "items": [ "ToolboxParamNode 的 cinematic 分支从 6 个单选按钮升级为电影感组合器,保持右侧 text 输出端口和 data.prompt 协议不变,旧画布 presetId 继续兼容。", "成片风格扩展为 15 项并固定 5 列紧凑布局,避免 OP / 像素风按钮被撑大变形。", "镜头、光影、调色、质感四组均扩展到 15 个常用电影创作选项,每组可选一项,再配合轻微 / 标准 / 强烈三档强度生成最终 prompt。", "镜头组原「主观」选项改为「中景」,英文提示词改为 medium shot, balanced subject and environment, clear narrative context;中文提示词改为中景镜头,人物与环境比例平衡,叙事空间清晰。", "新增 EN / 中语言切换,默认英文;切换语言会按当前已选项即时重建英文或中文 prompt,自定义补充按用户原文保留。", "新增节点内「运行输出文本」按钮,cinematic / video-motion 接入 useRunTrigger、Canvas 批量运行和 NodeActionBar;运行时会直接创建或更新下游 OutputNode,同时保留手动连线读取 data.prompt 的旧方式。", "新增自定义补充输入与复制输出按钮,用户可把主题关键词、场景氛围或风格偏好合并进最终 prompt。", "电影感与视频运镜节点统一改用 t8-node / t8-card / t8-btn / t8-input 主题变量样式,减少硬编码深色样式,自动适配科技风、像素糖果风和 OP 风格。", "OP 风格下 EN / 中 / 清空 / 复制等迷你控件改为电影感节点独立 mini control 样式,不再复用 .t8-btn,避免被通用海报按钮样式放大变形。", "已通过 npm run build,并用临时画布在本地页面做布局截图检查;临时画布与检查文件已清理;本次源码推送 GitHub,未重新打包 Electron。" ] }, "phase61": { "label": "视频运镜组合器升级 (v1.4.7)", "status": "complete", "items": [ "ToolboxParamNode 的 video-motion 分支从 8 个单选运镜按钮升级为视频运镜组合器,保持右侧 text 输出端口和 data.prompt 协议不变,旧画布 presetId 继续兼容。", "新增 12 个成片场景模板:角色登场、产品展示、情绪推近、环绕展示、环境揭示、战斗冲击、梦幻漂移、建筑巡游、美食细节、旅行航拍、对话跟随、转场甩镜。", "运镜动作扩展到 15 项:静止、推近、拉远、左摇、右摇、上摇、下摇、环绕、跟拍、滑轨、升降、航拍、手持、甩镜、急推。", "新增路径 / 节奏 / 稳定 / 主体四组约束,分别覆盖 15 / 9 / 9 / 9 个常用视频创作控制项,最终组合为可直接给视频模型使用的 prompt。", "新增路线预览小面板,用 SVG 路径显示推进、拉远、平移、环绕、升降、手持、甩镜等运动方向,帮助用户感知运镜意图;预览以运镜动作为主线,路径设置以虚线辅助叠加,避免选中路径后覆盖动作预览。", "新增 EN / 中语言切换,默认英文;切换语言会按当前已选项即时重建英文或中文 prompt,自定义补充保留用户原文。", "新增自定义补充与复制输出按钮,保留「运行输出文本」创建或更新下游 OutputNode 的能力,并继续支持手动连线读取 data.prompt。", "Canvas 初始 data 写入 motionLanguage=en,nodePlacement 默认尺寸更新为 540×760,nodeRegistry / features / README / 版本文件同步到 1.4.7。" ] }, "phase62": { "label": "可视化多角度工具箱节点 (v1.4.8)", "status": "complete", "items": [ "工具箱分类新增「可视化多角度」节点,类型为 multi-angle-visual,保持工具箱统一的 text 输出端口,可手动连线读取 data.prompt,也可点击运行输出到下游 OutputNode。", "节点左侧可选接入 image 上游作为参考预览;未接图像时仍显示抽象主体板和 2.5D 相机示意,不依赖 Three.js,降低打包体积和运行风险。", "可视化面板支持拖动水平环、俯仰弧线和远近轨道,也可用滑杆精调 azimuth / elevation / distance;平视 0° 在弧线中心,负数向下为仰拍,正数向上为高机位 / 俯拍。", "自动映射为 Qwen Multiangle Camera 兼容的 front / quarter / side / back、low-angle / eye-level / elevated / high-angle、wide / medium / close-up prompt;远近数值越大越近,越小越远。", "内置正面、45 度、侧面、背面、俯拍、仰拍、远景、中景、特写和 6 个创作机位快捷预设,适合角色设定、产品展示、建模参考、多角度图像生成等场景。", "输出格式支持 Qwen / 通用 / 双格式三档,并新增 EN / 中语言切换,默认英文;Qwen 模式输出 结构提示词,通用模式输出自然语言相机提示词,双格式同时给模型和人工阅读使用。", "二版新增批量角度输出:单条 / 三视图 / 四视图 / 八方位 / 自定义角度,会把多条 prompt 以编号文本写入同一个 OutputNode,保留现有 text 端口协议。", "二版新增自定义前缀 / 后缀,和自定义补充分别进入最终 prompt;Prompt 模式切换与 EN / 中切换会即时重建输出。", "二版新增镜头收藏,收藏当前方位 / 俯仰 / 远近到节点 data,随画布保存,并支持一键应用或删除。", "二版新增角度预设 JSON 导入 / 导出:导出当前机位、批量模式、内置批量组和收藏镜头;导入时恢复当前机位、Prompt 设置、前后缀和收藏镜头,前端 FileReader/Blob 完成,不依赖后端。", "三版布局优化:节点改为 760px 宽双栏紧凑布局,左侧保留可视化预览和输出 prompt,右侧把方向 / 高度 / 远近 / 快捷机位 / 批量输出 / Prompt 模式 / 语言全部改为下拉列表,收藏区限高滚动,显著降低节点高度。", "镜头收藏区细节优化:收藏列表改为单列滚动预览,阻止 wheel 事件冒泡到 ReactFlow 画布,避免滚动列表时触发画布缩放;收藏名称增加内边距、长文本省略和 tooltip,删除按钮固定右侧。", "Canvas / nodeRegistry / portTypes / nodePlacement / types / features / README / 版本文件同步到 1.4.8;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase63": { "label": "视频运镜紧凑收藏优化 (v1.4.8)", "status": "complete", "items": [ "ToolboxParamNode 的 video-motion 分支改为 720px 宽双栏紧凑布局,左侧保留路线预览和输出 prompt,右侧集中配置,避免原按钮墙节点过高。", "成片场景、运镜动作、运动路径、节奏速度、稳定质感、主体约束全部改为下拉列表,且六组创作预设均扩展到 50 项;语言也从顶部大按钮改为列表项,交互更直观且不挤压 OP / 像素主题。", "路线预览从十几个硬编码 ID 改为动作 / 路径分类映射,50 个运镜动作和 50 个运动路径都能触发对应 SVG 反馈;动作预览为主线,路径预览以虚线叠加。", "新增运镜收藏:收藏当前场景 / 动作 / 路径 / 节奏 / 稳定 / 主体 / 自定义补充 / 语言到节点 data,随画布保存,支持一键应用与删除。", "新增视频运镜 JSON 导入 / 导出:schema 为 t8-video-motion-presets,导出当前配置、内置目录摘要和收藏;导入使用 FileReader 在前端恢复配置与收藏,不依赖后端。", "nodePlacement 默认尺寸同步为 720×460,避免新建视频运镜节点仍按旧 540×760 的大节点避让。", "nodeRegistry 描述同步为列表式配置、收藏与 JSON 复用;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase64": { "label": "电影感紧凑收藏优化 (v1.4.8)", "status": "complete", "items": [ "ToolboxParamNode 的 cinematic 分支改为 720px 宽双栏紧凑布局,左侧放输出 prompt 与电影收藏,右侧集中配置,避免原按钮墙节点占据整屏。", "成片风格、镜头、光影、调色、质感、强度和语言全部改为下拉列表,保留中英文 prompt、手动连线 data.prompt 和一键运行输出到 OutputNode 的旧协议。", "成片风格、镜头、光影、调色、质感五组创作预设均扩展到 50 项;强度继续保留轻微 / 标准 / 强烈三档,作为独立控制项。", "新增电影感收藏:收藏当前风格 / 镜头 / 光影 / 调色 / 质感 / 强度 / 自定义补充 / 语言到节点 data,随画布保存,支持一键应用与删除。", "新增电影感 JSON 导入 / 导出:schema 为 t8-cinematic-presets,导出当前配置、内置目录摘要和收藏;导入使用 FileReader 在前端恢复配置与收藏,不依赖后端。", "nodePlacement 默认尺寸同步为 720×460,避免新建电影感节点仍按旧大按钮墙尺寸避让。", "nodeRegistry 与 README 描述同步为列表式配置、收藏与 JSON 复用;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase65": { "label": "视频运镜 / 电影感预设补齐 (v1.4.9)", "status": "complete", "items": [ "视频运镜节点的成片场景、运镜动作、运动路径、节奏速度、稳定质感、主体约束六组全部补齐到 50 项,方便创作者用下拉列表快速组合镜头语言。", "路线预览改为 MOTION_PREVIEW_GROUPS 分类映射,50 个运镜动作和 50 个运动路径均有对应 SVG 反馈;动作主线使用实线,路径叠加使用虚线,避免新增预设看起来没有反应。", "路线预览下方新增符号图例,解释动作主线、路径叠加、参考轨道、主体焦点和运动终点,降低用户理解成本。", "电影感节点的成片风格、镜头、光影、调色、质感五组保持 50 项,并清空示例测试补充文本,避免用户打开本地画布时看到测试收藏内容。", "公开版本同步到 1.4.9:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase66": { "label": "文本分割工具节点 (v1.5.0)", "status": "complete", "items": [ "工具节点分类新增「文本分割」节点,类型 text-split,支持接上游 text 或手动粘贴长提示词 / 分镜模板。", "分割方式支持按段落、按行、自定义分隔符、Markdown 标题、序号/镜头号和按字数切块;默认去空行和 trim,并提供压缩空白、去序号、每段前缀/后缀与 {{index}} / {{total}} 占位符。", "节点内提供分段预览、单段编辑、删除、上下移动、复制全部和打散为多个 TextNode;UI 使用 t8-node / t8-card / t8-btn / t8-input / t8-select,自动适配科技风、像素糖果风和 OP 风格。", "新增 src/utils/textSplit.ts 纯函数分割器,后续扩展规则只需维护该工具函数。", "TextSplitNode 会写入 textSegments / segments / prompt / text / outputText;useUpstreamMaterials 与 OutputNode 优先消费 textSegments/texts 数组,避免把 joined prompt 作为额外第 N+1 项。", "LoopNode 的 text 类型注入、聚合和下游收集同步支持 textSegments,方便文本分割后直接驱动循环批量生成。", "公开版本同步到 1.5.0:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase67": { "label": "文本分割二版增强 (v1.5.1)", "status": "complete", "items": [ "TextSplitNode 新增「智能分镜」模式,按 Markdown 标题、镜头/分镜/场景/Scene/Shot、中文序号、数字序号和内外景提示识别分镜标题,失败时自动回退到序号或段落分割。", "新增「正则高级」模式,支持按正则分隔或提取匹配内容,flags 会过滤为 JS RegExp 安全字符,正则错误只在节点内提示,不会中断画布。", "新增分段收藏:可保存当前分割方式、正则、自定义前后缀、上游优先设置和手动调整后的分段,收藏写入节点 data 并随画布保存。", "新增 t8-text-split-presets JSON 导入 / 导出,导出当前配置、当前分段和收藏;导入在前端用 FileReader 恢复,不依赖后端。", "新增「循环器链路」按钮,一键在文本分割节点左侧创建或校准 text 类型前置 LoopNode,并把原本直连文本分割的上游文本线迁移为“上游 -> 循环器 -> 文本分割”,避免循环器跑到文本分割后面。", "普通文本分割保持旧体验:只更新节点内预览和 textSegments,不自动创建 OutputNode;如果前面接了循环器,则仅在循环器从 running 变成 success 后自动打散当前分段为多个 TextNode。", "TextSplitNode 会自动清理上一版误创建的 output-auto-text-split 输出素材节点,避免旧画布继续残留无用输出素材。", "TextSplitNode 的迷你上移 / 下移 / 删除按钮继续使用独立固定尺寸样式,不复用 .t8-btn,避免 OP / 像素糖果风按钮被主题放大变形。", "公开版本同步到 1.5.1:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase68": { "label": "文本分割体验修复与双列布局 (v1.5.2)", "status": "complete", "items": [ "默认新建 TextSplitNode 的 splitMode 改为 line,适合用户最常见的一行一个提示词 / 分镜条目。", "修复分段预览 textarea 中文 IME 输入被截断:分段编辑改为稳定 key + composition 本地草稿,中文组词期间不再反复写入节点 data。", "修复按段落、按序号/镜头和按字数切块的边界:按段落可按普通换行或空行拆分;按序号/镜头只在镜头/分镜/场景/序号标题处拆,正文普通换行不拆;字数切块最小值从 80 改为 1。", "新增 MODE_HELP 分割方式说明文案,用户切换按行 / 按段落 / 自定义 / 智能分镜 / 正则 / Markdown / 序号镜头 / 字数切块时会看到简短用途说明。", "segmentsOverride 增加分割算法版本签名,源文本、配置或算法变化时自动失效旧手动覆盖,避免旧画布继续显示过期分段。", "TextSplitNode 改为 760px 双列布局:左侧配置与原始文本,右侧分段预览和收藏;右侧预览固定高度并内部滚动,收藏区贴底,避免段数多时撑高整个节点。", "nodePlacement 默认尺寸同步为 760×520,公开版本同步到 1.5.2:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase69": { "label": "素材集节点与同类素材合并 (v1.5.2)", "status": "complete", "items": [ "新增素材资源节点「素材集」(material-set),支持文本 / 图像 / 视频 / 音频四类同类型素材打包,节点内可预览、拖拽排序、删除、清空和一键打散。", "画布框选多个同类型素材时右键菜单新增「合并到素材集」,按画布阅读顺序合并,不删除原节点和原连线,方便用户无损整理素材。", "素材集使用 materialSetKind + materialSetItems 作为主数据结构,同时同步 legacy 字段 textSegments / imageUrls / videoUrls / audioUrls / imageUrl / videoUrl / audioUrl,保证旧的可执行节点读取路径继续可用。", "useUpstreamMaterials、OutputNode、RelayNode 增加 explicit material-set 读取逻辑,保留素材集内部顺序并避免重复收集;MaterialSetNode 被加入自动输出跳过清单,避免用户整理素材时自动生成多余 OutputNode。", "portTypes 增加 material-set 动态输出:有素材时只输出当前类型,无素材时不输出;节点可接入任意 text/image/video/audio 上游,并可手动收集上游同类素材。", "兼容范围:图像、视频、SD2.0、音频、LLM、RunningHub、RH 钱包应用、RH 超市、循环器、从合集获取、输出素材、中继、尺寸调整、合并、宫格剪裁、首尾帧获取等通过统一上游聚合或 legacy 字段读取的输入节点。", "约束:素材集第一版只允许同类型素材,故意不做混合素材包,避免破坏当前端口语义、RH 参数映射和运行器类型判断。" ] }, "phase70": { "label": "素材集二版与资源库整套复用 (v1.5.2)", "status": "complete", "items": [ "修复素材集内图像缩略图拖拽排序无反应:图片内容禁用 pointer 事件,缩略项使用自定义 pointer 排序并阻止 ReactFlow 抢拖拽;视频、音频排序逻辑保持不变。", "MaterialSetNode 新增反转顺序、按文件名/文本名排序、随机排序,方便用户快速整理批量素材。", "MaterialSetNode 新增 t8-material-set JSON 导入 / 导出,导出包含素材集类型、素材顺序、文件名、mime、大小和文本内容,导入时会校验 schema 与同类型素材。", "素材集节点右键菜单新增「保存素材集到资源库」,复用原资源库分类选择菜单;保存时整套素材按当前顺序复制到资源库目录。", "资源库新增 set / 素材集类型与默认分类,ResourceLibraryDrawer 增加素材集 Tab,支持整套缩略预览、收藏、重命名、分类、删除和一键插入画布为 material-set 节点。", "后端 resources 路由新增 POST /api/resources/sets/add、GET /api/resources/set/:id、GET /api/resources/set-file/:id/:index;媒体素材复制到 resources/sets//,文本素材写入 manifest,插入后仍可继续传给生成、RH、循环器和工具节点。" ] }, "phase71": { "label": "素材集导入显性化与资源库快捷键 (v1.5.3)", "status": "complete", "items": [ "MaterialSetNode 将原本隐藏在图标里的 JSON 操作改成明确的「导入素材集 / 导出素材集」文字按钮,用户可直接导入 t8-material-set JSON 恢复整套素材。", "导入素材集仍复用 parseMaterialSetBackup 校验 schema 和同类型素材约束;导入会在当前素材集非空时二次确认覆盖,避免误替换。", "App 增加全局 R 快捷键:未选中任何 ReactFlow 节点、且焦点不在 input / textarea / select / contenteditable 时,按 R 打开或关闭资源库。", "CanvasToolbar 快捷键说明同步新增 R 说明,资源库顶部按钮和快捷键保持一致。", "公开版本同步到 1.5.3:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase72": { "label": "RH 主题模板 (v1.5.3)", "status": "complete", "items": [ "新增第四套内置主题 RH风格,参考 RunningHub 工作台观感,提供 light/dark 两套 ThemeTokens。", "主题视觉新增 visuals.style=rh、canvasPattern=hub、nodeFrame=hub-card 与 rh-pulse 合成音乐预设,模板编辑器和后端主题导入校验同步支持。", "新增 theme-rh.css 全局视觉层,覆盖顶部栏、侧边栏、节点卡片、组容器、输入框、端口、连线、MiniMap、Controls、主题音乐按钮和主题预览,保持新节点自动适配。", "RH 皮肤层增加 legacy 内部控件适配器,统一覆盖旧节点里硬编码的标题角标、运行按钮、Tab/segmented controls、状态色、checkbox/radio,避免外壳是 RH 但内部仍是 orange/violet/rose/cyan 节点类型色。", "RH 风格保留科技风兼容层,不引入业务节点分支;后续新增节点只要走 t8-* 变量即可继承该主题。" ] }, "phase73": { "label": "RH 隐藏鸭鸭解码模式收尾 (v1.5.4)", "status": "complete", "items": [ "RH 主题下选中已上传图像的 UploadNode 后,长按顶部浮动 RUN 3 秒切换红色隐藏模式;其他主题、非图像上传和未上传节点不触发。", "隐藏模式运行时批量调用 /api/files/duck-decode 尝试 SS_tools 无密码鸭鸭图解码,成功后按真实 kind 输出 image / video / audio;非鸭鸭图或解码失败静默回退普通上传输出,不打扰用户。", "解码成功的 OutputNode 写入 rhDuckDecoded direct-only 标记,OutputNode 不再通过上游连线重新收集解码前鸭鸭原图,只展示解码后的真实素材。", "RH 主题隐藏态覆盖上传节点、输出节点、端口、选中外圈、Edit/RUN 按钮、缩放角点与隐藏解码连线,统一使用荧光红,与普通 RH 荧光绿状态明确区分。", "DeletableEdge 会根据 edge.data.rhDuckEdge 或目标 OutputNode 的 rhDuckDecoded 自动补 rh-duck-edge 类名,避免隐藏模式连线在重渲染后回到绿色。", "RH 风格默认音乐改为 src/assets/theme-music/rh-tide.mp3;隐藏模式启用后 ThemeMusicToggle 自动切换到 rh-hidden-saya.mp3 并解除静音播放,隐藏模式关闭后若原本未手动播放则自动停止。", "后端 duck-decode 仅允许 /files/input/* 与 /files/output/* 本地文件,不暴露任意路径读取;hiddenFeatures.ts 只保存会话态,不持久化进画布 JSON。", "公开版本同步到 1.5.4:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase74": { "label": "RH 主题音乐与隐藏模式自动播放 (v1.5.5)", "status": "complete", "items": [ "RH 风格默认音乐正式替换为 src/assets/theme-music/rh-tide.mp3,对应用户提供的潮鸣音频;隐藏模式音乐新增 src/assets/theme-music/rh-hidden-saya.mp3,对应用户提供的沙耶之歌主题音频。", "ThemeMusic 类型新增 hiddenTitle / hiddenUrl / hiddenVolume,defaultTemplates 内置 RH 模板改为 URL 音频源并声明隐藏模式备用曲目。", "ThemeMusicToggle 监听 hiddenFeatures.rhDuckUploadIds:RH 隐藏模式开启时自动切换隐藏音乐并解除静音播放;关闭隐藏模式时,如果不是用户手动播放,则自动停止,避免普通 RH 主题意外继续响。", "ThemeTemplateManager 与 backend/src/routes/themes.js 保留隐藏音乐字段,主题模板编辑、保存、导入、导出不会丢失 hiddenTitle / hiddenUrl / hiddenVolume。", "_post_build.cjs 校验五首内置主题音乐 mp3,包含 classic-one-summer-day、pixel-theme-of-sss、op-battle-scars、rh-tide、rh-hidden-saya,防止 Electron 用户包漏带音频资源。", "公开版本同步到 1.5.5:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 全部同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase75": { "label": "火影忍者官方主题 (v1.5.6)", "status": "complete", "items": [ "新增第五套内置官方主题「火影忍者风格」,提供 light/dark 两套 ThemeTokens,整体使用热血橙红、卷轴纸、查克拉蓝和焦黑暗色,不走胶囊糖果风。", "主题模板协议扩展 visuals.style=naruto、iconPack=naruto、canvasPattern=chakra、nodeFrame=shinobi-scroll,并在前端类型、后端导入校验、主题编辑器和内置模板中同步白名单。", "新增 theme-naruto.css 全局视觉层,覆盖顶部栏木叶护额品牌、侧边栏卷轴纸、画布 chakra 纹理、节点卷轴卡片、端口、手里剑连线、MiniMap、Controls、音乐按钮、GroupBox 和主题预览。", "Sidebar 图标包新增 naruto 映射,为上传、输出、图像、视频、音频、RunningHub、工具箱、素材集等节点提供更接近忍者战斗主题的图标语义。", "火影主题默认音乐改为 src/assets/theme-music/naruto-shinsei-gyakuten.mp3,主题音乐按钮默认静音,用户可在主题模板编辑器中上传替换。", "SHIFT 划线断连和连线中点断开按钮接入主题化切断标志:科技风能量刃、像素风像素剑、OP 风格弯刀、RH 风格断链、火影风格手里剑。", "公开版本同步到 1.5.6:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 docs/theme-design-guide.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase76": { "label": "文本分割段落语义与素材集图像工具兼容 (v1.5.7)", "status": "complete", "items": [ "宫格剪裁的上游合集批量拆分继续兼容上传素材多图,同时新增资源库素材集子素材解析:后端 /api/image/* 的图像源解析支持 /api/resources/file/:id 与 /api/resources/set-file/:id/:index,资源库整套插入的素材集也可直接逐张宫格切分。", "图像源解析增加同应用 URL pathname 归一化和资源库路径边界校验,只允许解析资源库数据库声明的 fileRel,避免浏览器可预览但 sharp 后端无法读取的路径断层。", "文本分割按段落模式语义修正:只有至少一个空行才切为新段落,普通换行会保留在同一段里;按行模式继续逐行切分,二者行为重新区分。", "TextSplitNode 的按段落帮助文案同步更新,并将 TEXT_SPLIT_ALGO_VERSION 升到 5,使旧节点缓存的 segmentsOverride 在算法变化后自动失效。", "README 功能亮点同步说明宫格剪裁兼容资源库素材集,以及文本分割按段落 / 按行的边界;公开版本同步到 1.5.7:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase77": { "label": "主题图标按钮、火影悬浮控件与跨平台默认路径 (v1.5.8)", "status": "complete", "items": [ "新增通用 t8-mini-icon-button 小图标按钮语义类,固定 inline-flex、方形比例、line-height 和 SVG 收束,给后续主题区分纯图标按钮与普通文字按钮。", "OutputNode 图像对比入口、ImageCompareModal 关闭按钮、ResourceLibraryDrawer 关闭/收藏/资源卡片操作按钮、CanvasManager 新建画布加号统一接入 t8-mini-icon-button。", "OP 主题新增图标按钮适配层:px-btn--icon、resource-card-action、t8-theme-music-toggle 和 t8-mini-icon-button 在深色/浅色模式下保持小圆按钮,不再被通用 t8-btn/px-btn 悬赏令胶囊样式撑大。", "火影 MiniMap 修正为 absolute 并重置 top/left,避免护额雷达跑到左上角;Controls、ThemeMusicToggle 与 MiniMap 下移并按 RH 风格的底部悬浮位置对齐。", "默认本地保存、画布自动保存、资源库与主题模板路径改由 backend/src/config.js 按平台统一计算:Windows 保持 D:\\zhenzhen,macOS/Linux 使用 ~/zhenzhen。", "settings 路由新增非 Windows 旧默认路径迁移,只迁移精确等于 D:\\zhenzhen / resources / theme-templates 的历史硬编码默认值,用户自定义路径不覆盖。", "前端 apiKeys 默认路径清空,由 /api/settings 回填后端平台默认值;设置弹窗提示同步说明跨平台默认路径策略。", "README 与 features.json 同步补充主题悬浮控件和跨平台路径规范;公开版本同步到 1.5.8:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase78": { "label": "EVA 官方主题 (v1.5.9)", "status": "complete", "items": [ "新增第六套内置官方主题「EVA风格」,提供 light/dark 两套 ThemeTokens,核心视觉为初号机紫、荧光同步绿、警戒橙红、MAGI 指挥所面板和 AT Field 几何纹理。", "主题模板协议扩展 visuals.style=eva、iconPack=eva、canvasPattern=eva-grid、nodeFrame=eva-panel,并在前端类型、后端导入校验、主题编辑器和内置模板中同步白名单。", "新增 theme-eva.css 全局视觉层,覆盖顶部栏 EVA/MAGI 品牌、侧边栏、画布 AT Field 水印、节点装甲卡片、端口、同步连线、MAGI RADAR 小地图、Controls、GroupBox、主题音乐按钮和主题预览。", "Sidebar 图标包新增 eva 映射,为上传、输出、图像、视频、音频、RunningHub、工具箱、素材集等节点提供更接近指挥所/监控台的图标语义。", "SHIFT 划线断连接入 EVA Prog Knife 风格:定义 --t8-cut-cursor、--t8-cut-button-mask、--t8-cut-color、--t8-cut-track,并让连线中点标记呈现同步菱形。", "EVA 主题默认音乐复制到 src/assets/theme-music/eva-decisive-battle.mp3,ThemeMusicToggle 增加 eva-sync 合成兜底,_post_build.cjs 校验 Electron 包会打入该 mp3。", "公开版本同步到 1.5.9:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 docs/theme-design-guide.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase79": { "label": "EVA 浅色可读性修复 (v1.6.0)", "status": "complete", "items": [ "theme-eva.css 增加 EVA light legacy internal-control adapter,统一覆盖老节点内部遗留的 text-white/*、bg-white/*、border-white/*、cyan/violet 标签和状态色。", "RH钱包应用、RunningHub、图像、视频、LLM 等仍使用暗色 Tailwind 工具类的节点,在 EVA 浅色模式下会映射到主题主文字、弱文字、同步绿/警戒红和浅面板背景。", "主题设计规范补充:官方主题不能只检查外壳、端口和背景,也必须检查节点内部标题条、参数标签、实际发送、错误提示、表单与按钮在 light/dark 两种模式下的可读性。", "浏览器验证:切换到 EVA + light 后,RH钱包应用字段标题、Webapp ID、参数与实际发送不再白字漂浮;npm run build 通过。", "公开版本同步到 1.6.0:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 docs/theme-design-guide.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase80": { "label": "画板节点开放与主题浮动控件层级规范 (v1.6.1)", "status": "complete", "items": [ "工具分类正式开放 drawing-board 画板节点,并加入可执行节点集合与顶部 RUN / 批量运行能力;默认尺寸同步为 1120×760,适合左侧设置、右侧创作画布的双列布局。", "DrawingBoardNode 升级为图层式创作画板:默认空白图层,支持新建图层、新建组、图层组折叠、图层可见/锁定、上移/下移/删除、当前图层命名,画笔和图形只写入当前可编辑图层。", "画板支持 1:1、16:9、9:16、4:3、3:4 与自由尺寸,支持载入本地图片或上游图像为独立图层,图片和图形可拖动、四角缩放、顶部旋转,箭头方向保持用户拖拽方向。", "画板节点补齐导入画板 / 导出画板 JSON 与运行输出 PNG;Delete/Backspace 只在焦点仍位于画板节点内时删除内部元素,点击主画布或其他节点后会清空画板内部选中,避免误删。", "Canvas 将 ThemeMusicToggle 与 ReactFlow Controls 合并到 .t8-control-rail,同一轨道负责左下角定位和纵向堆叠,主题只覆盖视觉变量,彻底避免火影 / EVA / OP 等主题喇叭与缩放条漂移。", "index.css 统一主题水印层级合同:.t8-canvas-shell::before/::after 只能作为 pointer-events:none 的背景层,ReactFlow 节点、边、浮层必须在其上方;Naruto / EVA 主题水印不再覆盖画板图片或普通节点。", "EVA 深色模式 NERV 背景水印提高不透明度并取消混合导致的过暗效果,让深色画布也能看出主题标识,同时保持节点内容可读。", "全局右键 / 框选 / 快速添加 / 拖线候选菜单与选中节点 RUN/关闭浮动条纳入主题合同,统一使用 t8-context-menu / t8-node-action-bar,修复 OP、RH、火影、EVA 等主题下菜单不可读或绿色按钮残留。", "LLM/Vision 助手回复右上角新增双打散入口:文档图标会把完整回复生成一个文本节点,剪刀图标保留原智能打散,可按宫格 / 镜头 / 分镜 / 场景 / 序号结构拆成多个独立文本节点;批量选择节点右键新增批量下载,可跳过无素材节点并收集 image/video/audio 与素材集媒体项。", "编辑图片弹窗的宫格切分默认从 2×2 调整为 3×3,并在预设宫格与自定义切线两种模式中给 gap 去缝间距补充滑杆;数字框与滑杆实时互相同步,方便用户快速感知缝隙大小。", "公开版本同步到 1.6.1:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 docs/theme-design-guide.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase81": { "label": "跨画布素材 / 节点发送与 Eagle 入库 (v1.6.2+)", "status": "complete", "items": [ "新增 SendMaterialsModal 发送素材弹窗,框选上传素材、输出素材、素材集或从资源库卡片触发时,会汇总图像 / 视频 / 音频 / 文本并显示素材概览。", "选中多个节点发送到其他画布时,新增“节点片段”模式:复制选中节点本体并保留选中节点之间的内部连线,目标画布仍保持原工作流关系;资源库和 Eagle 入口继续只处理图像 / 视频 / 音频 / 文本素材。", "发送方式支持智能保持、合并素材集、上传素材、拆成多个上传、输出素材;目标画布支持搜索与明确选中态,底部展示当前选择,发送 / 保存 / Eagle 操作都有忙碌反馈。", "Canvas 跨画布写入目标画布 JSON 后刷新画布列表;勾选发送后切换时,会在目标画布加载完成后自动定位到新建素材节点中心,当前画布发送也会聚焦新节点。", "顶部工具条新增任务完成提示音开关,默认开启;仅图像 / 视频 / SD2.0(seedance) / 音频 / LLM 节点成功完成时播放独立轻提示音,和 ThemeMusicToggle 主题音乐通道分开,主题音乐静音不影响提示音,并通过全局 5 秒节流避免批量运行频繁响铃。", "同批素材发送写入 sendBridgeSignature / sendBridgeMode / sendBridgeSourceCanvasId;重复向同一画布发送相同素材时会先替换旧批次,旧版无签名但由发送功能创建的同素材节点也会被清理,避免 2 个素材多次累计成 8 个节点。", "新增后端 /api/eagle/status 与 /api/eagle/import,本地 Eagle API 只允许 localhost / 127.0.0.1 / ::1,支持本地 input/output 文件、资源库文件、资源库素材集文件与文本临时 txt 入库。", "设置页新增 Eagle 本地接口地址,默认 http://127.0.0.1:41595;_post_build.cjs 增加 routes/eagle.t8c 检查,确保 Electron 打包不会漏掉 Eagle 路由。", "公开版本同步到 1.6.2:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase82": { "label": "跨画布素材发送体验优化 (v1.6.3)", "status": "complete", "items": [ "SendMaterialsModal 新增本机发送历史,最多保留 12 条成功发送记录,记录目标画布、发送方式、素材摘要、素材签名与发送时间。", "发送弹窗左侧展示最近 4 条发送历史,点击历史可恢复目标画布与发送方式;目标画布区域新增最近发送画布快捷入口,减少多画布项目中的搜索成本。", "同一批素材再次发送到同一目标画布时,弹窗会显示重复素材提示,提醒用户本次会优先复用既有 sendBridgeSignature 去重替换机制,避免旧发送节点反复堆叠。", "发送目标初始化增加兜底:如果历史中的旧目标画布已不存在,会自动回退到当前画布或第一个可用画布,避免空目标导致用户迷惑。", "公开版本同步到 1.6.3:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase83": { "label": "肖像大师基础可用版 (roadmap phase 1)", "status": "complete", "items": [ "新增 roadmap.md,记录肖像大师四阶段开发要求:基础可用版、Avatar 可视预览、角色库与复用、高级随机与批量角色;负面约束暂不开发。", "工具箱分类新增「肖像大师」节点,类型 portrait-master,节点只输出 prompt/text/metadata,不直接生成图片。", "肖像大师内置基础人物、五官、头发、妆容、身体标记、服装、配饰、气质神情、画面控制 9 大类词库,每个小参数自动补齐到 100 个可选词条,支持不选、锁定随机、权重与自定义补充。", "节点默认输出英文 prompt,同时保留中文 UI 摘要;运行按钮复用工具箱输出协议,会创建或更新下游 OutputNode,也可手动连线给图像、视频、SD2.0、LLM、RunningHub 等节点消费。", "UI 使用 t8-node / t8-card / t8-btn / t8-input / t8-mini-icon-button 主题语义类,随现有多主题模板自动适配。" ] }, "phase84": { "label": "肖像大师 Avatar 可视预览 (roadmap phase 2)", "status": "complete", "items": [ "肖像大师节点的 Avatar 占位预览升级为轻量 SVG 分层预览,显示头发、脸型、肤色、眼睛、眉毛、嘴型、服装、发饰、眼镜/面饰、体表标记和氛围背景。", "portraitMasterOptions 词库新增 previewTag / preview 元数据,并通过 resolvePortraitPreview(selection) 统一汇总预览状态,避免在 UI 里为每个词条写绘图分支。", "配饰大类补充「眼镜/面饰」分组,所有小参数统一扩展为 100 项,既参与 prompt 也驱动 Avatar 可视层。", "Avatar 预览只提供创作方向感,不生成真实图片、不调用后端、不消耗 API;运行输出 metadata 会携带 preview 快照,方便后续角色库阶段复用。" ] }, "phase85": { "label": "画布全貌快捷键与文本节点缩放坐标修复 (v1.6.4)", "status": "complete", "items": [ "新增画布空白处 Z 快捷键,调用 fitView 缩放到当前画布全貌;快捷键面板和 README 同步展示,输入框、节点、弹窗和侧边栏聚焦时不会误触。", "修复文本节点手动拉大/缩小时输出端口与连线分离:ResizableCorners 透出 onResizeEnd,TextNode 在 resize 中、resize 结束和 DOM 尺寸实际变化后都刷新 ReactFlow node internals。", "TextNode 使用 ResizeObserver + 双 requestAnimationFrame 兜底,确保 ReactFlow 读取的是最终落定后的 handleBounds,避免视觉节点尺寸与内部连线坐标晚一拍。", "公开版本同步到 1.6.4:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase86": { "label": "肖像大师 Avatar 与 LLM 默认模型修复 (v1.6.5)", "status": "complete", "items": [ "肖像大师词库扩展为每个小参数 100 个可选词条,README、features 和 roadmap 从“每类百项”统一改为“每个小参数 100 项”。", "Avatar 轻量预览新增发际线遮罩,修复部分发型露出秃顶的问题;预览卡片增高,标签下移,人物主体按身体层与头部/配饰/阴影层分别校正,改善视觉居中。", "肖像大师节点外层从 overflow-hidden 改为 overflow-visible,避免左右 ReactFlow 输入/输出端口被裁成半个。", "LLM/Vision 第一个模型的显示名与实际后端模型 id 统一为 gemini-3.1-flash-lite-preview,减少用户误判。", "公开版本同步到 1.6.5:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase87": { "label": "肖像大师角色库与高级随机批量 (v1.6.6)", "status": "complete", "items": [ "肖像大师编辑器完成 roadmap 第三阶段:支持当前角色 JSON 导出、角色库 JSON 导入/导出、本机常用角色收藏、跨画布发送肖像大师配置、跨画布发送输出 prompt,以及一键在当前画布生成文本节点。", "肖像大师可保存到资源库「角色」分类,沿用现有文本素材集协议保存 t8-portrait-master JSON;资源库插入时会识别该 JSON 并直接恢复为肖像大师节点,避免新增后端资源类型造成兼容风险。", "肖像大师编辑器完成 roadmap 第四阶段:支持随机全部、只填空项、只随机当前大类、重随未锁定项,支持随机种子复现和清纯/御姐/赛博/古风/学院/暗黑/偶像/战斗/洛丽塔/职场等风格包。", "高级随机增加基础冲突规则:套装优先覆盖上衣/下装,帽子/头盔/兜帽类头饰会清理刘海,减少 prompt 自相矛盾。", "批量角色支持一次生成 1-24 条 prompt,可输出为多个文本节点,也可输出为一个文本素材集,方便接入循环器、文本分割、图像、视频、LLM 与 RunningHub 链路。", "公开版本同步到 1.6.6:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase88": { "label": "画布最近节点定位快捷键 (v1.6.6-hotfix)", "status": "complete", "items": [ "新增画布空白处 G 快捷键:未选中任何节点时,以当前屏幕中心对应的画布坐标为基准,定位到最近的普通节点并居中显示。", "G 快捷键复用 Z 全貌视图的防误触边界:输入框、节点、弹窗、侧边栏、工具栏、右键菜单聚焦时不会触发;Ctrl+G 打组逻辑保持不变。", "定位时保持当前 zoom 的自然感并限制在 0.55-1.15 之间,节点居中后添加一次临时高亮,不写入节点 data,避免触发自动保存或跨画布同步副作用。", "快捷键面板、README 和 features.json shortcuts 同步新增 G 说明。" ] }, "phase89": { "label": "幽游白书官方主题 (v1.6.7)", "status": "complete", "items": [ "新增第七套官方主题「幽游白书风格」,以灵界侦探、灵丸能量、霓虹灵界地图、暗紫青绿终端和战斗卡片为核心视觉母题。", "主题枚举、内置模板、后端主题白名单、主题编辑器、默认音乐、顶栏品牌、侧栏图标、MiniMap、GroupBox 和全局菜单全部接入 yyh 视觉分支。", "新增 src/styles/theme-yyh.css,覆盖节点外壳、节点标题、输入框、按钮、端口、连线、选中态、资源库、右键菜单、NodeActionBar、SHIFT 灵剑剪线和 light/dark legacy internal controls。", "公开主题设计规范同步补充 yyh / spirit-map / spirit-case / spirit-gun,幽游白书默认音乐改为 yyh-unbalanced-kiss-piano.mp3;后续官方主题必须同步覆盖全局 UI 表面而不是只换颜色。" ] }, "phase90": { "label": "幽游白书浅色水印独立化 (v1.6.8)", "status": "complete", "items": [ "新增 src/assets/theme-yyh-wordmark-light.svg,作为幽游白书浅色模式专用透明底线稿 / HUD 水印,避免复用深色终端面板导致浅色画布底部出现沉重贴片。", "src/styles/theme-yyh.css 新增 --yyh-wordmark-light-image 与 --yyh-wordmark-active-image,light/dark 自动切换水印;深色继续使用 theme-yyh-wordmark.svg,浅色使用轻量线稿。", "浅色模式下同步降低画布雷达线条、主水印、GroupBox 水印与组内装饰层透明度,让节点和连线保持第一视觉层级。", "README、features.json 与公开主题设计规范同步补充:强风格主题允许浅色 / 深色独立水印,新增主题必须分别检查 light/dark 水印可读性和压迫感。", "公开版本同步到 1.6.8:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 docs/theme-design-guide.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase91": { "label": "幽游白书肖像大师隐藏高级词库 (v1.6.8)", "status": "complete", "items": [ "新增 src/data/portraitMasterAdvancedOptions.ts,肖像大师隐藏高级词库分为内衣层、私房氛围、成人道具三大类,每个小参数自动扩展到 100 个选项,并复用权重、锁定、随机和 JSON 复用协议。", "幽游白书主题下选中肖像大师节点后,长按顶部 RUN 3 秒切换隐藏模式;隐藏模式开启后肖像大师节点、RUN 浮动条、输出节点和相关连线统一进入粉色发光视觉。", "隐藏视觉状态与高级词条安全阻断解耦:即使基础人物触发安全屏蔽,节点本体、编辑器、端口和连线仍保持粉色隐藏模式,只是不拼入隐藏高级 prompt。", "隐藏高级 prompt 只在幽游白书隐藏模式下拼入输出;若基础人物选择包含少女、少年、学生、校园、童话年轻角色等未成年/年轻化信号,会保守阻断隐藏高级词条输出,只保留公开 prompt。", "ThemeMusicToggle 扩展隐藏音乐通道,幽游白书隐藏模式开启时可自动解除静音并切换到专用隐藏曲目 yyh-hidden-tonight.mp3;普通主题音乐仍使用 yyh-unbalanced-kiss-piano.mp3。", "已通过 npm run build;本阶段未打包 Electron。" ] }, "phase92": { "label": "肖像大师批量随机生成修复 (v1.6.9)", "status": "complete", "items": [ "肖像大师批量角色生成不再简单复用当前 prompt:每一条批量结果都会基于基础 seed、序号和重试次数派生独立 seed,按当前随机模式重新生成未锁定选项。", "当随机模式为“只填空项”时,批量输出自动使用“重随未锁定项”的语义,避免已填满角色在批量生成时全部输出同一段文本。", "批量生成保留当前角色锁定项、权重、自定义补充、语言、风格包、幽游白书隐藏模式和隐藏高级词库规则;若偶发重复,会最多重试 12 次并去重。", "公开版本同步到 1.6.9:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase93": { "label": "姿势大师单人线稿基础版 (v1.6.9)", "status": "complete", "items": [ "工具箱分类新增「姿势大师」节点,类型 pose-master,第一版先支持单人人体体块线稿姿态编辑,不做图片识别和多人姿态。", "姿势大师内置 100 种不同常用姿势预设,覆盖站立、行走、跑跳、坐躺、战斗、舞蹈、运动、日常动作与镜头姿态;每个预设都有独立关节点坐标和姿态线稿,不使用镜像凑数。用户可在节点内拖动关节点继续微调,预览与导出会显示更修长的人体比例、头部、躯干、四肢体块、手脚和结构分段线,并提供更宽的姿态白布方便展开动作。", "节点支持视角、景别和中英文 prompt 切换,默认 English prompt;可导入/导出 t8-pose-master JSON,便于复用姿态。", "运行姿势大师会生成 768×1056 PNG 线稿参考图,并同步输出 prompt/text 与 metadata;若下游已有 OutputNode 则更新结果,否则自动创建输出素材节点。", "端口协议为 outputs: image/text/metadata,可把姿势参考图接给图像/视频类节点,把 prompt 接给文本、LLM 或其他可执行节点。已通过 npm run build。" ] }, "phase94": { "label": "姿势大师姿势库与批量分镜增强 (v1.6.9)", "status": "complete", "items": [ "姿势大师在不改变旧版 RUN 单姿势输出的前提下,新增姿势收藏、收藏列表快速套用、当前姿势 JSON 导入/导出,以及 t8-pose-master-library 姿势库 JSON 导入/导出。", "新增多姿势批量输出:支持从当前预设开始连续生成、随机常用姿势、复制当前姿态三种模式,最多一次输出 8 张姿势参考图与对应 prompt/textSegments,适合分镜动作草案。", "新增姿势强度:自然、夸张、漫画感、战斗感、舞台感;默认 English prompt,仍可切换中文 prompt。", "姿势大师可兼容上游 text/image/metadata:肖像大师或视频运镜的文本会自动合并为完整角色动作 prompt,上游图片作为姿态画布淡底参考图显示但不写入导出的参考 PNG,避免污染控制图。", "端口协议扩展为 inputs: text/image/metadata、outputs: image/text/metadata;未连接上游时保持原独立姿势工具行为,旧画布不需要迁移。" ] }, "phase95": { "label": "姿势大师识别与高阶控制 (v1.6.9)", "status": "complete", "items": [ "新增 MediaPipe Pose 前端识别:可导入人物图片,识别 33 个姿态点后转换为姿势大师可编辑骨架;识别只在用户主动导入图片时触发。", "新增多人物姿态:同一姿势画布最多保留 3 个人物骨架,可新增、复制、删除并切换当前编辑人物;输出 PNG 与 metadata 会保留多人结构。", "新增 OpenPose / COCO keypoints JSON 导出,供 ComfyUI / ControlNet 等用户复用;导出内容跟随当前多人姿态与画布坐标。", "新增手部简化控制:左右手分别支持手掌方向、握拳、张开、指向和放松等轻量设置,并自动补充到 prompt 中。", "新增 A/B 关键帧插值:可保存当前姿势为 A/B,设置帧数后输出一组姿态序列参考图,用于视频生成前的动作过渡规划。", "批量分镜和关键帧序列现在只创建或更新一个姿势分镜合集 OutputNode,不再额外生成多个单体输出节点,避免画布重复素材。" ] }, "phase96": { "label": "设置页总导入导出 (v1.6.9)", "status": "complete", "items": [ "API Key 设置弹窗底部在「取消」左侧新增「导入设置」和「导出设置」按钮,作为更换版本时的一键配置备份入口。", "导出设置会读取 /api/settings/raw 明文配置,并生成 t8-penguin-canvas-settings JSON,覆盖贞贞工坊 / RunningHub / LLM 通用 Key、8 类分类独立 Key、文件自动保存路径、画布自动保存路径、资源库路径、主题模板路径和 Eagle 本地接口。", "导入设置只接受白名单字段,自动跳过空值、未知字段和 ****1234 这类脱敏 Key;导入后先回填表单,用户确认后点击「保存」才写入后端,避免误选文件直接覆盖本地设置。", "导出的 JSON 标记 containsSecrets=true 并提示包含明文 API Key,属于私密备份,不能上传 GitHub 或公开分享。" ] }, "phase97": { "label": "姿势大师 OpenPose/COCO 输出与 Grok/Sora FAL 模型扩展 (v1.7.0)", "status": "complete", "items": [ "图像节点新增 Grok Image TAB,复用 gpt-image-2-web 的 Grok Image 调用方式,参考图默认按 base64 传入,并保持 GPT2 / 香蕉 / FAL / MJ 原有链路不变。", "视频节点新增 Sora2 FAL TAB,只保留稳定的 sora-2 (FAL) 模型入口,支持 auto / 文生视频 / 图生视频模式、时长、分辨率、比例、角色 ID 和 IP 阻断等参数,参考图默认 base64 传入。", "Grok Video FAL 从单一图生视频扩展为图生视频 / 参考生视频两种模式;参考生视频支持多张上游参考图和额外 URL,保持普通 Grok、Veo、Seedance、Sora2 互不破坏。", "姿势大师新增线稿图 / OpenPose图 / COCO图三种可见预览与运行输出模式;OpenPose/COCO JSON 导出仍作为独立 keypoints 复用入口保留。", "姿势大师横向画布扩展为多人构图更友好的宽画布,并通过 pointVersion 兼容旧姿势;新增清空按钮、修复最后一个人物无法删除、增加抓取模式,用户可直接拖动整个人物主体。" ] }, "phase98": { "label": "科技风浅色主题一致性与交互热修 (v1.7.1)", "status": "complete", "items": [ "科技风浅色模式新增 legacy node adapter,统一覆盖老节点内部 text-white、bg-zinc/bg-neutral/bg-black、bg-white/5、border-white/cyan/blue、暗色输入框与 placeholder 等硬编码样式,修复经典白天模式下图像 / 文本 / 旧生成节点仍显示黑卡片或浅字的问题。", "顶部栏推广入口、资源库抽屉、设置弹窗和主题模板弹窗支持点击画布空白处关闭,保留充值弹窗既有交互,减少必须二次点击图标关闭的割裂感。", "画布 Ctrl+V 媒体粘贴增加快捷键与原生 paste 事件去重,避免复制截图或文件时同一批素材被创建两次,同时保留节点内部复制粘贴逻辑。", "LLM/Vision 模型列表新增 gemini-3.5-flash,默认模型和其他 LLM 链路保持不变。" ] }, "phase99": { "label": "连线导航模式与媒体默认值热修 (v1.7.2)", "status": "complete", "items": [ "拖线过程中按 Space 可进入连线导航模式:松开鼠标不会取消起点,用户可拖动画布后点击目标接口完成远距离连接,再次按 Space 或窗口失焦会取消;快捷键面板同步新增说明。", "连线导航模式增加画布边缘脉冲与 HUD 提示,视觉色值跟随 --t8-flow-controls-* 主题变量,避免用户无法感知当前是否处于特殊连接状态。", "ReactFlow Controls 统一接入 t8-control-rail 主题变量,修复科技风黑夜模式下缩放控制条和按钮回退为白色导致不可读的问题,并纳入主题设计合同。", "Ctrl+V 媒体粘贴在快捷键与原生 paste 两条路径都按 name/size/type 去重,修复复制截图或文件时偶发创建两个相同上传节点的问题。", "Grok Video FAL 默认模式改为参考生视频;GPT2 图像参考图上限提升到 9 张,满足多图参考工作流。" ] }, "phase100": { "label": "Sora2 FAL 模型入口热修 (v1.7.3)", "status": "complete", "items": [ "视频节点 Sora2 只保留稳定 sora-2 (FAL) 一个具体模型入口,不再显示 sora-2-2025-12-08 / sora-2-2025-10-06 日期版模型,避免用户误选后任务失败。", "前端 VideoNode 会把历史画布里保存的 sora-2-2025-* 自动识别为 Sora2 主模型,避免旧节点因为模型选项被移除而回退到其他视频模型。", "后端 /api/proxy/video/fal/submit 会在校验、选路和 payload 组装前把日期版 Sora2 模型名归一为 sora-2;实际仍走 fal-ai/sora-2/text-to-video 或 fal-ai/sora-2/image-to-video,参考图默认 base64。", "README、features.json 与版本文件同步到 v1.7.3;skill.md 仅本地记录,不参与 GitHub 推送。" ] }, "phase101": { "label": "节点片段发送与任务完成提示音 (v1.7.4)", "status": "complete", "items": [ "跨画布发送弹窗新增「节点片段」模式,框选多个节点发送到其他画布时会复制选中节点自身数据,并保留选中节点之间的内部连线关系;素材 / 资源库 / Eagle 发送仍保持原有素材模式。", "节点片段落到目标画布时会重新映射节点和连线 id,保持相对布局并避开目标画布已有节点;发送后切换目标画布和定位新内容继续可用。", "顶部工具栏新增任务完成提示音开关,默认开启并持久化,提示音与主题音乐分离,主题音乐静音时仍可播放。", "提示音只覆盖图像、视频、SD2.0、音频和 LLM 五类核心生成节点,手动点击节点生成和顶部 RUN / 批量运行都在真实成功完成后触发;5 秒内最多响一次,避免连续任务造成干扰。", "主题 CSS 补充 select / option 兜底、幽游白书 select 样式和模型帮助面板样式,保持多主题下表单与帮助浮层可读。" ] }, "phase102": { "label": "画布 NodeID 与按 ID 连线/查找 (v1.7.5)", "status": "complete", "items": [ "每个画布新增独立递增 NodeID:节点 data.nodeSerialId 从 1 开始分配,同一画布内不重复;删除节点后 nextNodeSerialId 不回退,历史画布加载时会自动补齐缺失或重复编号。", "所有新增节点路径都会走统一编号工具:手动添加、上传、复制粘贴、模板导入、JSON 导入、自动输出节点、框选节点片段发送和跨画布素材发送都会按当前或目标画布的 nextNodeSerialId 重新分配编号。", "节点角标统一显示在 ReactFlow 节点外框右上角,使用 .t8-node-serial-badge 悬浮徽标,不占用节点标题行,避免不同主题或长标题下遮挡节点名称。", "拖线候选菜单顶部新增“发送到ID”,用户输入目标 NodeID 后自动创建兼容连线;无效数字、节点不存在、连接自身、重复连线和端口类型不兼容都会给出失败提示。", "顶部工具栏新增“查找 NodeID”按钮,输入编号后画布自动居中到对应节点并触发节点高亮脉冲,便于大画布快速定位。" ] }, "phase103": { "label": "幽游白书肖像大师隐藏音乐 (v1.7.6)", "status": "complete", "items": [ "幽游白书主题新增内置隐藏曲目 src/assets/theme-music/yyh-hidden-tonight.mp3,普通主题音乐仍使用 yyh-unbalanced-kiss-piano.mp3。", "defaultTemplates 的 YYH 模板声明 hiddenTitle / hiddenUrl / hiddenVolume,肖像大师隐藏模式触发 yyhPortraitIds 后 ThemeMusicToggle 会自动切换隐藏音乐并解除静音。", "electron/_post_build.cjs 增加 yyh-hidden-tonight-*.mp3 前端资源校验,确保正式打包时不会漏带该隐藏音乐。", "公开版本同步到 1.7.6:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase104": { "label": "姿势大师画布比例与抓取变换 (v1.7.6)", "status": "complete", "items": [ "姿势大师左侧画布新增比例控制:支持默认、1:1、4:3、3:4、16:9、9:16、3:2、2:3 和自定义宽高比;画布采用动态 viewBox 并在固定预览区内完整适配显示,避免纵向比例被裁切。", "姿势大师节点数据新增 poseCanvasRatioId、poseCanvasCustomWidth、poseCanvasCustomHeight 和 poseCanvasRatio,当前姿势 JSON、姿势库、关键帧、批量输出、运行 PNG、metadata 与 OpenPose/COCO keypoints 导出都会携带或应用对应画布尺寸。", "抓取模式升级为整个人物变换工具:拖动画布移动人物,S 手柄等比缩放,R 手柄旋转;移动、缩放和旋转都会限制在当前画布边界内,适合多人构图和长画幅姿势调整。", "右侧批量数量与关键帧帧数输入框改为居中数字显示,修复数值贴边导致的视觉不齐。", "验证:npm run build 通过;浏览器实测 9:16、自定义 2:3、S 等比缩放、R 旋转和数量 / 帧数居中样式生效。" ] }, "phase105": { "label": "姿势大师比例显示与上游识别热修 (v1.7.6)", "status": "complete", "items": [ "修复姿势大师切换 16:9 等比例时外层白色固定容器造成的“画布大小没变”错觉:预览承载区高度现在跟随实际画布比例变化,并用主题面板底色区分画布本体与留白区域。", "MediaPipe 识别结果新增头颈连接约束:头部点会基于鼻子、眼睛、耳朵均值估计,并限制与脖子的最大距离,减少侧躺或构图复杂图片中头和身体完全分离的问题。", "姿势大师新增“识别上游”按钮:左侧 image 输入连接图片后,可直接用第一张上游图识别姿态;识别后继续支持线稿图 / OpenPose图 / COCO图预览和运行输出,本地图片入口改为“本地识别”以区分来源。", "上游图像载入增加跨域兜底:优先 anonymous,失败后自动尝试普通图片载入,提高资源库、上传素材和部分外部图像的识别成功率。" ] }, "phase106": { "label": "姿势大师资源库、手部控制与清空背景热修 (v1.7.6)", "status": "complete", "items": [ "资源库新增 pose 类型和默认分类:未分类、常用姿势、动作参考、分镜姿势;后端新增 POST /api/resources/poses/add,以 JSON 保存 t8-pose-master 配置。", "姿势大师节点新增“存资源库”入口,会保存当前人物 / 多人物、手部控制、画布比例、自定义 prompt、metadata、来源节点和画布信息;重复姿势配置会走 sha256 去重。", "资源库抽屉新增姿势卡片视觉,点击插入时会恢复为新的姿势大师节点;App 插入逻辑能读取 t8-pose-master-resource 或裸 t8-pose-master 配置并恢复节点数据。", "ResourceKind 扩展为 image / video / audio / set / pose,同时新增 ResourceMediaKind 限定普通媒体保存仍只接受 image / video / audio,避免 pose 被当成可拖拽媒体素材。", "修复清空姿势大师时传入背景无法清空的问题:清空会写入 poseSuppressedReferenceUrl 隐藏当前上游背景但保留连线,用户重新点击“识别上游”即可恢复背景并重新识别。", "修复左右手手型和掌心方向下拉无效:poseHandControls 现在同步进入 prompt、线稿手部绘制、运行输出、收藏、资源库保存和资源库恢复。" ] }, "phase107": { "label": "SD2.0 上游音频/视频提交格式热修 (v1.7.6)", "status": "complete", "items": [ "修复 SD2.0 节点连接上传音频或视频后提交失败的问题:后端不再把 /files/input、/files/output 或资源库本地 URL 直接作为 reference_audio / reference_video 发送给 Seedance。", "backend/src/routes/proxy.js 的 uploadRefToZhenzhen 升级为图片 / 视频 / 音频统一素材上传入口:本地 URL、资源库 URL、远端 URL 与 dataURL 都会先上传到贞贞 /v1/files,再把返回 URL 写入 Seedance content[]。", "参考 gpt-image-2-web 的 runSeedance 实现补齐 reference_video / reference_audio 上传链路,避免上游返回 Invalid audio/video format;asset-xxx 保持直接透传兼容。", "纯图片生成路径保持原行为,仍复用同一上传函数换取 image_url;新增 mock 路由验证确保最终 Seedance payload 不再包含本地 /files/input/ URL。", "验证:node --check backend/src/routes/proxy.js、npm run build 通过;开发后端已重启到新逻辑。" ] }, "phase108": { "label": "灌篮高手官方主题 (v1.7.7)", "status": "complete", "items": [ "新增第八套官方主题「灌篮高手风格」,使用原创篮球馆视觉母题:木地板球场、红黑球衣、计分牌、篮球橙、传球弧线和战术板,而不是官方角色图、漫画截图或队徽原图。", "主题协议扩展 visuals.style=slamdunk、iconPack=slamdunk、canvasPattern=court、nodeFrame=scoreboard-card、music.preset=buzzer-beater,并在前端类型、后端主题白名单、主题编辑器和内置模板中同步;默认音乐使用 src/assets/theme-music/slamdunk-kimi-ga-suki.mp3。", "新增 src/styles/theme-slamdunk.css,覆盖顶栏品牌、侧栏、画布球场背景、节点计分牌外框、NodeID 球衣号码牌、端口、连线、MiniMap、ReactFlow Controls、主题音乐按钮、右键菜单、拖线候选、NodeActionBar、GroupBox、select/option 和 light/dark legacy internal controls。", "视觉热修新增原创资源 src/assets/slamdunk-court-map.png、slamdunk-jersey-10.png、slamdunk-basketball-v2.png 和 slamdunk-basketball-v2-cursor.png;顶栏品牌 LOGO 使用樱木 10 号球衣,小地图保留 SLAM DUNK 与 SHOHOKU 79 : 78 SANNOH 纪念排版。", "DeletableEdge.tsx 的灌篮主题连线叠加单个 animateMotion 篮球图片精灵,按 edge id 轻微错峰,从出口传到入口;断线按钮和 SHIFT 剪线光标统一使用新版篮球资源,旧中点静态篮球 marker 在灌篮主题下隐藏。", "灌篮高手深色模式下,ThemeMusicToggle 下方 ReactFlow Controls 改为浅色高对比裁判台/记分板边条,按钮图标、禁用态和 hover 态分别强制深色/浅色,避免在深色球场背景中不可读。", "ThemeMusicToggle 保留 buzzer-beater 合成兜底;灌篮高手主题默认走内置 slamdunk-kimi-ga-suki.mp3,默认静音,用户仍可在主题模板管理中上传或填写授权音频 URL 替换。", "验证:npm run build 通过;浏览器验证灌篮主题下每条连线仅 1 个传球篮球,断线按钮/光标使用新版篮球资源,深色模式 ReactFlow Controls 背景、图标和禁用态均有可读对比。", "公开版本同步到 1.7.7:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md、docs/theme-design-guide.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。" ] }, "phase109": { "label": "Grok Video 1.5 FAL 默认模型 (v1.7.8)", "status": "complete", "items": [ "视频节点模型类型下拉顺序调整为 Grok Video / Veo 3.1 / Sora2,新建视频节点默认进入 Grok Video。", "视频节点 Grok Video TAB 的具体模型新增 Grok Video 1.5 (FAL),并作为该 TAB 默认子模型;旧版 grok-video-3 和 grok-video-fal 仍保留可选,历史画布不强制迁移。", "Grok Video 1.5 对齐 gpt-image-2-web v4.5U:走 xai/grok-imagine-video/v1.5/image-to-video,只支持图生视频,最多 1 张参考图,不发送 aspect_ratio 参数。", "Grok Video 1.5 的图像传入模式默认 base64;前端提交固定 image_mode=base64,后端默认使用 refToBananaImage 转换本地/远端参考图后写入 image_url。", "Grok Video FAL 旧版链路继续支持 image-to-video、reference-to-video 和无图 text-to-video fallback;Grok Video 1.5 缺少参考图时会前后端明确报错。", "模型注意事项弹窗同步补充最新视频模型说明:Grok Video 1.5 可作为 SD 平替图生视频,Sora2 支持 sora-vip 分组与 default 默认分组的 FAL 模型,Seedance 预扣/退补规则保持清晰提示。", "公开版本同步到 1.7.8:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次按规范打包 Electron。" ] }, "phase110": { "label": "工作流资源库模板 (v1.7.9)", "status": "complete", "items": [ "资源库新增 workflow 类型和默认分类:未分类、常用工作流、图像流程、视频流程、工具链;后端新增 POST /api/resources/workflows/add,以 t8-workflow-fragment JSON 保存节点片段和内部连线。", "选中一个或多个节点后,右键菜单新增「保存工作流到资源库」;跨画布发送弹窗在「节点片段」模式下也可直接保存为工作流模板,素材模式仍按原图像 / 视频 / 音频 / 文本入库。", "资源库抽屉新增「工作流」TAB,支持独立分类、新建分类、搜索、收藏、重命名、改分类、删除和一键插入当前画布;工作流卡片显示节点数、连线数、主要节点类型和轻量拓扑预览。", "插入工作流复用节点片段实例化逻辑,会重映射节点 id / 连线 id、保持相对布局、避开已有节点,并按当前画布 nextNodeSerialId 重新分配 NodeID,避免复用来源画布编号。", "带内部连线的多节点发送现在会默认并自动优先使用 node-fragment;发送历史不会再把这类工作流选择恢复成 output/material-set/upload 等素材模式,避免 3 个节点发到目标画布变成 2 个输出素材节点。", "新增 src/utils/workflowResource.ts、src/utils/sendMode.ts、tests/workflowResource.test.ts 和 tests/sendMode.test.ts,规范 t8-workflow-fragment 清洗/摘要/恢复、拓扑预览与发送模式优先级;ResourceKind 扩展为 image / video / audio / panorama / set / pose / workflow,ResourceMediaKind 仍只允许普通媒体。", "验证:node --test tests/sendMode.test.ts tests/workflowResource.test.ts、node --check backend/src/routes/resources.js、npm run build 通过。" ] }, "phase111": { "label": "文本节点自由缩放与端口稳定 (v1.7.9)", "status": "complete", "items": [ "TextNode 四角拖拽从同比例缩放改为自由宽高缩放,用户可独立拉宽或拉高长提示词输入区。", "ResizableCorners 新增 keepAspectRatio 参数,默认继续为 true,保证 UploadNode / OutputNode / RHTools 等媒体或工具节点仍保持原来的等比缩放行为;TextNode 通过节点级 resize 行为显式关闭比例锁。", "TextNode 输出 Handle 显式固定在右侧中点,设置 top/right/transform/zIndex/pointerEvents,并在 resize 中、resize 结束和 ResizeObserver 尺寸变化后继续刷新 ReactFlow node internals,防止输出口和连线脱离。", "新增 src/utils/nodeResizeBehavior.ts 和 tests/nodeResizeBehavior.test.ts,锁定 text 节点自由缩放、其他节点默认等比,以及右侧输出口随独立宽高变化保持 right-center anchor。", "公开版本同步到 1.7.9:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次按规范打包 Electron。", "验证:node --test tests/*.test.ts、node --check backend/src/routes/resources.js、npm run build 通过。" ] }, "phase112": { "label": "扩展 API 平台融合路线 (v1.8.0)", "status": "planned", "items": [ "roadmap.md 新增「扩展 API 平台融合路线(参考 Infinite-Canvas)」,把 ModelScope、火山引擎、本地 ComfyUI、即梦 Seedance 2.0 CLI、OpenAI 兼容图像/视频/LLM 作为高级可选扩展平台规划,而不是主侧栏新增大入口。", "设置入口规范为 API 设置页「分类独立 API Key【可选】」下方的「扩展 API 平台【高级/可选】」折叠区,折叠态只显示启用平台、已配置 Key 与 ComfyUI/即梦 CLI 可用状态,未配置不影响主流程。", "节点融合规范为现有图像、视频、SD2.0、LLM 节点的「更多平台/高级来源」小折叠区;旧画布缺省视为 zhenzhen,跨画布发送/导入保留 providerSource/providerId/providerModel/providerParams。", "后端适配规范拆为 backend/src/providers/registry.js、mediaResolver.js、openaiCompatible.js、modelscope.js、volcengine.js、comfyui.js、jimengCli.js,避免把新平台逻辑继续堆进 routes/proxy.js。", "输出协议要求所有扩展平台最终归一为当前 OutputNode、资源库、自动保存、节点发送和 Loop 可识别的 image/video/audio/text/raw/taskId 结构;媒体输入统一交给 media resolver 转换为 URL、base64、asset 或本地路径。", "开发分为 Phase A-F:设置与数据模型、Adapter 骨架与媒体解析、OpenAI 兼容与 ModelScope、火山与即梦 CLI、本地 ComfyUI 工作流、体验收口与回归。", "公开版本同步到 1.8.0:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次按规范打包 Electron。" ] }, "phase113": { "label": "扩展 API 平台后端地基 (v1.8.1)", "status": "complete", "items": [ "新增 backend/src/providers/registry.js,集中维护 openai-compatible / modelscope / volcengine / comfyui / jimeng-cli 的默认卡片、协议枚举、配置归一化、非法 URL/ID/模型过滤、密钥保留与脱敏摘要。", "settings 路由接入 advancedProviders:旧设置会迁移出默认禁用平台卡片,GET 返回脱敏 advancedProviders 与 advancedProviderSummary,/raw 保留内部明文,POST 遇到空值或 masked key 时保留原密钥。", "新增 backend/src/providers/mediaResolver.js,统一处理 dataURL、远程 URL、/files/input、/files/output、/input、/output、本地绝对路径和 file://,按平台需要解析为 URL、base64/data-url 或本地路径。", "electron/_post_build.cjs 新增 providers/registry.t8c 与 providers/mediaResolver.t8c 打包校验,backend/src/providers 新增文件后必须随 encrypt 进入 resources/backend-enc/providers。", "新增 tests/advancedProviders.test.ts、tests/advancedProviderSettingsRoute.test.ts、tests/mediaResolver.test.ts,锁定扩展平台配置脱敏、保存迁移和媒体引用解析。", "公开版本同步到 1.8.1:package.json、package-lock.json、vite.config.ts、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次按规范打包 Electron。" ] }, "phase114": { "label": "扩展 API 平台设置页与测试端点 (v1.8.2)", "status": "complete", "items": [ "API 设置页新增默认折叠的「扩展 API 平台【高级/可选】」真实 UI,折叠态显示启用平台数量、已配置 Key 数量、ComfyUI/即梦 CLI 可用状态,并明确未配置不影响主流程。", "展开态按平台切换 OpenAI 兼容、ModelScope、火山引擎、本地 ComfyUI、即梦 CLI 表单,支持启用开关、Base URL、API Key/Token、模型列表、火山 Project/Region/AK/SK、ComfyUI 实例列表、即梦 CLI 路径/WSL 信息和测试连接按钮。", "前端新增 src/utils/advancedProviders.ts,统一模型列表文本解析、折叠态摘要和 masked key 状态判断;ApiSettings 导入/导出设置会保留 advancedProviders。", "后端新增 backend/src/providers/adapters.js 以及 openaiCompatible/modelscope/volcengine/comfyui/jimengCli adapter 骨架;server.js 挂载 POST /api/proxy/external/test-provider,测试连接返回脱敏 provider,不泄漏明文密钥。", "electron/_post_build.cjs 同步校验 routes/externalProviders.t8c 与所有 provider adapter .t8c,防止新增后端文件未加密进入打包产物。", "公开版本同步到 1.8.2:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次按规范打包 Electron。", "验证:node --test tests/*.test.ts 通过 41/41;node --check 覆盖新增 provider adapter、externalProviders 路由、server/settings;npm run build 与 npm run dist 通过;浏览器冒烟确认设置页可见并展开扩展平台区且 console error 为空;win-unpacked 10 秒启动冒烟通过。" ] }, "phase115": { "label": "版本元数据与 Electron 重新打包 (v1.8.3)", "status": "complete", "items": [ "公开版本同步到 1.8.3:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub。", "本次为发布刷新版本,不新增扩展平台真实生成路径;扩展 API 平台仍停留在设置页、脱敏保存、provider 测试端点与 adapter 骨架阶段,Phase C-F 继续按 roadmap 开发。", "继续按 Electron 打包 SOP 执行 npm run dist、_post_build.cjs 加密产物校验和 win-unpacked 启动冒烟;dist_electron/build 产物不进入 Git。", "未跟踪的本地预览 SVG 不属于本次发布范围,保持不提交。" ] }, "phase116": { "label": "扩展 API 平台真实生成链路 (v1.8.4)", "status": "complete", "items": [ "OpenAI 兼容适配器支持 /chat/completions、/images/generations 与 /videos/generations,结果归一为 text/imageUrls/videoUrls/taskId/raw。", "ModelScope 支持异步图像任务提交与 /tasks/{task_id} 轮询;火山引擎支持 Seedream 图像与 Seedance 视频;即梦 CLI 支持 text2image/image2image/text2video/单图 multimodal2video/多图 multiframe2video。", "ComfyUI 设置页保留工作流 JSON 与参数映射 JSON,后端支持 /prompt 提交、/history 轮询与 image/video/audio/text 输出归一化;图像节点可选择已保存 ComfyUI 工作流。", "图像、视频、SD2.0、LLM 节点在启用扩展平台后显示高级来源折叠区;旧画布和默认路径继续走贞贞工坊 / LLM 独立 Key,不受扩展平台影响。", "新增 /api/proxy/external/image、/api/proxy/external/video、/api/proxy/external/llm,输出统一转存到 /files/output/*,继续兼容 OutputNode、资源库、节点发送、Loop 与自动保存。", "验证:node --test tests/*.test.ts 通过 59/59;npm run build 通过(仅保留既有 chunk size 与 react-vendor 空 chunk 警告);浏览器插件因当前本地 URL 安全策略阻止未做交互冒烟。" ] }, "phase117": { "label": "扩展 API 平台设置页说明与排版优化 (v1.8.5)", "status": "complete", "items": [ "ApiSettings 扩展平台面板新增平台说明卡:解释 OpenAI 兼容、ModelScope、火山引擎、本地 ComfyUI、即梦 CLI 的用途、适用节点、连接方式与模型填写规则。", "扩展平台表单改为分区式信息架构:基础信息、连接密钥/本地 CLI、平台高级项、节点可选模型分开展示,减少 Base URL、Token、AK/SK、workflow JSON 等字段的理解成本。", "扩展平台展开时 API 设置弹窗加宽,左侧平台列表改成清晰的纵向卡片,显示平台名称、启用状态和适用节点,避免像素主题按钮样式导致文字截断或横向挤压。", "顶部摘要简化为已启用数量和密钥数量,详细 ComfyUI/即梦状态移到展开说明里,避免折叠按钮信息过密。", "验证:node --test tests/advancedProviderFrontend.test.ts tests/advancedProviders.test.ts 通过 13/13;npm run build 通过(仅保留既有 chunk size 与 react-vendor 空 chunk 警告);浏览器截图检查当前灌篮主题下无横向溢出。" ] }, "phase118": { "label": "去AI水印完整运行时与打包规范 (v1.8.6)", "status": "complete", "items": [ "remove-ai-watermark 节点固定桥接 wiltodelta/remove-ai-watermarks,上游算法不复制到 T8;T8 负责画布节点、媒体解析、CLI/Python 调用、输出转存和错误文案。", "后端 runner 优先探测 T8_REMOVE_AI_WATERMARKS_RUNTIME、Electron resources/tools/remove-ai-watermarks sidecar、T8_REMOVE_AI_WATERMARKS_BIN、T8_REMOVE_AI_WATERMARKS_SRC、开发期 _external clone,再 fallback PATH CLI。", "状态接口动态返回 upstream version、markKeys 与 optionalFeatures(invisible/lama/detect/trustmark/controlnet/adaptivePolish/esrgan/model/guidanceScale),前端 mark 列表必须以动态结果为准并以 auto/gemini/doubao/jimeng/samsung 兜底。", "完整能力依赖 remove-ai-watermarks[gpu,detect,trustmark,lama]、CUDA Torch、OpenCV 兼容版本和 LaMA/invisible 可选模型;ESRGAN 预放大另需 esrgan extra;缺依赖时后端必须优雅显示未安装或能力不可用,不允许炸后端。", "隐形水印参数在 T8 层钳制安全边界:steps 至少 4,非 0 maxResolution 至少 256,strength 至少保证一个 diffusion timestep,避免上游 diffusers 空 latent 崩溃。", "已同步上游 0.11.0:visible/identify 动态覆盖 Gemini、豆包、即梦、Samsung 可见标记;invisible 默认走 ControlNet + 来源自适应强度,并支持 model、guidance-scale、upscaler、min-resolution、adaptive-polish、unsharp;旧 0.8.9 runtime 仍版本感知兼容 auto/restore-faces,旧 0.8.7 runtime 兼容 protect flags。", "Electron 用户包若要开箱可用,必须准备 tools/remove-ai-watermarks-runtime sidecar runtime,electron-builder 会复制到 resources/tools/remove-ai-watermarks;正式发版可设置 T8_REQUIRE_AI_WATERMARK_RUNTIME=1 强制缺失即失败。", "上游仓库更新后只同步 registry、命令参数、mark/mode/options 与能力探测适配;新增能力必须补 tests/aiWatermarkRunner.test.ts 并更新 README/features/skill 的 Apache-2.0 attribution 与打包说明。" ] }, "phase119": { "label": "图像素材原图悬停预览与编辑舞台完整显示 (v1.8.7)", "status": "complete", "items": [ "上传素材与输出素材的图像卡片新增 hover-only 小眼睛按钮:平时隐藏,鼠标悬停图片卡片后出现;按钮本身使用 t8-mini-icon-button / t8-image-preview-trigger,跟随当前主题变量。", "鼠标移到小眼睛按钮时通过 ImageHoverPreview portal 在 body 上显示原图预览;默认按 naturalWidth/naturalHeight 100% 展示,若超过视口则等比限制到 80vw / 80vh,并用 placeImagePreviewPanel 自动在右侧或左侧避让。", "输出素材图像保留原右上角图像对比入口,新预览按钮固定在对比按钮下方,避免与已有快捷对比 UI 重叠;上传素材图像入口位于图片右上角。", "预览按钮拦截 pointerdown/mousedown/click,避免触发 ReactFlow 节点拖拽或素材 Ctrl 拖拽;图片双击编辑、Ctrl+拖拽发送、下载和打散合集功能保持原样。", "ImageEditModal 非 compose 模式新增 ResizeObserver 读取真实舞台可视尺寸,以 imagePreviewLimit 计算 maxWidth/maxHeight,图片容器 flex 不收缩并居中,修复双击上传/输出图像编辑时上下被裁掉的问题。", "新增 src/components/ImageHoverPreview.tsx、src/utils/imageHoverPreview.ts 与 tests/imageHoverPreview.test.ts,锁定原图预览尺寸收敛和预览面板出屏翻转逻辑。", "公开版本同步到 1.8.7:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次只推源码,不打包 Electron。", "验证:node --test tests/imageHoverPreview.test.ts 通过;npm run build 通过(仅保留既有 chunk size 与 react-vendor 空 chunk 警告);浏览器检查当前画布存在 3 个 preview trigger、默认 opacity=0、hover CSS 与 preview popover 样式已注入。" ] }, "phase120": { "label": "生成节点上游素材单项排除 (v1.8.8)", "status": "complete", "items": [ "MaterialPreviewSection 支持 origin=upstream 的缩略图右下角 X,从当前节点排除单个上游素材;local 素材仍保持原本删除语义。", "排除状态按节点写入 data.excludedMaterialIds,不断开 ReactFlow 连线、不修改源节点、不影响其他下游节点;恢复入口显示为素材区标题右侧的 恢复N。", "图像、视频、SD2.0、音频、LLM、RunningHub、RH 工具节点均接入 filterExcludedMaterials,提交链路使用过滤后的 orderedTexts / orderedImages / orderedVideos / orderedAudios。", "排除项不会进入 prompt、参考图、音频/视频输入、@素材解析、RunningHub 字段自动分配或 RH 工具参数;素材集传入时每个子素材可单独排除。", "新增 src/utils/materialExclusion.ts 与 tests/materialExclusion.test.ts,锁定排除 id 去重、过滤、stale id 计数和恢复计数行为。", "公开版本同步到 1.8.8:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次只推源码,不打包 Electron。", "验证:node --test tests/*.test.ts 通过 73/73;npm run build 通过(仅保留既有 chunk size 与 react-vendor 空 chunk 警告);浏览器检查当前画布存在 5 个上游素材排除按钮且 console error 为空。" ] }, "phase121": { "label": "NodeID 徽标可见卡片锚点热修 (v1.8.9)", "status": "complete", "items": [ "修复部分节点右上角 NodeID 偶发离开节点的问题:徽标不再直接依赖 ReactFlow 节点外层宽度,而是测量同级真实可见节点卡片的右上角作为锚点。", "Canvas.tsx 新增 useNodeSerialBadgeAnchor,定位时跳过 ReactFlow handle 和 NodeID 自身,读取首个节点卡片 sibling 的 getBoundingClientRect,并写入 --t8-node-serial-anchor-left / --t8-node-serial-anchor-top。", ".t8-node-serial-badge 改为 left/top CSS 变量定位,right 固定为 auto,通过 --t8-node-serial-offset-x/y 控制主题偏移;灌篮高手主题只覆盖 offset 变量,不再硬编码 top/right。", "withNodeSerialBadge 仍不增加额外 wrapper,避免破坏灌篮高手、科技风浅色 legacy adapter 等主题里依赖 .react-flow__node > div 的样式选择器。", "新增 tests/nodeSerialBadgeLayout.test.ts,锁定 NodeID 锚点 hook、CSS 变量定位、基础偏移和灌篮主题偏移规范。", "公开版本同步到 1.8.9:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次只推源码,不打包 Electron。", "验证:node --test tests/*.test.ts 通过 74/74;npm run build 通过(仅保留既有 chunk size 与 react-vendor 空 chunk 警告);浏览器刷新后检查当前灌篮主题 17 个 NodeID 均写入锚点变量且 console error/warn 为空。" ] }, "phase122": { "label": "画板放大编辑与 RH 文本绑定收口 (v1.9.0)", "status": "complete", "items": [ "画板节点套索/钢笔抠图走非破坏式新图层输出;抠图成功后自动切回选择工具并清掉加载提示,避免用户继续停在抠图状态误操作。", "画板节点新增放大编辑窗口,主窗口和放大窗口共用完整 layer panel:新建图层、新建组、组折叠、显示/隐藏、锁定/解锁、拖拽排序、移动到组、删除、导出与当前图层编辑能力一致。", "放大编辑窗口的 canvas 使用 displaySize + devicePixelRatio 作为真实 backing store,并启用 high quality image smoothing;放大后直接重绘图层内容,避免把节点内缩略预览二次放大造成模糊。", "视频素材预览统一使用 LoopingVideo 与 src/utils/videoPlayback.ts,上传素材、输出素材、资源库、视频/SD2.0/RH/循环器/素材选择等节点的视频播放器默认 loop、playsInline、preload=metadata。", "文本节点新增 RH 节点序号字段;RunningHub、RH 钱包应用与 RH 超市会把上游文本按 RH nodeId 自动绑定到 TEXT/STRING 参数,也允许在参数区手动选择上游文本,冲突和非文本字段会保留清晰状态。", "公开版本同步到 1.9.0:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次只推源码,不打包 Electron。", "验证:node --test tests/*.test.ts 通过 93/93;npm run build 通过(仅保留既有 chunk size 与 react-vendor 空 chunk 警告);浏览器冒烟检查画板放大窗口有完整图层控制、canvas 按实际尺寸重绘且 console error 为空。" ] }, "phase123": { "label": "自定义快捷键设置面板 (v1.9.1)", "status": "complete", "items": [ "顶部工具栏原快捷键说明入口升级为快捷键设置面板,支持按动作录制组合键、清空单项、恢复单项默认和全部恢复默认。", "新增 src/utils/keyboardShortcuts.ts 作为默认快捷键与校验的单一来源;新增 src/stores/shortcuts.ts 通过 zustand persist 保存到 t8-canvas-shortcuts,并在加载旧配置时合并缺省动作。", "Canvas.tsx、CanvasToolbar.tsx 与 App.tsx 的撤销、重做、复制、粘贴、连边粘贴、快速复制、删除、全选、打组、画布全貌、最近节点、资源库和连线导航均改为读取快捷键 store,菜单文案和连线 HUD 会同步显示用户配置。", "快捷键录制会拒绝纯修饰键、浏览器/系统保留键和同作用域冲突;资源库快捷键按 canvas 作用域处理,因此会与 Z/G 等画布空白快捷键统一冲突检测。", "鼠标类操作仍作为只读说明展示,避免把拖拽、滚轮、右键菜单等复杂交互误开放成键盘绑定。", "公开版本同步到 1.9.1:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次只推源码,不打包 Electron。", "验证:node --test tests/keyboardShortcuts.test.ts、node --test tests/*.test.ts 与 npm run build 通过;浏览器检查快捷键设置面板可打开,包含录制/清空/默认/全部恢复默认入口且 console error/warn 为空。" ] }, "phase124": { "label": "宫格编辑节点第一版 (v1.9.2)", "status": "complete", "items": [ "新增可见工具节点 grid-editor / 宫格编辑,左侧接 image、右侧输出 image,用于多图分镜宫格拼版;与已有 grid-crop 宫格剪裁形成拼接/拆分互补。", "支持横向 cols 与纵向 rows,预设 2×2、3×3、3×4、4×3、1×4、4×1;支持 1:1、4:3、16:9、9:16 和自定义宽高,输出 PNG。", "节点会自动收集上游图像,也允许在格子 + 或上传按钮中追加本地图像;格子内图片可拖拽排序、单格删除,删除上游图只影响当前节点,不断开连线。", "支持 gap、背景色、adaptive/cover/contain/fill 适配和序号叠加;默认自适应完整显示图像,节点预览按真实输出比例滚动展示,素材超过格子数量时显示溢出提示,并可自动扩容行数。", "新增后端 POST /api/image/grid-compose,使用 sharp 按 rows/cols/width/height/gap/background/fit/showIndexes/cells[] 生成拼接图并保存到 /files/output。", "拆分按钮第一版会把当前已填格子的图片顺序写入 imageUrls / urls,继续复用现有输出素材、资源库和节点发送链路。", "公开版本同步到 1.9.2:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;本次只推源码,不打包 Electron。" ] }, "phase125": { "label": "宫格编辑尺寸输入与扩展 API 设置热修 (v1.9.2)", "status": "complete", "items": [ "宫格编辑宽/高数字框改为编辑中 draft 状态,用户清空或输入中间态时不再立刻被 normalizeGridEditorConfig 钳制回 64;失焦或回车后再提交并按 64-4096 范围归一。", "宫格编辑比例下拉新增稳定的 GRID_EDITOR_CUSTOM_RATIO_VALUE='custom',gridEditorRatioSelectValue(width,height,mode) 作为显示值唯一来源;选择自定义只写 ratioMode,不再被当前宽高字符串覆盖。", "自定义宽高提交会自动标记 gridEditorRatioMode='custom';选择 1:1 / 4:3 / 16:9 / 9:16 预设时才同步改写 width/height,避免比例选择和尺寸输入互相抢状态。", "扩展 API 平台表单的 AdvancedProviderFormBlock 提升为顶层组件,禁止在 renderAdvancedProviderForm 内定义 const FormBlock,避免 React 每次输入都重挂载字段导致焦点丢失和中文 IME 中断。", "ModelScope 连接密钥区新增“获取 Token · 国内”和“获取 Token · 国外”两个外链入口,分别打开 https://www.modelscope.cn/my/access/token 与 https://www.modelscope.ai/my/access/token。", "新增/更新 tests/gridEditor.test.ts 与 tests/apiSettingsTheme.test.ts,验证自定义比例、尺寸 draft、扩展平台字段不重挂载和 ModelScope Token 链接;发布前需跑 node --test tests/gridEditor.test.ts tests/apiSettingsTheme.test.ts、node --test tests/*.test.ts 与 npm run build。" ] }, "phase126": { "label": "扩展平台与即梦 CLI 生成链路热修 (v1.9.3)", "status": "complete", "items": [ "ModelScope LLM 调用改为稳定的 OpenAI 兼容路径:baseUrl 自动补 /v1,API Key 提交前剥离重复 Bearer,默认模型为 Qwen/Qwen3-235B-A22B,长任务超时提升到 30 分钟。", "ModelScope 与火山引擎按 Infinite-Canvas 侧已拉取模型补齐默认模型列表;旧配置里 imageModels/videoModels/chatModels 为空时会自动合并默认项,启用平台后节点下拉不再空白。", "即梦 CLI 图像和视频生成会在初始返回 submit_id / querying 且没有媒体时继续执行 dreamina query_result --submit_id= --download_dir=,支持解析 result_json 字符串或对象里的 images/videos/path/url。", "即梦 CLI 输出若已经下载到 config.OUTPUT_DIR 会直接映射为 /files/output/;查询结果缺字段时会按 submit_id 扫描 output 目录兜底,避免后台已生成但画布提示未返回图片/视频。", "SD2.0 节点选择即梦 CLI 扩展来源时隐藏贞贞 API 专属 Model、音频生成、返回末帧、水印、Web Search、Max Poll、Interval 等字段,只保留通用时长/比例/分辨率/参考素材/Prompt,并通过 multimodal2video 传递图片、视频、音频参考。", "API 设置页的即梦 CLI 表单新增安装说明:curl -s https://jimeng.jianying.com/cli | bash、dreamina login、Windows 常见路径、PATH 填写和 WSL 发行版填写方式。", "去AI水印运行时探测与日志增强一起纳入当前源码版本:优先 Python module 轻量探测 remove-ai-watermarks,缓存能力结果;运行时在终端实时打印 runId 分组 stdout/stderr/step 日志,Electron sidecar README 记录 Python 优先探测规则。", "公开版本同步到 1.9.3:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次只推源码,不打包 Electron。", "验证要求:node --test tests/modelscopeProvider.test.ts tests/jimengCliProvider.test.ts tests/advancedProviders.test.ts tests/apiSettingsTheme.test.ts tests/aiWatermarkRunner.test.ts、node --test tests/*.test.ts 与 npm run build。" ] }, "phase127": { "label": "ModelScope 图像 LoRA 与去AI水印 0.8.7 同步 (v1.9.4)", "status": "complete", "items": [ "ModelScope 扩展平台新增 LoRA 列表配置,设置页可增删改显示名、模型 ID、默认权重与适用说明;空旧配置会自动合并内置默认 LoRA。", "图像节点选择 ModelScope 扩展来源时新增 LoRA 多选与官方权重输入,v2.0.5 修正为单次最多 5 个 LoRA;多 LoRA UI 显示总权重 当前/1.00、剩余可分配权重和“均分到 1.00”,并在输入时阻止总和超过 1.00;节点保存 providerParams.modelscopeLoras 选择数组,提交时通过 providerParams.loras 传给后端,不影响贞贞主流程与其他扩展平台。", "后端 modelscope adapter 在图像生成请求中接收 input.loras / providerParams.loras / legacy 字段,清洗后写入 payload.loras,保持旧画布无 LoRA 时行为不变;旧画布或手写 JSON 的 LoRA 权重超额时会兜底归一化为 ModelScope 官方要求的总和 1.00。", "默认 LoRA 列表从 Infinite-Canvas 同步:Daniel8152/film、Daniel8152/Qwen-Image-2512-Film、Daniel8152/Klein-enhance;默认项同时维护在 backend/src/providers/registry.js 与 src/utils/advancedProviders.ts。", "去AI水印外部 clone 已同步到 wiltodelta/remove-ai-watermarks v0.8.7 / b25276c;runner 版本探测优先读取实际导入模块的 __version__,避免全局旧 pip metadata 误报。", "去AI水印 invisible 参数适配 0.8.7:保护文字/人脸为实验 opt-in,只有用户开启时才发送 --protect-text / --protect-faces;强度留空时不发送 --strength,让上游按 C2PA/SynthID 来源自适应。", "tools/remove-ai-watermarks-runtime/README.md 同步要求 sidecar runtime 目标为 0.8.7+;正式 Electron 用户包若要求去水印开箱可用,必须重建 runtime 后再打包。", "公开版本同步到 1.9.4:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次只推源码,不打包 Electron。", "验证要求:node --test tests/*.test.ts、npm run build,并至少覆盖 tests/modelscopeProvider.test.ts、tests/advancedProviders.test.ts、tests/advancedProviderFrontend.test.ts、tests/apiSettingsTheme.test.ts 与 tests/aiWatermarkRunner.test.ts。" ] }, "phase128": { "label": "RH工具箱与开发态制作器节点 (v1.9.4)", "status": "complete", "items": [ "新增可见 RH 节点 rh-toolbox / RH工具箱:用户只能运行维护者精选应用,不能在客户端新增或编辑工具;工具、分类、输入映射、用户参数、固定参数、输出协议全部由 src/data/rhToolboxManifest.ts manifest 驱动。", "新增统一运行服务 src/services/rhToolbox.ts 与协议工具 src/utils/rhToolbox.ts:按 inputSchema 从上游 text/image/video/audio 取值,媒体可自动 uploadRhAsset,提交 submitRh 后轮询 queryRh,输出归一为 text/image/video/audio/url/taskId,便于后续图像编辑、视频放大、文本扩写、音频克隆等快捷功能复用。", "RH工具箱节点接入上游素材拖拽排序和单项排除,使用 MaterialPreviewSection 过滤 excludedMaterialIds,不断开连线、不影响其他下游节点;多媒体输出继续走 OutputNode、资源库、自动保存、节点发送和 Loop 可识别协议。", "新增开发态专用节点 rh-toolbox-maker / RH工具箱制作器:仅 import.meta.env.DEV 下注册到 Canvas、nodeRegistry、portTypes 和默认 data;可填写 WebApp ID、拉取 RH nodeInfoList、将字段一键加入上游输入/用户参数/固定参数/输出映射,并生成标准工具 JSON。", "制作器保存的开发草稿只进入 localStorage,通过 src/utils/rhToolboxDeveloper.ts 动态合并到 RH工具箱节点;普通运行服务和生产 manifest 不依赖开发草稿模块,避免用户包携带维护者制作入口。", "Electron 后置检查 electron/_post_build.cjs 新增 checkNoRhToolboxMaker,禁止 resources/frontend 中出现 RHToolboxMakerNode、RH工具箱制作器 或 rh-toolbox-maker;生产 dist 已用 rg 扫描确认无残留。", "测试新增 tests/rhToolbox.test.ts,覆盖节点注册、manifest 规范、nodeInfoList 构造、统一 runner、制作器开发态注册与生产隔离;验证通过 node --test tests/rhToolbox.test.ts、node --test tests/*.test.ts 与 npm run build。" ] }, "phase129": { "label": "ComfyUI 本地工作流简化接入 (v1.9.4)", "status": "complete", "items": [ "roadmap.md 新增「ComfyUI 本地 API 简化接入路线」,明确 ComfyUI 仍是扩展 API 平台高级来源,默认不影响贞贞工坊、RunningHub 与 LLM 独立 Key 主流程。", "新增 src/utils/comfyuiWorkflow.ts,导入 API Workflow 后自动识别 CLIPTextEncode、LoadImage、EmptyLatentImage、KSampler、SaveImage/PreviewImage 等常见节点,并生成正向/负向 Prompt、上游图片、宽高、Seed、Steps、CFG、Sampler、Scheduler、Denoise 的推荐映射。", "API 设置页的 ComfyUI 区从纯 fields JSON 改为可视化参数映射:显示识别结果、输出数量、警告信息、来源下拉、固定值输入和删除入口;高级用户仍可展开直接编辑 fields JSON,兼容旧配置。", "后端 comfyui adapter 支持 fields source=image1/image2/image3,会把图像节点上游素材解析为本地文件或 URL,上传到 ComfyUI /upload/image 后写入 LoadImage.image,再提交 /prompt 并轮询 /history。", "图像节点选择 ComfyUI 高级来源时会提示当前工作流需要的上游图片数量和已准备数量,缺图时给出明确提示,减少运行后才失败的挫败感。", "验证通过 node --test tests/advancedProviders.test.ts tests/apiSettingsTheme.test.ts tests/advancedProviderFrontend.test.ts tests/comfyuiProvider.test.ts、全量 node --test tests/*.test.ts 与 npm run build。" ] }, "phase130": { "label": "足球小将官方主题 (v1.9.4)", "status": "complete", "items": [ "新增第九套官方主题「足球小将风格」,内部协议使用 visuals.style=soccer-hero、iconPack=soccer、canvasPattern=pitch、nodeFrame=match-card、music.preset=golden-goal,避免把官方 IP 或素材硬编码到业务组件。", "新增并收口原创足球主题资产:src/assets/soccer-jersey-tsubasa-v2.png 用于顶栏蓝白 10 号球衣 logo,src/assets/soccer-ball-v2.png / soccer-ball-v2-cursor.png 用于连线足球精灵、SHIFT 剪线和断线按钮,src/assets/soccer-pitch-map.svg 用于整场球场背景与全场 MiniMap。", "新增 src/styles/theme-soccer.css,覆盖顶栏品牌、侧边栏、整场球场背景、节点比赛卡外框、NodeID 徽标、端口、连线、MiniMap、ReactFlow Controls、主题音乐按钮、右键菜单、拖线候选、NodeActionBar、GroupBox、select/option 与 light/dark legacy internal controls。", "DeletableEdge 新增足球主题专用 soccer-ball animateMotion 精灵,每条连线同时只显示一个足球,和灌篮主题篮球精灵互不串资源。", "主题模板管理器、后端主题白名单、ThemeMusicToggle、App 顶栏、Sidebar 图标包和 Canvas MiniMap 均同步 soccer-hero;足球主题标题使用 Captain Tsubasa,比分牌使用 Japan 3:2 Brazil,球场 SVG 顶部两块标题牌整体以中线视觉居中且文字使用 text-anchor=middle 防止偏移或溢出;默认音乐使用 src/assets/theme-music/soccer-tsubasa-burning-hero.mid,ThemeMusicToggle 可解析 MIDI 并循环播放,golden-goal 仅作为兜底 preset。", "验证要求:node --test tests/apiSettingsTheme.test.ts、node --test tests/*.test.ts 与 npm run build。" ] }, "phase131": { "label": "云端上传目标与素材右键上传 (v1.9.4)", "status": "complete", "items": [ "roadmap.md 新增「云端上传目标路线」,明确该能力作为资源库之外的外部归档 / 分享入口,默认不影响生成、资源库、节点发送和自动保存主流程。", "API 设置页新增默认折叠的「云端上传目标【可选】」区,支持腾讯云 COS、阿里云 OSS、百度网盘和夸克网盘四个目标的显示名、启用开关、默认目标、路径前缀、配置检查和密钥脱敏保存;表单继续使用 t8-api-settings 语义类保证各官方主题可读。", "后端 settings 路由新增 cloudUploadTargets / cloudUploadSummary,保存时遇到空值或 **** 脱敏值会保留旧密钥,GET 返回 SecretId/SecretKey/AccessKey/Token/Cookie 的脱敏状态。", "新增 backend/src/routes/cloudUploads.js、backend/src/cloudUploads/settings.js、backend/src/cloudUploads/uploader.js:提供 GET /api/cloud-uploads/status、POST /api/cloud-uploads/test、POST /api/cloud-uploads/upload。", "腾讯云 COS 与阿里云 OSS 第一版支持真实上传,按 t8-canvas/{kind}/{yyyy-mm}/filename.ext 生成对象 key,可选公共域名返回直链;百度网盘和夸克网盘先保留清晰配置位和友好错误,等待稳定 OAuth/CLI 授权方案后接入真实上传。", "素材右键菜单新增「上传到云端」分区,复用 data-drag-source 协议,UploadNode / OutputNode / 资源库卡片等图像、视频、音频素材可以直接上传;上传成功后自动尝试复制云端 URL 或对象路径。", "electron/_post_build.cjs 纳入 routes/cloudUploads.t8c 与 cloudUploads/settings.t8c、cloudUploads/uploader.t8c 校验,避免 Electron 包漏带新后端模块。", "新增 tests/cloudUploads.test.ts,覆盖默认目标迁移、密钥保留、脱敏、摘要、对象 key 生成和网盘占位错误;验证通过 node --test tests/cloudUploads.test.ts、全量 node --test tests/*.test.ts 与 npm run build。" ] }, "phase132": { "label": "主生成节点轮询等待统一 3600 秒 (v1.9.4)", "status": "complete", "items": [ "音频 Suno 节点从 3s×60=180s 调整为 3s×1200=3600s,长歌词、翻唱、续写任务不会再 3 分钟提前报轮询超时。", "图像节点标准 GPT2 / nano-banana 路径保持 2s×1800=3600s;FAL 图像从 600×3s=1800s 调整为 1200×3s=3600s;MJ 默认 maxPoll 改为 1200,旧节点保存的较小 maxPoll 会在运行时按 pollInt 自动补足到 3600s。", "视频节点普通异步轮询从 480×5s=2400s 调整为 720×5s=3600s;FAL 视频继续使用 600×6s=3600s 并改为同一常量表达。", "SD2.0 / Seedance 节点保留用户可调 Max Poll / Interval,但实际运行会按当前 interval 自动补足到至少 3600s,避免历史配置或短 interval 造成提前超时。", "扩展 API 平台的图像/视频入口统一给 3600s 兜底:ModelScope 图像异步 deadline 从 120s 抬到 3600s,本地 ComfyUI /history 轮询按间隔补足 3600s,火山图像与视频轮询抬到 3600s,即梦 CLI pollSeconds 默认与归一化均为 3600s。", "批量运行与循环器等待节点完成的安全超时从 5 分钟改为 60 分钟,避免节点自身还在轮询时被上层执行链提前判定失败;LLM 节点自身超时策略未纳入本次改动。" ] }, "phase133": { "label": "ComfyUI 超市与应用制作工具节点 (v1.9.4)", "status": "complete", "items": [ "roadmap.md 新增「ComfyUI 超市与应用制作工具路线」,明确该能力是扩展 API 平台下方的画布级入口:高级来源继续保留,ComfyUI超市负责一键运行,ComfyUI应用制作工具负责把 API Workflow 制作为标准应用。", "新增可见分类 comfyui / ComfyUI,包含 comfyui-store「ComfyUI超市」和 comfyui-app-maker「ComfyUI应用制作工具」两个节点;制作工具不是开发态隐藏节点,普通用户也可导入 workflow 制作自己的本地应用。", "新增 src/utils/comfyuiApps.ts、src/data/comfyuiAppManifest.ts 与 src/services/comfyuiApps.ts,定义 t8-comfyui-app-manifest 协议、分类/应用/参数/输出规范、本地存储、导入导出、应用运行和 provider 动态注入。", "ComfyUI应用制作工具支持上传或粘贴 API Workflow JSON,自动识别正向/负向 Prompt、图片/视频/音频输入、宽高、batch、seed、steps、cfg、sampler、scheduler、denoise、model/clip/vae/lora 等字段,可保存到 ComfyUI超市、复制 JSON 或导出应用包。", "ComfyUI超市支持分类、搜索、导入应用 JSON、选择已启用的 ComfyUI provider、读取上游 text/image/video/audio 素材、编辑用户参数、运行后输出 image/video/audio/text,并复用 OutputNode、资源库、节点发送和 Loop 可识别协议。", "后端 comfyui adapter 增强真实运行 patch:providerParams.seed 可生效;旧 heuristic fallback 只在没有明确映射时兜底,避免 Anima 类工作流把 sampler negative 连接的 CLIPTextEncode 冲成正向 Prompt。", "图像节点选择 ComfyUI 扩展来源时不再显示 GPT 比例/尺寸参数块,而是显示工作流字段面板,并按 workflow width/height/batch/seed/model 等映射生成 ComfyUI 参数,修复“原始 ComfyUI 工作流参数显示成 GPT 参数”的问题。", "实测 C:\\(动漫抽卡神器)Anima+V1.0正式版自动提示词文生图V4 (2).json:自动识别 14 个字段,真实提交本机 ComfyUI 26 秒返回图片;复测确认 #91 正向 Prompt、#87 负向 Prompt、512x512 与 seed 均正确注入。", "验证通过 node --test tests/comfyuiProvider.test.ts、node --test tests/advancedProviders.test.ts tests/advancedProviderFrontend.test.ts、npm run build;后续发布前仍建议跑全量 node --test tests/*.test.ts。" ] }, "phase134": { "label": "ComfyUI 字段映射旧值覆盖热修 (v1.9.5)", "status": "complete", "items": [ "修复本地 ComfyUI 图像生成时,fields 映射里残留 value 会覆盖 source=prompt / image1 / width / height 等运行时输入的问题;现在只有 source=fixed 才允许 value 写入 workflow,其它来源一律从当前节点 Prompt、上游素材和 providerParams 读取。", "src/utils/comfyuiWorkflow.ts 的 compactComfyFields 会清理非 fixed 来源的旧 value;旧手写 fields 若只有 value 没有 source,则继续按 fixed 兼容,避免破坏历史高级配置。", "backend/src/providers/registry.js 归一化 ComfyUI workflow fields 时同步清理非 fixed value;backend/src/providers/comfyui.js 执行 patch 时也做后端兜底,旧设置即使已经保存了脏字段也能正确运行。", "API 设置页手动编辑 fields JSON 和可视化来源下拉都会通过 compactComfyFields 保存,避免用户再次把 prompt/image/width/height 映射变成固定旧值。", "新增 tests/comfyuiProvider.test.ts 回归用例,覆盖 prompt、上游图片上传、宽高和 fixed 固定值并存时的优先级;tests/advancedProviders.test.ts 覆盖后端归一化行为。", "公开版本同步到 1.9.5:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;skill.md 仅本地更新,继续禁止推送 GitHub;本次只推源码,不打包 Electron。", "验证通过 node --test tests/comfyuiProvider.test.ts、node --test tests/advancedProviders.test.ts、node --test tests/advancedProviderFrontend.test.ts tests/apiSettingsTheme.test.ts tests/comfyuiProvider.test.ts tests/advancedProviders.test.ts、全量 node --test tests/*.test.ts 与 npm run build。" ] }, "phase135": { "label": "LLM 视频输入增强与 GitHub 公开发布安全收口 (v1.9.5-public)", "status": "complete", "items": [ "LLM 节点视频传入改为可选关键帧数量:默认 12 张、最高 60 张,后端通过内置 ffmpeg 按整段视频均匀抽帧;原视频 Base64 / 压缩 Base64 模式保持原生 video_url,不再被静默改成 6 张关键帧。", "backend/src/providers/llmMedia.js 成为贞贞 LLM 与扩展平台 OpenAI 兼容 LLM 的统一多模态媒体归一化入口,避免视频、图片、URL 与 /files 本地路径在不同 LLM 通道行为分裂。", "项目内置 tools/ffmpeg-runtime/ffmpeg.exe,并由 package.json extraResources 复制到 Electron resources/tools/ffmpeg;_post_build.cjs 校验 providers/llmMedia.t8c 与 ffmpeg.exe,用户包不依赖系统 PATH。", "GitHub 公开源码安全收口:公开版本移除顶部充值入口、RechargeModal 前端组件、/api/recharge 与 /pay 后端挂载、后端充值路由源码及前端 recharge API;本地私有能力只能作为 .gitignore 覆盖层或私有补丁存在。", "features.json.packaging.publicReleasePolicy 与本地 skill.md 已记录推送规则:默认不 stage / commit / push roadmap.md、skill.md 或任何私有计费/支付/充值实现,推送前必须检查 staged 文件列表和 staged diff。", "验证通过:node --test tests/*.test.ts(169/169)与 npm run build;build 仅保留既有 react-vendor empty chunk 与大 chunk 提示。" ] }, "phase136": { "label": "画布对齐防堆叠与 Electron 打包 (v1.9.6)", "status": "complete", "items": [ "修复对齐菜单基础按钮把多个节点叠在一起的问题:左 / 水平中 / 右对齐后如果选区节点原本同排或高度重叠严重,会按原顺序沿垂直方向排开;上 / 垂直中 / 下对齐同理沿水平方向排开。", "水平等距 / 垂直等距在选区跨度不足、常规间距为负数时改为从第一个节点开始扩展排布,避免大节点被中心点算法硬挤重叠。", "混合选区里同时选中 groupBox 与普通节点时,对齐只整理普通节点,避免组框的大尺寸把选区边界拉偏;单独选中 groupBox 时仍保留旧能力,移动组框并联动成员节点。", "Canvas 调用 applyNodeAlignment 时显式传入 alignGap=32,src/utils/nodeAlign.ts 保持纯函数实现并新增 NodeAlignOptions.alignGap,方便后续在 UI 中做可调间距。", "roadmap.md 已在本地记录对齐功能检查与后续增强点,但按 GitHub 公开安全策略不随本次推送;skill.md 仅本地更新,继续禁止 stage / commit / push。", "本次按规范打包 Electron:package.json / package-lock.json / vite.config.ts/js / electron/main.cjs / backend/src/config.js APP_VERSION / features.json / README.md 同步到 1.9.6;用户包要求继续带 remove-ai-watermarks runtime 与 ffmpeg sidecar。验证通过 node --test tests/nodeAlign.test.ts、全量 node --test tests/*.test.ts(173/173)与 npm run build。" ] }, "phase137": { "label": "即梦 CLI Seedance 多素材参考与 Electron 打包 (v1.9.7)", "status": "complete", "items": [ "视频节点选择扩展 API 平台的即梦 CLI Seedance 后,预览区和本地拖入区切换为即梦参考素材规则,最多接收 9 张图像、3 个视频、3 段音频,不再显示 Grok Video 1.5 的单图限制说明。", "VideoNode 提交扩展平台视频时会把 images / videos / audios 一起传给 generateExternalVideo;端口表允许 video/audio 连入视频节点,非即梦模式仍保持原有 text/image 使用体验。", "后端 dreamina / 即梦 CLI 适配器在 multimodal2video 中按 9/3/3 上限解析本地或上游素材;纯多图 multiframe2video 上限同步提升到 9 张,并统一带上 model_version 与 video_resolution。", "新增回归测试覆盖即梦 Seedance 9 图 / 3 视频 / 3 音频裁剪、multiframe 9 图、前端隐藏 FAL 专属控件并发送 videos/audios、视频端口允许 audio/video 连线。", "本次按规范打包 Electron:package.json / package-lock.json / vite.config.ts/js / electron/main.cjs / backend/src/config.js APP_VERSION / features.json / README.md 同步到 1.9.7;用户包继续要求 remove-ai-watermarks runtime 与 ffmpeg sidecar。GitHub 公开源码仍排除 roadmap.md、skill.md 与本地私有计费/支付/充值 overlay。" ] }, "phase138": { "label": "Electron GitHub Release 自动更新 (v1.9.8)", "status": "complete", "items": [ "Electron 主进程接入 electron-updater,打包版本启动后从 GitHub Release 检查最新版本;autoDownload 关闭,由用户在顶栏手动下载,下载完成后再重启安装。", "preload 只暴露 t8pc.updater 的 status/check/download/install/onStatus 受控 IPC;渲染层不会接触 GitHub token 或本地发布脚本。", "顶栏新增桌面更新入口,支持检查、发现新版本、下载进度、已下载、重启安装和错误状态;Web/开发模式不会显示无效桌面更新流程。", "package.json 增加 GitHub publish 配置和 dist:release / release:github / release:verify 脚本;发布前校验 installer、.blockmap 与 latest.yml,上传后再从 GitHub Release 拉取校验。", "本次版本同步到 1.9.8,并保留 3D 全景节点、肖像大师保存到资源库、即梦 CLI Seedance 多素材参考、本地私有充值 overlay 打包安全策略。" ] }, "phase139": { "label": "3D 全景开发白屏与大画布图片加载热修 (v1.9.9)", "status": "complete", "items": [ "修复 3D 全景节点从 /public/vendor/js/three-0.160.0.module.js 动态 import 导致 Vite 开发环境白屏 overlay 的问题;节点现在通过项目依赖 import('three') 按需加载 Three.js,避免 public 目录资源被源代码直接 import。", "3D 全景自动旋转只在贴图 ready 且用户开启 panoramaAutoRotate 时启动 requestAnimationFrame,未就绪或未开启时不再持续占用渲染循环。", "MaterialThumbnail、UploadNode、OutputNode 与 3D 全景导出预览图片统一增加 loading=\"lazy\" 与 decoding=\"async\",降低大画布启动时全量缩略图同步请求和解码造成的白屏/图片迟迟不显示问题。", "Electron 更新下载完成后的重启安装曾在 v1.9.9 改为 quitAndInstall(true, true) 静默安装;该策略已被 v2.0.3 前台安装向导规范覆盖,后续不得继续使用静默安装。", "新增 tests/imageLoadingPerformance.test.ts 与 panorama3d 回归断言,锁定 Three.js 依赖加载方式和关键图片预览懒加载策略。", "公开版本同步到 1.9.9:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;本次按规范打包 Electron 并作为 v1.9.8 自动更新基线的跨版本验收包。" ] }, "phase140": { "label": "工具箱聚合解析节点 · ParseHub 桥接 (v1.9.9)", "status": "complete", "items": [ "工具箱分类新增「聚合解析」节点,类型 aggregate-parser;用户可粘贴短链、作品链接、分享码或完整分享文案,也可连接上游 text 节点自动取分享文本。", "节点 UI 强制合规确认,清晰提示版权、平台条款、隐私、DRM/付费内容与 Cookie 风险;后端 /api/parsehub/resolve 同样要求 acceptedCompliance=true,避免绕过前端直接解析。", "解析能力通过 ParseHub 2.0.24 提供,覆盖 Twitter/X、Instagram、YouTube、Facebook、Threads、Bilibili、抖音、TikTok、微博、小红书、贴吧、微信公众号、快手、酷安、皮皮虾、最右、小黑盒等 17 个平台。", "新增 Python bridge:tools/parsehub-bridge/parsehub_bridge.py 只读 stdin JSON、只写 stdout JSON;Node 后端 backend/src/utils/parseHubBridge.js 负责 Python runtime 发现、PYTHONPATH 注入、超时控制、结果归一和本地 output URL 映射。", "新增后端路由 backend/src/routes/parseHub.js:GET /api/parsehub/status 检查运行时与平台,POST /api/parsehub/resolve 支持 parse 与 download 两种模式;后续 v2.0.3 起默认 download 保存到 output/parsehub,parse 仅作为远端地址高级模式保留。", "新增前端服务 src/services/parseHub.ts 与节点组件 src/components/nodes/AggregateParserNode.tsx;运行成功后写出 outputText/textSegments/imageUrls/videoUrls/audioUrls,并为文本摘要创建或更新下游 OutputNode,媒体仍走通用 autoOutput。", "Electron 打包增加 tools/parsehub-bridge 与 tools/parsehub-pythonlibs extraResources;scripts/dist-release.cjs 注入 T8_REQUIRE_PARSEHUB_RUNTIME=1,electron/_post_build.cjs 校验 bridge、parsehub 依赖、parseHub 路由和 parseHubBridge 工具的加密产物。", "新增 tests/aggregateParser.test.ts,覆盖节点注册、端口、前端合规 UI、后端挂载、Electron 打包资源和 ParseHub 结果归一;已验证 bridge status 返回 ParseHub 2.0.24 / Python 3.12.9 / 17 平台,npm run type-check 与 npm run build 通过。" ] }, "phase141": { "label": "主题成就 / 勋章 / 加密影片解锁系统规划 (planned)", "status": "planned", "items": [ "roadmap.md 已在本地新增主题成就路线:九套系统主题分别拥有独立使用时长、成就、勋章和影片解锁轨道;公开仓库通过 features.json.achievementSystemRoadmap 记录摘要,roadmap.md 仍按项目规则不随 GitHub 推送。", "第一版成就数据建议落在 data/achievements.json,规则走 src/data/achievementManifest.ts,事件由统一 AchievementProvider / useAchievementStore 汇总,避免节点组件直接写成就状态。", "有效时长只在窗口前台、页面可见、近期有用户交互时累计;心跳合并上报且单次最多累计 30 秒,避免后台、睡眠和挂机刷时长。", "隐藏模式成就优先接入两条现有能力:RH 主题 UploadNode 鸭鸭解码隐藏模式、幽游白书主题肖像大师隐藏模式;事件只记录类型、主题和计数,不记录用户链接、Cookie、完整 prompt 或隐私内容。", "影片由用户后续提供,原始文件规划放入 private/achievement-films-src/ 并 ignored;加密产物规划为 tools/achievement-media/films/*.t8film + manifest,打包时可通过 T8_REQUIRE_ACHIEVEMENT_MEDIA=1 严格校验。", "解锁影片第一版建议后端解密到用户数据目录临时缓存,并复用资源库 Range 播放逻辑;该方案是轻量本地解锁保护,不宣称 DRM 级防破解。", "留存增强规划包括今日主题任务、周常创作护照、影片碎片、主题代表作、主题大师外观奖励和本地创作回顾;所有提醒必须可关闭或弱化,不打断画布主流程。" ] }, "phase142": { "label": "3D 全景节点内置 GPT Image 2 生成 (dev)", "status": "implemented", "items": [ "3D 全景节点新增「连接预览 / 文生全景 / 图生全景」分段入口;连接预览优先显示上游图片,生成模式优先显示节点内生成贴图。", "文生全景和图生全景统一调用现有 /api/proxy/image 异步图像链路,模型固定 gpt-image-2,比例固定 21:9,尺寸开放 1K / 2K 且默认 1K,不新增独立后端路由或 API Key。", "节点内固定保留 720 度 VR 全景提示词,并在发送前写入 panoramaPromptFinal;文生模式要求用户补充场景提示词,图生模式允许只接上游或上传参考图。", "生成成功后写回 panoramaSourceUrl / panoramaGeneratedUrl / panoramaPrompt / panoramaPromptFinal / panoramaGenerationMode / panoramaSizeLevel / imageUrl / imageUrls / urls,并保留最近 3 次生成历史。", "节点提供复制实际提示词、下载完整全景贴图、导出当前视角、上传节点内参考图和保存到资源库「全景」类型等操作;全景资源默认带未分类、室内、室外等子分类,失败时保留旧预览不清空。", "新增 panorama3d 测试覆盖固定提示词、21:9 请求结构、文生/图生校验、历史上限、组件生成入口、资源库动作和默认 21:9 / 1K data。" ] }, "phase143": { "label": "全局提示词大编辑器与多媒体引用体验 (v2.0.1)", "status": "complete", "items": [ "新增全局提示词大编辑器:PromptExpandModal 负责 Portal 浮层、主题适配、字数/行数、复制、完成/取消与快捷键提示;PromptTextarea 包装普通 textarea,统一放大按钮与 Alt+Enter 打开能力。", "MentionPromptInput 新增 title / expandable 能力,图像、视频、SD2.0、音频、LLM、RunningHub、RH 工具箱、ComfyUI 应用商店、文本节点、预设图像节点和 3D 全景提示词框均接入放大编辑。", "放大后的富文本编辑区撑满弹窗主体,保留 @ 图像 / 视频 / 音频素材候选、实际发送预览和 Ctrl+Enter 完成 / Esc 取消;候选弹窗层级高于大编辑器并按光标附近定位。", "@ 素材 chip 改为固定 24px inline-block + 绝对定位 flex 内容层,图片、视频、音频三类引用在同一行基线对齐,不再因 img 或字体 glyph 产生高低错位。", "新增 editor.expand-prompt 快捷键动作,默认 Alt+Enter,并纳入统一快捷键体系;后续新增提示词输入框必须优先使用 PromptTextarea 或 MentionPromptInput。", "资源库全景 kind 已贯通:后端默认全景分类含未分类、室内、室外,3D 全景保存资源库写入 panorama 类型,资源库抽屉和跨画布发送按 image 媒体路径插入/发送。", "即梦 CLI Seedance 修复继续保留:首帧、首尾帧、智能多帧与 9 图 / 3 视频 / 3 音频全能参考路径分流,避免全能多参误走智能多帧;相关媒体解析和测试已补。", "公开版本同步到 2.0.1:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;本次按用户要求只推 GitHub 源码,不打包 Electron,不上传自动更新 Release 资产。" ] }, "phase144": { "label": "聚合解析授权体验与 v2.0.2 自动更新包", "status": "complete", "items": [ "聚合解析节点把授权状态明确拆为浏览器手动模式与 Electron 桌面自动模式:普通 127.0.0.1 浏览器页面不会再暗示可跨站读取平台 Cookie,Electron 桌面端仍通过 t8pc:parse-auth IPC 使用隔离分区自动读取授权窗口 Cookie。", "浏览器模式下按钮文案改为“打开平台官网 / 检查已粘贴 Cookie”,节点内提示说明 127.0.0.1 页面不能跨站读取 Cookie;保存授权会提示没有桌面端本机授权库,避免用户以为网页登录后可自动检测。", "Electron 模式下保留“打开授权窗口 → 登录平台 → 检测授权 → 加密保存本机授权库 → 载入授权 / 清除 Cookie”的完整流程,授权 Cookie 不写入节点结果和日志。", "聚合解析面板继续保留合规确认、Cookie 风险提示、免责警告和手动 Cookie 获取指南;Cookie 只用于本次请求或 Electron 本机授权库,不作为全局设置持久化。", "新增测试锁定聚合解析节点注册、合规 UI、按钮交互区域、手动/自动授权文案、Electron IPC 暴露、ParseHub 错误分级和结果归一,避免后续迭代重新混淆手动与自动模式。", "公开版本同步到 2.0.2:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;本次按规范打包 Electron 并发布 GitHub Release 自动更新资产。" ] }, "phase145": { "label": "自动更新前台安装向导 (v2.0.3)", "status": "implemented", "items": [ "自动更新下载完成后不再静默安装:electron/main.cjs 设置 autoInstallOnAppQuit=false,只有用户显式点击“打开安装向导”才触发安装。", "显式安装调用 quitAndInstall(false,true),让 NSIS 安装器以前台向导方式出现;状态文案改为“正在打开安装向导,请按提示完成安装”。", "新增 electron/build-resources/installer.nsh,通过 customInit + SetSilent normal 让新版安装器即使收到旧客户端传入的 /S,也尽量恢复为前台安装向导。", "顶部更新按钮把“重启安装”改为“打开安装向导”,减少用户误以为应用会后台自动完成安装的困惑。", "公开版本同步到 2.0.3:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;本次仅修改源码,发布自动更新包需后续按 dist:release 流程执行。" ] }, "phase146": { "label": "聚合解析默认保存到输出目录 (v2.0.3)", "status": "implemented", "items": [ "聚合解析新建节点默认 aggregateParserMode='download',后端 /api/parsehub/resolve 未传 mode 时也默认 download,避免普通用户拿到会过期或 403 的平台 CDN 远端地址。", "旧画布中未记录用户手动选择的 aggregateParserMode='parse' 会自动迁移为 download;从 v2.0.3 起用户主动切到远端地址模式会写 aggregateParserModeUserSet=true 并保留高级选择。", "保留“只解析远端地址”高级模式,但节点 UI 明确提示远端 CDN 链接可能需要平台请求头、Cookie 或临时签名,直接打开 403 不一定代表解析失败。", "ParseHub 归一化层在存在 download.media 时优先输出 /files/output/parsehub 本地 URL,OutputNode 和下游 video/image/audio 字段不再优先使用 douyinvod 等临时远端地址。", "结果摘要按模式区分“已保存到本地输出目录的媒体地址”和“解析到的远端媒体地址”,并在远端模式补充 403/防盗链提醒。" ] }, "phase147": { "label": "去AI水印上游 0.8.9 同步 (v2.0.4)", "status": "implemented", "items": [ "本地外部 clone E:/PenguinPravite/_external/remove-ai-watermarks 已快进到 wiltodelta/remove-ai-watermarks v0.8.9 / 4a6cd71,T8 仍只桥接 CLI/Python 包,不复制上游算法源码。", "runner 按实际 runtime version 做 CLI 参数兼容:0.8.9+ 使用 --pipeline controlnet、--auto、--adaptive-polish、--min-resolution、--controlnet-scale、--unsharp 与 --restore-faces;旧 0.8.7 runtime 继续兼容 ctrlregen 与 --protect-text / --protect-faces。", "去水印节点 UI 把旧文字/人脸保护开关升级为自动策略、ControlNet 结构强度、小图 min-resolution、humanize/unsharp、自适应细节抛光和 GFPGAN 脸部恢复,旧画布中的 ctrlregen 会显示为 controlnet。", "状态接口 optionalFeatures 新增 restore、auto、controlnet、adaptivePolish;开发环境实测 resolver=local external clone、version=0.8.9、markKeys=gemini/doubao/jimeng。", "验证通过 node --test tests/aiWatermarkRunner.test.ts、node -c backend/src/tools/aiWatermark/runner.js、node -c backend/src/routes/aiWatermark.js、npm run type-check、npm run build、全量 node --test tests/*.test.ts,并用临时 PNG 跑通 metadata-check 真实 CLI smoke。", "公开版本同步到 2.0.4:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;本次按规范打包 Electron 并发布 GitHub Release 自动更新资产。" ] }, "phase148": { "label": "v2.0.4 clean public Electron 自动更新发布", "status": "implemented", "items": [ "发布包必须从公开提交的 clean worktree 构建,不使用本地 dirty 工作区里的私有充值 overlay;skill.md、roadmap.md、public/vendor/js/three-0.160.0.module.js 和私有计费/支付/充值实现继续禁止进入公开源码与 release 源码包。", "Electron 发布继续走 npm run dist:release:build、encrypt、electron-builder、_post_build、GitHub Release 上传与 release:verify 连续通过后,才算自动更新版本发布完成。", "自动更新安装体验沿用 v2.0.3 前台安装向导规范:autoInstallOnAppQuit=false,显式安装调用 quitAndInstall(false,true),NSIS customInit 尽量把旧客户端传入的 /S 切回可见向导。", "打包后必须复验 dist_electron/latest.yml 版本、GitHub Release v2.0.4 资产、win-unpacked 启动冒烟和 packaged 日志中的更新检查路径。" ] }, "phase149": { "label": "roadmap 继续收口源码发布 (v2.0.5)", "status": "implemented", "items": [ "主题成就 / 有效时长系统第一版接入:共享成就 manifest、后端 profile/event/preferences/reset/export/import 路由、前端成就按钮/抽屉/Toast/Tracker,奖励影片素材未提供前显示待解锁占位。", "全局提示词大编辑器继续增强为 text/json/lines 三类长文本编辑入口,接入 API 设置、ComfyUI 应用制作、RH 工具箱制作与 RH 工具编辑弹窗。", "3D 全景节点新增轻量贴图质量提示;资源保存、工作流保存、全景生成和聚合解析成功会以非内容事件进入成就系统。", "聚合解析授权助手升级为三步式引导;普通浏览器模式不暗示自动读取 Cookie,桌面端仍保留官方授权窗口检测与本机授权库能力。", "ComfyUI 新增基础文生图样例、导入检查清单和更清晰的缺模型/缺节点/未启动/校验失败错误提示;RH 工具箱新增图像/视频/文本/音频快捷接入位底座。", "云端上传新增 COS/OSS 错误分类与 code/hint/statusCode;宫格编辑新增字幕条、字幕颜色/高度和单格字幕输入,后端 grid-compose 输出带字幕 PNG。", "公开版本同步到 2.0.5:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 同步;本次只推源码,不打包 Electron,不发布 GitHub Release 自动更新资产。" ] }, "phase150": { "label": "README 扩展平台配置说明源码发布 (v2.0.6)", "status": "implemented", "items": [ "README「配置 API Key」表格补充扩展平台 API Key / Token,明确 OpenAI 兼容、ModelScope、火山引擎、即梦 CLI 等高级来源从「扩展 API 平台【高级/可选】」配置。", "README「配置 API Key」表格补充本地 ComfyUI,明确默认地址为 http://127.0.0.1:8188,需先启动本机 ComfyUI,且默认只连接 localhost / 127.0.0.1。", "README 当前版本、badge 与节点数量同步到 2.0.6 / 50 个节点,避免文档落后于 Topaz、ComfyUI 和扩展平台能力。", "features.json 记录 v2.0.6 为 source-only 版本;本次只推 GitHub 源码,不打包 Electron,不发布 GitHub Release 自动更新资产。" ] }, "phase151": { "label": "七龙珠神龙过场与 Electron 自动更新发布 (v2.0.7)", "status": "implemented", "items": [ "七龙珠神龙隐藏模式过场改为 src/assets/theme-dragonball/shenron-dragon.png 透明 PNG 资产,不再使用 CSS 线框;过场包含雷达扫描、能量雾、光束、七龙珠聚合和 reduced-motion 兜底。", "DragonBallRadar、theme-dragonball.css 与 tests/dragonBallRadar.test.ts 锁定雷达工具栏、经典星位、15 分钟龙珠倒计时、3 秒收集反馈、隐藏模式成就和 PNG 过场资产。", "3D 全景节点完成机位书签、默认视线中心、热点导览和跨全景节点跳转;Panorama3DNode / panorama3d utils / tests/panorama3d.test.ts 同步。", "火山引擎扩展 API 修复连接检测、Seedream/Seedance 签名与视频提交路径,避免 Seedance 2.0 视频提交 HTTP 404。", "成就系统补齐主题详情、完成度、隐藏模式仪式感、有效时长持久化和导入导出;奖励影片未提供前继续显示待解锁占位。", "本地私有扩展拆分为 local-private ignored overlay,公开源码只保留通用 extension hook;本机 Electron 打包可包含加密私有扩展,GitHub 源码不包含实现。", "公开版本同步到 2.0.7:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.0.7.md 同步;本次按规范打包 Electron 并发布 GitHub Release 自动更新资产。" ] }, "phase152": { "label": "火山 Seedance 2.0 结果解析与 Electron 自动更新发布 (v2.0.8)", "status": "implemented", "items": [ "Volcengine provider 的视频 URL 收集器对齐 Infinite-Canvas 思路,兼容 content/result/output/mp4_url/output_url/src/path/preview_url 和 JSON 字符串返回,避免成功任务误报空视频。", "新增 tests/volcengineProvider.test.ts 回归:嵌套 Ark task content、content JSON 字符串、ModelNotOpen 友好提示和真实 URL 提取边界。", "成就系统与隐藏模式补记继续修复,确保统计关闭/重新开启、七龙珠神龙和 RH 隐藏模式事件能正确影响成就进度。", "七龙珠神龙模式补齐隐藏音乐、普通/隐藏双模式切换、雷达状态和主题可读性;相关 CSS、store、Tracker 与测试同步。", "公开版本同步到 2.0.8:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.0.8.md 同步;本次按规范打包 Electron 并发布 GitHub Release 自动更新资产。" ] }, "phase153": { "label": "Sora2 Zhenzhen API 双通道与独立 Key", "status": "implemented", "items": [ "视频节点 Sora2 在保留原 `sora-2 (FAL)` 入口不迁移的前提下,新增 `sora-2 (Zhenzhen API)` 具体模型;内部值为 `sora-2-zhenzhen`,后端提交到 /v2/videos/generations 时映射为上游真实 model=`sora-2`。", "Sora2 Zhenzhen API 通道对齐 gpt-image-2-web 非 FAL 实现:支持 16:9 / 9:16、15 秒、seed、private 和最多 1 张 base64 参考图;FAL 通道仍使用独立的 mode / duration / resolution / character ids / IP 阻断参数。", "分类独立 API Key 从 7 类扩展为 8 类:新增 `soraApiKey` 与设置页「sora2 系列」,Sora2 FAL 与 Zhenzhen API 都优先使用该 Key,未填时 fallback 到贞贞通用 Key;`veoApiKey` 改回只负责 Veo / Veo3.1。", "新增回归测试锁定 Sora2 双通道、`soraApiKey` 设置字段、后端 key 选择和 `sora-2-zhenzhen` → `sora-2` 映射,防止后续误把旧 FAL 入口改走普通视频提交。" ] }, "phase154": { "label": "Veo 分类默认模型切到 veo-omni-10s", "status": "implemented", "items": [ "视频节点主模型分类显示名从 `Veo 3.1` 改为 `Veo`,但保留内部主分类 id,避免旧画布的 Veo 节点失配。", "Veo 具体模型新增并默认选择 `veo-omni-10s`;旧 `veo3.1`、`veo3.1-fal` 等子模型继续保留可选,不迁移、不删除。", "`veo-omni-10s` 对齐 Comfly_veo_omini:前端保存公开模型值,后端提交时映射为 `omni_flash-10s`,通过 `/v1/videos` multipart 发送 `input_reference`,轮询改查 `/v1/videos/{task_id}`。", "新增回归测试锁定 Veo 显示名、默认子模型、旧 Veo 选项保留和后端 `/v1/videos` multipart 协议,避免误套旧 `/v2/videos/generations` 协议。" ] }, "phase155": { "label": "3D 全景导演台、Veo Omni 与 Sora2 双通道 Electron 发布 (v2.0.9)", "status": "implemented", "items": [ "3D 全景节点把多人彩色小人、100+ 动作预设、自然语言动作生成、关键帧时间轴、遮挡参考、画面关节拖拽、序列帧素材集和全屏导演台作为本次发布能力收口。", "Sora2 新增 Zhenzhen API 通道和独立 sora2 分类 API Key,原 FAL 通道保持默认选项与旧参数兼容。", "Veo 分类显示名改为 Veo,默认具体模型切到 `veo-omni-10s`,后端按 `/v1/videos` multipart 与 `omni_flash-10s` 上游模型调用。", "上传素材 20MB 上限、画布崩溃恢复、模型注意事项文案、3D 节点右栏布局和视频模型帮助一起进入公开源码。", "公开版本同步到 2.0.9:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.0.9.md 同步;本次按规范打包 Electron 并发布 GitHub Release 自动更新资产。" ] }, "phase156": { "label": "New API 分组令牌公开扩展点与 Nano Banana 2 映射修复 (v2.1.1)", "status": "implemented", "items": [ "新增公开本地扩展插槽 LocalSettingsAddonSlot / LocalNodeAddonSlot 与后端 runtimeHooks,方便 ignored local-private 扩展接入 New API 分组令牌高级模式,同时保持 GitHub 源码不包含私有实现。", "图像、视频、Seedance、音频节点和 generation service 支持 providerParams 透传;后端 zhenzhen.resolveApiKey hook 可按节点所选分组替换实际 API Key,普通用户不启用高级模式时不改变旧流程。", "FAL 图像/视频提交与查询固定使用通用贞贞 API Key,不接 New API 分组令牌;Sora2/Veo/Grok 等旧 FAL 通道继续保留兼容。", "分类独立 API Key 设置页每个系列新增清空按钮,保存后可明确清空对应分类 Key。", "Nano Banana 2 的 UI 选项继续显示 nano-banana-2 (Flash),但真实上游模型改为 gemini-3.1-flash-image;旧画布保存值在 ImageNode 与 proxy 后端两侧兜底归一。", "新增 imageModelMapping、localExtensionHooks 等回归测试,并同步 advanced provider、API 设置、Electron 打包检查与 FAL key 边界测试。", "公开版本同步到 2.1.1:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.1.1.md 同步;本次只推 GitHub 源码,不打包 Electron,不发布 GitHub Release 自动更新资产。" ] }, "phase157": { "label": "即梦 CLI Seedream 4.7 与 Seedance 2.0 模型补齐 (v2.1.3)", "status": "implemented", "items": [ "按用户提供的安装命令更新本机 dreamina CLI,并用 dreamina -h / text2image -h / image2image -h / text2video -h / multimodal2video -h 作为权威模型支持来源。", "即梦 CLI 图像模型新增 seedream-4.7,并在后端 jimengCli 适配器中把 seedream-4.7 / 4.7 转换为 --model_version=4.7;seedream-4.6、seedream-4.5、seedream-5.0 同步进入默认列表。", "即梦 CLI 视频模型默认列表补齐 seedance2.0fast_vip、seedance2.0_vip、seedance2.0fast、seedance2.0;旧设置中空的 jimeng-cli 模型列表会在后端归一化时自动补回内置默认值;非 seedance2.0_vip 的 Seedance 2.0 变体会固定 720p。", "API Key 设置页模型提示同步展示 seedream-4.7 与完整 Seedance 2.0 变体;新增 advanced provider 与 jimeng CLI 回归测试。", "公开版本同步到 2.1.3:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.1.3.md 同步;本次只推 GitHub 源码,不打包 Electron,不发布 GitHub Release 自动更新资产。" ] }, "phase158": { "label": "俄罗斯方块主题、Codex 创作节点与批处理源码版 (v2.1.8)", "status": "implemented", "items": [ "俄罗斯方块主题补齐 Korobeiniki 默认音乐、方块化画布 / 节点 / 连线 / 小地图和 10x20 小游戏体验,关卡、障碍、技能、存档和视觉反馈持续增强。", "工具箱新增批量素材处理节点,覆盖多文件 / 文件夹导入、批量改名、去黑边、抠图、扩图、高清放大、格式转换和打开输出文件夹。", "Codex CLI Agent 支持简约模式和创作台:LLM / IMG 双模式、Skill 调用、项目 Skill、模板工坊、产物库、参考素材可视化、流式对话、文本复制、产物发布和深色主题可读性修复。", "Codex 生图工作台节点面向 imagegen 流程,提供队列、公共图库、模板 / 片段工具、参数快捷 Chip、批量历史和画布输出衔接。", "Grok Agent 修复视频任务轮询、模式高亮、产物库删除 / 清空 / 批量删除和深色主题可读性;视频节点补齐 grok-1.5-video-6s / 10s / 15s 的 Zhenzhen New size 参数。", "AI 消除水印跟进 remove-ai-watermarks 新版能力,补齐前端节点、后端路由和本地 runtime 文档;同时修复素材拖动、预览、侧边栏主题可读性和输出产物链路。", "公开版本同步到 2.1.8:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.1.8.md 同步;本次只推 GitHub 源码,不打包 Electron,不发布 GitHub Release 自动更新资产。" ] }, "phase159": { "label": "俄罗斯方块大屏、Agent CLI 收口与 Electron 自动更新发布 (v2.1.9)", "status": "implemented", "items": [ "俄罗斯方块主题补齐大屏游戏模式、99 关完成后通关判定、10 秒通关仪式感过场、隐藏奖励影片解锁提示、开发全检查点、平滑速度 / 技能消耗曲线、Guard 随机清障和新形状独立颜色。", "Tetris / RH / 幽游白书 / 龙珠 / 科技风隐藏奖励影片以加密 .t8media 分发,成就完成后才能在隐藏影片馆播放。", "Codex CLI Agent 继续收口简约模式和创作台:LLM / IMG 双模式默认模型与默认 imagegen Skill、创作台会话记忆、模板和 Skill 注入、产物库删除 / 清空 / 批量删除、文本复制、自动滚动、主题可读性和最终产物解析。", "Codex 生图工作台保留队列、公共图库、模板 / 片段工坊、参数快捷 Chip、历史记录和输出素材衔接,避免重复发布无关文本或旧产物。", "Grok Agent 视频链路修复:SSE 轮询监听 res.close、视频轮询延长到 15 分钟、失败时带出最后状态 / request id / 错误原因,私有 xAI 查询优先 /v1/videos/{request_id} 并补齐 edits / extensions 入口。", "FAL 超市新增 Bernini R、Luma Ray / Uni、BRIA、Nemotron ASR、Pixelcut 等模型入口,按 Comfyui-zhenzhen 节点实现迁移参数、分类、输入输出和回归测试。", "公开版本同步到 2.1.9:package.json、package-lock.json、vite.config.ts/js、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.1.9.md 同步;本次按规范打包 Electron 并发布 GitHub Release 自动更新资产。" ] }, "phase160": { "label": "灵感之源、批量去边和 Agent 输入预览源码版 (v2.2.0)", "status": "implemented", "items": [ "新增灵感之源分类和艺术风格大师节点,迁移 qiaomu 艺术家风格图片与 manifest,支持搜索、筛选、lightbox、复制提示词、自定义风格、分类管理和导入导出。", "艺术风格大师修复输出风格提示词 / 输出风格图片按钮无反应、缩略图和长文字撑出节点、节点网格不能滚轮浏览的问题;自定义风格支持本地图片上传。", "批量素材处理优先完善去除图片上下左右边框:支持黑边 / 白边 / 透明边 / 自动检测,支持自动、手动像素和 gap 类滑动调整,并展示裁掉像素。", "Codex CLI Agent 简约模式和 Codex 生图工作台补齐上游图片预览、排序、删除与稳定图像产物输出,创作台保持既有素材区和记忆逻辑。", "俄罗斯方块主题继续修复拖动节点顶部残影、大屏游戏布局和游戏难度曲线细节。", "公开版本同步到 2.2.0:package.json、package-lock.json、electron/main.cjs、backend/src/config.js APP_VERSION、features.json、README.md 与 release-notes/v2.2.0.md 同步;本次只推 GitHub 源码,不打包 Electron,不发布 GitHub Release 自动更新资产。" ] }, "phase161": { "label": "灵感之源与工具体验源码收口版 (v2.2.1)", "status": "implemented", "items": [ "艺术风格大师继续完善输出风格提示词 / 图片、自定义图片上传、右键保存风格、分类 / 流派筛选、节点内滚轮浏览和长文字防溢出;输出提示词改为单行风格提示词 + 固定英文参考句,避免冗长元信息。", "新增并完善动漫标签大师节点,支持 Danbooru / Gelbooru 懒加载图库、标签 / 图像输出、自定义分类、导入导出和素材图片右键保存标签。", "资源库分类新增 / 重命名 / 删除恢复可用,任务完成提示音支持设置页上传自定义音频,顶部快捷栏新增输出素材持久化开关。", "画布交互修复 Home 键回到画布中心、文本节点长文缩放溢出、对齐 / 整理顺序颠倒和图像编辑裁切比例默认撑满。", "RH 工具箱读取字段时每次以当前 WebAppId 为准,完整映射字段但在用户节点隐藏调试映射块,避免旧应用字段混入。", "Codex CLI Agent 简约模式和 Codex 生图工作台补齐上游图片预览、排序、删除、LLM / IMG 模式边界和 gpt-image-2-vip 模型提示。", "俄罗斯方块主题继续修复节点顶部残影;公开版本同步到 2.2.1,本次只推 GitHub 源码,不打包 Electron,不发布 GitHub Release 自动更新资产。" ] } }, "categories": { "input": { "label": "素材资源", "count": 3, "nodes": [ { "type": "upload", "label": "上传素材节点", "description": "图像 / 视频 / 音频 三合一上传;支持同类型批量上传、输出合集、一键打散和图像 hover 原图预览,选型后输出端口自适应染色" }, { "type": "material-set", "label": "素材集", "description": "把多个同类型文本 / 图像 / 视频 / 音频打包成可排序素材集,支持框选合并、节点内追加、拖拽排序、反转/文件名/随机排序、导入素材集/导出素材集、保存到资源库、打散与直接传给生成 / RH / 工具节点" }, { "type": "output", "label": "输出素材节点", "description": "终端预览节点:自动收集上游任意节点的 文本/图像/视频/音频,多素材合集可一键打散为独立输出节点;图像支持 hover 原图预览和快捷图像对比,图像视频按原始宽高比显示(object-contain),文本双击可编辑" } ] }, "core": { "label": "核心节点", "count": 7, "nodes": [ { "type": "text", "label": "文本节点", "description": "提示词文本;四角拖拽可自由调整宽高,输出口保持贴合右侧中点;可填写 RH 节点序号,供 RunningHub/RH 钱包/RH 超市按应用 nodeId 自动绑定文本参数" }, { "type": "image", "label": "图像生成节点(ZhenzhenMagic)", "description": "多 TAB 模型切换:GPT Image 2 / Nano Banana Pro / Nano Banana 2 / Midjourney(MJ 无 FAL),对应主项目 gpt-image-2-web Tab 0/1/2 + runMJ;上游文本/图像缩略图可在节点内单项排除且不断开连线" }, { "type": "video", "label": "视频节点", "description": "veo-3.1 / grok-video / 即梦 CLI Seedance;上游文本/图像/视频/音频缩略图可在节点内单项排除且不断开连线;即梦 CLI Seedance 模式支持最多 9 张图像、3 个视频、3 段音频参考" }, { "type": "seedance", "label": "SD2.0 节点", "description": "Seedance 2.0 视频分镜;上游文本/图像/视频/音频缩略图可在节点内单项排除且不断开连线" }, { "type": "director-storyboard", "label": "导演分镜台", "description": "秒级长片分镜台:每镜头 4-15 秒,可继承或单独覆盖模型/比例/分辨率,支持独立提示词和参考素材;生成时按分镜无限并发调用 Seedance2.0,多镜头逐个完成逐个输出,首尾帧桥接默认关闭可选启用" }, { "type": "audio", "label": "音频节点", "description": "Suno 全对齐 gpt-image-2-web:三模式(generate/cover/extend) + 7 版本(v3.0/v3.5/v4/v4.5/v4.5+/v5/v5.5) + 本地上传 + 上游 audioUrl 兜底,无 FAL;上游文本/音频缩略图可在节点内单项排除且不断开连线" }, { "type": "llm", "label": "LLM/Vision 节点", "description": "LLM/Vision 模型(gemini-3.1-flash-lite/gemini-3.5-flash 默认/gpt-4o/gemini-3.1-pro/gpt-5/gpt-image-2-all) + temp/max_tokens + system 预设 + 多模态图片 + 多轮会话 + SSE 流式 + 独立 LLM Key;上游文本/图像缩略图可在节点内单项排除且不断开连线" } ] }, "rh": { "label": "RH 节点", "count": 5, "nodes": [ { "type": "runninghub", "label": "RunningHub 节点", "description": "RH 工作流主节点(webappId 搜索拉 nodeInfoList 自动展开为表单 + LIST/SELECT 自动识别 + KNOWN_FIELD_OPTIONS 词典兜底 + 媒体上游同步 + computeFreshValuesNow 同步快照 + resolveNodeInfoList 三层防御 + autoOutput 多产物分多 OutputNode + 接入 logBus 日志面板;上游 image/video/audio 可节点内单项排除)" }, { "type": "runninghub-wallet", "label": "RH钱包应用", "description": "v1.1.x 新增,与 runninghub 共用 RunningHubNode.tsx,通过 NodeProps.type 单点判定 useWallet=true 仅用于 UI 区分(标题/图标/配色 violet 主调 + Wallet 图标);v1.2.9.16 起 RH 钱包应用与普通 RunningHub 节点统一使用 settings.rhApiKey,取消 rhWalletApiKey 独立字段。" }, { "type": "rh-tools", "label": "RH超市", "description": "v1.2.10 新增、v1.2.10.4 重命名为「RH 超市」。启动器式包装多个 RunningHub AI 应用 · 在节点内分类浏览 / 拼音搜索 / 一键运行。双视图(启动器 + 应用运行)、多实例共享分类/应用 JSON、与RunningHubNode完全对齐的运行逻辑(resolveNodeInfoList 三层防御 / IMAGE预览白名单 / instanceType select / 上游同步 / autoOutput 分流 / 上游素材单项排除)。默认 cyan 调·像素风走糖果调色板(px-surface/px-muted/px-ink/px-yellow)。" }, { "type": "rh-toolbox", "label": "RH工具箱", "description": "v1.9.4 新增。维护者精选 RunningHub 工具箱,只读分类运行,用户不能在客户端新增/编辑工具;工具由 manifest 驱动,按 capability 支持图像抠图/编辑/放大、视频编辑/放大、文本扩写、音频克隆等后续能力,并通过统一 runner 输出 text/image/video/audio。开发期可用 RH工具箱制作器生成 manifest 草稿,用户包不包含制作器。" }, { "type": "rh-config", "label": "RH 配置", "description": "RunningHub 工作流参数注入(v1.1.x 起 hidden:true 仅从 Sidebar 隐藏,nodeTypes 注册保留以兼容老画布)", "hidden": true } ] }, "inspiration": { "label": "灵感之源", "count": 2, "nodes": [ { "type": "artist-style-master", "label": "艺术风格大师", "description": "移植 qiaomu 艺术家风格库,支持画家英文名/中文名/风格标签搜索、按流派和分类筛选、缩略图 lightbox、大图方向键切换、复制画家提示词、自定义分类/风格保存、导入导出,并可运行输出风格提示词或风格图片" }, { "type": "anime-tag-master", "label": "动漫标签大师", "description": "基于 comfyui-anima-t8 的 Danbooru / Gelbooru 懒加载图库思路,支持动漫标签搜索、按分类/来源筛选、在线预览、lightbox、复制标签提示词、自定义分类/标签保存、图片上传、导入导出,并可运行输出标签或参考图" } ] }, "comfyui": { "label": "ComfyUI", "count": 2, "nodes": [ { "type": "comfyui-store", "label": "ComfyUI超市", "description": "本地 ComfyUI 应用库:导入制作好的 API Workflow 应用,按分类/搜索选择,连接上游 text/image/video/audio 素材后一键运行;输出归一为 image/video/audio/text,可继续接 OutputNode、资源库、节点发送和 Loop。" }, { "type": "comfyui-app-maker", "label": "ComfyUI应用制作工具", "description": "上传或粘贴 ComfyUI API Workflow JSON,自动识别需要暴露的参数与上游输入,允许手动调整名称、分类、说明和字段,保存到 ComfyUI超市或复制/导出标准 t8-comfyui-app-manifest 应用 JSON。" } ] }, "special": { "label": "特殊节点", "count": 5, "nodes": [ { "type": "multi-angle-3d", "label": "多角度 3D", "description": "3D 多视角生成" }, { "type": "panorama-720", "label": "720 全景", "description": "720° 全景图生成" }, { "type": "penguin-portrait", "label": "企鹅肖像", "description": "肖像专用流程" }, { "type": "portrait-metadata", "label": "肖像元数据", "description": "肖像参数管理" }, { "type": "storyboard-grid", "label": "分镜网格", "description": "分镜九宫格布局" } ] }, "utility": { "label": "工具节点", "count": 15, "nodes": [ { "type": "drawing-board", "label": "画板", "description": "v1.6.1 开放,v1.9.0 增强。图层画板:支持 16:9 / 9:16 等比例、空白图层、图层组折叠、可见/锁定、载入上游或本地图片、手绘/文字/矩形/圆形/箭头、缩放旋转、套索/钢笔非破坏式抠图、放大编辑窗口、导入导出画板 JSON,并可运行输出 PNG 图像" }, { "type": "browser", "label": "浏览器", "description": "网页内嵌", "hidden": true }, { "type": "image-compare", "label": "图像对比", "description": "双图滑杆 / 并排 / 叠加 / 闪烁 / 热力图 / 差异聚焦,运行后输出一张对比结果图" }, { "type": "frame-extractor", "label": "抽帧", "description": "视频抽帧", "hidden": true }, { "type": "frame-pair", "label": "首尾帧获取", "description": "v1.2.7 新增。输入一个视频节点,运行后抽取首帧与尾帧,输出 2 个 image 素材(双 source handle id=first/last)。浏览器端 video+canvas 抽帧上传 base64,双主题 (像素风糖果色/科技风玻璃),接入运行总线可被批量运行调起" }, { "type": "loop", "label": "循环器", "description": "v1.2.8 新增。接多个同类型素材(text/image/video/audio),两种模式: 串联逐个注入自身进发下游可执行子图 / 并联克隆 (N-1) 份子图并发跱发。采集输出位序位填 null,永久保留克隆节点,克隆块垂直堆叠(yOffset = i × blockH),使用 runBus.runningIds + triggerRunMany 多节点并发触发。双主题 violet 调" }, { "type": "random-route", "label": "随机路由", "description": "v2.4.4 新增。接受任意上游素材,动态提供 1-100 个输出口;每次运行按 random_pass_count 随机命中不重复输出口,仅继续执行命中口后面的下游分支,未命中分支不进入运行队列" }, { "type": "pick-from-set", "label": "从合集获取", "description": "v1.2.8 新增。从上游多素材集合中按 kind + 序号取出单一素材写入自身 data,下游通过 useUpstreamMaterials 自动拾取。默认 image+第1个,kind 切换时输出 Handle 颜色随动 PORT_COLOR 变化" }, { "type": "text-split", "label": "文本分割", "description": "v1.5.7 增强。接上游 text 或手动粘贴长文本,默认按行;按段落严格以至少一个空行切段,普通换行保留在同一段,可按自定义分隔符/Markdown 标题/序号镜头/智能分镜/正则高级/字数切块输出 textSegments 数组;支持模式说明、中文稳定编辑、去空行、修剪、压空白、去序号、前后缀占位符、双列分段预览编辑、复制全部、手动打散为多个 TextNode、分段收藏、JSON 导入导出,以及一键创建前置循环器链路;前置循环器执行完成后会自动打散为 TextNode" }, { "type": "resize", "label": "尺寸调整", "description": "图像尺寸调整(v1.2.0 起默认 fit=cover 裁剪铺满,FIT_OPTIONS 4 选项带中文说明 cover/contain/inside/fill;ImageOpFrame 派生节点下游连 OutputNode 时自动隐藏内部预览避免双显)" }, { "type": "combine", "label": "合并", "description": "图像合并" }, { "type": "remove-bg", "label": "抠图", "description": "去除背景", "hidden": true }, { "type": "upscale", "label": "放大", "description": "图像放大", "hidden": true }, { "type": "grid-crop", "label": "宫格剪裁", "description": "网格切图,支持 gap 去缝、常用预设、指定序号导出、输出顺序、上游合集批量拆分和节点内切线预览;批量拆分兼容上传素材多图与资源库素材集图像" }, { "type": "grid-editor", "label": "宫格编辑", "description": "多图分镜宫格拼版节点:自动接收上游图像,也可本地上传;支持行列预设、自定义输出尺寸、间距、背景、adaptive/cover/contain/fill、序号叠加、拖拽排序、单格删除、超量自动扩容、拆分输出和运行生成一张拼接 PNG" } ] }, "auxiliary": { "label": "辅助节点", "count": 6, "nodes": [ { "type": "edit", "label": "编辑节点", "description": "图像编辑/局部" }, { "type": "idea", "label": "灵感节点", "description": "灵感记录" }, { "type": "bp", "label": "BP 节点", "description": "Blueprint 蓝图" }, { "type": "relay", "label": "中继节点", "description": "数据中转" }, { "type": "remove-ai-watermark", "label": "去AI水印", "description": "接入 wiltodelta/remove-ai-watermarks 0.11.0,可处理 Gemini / 豆包 / 即梦 / Samsung 等已知可见 AI 水印、框选擦除(cv2/LaMA)、来源自适应隐形水印、默认 ControlNet 结构保留、ESRGAN 小图预放大、模型/CFG 调参、AI 元数据清理、来源鉴别与官方 all 完整清理;支持本地 Python 包或 Electron sidecar runtime,视频/音频以及 HEIC/HEIF/JXL/Opus 等容器支持元数据检查和清理" }, { "type": "video-output", "label": "视频输出", "description": "视频结果展示" } ] }, "toolbox": { "label": "工具箱", "count": 10, "nodes": [ { "type": "cinematic", "label": "电影感工具箱", "description": "电影感组合器:成片风格 / 镜头 / 光影 / 调色 / 质感各 50 项,支持中英文 prompt、收藏复用、JSON 导入/导出与运行输出到 OutputNode" }, { "type": "video-motion", "label": "视频运镜工具箱", "description": "视频运镜组合器:成片场景 / 运镜动作 / 路径 / 节奏 / 稳定 / 主体约束各 50 项,支持中英文 prompt、路线预览与运行输出到 OutputNode" }, { "type": "multi-angle-visual", "label": "可视化多角度", "description": "可视化调节方位 / 俯仰 / 远近,支持批量角度、Prompt 模式、EN / 中切换、前后缀、镜头收藏、JSON 导入导出与运行输出到 OutputNode" }, { "type": "portrait-master", "label": "肖像大师", "description": "捏人 Prompt 设计器:9 大类词库,每个小参数 100 个可选词条;支持 Avatar 分层预览、不选、锁定、权重、自定义补充、默认英文 prompt、角色库收藏、JSON 导入导出、资源库角色分类、跨画布发送配置/Prompt、高级随机、种子复现、风格包与批量输出文本节点/文本素材集" }, { "type": "pose-master", "label": "姿势大师", "description": "人体线稿姿态编辑器:可拖动关节点或抓取移动整个人物、套用常用姿势、MediaPipe 识别人物图、多人姿态、手部控制、A/B 关键帧、预览并输出线稿/OpenPose/COCO 参考图,同时导出 OpenPose/COCO keypoints JSON、prompt/text 与 metadata" }, { "type": "aggregate-parser", "label": "聚合解析", "description": "基于 ParseHub 的轻量自媒体聚合解析节点:输入短链、作品链接、分享码或分享文案,合规确认后默认保存到 output/parsehub;可选使用代理/Cookie,远端地址解析作为高级模式保留" }, { "type": "batch-processor", "label": "批量素材处理", "description": "批量导入文件或文件夹,也可连接上游素材;在节点内执行原名/改名、去除上下黑边、批量抠图、扩图、高清放大和格式转换,完成后只显示节点内进度和结果,不自动生成输出素材节点" }, { "type": "batch-tagger", "label": "批量打标", "description": "批量导入图像/视频或连接上游素材,调用贞贞 LLM 独立 Key / 扩展 API 视觉模型生成 TAG、自然语言、短句或 JSON,并保存同名前缀 .txt / .json 到 output/batch-tags" }, { "type": "topaz-image-upscale", "label": "Topaz图像高清化", "description": "调用用户本机 Topaz Gigapixel AI / Gigapixel 8,对上游图像做本地高清放大;节点提供模型、倍数、降噪、锐化、压缩修复、细节保留和 Recover 预降采样参数,并明确提示需要自行安装并登录 Topaz" }, { "type": "topaz-video-upscale", "label": "Topaz视频高清化", "description": "调用用户本机 Topaz Video AI 自带 ffmpeg.exe,对上游视频做放大和补帧;放大 tvai_up 与补帧 tvai_fi 合并到同一次 filter chain,支持 GPU 编码失败后 CPU 回退,并提示 TVAI_MODEL_DATA_DIR / TVAI_MODEL_DIR 登录配置" } ] }, "3d": { "label": "3D", "count": 1, "nodes": [ { "type": "panorama-3d", "label": "3D全景", "description": "Three.js 360 全景预览与取景导出,支持连接已有全景图,也可在节点内用 GPT Image 2 文生/图生 21:9 全景贴图;提供拖拽视角、缩放、比例控制、自动旋转、当前视角导出、完整贴图下载和保存到资源库「全景」类型" } ] } }, "portTypes": { "description": "节点端口语义类型定义 ⏱ src/config/portTypes.ts 。所有连接都需严格匹配 source.outputs 与 target.inputs 的交集;'any' 透传仅限 relay 节点使用。", "types": [ "text", "image", "video", "audio", "metadata", "config", "any" ], "colorMapping": { "text": "#7dd3fc", "image": "#fcd34d", "video": "#fda4af", "audio": "#c4b5fd", "metadata": "#67e8f9", "config": "#a5b4fc", "any": "#cbd5e1" }, "validation": { "runtime": "ReactFlow isValidConnection (Canvas.tsx onIsValidConnection)", "core": "isConnectionValid(src, tgt) ⏱ src.outputs ∩ tgt.inputs ≠ ∅", "selfLoop": "禁止 source.id === target.id", "uploadDynamic": "upload 节点输出以 data.uploadType 动态决定(image/video/audio),未选型时输出为空,任何连接均被拒绝。", "materialSetDynamic": "material-set 节点输出以 materialSetKind + materialSetItems 动态决定(text/image/video/audio),空素材集不输出;输入端可接任意 text/image/video/audio 后手动收集上游同类素材。" } }, "removed": { "description": "以下节点在重构中被明确移除,不可再加入", "nodes": [ { "type": "rh-magic", "reason": "企鹅云 magic 流程已移除" }, { "type": "rh-video-s", "reason": "RH 视频特化流程已移除" }, { "type": "rh-character-extract", "reason": "RH 角色提取已移除" }, { "type": "comic-config", "reason": "漫剧流程已移除" } ] }, "modelRegistry": { "image": [ { "id": "gpt-image-2", "label": "GPT Image 2", "provider": "zhenzhen", "endpoint": "/v1/images/generations" }, { "id": "gpt-image-2-fal", "label": "GPT Image 2 (FAL)", "provider": "zhenzhen-fal", "endpoint": "/fal/openai/gpt-image-2[/edit]", "paramKind": "gpt-fal", "maxRefs": 5 }, { "id": "nano-banana-2", "label": "Nano Banana 2", "provider": "zhenzhen", "endpoint": "/v1/images/generations" }, { "id": "nano-banana-2-fal", "label": "Nano Banana 2 (FAL)", "provider": "zhenzhen-fal", "endpoint": "/fal/fal-ai/nano-banana-pro/edit", "paramKind": "nbpro-fal", "maxRefs": 8 }, { "id": "nano-banana-pro", "label": "Nano Banana Pro", "provider": "zhenzhen", "endpoint": "/v1/images/generations" }, { "id": "nano-banana-pro-fal", "label": "Nano Banana Pro (FAL)", "provider": "zhenzhen-fal", "endpoint": "/fal/fal-ai/nano-banana-pro/edit", "paramKind": "nbpro-fal", "maxRefs": 8 }, { "id": "midjourney", "label": "Midjourney", "provider": "zhenzhen", "endpoint": "/{mj-turbo|mj-fast|mj-relax}/mj/submit/imagine", "paramKind": "mj", "versions": [ "v 8.1", "v 8", "v 7", "v 6.1", "v 6.0", "v 5.2", "v 5.1", "niji 7", "niji 6", "niji 5", "niji 4" ], "ratios": [ "1:1", "4:3", "3:2", "16:9", "3:4", "2:3", "9:16" ], "speeds": [ "fast", "turbo", "relax" ], "refs": { "main": "base64Array(多张)", "sref": "≤2张上传换URL", "oref": "≤2张上传换URL" }, "note": "严格对齐 gpt-image-2-web runMJ;无 FAL 渠道" } ], "video": [ { "id": "grok-video", "label": "Grok Video", "provider": "zhenzhen", "endpoint": "/v1/videos/generations", "defaultModel": "grok-imagine-video-1.5", "falModels": [ { "id": "grok-imagine-video-1.5", "endpoint": "/fal/xai/grok-imagine-video/v1.5/image-to-video", "mode": "image-to-video", "imageMode": "base64", "maxRefs": 1 }, { "id": "grok-video-fal", "endpoint": "/fal/xai/grok-imagine-video/{text-to-video|image-to-video|reference-to-video}", "imageMode": "base64", "maxRefs": 7 } ] }, { "id": "veo", "label": "Veo", "provider": "zhenzhen", "endpoint": "/v1/videos 或 /v2/videos/generations", "defaultModel": "veo-omni-10s", "extraModels": [ "veo-omni-10s", "veo3.1", "veo3.1-fal" ] }, { "id": "sora-2", "label": "Sora2", "provider": "zhenzhen", "endpoint": "/fal/fal-ai/sora-2/{text-to-video|image-to-video} 或 /v2/videos/generations", "defaultModel": "sora-2", "extraModels": [ "sora-2-zhenzhen" ], "imageMode": "base64", "maxRefs": 1 }, { "id": "seedance-2.0", "label": "Seedance 2.0(SD2.0)", "provider": "zhenzhen", "endpoint": "/v1/videos/seedance" } ], "audio": [ { "id": "suno-generate", "label": "Suno 生成", "provider": "zhenzhen", "endpoint": "/suno/generate", "versions": [ "v3.0", "v3.5", "v4", "v4.5", "v4.5+", "v5", "v5.5" ] }, { "id": "suno-cover", "label": "Suno 翻唱", "provider": "zhenzhen", "endpoint": "/suno/submit/music", "versions": [ "v3.0", "v3.5", "v4", "v4.5", "v4.5+", "v5", "v5.5" ] }, { "id": "suno-extend", "label": "Suno 续写", "provider": "zhenzhen", "endpoint": "/suno/generate", "versions": [ "v3.0", "v3.5", "v4", "v4.5", "v4.5+", "v5", "v5.5" ] } ], "llm": [ { "id": "gemini-3.1-flash-lite-preview", "label": "Gemini 3.1 Flash Lite (默认)", "provider": "llm-direct", "endpoint": "/v1/chat/completions", "vision": true, "stream": true }, { "id": "gemini-3.5-flash", "label": "Gemini 3.5 Flash", "provider": "llm-direct", "endpoint": "/v1/chat/completions", "vision": true, "stream": true }, { "id": "gpt-4o", "label": "GPT-4o", "provider": "llm-direct", "endpoint": "/v1/chat/completions", "vision": true, "stream": true }, { "id": "gemini-3.1-pro-preview", "label": "Gemini 3.1 Pro", "provider": "llm-direct", "endpoint": "/v1/chat/completions", "vision": true, "stream": true }, { "id": "gpt-5", "label": "GPT-5", "provider": "llm-direct", "endpoint": "/v1/chat/completions", "vision": true, "stream": true }, { "id": "gpt-image-2-all", "label": "GPT Image 2 All (图文)", "provider": "llm-direct", "endpoint": "/v1/chat/completions", "vision": true, "imageOutput": true, "stream": false } ] }, "apiKeys": { "zhenzhen": { "label": "贞贞工坊 API Key", "baseUrl": "https://ai.t8star.org", "fixed": true, "scope": [ "image", "video", "audio" ], "role": "全局后备 Key, 任何分类 key 留空时 fallback 到此", "getKeyUrl": "https://ai.t8star.org/register?aff=dP7j" }, "runninghub": { "label": "RunningHub API Key", "baseUrl": "https://www.runninghub.cn", "fixed": false, "scope": [ "runninghub", "runninghub-wallet", "rh-config" ], "backendField": "rhApiKey", "note": "v1.2.9.16 起统一 Key:取消 rhWalletApiKey 独立字段,普通 RunningHub 节点与 RH 钱包应用节点均使用 settings.rhApiKey。后端 pickRhApiKey(settings) 不再读 useWallet 标志。老 settings.json 中残留的 rhWalletApiKey 字段仅被 loadSettings 允许但不再被任何路由消费,保证向后兼容。", "getKeyUrls": { "cn": "https://www.runninghub.cn/user-center/1819214514410942465/webapp?inviteCode=rh-v1121", "intl": "https://www.runninghub.ai/user-center/1819214514410942465/webapp?inviteCode=rh-v1121" } }, "runninghubWallet": { "label": "RH 钱包 APIKEY(已于 v1.2.9.16 合并、仅保留说明)", "deprecated": true, "deprecatedSince": "v1.2.9.16", "replacedBy": "runninghub.rhApiKey", "note": "v1.1.x 时期为 RH 钱包应用节点独立设置的 rhWalletApiKey。v1.2.9.16 合并到统一 rhApiKey,该字段从 DEFAULT_SETTINGS / GET 脱敏 / ApiSettings UI 全面移除。老 settings.json 中如有该字段仅被 loadSettings 允许保留,但运行时不再被任何路由消费。" }, "llm": { "label": "LLM 独立 API Key", "baseUrl": "https://ai.t8star.org", "fixed": true, "scope": [ "llm", "vision" ], "note": "额度隔离,base URL 与贞贞工坊一致但 Key 独立" }, "classified": { "description": "分类独立 Key (phase23): 后端 pickApiKey 按模型名/endpoint/路由名路由;未填时自动 fallback 到 zhenzhenApiKey", "keys": { "gptImageApiKey": { "label": "gpt-image 系列", "matches": [ "gpt-image", "gpt2", "gpt_image" ] }, "nanoBananaApiKey": { "label": "nano-banana 系列", "matches": [ "nano-banana", "nano_banana" ] }, "mjApiKey": { "label": "mj 系列", "matches": [ "midjourney", "mj-fast", "mj-turbo", "mj-relax" ] }, "veoApiKey": { "label": "veo 系列", "matches": [ "veo" ] }, "soraApiKey": { "label": "sora2 系列", "matches": [ "sora" ] }, "grokApiKey": { "label": "grok 系列", "matches": [ "grok" ] }, "seedanceApiKey": { "label": "seedance 系列", "matches": [ "seedance" ] }, "sunoApiKey": { "label": "suno 系列", "matches": [ "suno", "chirp" ] } } }, "advancedProviders": { "label": "扩展 API 平台【高级/可选】", "status": "guided-settings-layout-ime-safe-token-links-lora-comfyui-auto-mapping-readme-documented", "since": "v1.8.0-roadmap / v1.8.1-backend-foundation / v1.8.2-settings-ui / v1.8.4-generation / v1.8.5-guided-settings / v1.9.2-ime-token-links / v1.9.3-modelscope-jimeng-cli / v1.9.4-modelscope-lora / v1.9.4-comfyui-guided-workflow / v2.0.6-readme-docs", "placement": "API 设置页中位于「分类独立 API Key【可选】」之后、文件自动保存路径之前,默认折叠;未配置时不影响主流程。展开后左侧是平台卡片,右侧按说明、基础信息、连接配置、模型列表和高级项分区。", "principles": [ "默认不改变贞贞工坊 / RunningHub / LLM 独立 Key 与分类 Key fallback 链路。", "只有用户主动展开、配置并在节点里选择扩展平台时才启用。", "README 的 API Key 表必须同步说明扩展平台 API Key / Token 与本地 ComfyUI,否则新用户会误以为只支持四套传统 Key。", "设置页必须解释每个平台的用途、适用节点和填写方式,避免把 Base URL、Token、模型列表、AK/SK、ComfyUI JSON 等内部字段直接平铺给用户。", "扩展平台表单不得在 render 函数内部定义 React 子组件;输入框和 textarea 必须在输入过程中保持同一组件实例,避免中文 IME 和连续输入被重渲染打断。", "ModelScope Token 获取入口必须同时提供国内站和国际站链接,分别指向 https://www.modelscope.cn/my/access/token 与 https://www.modelscope.ai/my/access/token。", "ModelScope 图像 LoRA 只作为扩展平台高级能力出现;默认列表可自动合并,图像节点最多同时选择 5 个 LoRA,并必须显示官方总权重 当前/1.00、剩余可分配权重和均分入口,节点内通过 providerParams.modelscopeLoras 保存选择和权重、提交时写入 providerParams.loras,禁止影响贞贞工坊主流程。", "ComfyUI 工作流导入必须优先走自动识别和可视化映射;raw fields JSON 只作为高级兜底,避免普通用户必须理解内部 nodeId/input 字段。", "设置保存和节点调用解耦,节点仅保存 providerSource/providerId/providerModel/providerParams。", "所有扩展平台输出必须归一化到现有 OutputNode、资源库、自动保存、节点发送和 Loop 可识别的协议。", "Key、火山 AK/SK、CLI 路径和本地服务地址必须后端保存、脱敏展示并避免写入日志。" ], "protocols": [ "openai-compatible", "modelscope", "volcengine", "comfyui", "jimeng-cli" ], "backend": [ "backend/src/providers/registry.js(已接入 settings 路由,负责默认平台、配置清洗、密钥保留、脱敏展示和摘要统计)", "backend/src/providers/mediaResolver.js(已实现 T8 本地/资源库/远程/dataURL/本地路径的统一解析)", "backend/src/providers/adapters.js(按 protocol 分发测试、图像、视频与 LLM 调用)", "backend/src/providers/openaiCompatible.js(/models 测试,/chat/completions、/images/generations、/videos/generations 真实调用与结果归一化)", "backend/src/providers/modelscope.js(异步图像任务提交、LoRA payload.loras、/tasks/{task_id} 轮询与图片输出归一化;聊天复用 OpenAI 兼容格式)", "backend/src/providers/volcengine.js(Ark/Seedream 图像与 Seedance 视频提交、任务轮询和输出归一化)", "backend/src/providers/comfyui.js(限制 localhost/127.0.0.1,测试 /queue,运行 /prompt,LoadImage 上游图片上传 /upload/image,轮询 /history 并输出 image/video/audio/text)", "backend/src/providers/jimengCli.js(检测 dreamina/即梦 CLI,支持 text2image/image2image/text2video/单图 multimodal2video/多图 multiframe2video、poll 与输出转存)", "backend/src/routes/externalProviders.js(POST /api/proxy/external/test-provider、/image、/video、/llm,响应只返回脱敏 provider,媒体输出转存 /files/output)" ], "frontend": [ "src/components/ApiSettings.tsx(扩展平台折叠区、平台说明卡、分区表单、ModelScope LoRA 列表、测试连接、ComfyUI 工作流 JSON 自动识别/可视化参数映射、设置导入导出)", "src/utils/comfyuiWorkflow.ts(ComfyUI API Workflow 自动分析、推荐映射和 fields compact 规范)", "src/components/nodes/{ImageNode,VideoNode,SeedanceNode,LLMNode}.tsx(启用 provider 后显示高级来源;ImageNode 在 ModelScope 下可选择 LoRA,默认仍走主流程)", "src/utils/advancedProviders.ts(模型列表与 LoRA 列表文本解析、摘要统计、masked key 状态判断、节点可用 provider 与外部图像尺寸映射)", "src/services/generation.ts(generateExternalImage / generateExternalVideo / generateExternalLlm)", "src/services/api.ts::testAdvancedProvider(调用 /api/proxy/external/test-provider)", "src/types/canvas.ts(AdvancedProviderConfig / CanvasNodeData providerSource 字段)" ], "plannedPhases": [ "Phase A: 设置与数据模型、折叠 UI、脱敏与校验测试。", "Phase B: Adapter 骨架、统一 media resolver 与 provider test endpoint。", "Phase C: OpenAI 兼容与 ModelScope,图像/LLM/基础视频链路已在 v1.8.4 落地。", "Phase D: 火山引擎与即梦 Seedance CLI 已在 v1.8.4 落地。", "Phase E: 本地 ComfyUI 工作流高级来源已在 v1.8.4 落地;v1.9.4 新增自动识别字段、可视化映射和 LoadImage 上游图片上传,独立 ComfyUI 节点留作后续可选扩展。", "Phase F: 错误文案、输出协议和命令回归已在 v1.8.4 完成基础收口。" ], "reference": "roadmap.md::扩展 API 平台融合路线(参考 Infinite-Canvas)" }, "cloudUploadTargets": { "label": "云端上传目标【可选】", "status": "right-click-upload-first-version", "since": "v1.9.4-cloud-upload-targets", "placement": "API 设置页中位于「扩展 API 平台【高级/可选】」之后、文件自动保存路径之前,默认折叠;未启用时素材右键菜单不显示云端目标。", "principles": [ "复用素材 data-drag-source 协议,图像 / 视频 / 音频素材右键即可上传,不修改节点数据。", "密钥只在后端保存,GET /api/settings 与 GET /api/cloud-uploads/status 只返回脱敏状态。", "输入空值或 **** 脱敏值时保留旧密钥,输入新值才覆盖。", "腾讯云 COS 与阿里云 OSS 首版真实上传;百度网盘与夸克网盘先保留配置位和友好错误,等待稳定 OAuth/CLI 方案。", "新增平台必须优先扩展 backend/src/cloudUploads/settings.js 与 uploader.js,不在节点组件里写平台分支。" ], "providers": [ "tencent-cos", "aliyun-oss", "baidu-netdisk", "quark-netdisk" ], "backend": [ "backend/src/cloudUploads/settings.js(默认目标、配置清洗、密钥保留、脱敏、摘要)", "backend/src/cloudUploads/uploader.js(素材解析、对象 key 生成、COS/OSS 签名 PUT 上传)", "backend/src/routes/cloudUploads.js(status/test/upload 路由)" ], "frontend": [ "src/components/ApiSettings.tsx(云端上传目标折叠设置区)", "src/components/MaterialContextMenu.tsx(素材右键上传到云端)", "src/services/api.ts(getCloudUploadStatus/testCloudUploadTarget/uploadCloudAsset)", "src/types/canvas.ts(CloudUploadTargetConfig / CloudUploadSummary)" ], "reference": "roadmap.md::云端上传目标路线(开发中)" }, "fileSavePath": { "label": "文件自动保存路径", "backendField": "fileSavePath", "defaultValue": "D:\\zhenzhen", "since": "v1.2.10.2", "description": "所有可执行节点生成的图像/视频/音频均会自动复制一份到此路径。路径不存在时启动自动 mkdir -p。同名文件跳过不覆盖。静默失败不报错。", "endpoint": "POST /api/files/save-to-disk", "protocols": [ "/files/output/* (fs.copyFile)", "/files/input/* (fs.copyFile)", "http(s)://* (fetch+writeFileSync)" ] } }, "backendRoutes": { "baseUrl": "http://127.0.0.1:18766", "prefix": "/api", "groups": { "status": [ "GET /api/status — 健康检查" ], "canvas": [ "GET /api/canvas — 列出画布", "POST /api/canvas — 创建画布", "GET /api/canvas/:id — 读取画布数据", "PUT /api/canvas/:id — 保存画布数据(防空覆盖)", "POST /api/canvas/:id/auto-save — 将画布 JSON 镜像自动保存到 canvasAutoSavePath/T8-penguin-canvas/canvases(v1.3.1)", "DELETE /api/canvas/:id — 删除画布", "PATCH /api/canvas/:id/name — 重命名" ], "settings": [ "GET /api/settings — 三套 Key 设置(脱敏)", "GET /api/settings — v1.8.1 起返回脱敏 advancedProviders 与 advancedProviderSummary,用于扩展 API 平台折叠态摘要", "GET /api/settings — v1.9.4 起返回脱敏 cloudUploadTargets 与 cloudUploadSummary,用于云端上传目标设置和右键菜单摘要", "GET /api/settings/raw — 内部明文(代理调用使用;设置总导出会用作私密备份源;advancedProviders 原始密钥只在此内部接口可见)", "POST /api/settings — 更新设置(fileSavePath/canvasAutoSavePath/resourceLibraryPath/themeTemplatePath 变动后后端自动 ensureDir;advancedProviders 与 cloudUploadTargets 会过滤非法配置并保留 masked/空值对应的旧密钥;设置总导入回填后仍通过此接口保存)", "GET/POST/PUT/DELETE /api/settings/rh-tool-categories[/:id] — RH 超市分类 CRUD(v1.2.10)", "POST /api/settings/rh-tool-categories/reorder — RH 超市分类排序(v1.2.10)", "GET/POST/PUT/DELETE /api/settings/rh-tool-apps[/:id] — RH 超市应用 CRUD(v1.2.10)", "POST /api/settings/rh-tool-apps/reorder — RH 超市应用排序(v1.2.10)", "GET /api/settings/rh-tools/export — RH 超市分类+应用 JSON 备份(v1.3.1)", "POST /api/settings/rh-tools/import — RH 超市分类+应用 JSON 导入,默认 replace(v1.3.1)" ], "files": [ "POST /api/files/upload — 文件上传", "GET /api/files/list — 列出 output 媒体", "POST /api/files/upload-base64 — base64 dataURL 转存", "POST /api/files/save-to-disk — 全局产物复制到本地 fileSavePath(v1.2.10.2,支持 /files/output/* + /files/input/* + http(s)://* 三种协议,同名跳过,自动 mkdir -p)" ], "image": [ "POST /api/image/resize — sharp 尺寸调整", "POST /api/image/upscale — lanczos3 放大", "POST /api/image/grid-crop — 九宫格切图,支持 rows / cols / gap、rectsPx 自定义矩形、orderMode 输出顺序与 exportIndexes 指定序号", "POST /api/image/grid-compose — 多图宫格拼接,支持 rows / cols / width / height / gap / background / fit / showIndexes / cells[],输出 PNG 到 /files/output", "POST /api/image/combine — 横/纵向拼接", "POST /api/image/compare — 双图对比结果生成(slider/side-by-side/blink/overlay/heatmap/focus)", "POST /api/image/remove-bg — 抠图(占位)" ], "resources": [ "GET /api/resources/categories — 资源库分类,支持 image/video/audio/set 四类", "GET /api/resources/items?kind= — 资源库素材列表,set 类型会回传 materialSetKind 与 materialSetItems", "POST /api/resources/items/add — 单个图像/视频/音频入库", "POST /api/resources/sets/add — 整个素材集入库,按当前顺序复制媒体文件或保存文本 manifest", "GET /api/resources/file/:id — 单个媒体资源文件", "GET /api/resources/thumb/:id — 图片资源或素材集首图缩略图", "GET /api/resources/set/:id — 素材集 JSON manifest", "GET /api/resources/set-file/:id/:index — 素材集内第 index 个媒体文件" ], "eagle": [ "GET /api/eagle/status — 检查本机 Eagle API 可达性,仅允许 127.0.0.1/localhost", "POST /api/eagle/import — 将上传素材、输出素材、素材集或文本发送到本机 Eagle,支持 /files/input、/files/output、资源库文件、素材集文件和 http(s) URL" ], "aiWatermark": [ "GET /api/ai-watermark/status — 检测 remove-ai-watermarks CLI/Python 包或 Electron sidecar runtime、版本、已知 visible mark 与 optionalFeatures(invisible/lama/detect/trustmark/controlnet/adaptivePolish/esrgan/model/guidanceScale)", "POST /api/ai-watermark/process — 去AI水印辅助节点处理入口,支持 smart/visible/erase(cv2/LaMA)/invisible/all/metadata-check/metadata-remove/identify,输出统一转存 /files/output 或返回文本报告" ], "cloudUploads": [ "GET /api/cloud-uploads/status — 返回云端上传目标的脱敏配置与摘要,用于 API 设置页和素材右键菜单", "POST /api/cloud-uploads/test — 检查单个云端上传目标配置,真实上传前不写入测试文件", "POST /api/cloud-uploads/upload — 将图像/视频/音频素材上传到启用的云端目标;首版支持腾讯云 COS 与阿里云 OSS,输出 URL/path/objectKey" ], "proxy": [ "POST /api/proxy/image — 图像生成(贞贞工坊,自动转存)", "POST /api/proxy/image/fal/submit — FAL Queue 提交(gpt-image-2-fal / nano-banana-pro-fal,同步返 images[] 或异步返 requestId+responseUrl)", "GET /api/proxy/image/fal/query?requestId&endpoint&responseUrl — FAL 任务轮询(HTTP 非200 时 IN_QUEUE/IN_PROGRESS 视为 pending,完成 images[] 转存)", "POST /api/proxy/llm — LLM Chat(独立 Key, 支持 stream:true SSE 透传;content 支持多模态 text+image_url+video_url 数组;视频默认由内置 ffmpeg 按整段视频均匀抽取可配置数量关键帧并转 image_url dataURL 发送;native-base64 / compressed-base64 发送压缩原视频 Base64,URL 模式转绝对 URL;有视频时强制非流式;temperature 0~2, max_tokens 100~128000)", "POST /api/proxy/mj/imagine — Midjourney imagine(speed_map: turbo/fast/relax → mj-turbo/mj-fast/mj-relax;payload 严格对齐 runMJ:base64Array+prompt+remix+ar/no/c/s/iw/sw/cw/sv/seed)", "GET /api/proxy/mj/task/:id?speed= — Midjourney 轮询;code===1 成功、status==='SUCCESS' 取 image_url(主图)+image_urls(JSON string 解析为 4 张)", "POST /api/proxy/mj/upload — Midjourney sref/oref 参考图上传(上游 mj/submit/upload-discord-images,返 result[0]/result 作为 URL)", "POST /api/proxy/video/submit — 视频任务提交", "GET /api/proxy/video/query?taskId — 视频任务轮询(转存)", "POST /api/proxy/audio/submit — Suno 提交(generate/cover/extend, 7 版本 MV 映射)", "GET /api/proxy/audio/query?clipIds&saveLocal — Suno 轮询(saveLocal=true 时转存到本地, tracks 含 clipId+remoteUrl+audioUrl)", "POST /api/proxy/audio/upload — Suno 本地音频上传(multer + 5 步上传链 init→S3→finish→轮询→initialize-clip, 返回 clipId)", "POST /api/proxy/runninghub/submit — RH 工作流提交(v1.2.9.16 起统一读 settings.rhApiKey,不再使用 useWallet/wallet=1 分路)", "GET /api/proxy/runninghub/query?taskId — RH 任务轮询(转存)", "GET /api/proxy/runninghub/app-info?webappId — RH 应用信息", "POST /api/proxy/runninghub/upload-asset — RH 上传资源(路径白名单含 /files/output/ · /output/ · /files/input/ · /input/ 4 种前缀)", "POST /api/proxy/external/test-provider — v1.8.2 扩展 API 平台测试端点,可用 providerId 或临时 provider 配置测试 OpenAI兼容/ModelScope/火山/ComfyUI/即梦 CLI,响应只返回脱敏 provider", "POST /api/proxy/external/image — v1.8.4 扩展平台图像生成,支持 OpenAI 兼容、ModelScope、火山 Seedream、即梦 CLI、ComfyUI 工作流,输出转存 /files/output", "POST /api/proxy/external/video — v1.8.4 扩展平台视频生成,支持 OpenAI 兼容、火山 Seedance、即梦 CLI,输出转存 /files/output", "POST /api/proxy/external/llm — v1.8.4 扩展平台 LLM 调用,支持 OpenAI 兼容、ModelScope、火山方舟聊天格式" ] } }, "executableNodeTypes": [ "image", "edit", "multi-angle-3d", "panorama-720", "penguin-portrait", "video", "seedance", "director-storyboard", "audio", "llm", "runninghub", "runninghub-wallet", "rh-tools", "rh-toolbox", "comfyui-store", "resize", "upscale", "grid-crop", "grid-editor", "remove-bg", "combine", "image-compare", "frame-extractor", "frame-pair", "upload", "loop", "random-route", "pick-from-set", "drawing-board", "panorama-3d", "cinematic", "video-motion", "multi-angle-visual", "portrait-master", "pose-master", "aggregate-parser", "batch-processor", "batch-tagger", "topaz-image-upscale", "topaz-video-upscale", "remove-ai-watermark" ], "nonExecutableNodeTypes": { "description": "不参与批量运行的节点(纯展示 / 参数记录 / 隐藏配置)", "nodes": [ "text", "idea", "bp", "relay", "material-set", "portrait-metadata", "storyboard-grid", "video-output", "browser", "rh-config", "comfyui-app-maker" ] }, "developerOnlyNodeTypes": { "description": "仅开发环境注册的维护者工具节点,不计入 totalNodes,不出现在生产 dist/Electron 用户包;打包后置检查必须禁止这些节点泄漏。", "nodes": [ { "type": "rh-toolbox-maker", "label": "RH工具箱制作器", "purpose": "维护者在画布里制作 RH工具箱 manifest:拉取 RunningHub nodeInfoList、配置输入/参数/固定字段/输出协议、复制或下载 JSON、保存开发草稿。", "guards": [ "Canvas.tsx / nodeRegistry.ts / portTypes.ts 仅在 import.meta.env.DEV 下注册", "src/utils/rhToolboxDeveloper.ts 仅保存开发草稿到 localStorage,生产运行服务不依赖该模块", "electron/_post_build.cjs::checkNoRhToolboxMaker 拦截 RHToolboxMakerNode / RH工具箱制作器 / rh-toolbox-maker" ] } ] }, "shortcuts": { "customizable": "v1.9.1 起默认快捷键可在顶部工具栏 ? → 快捷键设置中自定义;配置持久化到 t8-canvas-shortcuts,新增动作必须先登记 DEFAULT_SHORTCUTS 并补 tests/keyboardShortcuts.test.ts。", "Ctrl+Z": "撤销", "Ctrl+Shift+Z / Ctrl+Y": "重做", "Ctrl+C / Ctrl+V / Ctrl+D": "复制 / 粘贴 / 快速复制;画布上 Ctrl+V 若剪贴板含图像/视频/音频则直接生成上传素材节点", "Ctrl+Shift+V": "连边粘贴(保留与原画布邻居的连接)", "Delete / Backspace": "删除选中", "Ctrl+A": "全选", "左键拖动空白": "平移画布", "Ctrl + 左键拖动(画布/组空白)": "框选多个节点", "Ctrl + 左键拖动(图片/视频/音频缩略图)": "跨节点拖拽素材到另一个节点 (phase15)", "拖拽文件到画布": "图像/视频/音频文件直接上传并生成 UploadNode;同类型多文件自动形成合集", "右键点击节点/选区": "弹出菜单(组执行/打组/合并到素材集/复制/删除)", "打组后右上角 ▶": "执行组内所有节点", "打组后双击标题": "重命名节点组", "Z": "焦点在画布空白处时缩小并查看画布全貌", "G": "焦点在画布空白处且未选中节点时定位当前视野最近节点", "中键 / 右键拖动": "平移画布", "空格 + 拖拽": "平移画布(备选)", "ESC (拖拽素材中)": "取消跨节点拖拽" }, "panorama3dSceneActors": { "version": "2.0.9-dev", "status": "implemented-dev", "date": "2026-06-06", "description": "3D 全景节点新增多人彩色低多边形小人、动作姿势、场景快照、构图安全区、布局导入导出和视频参考提示词,用于控制全景场景中的人物位置、朝向和动作参考。", "sourceFiles": [ "src/utils/panorama3d.ts", "src/components/nodes/Panorama3DNode.tsx", "src/components/Canvas.tsx", "tests/panorama3d.test.ts" ], "dataFields": [ "panoramaAvatars", "panoramaActiveAvatarId", "panoramaSceneSnapshot", "panoramaControlSnapshotUrl", "panoramaAvatarKeyframes", "panoramaKeyframeSequenceCount", "panoramaOcclusionMasks", "panoramaOcclusionMaskVisible", "panoramaActorOverlayVisible", "panoramaAvatarIkEditMode", "panoramaCompositionGuide", "panoramaSceneLegendVisible", "panoramaScenePrompt", "panoramaStoryboardPromptEnabled", "panoramaStoryboardPromptText", "panoramaStoryboardPromptSnapshotText", "panoramaStoryboardPresetPrompt", "panoramaStoryboardPresetName", "panoramaStoryboardPromptPresets", "panoramaStoryboardSelectedPresetId", "panoramaActionPrompt", "panoramaActionPlan", "PanoramaAvatar.groundMode", "PanoramaAvatar.rootHeight", "PanoramaAvatar.rootPitch", "PanoramaAvatar.rootRoll", "PanoramaAvatar.poseParams.armLBendOffsetZ", "PanoramaAvatar.poseParams.armRBendOffsetZ", "PanoramaAvatar.poseParams.legLBendOffsetZ", "PanoramaAvatar.poseParams.legRBendOffsetZ", "PanoramaAvatar.poseParams.armLOffsetZ", "PanoramaAvatar.poseParams.armROffsetZ", "PanoramaAvatar.poseParams.legLOffsetZ", "PanoramaAvatar.poseParams.legROffsetZ", "panoramaShotCamera.mode", "panoramaShotCamera.presetId", "panoramaShotCamera.targetAvatarId", "panoramaShotCamera.targetBone", "panoramaShotCamera.framingRatio", "panoramaShotCamera.closeupStrength", "panoramaShotCamera.lowAngle" ], "capabilities": [ "同一全景内最多 8 个彩色 3D 小人。", "点击画面放置、数字控制点或移动手柄拖动平移角色、选中角色下方旋转手柄可左右调整朝向并上下调整前后倾,角色图例点击可选中并跳转定位。", "动作预设扩展到 100+ 种常用姿态,覆盖基础移动、手势表演、跆拳道/拳击/武器、运动、舞蹈和剧情动作;每个新动作都带 root 默认值、关键词和 poseParams 骨骼参数。", "Phase A 动作底座新增贴地/离地/手动高度、角色整体离地高度、前后倾和左右翻滚,可表达飞踢、受击后仰、单膝跪地、倒地等不钉地动作。", "Phase B.1 骨架底座把四肢拆成上臂/前臂、大腿/小腿;角色面板支持左/右上臂、左/右大腿、左/右肘、左/右膝附加弯曲微调。", "Phase B.2 选中角色时把手/脚端点投影为低干扰 DOM IK 手柄,可直接拖动左手、右手、左脚、右脚微调肢体方向和肘膝弯曲。", "Phase C 导演镜头支持全身动作、双人打斗、低机位、脚部特写、手部特写、肩后视角和被击者视角,可绑定角色和身体部位并导出镜头提示词。", "Phase D 可在预览右上角打开全屏导演台,集中调整视角、角色、骨骼、导演镜头、构图和导出参数。", "Phase D.1 3D 全景节点改为左预览/参数、右角色双列布局,右栏独立滚动;摄像机/导览移到左侧预览下方并常展开,热点取点表单不溢出,并修正快捷键帮助弹窗在龙珠主题下的高对比可读性。", "3D 全景节点选中或全屏导演台打开时支持节点级快捷键:1-8 选中并跳转角色、Tab 切换角色、I 进入画面关节编辑、O 打开全屏、? 查看帮助。", "Phase E 补齐后续导演台能力:支持控制快照、动作关键帧时间轴和手动遮挡参考区,三者都会进入 panoramaSceneSnapshot 与 promptText。", "Phase E.1 强化画面直接编辑:遮挡区可在预览里拖动和拖角缩放,关节模式可直接拖肩/肘/手/髋/膝/脚,关键帧快照可按帧数输出 F01-Fxx 序列帧。", "Phase E.2 继续修正画面编辑可用性:全屏导演台左侧预览也支持直接拖角色/关节/遮挡,Delete/Backspace 会优先删除选中的遮挡或当前小人,不再误删整个节点;动作预设左右肢体改为顺侧外展,避免手脚互相交叉乱折。", "Phase E.4 右栏常展开并取消普通节点内侧 maxHeight 滚动,普通节点动作生成移到左栏摄像机/导览下方空白区,序列帧数量输入支持先输入 1 再组成 12,多帧快照自动输出为一个图像素材集,角色平移/旋转按钮贴近角色右侧并在靠右边缘时换边,避免被身体、关节点或预览边缘挡住。", "Phase F 新增动作生成:可把自然语言导演指令解析为 PanoramaActionPlan 草案,支持本地规则、AI JSON 增强、应用当前、新增角色、替换场景,并自动写入小人、关键帧、导演镜头和序列帧参数。", "Phase F.1 动作生成升级:本地解析可识别跆拳道等非旧模板动作,AI 草案可用 poseParams 自定义动作,关键帧清洗会避免 K1/K2/K3 全静态,并按每段最多 6 帧限制序列帧数量。", "Phase F.2 序列帧导出修复:每个 F01-Fxx 快照渲染前都会同步 Three 小人 mesh 到插值后的姿态,并强化空手道直拳等动作终点,让序列缩略图能看出动作变化。", "可调远近、大小、脚底高度、透明度、朝向和面向镜头。", "场景快照导出会合成当前全景视角与小人,并写入 panoramaSceneSnapshot;panoramaSourceUrl 保持原始全景贴图。", "支持 16:9、9:16、1:1、4:3 构图安全区、快照图例、场景词复制和布局 JSON 导入导出。", "场景快照可通过现有发送素材弹窗作为图片发送到其他画布/节点,sourceNodeData 保留结构化人物布局。", "检测同画布姿势大师节点,可把姿势提示和预设轻量导入当前小人的动作、角色设定与 poseParams,后续可继续深化为精确骨架映射。" ], "actionDirectorPhaseA": [ "PanoramaAvatar 新增 groundMode/rootHeight/rootPitch/rootRoll 字段,并进入 sanitize、upsert、scene snapshot 和 promptText。", "飞踢、受击后仰、单膝跪地、倒地动作预设会设置合理 root 默认姿态,用户可继续手动调整。", "数字角色点增加 nodrag/nopan 和 touch-action 边界,只移动小人不旋转全景;选中角色下方新增旋转手柄并写入 heading/faceMode。", "场景词会输出 Root状态,要求下游保持离地高度、身体倾斜和动作关系。" ], "actionDirectorPhaseB1": [ "Three.js 小人从单段四肢升级为 segmented limb:arm/leg 主关节 + lower joint + hand/foot endpoint。", "动作预设开始使用 elbow/knee bend,让坐下、蹲下、飞踢、跪地、受击后仰更接近人体结构。", "poseParams 支持 armLBendOffsetZ / armRBendOffsetZ / legLBendOffsetZ / legRBendOffsetZ,在当前预设基础上微调肘膝弯曲。" ], "actionDirectorPhaseB2": [ "手/脚 endpoint 控制点通过 Three world position 投影为 DOM 按钮,并复用 nodrag/nopan/touch-action 事件边界;Phase D 起仅在关节编辑模式中显示,避免普通预览遮挡画面。", "拖动 IK 手柄期间只更新 avatarsRef、poseParams 和 Three mesh,松手再写回 ReactFlow node data。", "首版轻量屏幕 IK 写入 arm/leg OffsetZ 与 BendOffsetZ,用于快速修正手脚位置;后续可继续升级为严格 2-bone IK。", "动作预设数值收敛为保守可读姿态,手动切换动作时清空上一动作的 poseParams 偏移,避免默认动作被旧 IK 偏移污染。", "画面 IK 手柄在该阶段先只保留手/脚小圆点,肘/膝和上半段由面板滑杆控制;Phase E.1 已升级为肩/肘/手/髋/膝/脚都可直接拖动。" ], "actionDirectorPhaseB3": [ "选中角色新增移动手柄,和数字角色点一样用于平移角色在全景中的 yaw/pitch 站位。", "旋转手柄从环绕角度算法改为直接拖拽映射:左右拖调整 heading,上下拖调整 rootPitch,避免起拖时方向跳变。", "快照图例里的角色 chip 点击会调用 focusAvatar,直接选中并跳转到对应角色附近视角。" ], "actionDirectorPhaseC": [ "新增 panoramaShotCamera 协议,mode 区分 panorama-view 当前视角和 shot-camera 动作参考镜头,不宣称单张全景具备真实 xyz 平移视差。", "导演镜头预设覆盖全身动作、双人打斗、低机位、脚部特写、手部特写、肩后视角和被击者视角,支持 targetAvatarId 与 targetBone 绑定。", "角色 / 场景面板新增快照模式、镜头预设、镜头目标、身体部位、镜头比例、特写强度、低机位和套用按钮。", "预览层显示独立导演取景框、中心到目标部位的目标线和目标标签;导出场景快照会把该框线绘入参考图。", "buildPanoramaSceneSnapshot 会写入 shotCamera 和 shotTarget,promptText 追加导演镜头语言,适合传给图生视频/首帧参考链路。" ], "actionDirectorPhaseD": [ "补齐所有内置动作的 root 默认姿态,切换动作时统一重置 groundMode/rootHeight/rootPitch/rootRoll 与 poseParams,避免飞踢、倒地、受击等动作污染挥手/指向/对话。", "重新收敛挥手、指向、持物、对话、战斗、飞踢、受击后仰等默认肢体角度,以可读人体轮廓优先,极端动作主要由离地和整体倾斜表达。", "panoramaAvatarIkEditMode 控制画面关节编辑点显隐;节点面板新增“关节”按钮,快捷键 I 可切换,关闭后立即清理 DOM 控制点。", "3D 全景预览右上角新增全屏导演台与快捷键帮助按钮;节点头部也提供 ? 入口。", "节点内角色面板默认只保留高频动作、朝向、关节、重置、复制和全屏入口,导演镜头与高级骨骼/位置参数改为折叠区。", "全屏导演台通过 createPortal 打开,左侧显示大预览,右侧集中提供视角、角色、骨骼、导演镜头、构图安全区、快照、发送、入库和场景词全参数。", "节点级快捷键只在当前 3D 全景节点被选中或全屏导演台打开时响应,并跳过 input/textarea/select/contentEditable。" ], "actionDirectorPhaseE": [ "新增 panoramaControlSnapshotUrl,控制快照导出时临时隐藏全景球背景,在深色背景上输出低模角色、导演镜头框、遮挡参考和图例,用作姿势/构图控制参考图。", "新增 panoramaAvatarKeyframes,节点面板和全屏导演台都可把当前角色姿态记录为关键帧,并可一键应用/删除;buildPanoramaScenePrompt 会输出动作时间轴说明。", "新增 panoramaOcclusionMasks 与 panoramaOcclusionMaskVisible,用户可手动标注画面百分比遮挡区;遮挡框会显示在预览层、绘入场景/控制快照,并写入 promptText。", "发送素材时如果同时存在场景快照与控制快照,会一并发送,sourceNodeData 保留完整 panoramaSceneSnapshot。" ], "actionDirectorPhaseE1": [ "遮挡参考从只靠右侧滑杆升级为预览内直接编辑:拖遮挡框主体移动,拖 8 个边角/边缘手柄调整大小;快照里使用更高对比填充、斜线纹理、虚线边框和标签,避免透明遮挡难以理解。", "画面关节编辑从手/脚端点扩展到 shoulder / elbow / hand / hip / knee / foot;按钮文案改为“关节”,提示用户可直接在画面拖动肩、肘、手、髋、膝、脚。", "新增 panoramaKeyframeSequenceCount,场景快照在存在至少两个关键帧时会自动插值生成 F01-Fxx 序列帧,并把 sequenceFrameCount / sequenceFrames 写入 panoramaSceneSnapshot。", "节点右侧设置栏使用 nodrag/nowheel 并拦截 wheel,鼠标滚轮可以滚动右侧参数面板而不是误操作画布;摄像机/导览移到左侧预览下方,右侧聚焦角色、关节、时间轴和遮挡设置。" ], "actionDirectorPhaseE2": [ "全屏导演台不再只显示静态 img,左侧预览增加 directorStageRef 交互层,并复用角色点、移动/旋转手柄、关节点和遮挡拖拽/缩放手柄。", "预览右上角快捷键和全屏按钮改成高对比圆形按钮,叠在深色或复杂全景图上仍可辨认。", "新增 activeOcclusionMaskId;点击或拖动遮挡会选中该遮挡,Delete/Backspace 优先删除选中遮挡,其次删除当前小人,并在节点级快捷键捕获阶段阻止 ReactFlow 删除整个 3D 全景节点。", "挥手、指向、坐下、奔跑、蹲下、飞踢、受击后仰等预设统一改为左右手脚顺侧外展:左肢体根关节与肘/膝下段为负向,右肢体为正向,默认站立和各动作脚部不再向中线交叉。", "关节拖拽从固定 dx/dy 符号改为屏幕空间目标求解,拖上/下/左/右都会按鼠标方向靠近;节点小预览和全屏导演台舞台都增加 window pointerdown 捕获、舞台捕获阶段 IK 命中测试、previewStageRef 捕获指针、mousedown 拦截与 window pointermove/up 兜底,避免 ReactFlow、遮挡层或按钮重绘打断非放大模式关节拖拽。", "遮挡参考标签改为浅琥珀底、深色粗体、深色边框和白色外描边,并同步到场景/控制快照绘制,叠在蓝色斜线遮挡区上仍能看清。" ], "actionDirectorPhaseE4": [ "普通节点右侧栏从内部 maxHeight 滚动和 details 折叠改为常展开自然占高,角色/场景、导演镜头、时间轴、遮挡参考、高级姿态和场景词预览都在右栏直接可见;动作生成移到左栏摄像机/导览下方空白区。", "panoramaKeyframeSequenceCount 输入框改成本地草稿态,onChange 只在合法 2-48 时写回节点,onBlur/Enter 再清洗,用户可以直接输入 12 而不会被即时改成 2。", "场景快照导出时主快照仍写入 imageUrl/imageUrls/urls;F01-Fxx 序列帧不再进入通用 imageUrls,改为自动创建或更新一个 image material-set 节点,避免 autoOutput 一帧一个节点铺满画布。", "发送序列帧时默认使用 material-set 模式;需要单帧时可从素材集拆散或使用取用节点。", "选中角色的平移/旋转按钮改为贴近角色右侧的浮动工具组,靠近画面右边缘时才自动换到左侧;活跃角色浮层层级高于 IK 关节点,减少被身体轮廓、关节点和预览边缘遮挡导致点不到。" ], "actionDirectorPhaseF": [ "新增 PanoramaActionPlan 协议与 PANORAMA_ACTION_TERMS 动作词库,覆盖飞踢、受击后仰、闪避、扶起、脚部特写、低机位等常用导演指令。", "PANORAMA_AVATAR_POSES 扩展为 100+ 种数据化动作定义;动作词库会从 pose 定义自动生成,包含跆拳道横踢/前踢/侧踢/下劈/后踢、拳击、持武器、运动、舞蹈和剧情动作。", "buildPanoramaLocalActionPlan 可离线把“角色B飞踢角色A,角色A受击后仰,脚部特写,8帧”解析成角色站位、动作 root、poseParams、关键帧和 shotCamera;帧数会按每段最多 6 帧收敛。", "sanitizePanoramaActionPlan 会为 poseId 合并默认 root/poseParams,修正 AI 返回的重复大时间点和全静态 K1/K2/K3,并把 48 帧这类过量序列帧限制到动作段需要的数量。", "buildPanoramaActionPlannerSystemPrompt / UserPrompt 复用现有 generateLlm 的 /api/proxy/llm 生成 JSON 草案,parsePanoramaActionPlanJson 和 sanitizePanoramaActionPlan 负责提取、校验和数值钳制;AI 失败时自动回退本地草案。", "3D 全景普通节点左栏摄像机/导览下方与全屏导演台右栏新增“动作生成”面板:解析后先显示草案摘要,用户可选择应用当前、新增角色或替换场景,再写入 panoramaAvatars / panoramaAvatarKeyframes / panoramaShotCamera / panoramaKeyframeSequenceCount。", "序列帧导出循环在每帧 drawFrame 前调用 updateAvatarMeshes,确保 poseId、poseParams、rootPitch/rootRoll/rootHeight 的插值真正进入 Three 渲染结果。" ], "verification": [ "node --test tests\\panorama3d.test.ts", "npm run type-check", "npm run build" ] }, "webImageReversePluginV232": { "version": "2.3.2-dev", "status": "implemented-dev", "date": "2026-06-23", "description": "网页图片反推插件补齐发送模式隔离和按当前提示词重新生成图片,并固定使用 qwen-web 同款 ModelScope VL 模型。", "sourceFiles": [ "extension/scripts/background.js", "extension/scripts/content.js", "extension/styles/content.css", "backend/src/routes/externalProviders.js", "src/components/Canvas.tsx", "tests/webImageReverseToCanvas.test.ts" ], "capabilities": [ "发提示词、发图片、图+提示词三种按钮生成的画布节点严格按模式区分:只发图片不会额外生成文本节点或提示词字段。", "浮层生成提示词 textarea 可编辑;点击“生成图片”后按用户当前输入调用 /api/proxy/external/image 生成新图。", "后端 /api/proxy/external/web-image 固定视觉模型为 Qwen/Qwen3-VL-235B-A22B-Instruct,不再受普通 chatModel/model 参数覆盖。", "识别到视觉模型返回无法读取图片、未检测到图像数据等不可读文本时,接口返回 unreadable_image_prompt,不再继续调用生图。" ], "verification": [ "node --test tests\\webImageReverseToCanvas.test.ts", "node -c backend\\src\\routes\\externalProviders.js" ] }, "rhCutoutBoardImageEdit": { "version": "2.3.2-dev", "status": "implemented-dev", "date": "2026-06-23", "description": "画板节点与图像编辑弹窗新增 RH 自动抠图按钮,复用 RH 工具箱高清抠图应用层并替换原图。", "sourceFiles": [ "src/components/nodes/DrawingBoardNode.tsx", "src/components/nodes/ImageEditModal.tsx", "tests/rhCutoutSurface.test.ts" ], "capabilities": [ "画板节点选中图片后可点 RH自动抠图,返回结果直接替换同一个图片元素并保持选中。", "图像编辑弹窗普通模式抠图后替换当前底图,后续裁剪、遮罩、画板和宫格切分都继续使用抠图结果。", "图像编辑组合模式抠图会替换当前选中的图片图层,并保留图层位置、尺寸、旋转、透明度等编辑属性。" ], "verification": [ "node --test tests\\rhCutoutSurface.test.ts", "node --test tests\\rhToolbox.test.ts tests\\drawingBoardInteractions.test.ts tests\\drawingBoardCutout.test.ts tests\\imageEditAnnotationTools.test.ts tests\\rhCutoutSurface.test.ts" ] }, "placementShelfAndThemeOverlayV232": { "version": "2.3.2-dev", "status": "implemented-dev", "date": "2026-06-23", "description": "放置栏新增隐藏/恢复控制,侧边栏折叠时主题顶部栏统一避让折叠按钮,牧场物语端口和剪裁点层级恢复正常。", "sourceFiles": [ "src/components/Canvas.tsx", "src/components/edges/DeletableEdge.tsx", "src/styles/index.css", "src/styles/theme-farm-story.css", "src/styles/theme-saintseiya.css", "tests/placementShelf.test.ts", "tests/themeRegistry.test.ts" ], "capabilities": [ "放置栏右上角可直接隐藏,左侧控制条新增同一套主题风格的展开/折叠按钮。", "侧边栏收缩时,牧场物语顶部看板、快捷栏、公告栏和圣斗士顶部栏按统一变量避让按钮区域。", "牧场物语主题下 ReactFlow handle、resize control、edge label renderer 分层修复,端口不再被节点内容隐藏,剪裁点不再盖到节点上。" ], "verification": [ "node --test tests\\placementShelf.test.ts tests\\themeRegistry.test.ts" ] } }