@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,60 @@
1
+ /**
2
+ * WebSocket push event types for real-time execution updates.
3
+ */
4
+ export type PushEventType = 'executionStarted' | 'nodeExecuteBefore' | 'nodeExecuteAfter' | 'executionFinished';
5
+ export interface PushEvent {
6
+ type: PushEventType;
7
+ data: unknown;
8
+ }
9
+ /**
10
+ * Minimal WebSocket interface — compatible with the `ws` library
11
+ * and the native browser WebSocket.
12
+ */
13
+ export interface IWebSocket {
14
+ send(data: string): void;
15
+ readyState: number;
16
+ close(): void;
17
+ /** ws library uses OPEN = 1 */
18
+ OPEN?: number;
19
+ }
20
+ /**
21
+ * PushService — manages WebSocket connections and broadcasts
22
+ * real-time execution events to connected clients.
23
+ *
24
+ * Used by WorkflowEngineService to push nodeExecuteBefore/After
25
+ * and executionStarted/Finished events.
26
+ */
27
+ export declare class PushService {
28
+ private readonly connections;
29
+ private logger;
30
+ /**
31
+ * Register a WebSocket connection for a user.
32
+ * Replaces any existing connection for the same userId.
33
+ */
34
+ addConnection(userId: string, ws: IWebSocket): void;
35
+ /**
36
+ * Remove a user's WebSocket connection.
37
+ */
38
+ removeConnection(userId: string): void;
39
+ /**
40
+ * Send a push event to a specific user.
41
+ */
42
+ sendToUser(userId: string, type: PushEventType, data: unknown): void;
43
+ /**
44
+ * Broadcast a push event to all connected users.
45
+ */
46
+ broadcast(type: PushEventType, data: unknown): void;
47
+ /**
48
+ * Get the number of active connections.
49
+ */
50
+ get connectionCount(): number;
51
+ /**
52
+ * Check if a user has an active WebSocket connection.
53
+ */
54
+ isConnected(userId: string): boolean;
55
+ /**
56
+ * Close all connections and clear the map.
57
+ */
58
+ closeAll(): void;
59
+ }
60
+ //# sourceMappingURL=push.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.service.d.ts","sourceRoot":"","sources":["../../src/services/push.service.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,GAClB,mBAAmB,CAAC;AAExB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;IACd,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID;;;;;;GAMG;AACH,qBACa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAC7D,OAAO,CAAC,MAAM,CAAqD;IAEnE;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,GAAG,IAAI;IAcnD;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKtC;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAiBpE;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAiBnD;;OAEG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAKpC;;OAEG;IACH,QAAQ,IAAI,IAAI;CAWjB"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.PushService = void 0;
10
+ const core_1 = require("@octo/core");
11
+ const WS_OPEN = 1;
12
+ /**
13
+ * PushService — manages WebSocket connections and broadcasts
14
+ * real-time execution events to connected clients.
15
+ *
16
+ * Used by WorkflowEngineService to push nodeExecuteBefore/After
17
+ * and executionStarted/Finished events.
18
+ */
19
+ let PushService = class PushService {
20
+ connections = new Map();
21
+ logger = core_1.Container.get(core_1.LoggerService).child('PushService');
22
+ /**
23
+ * Register a WebSocket connection for a user.
24
+ * Replaces any existing connection for the same userId.
25
+ */
26
+ addConnection(userId, ws) {
27
+ // Close existing connection if any
28
+ const existing = this.connections.get(userId);
29
+ if (existing) {
30
+ try {
31
+ existing.close();
32
+ }
33
+ catch {
34
+ // ignore close errors
35
+ }
36
+ }
37
+ this.connections.set(userId, ws);
38
+ this.logger.debug(`WebSocket connected: user=${userId} (total=${this.connections.size})`);
39
+ }
40
+ /**
41
+ * Remove a user's WebSocket connection.
42
+ */
43
+ removeConnection(userId) {
44
+ this.connections.delete(userId);
45
+ this.logger.debug(`WebSocket disconnected: user=${userId} (total=${this.connections.size})`);
46
+ }
47
+ /**
48
+ * Send a push event to a specific user.
49
+ */
50
+ sendToUser(userId, type, data) {
51
+ const ws = this.connections.get(userId);
52
+ if (!ws)
53
+ return;
54
+ if (ws.readyState === WS_OPEN) {
55
+ try {
56
+ ws.send(JSON.stringify({ type, data }));
57
+ }
58
+ catch (err) {
59
+ this.logger.warn(`Failed to send push event to user=${userId}: ${err}`);
60
+ this.connections.delete(userId);
61
+ }
62
+ }
63
+ else {
64
+ // Connection no longer open, clean up
65
+ this.connections.delete(userId);
66
+ }
67
+ }
68
+ /**
69
+ * Broadcast a push event to all connected users.
70
+ */
71
+ broadcast(type, data) {
72
+ const message = JSON.stringify({ type, data });
73
+ for (const [userId, ws] of this.connections) {
74
+ if (ws.readyState === WS_OPEN) {
75
+ try {
76
+ ws.send(message);
77
+ }
78
+ catch (err) {
79
+ this.logger.warn(`Failed to broadcast to user=${userId}: ${err}`);
80
+ this.connections.delete(userId);
81
+ }
82
+ }
83
+ else {
84
+ this.connections.delete(userId);
85
+ }
86
+ }
87
+ }
88
+ /**
89
+ * Get the number of active connections.
90
+ */
91
+ get connectionCount() {
92
+ return this.connections.size;
93
+ }
94
+ /**
95
+ * Check if a user has an active WebSocket connection.
96
+ */
97
+ isConnected(userId) {
98
+ const ws = this.connections.get(userId);
99
+ return ws !== undefined && ws.readyState === WS_OPEN;
100
+ }
101
+ /**
102
+ * Close all connections and clear the map.
103
+ */
104
+ closeAll() {
105
+ for (const [, ws] of this.connections) {
106
+ try {
107
+ ws.close();
108
+ }
109
+ catch {
110
+ // ignore
111
+ }
112
+ }
113
+ this.connections.clear();
114
+ this.logger.info('All WebSocket connections closed');
115
+ }
116
+ };
117
+ exports.PushService = PushService;
118
+ exports.PushService = PushService = __decorate([
119
+ (0, core_1.Service)()
120
+ ], PushService);
121
+ //# sourceMappingURL=push.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.service.js","sourceRoot":"","sources":["../../src/services/push.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { CliToolName } from '@octo/ai';
2
+ interface ConversationMessage {
3
+ role: 'user' | 'assistant';
4
+ content: string;
5
+ }
6
+ export interface WorkflowDesignRequest {
7
+ /** Natural language description of the desired workflow */
8
+ prompt: string;
9
+ /** Existing workflow JSON to modify (optional) */
10
+ currentWorkflowJson?: string;
11
+ /** Additional context (available nodes, constraints, etc.) */
12
+ context?: string;
13
+ /** Which AI tool to use (default: claude) */
14
+ tool?: CliToolName;
15
+ /** Model override */
16
+ model?: string;
17
+ /** Previous conversation turns for multi-round dialogue */
18
+ conversationHistory?: ConversationMessage[];
19
+ /** Associated session ID for auto-versioning */
20
+ sessionId?: number;
21
+ }
22
+ export interface WorkflowDesignResult {
23
+ /** AI-generated explanation of the workflow */
24
+ explanation: string;
25
+ /** The n8n-compatible workflow JSON */
26
+ workflowJson: Record<string, unknown> | null;
27
+ /** Suggestions for improvement or follow-up */
28
+ suggestions: string[];
29
+ /** Whether the AI successfully generated a workflow */
30
+ success: boolean;
31
+ /** Error message if generation failed */
32
+ error?: string;
33
+ /** Execution duration in ms */
34
+ durationMs: number;
35
+ }
36
+ /**
37
+ * WorkflowAiService — uses AI CLI tools to generate n8n workflow JSON
38
+ * from natural language descriptions.
39
+ */
40
+ export declare class WorkflowAiService {
41
+ private readonly logger;
42
+ /** Default system prompt, used as fallback when database config is unavailable */
43
+ static readonly DEFAULT_SYSTEM_PROMPT = "You are an n8n workflow designer. Your task is to generate n8n workflow JSON based on user requirements.\n\n## Output Format\nYou MUST respond with a JSON object containing exactly these fields:\n{\n \"explanation\": \"A brief explanation of what the workflow does\",\n \"workflow\": { ... }, // n8n workflow JSON\n \"suggestions\": [\"suggestion 1\", \"suggestion 2\"]\n}\n\n## n8n Workflow JSON Structure\nA valid n8n workflow JSON has this structure:\n{\n \"name\": \"Workflow Name\",\n \"nodes\": [\n {\n \"parameters\": { ... },\n \"name\": \"Node Name\",\n \"type\": \"n8n-nodes-base.httpRequest\",\n \"typeVersion\": 1,\n \"position\": [x, y]\n }\n ],\n \"connections\": {\n \"Source Node Name\": {\n \"main\": [[{ \"node\": \"Target Node Name\", \"type\": \"main\", \"index\": 0 }]]\n }\n }\n}\n\n## Common n8n Node Types\n- n8n-nodes-base.manualTrigger \u2014 Manual execution trigger\n- n8n-nodes-base.scheduleTrigger \u2014 Cron/schedule trigger\n- n8n-nodes-base.webhook \u2014 Webhook trigger\n- n8n-nodes-base.httpRequest \u2014 Make HTTP requests\n- n8n-nodes-base.if \u2014 Conditional branching\n- n8n-nodes-base.code \u2014 Custom JavaScript/Python code\n- n8n-nodes-base.set \u2014 Set/transform data\n- n8n-nodes-base.merge \u2014 Merge multiple inputs\n- n8n-nodes-base.switch \u2014 Multi-way branching\n- n8n-nodes-base.noOp \u2014 No operation (pass-through)\n- n8n-nodes-base.wait \u2014 Wait/delay\n- @n8n/n8n-nodes-langchain.agent \u2014 AI Agent node\n- @n8n/n8n-nodes-langchain.chainLlm \u2014 LLM Chain node\n\n## Rules\n1. Always include a trigger node (manualTrigger if no specific trigger is needed)\n2. Node positions should be spaced at least 250px apart horizontally\n3. Use descriptive node names\n4. Include error handling where appropriate\n5. The workflow field must be valid n8n workflow JSON that can be imported directly";
44
+ /**
45
+ * Load the system prompt from system_configs table, falling back to the
46
+ * hardcoded default if the database read fails or returns null.
47
+ */
48
+ getSystemPrompt(): Promise<string>;
49
+ /**
50
+ * Generate or modify an n8n workflow based on a natural language prompt.
51
+ */
52
+ design(request: WorkflowDesignRequest): Promise<WorkflowDesignResult>;
53
+ private parseAiResponse;
54
+ /**
55
+ * Extract JSON object from AI output that may contain markdown fences
56
+ * or other text wrapping.
57
+ */
58
+ private extractJson;
59
+ }
60
+ export {};
61
+ //# sourceMappingURL=workflow-ai.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-ai.service.d.ts","sourceRoot":"","sources":["../../src/services/workflow-ai.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5C,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,mBAAmB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC5C,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7C,+CAA+C;IAC/C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBACa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;IAE3E,kFAAkF;IAClF,MAAM,CAAC,QAAQ,CAAC,qBAAqB,g4DAkD8C;IAEnF;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBxC;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAuE3E,OAAO,CAAC,eAAe;IAyCvB;;;OAGG;IACH,OAAO,CAAC,WAAW;CAsBpB"}
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var WorkflowAiService_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.WorkflowAiService = void 0;
11
+ const core_1 = require("@octo/core");
12
+ const ai_1 = require("@octo/ai");
13
+ /** SystemConfig key for the AI workflow designer system prompt */
14
+ const SYSTEM_PROMPT_CONFIG_KEY = 'workflow.ai.systemPrompt';
15
+ /**
16
+ * WorkflowAiService — uses AI CLI tools to generate n8n workflow JSON
17
+ * from natural language descriptions.
18
+ */
19
+ let WorkflowAiService = class WorkflowAiService {
20
+ static { WorkflowAiService_1 = this; }
21
+ logger = core_1.Container.get(core_1.LoggerService).child('WorkflowAI');
22
+ /** Default system prompt, used as fallback when database config is unavailable */
23
+ static DEFAULT_SYSTEM_PROMPT = `You are an n8n workflow designer. Your task is to generate n8n workflow JSON based on user requirements.
24
+
25
+ ## Output Format
26
+ You MUST respond with a JSON object containing exactly these fields:
27
+ {
28
+ "explanation": "A brief explanation of what the workflow does",
29
+ "workflow": { ... }, // n8n workflow JSON
30
+ "suggestions": ["suggestion 1", "suggestion 2"]
31
+ }
32
+
33
+ ## n8n Workflow JSON Structure
34
+ A valid n8n workflow JSON has this structure:
35
+ {
36
+ "name": "Workflow Name",
37
+ "nodes": [
38
+ {
39
+ "parameters": { ... },
40
+ "name": "Node Name",
41
+ "type": "n8n-nodes-base.httpRequest",
42
+ "typeVersion": 1,
43
+ "position": [x, y]
44
+ }
45
+ ],
46
+ "connections": {
47
+ "Source Node Name": {
48
+ "main": [[{ "node": "Target Node Name", "type": "main", "index": 0 }]]
49
+ }
50
+ }
51
+ }
52
+
53
+ ## Common n8n Node Types
54
+ - n8n-nodes-base.manualTrigger — Manual execution trigger
55
+ - n8n-nodes-base.scheduleTrigger — Cron/schedule trigger
56
+ - n8n-nodes-base.webhook — Webhook trigger
57
+ - n8n-nodes-base.httpRequest — Make HTTP requests
58
+ - n8n-nodes-base.if — Conditional branching
59
+ - n8n-nodes-base.code — Custom JavaScript/Python code
60
+ - n8n-nodes-base.set — Set/transform data
61
+ - n8n-nodes-base.merge — Merge multiple inputs
62
+ - n8n-nodes-base.switch — Multi-way branching
63
+ - n8n-nodes-base.noOp — No operation (pass-through)
64
+ - n8n-nodes-base.wait — Wait/delay
65
+ - @n8n/n8n-nodes-langchain.agent — AI Agent node
66
+ - @n8n/n8n-nodes-langchain.chainLlm — LLM Chain node
67
+
68
+ ## Rules
69
+ 1. Always include a trigger node (manualTrigger if no specific trigger is needed)
70
+ 2. Node positions should be spaced at least 250px apart horizontally
71
+ 3. Use descriptive node names
72
+ 4. Include error handling where appropriate
73
+ 5. The workflow field must be valid n8n workflow JSON that can be imported directly`;
74
+ /**
75
+ * Load the system prompt from system_configs table, falling back to the
76
+ * hardcoded default if the database read fails or returns null.
77
+ */
78
+ async getSystemPrompt() {
79
+ try {
80
+ const db = core_1.Container.get(core_1.DatabaseService);
81
+ const ds = db.getDataSource();
82
+ const rows = await ds.query('SELECT value FROM system_configs WHERE key = ?', [SYSTEM_PROMPT_CONFIG_KEY]);
83
+ if (rows.length > 0 && rows[0].value) {
84
+ return rows[0].value;
85
+ }
86
+ }
87
+ catch (err) {
88
+ this.logger.warn(`Failed to load system prompt from DB, using default: ${err}`);
89
+ }
90
+ return WorkflowAiService_1.DEFAULT_SYSTEM_PROMPT;
91
+ }
92
+ /**
93
+ * Generate or modify an n8n workflow based on a natural language prompt.
94
+ */
95
+ async design(request) {
96
+ const executor = core_1.Container.get(ai_1.CliExecutorService);
97
+ const tool = request.tool ?? 'claude';
98
+ // Load system prompt from database (falls back to hardcoded default)
99
+ const systemPrompt = await this.getSystemPrompt();
100
+ // Build the full prompt
101
+ const parts = [systemPrompt];
102
+ if (request.currentWorkflowJson) {
103
+ parts.push('\n## Current Workflow (modify this)\n```json\n' +
104
+ request.currentWorkflowJson +
105
+ '\n```');
106
+ }
107
+ if (request.context) {
108
+ parts.push(`\n## Additional Context\n${request.context}`);
109
+ }
110
+ // Include conversation history for multi-round dialogue
111
+ if (request.conversationHistory?.length) {
112
+ parts.push('\n## Conversation History');
113
+ for (const msg of request.conversationHistory) {
114
+ const label = msg.role === 'user' ? 'User' : 'Assistant';
115
+ parts.push(`\n### ${label}\n${msg.content}`);
116
+ }
117
+ }
118
+ parts.push(`\n## User Request\n${request.prompt}`);
119
+ parts.push('\nRespond with ONLY the JSON object. No markdown fences, no extra text.');
120
+ const fullPrompt = parts.join('\n');
121
+ try {
122
+ const result = await executor.execute({
123
+ tool,
124
+ prompt: fullPrompt,
125
+ model: request.model,
126
+ timeoutMs: 120_000,
127
+ jsonOutput: true,
128
+ });
129
+ if (!result.success) {
130
+ return {
131
+ explanation: '',
132
+ workflowJson: null,
133
+ suggestions: [],
134
+ success: false,
135
+ error: result.error ?? `AI CLI execution failed (exit code ${result.exitCode})`,
136
+ durationMs: result.durationMs,
137
+ };
138
+ }
139
+ return this.parseAiResponse(result.output, result.durationMs);
140
+ }
141
+ catch (err) {
142
+ const errorMsg = err instanceof Error ? err.message : String(err);
143
+ this.logger.error(`Workflow AI design failed: ${errorMsg}`);
144
+ return {
145
+ explanation: '',
146
+ workflowJson: null,
147
+ suggestions: [],
148
+ success: false,
149
+ error: errorMsg,
150
+ durationMs: 0,
151
+ };
152
+ }
153
+ }
154
+ parseAiResponse(output, durationMs) {
155
+ // Try to extract JSON from the output
156
+ const jsonStr = this.extractJson(output);
157
+ if (!jsonStr) {
158
+ return {
159
+ explanation: output,
160
+ workflowJson: null,
161
+ suggestions: [],
162
+ success: false,
163
+ error: 'AI response did not contain valid JSON',
164
+ durationMs,
165
+ };
166
+ }
167
+ try {
168
+ const parsed = JSON.parse(jsonStr);
169
+ const explanation = parsed.explanation ?? '';
170
+ const workflow = parsed.workflow ?? null;
171
+ const suggestions = parsed.suggestions ?? [];
172
+ return {
173
+ explanation,
174
+ workflowJson: workflow,
175
+ suggestions: Array.isArray(suggestions) ? suggestions : [],
176
+ success: workflow !== null,
177
+ durationMs,
178
+ };
179
+ }
180
+ catch {
181
+ return {
182
+ explanation: output,
183
+ workflowJson: null,
184
+ suggestions: [],
185
+ success: false,
186
+ error: 'Failed to parse AI response JSON',
187
+ durationMs,
188
+ };
189
+ }
190
+ }
191
+ /**
192
+ * Extract JSON object from AI output that may contain markdown fences
193
+ * or other text wrapping.
194
+ */
195
+ extractJson(text) {
196
+ // Try direct parse first
197
+ const trimmed = text.trim();
198
+ if (trimmed.startsWith('{')) {
199
+ return trimmed;
200
+ }
201
+ // Try to extract from markdown code block
202
+ const jsonBlockMatch = trimmed.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
203
+ if (jsonBlockMatch?.[1]) {
204
+ return jsonBlockMatch[1].trim();
205
+ }
206
+ // Try to find the first { ... } block
207
+ const firstBrace = trimmed.indexOf('{');
208
+ const lastBrace = trimmed.lastIndexOf('}');
209
+ if (firstBrace !== -1 && lastBrace > firstBrace) {
210
+ return trimmed.slice(firstBrace, lastBrace + 1);
211
+ }
212
+ return null;
213
+ }
214
+ };
215
+ exports.WorkflowAiService = WorkflowAiService;
216
+ exports.WorkflowAiService = WorkflowAiService = WorkflowAiService_1 = __decorate([
217
+ (0, core_1.Service)()
218
+ ], WorkflowAiService);
219
+ //# sourceMappingURL=workflow-ai.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-ai.service.js","sourceRoot":"","sources":["../../src/services/workflow-ai.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface ApiDocModule {
2
+ moduleId: string;
3
+ moduleName: string;
4
+ docPath: string;
5
+ contentLength: number;
6
+ }
7
+ export interface AiToolInfo {
8
+ name: string;
9
+ displayName: string;
10
+ isAvailable: boolean;
11
+ models: string[];
12
+ }
13
+ export interface N8nWorkflowSummary {
14
+ id: string;
15
+ name: string;
16
+ active: boolean;
17
+ createdAt: string;
18
+ updatedAt: string;
19
+ }
20
+ export declare class WorkflowContextService {
21
+ private readonly logger;
22
+ private readonly packagesDir;
23
+ listAiTools(): Promise<AiToolInfo[]>;
24
+ listApiDocs(): Promise<ApiDocModule[]>;
25
+ getApiDocContent(moduleId: string): Promise<string>;
26
+ listN8nWorkflows(): Promise<N8nWorkflowSummary[]>;
27
+ getN8nWorkflow(workflowId: string): Promise<Record<string, unknown>>;
28
+ updateN8nWorkflow(workflowId: string, workflowJson: string): Promise<void>;
29
+ private getN8nApiUrl;
30
+ private getN8nHeaders;
31
+ }
32
+ //# sourceMappingURL=workflow-context.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-context.service.d.ts","sourceRoot":"","sources":["../../src/services/workflow-context.service.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyD;IAChF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAG1B;IAEI,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAkBpC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmCtC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAenD,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA+BjD,cAAc,CAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiB7B,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAuChB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;CAatB"}