@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.
Files changed (297) hide show
  1. package/dist/controllers/ai-workflow-session.controller.d.ts +19 -0
  2. package/dist/controllers/ai-workflow-session.controller.d.ts.map +1 -0
  3. package/dist/controllers/ai-workflow-session.controller.js +135 -0
  4. package/dist/controllers/ai-workflow-session.controller.js.map +1 -0
  5. package/dist/controllers/credential.controller.d.ts +68 -0
  6. package/dist/controllers/credential.controller.d.ts.map +1 -0
  7. package/dist/controllers/credential.controller.js +303 -0
  8. package/dist/controllers/credential.controller.js.map +1 -0
  9. package/dist/controllers/index.d.ts +3 -0
  10. package/dist/controllers/index.d.ts.map +1 -0
  11. package/dist/controllers/index.js +8 -0
  12. package/dist/controllers/index.js.map +1 -0
  13. package/dist/controllers/workflow-ai.controller.d.ts +23 -0
  14. package/dist/controllers/workflow-ai.controller.d.ts.map +1 -0
  15. package/dist/controllers/workflow-ai.controller.js +164 -0
  16. package/dist/controllers/workflow-ai.controller.js.map +1 -0
  17. package/dist/controllers/workflow.controller.d.ts +66 -0
  18. package/dist/controllers/workflow.controller.d.ts.map +1 -0
  19. package/dist/controllers/workflow.controller.js +239 -0
  20. package/dist/controllers/workflow.controller.js.map +1 -0
  21. package/dist/core/expression-resolver.d.ts +49 -0
  22. package/dist/core/expression-resolver.d.ts.map +1 -0
  23. package/dist/core/expression-resolver.js +113 -0
  24. package/dist/core/expression-resolver.js.map +1 -0
  25. package/dist/core/node-registry.d.ts +24 -0
  26. package/dist/core/node-registry.d.ts.map +1 -0
  27. package/dist/core/node-registry.js +62 -0
  28. package/dist/core/node-registry.js.map +1 -0
  29. package/dist/core/workflow-executor.d.ts +50 -0
  30. package/dist/core/workflow-executor.d.ts.map +1 -0
  31. package/dist/core/workflow-executor.js +458 -0
  32. package/dist/core/workflow-executor.js.map +1 -0
  33. package/dist/entities/ai-workflow-session.entity.d.ts +17 -0
  34. package/dist/entities/ai-workflow-session.entity.d.ts.map +1 -0
  35. package/dist/entities/ai-workflow-session.entity.js +70 -0
  36. package/dist/entities/ai-workflow-session.entity.js.map +1 -0
  37. package/dist/entities/ai-workflow-version.entity.d.ts +18 -0
  38. package/dist/entities/ai-workflow-version.entity.d.ts.map +1 -0
  39. package/dist/entities/ai-workflow-version.entity.js +71 -0
  40. package/dist/entities/ai-workflow-version.entity.js.map +1 -0
  41. package/dist/entities/credential-definition.entity.d.ts +17 -0
  42. package/dist/entities/credential-definition.entity.d.ts.map +1 -0
  43. package/dist/entities/credential-definition.entity.js +66 -0
  44. package/dist/entities/credential-definition.entity.js.map +1 -0
  45. package/dist/entities/index.d.ts +9 -0
  46. package/dist/entities/index.d.ts.map +1 -0
  47. package/dist/entities/index.js +22 -0
  48. package/dist/entities/index.js.map +1 -0
  49. package/dist/entities/workflow-definition.entity.d.ts +20 -0
  50. package/dist/entities/workflow-definition.entity.d.ts.map +1 -0
  51. package/dist/entities/workflow-definition.entity.js +85 -0
  52. package/dist/entities/workflow-definition.entity.js.map +1 -0
  53. package/dist/entities/workflow-execution.entity.d.ts +26 -0
  54. package/dist/entities/workflow-execution.entity.d.ts.map +1 -0
  55. package/dist/entities/workflow-execution.entity.js +99 -0
  56. package/dist/entities/workflow-execution.entity.js.map +1 -0
  57. package/dist/index.d.ts +52 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +96 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/n8n/cipher/cipher.d.ts +11 -0
  62. package/dist/n8n/cipher/cipher.d.ts.map +1 -0
  63. package/dist/n8n/cipher/cipher.js +54 -0
  64. package/dist/n8n/cipher/cipher.js.map +1 -0
  65. package/dist/n8n/controllers/n8n-session.controller.d.ts +20 -0
  66. package/dist/n8n/controllers/n8n-session.controller.d.ts.map +1 -0
  67. package/dist/n8n/controllers/n8n-session.controller.js +84 -0
  68. package/dist/n8n/controllers/n8n-session.controller.js.map +1 -0
  69. package/dist/n8n/index.d.ts +8 -0
  70. package/dist/n8n/index.d.ts.map +1 -0
  71. package/dist/n8n/index.js +14 -0
  72. package/dist/n8n/index.js.map +1 -0
  73. package/dist/n8n/launcher/n8n-launcher.d.ts +41 -0
  74. package/dist/n8n/launcher/n8n-launcher.d.ts.map +1 -0
  75. package/dist/n8n/launcher/n8n-launcher.js +186 -0
  76. package/dist/n8n/launcher/n8n-launcher.js.map +1 -0
  77. package/dist/n8n/nodes/OctoClaudeCliTool.node.d.ts +13 -0
  78. package/dist/n8n/nodes/OctoClaudeCliTool.node.d.ts.map +1 -0
  79. package/dist/n8n/nodes/OctoClaudeCliTool.node.js +103 -0
  80. package/dist/n8n/nodes/OctoClaudeCliTool.node.js.map +1 -0
  81. package/dist/n8n/nodes/OctoCliChatModel.node.d.ts +14 -0
  82. package/dist/n8n/nodes/OctoCliChatModel.node.d.ts.map +1 -0
  83. package/dist/n8n/nodes/OctoCliChatModel.node.js +431 -0
  84. package/dist/n8n/nodes/OctoCliChatModel.node.js.map +1 -0
  85. package/dist/n8n/nodes/OctoCodexCliTool.node.d.ts +13 -0
  86. package/dist/n8n/nodes/OctoCodexCliTool.node.d.ts.map +1 -0
  87. package/dist/n8n/nodes/OctoCodexCliTool.node.js +100 -0
  88. package/dist/n8n/nodes/OctoCodexCliTool.node.js.map +1 -0
  89. package/dist/n8n/nodes/OctoGeminiCliTool.node.d.ts +13 -0
  90. package/dist/n8n/nodes/OctoGeminiCliTool.node.d.ts.map +1 -0
  91. package/dist/n8n/nodes/OctoGeminiCliTool.node.js +91 -0
  92. package/dist/n8n/nodes/OctoGeminiCliTool.node.js.map +1 -0
  93. package/dist/n8n/nodes/OctoKnowledge.node.d.ts +6 -0
  94. package/dist/n8n/nodes/OctoKnowledge.node.d.ts.map +1 -0
  95. package/dist/n8n/nodes/OctoKnowledge.node.js +95 -0
  96. package/dist/n8n/nodes/OctoKnowledge.node.js.map +1 -0
  97. package/dist/n8n/nodes/OctoNotification.node.d.ts +6 -0
  98. package/dist/n8n/nodes/OctoNotification.node.d.ts.map +1 -0
  99. package/dist/n8n/nodes/OctoNotification.node.js +72 -0
  100. package/dist/n8n/nodes/OctoNotification.node.js.map +1 -0
  101. package/dist/n8n/nodes/OctoSyncBridge.node.d.ts +6 -0
  102. package/dist/n8n/nodes/OctoSyncBridge.node.d.ts.map +1 -0
  103. package/dist/n8n/nodes/OctoSyncBridge.node.js +60 -0
  104. package/dist/n8n/nodes/OctoSyncBridge.node.js.map +1 -0
  105. package/dist/n8n/nodes/n8n-node-types.d.ts +111 -0
  106. package/dist/n8n/nodes/n8n-node-types.d.ts.map +1 -0
  107. package/dist/n8n/nodes/n8n-node-types.js +30 -0
  108. package/dist/n8n/nodes/n8n-node-types.js.map +1 -0
  109. package/dist/n8n/nodes/octo-cli-chat-model.svg +23 -0
  110. package/dist/n8n/nodes/package.json +16 -0
  111. package/dist/n8n/proxy/css-injector.d.ts +3 -0
  112. package/dist/n8n/proxy/css-injector.d.ts.map +1 -0
  113. package/dist/n8n/proxy/css-injector.js +62 -0
  114. package/dist/n8n/proxy/css-injector.js.map +1 -0
  115. package/dist/n8n/proxy/n8n-proxy.middleware.d.ts +12 -0
  116. package/dist/n8n/proxy/n8n-proxy.middleware.d.ts.map +1 -0
  117. package/dist/n8n/proxy/n8n-proxy.middleware.js +131 -0
  118. package/dist/n8n/proxy/n8n-proxy.middleware.js.map +1 -0
  119. package/dist/n8n/proxy/n8n-theme.css +45 -0
  120. package/dist/n8n/sync/n8n-user-sync.service.d.ts +75 -0
  121. package/dist/n8n/sync/n8n-user-sync.service.d.ts.map +1 -0
  122. package/dist/n8n/sync/n8n-user-sync.service.js +286 -0
  123. package/dist/n8n/sync/n8n-user-sync.service.js.map +1 -0
  124. package/dist/n8n/watcher/n8n-execution-watcher.d.ts +39 -0
  125. package/dist/n8n/watcher/n8n-execution-watcher.d.ts.map +1 -0
  126. package/dist/n8n/watcher/n8n-execution-watcher.js +110 -0
  127. package/dist/n8n/watcher/n8n-execution-watcher.js.map +1 -0
  128. package/dist/nodes/code.node.d.ts +24 -0
  129. package/dist/nodes/code.node.d.ts.map +1 -0
  130. package/dist/nodes/code.node.js +150 -0
  131. package/dist/nodes/code.node.js.map +1 -0
  132. package/dist/nodes/error-trigger.node.d.ts +15 -0
  133. package/dist/nodes/error-trigger.node.d.ts.map +1 -0
  134. package/dist/nodes/error-trigger.node.js +53 -0
  135. package/dist/nodes/error-trigger.node.js.map +1 -0
  136. package/dist/nodes/execute-command.node.d.ts +9 -0
  137. package/dist/nodes/execute-command.node.d.ts.map +1 -0
  138. package/dist/nodes/execute-command.node.js +81 -0
  139. package/dist/nodes/execute-command.node.js.map +1 -0
  140. package/dist/nodes/filter.node.d.ts +10 -0
  141. package/dist/nodes/filter.node.d.ts.map +1 -0
  142. package/dist/nodes/filter.node.js +95 -0
  143. package/dist/nodes/filter.node.js.map +1 -0
  144. package/dist/nodes/http-request.node.d.ts +11 -0
  145. package/dist/nodes/http-request.node.d.ts.map +1 -0
  146. package/dist/nodes/http-request.node.js +139 -0
  147. package/dist/nodes/http-request.node.js.map +1 -0
  148. package/dist/nodes/if.node.d.ts +13 -0
  149. package/dist/nodes/if.node.d.ts.map +1 -0
  150. package/dist/nodes/if.node.js +137 -0
  151. package/dist/nodes/if.node.js.map +1 -0
  152. package/dist/nodes/index.d.ts +12 -0
  153. package/dist/nodes/index.d.ts.map +1 -0
  154. package/dist/nodes/index.js +26 -0
  155. package/dist/nodes/index.js.map +1 -0
  156. package/dist/nodes/manual-trigger.node.d.ts +10 -0
  157. package/dist/nodes/manual-trigger.node.d.ts.map +1 -0
  158. package/dist/nodes/manual-trigger.node.js +36 -0
  159. package/dist/nodes/manual-trigger.node.js.map +1 -0
  160. package/dist/nodes/merge.node.d.ts +15 -0
  161. package/dist/nodes/merge.node.d.ts.map +1 -0
  162. package/dist/nodes/merge.node.js +99 -0
  163. package/dist/nodes/merge.node.js.map +1 -0
  164. package/dist/nodes/noop.node.d.ts +12 -0
  165. package/dist/nodes/noop.node.d.ts.map +1 -0
  166. package/dist/nodes/noop.node.js +32 -0
  167. package/dist/nodes/noop.node.js.map +1 -0
  168. package/dist/nodes/placeholder.node.d.ts +10 -0
  169. package/dist/nodes/placeholder.node.d.ts.map +1 -0
  170. package/dist/nodes/placeholder.node.js +50 -0
  171. package/dist/nodes/placeholder.node.js.map +1 -0
  172. package/dist/nodes/remove-duplicates.node.d.ts +9 -0
  173. package/dist/nodes/remove-duplicates.node.d.ts.map +1 -0
  174. package/dist/nodes/remove-duplicates.node.js +68 -0
  175. package/dist/nodes/remove-duplicates.node.js.map +1 -0
  176. package/dist/nodes/respond-to-webhook.node.d.ts +14 -0
  177. package/dist/nodes/respond-to-webhook.node.d.ts.map +1 -0
  178. package/dist/nodes/respond-to-webhook.node.js +116 -0
  179. package/dist/nodes/respond-to-webhook.node.js.map +1 -0
  180. package/dist/nodes/schedule-trigger.node.d.ts +9 -0
  181. package/dist/nodes/schedule-trigger.node.d.ts.map +1 -0
  182. package/dist/nodes/schedule-trigger.node.js +67 -0
  183. package/dist/nodes/schedule-trigger.node.js.map +1 -0
  184. package/dist/nodes/set.node.d.ts +12 -0
  185. package/dist/nodes/set.node.d.ts.map +1 -0
  186. package/dist/nodes/set.node.js +81 -0
  187. package/dist/nodes/set.node.js.map +1 -0
  188. package/dist/nodes/sort.node.d.ts +9 -0
  189. package/dist/nodes/sort.node.d.ts.map +1 -0
  190. package/dist/nodes/sort.node.js +61 -0
  191. package/dist/nodes/sort.node.js.map +1 -0
  192. package/dist/nodes/split-in-batches.node.d.ts +9 -0
  193. package/dist/nodes/split-in-batches.node.d.ts.map +1 -0
  194. package/dist/nodes/split-in-batches.node.js +53 -0
  195. package/dist/nodes/split-in-batches.node.js.map +1 -0
  196. package/dist/nodes/split-out.node.d.ts +9 -0
  197. package/dist/nodes/split-out.node.d.ts.map +1 -0
  198. package/dist/nodes/split-out.node.js +76 -0
  199. package/dist/nodes/split-out.node.js.map +1 -0
  200. package/dist/nodes/switch.node.d.ts +16 -0
  201. package/dist/nodes/switch.node.d.ts.map +1 -0
  202. package/dist/nodes/switch.node.js +156 -0
  203. package/dist/nodes/switch.node.js.map +1 -0
  204. package/dist/nodes/wait.node.d.ts +12 -0
  205. package/dist/nodes/wait.node.d.ts.map +1 -0
  206. package/dist/nodes/wait.node.js +81 -0
  207. package/dist/nodes/wait.node.js.map +1 -0
  208. package/dist/nodes/webhook.node.d.ts +9 -0
  209. package/dist/nodes/webhook.node.d.ts.map +1 -0
  210. package/dist/nodes/webhook.node.js +69 -0
  211. package/dist/nodes/webhook.node.js.map +1 -0
  212. package/dist/services/ai-workflow-session.service.d.ts +31 -0
  213. package/dist/services/ai-workflow-session.service.d.ts.map +1 -0
  214. package/dist/services/ai-workflow-session.service.js +118 -0
  215. package/dist/services/ai-workflow-session.service.js.map +1 -0
  216. package/dist/services/credential.service.d.ts +57 -0
  217. package/dist/services/credential.service.d.ts.map +1 -0
  218. package/dist/services/credential.service.js +155 -0
  219. package/dist/services/credential.service.js.map +1 -0
  220. package/dist/services/index.d.ts +10 -0
  221. package/dist/services/index.d.ts.map +1 -0
  222. package/dist/services/index.js +14 -0
  223. package/dist/services/index.js.map +1 -0
  224. package/dist/services/push.service.d.ts +60 -0
  225. package/dist/services/push.service.d.ts.map +1 -0
  226. package/dist/services/push.service.js +121 -0
  227. package/dist/services/push.service.js.map +1 -0
  228. package/dist/services/workflow-ai.service.d.ts +61 -0
  229. package/dist/services/workflow-ai.service.d.ts.map +1 -0
  230. package/dist/services/workflow-ai.service.js +219 -0
  231. package/dist/services/workflow-ai.service.js.map +1 -0
  232. package/dist/services/workflow-context.service.d.ts +32 -0
  233. package/dist/services/workflow-context.service.d.ts.map +1 -0
  234. package/dist/services/workflow-context.service.js +155 -0
  235. package/dist/services/workflow-context.service.js.map +1 -0
  236. package/dist/services/workflow-engine.service.d.ts +90 -0
  237. package/dist/services/workflow-engine.service.d.ts.map +1 -0
  238. package/dist/services/workflow-engine.service.js +305 -0
  239. package/dist/services/workflow-engine.service.js.map +1 -0
  240. package/dist/services/workflow.service.d.ts +84 -0
  241. package/dist/services/workflow.service.d.ts.map +1 -0
  242. package/dist/services/workflow.service.js +241 -0
  243. package/dist/services/workflow.service.js.map +1 -0
  244. package/dist/triggers/cron-trigger.d.ts +39 -0
  245. package/dist/triggers/cron-trigger.d.ts.map +1 -0
  246. package/dist/triggers/cron-trigger.js +137 -0
  247. package/dist/triggers/cron-trigger.js.map +1 -0
  248. package/dist/triggers/index.d.ts +3 -0
  249. package/dist/triggers/index.d.ts.map +1 -0
  250. package/dist/triggers/index.js +8 -0
  251. package/dist/triggers/index.js.map +1 -0
  252. package/dist/triggers/webhook-trigger.d.ts +51 -0
  253. package/dist/triggers/webhook-trigger.d.ts.map +1 -0
  254. package/dist/triggers/webhook-trigger.js +122 -0
  255. package/dist/triggers/webhook-trigger.js.map +1 -0
  256. package/dist/types/index.d.ts +5 -0
  257. package/dist/types/index.d.ts.map +1 -0
  258. package/dist/types/index.js +8 -0
  259. package/dist/types/index.js.map +1 -0
  260. package/dist/types/node.types.d.ts +313 -0
  261. package/dist/types/node.types.d.ts.map +1 -0
  262. package/dist/types/node.types.js +23 -0
  263. package/dist/types/node.types.js.map +1 -0
  264. package/dist/types/workflow.types.d.ts +153 -0
  265. package/dist/types/workflow.types.d.ts.map +1 -0
  266. package/dist/types/workflow.types.js +44 -0
  267. package/dist/types/workflow.types.js.map +1 -0
  268. package/dist/utils/n8n-converter.d.ts +52 -0
  269. package/dist/utils/n8n-converter.d.ts.map +1 -0
  270. package/dist/utils/n8n-converter.js +107 -0
  271. package/dist/utils/n8n-converter.js.map +1 -0
  272. package/dist/utils/n8n-node-map.d.ts +6 -0
  273. package/dist/utils/n8n-node-map.d.ts.map +1 -0
  274. package/dist/utils/n8n-node-map.js +59 -0
  275. package/dist/utils/n8n-node-map.js.map +1 -0
  276. package/dist/workflow.module.d.ts +40 -0
  277. package/dist/workflow.module.d.ts.map +1 -0
  278. package/dist/workflow.module.js +240 -0
  279. package/dist/workflow.module.js.map +1 -0
  280. package/package.json +97 -0
  281. package/web/components/ChatPanel.tsx +344 -0
  282. package/web/components/N8nIframe.tsx +119 -0
  283. package/web/components/SessionPanel.tsx +301 -0
  284. package/web/components/ToolPanel.tsx +404 -0
  285. package/web/components/WorkflowDiff.tsx +161 -0
  286. package/web/components/WorkflowGraph.tsx +158 -0
  287. package/web/components/WorkflowPreviewPanel.tsx +186 -0
  288. package/web/hooks/use-n8n-session.ts +46 -0
  289. package/web/index.ts +29 -0
  290. package/web/manifest.ts +16 -0
  291. package/web/messages/en-US.json +94 -0
  292. package/web/messages/zh-CN.json +94 -0
  293. package/web/pages/AiDesignPage.tsx +215 -0
  294. package/web/pages/CredentialsPage.tsx +7 -0
  295. package/web/pages/ExecutionsPage.tsx +7 -0
  296. package/web/pages/WorkflowsPage.tsx +7 -0
  297. 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,7 @@
1
+ 'use client'
2
+
3
+ import { N8nIframe } from '../components/N8nIframe'
4
+
5
+ export default function CredentialsPage() {
6
+ return <N8nIframe subPath="credentials" />
7
+ }
@@ -0,0 +1,7 @@
1
+ 'use client'
2
+
3
+ import { N8nIframe } from '../components/N8nIframe'
4
+
5
+ export default function ExecutionsPage() {
6
+ return <N8nIframe subPath="executions" />
7
+ }
@@ -0,0 +1,7 @@
1
+ 'use client'
2
+
3
+ import { N8nIframe } from '../components/N8nIframe'
4
+
5
+ export default function WorkflowsPage() {
6
+ return <N8nIframe />
7
+ }
@@ -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
+ }