From 78398eba4bf3d57c40a5416eef62a8e3100ee9d3 Mon Sep 17 00:00:00 2001 From: linshen <32978552+linshenkx@users.noreply.github.com> Date: Mon, 4 May 2026 13:35:06 +0800 Subject: [PATCH] fix(pro-workspace): restore tool/variable/favorite actions via provide/inject Migrate Pro workspace event handlers from emit to provide/inject pattern to fix broken event chain introduced by RouterView refactoring (2b669b9d). Fixed actions: - openToolManager: tool management modal not opening (#293) - openVariableManager: variable manager not accessible - handleSaveFavorite: save-to-favorite not working in Pro mode - saveToGlobal: save temporary variable to global failing - openPromptPreview: prompt preview panel not opening Pattern: provide('key', handler) in PromptOptimizerApp, inject with emit fallback in ContextSystemWorkspace and ContextUserWorkspace. --- .../app-layout/PromptOptimizerApp.vue | 22 ++++++++++++ .../context-mode/ContextSystemWorkspace.vue | 36 ++++++++++++++++--- .../context-mode/ContextUserWorkspace.vue | 29 ++++++++++++++- 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/components/app-layout/PromptOptimizerApp.vue b/packages/ui/src/components/app-layout/PromptOptimizerApp.vue index ae7ef019..ce2551ed 100644 --- a/packages/ui/src/components/app-layout/PromptOptimizerApp.vue +++ b/packages/ui/src/components/app-layout/PromptOptimizerApp.vue @@ -1749,6 +1749,28 @@ void registerOptionalIntegrations({ }); provide("handleSaveFavorite", handleSaveFavorite); +// 提供 openToolManager 接口(供 Pro 工作区直接调用) +provide("openToolManager", () => { + showToolManager.value = true; +}); + +// 提供 openVariableManager 接口(供 Pro 工作区直接调用) +provide("openVariableManager", (variableName?: string) => { + handleOpenVariableManager(variableName); +}); + +// 提供 saveToGlobal 接口(供 Pro 工作区将临时变量保存到全局) +provide("saveToGlobal", (name: string, value: string) => { + variableManager?.customVariables?.value + ? (variableManager.customVariables.value[name] = value) + : undefined; +}); + +// 提供 openPromptPreview 接口(供 Pro 工作区打开提示词预览面板) +provide("openPromptPreview", () => { + showPreviewPanel.value = true; +}); + // 模板管理器 const templateManagerState = useTemplateManager(services); diff --git a/packages/ui/src/components/context-mode/ContextSystemWorkspace.vue b/packages/ui/src/components/context-mode/ContextSystemWorkspace.vue index aede7248..c33ca788 100644 --- a/packages/ui/src/components/context-mode/ContextSystemWorkspace.vue +++ b/packages/ui/src/components/context-mode/ContextSystemWorkspace.vue @@ -40,9 +40,9 @@ :scan-variables="scanVariables" :optimization-mode="optimizationMode" :tool-count="toolCount" - @open-variable-manager="emit('open-variable-manager')" + @open-variable-manager="handleOpenVariableManager" @open-context-editor="handleOpenContextEditor" - @open-tool-manager="emit('open-tool-manager')" + @open-tool-manager="handleOpenToolManager" :enable-tool-management="true" :collapsible="true" :max-height="300" @@ -131,7 +131,7 @@ @openTemplateManager="handleOpenTemplateManager" @switchVersion="handleSwitchVersion" @switchToV0="handleSwitchToV0" - @save-favorite="emit('save-favorite', $event)" + @save-favorite="handleSaveFavorite" @open-preview="handleOpenPromptPreview" @apply-to-conversation="handleApplyToConversation" @apply-improvement="handleApplyImprovement" @@ -174,7 +174,7 @@ :input-mode="inputMode" :button-size="buttonSize" @variable-change="handleVariableChange" - @save-to-global="(name: string, value: string) => emit('save-to-global', name, value)" + @save-to-global="handleSaveToGlobal" @temporary-variable-remove="handleVariableRemove" @temporary-variables-clear="handleVariablesClear" /> @@ -681,6 +681,13 @@ const appOpenContextEditor = inject< ((messagesOrTab?: ContextEditorOpenArg, variables?: Record) => void) | null >('openContextEditor', null) +// 注入 App 层统一的 open* 接口(Pro 工作区专有功能) +const appOpenToolManager = inject<(() => void) | null>('openToolManager', null) +const appOpenVariableManager = inject<((variableName?: string) => void) | null>('openVariableManager', null) +const appHandleSaveFavorite = inject<((data: SaveFavoritePayload) => void) | null>('handleSaveFavorite', null) +const appSaveToGlobal = inject<((name: string, value: string) => void) | null>('saveToGlobal', null) +const appOpenPromptPreview = inject<(() => void) | null>('openPromptPreview', null) + // Pro Multi: message list is session-owned (per-submode isolation). // Keep emitting update:optimizationContext only as a backward-compat hook for non-App hosts. const proMultiSession = useProMultiMessageSession() @@ -733,6 +740,27 @@ const handleOpenContextEditor = ( emit('open-context-editor') } +// Pro 工作区专有功能的处理函数(优先使用 inject,emit 作为兜底) +const handleOpenToolManager = () => { + if (appOpenToolManager) { appOpenToolManager(); return; } + emit('open-tool-manager') +} + +const handleOpenVariableManager = () => { + if (appOpenVariableManager) { appOpenVariableManager(); return; } + emit('open-variable-manager') +} + +const handleSaveFavorite = (data: SaveFavoritePayload) => { + if (appHandleSaveFavorite) { appHandleSaveFavorite(data); return; } + emit('save-favorite', data) +} + +const handleSaveToGlobal = (name: string, value: string) => { + if (appSaveToGlobal) { appSaveToGlobal(name, value); return; } + emit('save-to-global', name, value) +} + // ✅ 优化模式:固定为 'system'(此组件专门用于系统模式优化) const optimizationMode: OptimizationMode = 'system'; diff --git a/packages/ui/src/components/context-mode/ContextUserWorkspace.vue b/packages/ui/src/components/context-mode/ContextUserWorkspace.vue index d32a7e06..b727a0b8 100644 --- a/packages/ui/src/components/context-mode/ContextUserWorkspace.vue +++ b/packages/ui/src/components/context-mode/ContextUserWorkspace.vue @@ -185,7 +185,7 @@ @openTemplateManager="handleOpenTemplateManager" @switchVersion="handleSwitchVersion" @switchToV0="handleSwitchToV0" - @save-favorite="emit('save-favorite', $event)" + @save-favorite="handleSaveFavorite" @open-preview="handleOpenPromptPreview" @apply-improvement="handleApplyImprovement" @save-local-edit="handleSaveLocalEdit" @@ -667,6 +667,8 @@ const emit = defineEmits<{ // --- 打开面板/管理器 --- /** 打开变量管理器 */ "open-variable-manager": []; + /** 打开工具管理器 */ + "open-tool-manager": []; /** 打开模板管理器 */ "open-template-manager": [type?: string]; /** 配置模型 */ @@ -720,6 +722,13 @@ const appOpenTemplateManager = inject<((type?: string) => void) | null>( null, ) +// 注入 App 层统一的 open* 接口(Pro 工作区专有功能) +const appOpenToolManager = inject<(() => void) | null>('openToolManager', null) +const appOpenVariableManager = inject<((variableName?: string) => void) | null>('openVariableManager', null) +const appHandleSaveFavorite = inject<((data: SaveFavoritePayload) => void) | null>('handleSaveFavorite', null) +const appSaveToGlobal = inject<((name: string, value: string) => void) | null>('saveToGlobal', null) +const appOpenPromptPreview = inject<(() => void) | null>('openPromptPreview', null) + const handleOpenModelManager = () => { if (appOpenModelManager) { appOpenModelManager('text') @@ -738,6 +747,22 @@ const handleOpenTemplateManager = (typeOrPayload?: string | Record { + if (appOpenToolManager) { appOpenToolManager(); return; } + emit('open-tool-manager') +} + +const handleOpenVariableManager = () => { + if (appOpenVariableManager) { appOpenVariableManager(); return; } + emit('open-variable-manager') +} + +const handleSaveFavorite = (data: SaveFavoritePayload) => { + if (appHandleSaveFavorite) { appHandleSaveFavorite(data); return; } + emit('save-favorite', data) +} + // ======================== // 内部状态管理 // ======================== @@ -1996,6 +2021,7 @@ const { temporaryVariables: computed(() => ({ ...temporaryVariables.value })), predefinedVariables, saveGlobalVariable: (name, value) => { + if (appSaveToGlobal) { appSaveToGlobal(name, value); return; } if (variableManager?.isReady.value) { variableManager.addVariable(name, value) } @@ -2007,6 +2033,7 @@ const { }) const handleSaveToGlobalFromTest = (name: string, value: string) => { + if (appSaveToGlobal) { appSaveToGlobal(name, value); return; } if (variableManager?.isReady.value) { variableManager.addVariable(name, value) }