fix(plugins): 插件管理 - 修正官方应用插件的分类与状态显示

AI 审美分析和剪辑工作台在管理页显示为"已停用",原因是三处插件
分类清单不一致:

- 后端 officialApplicationPolicies 缺少 editor-shell
- 管理页 officialApplicationIds 同时缺少 ai-art-critique 和 editor-shell
- 用户插件页另有一份重复清单

后端把这两个插件当作系统协议处理(Kind=protocol),platformAvailable
回退为 false,于是返回"管理员已停用该插件",管理页据此渲染成"已停用"。

修复:

- 后端补上 editor-shell 应用策略(权威修复,决定平台可用性)
- 前端抽取唯一清单 OFFICIAL_APPLICATION_PLUGIN_IDS,管理页与用户插件页
  共用,删除两份重复实现
- 补前后端回归测试,锁定这 8 个官方应用插件

验证:tsc --noEmit 通过;前端 17 项测试通过;后端 TestEditorShell* 与
既有插件测试通过;前后端镜像构建通过。
This commit is contained in:
jay
2026-09-12 21:16:42 +08:00
parent 01a2d171f5
commit 044e220d14
7 changed files with 139 additions and 15 deletions

View File

@@ -10,9 +10,11 @@ import { EditorTranscription } from "./editor-transcription";
import { EditorExport } from "./editor-export";
import { EditorAiAssistant } from "./editor-ai-assistant";
export const EDITOR_SHELL_PLUGIN_ID = "editor-shell";
const manifest: PluginManifestV2 = {
apiVersion: "yingce.plugin/v2",
id: "editor-shell",
id: EDITOR_SHELL_PLUGIN_ID,
name: "剪辑工作台",
version: "0.1.0",
description: "注册时间线、预览、检查器、素材、字幕、转写、导出和 AI 编辑八个工作台插槽。",

View File

@@ -0,0 +1,32 @@
import { ART_CRITIQUE_PLUGIN_ID } from "@/lib/art-critique/contracts";
import { MEDIA_CONVERSION_PLUGIN_ID } from "@/lib/plugins/builtin/media-conversion";
import { EAGLE_PLUGIN_ID } from "@/lib/plugins/builtin/eagle";
import { PROMPT_OPTIMIZER_PLUGIN_ID } from "@/lib/plugins/builtin/prompt-optimizer";
import { COMFYUI_PLUGIN_ID, RUNNINGHUB_PLUGIN_ID } from "@/lib/plugins/builtin/workflows";
import { PORTRAIT_CLEARANCE_PLUGIN_ID } from "@/lib/portrait-clearance/contracts";
import { EDITOR_SHELL_PLUGIN_ID } from "./builtin/editor/editor-shell";
/**
* 官方“应用型”插件清单:这些插件在管理页按用户自主启停处理,而不是系统协议。
*
* 之前管理页、用户插件页和后端各自维护一份清单,管理页漏掉 AI 审美分析和剪辑
* 工作台,导致二者被误判为系统协议并在管理页显示“已停用”。这里收敛为唯一来源。
*/
export const OFFICIAL_APPLICATION_PLUGIN_IDS = [
RUNNINGHUB_PLUGIN_ID,
COMFYUI_PLUGIN_ID,
EAGLE_PLUGIN_ID,
PROMPT_OPTIMIZER_PLUGIN_ID,
PORTRAIT_CLEARANCE_PLUGIN_ID,
ART_CRITIQUE_PLUGIN_ID,
MEDIA_CONVERSION_PLUGIN_ID,
EDITOR_SHELL_PLUGIN_ID,
] as const;
const officialApplicationIdSet = new Set<string>(OFFICIAL_APPLICATION_PLUGIN_IDS);
/** 判断插件是否为官方应用型插件(用户可在插件页自主启停)。 */
export function isOfficialApplicationPluginId(pluginId: string) {
return officialApplicationIdSet.has(pluginId);
}