4.0 KiB
4.0 KiB
我的提示词弹窗与工具窗口启用经验
更新日期:2026-04-27
背景
提示词选择器标题从“提示词”改为“我的提示词”后,点击标题需要打开同名工具窗口,并进入当前生成类型对应的分类筛选。
这条链路横跨 AI 输入栏、提示词选择器、工具窗口服务、WinBox 管理器和“我的提示词”工具本体。问题不是单个按钮文案,而是“轻量入口如何唤醒重工具窗口”的协作边界。
问题现象
- 第一次点击“我的提示词”没有弹出窗口。
- 控制台显示
toolWindowService.openTool已创建prompt-history实例,状态也是open。 - 用户看到的状态却像是窗口仍在左侧工具栏或没有出现。
关键日志:
[PromptHistoryPopover] open my prompts beforeStatus: undefined
[ToolWindowService] openTool:new-instance status: open
[PromptHistoryPopover] requested my prompts open afterStatus: open
这说明服务层状态已成功打开,问题不在 openTool 本身,而在渲染这个状态的 WinBox 管理器没有提前启用。
根因
ToolWinBoxManager 是延迟功能,只有 toolWindowManagerEnabled 为 true 时才挂载。左侧工具栏按钮会通过 enableToolWindows 先启用工具窗口运行时,再打开工具。
提示词选择器属于 AI 输入栏里的轻量入口,最初直接调用:
toolWindowService.openTool(tool, { componentProps });
这会造成一种半成功状态:
- 服务层已经有
open实例。 - 管理器尚未挂载,因此没有 WinBox 来消费和渲染这条状态。
- 后续其它入口启用工具窗口后,之前的状态才可能显现,用户会误以为第一次点击失败。
修复思路
打开“我的提示词”前先唤醒工具窗口管理器,再调用 openTool。
落地方式:
Drawnix将现有enableToolWindows传给DeferredAIInputBar。DeferredAIInputBar继续传给AIInputBar。AIInputBar再传给PromptHistoryPopover。PromptHistoryPopover在点击“我的提示词”时先调用onBeforeOpenMyPrompts,再openTool。
这样入口不再依赖隐式全局状态,且复用已有工具窗口启用机制。
分类筛选经验
打开“我的提示词”时,要把当前生成类型作为 componentProps.initialCategory 传入:
toolWindowService.openTool(tool, {
componentProps: {
initialCategory: generationType,
},
});
“我的提示词”工具接收 initialCategory 后:
- 初始化分类为对应类型。
- 复用已打开窗口时同步切换分类。
- 清空旧的搜索词和 Skill 筛选,避免上一次筛选污染当前入口。
日志定位经验
这类跨层 UI 问题要按状态流分层打点:
- 入口层:点击前后的
getToolState。 - 服务层:
openTool的 launchMode、复用/新建分支、实例状态。 - 渲染层:
ToolWinBoxManager是否收到对应状态。 - 工具栏层:最小化/常驻图标点击时的状态。
如果服务层显示 status: open,但渲染层没有日志,优先检查管理器是否启用,而不是继续追 openTool。
后续规则
- 轻量入口打开 WinBox 工具前,必须先启用工具窗口管理器。
openTool成功不代表 UI 已渲染,必须确认消费状态的管理器已挂载。- 入口传业务上下文用
componentProps,不要用全局变量或窗口级临时状态。 - 复用窗口时要显式同步筛选条件,避免保留上一次入口的 UI 状态。
- 定位日志要分层、带 instanceId/status/isLauncher/isPinned,问题确认后再移除或降级。
回归检查清单
- 首次点击提示词选择器标题是否立即打开“我的提示词”窗口?
- 窗口已最小化时,再次点击标题是否恢复窗口?
- 当前生成类型为图片/视频/音频/文本/Agent 时,是否进入对应分类?
- 搜索词或 Skill 筛选是否不会污染下一次从选择器打开?
- 控制台是否能看到入口、服务层和 WinBox 管理器的状态链路?