From ab1357f7ff6a1e7f8c5c18c566a6885e85b7cfcc Mon Sep 17 00:00:00 2001 From: xianrenge <34586161+xianrenge@users.noreply.github.com> Date: Sun, 16 Aug 2026 23:55:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=B7=A5=E4=BD=9C=E6=B5=81=E7=94=BB?= =?UTF-8?q?=E5=B8=83=E9=A1=B6=E6=A0=8F=E2=80=94=E2=80=94=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E6=A1=86=E9=9A=8F=E5=86=85=E5=AE=B9=E8=87=AA=E9=80=82=E5=BA=94?= =?UTF-8?q?=E4=B8=94=E9=99=90=E5=88=B6=E4=B8=AD=E8=8B=B1=E6=96=87=E9=95=BF?= =?UTF-8?q?=E5=BA=A6=EF=BC=8C=E4=BF=9D=E5=AD=98/=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E9=9D=A0=E5=8F=B3=E5=A7=8B=E7=BB=88=E5=8F=AF?= =?UTF-8?q?=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/FEATURES.md | 1 + ui/src/pages/WorkflowCanvasPage.tsx | 40 +++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/docs/FEATURES.md b/docs/FEATURES.md index f425475..988ef40 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -193,6 +193,7 @@ ### 2026-08-16 +- 工作流画布顶栏修正:名称输入框改为随内容自适应宽度(不再占大块空白),名称长度限制为英文 ≤150 字符 / 中文 ≤50 字符(混排按中文字符权重折算);顶栏改为可收缩布局,保证「保存 / 运行」按钮始终靠右可见不被挤出。 - 工作流画布增强:节点支持从左侧面板拖入;画布滚轮缩放(25%–250%)与空白处拖动平移;节点右键菜单(修改名称/说明/收藏/复制/删除)、连线右键删除(单击不再误删);右侧边栏只显示选中节点的选项并移除“各节点输出”总列表;新增画布导入/导出 JSON;顶栏「返回工作流」单行显示、名称框固定宽度、保存/运行右对齐。 - 新增「工作流」选项卡:画布式节点编辑器(开始/大模型/文本/输出,节点连线传参、拖动布局),内置 4 个预制工作流(翻译助手、内容总结、两步润色、写作助手)并支持自定义与恢复;新增 `workflows` 表与 `run_workflow` 命令,后端 `apps/desktop/src/workflow.rs` 执行引擎支持拓扑排序、模板变量(`{{input}}`/`{{节点id}}`)、循环检测,LLM 节点支持本地/在线大模型(节点 → 工作流 → 运行参数 → 自动回退);`workflow://node-status` 事件实时推送节点状态;5 个引擎单元测试 + 1 个真实模型端到端测试全部跑通。 - 新增「智能体」选项卡:内置 6 个预制智能体 + 支持自定义智能体(名称/图标/描述/系统提示词/默认模型/启用开关);每个智能体拥有独立会话区(`conversations.agent_id` 隔离),新建会话自动继承智能体系统提示词与默认模型;系统提示词统一注入 `chat_send` / `regenerate_message` / `edit_message` 链路;删除智能体时级联删除其会话;支持「恢复预制智能体」。 diff --git a/ui/src/pages/WorkflowCanvasPage.tsx b/ui/src/pages/WorkflowCanvasPage.tsx index 14cb743..2718c13 100644 --- a/ui/src/pages/WorkflowCanvasPage.tsx +++ b/ui/src/pages/WorkflowCanvasPage.tsx @@ -56,6 +56,30 @@ function newId(prefix: string) { return `${prefix}_${Date.now().toString(36)}${Math.floor(Math.random() * 1000)}`; } +/** 中文字符(CJK)按 3 个权重计,其余按 1:英文最多 150 字、中文最多 50 字,混排按权重折算。 */ +const NAME_MAX_WEIGHT = 150; + +function isCjkChar(ch: string) { + const code = ch.codePointAt(0) ?? 0; + return ( + (code >= 0x4e00 && code <= 0x9fff) || + (code >= 0x3400 && code <= 0x4dbf) || + (code >= 0xf900 && code <= 0xfaff) + ); +} + +function clampWorkflowName(value: string) { + let weight = 0; + let out = ""; + for (const ch of value) { + const w = isCjkChar(ch) ? 3 : 1; + if (weight + w > NAME_MAX_WEIGHT) break; + weight += w; + out += ch; + } + return out; +} + export default function WorkflowCanvasPage() { const { workflowId } = useParams<{ workflowId: string }>(); const workflows = useStore((s) => s.workflows); @@ -528,7 +552,7 @@ export default function WorkflowCanvasPage() { return (