diff --git a/easyflow-ui-admin/app/src/layouts/AuthenticatedStandaloneLayout.vue b/easyflow-ui-admin/app/src/layouts/AuthenticatedStandaloneLayout.vue
new file mode 100644
index 00000000..0c9b3ba1
--- /dev/null
+++ b/easyflow-ui-admin/app/src/layouts/AuthenticatedStandaloneLayout.vue
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
diff --git a/easyflow-ui-admin/app/src/router/__tests__/agent-design-route.test.ts b/easyflow-ui-admin/app/src/router/__tests__/agent-design-route.test.ts
new file mode 100644
index 00000000..e49afce6
--- /dev/null
+++ b/easyflow-ui-admin/app/src/router/__tests__/agent-design-route.test.ts
@@ -0,0 +1,28 @@
+import { describe, expect, it } from 'vitest';
+
+import agentDesignRoutes from '../routes/external/agent-design';
+import agentRoutes from '../routes/modules/agent';
+
+describe('agent design route', () => {
+ it('keeps the standalone designer outside dynamic menu routes', () => {
+ const designRoute = agentDesignRoutes.find(
+ (route) => route.name === 'AgentDesigner',
+ );
+
+ expect(agentRoutes.some((route) => route.name === 'AgentDesigner')).toBe(
+ false,
+ );
+ expect(designRoute).toBeDefined();
+ expect(designRoute?.path).toBe('/ai/agents/designer/:id');
+ expect(designRoute?.meta).toMatchObject({
+ activePath: '/ai/agents',
+ hideInBreadcrumb: true,
+ hideInMenu: true,
+ hideInTab: true,
+ noBasicLayout: true,
+ openInNewWindow: true,
+ });
+ expect(designRoute?.meta?.ignoreAccess).not.toBe(true);
+ expect(designRoute?.component).toBeTypeOf('function');
+ });
+});
diff --git a/easyflow-ui-admin/app/src/router/__tests__/workflow-design-route.test.ts b/easyflow-ui-admin/app/src/router/__tests__/workflow-design-route.test.ts
new file mode 100644
index 00000000..b60a894d
--- /dev/null
+++ b/easyflow-ui-admin/app/src/router/__tests__/workflow-design-route.test.ts
@@ -0,0 +1,23 @@
+import { describe, expect, it } from 'vitest';
+
+import workflowRoutes from '../routes/modules/workflow';
+
+describe('workflow design route', () => {
+ it('uses the authenticated standalone shell without exposing a menu or tab', () => {
+ const designRoute = workflowRoutes.find(
+ (route) => route.name === 'WorkflowDesign',
+ );
+
+ expect(designRoute).toBeDefined();
+ expect(designRoute?.path).toBe('/ai/workflow/design');
+ expect(designRoute?.meta).toMatchObject({
+ activePath: '/ai/workflow',
+ hideInBreadcrumb: true,
+ hideInMenu: true,
+ hideInTab: true,
+ noBasicLayout: true,
+ });
+ expect(designRoute?.meta?.ignoreAccess).not.toBe(true);
+ expect(designRoute?.component).toBeTypeOf('function');
+ });
+});
diff --git a/easyflow-ui-admin/app/src/router/routes/external/agent-design.ts b/easyflow-ui-admin/app/src/router/routes/external/agent-design.ts
new file mode 100644
index 00000000..15902691
--- /dev/null
+++ b/easyflow-ui-admin/app/src/router/routes/external/agent-design.ts
@@ -0,0 +1,23 @@
+import type { RouteRecordRaw } from 'vue-router';
+
+import { $t } from '#/locales';
+
+const routes: RouteRecordRaw[] = [
+ {
+ name: 'AgentDesigner',
+ path: '/ai/agents/designer/:id',
+ component: () =>
+ import('#/views/ai/agents/AgentDesignerStandaloneView.vue'),
+ meta: {
+ title: $t('menus.ai.agents'),
+ openInNewWindow: true,
+ hideInMenu: true,
+ hideInTab: true,
+ hideInBreadcrumb: true,
+ noBasicLayout: true,
+ activePath: '/ai/agents',
+ },
+ },
+];
+
+export default routes;
diff --git a/easyflow-ui-admin/app/src/router/routes/modules/agent.ts b/easyflow-ui-admin/app/src/router/routes/modules/agent.ts
index 16648870..e4c737bb 100644
--- a/easyflow-ui-admin/app/src/router/routes/modules/agent.ts
+++ b/easyflow-ui-admin/app/src/router/routes/modules/agent.ts
@@ -1,19 +1,6 @@
-import type {RouteRecordRaw} from 'vue-router';
-
-import {$t} from '#/locales';
+import type { RouteRecordRaw } from 'vue-router';
const routes: RouteRecordRaw[] = [
- {
- name: 'AgentDesigner',
- path: '/ai/agents/designer/:id',
- component: () => import('#/views/ai/agents/AgentDesigner.vue'),
- meta: {
- title: $t('menus.ai.agents'),
- openInNewWindow: true,
- hideInMenu: true,
- activePath: '/ai/agents',
- },
- },
{
name: 'AgentChat',
path: '/ai/agent-chat',
diff --git a/easyflow-ui-admin/app/src/router/routes/modules/workflow.ts b/easyflow-ui-admin/app/src/router/routes/modules/workflow.ts
index 8bce4f3b..808c47ce 100644
--- a/easyflow-ui-admin/app/src/router/routes/modules/workflow.ts
+++ b/easyflow-ui-admin/app/src/router/routes/modules/workflow.ts
@@ -8,11 +8,15 @@ const routes: RouteRecordRaw[] = [
icon: 'ant-design:apartment-outlined',
title: '工作流设计',
hideInMenu: true,
+ hideInTab: true,
+ hideInBreadcrumb: true,
+ noBasicLayout: true,
activePath: '/ai/workflow',
},
name: 'WorkflowDesign',
path: '/ai/workflow/design',
- component: () => import('#/views/ai/workflow/WorkflowDesign.vue'),
+ component: () =>
+ import('#/views/ai/workflow/WorkflowDesignStandaloneView.vue'),
},
{
meta: {
diff --git a/easyflow-ui-admin/app/src/views/ai/agents/AgentDesignerStandaloneView.vue b/easyflow-ui-admin/app/src/views/ai/agents/AgentDesignerStandaloneView.vue
new file mode 100644
index 00000000..60367294
--- /dev/null
+++ b/easyflow-ui-admin/app/src/views/ai/agents/AgentDesignerStandaloneView.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowDesignStandaloneView.vue b/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowDesignStandaloneView.vue
new file mode 100644
index 00000000..e2819d61
--- /dev/null
+++ b/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowDesignStandaloneView.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+