@octo-cyber/workflow 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/controllers/ai-workflow-session.controller.d.ts +19 -0
- package/dist/controllers/ai-workflow-session.controller.d.ts.map +1 -0
- package/dist/controllers/ai-workflow-session.controller.js +135 -0
- package/dist/controllers/ai-workflow-session.controller.js.map +1 -0
- package/dist/controllers/credential.controller.d.ts +68 -0
- package/dist/controllers/credential.controller.d.ts.map +1 -0
- package/dist/controllers/credential.controller.js +303 -0
- package/dist/controllers/credential.controller.js.map +1 -0
- package/dist/controllers/index.d.ts +3 -0
- package/dist/controllers/index.d.ts.map +1 -0
- package/dist/controllers/index.js +8 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/workflow-ai.controller.d.ts +23 -0
- package/dist/controllers/workflow-ai.controller.d.ts.map +1 -0
- package/dist/controllers/workflow-ai.controller.js +164 -0
- package/dist/controllers/workflow-ai.controller.js.map +1 -0
- package/dist/controllers/workflow.controller.d.ts +66 -0
- package/dist/controllers/workflow.controller.d.ts.map +1 -0
- package/dist/controllers/workflow.controller.js +239 -0
- package/dist/controllers/workflow.controller.js.map +1 -0
- package/dist/core/expression-resolver.d.ts +49 -0
- package/dist/core/expression-resolver.d.ts.map +1 -0
- package/dist/core/expression-resolver.js +113 -0
- package/dist/core/expression-resolver.js.map +1 -0
- package/dist/core/node-registry.d.ts +24 -0
- package/dist/core/node-registry.d.ts.map +1 -0
- package/dist/core/node-registry.js +62 -0
- package/dist/core/node-registry.js.map +1 -0
- package/dist/core/workflow-executor.d.ts +50 -0
- package/dist/core/workflow-executor.d.ts.map +1 -0
- package/dist/core/workflow-executor.js +458 -0
- package/dist/core/workflow-executor.js.map +1 -0
- package/dist/entities/ai-workflow-session.entity.d.ts +17 -0
- package/dist/entities/ai-workflow-session.entity.d.ts.map +1 -0
- package/dist/entities/ai-workflow-session.entity.js +70 -0
- package/dist/entities/ai-workflow-session.entity.js.map +1 -0
- package/dist/entities/ai-workflow-version.entity.d.ts +18 -0
- package/dist/entities/ai-workflow-version.entity.d.ts.map +1 -0
- package/dist/entities/ai-workflow-version.entity.js +71 -0
- package/dist/entities/ai-workflow-version.entity.js.map +1 -0
- package/dist/entities/credential-definition.entity.d.ts +17 -0
- package/dist/entities/credential-definition.entity.d.ts.map +1 -0
- package/dist/entities/credential-definition.entity.js +66 -0
- package/dist/entities/credential-definition.entity.js.map +1 -0
- package/dist/entities/index.d.ts +9 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +22 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/workflow-definition.entity.d.ts +20 -0
- package/dist/entities/workflow-definition.entity.d.ts.map +1 -0
- package/dist/entities/workflow-definition.entity.js +85 -0
- package/dist/entities/workflow-definition.entity.js.map +1 -0
- package/dist/entities/workflow-execution.entity.d.ts +26 -0
- package/dist/entities/workflow-execution.entity.d.ts.map +1 -0
- package/dist/entities/workflow-execution.entity.js +99 -0
- package/dist/entities/workflow-execution.entity.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/n8n/cipher/cipher.d.ts +11 -0
- package/dist/n8n/cipher/cipher.d.ts.map +1 -0
- package/dist/n8n/cipher/cipher.js +54 -0
- package/dist/n8n/cipher/cipher.js.map +1 -0
- package/dist/n8n/controllers/n8n-session.controller.d.ts +20 -0
- package/dist/n8n/controllers/n8n-session.controller.d.ts.map +1 -0
- package/dist/n8n/controllers/n8n-session.controller.js +84 -0
- package/dist/n8n/controllers/n8n-session.controller.js.map +1 -0
- package/dist/n8n/index.d.ts +8 -0
- package/dist/n8n/index.d.ts.map +1 -0
- package/dist/n8n/index.js +14 -0
- package/dist/n8n/index.js.map +1 -0
- package/dist/n8n/launcher/n8n-launcher.d.ts +41 -0
- package/dist/n8n/launcher/n8n-launcher.d.ts.map +1 -0
- package/dist/n8n/launcher/n8n-launcher.js +186 -0
- package/dist/n8n/launcher/n8n-launcher.js.map +1 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.d.ts +13 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.js +103 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.js.map +1 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.d.ts +14 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.js +431 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.js.map +1 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.d.ts +13 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.js +100 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.js.map +1 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.d.ts +13 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.js +91 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.js.map +1 -0
- package/dist/n8n/nodes/OctoKnowledge.node.d.ts +6 -0
- package/dist/n8n/nodes/OctoKnowledge.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoKnowledge.node.js +95 -0
- package/dist/n8n/nodes/OctoKnowledge.node.js.map +1 -0
- package/dist/n8n/nodes/OctoNotification.node.d.ts +6 -0
- package/dist/n8n/nodes/OctoNotification.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoNotification.node.js +72 -0
- package/dist/n8n/nodes/OctoNotification.node.js.map +1 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.d.ts +6 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.js +60 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.js.map +1 -0
- package/dist/n8n/nodes/n8n-node-types.d.ts +111 -0
- package/dist/n8n/nodes/n8n-node-types.d.ts.map +1 -0
- package/dist/n8n/nodes/n8n-node-types.js +30 -0
- package/dist/n8n/nodes/n8n-node-types.js.map +1 -0
- package/dist/n8n/nodes/octo-cli-chat-model.svg +23 -0
- package/dist/n8n/nodes/package.json +16 -0
- package/dist/n8n/proxy/css-injector.d.ts +3 -0
- package/dist/n8n/proxy/css-injector.d.ts.map +1 -0
- package/dist/n8n/proxy/css-injector.js +62 -0
- package/dist/n8n/proxy/css-injector.js.map +1 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.d.ts +12 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.d.ts.map +1 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.js +131 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.js.map +1 -0
- package/dist/n8n/proxy/n8n-theme.css +45 -0
- package/dist/n8n/sync/n8n-user-sync.service.d.ts +75 -0
- package/dist/n8n/sync/n8n-user-sync.service.d.ts.map +1 -0
- package/dist/n8n/sync/n8n-user-sync.service.js +286 -0
- package/dist/n8n/sync/n8n-user-sync.service.js.map +1 -0
- package/dist/n8n/watcher/n8n-execution-watcher.d.ts +39 -0
- package/dist/n8n/watcher/n8n-execution-watcher.d.ts.map +1 -0
- package/dist/n8n/watcher/n8n-execution-watcher.js +110 -0
- package/dist/n8n/watcher/n8n-execution-watcher.js.map +1 -0
- package/dist/nodes/code.node.d.ts +24 -0
- package/dist/nodes/code.node.d.ts.map +1 -0
- package/dist/nodes/code.node.js +150 -0
- package/dist/nodes/code.node.js.map +1 -0
- package/dist/nodes/error-trigger.node.d.ts +15 -0
- package/dist/nodes/error-trigger.node.d.ts.map +1 -0
- package/dist/nodes/error-trigger.node.js +53 -0
- package/dist/nodes/error-trigger.node.js.map +1 -0
- package/dist/nodes/execute-command.node.d.ts +9 -0
- package/dist/nodes/execute-command.node.d.ts.map +1 -0
- package/dist/nodes/execute-command.node.js +81 -0
- package/dist/nodes/execute-command.node.js.map +1 -0
- package/dist/nodes/filter.node.d.ts +10 -0
- package/dist/nodes/filter.node.d.ts.map +1 -0
- package/dist/nodes/filter.node.js +95 -0
- package/dist/nodes/filter.node.js.map +1 -0
- package/dist/nodes/http-request.node.d.ts +11 -0
- package/dist/nodes/http-request.node.d.ts.map +1 -0
- package/dist/nodes/http-request.node.js +139 -0
- package/dist/nodes/http-request.node.js.map +1 -0
- package/dist/nodes/if.node.d.ts +13 -0
- package/dist/nodes/if.node.d.ts.map +1 -0
- package/dist/nodes/if.node.js +137 -0
- package/dist/nodes/if.node.js.map +1 -0
- package/dist/nodes/index.d.ts +12 -0
- package/dist/nodes/index.d.ts.map +1 -0
- package/dist/nodes/index.js +26 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/nodes/manual-trigger.node.d.ts +10 -0
- package/dist/nodes/manual-trigger.node.d.ts.map +1 -0
- package/dist/nodes/manual-trigger.node.js +36 -0
- package/dist/nodes/manual-trigger.node.js.map +1 -0
- package/dist/nodes/merge.node.d.ts +15 -0
- package/dist/nodes/merge.node.d.ts.map +1 -0
- package/dist/nodes/merge.node.js +99 -0
- package/dist/nodes/merge.node.js.map +1 -0
- package/dist/nodes/noop.node.d.ts +12 -0
- package/dist/nodes/noop.node.d.ts.map +1 -0
- package/dist/nodes/noop.node.js +32 -0
- package/dist/nodes/noop.node.js.map +1 -0
- package/dist/nodes/placeholder.node.d.ts +10 -0
- package/dist/nodes/placeholder.node.d.ts.map +1 -0
- package/dist/nodes/placeholder.node.js +50 -0
- package/dist/nodes/placeholder.node.js.map +1 -0
- package/dist/nodes/remove-duplicates.node.d.ts +9 -0
- package/dist/nodes/remove-duplicates.node.d.ts.map +1 -0
- package/dist/nodes/remove-duplicates.node.js +68 -0
- package/dist/nodes/remove-duplicates.node.js.map +1 -0
- package/dist/nodes/respond-to-webhook.node.d.ts +14 -0
- package/dist/nodes/respond-to-webhook.node.d.ts.map +1 -0
- package/dist/nodes/respond-to-webhook.node.js +116 -0
- package/dist/nodes/respond-to-webhook.node.js.map +1 -0
- package/dist/nodes/schedule-trigger.node.d.ts +9 -0
- package/dist/nodes/schedule-trigger.node.d.ts.map +1 -0
- package/dist/nodes/schedule-trigger.node.js +67 -0
- package/dist/nodes/schedule-trigger.node.js.map +1 -0
- package/dist/nodes/set.node.d.ts +12 -0
- package/dist/nodes/set.node.d.ts.map +1 -0
- package/dist/nodes/set.node.js +81 -0
- package/dist/nodes/set.node.js.map +1 -0
- package/dist/nodes/sort.node.d.ts +9 -0
- package/dist/nodes/sort.node.d.ts.map +1 -0
- package/dist/nodes/sort.node.js +61 -0
- package/dist/nodes/sort.node.js.map +1 -0
- package/dist/nodes/split-in-batches.node.d.ts +9 -0
- package/dist/nodes/split-in-batches.node.d.ts.map +1 -0
- package/dist/nodes/split-in-batches.node.js +53 -0
- package/dist/nodes/split-in-batches.node.js.map +1 -0
- package/dist/nodes/split-out.node.d.ts +9 -0
- package/dist/nodes/split-out.node.d.ts.map +1 -0
- package/dist/nodes/split-out.node.js +76 -0
- package/dist/nodes/split-out.node.js.map +1 -0
- package/dist/nodes/switch.node.d.ts +16 -0
- package/dist/nodes/switch.node.d.ts.map +1 -0
- package/dist/nodes/switch.node.js +156 -0
- package/dist/nodes/switch.node.js.map +1 -0
- package/dist/nodes/wait.node.d.ts +12 -0
- package/dist/nodes/wait.node.d.ts.map +1 -0
- package/dist/nodes/wait.node.js +81 -0
- package/dist/nodes/wait.node.js.map +1 -0
- package/dist/nodes/webhook.node.d.ts +9 -0
- package/dist/nodes/webhook.node.d.ts.map +1 -0
- package/dist/nodes/webhook.node.js +69 -0
- package/dist/nodes/webhook.node.js.map +1 -0
- package/dist/services/ai-workflow-session.service.d.ts +31 -0
- package/dist/services/ai-workflow-session.service.d.ts.map +1 -0
- package/dist/services/ai-workflow-session.service.js +118 -0
- package/dist/services/ai-workflow-session.service.js.map +1 -0
- package/dist/services/credential.service.d.ts +57 -0
- package/dist/services/credential.service.d.ts.map +1 -0
- package/dist/services/credential.service.js +155 -0
- package/dist/services/credential.service.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +14 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/push.service.d.ts +60 -0
- package/dist/services/push.service.d.ts.map +1 -0
- package/dist/services/push.service.js +121 -0
- package/dist/services/push.service.js.map +1 -0
- package/dist/services/workflow-ai.service.d.ts +61 -0
- package/dist/services/workflow-ai.service.d.ts.map +1 -0
- package/dist/services/workflow-ai.service.js +219 -0
- package/dist/services/workflow-ai.service.js.map +1 -0
- package/dist/services/workflow-context.service.d.ts +32 -0
- package/dist/services/workflow-context.service.d.ts.map +1 -0
- package/dist/services/workflow-context.service.js +155 -0
- package/dist/services/workflow-context.service.js.map +1 -0
- package/dist/services/workflow-engine.service.d.ts +90 -0
- package/dist/services/workflow-engine.service.d.ts.map +1 -0
- package/dist/services/workflow-engine.service.js +305 -0
- package/dist/services/workflow-engine.service.js.map +1 -0
- package/dist/services/workflow.service.d.ts +84 -0
- package/dist/services/workflow.service.d.ts.map +1 -0
- package/dist/services/workflow.service.js +241 -0
- package/dist/services/workflow.service.js.map +1 -0
- package/dist/triggers/cron-trigger.d.ts +39 -0
- package/dist/triggers/cron-trigger.d.ts.map +1 -0
- package/dist/triggers/cron-trigger.js +137 -0
- package/dist/triggers/cron-trigger.js.map +1 -0
- package/dist/triggers/index.d.ts +3 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +8 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/webhook-trigger.d.ts +51 -0
- package/dist/triggers/webhook-trigger.d.ts.map +1 -0
- package/dist/triggers/webhook-trigger.js +122 -0
- package/dist/triggers/webhook-trigger.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/node.types.d.ts +313 -0
- package/dist/types/node.types.d.ts.map +1 -0
- package/dist/types/node.types.js +23 -0
- package/dist/types/node.types.js.map +1 -0
- package/dist/types/workflow.types.d.ts +153 -0
- package/dist/types/workflow.types.d.ts.map +1 -0
- package/dist/types/workflow.types.js +44 -0
- package/dist/types/workflow.types.js.map +1 -0
- package/dist/utils/n8n-converter.d.ts +52 -0
- package/dist/utils/n8n-converter.d.ts.map +1 -0
- package/dist/utils/n8n-converter.js +107 -0
- package/dist/utils/n8n-converter.js.map +1 -0
- package/dist/utils/n8n-node-map.d.ts +6 -0
- package/dist/utils/n8n-node-map.d.ts.map +1 -0
- package/dist/utils/n8n-node-map.js +59 -0
- package/dist/utils/n8n-node-map.js.map +1 -0
- package/dist/workflow.module.d.ts +40 -0
- package/dist/workflow.module.d.ts.map +1 -0
- package/dist/workflow.module.js +240 -0
- package/dist/workflow.module.js.map +1 -0
- package/package.json +97 -0
- package/web/components/ChatPanel.tsx +344 -0
- package/web/components/N8nIframe.tsx +119 -0
- package/web/components/SessionPanel.tsx +301 -0
- package/web/components/ToolPanel.tsx +404 -0
- package/web/components/WorkflowDiff.tsx +161 -0
- package/web/components/WorkflowGraph.tsx +158 -0
- package/web/components/WorkflowPreviewPanel.tsx +186 -0
- package/web/hooks/use-n8n-session.ts +46 -0
- package/web/index.ts +29 -0
- package/web/manifest.ts +16 -0
- package/web/messages/en-US.json +94 -0
- package/web/messages/zh-CN.json +94 -0
- package/web/pages/AiDesignPage.tsx +215 -0
- package/web/pages/CredentialsPage.tsx +7 -0
- package/web/pages/ExecutionsPage.tsx +7 -0
- package/web/pages/WorkflowsPage.tsx +7 -0
- package/web/services/workflow-ai-service.ts +173 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"workflows": {
|
|
3
|
+
"loading": "加载工作流编辑器...",
|
|
4
|
+
"errors": {
|
|
5
|
+
"auth": {
|
|
6
|
+
"title": "需要登录"
|
|
7
|
+
},
|
|
8
|
+
"unavailable": {
|
|
9
|
+
"title": "n8n 服务不可用",
|
|
10
|
+
"troubleshootTitle": "排查步骤:",
|
|
11
|
+
"step1": "确认后端服务已启动(端口 9988)",
|
|
12
|
+
"step2": "确认 n8n 子进程正常运行(端口 5678)",
|
|
13
|
+
"step3": "检查后端日志中是否有 n8n 启动错误"
|
|
14
|
+
},
|
|
15
|
+
"network": {
|
|
16
|
+
"title": "网络连接失败"
|
|
17
|
+
},
|
|
18
|
+
"unknown": {
|
|
19
|
+
"title": "连接失败"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"aiDesign": {
|
|
23
|
+
"title": "AI 工作流设计",
|
|
24
|
+
"description": "描述你的自动化需求,让 AI 生成工作流配置",
|
|
25
|
+
"placeholder": "描述你想创建的工作流,例如「当 GitHub 创建新 Issue 时发送 Slack 通知」",
|
|
26
|
+
"inputPlaceholder": "描述你的工作流需求...",
|
|
27
|
+
"thinking": "AI 正在设计你的工作流...",
|
|
28
|
+
"jsonPreview": "工作流 JSON",
|
|
29
|
+
"copied": "已复制到剪贴板",
|
|
30
|
+
"requestFailed": "生成工作流失败,请重试",
|
|
31
|
+
"unknownError": "发生未知错误",
|
|
32
|
+
"generatedIn": "生成耗时",
|
|
33
|
+
"sessions": "设计会话",
|
|
34
|
+
"noSessions": "暂无会话,点击 + 创建新会话",
|
|
35
|
+
"newSession": "新建设计会话",
|
|
36
|
+
"sessionName": "会话名称",
|
|
37
|
+
"sessionNamePlaceholder": "例如:邮件通知工作流",
|
|
38
|
+
"baseWorkflow": "基础工作流(可选)",
|
|
39
|
+
"selectWorkflow": "选择已有的 n8n 工作流",
|
|
40
|
+
"newFromScratch": "从零创建",
|
|
41
|
+
"create": "创建",
|
|
42
|
+
"cancel": "取消",
|
|
43
|
+
"sessionDeleted": "会话已删除",
|
|
44
|
+
"loadSessionsFailed": "加载会话列表失败",
|
|
45
|
+
"deleteSessionFailed": "删除会话失败",
|
|
46
|
+
"createSessionFailed": "创建会话失败",
|
|
47
|
+
"tools": "工具",
|
|
48
|
+
"versions": "版本",
|
|
49
|
+
"apiDocs": "API 文档",
|
|
50
|
+
"aiTool": "AI 工具",
|
|
51
|
+
"model": "模型",
|
|
52
|
+
"defaultModel": "默认",
|
|
53
|
+
"unavailable": "不可用",
|
|
54
|
+
"selectSessionFirst": "选择会话后查看版本历史",
|
|
55
|
+
"rollback": "回退",
|
|
56
|
+
"rollbackSuccess": "回退成功",
|
|
57
|
+
"rollbackFailed": "回退失败",
|
|
58
|
+
"apiDocsDesc": "选择 API 文档作为 AI 的上下文参考",
|
|
59
|
+
"estimatedTokens": "预估 tokens",
|
|
60
|
+
"apply": "应用",
|
|
61
|
+
"applyConfirmTitle": "应用工作流到 n8n?",
|
|
62
|
+
"applyConfirmDesc": "此操作将停用工作流并更新 JSON,之后你可以手动重新激活。",
|
|
63
|
+
"applyConfirmNoWorkflow": "此会话没有关联的 n8n 工作流。请从已有工作流创建会话以使用应用功能。",
|
|
64
|
+
"applyConfirm": "确认应用",
|
|
65
|
+
"applySuccess": "工作流已成功应用到 n8n",
|
|
66
|
+
"applyFailed": "应用工作流到 n8n 失败",
|
|
67
|
+
"noLinkedWorkflow": "没有关联的 n8n 工作流,JSON 已保存",
|
|
68
|
+
"noChanges": "未检测到变更",
|
|
69
|
+
"nodesAdded": "新增节点",
|
|
70
|
+
"nodesRemoved": "删除节点",
|
|
71
|
+
"nodesModified": "修改节点",
|
|
72
|
+
"connectionsChanged": "连线变更",
|
|
73
|
+
"n8nWorkflows": "n8n 工作流",
|
|
74
|
+
"noN8nWorkflows": "未找到 n8n 工作流",
|
|
75
|
+
"loadN8nWorkflowsFailed": "加载 n8n 工作流列表失败",
|
|
76
|
+
"systemPrompt": "系统提示词",
|
|
77
|
+
"systemPromptDesc": "AI 工作流设计器使用的系统提示词,每次服务启动时自动更新。",
|
|
78
|
+
"loadPromptFailed": "加载系统提示词失败",
|
|
79
|
+
"close": "关闭",
|
|
80
|
+
"workflowPreview": "工作流预览",
|
|
81
|
+
"comparison": "变更对比",
|
|
82
|
+
"original": "原始版本",
|
|
83
|
+
"modified": "修改版本",
|
|
84
|
+
"noWorkflowPreview": "生成工作流后可查看预览",
|
|
85
|
+
"viewPrompt": "查看提示词"
|
|
86
|
+
},
|
|
87
|
+
"n8nSession": {
|
|
88
|
+
"authRequired": "请先登录后再使用工作流编辑器",
|
|
89
|
+
"unavailable": "n8n 服务未启动,请检查后端服务是否正常运行",
|
|
90
|
+
"sessionFailed": "n8n 会话创建失败 ({status})",
|
|
91
|
+
"networkError": "无法连接到后端服务,请检查网络连接"
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useState, useCallback } from 'react'
|
|
4
|
+
import { useTranslations } from 'next-intl'
|
|
5
|
+
import { toast } from 'sonner'
|
|
6
|
+
import {
|
|
7
|
+
PanelRightClose,
|
|
8
|
+
PanelRightOpen,
|
|
9
|
+
PanelBottomClose,
|
|
10
|
+
PanelBottomOpen,
|
|
11
|
+
} from 'lucide-react'
|
|
12
|
+
import { Button } from '@octo-cyber/ui/components/ui/button'
|
|
13
|
+
import { PageHeader } from '@octo-cyber/ui/components/shared/page-header'
|
|
14
|
+
import {
|
|
15
|
+
AlertDialog,
|
|
16
|
+
AlertDialogAction,
|
|
17
|
+
AlertDialogCancel,
|
|
18
|
+
AlertDialogContent,
|
|
19
|
+
AlertDialogDescription,
|
|
20
|
+
AlertDialogFooter,
|
|
21
|
+
AlertDialogHeader,
|
|
22
|
+
AlertDialogTitle,
|
|
23
|
+
} from '@octo-cyber/ui/components/ui/alert-dialog'
|
|
24
|
+
import { SessionPanel } from '../components/SessionPanel'
|
|
25
|
+
import { ChatPanel } from '../components/ChatPanel'
|
|
26
|
+
import { ToolPanel } from '../components/ToolPanel'
|
|
27
|
+
import { WorkflowPreviewPanel } from '../components/WorkflowPreviewPanel'
|
|
28
|
+
import {
|
|
29
|
+
workflowAiService,
|
|
30
|
+
type AiWorkflowSession,
|
|
31
|
+
type AiWorkflowVersion,
|
|
32
|
+
} from '../services/workflow-ai-service'
|
|
33
|
+
|
|
34
|
+
export default function AiDesignPage() {
|
|
35
|
+
const t = useTranslations('workflows.aiDesign')
|
|
36
|
+
|
|
37
|
+
// Session state
|
|
38
|
+
const [activeSession, setActiveSession] = useState<AiWorkflowSession | null>(null)
|
|
39
|
+
|
|
40
|
+
// Tool settings
|
|
41
|
+
const [selectedTool, setSelectedTool] = useState('claude')
|
|
42
|
+
const [selectedModel, setSelectedModel] = useState('')
|
|
43
|
+
const [selectedDocs, setSelectedDocs] = useState<string[]>([])
|
|
44
|
+
|
|
45
|
+
// Panel visibility
|
|
46
|
+
const [isRightPanelOpen, setIsRightPanelOpen] = useState(true)
|
|
47
|
+
const [isPreviewOpen, setIsPreviewOpen] = useState(true)
|
|
48
|
+
|
|
49
|
+
// Version refresh trigger
|
|
50
|
+
const [versionRefreshKey, setVersionRefreshKey] = useState(0)
|
|
51
|
+
|
|
52
|
+
// Workflow preview state: latest generated JSON from chat
|
|
53
|
+
const [lastGeneratedJson, setLastGeneratedJson] = useState<string | null>(null)
|
|
54
|
+
|
|
55
|
+
// Apply confirmation
|
|
56
|
+
const [applyJson, setApplyJson] = useState<string | null>(null)
|
|
57
|
+
const [isApplying, setIsApplying] = useState(false)
|
|
58
|
+
|
|
59
|
+
const handleWorkflowGenerated = useCallback((workflowJson?: string) => {
|
|
60
|
+
setVersionRefreshKey((k) => k + 1)
|
|
61
|
+
if (workflowJson) {
|
|
62
|
+
setLastGeneratedJson(workflowJson)
|
|
63
|
+
// Auto-open preview when workflow is generated
|
|
64
|
+
setIsPreviewOpen(true)
|
|
65
|
+
}
|
|
66
|
+
}, [])
|
|
67
|
+
|
|
68
|
+
function handleSelectSession(session: AiWorkflowSession) {
|
|
69
|
+
setActiveSession(session)
|
|
70
|
+
setLastGeneratedJson(null)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function handleRollback(versionNumber: number) {
|
|
74
|
+
if (!activeSession) return
|
|
75
|
+
try {
|
|
76
|
+
const updated = await workflowAiService.rollback(activeSession.id, versionNumber)
|
|
77
|
+
setActiveSession(updated)
|
|
78
|
+
setVersionRefreshKey((k) => k + 1)
|
|
79
|
+
toast.success(t('rollbackSuccess'))
|
|
80
|
+
} catch {
|
|
81
|
+
toast.error(t('rollbackFailed'))
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function handleVersionSelect(version: AiWorkflowVersion) {
|
|
86
|
+
setLastGeneratedJson(version.workflowJson)
|
|
87
|
+
setIsPreviewOpen(true)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function handleApplyConfirm() {
|
|
91
|
+
if (!activeSession || !applyJson) return
|
|
92
|
+
setIsApplying(true)
|
|
93
|
+
try {
|
|
94
|
+
if (activeSession.n8nWorkflowId) {
|
|
95
|
+
// Refresh session to get latest state, then apply
|
|
96
|
+
const freshSession = await workflowAiService.getSession(activeSession.id)
|
|
97
|
+
setActiveSession(freshSession)
|
|
98
|
+
await workflowAiService.applyToN8n(activeSession.id)
|
|
99
|
+
toast.success(t('applySuccess'))
|
|
100
|
+
} else {
|
|
101
|
+
toast.info(t('noLinkedWorkflow'))
|
|
102
|
+
}
|
|
103
|
+
} catch {
|
|
104
|
+
toast.error(t('applyFailed'))
|
|
105
|
+
} finally {
|
|
106
|
+
setIsApplying(false)
|
|
107
|
+
setApplyJson(null)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return (
|
|
112
|
+
<div className="flex h-[calc(100svh-2rem)] flex-col">
|
|
113
|
+
<PageHeader title={t('title')} description={t('description')}>
|
|
114
|
+
<div className="flex gap-1">
|
|
115
|
+
<Button
|
|
116
|
+
variant="ghost"
|
|
117
|
+
size="sm"
|
|
118
|
+
onClick={() => setIsPreviewOpen(!isPreviewOpen)}
|
|
119
|
+
title={t('workflowPreview')}
|
|
120
|
+
>
|
|
121
|
+
{isPreviewOpen ? (
|
|
122
|
+
<PanelBottomClose className="h-4 w-4" />
|
|
123
|
+
) : (
|
|
124
|
+
<PanelBottomOpen className="h-4 w-4" />
|
|
125
|
+
)}
|
|
126
|
+
</Button>
|
|
127
|
+
<Button
|
|
128
|
+
variant="ghost"
|
|
129
|
+
size="sm"
|
|
130
|
+
onClick={() => setIsRightPanelOpen(!isRightPanelOpen)}
|
|
131
|
+
>
|
|
132
|
+
{isRightPanelOpen ? (
|
|
133
|
+
<PanelRightClose className="h-4 w-4" />
|
|
134
|
+
) : (
|
|
135
|
+
<PanelRightOpen className="h-4 w-4" />
|
|
136
|
+
)}
|
|
137
|
+
</Button>
|
|
138
|
+
</div>
|
|
139
|
+
</PageHeader>
|
|
140
|
+
|
|
141
|
+
<div className="flex flex-1 overflow-hidden">
|
|
142
|
+
{/* Left panel: Sessions + n8n Workflows */}
|
|
143
|
+
<SessionPanel
|
|
144
|
+
activeSessionId={activeSession?.id ?? null}
|
|
145
|
+
onSelectSession={handleSelectSession}
|
|
146
|
+
className="w-64 shrink-0"
|
|
147
|
+
/>
|
|
148
|
+
|
|
149
|
+
{/* Center area: Chat + Preview */}
|
|
150
|
+
<div className="flex flex-1 flex-col overflow-hidden">
|
|
151
|
+
{/* Chat panel */}
|
|
152
|
+
<ChatPanel
|
|
153
|
+
sessionId={activeSession?.id ?? null}
|
|
154
|
+
currentWorkflowJson={activeSession?.currentJson ?? null}
|
|
155
|
+
selectedTool={selectedTool}
|
|
156
|
+
selectedModel={selectedModel}
|
|
157
|
+
contextDocs={selectedDocs}
|
|
158
|
+
onWorkflowGenerated={handleWorkflowGenerated}
|
|
159
|
+
onApply={setApplyJson}
|
|
160
|
+
className={isPreviewOpen ? 'flex-1' : 'flex-1'}
|
|
161
|
+
/>
|
|
162
|
+
|
|
163
|
+
{/* Workflow preview/comparison panel */}
|
|
164
|
+
{isPreviewOpen && (
|
|
165
|
+
<WorkflowPreviewPanel
|
|
166
|
+
generatedJson={lastGeneratedJson ?? activeSession?.currentJson ?? null}
|
|
167
|
+
originalJson={activeSession?.currentJson !== lastGeneratedJson ? activeSession?.currentJson ?? null : null}
|
|
168
|
+
className="h-[280px] shrink-0"
|
|
169
|
+
/>
|
|
170
|
+
)}
|
|
171
|
+
</div>
|
|
172
|
+
|
|
173
|
+
{/* Right panel: Tools */}
|
|
174
|
+
{isRightPanelOpen && (
|
|
175
|
+
<ToolPanel
|
|
176
|
+
sessionId={activeSession?.id ?? null}
|
|
177
|
+
selectedTool={selectedTool}
|
|
178
|
+
selectedModel={selectedModel}
|
|
179
|
+
onToolChange={setSelectedTool}
|
|
180
|
+
onModelChange={setSelectedModel}
|
|
181
|
+
selectedDocs={selectedDocs}
|
|
182
|
+
onDocsChange={setSelectedDocs}
|
|
183
|
+
onRollback={handleRollback}
|
|
184
|
+
onVersionSelect={handleVersionSelect}
|
|
185
|
+
refreshKey={versionRefreshKey}
|
|
186
|
+
className="w-80 shrink-0"
|
|
187
|
+
/>
|
|
188
|
+
)}
|
|
189
|
+
</div>
|
|
190
|
+
|
|
191
|
+
{/* Apply confirmation dialog */}
|
|
192
|
+
<AlertDialog open={applyJson !== null} onOpenChange={() => setApplyJson(null)}>
|
|
193
|
+
<AlertDialogContent>
|
|
194
|
+
<AlertDialogHeader>
|
|
195
|
+
<AlertDialogTitle>{t('applyConfirmTitle')}</AlertDialogTitle>
|
|
196
|
+
<AlertDialogDescription>
|
|
197
|
+
{activeSession?.n8nWorkflowId
|
|
198
|
+
? t('applyConfirmDesc')
|
|
199
|
+
: t('applyConfirmNoWorkflow')}
|
|
200
|
+
</AlertDialogDescription>
|
|
201
|
+
</AlertDialogHeader>
|
|
202
|
+
<AlertDialogFooter>
|
|
203
|
+
<AlertDialogCancel>{t('cancel')}</AlertDialogCancel>
|
|
204
|
+
<AlertDialogAction
|
|
205
|
+
onClick={handleApplyConfirm}
|
|
206
|
+
disabled={isApplying || !activeSession?.n8nWorkflowId}
|
|
207
|
+
>
|
|
208
|
+
{t('applyConfirm')}
|
|
209
|
+
</AlertDialogAction>
|
|
210
|
+
</AlertDialogFooter>
|
|
211
|
+
</AlertDialogContent>
|
|
212
|
+
</AlertDialog>
|
|
213
|
+
</div>
|
|
214
|
+
)
|
|
215
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { api } from '@octo-cyber/ui/services/api-client'
|
|
2
|
+
|
|
3
|
+
// ─── Request/Response Types ──────────────────────────────────
|
|
4
|
+
|
|
5
|
+
export interface WorkflowDesignRequest {
|
|
6
|
+
prompt: string
|
|
7
|
+
currentWorkflowJson?: string
|
|
8
|
+
context?: string
|
|
9
|
+
tool?: string
|
|
10
|
+
model?: string
|
|
11
|
+
conversationHistory?: ConversationMessage[]
|
|
12
|
+
sessionId?: number
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ConversationMessage {
|
|
16
|
+
role: 'user' | 'assistant'
|
|
17
|
+
content: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface WorkflowDesignResponse {
|
|
21
|
+
success: boolean
|
|
22
|
+
data?: {
|
|
23
|
+
explanation: string
|
|
24
|
+
workflowJson?: string
|
|
25
|
+
suggestions?: string[]
|
|
26
|
+
durationMs?: number
|
|
27
|
+
}
|
|
28
|
+
error?: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface AiWorkflowSession {
|
|
32
|
+
id: number
|
|
33
|
+
n8nWorkflowId: string | null
|
|
34
|
+
workflowName: string
|
|
35
|
+
currentJson: string | null
|
|
36
|
+
currentVersion: number
|
|
37
|
+
status: 'DRAFT' | 'APPLIED'
|
|
38
|
+
createdAt: string
|
|
39
|
+
updatedAt: string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface AiWorkflowVersion {
|
|
43
|
+
id: number
|
|
44
|
+
sessionId: number
|
|
45
|
+
versionNumber: number
|
|
46
|
+
workflowJson: string
|
|
47
|
+
changeDescription: string | null
|
|
48
|
+
aiTool: string | null
|
|
49
|
+
aiModel: string | null
|
|
50
|
+
createdAt: string
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface AiToolInfo {
|
|
54
|
+
name: string
|
|
55
|
+
displayName: string
|
|
56
|
+
isAvailable: boolean
|
|
57
|
+
models: string[]
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface ApiDocModule {
|
|
61
|
+
moduleId: string
|
|
62
|
+
moduleName: string
|
|
63
|
+
docPath: string
|
|
64
|
+
contentLength: number
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface N8nWorkflowSummary {
|
|
68
|
+
id: string
|
|
69
|
+
name: string
|
|
70
|
+
active: boolean
|
|
71
|
+
createdAt: string
|
|
72
|
+
updatedAt: string
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
interface ApiOk<T> { success: boolean; data: T; error?: string }
|
|
76
|
+
|
|
77
|
+
// ─── API Service ─────────────────────────────────────────────
|
|
78
|
+
|
|
79
|
+
export const workflowAiService = {
|
|
80
|
+
// Design
|
|
81
|
+
async design(request: WorkflowDesignRequest): Promise<WorkflowDesignResponse> {
|
|
82
|
+
return api.post<WorkflowDesignResponse>('/api/v1/workflow-ai/design', request)
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
// Sessions
|
|
86
|
+
async listSessions(): Promise<AiWorkflowSession[]> {
|
|
87
|
+
const res = await api.get<ApiOk<AiWorkflowSession[]>>('/api/v1/workflow-ai/sessions')
|
|
88
|
+
return res.data
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
async createSession(params: {
|
|
92
|
+
workflowName: string
|
|
93
|
+
n8nWorkflowId?: string
|
|
94
|
+
initialJson?: string
|
|
95
|
+
}): Promise<AiWorkflowSession> {
|
|
96
|
+
const res = await api.post<ApiOk<AiWorkflowSession>>(
|
|
97
|
+
'/api/v1/workflow-ai/sessions',
|
|
98
|
+
params,
|
|
99
|
+
)
|
|
100
|
+
return res.data
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
async getSession(id: number): Promise<AiWorkflowSession> {
|
|
104
|
+
const res = await api.get<ApiOk<AiWorkflowSession>>(
|
|
105
|
+
`/api/v1/workflow-ai/sessions/${id}`,
|
|
106
|
+
)
|
|
107
|
+
return res.data
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
async deleteSession(id: number): Promise<void> {
|
|
111
|
+
await api.delete(`/api/v1/workflow-ai/sessions/${id}`)
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
// Versions
|
|
115
|
+
async listVersions(sessionId: number): Promise<AiWorkflowVersion[]> {
|
|
116
|
+
const res = await api.get<ApiOk<AiWorkflowVersion[]>>(
|
|
117
|
+
`/api/v1/workflow-ai/sessions/${sessionId}/versions`,
|
|
118
|
+
)
|
|
119
|
+
return res.data
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
async rollback(sessionId: number, versionNumber: number): Promise<AiWorkflowSession> {
|
|
123
|
+
const res = await api.post<ApiOk<AiWorkflowSession>>(
|
|
124
|
+
`/api/v1/workflow-ai/sessions/${sessionId}/rollback`,
|
|
125
|
+
{ versionNumber },
|
|
126
|
+
)
|
|
127
|
+
return res.data
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
async applyToN8n(sessionId: number): Promise<void> {
|
|
131
|
+
await api.post(`/api/v1/workflow-ai/sessions/${sessionId}/apply`, {})
|
|
132
|
+
},
|
|
133
|
+
|
|
134
|
+
// Context
|
|
135
|
+
async listAiTools(): Promise<AiToolInfo[]> {
|
|
136
|
+
const res = await api.get<ApiOk<AiToolInfo[]>>('/api/v1/workflow-ai/context/ai-tools')
|
|
137
|
+
return res.data
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
async listApiDocs(): Promise<ApiDocModule[]> {
|
|
141
|
+
const res = await api.get<ApiOk<ApiDocModule[]>>('/api/v1/workflow-ai/context/api-docs')
|
|
142
|
+
return res.data
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
async getApiDocContent(moduleId: string): Promise<string> {
|
|
146
|
+
const res = await api.get<ApiOk<{ content: string }>>(
|
|
147
|
+
`/api/v1/workflow-ai/context/api-docs/${moduleId}`,
|
|
148
|
+
)
|
|
149
|
+
return res.data.content
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
async listN8nWorkflows(): Promise<N8nWorkflowSummary[]> {
|
|
153
|
+
const res = await api.get<ApiOk<N8nWorkflowSummary[]>>(
|
|
154
|
+
'/api/v1/workflow-ai/context/n8n-workflows',
|
|
155
|
+
)
|
|
156
|
+
return res.data
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
async getN8nWorkflow(id: string): Promise<Record<string, unknown>> {
|
|
160
|
+
const res = await api.get<ApiOk<Record<string, unknown>>>(
|
|
161
|
+
`/api/v1/workflow-ai/context/n8n-workflows/${id}`,
|
|
162
|
+
)
|
|
163
|
+
return res.data
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
// System Prompt
|
|
167
|
+
async getSystemPrompt(): Promise<string> {
|
|
168
|
+
const res = await api.get<ApiOk<{ prompt: string }>>(
|
|
169
|
+
'/api/v1/workflow-ai/system-prompt',
|
|
170
|
+
)
|
|
171
|
+
return res.data.prompt
|
|
172
|
+
},
|
|
173
|
+
}
|