;
toolActions.forEach((action) => {
counts[getToolCategory(action)]++;
diff --git a/static/src/components/chat/quickdock/WorkflowWindow.vue b/static/src/components/chat/quickdock/WorkflowWindow.vue
index 07da328d..bd32b481 100644
--- a/static/src/components/chat/quickdock/WorkflowWindow.vue
+++ b/static/src/components/chat/quickdock/WorkflowWindow.vue
@@ -5,22 +5,23 @@
:class="{ 'qd-window-enter': windowEntering, 'qd-window-exit': windowExiting }"
>
diff --git a/static/src/components/sidebar/ConversationSidebar.vue b/static/src/components/sidebar/ConversationSidebar.vue
index e3d5b32d..b2936579 100644
--- a/static/src/components/sidebar/ConversationSidebar.vue
+++ b/static/src/components/sidebar/ConversationSidebar.vue
@@ -102,7 +102,8 @@
@click="$emit('open-workflows')"
>
diff --git a/static/src/components/workflow/WorkflowEditorView.vue b/static/src/components/workflow/WorkflowEditorView.vue
index 8bfcf805..c961fd6b 100644
--- a/static/src/components/workflow/WorkflowEditorView.vue
+++ b/static/src/components/workflow/WorkflowEditorView.vue
@@ -11,15 +11,25 @@
未保存
-
+
+
+
+
+
+
+ {{ issue.message }}
+
+
+
-
-
-
-
- {{ issue.message }}
-
-
{{ flashMessage }}
@@ -487,6 +487,7 @@ const dirty = ref(false);
const saving = ref(false);
const addNodeMenuOpen = ref(false);
const addNodeSelectRef = ref(null);
+const issuesAnchorRef = ref(null);
const confirmingStageDelete = ref(false);
let flashTimer: ReturnType | null = null;
@@ -750,14 +751,13 @@ async function onSave() {
}
}
-function onActivate() {
- flash('正式版将在对话 / 菜单中激活此工作流');
-}
-
function onDocumentClick(event: MouseEvent) {
if (addNodeMenuOpen.value && addNodeSelectRef.value && !addNodeSelectRef.value.contains(event.target as HTMLElement)) {
addNodeMenuOpen.value = false;
}
+ if (issuesOpen.value && issuesAnchorRef.value && !issuesAnchorRef.value.contains(event.target as HTMLElement)) {
+ issuesOpen.value = false;
+ }
}
function iconSrc(url: string) {
@@ -837,13 +837,27 @@ onBeforeUnmount(() => {
flex-shrink: 0;
}
- &__issues {
- max-height: 160px;
+ /* 提醒/报错弹层:锚固在按钮下方,不占页面布局,固定高度 + 内部滚动 */
+ &__issues-anchor {
+ position: relative;
+ }
+
+ &__issues-pop {
+ position: absolute;
+ top: calc(100% + 6px);
+ right: 0;
+ width: 320px;
+ max-width: calc(100vw - 32px);
+ height: 240px;
overflow-y: auto;
padding: 8px 12px;
- border-bottom: 1px solid var(--border-default);
- background: var(--surface-soft);
- flex-shrink: 0;
+ border: 1px solid var(--border-default);
+ border-radius: 10px;
+ background: var(--surface-raised);
+ box-shadow: var(--shadow-mid);
+ z-index: 30;
+ scrollbar-width: thin;
+ scrollbar-color: color-mix(in srgb, var(--text-secondary) 55%, transparent) transparent;
}
&__flash {
diff --git a/static/src/components/workflow/WorkflowStageNode.vue b/static/src/components/workflow/WorkflowStageNode.vue
index c2207f06..838b4371 100644
--- a/static/src/components/workflow/WorkflowStageNode.vue
+++ b/static/src/components/workflow/WorkflowStageNode.vue
@@ -34,7 +34,6 @@
@@ -166,9 +165,5 @@ function iconSrc(url: string) {
overflow: hidden;
text-overflow: ellipsis;
}
-
- &__routes {
- flex-shrink: 0;
- }
}
diff --git a/static/src/styles/components/sidebar/_conversation.scss b/static/src/styles/components/sidebar/_conversation.scss
index 713415f2..ba054cd2 100644
--- a/static/src/styles/components/sidebar/_conversation.scss
+++ b/static/src/styles/components/sidebar/_conversation.scss
@@ -180,8 +180,8 @@
}
.workflow-icon svg {
- width: 20px;
- height: 20px;
+ width: 18px;
+ height: 18px;
}
.monitor-mode-btn.blocked {
diff --git a/static/src/utils/icons.ts b/static/src/utils/icons.ts
index 7b7278cc..89c57182 100644
--- a/static/src/utils/icons.ts
+++ b/static/src/utils/icons.ts
@@ -99,7 +99,18 @@ export const TOOL_ICON_MAP = Object.freeze({
trigger_easter_egg: 'sparkles',
list_mcp_servers: 'mcpLogo',
view_image: 'camera',
- view_video: 'eye'
+ view_video: 'eye',
+ // 工作流工具统一使用 workflow 专用图标
+ activate_workflow: 'workflow',
+ report_workflow_stage: 'workflow',
+ choose_workflow_branch: 'workflow',
+ get_workflow_status: 'workflow',
+ deactivate_workflow: 'workflow',
+ list_workflows: 'workflow',
+ save_workflow: 'workflow',
+ // 补齐原先回落到默认齿轮的原生工具
+ submit_plan: 'clipboard',
+ terminate_sub_agent: 'bot'
});
export const TOOL_CATEGORY_ICON_MAP = Object.freeze({