diff --git a/README.md b/README.md index 33e12b61..82b643a2 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ **The system of action for AI-native cybersecurity—where intent becomes governed execution, evidence becomes operational memory, and every operation improves the next.** -CyberStrikeAI connects planning, execution, human oversight, evidence, and replay in one auditable workspace. Built in Go, it combines Eino-powered agents, MCP-native tools, RAG knowledge, graph workflows, and attack-chain modeling and analysis for authorized security operations. +CyberStrikeAI connects planning, execution, human oversight, evidence, and replay in one auditable workspace. Built in Go, it combines Eino-powered agents, MCP-native tools, RAG knowledge, visual workflows, and attack-chain modeling and analysis for authorized security operations. **Start here:** [Quick start](#quick-start-one-command-deployment) · [Documentation](docs/en-US/README.md) · [Security hardening](docs/en-US/security-hardening.md) diff --git a/README_CN.md b/README_CN.md index 33c85d2c..09ed51f1 100644 --- a/README_CN.md +++ b/README_CN.md @@ -8,7 +8,7 @@ **CyberStrikeAI 是 AI 原生网络安全的智能执行中枢——让意图转化为受治理的行动,让证据沉淀为运营记忆,并让每次行动优化下一次行动。** -CyberStrikeAI 将规划、执行、人工监督、证据与复盘连接在同一个可审计工作空间中。项目基于 Go 构建,融合 Eino 智能体、MCP 原生工具、RAG 知识、图工作流以及攻击链建模与分析能力,面向已获得明确授权的安全任务。 +CyberStrikeAI 将规划、执行、人工监督、证据与复盘连接在同一个可审计工作空间中。项目基于 Go 构建,融合 Eino 智能体、MCP 原生工具、RAG 知识、可视化工作流以及攻击链建模与分析能力,面向已获得明确授权的安全任务。 **从这里开始:** [快速上手](#快速上手一条命令部署) · [中文文档](docs/zh-CN/README.md) · [安全加固](docs/zh-CN/security-hardening.md) @@ -110,7 +110,7 @@ CyberStrikeAI 将规划、执行、人工监督、证据与复盘连接在同一 - 🤖 **智能体执行层**:将自然语言意图转化为受控、可审计的安全行动。 - 🧩 **Eino 编排**:支持单智能体及 Deep、Plan-Execute、Supervisor 多智能体模式。 -- 🔀 **图工作流**:通过 Agent、工具、条件、审批和输出节点构建可复用流程。 +- 🔀 **工作流**:通过 Agent、工具、条件、审批和输出节点构建可复用流程。 - 🎭 **角色化测试**:为常见安全场景提供聚焦的提示词和工具策略。 ### 工具与知识扩展 diff --git a/web/static/i18n/en-US.json b/web/static/i18n/en-US.json index 3b9f5fd7..515af376 100644 --- a/web/static/i18n/en-US.json +++ b/web/static/i18n/en-US.json @@ -97,7 +97,7 @@ "agentsManagement": "Agent management", "roles": "Roles", "rolesManagement": "Roles Management", - "workflows": "Graph Orchestration", + "workflows": "Workflows", "settings": "System settings", "hitl": "Human-in-the-loop", "c2": "C2", @@ -3101,8 +3101,8 @@ "roleFilterOnBanner": "These tools are checked and linked to this role (independent of MCP-wide enable).", "roleFilterOffBanner": "These tools are unchecked and not linked to this role.", "checkboxLinkTitle": "Check to link this tool to this role", - "bindWorkflow": "Bind graph workflow", - "bindWorkflowHint": "When a workflow is selected, conversations with this role automatically run the bound graph; workflow fields are configured freely in the graph JSON.", + "bindWorkflow": "Bind workflow", + "bindWorkflowHint": "When a workflow is selected, conversations with this role run it automatically; workflow fields are configured freely in the graph JSON.", "workflowPolicy": "Workflow trigger policy", "workflowPolicyAuto": "Auto trigger", "workflowPolicyOff": "Off", @@ -3110,11 +3110,11 @@ "workflowDisabledSuffix": " (disabled)" }, "workflows": { - "title": "Graph Orchestration", - "newGraph": "New graph", - "processLibrary": "Process library", + "title": "Workflows", + "newGraph": "New workflow", + "processLibrary": "Workflows", "nodeLibrary": "Node library", - "emptyList": "No graph workflows yet", + "emptyList": "No workflows yet", "statusEnabled": "Enabled", "statusDisabled": "Disabled", "metaId": "ID", diff --git a/web/static/i18n/zh-CN.json b/web/static/i18n/zh-CN.json index 27c0d6fd..0ed52913 100644 --- a/web/static/i18n/zh-CN.json +++ b/web/static/i18n/zh-CN.json @@ -97,7 +97,7 @@ "agentsManagement": "Agent管理", "roles": "角色", "rolesManagement": "角色管理", - "workflows": "图编排", + "workflows": "工作流", "settings": "系统设置", "hitl": "人机协同", "c2": "C2", @@ -3089,20 +3089,20 @@ "roleFilterOnBanner": "以下为「已勾选、关联到本角色」的工具(与 MCP 管理里全局开/关无关)。", "roleFilterOffBanner": "以下为「未勾选、未关联到本角色」的工具。", "checkboxLinkTitle": "勾选表示本角色关联使用该工具", - "bindWorkflow": "绑定图编排流程", - "bindWorkflowHint": "选中流程后,对话页使用该角色会自动触发绑定图;流程字段由图定义 JSON 自由配置。", - "workflowPolicy": "流程触发策略", + "bindWorkflow": "绑定工作流", + "bindWorkflowHint": "选中工作流后,对话页使用该角色会自动触发;工作流字段由图定义 JSON 自由配置。", + "workflowPolicy": "工作流触发策略", "workflowPolicyAuto": "自动触发", "workflowPolicyOff": "关闭", - "noWorkflowBind": "不绑定流程", + "noWorkflowBind": "不绑定工作流", "workflowDisabledSuffix": "(已禁用)" }, "workflows": { - "title": "图编排", - "newGraph": "新建图", - "processLibrary": "流程库", + "title": "工作流", + "newGraph": "新建工作流", + "processLibrary": "工作流列表", "nodeLibrary": "节点库", - "emptyList": "暂无图编排流程", + "emptyList": "暂无工作流", "statusEnabled": "启用", "statusDisabled": "禁用", "metaId": "ID", @@ -3110,19 +3110,19 @@ "metaDescription": "描述", "metaEnabled": "启用", "metaIdHint": "创建后不可修改,用于 API 与角色绑定", - "metaModalTitle": "流程信息", + "metaModalTitle": "工作流信息", "editMeta": "编辑", - "untitled": "未命名流程", + "untitled": "未命名工作流", "toggleEnabled": "启用/禁用", "metaEnabledHint": "禁用后无法被角色自动触发", "enabledUpdated": "启用状态已更新", "enabledUpdateFailed": "更新启用状态失败", "namePlaceholder": "基础 Web 扫描", "descriptionPlaceholder": "可选", - "toolbarLabel": "流程编辑工具", + "toolbarLabel": "工作流编辑工具", "canvasTools": "画布工具", "moreActions": "更多", - "deleteWorkflow": "删除流程", + "deleteWorkflow": "删除工作流", "package": { "importLocal": "导入本地包", "export": "导出", @@ -3155,7 +3155,7 @@ "overwriteCheck": "我已确认覆盖当前本地工作流", "overwriteConfirm": "确认覆盖并导入", "errors": { - "fileRequired": "请选择本地图编排包后再预检。", + "fileRequired": "请选择本地工作流包后再预检。", "fileTooLarge": "文件超过 10 MiB 限制,请选择更小的本地包。", "invalidArchive": "本地包不是有效的 Zip 文件,无法完成预检。", "unsupportedFormat": "本地包格式或版本不受支持。", diff --git a/web/static/js/monitor.js b/web/static/js/monitor.js index e4f60944..18da54c1 100644 --- a/web/static/js/monitor.js +++ b/web/static/js/monitor.js @@ -332,7 +332,7 @@ const responseStreamStateByProgressId = new Map(); // 主通道当前迭代轮次缓存:progressId -> { iteration, orchestration } const mainIterationStateByProgressId = new Map(); -/** 图编排多 Agent 节点切换时清空流式聚合,避免推理/输出条目覆盖上一节点内容 */ +/** 工作流多 Agent 节点切换时清空流式聚合,避免推理/输出条目覆盖上一节点内容 */ function clearTimelineStreamStates(progressId) { responseStreamStateByProgressId.delete(progressId); thinkingStreamStateByProgressId.delete(progressId); @@ -1886,7 +1886,7 @@ function handleStreamEvent(event, progressElement, progressId, workflowNodeId: curNode, einoAgent: curAgent }); - // 主通道进入新轮次或图编排切换到新 Agent 节点后,不复用上一段的流式时间线条目 + // 主通道进入新轮次或工作流切换到新 Agent 节点后,不复用上一段的流式时间线条目 if (prevN != null && (n < prevN || prevN !== n || (curNode && prevNode && curNode !== prevNode))) { clearTimelineStreamStates(progressId); } diff --git a/web/static/js/workflow-package-client.js b/web/static/js/workflow-package-client.js index 32cb0c66..4c9974fd 100644 --- a/web/static/js/workflow-package-client.js +++ b/web/static/js/workflow-package-client.js @@ -76,7 +76,7 @@ } async function createInspection(apiFetch, file) { - if (!file) throw new WorkflowPackageError('WFPKG_FILE_REQUIRED', '请选择本地图编排包'); + if (!file) throw new WorkflowPackageError('WFPKG_FILE_REQUIRED', '请选择本地工作流包'); const body = new FormData(); body.append('file', file, file.name || 'workflow.csapkg.zip'); const response = await apiFetch('/api/workflow-package-inspections', { method: 'POST', body: body }); diff --git a/web/static/js/workflow-package-ui.test.cjs b/web/static/js/workflow-package-ui.test.cjs index 42345033..c06206af 100644 --- a/web/static/js/workflow-package-ui.test.cjs +++ b/web/static/js/workflow-package-ui.test.cjs @@ -2,11 +2,11 @@ const fs = require('node:fs'); const test = require('node:test'); const assert = require('node:assert/strict'); -test('图编排提供导入、导出和覆盖确认容器', () => { +test('工作流提供导入、导出和覆盖确认容器', () => { const html = fs.readFileSync('web/templates/index.html', 'utf8'); const zh = JSON.parse(fs.readFileSync('web/static/i18n/zh-CN.json', 'utf8')); assert.match(html, /onclick="openWorkflowPackageImportModal\(\)"/); - assert.match(html, /onclick="exportCurrentWorkflowPackage\(\)"/); + assert.match(html, /onclick="[^"]*exportCurrentWorkflowPackage\(\)"/); assert.match(html, /id="workflow-package-import-modal"/); assert.match(html, /id="workflow-package-overwrite-modal"/); assert.equal(zh.workflows.package.importLocal, '导入本地包'); diff --git a/web/templates/index.html b/web/templates/index.html index fcf193f7..76eda1e2 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -227,13 +227,13 @@ - +