@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,52 @@
1
+ /**
2
+ * @octo/workflow — Self-built workflow engine aligned with n8n.
3
+ *
4
+ * Provides:
5
+ * - WorkflowModule (IModule implementation)
6
+ * - Stack-based WorkflowExecutor (n8n-style)
7
+ * - NodeRegistry for node type management
8
+ * - ExpressionResolver for {{ expression }} evaluation
9
+ * - 11 built-in nodes (ManualTrigger, IF, Code, HttpRequest, Set, Merge, Switch, NoOp, Wait, ErrorTrigger, RespondToWebhook)
10
+ * - Cron and Webhook trigger services
11
+ * - Workflow CRUD + execution persistence
12
+ */
13
+ export { WorkflowModule } from './workflow.module.js';
14
+ export { WorkflowExecutor } from './core/workflow-executor.js';
15
+ export { NodeRegistry } from './core/node-registry.js';
16
+ export { ExpressionResolver } from './core/expression-resolver.js';
17
+ export type { IExpressionContext } from './core/expression-resolver.js';
18
+ export { WorkflowDefinitionEntity, WorkflowExecutionEntity, CredentialDefinitionEntity, AiWorkflowSessionEntity, AiWorkflowVersionEntity, WORKFLOW_ENTITIES, } from './entities/index.js';
19
+ export { WorkflowService } from './services/workflow.service.js';
20
+ export type { CreateWorkflowDto, UpdateWorkflowDto } from './services/workflow.service.js';
21
+ export { WorkflowAiService } from './services/workflow-ai.service.js';
22
+ export type { WorkflowDesignRequest, WorkflowDesignResult } from './services/workflow-ai.service.js';
23
+ export { AiWorkflowSessionService } from './services/ai-workflow-session.service.js';
24
+ export type { CreateSessionDto, CreateVersionDto } from './services/ai-workflow-session.service.js';
25
+ export { WorkflowController } from './controllers/workflow.controller.js';
26
+ export { WorkflowAiController } from './controllers/workflow-ai.controller.js';
27
+ export { AiWorkflowSessionController } from './controllers/ai-workflow-session.controller.js';
28
+ export { CronTriggerService } from './triggers/cron-trigger.js';
29
+ export { WebhookTriggerService } from './triggers/webhook-trigger.js';
30
+ export { ManualTriggerNode } from './nodes/manual-trigger.node.js';
31
+ export { IfNode } from './nodes/if.node.js';
32
+ export { CodeNode } from './nodes/code.node.js';
33
+ export { HttpRequestNode } from './nodes/http-request.node.js';
34
+ export { SetNode } from './nodes/set.node.js';
35
+ export { MergeNode } from './nodes/merge.node.js';
36
+ export { SwitchNode } from './nodes/switch.node.js';
37
+ export { NoOpNode } from './nodes/noop.node.js';
38
+ export { WaitNode } from './nodes/wait.node.js';
39
+ export { ErrorTriggerNode } from './nodes/error-trigger.node.js';
40
+ export { RespondToWebhookNode } from './nodes/respond-to-webhook.node.js';
41
+ export { CredentialService } from './services/credential.service.js';
42
+ export { N8nLauncher } from './n8n/launcher/n8n-launcher.js';
43
+ export type { N8nConfig } from './n8n/launcher/n8n-launcher.js';
44
+ export { setupN8nProxy } from './n8n/proxy/n8n-proxy.middleware.js';
45
+ export { N8nUserSyncService } from './n8n/sync/n8n-user-sync.service.js';
46
+ export { N8nSessionController } from './n8n/controllers/n8n-session.controller.js';
47
+ export { Cipher } from './n8n/cipher/cipher.js';
48
+ export { N8nExecutionWatcher } from './n8n/watcher/n8n-execution-watcher.js';
49
+ export type { N8nExecutionEvent } from './n8n/watcher/n8n-execution-watcher.js';
50
+ export { NodeConnectionType, buildConnectionIndexes } from './types/index.js';
51
+ export type { IDataObject, NodeParameterValue, NodeParameterValueType, BinaryFileType, IBinaryData, INodeExecutionData, IPairedItemData, INodeInputConfiguration, INodeOutputConfiguration, NodePropertyType, INodePropertyOption, INodePropertyCollection, IDisplayOptions, INodePropertyTypeOptions, INodePropertyRouting, INodeProperty, INodeCredentialDescription, NodeCategory, ICodexData, Icon, INodeTypeDescription, IWebhookDescription, IHttpRequestOptions, IExecuteContext, ITriggerResponse, IWebhookResponseData, INodeType, ITriggerNodeType, IVersionedNodeType, IWorkflowNode, IWorkflowConnection, IConnectionsBySource, IConnectionsByDestination, IConnectionTarget, IConnectionSource, IWorkflowDefinition, IWorkflowSettings, IExecuteData, ITaskDataConnections, ITaskDataConnectionsSource, WorkflowExecutionStatus, ITaskData, IRunData, IRunExecutionData, INodeExecutionResult, IWorkflowExecutionResult, WorkflowExecuteMode, TriggerType, ITriggerConfig, } from './types/index.js';
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ /**
3
+ * @octo/workflow — Self-built workflow engine aligned with n8n.
4
+ *
5
+ * Provides:
6
+ * - WorkflowModule (IModule implementation)
7
+ * - Stack-based WorkflowExecutor (n8n-style)
8
+ * - NodeRegistry for node type management
9
+ * - ExpressionResolver for {{ expression }} evaluation
10
+ * - 11 built-in nodes (ManualTrigger, IF, Code, HttpRequest, Set, Merge, Switch, NoOp, Wait, ErrorTrigger, RespondToWebhook)
11
+ * - Cron and Webhook trigger services
12
+ * - Workflow CRUD + execution persistence
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.buildConnectionIndexes = exports.NodeConnectionType = exports.N8nExecutionWatcher = exports.Cipher = exports.N8nSessionController = exports.N8nUserSyncService = exports.setupN8nProxy = exports.N8nLauncher = exports.CredentialService = exports.RespondToWebhookNode = exports.ErrorTriggerNode = exports.WaitNode = exports.NoOpNode = exports.SwitchNode = exports.MergeNode = exports.SetNode = exports.HttpRequestNode = exports.CodeNode = exports.IfNode = exports.ManualTriggerNode = exports.WebhookTriggerService = exports.CronTriggerService = exports.AiWorkflowSessionController = exports.WorkflowAiController = exports.WorkflowController = exports.AiWorkflowSessionService = exports.WorkflowAiService = exports.WorkflowService = exports.WORKFLOW_ENTITIES = exports.AiWorkflowVersionEntity = exports.AiWorkflowSessionEntity = exports.CredentialDefinitionEntity = exports.WorkflowExecutionEntity = exports.WorkflowDefinitionEntity = exports.ExpressionResolver = exports.NodeRegistry = exports.WorkflowExecutor = exports.WorkflowModule = void 0;
16
+ // ── Module ───────────────────────────────────────────────────
17
+ var workflow_module_js_1 = require("./workflow.module.js");
18
+ Object.defineProperty(exports, "WorkflowModule", { enumerable: true, get: function () { return workflow_module_js_1.WorkflowModule; } });
19
+ // ── Core Engine ──────────────────────────────────────────────
20
+ var workflow_executor_js_1 = require("./core/workflow-executor.js");
21
+ Object.defineProperty(exports, "WorkflowExecutor", { enumerable: true, get: function () { return workflow_executor_js_1.WorkflowExecutor; } });
22
+ var node_registry_js_1 = require("./core/node-registry.js");
23
+ Object.defineProperty(exports, "NodeRegistry", { enumerable: true, get: function () { return node_registry_js_1.NodeRegistry; } });
24
+ var expression_resolver_js_1 = require("./core/expression-resolver.js");
25
+ Object.defineProperty(exports, "ExpressionResolver", { enumerable: true, get: function () { return expression_resolver_js_1.ExpressionResolver; } });
26
+ // ── Entities ─────────────────────────────────────────────────
27
+ var index_js_1 = require("./entities/index.js");
28
+ Object.defineProperty(exports, "WorkflowDefinitionEntity", { enumerable: true, get: function () { return index_js_1.WorkflowDefinitionEntity; } });
29
+ Object.defineProperty(exports, "WorkflowExecutionEntity", { enumerable: true, get: function () { return index_js_1.WorkflowExecutionEntity; } });
30
+ Object.defineProperty(exports, "CredentialDefinitionEntity", { enumerable: true, get: function () { return index_js_1.CredentialDefinitionEntity; } });
31
+ Object.defineProperty(exports, "AiWorkflowSessionEntity", { enumerable: true, get: function () { return index_js_1.AiWorkflowSessionEntity; } });
32
+ Object.defineProperty(exports, "AiWorkflowVersionEntity", { enumerable: true, get: function () { return index_js_1.AiWorkflowVersionEntity; } });
33
+ Object.defineProperty(exports, "WORKFLOW_ENTITIES", { enumerable: true, get: function () { return index_js_1.WORKFLOW_ENTITIES; } });
34
+ // ── Services ─────────────────────────────────────────────────
35
+ var workflow_service_js_1 = require("./services/workflow.service.js");
36
+ Object.defineProperty(exports, "WorkflowService", { enumerable: true, get: function () { return workflow_service_js_1.WorkflowService; } });
37
+ var workflow_ai_service_js_1 = require("./services/workflow-ai.service.js");
38
+ Object.defineProperty(exports, "WorkflowAiService", { enumerable: true, get: function () { return workflow_ai_service_js_1.WorkflowAiService; } });
39
+ var ai_workflow_session_service_js_1 = require("./services/ai-workflow-session.service.js");
40
+ Object.defineProperty(exports, "AiWorkflowSessionService", { enumerable: true, get: function () { return ai_workflow_session_service_js_1.AiWorkflowSessionService; } });
41
+ // ── Controllers ──────────────────────────────────────────────
42
+ var workflow_controller_js_1 = require("./controllers/workflow.controller.js");
43
+ Object.defineProperty(exports, "WorkflowController", { enumerable: true, get: function () { return workflow_controller_js_1.WorkflowController; } });
44
+ var workflow_ai_controller_js_1 = require("./controllers/workflow-ai.controller.js");
45
+ Object.defineProperty(exports, "WorkflowAiController", { enumerable: true, get: function () { return workflow_ai_controller_js_1.WorkflowAiController; } });
46
+ var ai_workflow_session_controller_js_1 = require("./controllers/ai-workflow-session.controller.js");
47
+ Object.defineProperty(exports, "AiWorkflowSessionController", { enumerable: true, get: function () { return ai_workflow_session_controller_js_1.AiWorkflowSessionController; } });
48
+ // ── Triggers ─────────────────────────────────────────────────
49
+ var cron_trigger_js_1 = require("./triggers/cron-trigger.js");
50
+ Object.defineProperty(exports, "CronTriggerService", { enumerable: true, get: function () { return cron_trigger_js_1.CronTriggerService; } });
51
+ var webhook_trigger_js_1 = require("./triggers/webhook-trigger.js");
52
+ Object.defineProperty(exports, "WebhookTriggerService", { enumerable: true, get: function () { return webhook_trigger_js_1.WebhookTriggerService; } });
53
+ // ── Built-in Nodes ───────────────────────────────────────────
54
+ var manual_trigger_node_js_1 = require("./nodes/manual-trigger.node.js");
55
+ Object.defineProperty(exports, "ManualTriggerNode", { enumerable: true, get: function () { return manual_trigger_node_js_1.ManualTriggerNode; } });
56
+ var if_node_js_1 = require("./nodes/if.node.js");
57
+ Object.defineProperty(exports, "IfNode", { enumerable: true, get: function () { return if_node_js_1.IfNode; } });
58
+ var code_node_js_1 = require("./nodes/code.node.js");
59
+ Object.defineProperty(exports, "CodeNode", { enumerable: true, get: function () { return code_node_js_1.CodeNode; } });
60
+ var http_request_node_js_1 = require("./nodes/http-request.node.js");
61
+ Object.defineProperty(exports, "HttpRequestNode", { enumerable: true, get: function () { return http_request_node_js_1.HttpRequestNode; } });
62
+ var set_node_js_1 = require("./nodes/set.node.js");
63
+ Object.defineProperty(exports, "SetNode", { enumerable: true, get: function () { return set_node_js_1.SetNode; } });
64
+ var merge_node_js_1 = require("./nodes/merge.node.js");
65
+ Object.defineProperty(exports, "MergeNode", { enumerable: true, get: function () { return merge_node_js_1.MergeNode; } });
66
+ var switch_node_js_1 = require("./nodes/switch.node.js");
67
+ Object.defineProperty(exports, "SwitchNode", { enumerable: true, get: function () { return switch_node_js_1.SwitchNode; } });
68
+ var noop_node_js_1 = require("./nodes/noop.node.js");
69
+ Object.defineProperty(exports, "NoOpNode", { enumerable: true, get: function () { return noop_node_js_1.NoOpNode; } });
70
+ var wait_node_js_1 = require("./nodes/wait.node.js");
71
+ Object.defineProperty(exports, "WaitNode", { enumerable: true, get: function () { return wait_node_js_1.WaitNode; } });
72
+ var error_trigger_node_js_1 = require("./nodes/error-trigger.node.js");
73
+ Object.defineProperty(exports, "ErrorTriggerNode", { enumerable: true, get: function () { return error_trigger_node_js_1.ErrorTriggerNode; } });
74
+ var respond_to_webhook_node_js_1 = require("./nodes/respond-to-webhook.node.js");
75
+ Object.defineProperty(exports, "RespondToWebhookNode", { enumerable: true, get: function () { return respond_to_webhook_node_js_1.RespondToWebhookNode; } });
76
+ // ── Credentials ─────────────────────────────────────────────
77
+ var credential_service_js_1 = require("./services/credential.service.js");
78
+ Object.defineProperty(exports, "CredentialService", { enumerable: true, get: function () { return credential_service_js_1.CredentialService; } });
79
+ // ── n8n Integration ─────────────────────────────────────────
80
+ var n8n_launcher_js_1 = require("./n8n/launcher/n8n-launcher.js");
81
+ Object.defineProperty(exports, "N8nLauncher", { enumerable: true, get: function () { return n8n_launcher_js_1.N8nLauncher; } });
82
+ var n8n_proxy_middleware_js_1 = require("./n8n/proxy/n8n-proxy.middleware.js");
83
+ Object.defineProperty(exports, "setupN8nProxy", { enumerable: true, get: function () { return n8n_proxy_middleware_js_1.setupN8nProxy; } });
84
+ var n8n_user_sync_service_js_1 = require("./n8n/sync/n8n-user-sync.service.js");
85
+ Object.defineProperty(exports, "N8nUserSyncService", { enumerable: true, get: function () { return n8n_user_sync_service_js_1.N8nUserSyncService; } });
86
+ var n8n_session_controller_js_1 = require("./n8n/controllers/n8n-session.controller.js");
87
+ Object.defineProperty(exports, "N8nSessionController", { enumerable: true, get: function () { return n8n_session_controller_js_1.N8nSessionController; } });
88
+ var cipher_js_1 = require("./n8n/cipher/cipher.js");
89
+ Object.defineProperty(exports, "Cipher", { enumerable: true, get: function () { return cipher_js_1.Cipher; } });
90
+ var n8n_execution_watcher_js_1 = require("./n8n/watcher/n8n-execution-watcher.js");
91
+ Object.defineProperty(exports, "N8nExecutionWatcher", { enumerable: true, get: function () { return n8n_execution_watcher_js_1.N8nExecutionWatcher; } });
92
+ // ── Types (re-export all from types/index) ───────────────────
93
+ var index_js_2 = require("./types/index.js");
94
+ Object.defineProperty(exports, "NodeConnectionType", { enumerable: true, get: function () { return index_js_2.NodeConnectionType; } });
95
+ Object.defineProperty(exports, "buildConnectionIndexes", { enumerable: true, get: function () { return index_js_2.buildConnectionIndexes; } });
96
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAEH,gEAAgE;AAChE,2DAAsD;AAA7C,oHAAA,cAAc,OAAA;AAEvB,gEAAgE;AAChE,oEAA+D;AAAtD,wHAAA,gBAAgB,OAAA;AACzB,4DAAuD;AAA9C,gHAAA,YAAY,OAAA;AACrB,wEAAmE;AAA1D,4HAAA,kBAAkB,OAAA;AAG3B,gEAAgE;AAChE,gDAO6B;AAN3B,oHAAA,wBAAwB,OAAA;AACxB,mHAAA,uBAAuB,OAAA;AACvB,sHAAA,0BAA0B,OAAA;AAC1B,mHAAA,uBAAuB,OAAA;AACvB,mHAAA,uBAAuB,OAAA;AACvB,6GAAA,iBAAiB,OAAA;AAGnB,gEAAgE;AAChE,sEAAiE;AAAxD,sHAAA,eAAe,OAAA;AAExB,4EAAsE;AAA7D,2HAAA,iBAAiB,OAAA;AAE1B,4FAAqF;AAA5E,0IAAA,wBAAwB,OAAA;AAGjC,gEAAgE;AAChE,+EAA0E;AAAjE,4HAAA,kBAAkB,OAAA;AAC3B,qFAA+E;AAAtE,iIAAA,oBAAoB,OAAA;AAC7B,qGAA8F;AAArF,gJAAA,2BAA2B,OAAA;AAEpC,gEAAgE;AAChE,8DAAgE;AAAvD,qHAAA,kBAAkB,OAAA;AAC3B,oEAAsE;AAA7D,2HAAA,qBAAqB,OAAA;AAE9B,gEAAgE;AAChE,yEAAmE;AAA1D,2HAAA,iBAAiB,OAAA;AAC1B,iDAA4C;AAAnC,oGAAA,MAAM,OAAA;AACf,qDAAgD;AAAvC,wGAAA,QAAQ,OAAA;AACjB,qEAA+D;AAAtD,uHAAA,eAAe,OAAA;AACxB,mDAA8C;AAArC,sGAAA,OAAO,OAAA;AAChB,uDAAkD;AAAzC,0GAAA,SAAS,OAAA;AAClB,yDAAoD;AAA3C,4GAAA,UAAU,OAAA;AACnB,qDAAgD;AAAvC,wGAAA,QAAQ,OAAA;AACjB,qDAAgD;AAAvC,wGAAA,QAAQ,OAAA;AACjB,uEAAiE;AAAxD,yHAAA,gBAAgB,OAAA;AACzB,iFAA0E;AAAjE,kIAAA,oBAAoB,OAAA;AAE7B,+DAA+D;AAC/D,0EAAqE;AAA5D,0HAAA,iBAAiB,OAAA;AAE1B,+DAA+D;AAC/D,kEAA6D;AAApD,8GAAA,WAAW,OAAA;AAEpB,+EAAoE;AAA3D,wHAAA,aAAa,OAAA;AACtB,gFAAyE;AAAhE,8HAAA,kBAAkB,OAAA;AAC3B,yFAAmF;AAA1E,iIAAA,oBAAoB,OAAA;AAC7B,oDAAgD;AAAvC,mGAAA,MAAM,OAAA;AACf,mFAA6E;AAApE,+HAAA,mBAAmB,OAAA;AAG5B,gEAAgE;AAChE,6CAA8E;AAArE,8GAAA,kBAAkB,OAAA;AAAE,kHAAA,sBAAsB,OAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Cipher — AES-256-CBC encryption/decryption for credential storage.
3
+ * Compatible with n8n's Cipher interface.
4
+ */
5
+ export declare class Cipher {
6
+ private readonly key;
7
+ constructor();
8
+ encrypt(data: string): string;
9
+ decrypt(encryptedData: string): string;
10
+ }
11
+ //# sourceMappingURL=cipher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cipher.d.ts","sourceRoot":"","sources":["../../../src/n8n/cipher/cipher.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,qBACa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;;IAQ7B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQ7B,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;CAYvC"}
@@ -0,0 +1,54 @@
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 __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.Cipher = void 0;
13
+ const node_crypto_1 = require("node:crypto");
14
+ const core_1 = require("@octo/core");
15
+ const ALGORITHM = 'aes-256-cbc';
16
+ const IV_LENGTH = 16;
17
+ const ENCRYPTION_KEY = process.env.OCTO_ENCRYPTION_KEY || 'octo-default-encryption-key-32ch';
18
+ /**
19
+ * Cipher — AES-256-CBC encryption/decryption for credential storage.
20
+ * Compatible with n8n's Cipher interface.
21
+ */
22
+ let Cipher = class Cipher {
23
+ key;
24
+ constructor() {
25
+ // Ensure key is exactly 32 bytes
26
+ const keyStr = ENCRYPTION_KEY.padEnd(32, '0').slice(0, 32);
27
+ this.key = Buffer.from(keyStr, 'utf8');
28
+ }
29
+ encrypt(data) {
30
+ const iv = (0, node_crypto_1.randomBytes)(IV_LENGTH);
31
+ const cipher = (0, node_crypto_1.createCipheriv)(ALGORITHM, this.key, iv);
32
+ let encrypted = cipher.update(data, 'utf8', 'hex');
33
+ encrypted += cipher.final('hex');
34
+ return iv.toString('hex') + ':' + encrypted;
35
+ }
36
+ decrypt(encryptedData) {
37
+ const parts = encryptedData.split(':');
38
+ if (parts.length < 2) {
39
+ throw new Error('Invalid encrypted data format');
40
+ }
41
+ const iv = Buffer.from(parts[0], 'hex');
42
+ const encrypted = parts.slice(1).join(':');
43
+ const decipher = (0, node_crypto_1.createDecipheriv)(ALGORITHM, this.key, iv);
44
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
45
+ decrypted += decipher.final('utf8');
46
+ return decrypted;
47
+ }
48
+ };
49
+ exports.Cipher = Cipher;
50
+ exports.Cipher = Cipher = __decorate([
51
+ (0, core_1.Service)(),
52
+ __metadata("design:paramtypes", [])
53
+ ], Cipher);
54
+ //# sourceMappingURL=cipher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cipher.js","sourceRoot":"","sources":["../../../src/n8n/cipher/cipher.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA4E;AAC5E,qCAAqC;AAErC,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,kCAAkC,CAAC;AAE7F;;;GAGG;AAEI,IAAM,MAAM,GAAZ,MAAM,MAAM;IACA,GAAG,CAAS;IAE7B;QACE,iCAAiC;QACjC,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,MAAM,EAAE,GAAG,IAAA,yBAAW,EAAC,SAAS,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,IAAA,4BAAc,EAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvD,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACnD,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,SAAS,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,aAAqB;QAC3B,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAA,8BAAgB,EAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;CACF,CAAA;AA7BY,wBAAM;iBAAN,MAAM;IADlB,IAAA,cAAO,GAAE;;GACG,MAAM,CA6BlB"}
@@ -0,0 +1,20 @@
1
+ import type { Request, Response } from '@octo/core';
2
+ /**
3
+ * N8nSessionController — provides an endpoint for the frontend to
4
+ * obtain an n8n auth token/cookie for the current Octo user.
5
+ *
6
+ * The auth middleware must populate `req.user` before this controller
7
+ * is reached.
8
+ */
9
+ export declare class N8nSessionController {
10
+ private get userSyncService();
11
+ private get userService();
12
+ /**
13
+ * POST /api/n8n/session
14
+ *
15
+ * Synchronise the current Octo user into n8n (if not already present)
16
+ * and return an n8n authentication token/cookie.
17
+ */
18
+ createSession(req: Request, res: Response): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=n8n-session.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n8n-session.controller.d.ts","sourceRoot":"","sources":["../../../src/n8n/controllers/n8n-session.controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKpD;;;;;;GAMG;AACH,qBACa,oBAAoB;IAC/B,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,KAAK,WAAW,GAEtB;IAED;;;;;OAKG;IAEG,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CA4ChE"}
@@ -0,0 +1,84 @@
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 __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.N8nSessionController = void 0;
13
+ const core_1 = require("@octo/core");
14
+ const auth_1 = require("@octo/auth");
15
+ const n8n_user_sync_service_js_1 = require("../sync/n8n-user-sync.service.js");
16
+ /**
17
+ * N8nSessionController — provides an endpoint for the frontend to
18
+ * obtain an n8n auth token/cookie for the current Octo user.
19
+ *
20
+ * The auth middleware must populate `req.user` before this controller
21
+ * is reached.
22
+ */
23
+ let N8nSessionController = class N8nSessionController {
24
+ get userSyncService() {
25
+ return core_1.Container.get(n8n_user_sync_service_js_1.N8nUserSyncService);
26
+ }
27
+ get userService() {
28
+ return core_1.Container.get(auth_1.UserService);
29
+ }
30
+ /**
31
+ * POST /api/n8n/session
32
+ *
33
+ * Synchronise the current Octo user into n8n (if not already present)
34
+ * and return an n8n authentication token/cookie.
35
+ */
36
+ async createSession(req, res) {
37
+ if (!req.user) {
38
+ throw core_1.AppError.unauthorized('Authentication required');
39
+ }
40
+ // Load full user from DB (JWT only has userId + username, no email)
41
+ const fullUser = await this.userService.findById(req.user.userId);
42
+ if (!fullUser) {
43
+ throw core_1.AppError.unauthorized('User not found');
44
+ }
45
+ // email is required for n8n user sync — fallback to username-based email
46
+ const email = fullUser.email || `${fullUser.username}@octo.local`;
47
+ const octoUser = {
48
+ id: fullUser.id,
49
+ email,
50
+ username: fullUser.username,
51
+ role: req.user.roles?.[0],
52
+ };
53
+ // Ensure the user exists in n8n
54
+ await this.userSyncService.syncUser(octoUser);
55
+ // Obtain an auth cookie for the n8n iframe / API
56
+ const authCookie = await this.userSyncService.getN8nAuthToken(octoUser);
57
+ // Parse the n8n set-cookie header and set it on the browser response
58
+ // so the iframe sends it with subsequent /n8n/* requests.
59
+ // Format: "n8n-auth=eyJ...; Path=/; HttpOnly; SameSite=Lax"
60
+ const cookieNameValue = authCookie.split(';')[0]; // "n8n-auth=eyJ..."
61
+ const eqIndex = cookieNameValue.indexOf('=');
62
+ if (eqIndex > 0) {
63
+ const cookieName = cookieNameValue.substring(0, eqIndex);
64
+ const cookieValue = cookieNameValue.substring(eqIndex + 1);
65
+ res.cookie(cookieName, cookieValue, {
66
+ path: '/n8n/',
67
+ httpOnly: true,
68
+ sameSite: 'lax',
69
+ });
70
+ }
71
+ res.json(core_1.ApiResponse.ok({ ready: true }));
72
+ }
73
+ };
74
+ exports.N8nSessionController = N8nSessionController;
75
+ __decorate([
76
+ (0, core_1.Post)('/session'),
77
+ __metadata("design:type", Function),
78
+ __metadata("design:paramtypes", [Object, Object]),
79
+ __metadata("design:returntype", Promise)
80
+ ], N8nSessionController.prototype, "createSession", null);
81
+ exports.N8nSessionController = N8nSessionController = __decorate([
82
+ (0, core_1.Controller)('/api/n8n')
83
+ ], N8nSessionController);
84
+ //# sourceMappingURL=n8n-session.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n8n-session.controller.js","sourceRoot":"","sources":["../../../src/n8n/controllers/n8n-session.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,qCAAgF;AAChF,qCAAyC;AACzC,+EAAsE;AAEtE;;;;;;GAMG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,IAAY,eAAe;QACzB,OAAO,gBAAS,CAAC,GAAG,CAAC,6CAAkB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAY,WAAW;QACrB,OAAO,gBAAS,CAAC,GAAG,CAAC,kBAAW,CAAC,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IAEG,AAAN,KAAK,CAAC,aAAa,CAAC,GAAY,EAAE,GAAa;QAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,eAAQ,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;QACzD,CAAC;QAED,oEAAoE;QACpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,eAAQ,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAChD,CAAC;QAED,yEAAyE;QACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,GAAG,QAAQ,CAAC,QAAQ,aAAa,CAAC;QAElE,MAAM,QAAQ,GAAG;YACf,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,KAAK;YACL,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAC1B,CAAC;QAEF,gCAAgC;QAChC,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE9C,iDAAiD;QACjD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAExE,qEAAqE;QACrE,0DAA0D;QAC1D,4DAA4D;QAC5D,MAAM,eAAe,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB;QACtE,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAC3D,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE;gBAClC,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,kBAAW,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF,CAAA;AA5DY,oDAAoB;AAgBzB;IADL,IAAA,WAAI,EAAC,UAAU,CAAC;;;;yDA4ChB;+BA3DU,oBAAoB;IADhC,IAAA,iBAAU,EAAC,UAAU,CAAC;GACV,oBAAoB,CA4DhC"}
@@ -0,0 +1,8 @@
1
+ export { N8nLauncher } from './launcher/n8n-launcher.js';
2
+ export type { N8nConfig } from './launcher/n8n-launcher.js';
3
+ export { setupN8nProxy } from './proxy/n8n-proxy.middleware.js';
4
+ export { N8nUserSyncService } from './sync/n8n-user-sync.service.js';
5
+ export type { OctoUser } from './sync/n8n-user-sync.service.js';
6
+ export { N8nSessionController } from './controllers/n8n-session.controller.js';
7
+ export { Cipher } from './cipher/cipher.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/n8n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,YAAY,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Cipher = exports.N8nSessionController = exports.N8nUserSyncService = exports.setupN8nProxy = exports.N8nLauncher = void 0;
4
+ var n8n_launcher_js_1 = require("./launcher/n8n-launcher.js");
5
+ Object.defineProperty(exports, "N8nLauncher", { enumerable: true, get: function () { return n8n_launcher_js_1.N8nLauncher; } });
6
+ var n8n_proxy_middleware_js_1 = require("./proxy/n8n-proxy.middleware.js");
7
+ Object.defineProperty(exports, "setupN8nProxy", { enumerable: true, get: function () { return n8n_proxy_middleware_js_1.setupN8nProxy; } });
8
+ var n8n_user_sync_service_js_1 = require("./sync/n8n-user-sync.service.js");
9
+ Object.defineProperty(exports, "N8nUserSyncService", { enumerable: true, get: function () { return n8n_user_sync_service_js_1.N8nUserSyncService; } });
10
+ var n8n_session_controller_js_1 = require("./controllers/n8n-session.controller.js");
11
+ Object.defineProperty(exports, "N8nSessionController", { enumerable: true, get: function () { return n8n_session_controller_js_1.N8nSessionController; } });
12
+ var cipher_js_1 = require("./cipher/cipher.js");
13
+ Object.defineProperty(exports, "Cipher", { enumerable: true, get: function () { return cipher_js_1.Cipher; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/n8n/index.ts"],"names":[],"mappings":";;;AAAA,8DAAyD;AAAhD,8GAAA,WAAW,OAAA;AAEpB,2EAAgE;AAAvD,wHAAA,aAAa,OAAA;AACtB,4EAAqE;AAA5D,8HAAA,kBAAkB,OAAA;AAE3B,qFAA+E;AAAtE,iIAAA,oBAAoB,OAAA;AAC7B,gDAA4C;AAAnC,mGAAA,MAAM,OAAA"}
@@ -0,0 +1,41 @@
1
+ export interface N8nConfig {
2
+ port: number;
3
+ dbPath: string;
4
+ webhookUrl: string;
5
+ encryptionKey: string;
6
+ n8nUserDataDir: string;
7
+ }
8
+ /**
9
+ * N8nLauncher — manages the n8n subprocess lifecycle.
10
+ *
11
+ * Spawns n8n as a child process bound to 127.0.0.1, polls /healthz
12
+ * until it is ready, and provides a graceful shutdown (SIGTERM then SIGKILL).
13
+ */
14
+ export declare class N8nLauncher {
15
+ private process;
16
+ private running;
17
+ private readonly logger;
18
+ /**
19
+ * Resolve the n8n binary path.
20
+ * Priority: local node_modules → global installation via `which`.
21
+ */
22
+ private resolveN8nBinary;
23
+ /**
24
+ * Start the n8n subprocess with the given configuration.
25
+ */
26
+ start(config: N8nConfig): Promise<void>;
27
+ /**
28
+ * Poll the n8n healthz endpoint until it responds 200.
29
+ */
30
+ waitForReady(port: number, maxRetries?: number, interval?: number): Promise<void>;
31
+ /**
32
+ * Stop the n8n subprocess gracefully.
33
+ * Sends SIGTERM and waits up to 5 seconds before sending SIGKILL.
34
+ */
35
+ stop(): Promise<void>;
36
+ /**
37
+ * Check whether the n8n subprocess is currently running.
38
+ */
39
+ isRunning(): boolean;
40
+ }
41
+ //# sourceMappingURL=n8n-launcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n8n-launcher.d.ts","sourceRoot":"","sources":["../../../src/n8n/launcher/n8n-launcher.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBACa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqD;IAE5E;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA+BxB;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA0E7C;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,UAAU,SAAK,EACf,QAAQ,SAAO,GACd,OAAO,CAAC,IAAI,CAAC;IAuBhB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B3B;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB"}
@@ -0,0 +1,186 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.N8nLauncher = void 0;
13
+ const node_child_process_1 = require("node:child_process");
14
+ const node_path_1 = __importDefault(require("node:path"));
15
+ const node_fs_1 = __importDefault(require("node:fs"));
16
+ const core_1 = require("@octo/core");
17
+ /**
18
+ * N8nLauncher — manages the n8n subprocess lifecycle.
19
+ *
20
+ * Spawns n8n as a child process bound to 127.0.0.1, polls /healthz
21
+ * until it is ready, and provides a graceful shutdown (SIGTERM then SIGKILL).
22
+ */
23
+ let N8nLauncher = class N8nLauncher {
24
+ process = null;
25
+ running = false;
26
+ logger = core_1.Container.get(core_1.LoggerService).child('N8nLauncher');
27
+ /**
28
+ * Resolve the n8n binary path.
29
+ * Priority: local node_modules → global installation via `which`.
30
+ */
31
+ resolveN8nBinary() {
32
+ // 1. Try local node_modules (require.resolve)
33
+ try {
34
+ return require.resolve('n8n/bin/n8n');
35
+ }
36
+ catch {
37
+ // not found locally
38
+ }
39
+ // 2. Try local node_modules/.bin
40
+ const localBin = node_path_1.default.resolve('node_modules/.bin/n8n');
41
+ if (node_fs_1.default.existsSync(localBin)) {
42
+ return localBin;
43
+ }
44
+ // 3. Try global installation via `which`
45
+ try {
46
+ const globalPath = (0, node_child_process_1.execSync)('which n8n', { encoding: 'utf-8' }).trim();
47
+ if (globalPath && node_fs_1.default.existsSync(globalPath)) {
48
+ // Resolve symlink to get the actual JS entry file
49
+ const realPath = node_fs_1.default.realpathSync(globalPath);
50
+ this.logger.info(`Using global n8n at ${realPath}`);
51
+ return realPath;
52
+ }
53
+ }
54
+ catch {
55
+ // which command failed
56
+ }
57
+ // Fallback: return local path and let it fail with a clear error
58
+ return localBin;
59
+ }
60
+ /**
61
+ * Start the n8n subprocess with the given configuration.
62
+ */
63
+ async start(config) {
64
+ if (this.running) {
65
+ this.logger.warn('n8n is already running, skipping start');
66
+ return;
67
+ }
68
+ const n8nBin = this.resolveN8nBinary();
69
+ this.logger.info(`Starting n8n from ${n8nBin} on port ${config.port}`);
70
+ const env = {
71
+ ...process.env,
72
+ DB_TYPE: 'sqlite',
73
+ DB_SQLITE_DATABASE: config.dbPath,
74
+ N8N_PORT: String(config.port),
75
+ N8N_HOST: '127.0.0.1',
76
+ N8N_ENCRYPTION_KEY: config.encryptionKey,
77
+ EXECUTIONS_MODE: 'regular',
78
+ N8N_LOG_LEVEL: 'info',
79
+ N8N_LOG_OUTPUT: 'console',
80
+ WEBHOOK_URL: config.webhookUrl,
81
+ N8N_USER_FOLDER: config.n8nUserDataDir,
82
+ // Disable telemetry and personalization survey in embedded mode
83
+ N8N_DIAGNOSTICS_ENABLED: 'false',
84
+ N8N_PERSONALIZATION_ENABLED: 'false',
85
+ // Custom Octo nodes directory (NODES_INCLUDE is NOT used here because
86
+ // it filters by full node type name, not package name, which would
87
+ // exclude all built-in nodes).
88
+ // In dev mode __dirname points to src/; always resolve to dist/n8n/nodes/
89
+ // where the compiled .node.js files live.
90
+ N8N_CUSTOM_EXTENSIONS: node_path_1.default.resolve(__dirname, '..', '..', '..', 'dist', 'n8n', 'nodes'),
91
+ // Allow custom nodes to be used as AI tools in the AI Agent node
92
+ N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE: 'true',
93
+ // Use SSE instead of WebSocket for push (execution status updates).
94
+ // WebSocket upgrades are not proxied by Next.js dev server rewrites,
95
+ // so SSE (plain HTTP) is more compatible with the reverse-proxy chain.
96
+ N8N_PUSH_BACKEND: 'sse',
97
+ };
98
+ this.process = (0, node_child_process_1.spawn)(process.execPath, [n8nBin, 'start'], {
99
+ env,
100
+ stdio: ['ignore', 'pipe', 'pipe'],
101
+ });
102
+ this.running = true;
103
+ this.process.stdout?.on('data', (data) => {
104
+ const lines = data.toString().trim().split('\n');
105
+ for (const line of lines) {
106
+ this.logger.info(`[n8n stdout] ${line}`);
107
+ }
108
+ });
109
+ this.process.stderr?.on('data', (data) => {
110
+ const lines = data.toString().trim().split('\n');
111
+ for (const line of lines) {
112
+ this.logger.warn(`[n8n stderr] ${line}`);
113
+ }
114
+ });
115
+ this.process.on('exit', (code, signal) => {
116
+ this.running = false;
117
+ this.process = null;
118
+ this.logger.info(`n8n process exited (code=${code}, signal=${signal})`);
119
+ });
120
+ this.process.on('error', (err) => {
121
+ this.running = false;
122
+ this.logger.error(`n8n process error: ${err.message}`);
123
+ });
124
+ await this.waitForReady(config.port);
125
+ this.logger.info('n8n is ready');
126
+ }
127
+ /**
128
+ * Poll the n8n healthz endpoint until it responds 200.
129
+ */
130
+ async waitForReady(port, maxRetries = 30, interval = 1000) {
131
+ const url = `http://127.0.0.1:${port}/healthz`;
132
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
133
+ try {
134
+ const response = await fetch(url);
135
+ if (response.ok) {
136
+ return;
137
+ }
138
+ }
139
+ catch {
140
+ // n8n not ready yet
141
+ }
142
+ if (attempt === maxRetries) {
143
+ throw new Error(`n8n did not become ready after ${maxRetries} attempts (url: ${url})`);
144
+ }
145
+ await new Promise((resolve) => setTimeout(resolve, interval));
146
+ }
147
+ }
148
+ /**
149
+ * Stop the n8n subprocess gracefully.
150
+ * Sends SIGTERM and waits up to 5 seconds before sending SIGKILL.
151
+ */
152
+ async stop() {
153
+ if (!this.process || !this.running) {
154
+ this.logger.info('n8n is not running, nothing to stop');
155
+ return;
156
+ }
157
+ this.logger.info('Stopping n8n...');
158
+ return new Promise((resolve) => {
159
+ const forceKillTimer = setTimeout(() => {
160
+ if (this.process && this.running) {
161
+ this.logger.warn('n8n did not exit in 5s, sending SIGKILL');
162
+ this.process.kill('SIGKILL');
163
+ }
164
+ }, 5000);
165
+ this.process.once('exit', () => {
166
+ clearTimeout(forceKillTimer);
167
+ this.running = false;
168
+ this.process = null;
169
+ this.logger.info('n8n stopped');
170
+ resolve();
171
+ });
172
+ this.process.kill('SIGTERM');
173
+ });
174
+ }
175
+ /**
176
+ * Check whether the n8n subprocess is currently running.
177
+ */
178
+ isRunning() {
179
+ return this.running;
180
+ }
181
+ };
182
+ exports.N8nLauncher = N8nLauncher;
183
+ exports.N8nLauncher = N8nLauncher = __decorate([
184
+ (0, core_1.Service)()
185
+ ], N8nLauncher);
186
+ //# sourceMappingURL=n8n-launcher.js.map