@octo-cyber/workflow 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/controllers/ai-workflow-session.controller.d.ts +19 -0
- package/dist/controllers/ai-workflow-session.controller.d.ts.map +1 -0
- package/dist/controllers/ai-workflow-session.controller.js +135 -0
- package/dist/controllers/ai-workflow-session.controller.js.map +1 -0
- package/dist/controllers/credential.controller.d.ts +68 -0
- package/dist/controllers/credential.controller.d.ts.map +1 -0
- package/dist/controllers/credential.controller.js +303 -0
- package/dist/controllers/credential.controller.js.map +1 -0
- package/dist/controllers/index.d.ts +3 -0
- package/dist/controllers/index.d.ts.map +1 -0
- package/dist/controllers/index.js +8 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/workflow-ai.controller.d.ts +23 -0
- package/dist/controllers/workflow-ai.controller.d.ts.map +1 -0
- package/dist/controllers/workflow-ai.controller.js +164 -0
- package/dist/controllers/workflow-ai.controller.js.map +1 -0
- package/dist/controllers/workflow.controller.d.ts +66 -0
- package/dist/controllers/workflow.controller.d.ts.map +1 -0
- package/dist/controllers/workflow.controller.js +239 -0
- package/dist/controllers/workflow.controller.js.map +1 -0
- package/dist/core/expression-resolver.d.ts +49 -0
- package/dist/core/expression-resolver.d.ts.map +1 -0
- package/dist/core/expression-resolver.js +113 -0
- package/dist/core/expression-resolver.js.map +1 -0
- package/dist/core/node-registry.d.ts +24 -0
- package/dist/core/node-registry.d.ts.map +1 -0
- package/dist/core/node-registry.js +62 -0
- package/dist/core/node-registry.js.map +1 -0
- package/dist/core/workflow-executor.d.ts +50 -0
- package/dist/core/workflow-executor.d.ts.map +1 -0
- package/dist/core/workflow-executor.js +458 -0
- package/dist/core/workflow-executor.js.map +1 -0
- package/dist/entities/ai-workflow-session.entity.d.ts +17 -0
- package/dist/entities/ai-workflow-session.entity.d.ts.map +1 -0
- package/dist/entities/ai-workflow-session.entity.js +70 -0
- package/dist/entities/ai-workflow-session.entity.js.map +1 -0
- package/dist/entities/ai-workflow-version.entity.d.ts +18 -0
- package/dist/entities/ai-workflow-version.entity.d.ts.map +1 -0
- package/dist/entities/ai-workflow-version.entity.js +71 -0
- package/dist/entities/ai-workflow-version.entity.js.map +1 -0
- package/dist/entities/credential-definition.entity.d.ts +17 -0
- package/dist/entities/credential-definition.entity.d.ts.map +1 -0
- package/dist/entities/credential-definition.entity.js +66 -0
- package/dist/entities/credential-definition.entity.js.map +1 -0
- package/dist/entities/index.d.ts +9 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +22 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/workflow-definition.entity.d.ts +20 -0
- package/dist/entities/workflow-definition.entity.d.ts.map +1 -0
- package/dist/entities/workflow-definition.entity.js +85 -0
- package/dist/entities/workflow-definition.entity.js.map +1 -0
- package/dist/entities/workflow-execution.entity.d.ts +26 -0
- package/dist/entities/workflow-execution.entity.d.ts.map +1 -0
- package/dist/entities/workflow-execution.entity.js +99 -0
- package/dist/entities/workflow-execution.entity.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/n8n/cipher/cipher.d.ts +11 -0
- package/dist/n8n/cipher/cipher.d.ts.map +1 -0
- package/dist/n8n/cipher/cipher.js +54 -0
- package/dist/n8n/cipher/cipher.js.map +1 -0
- package/dist/n8n/controllers/n8n-session.controller.d.ts +20 -0
- package/dist/n8n/controllers/n8n-session.controller.d.ts.map +1 -0
- package/dist/n8n/controllers/n8n-session.controller.js +84 -0
- package/dist/n8n/controllers/n8n-session.controller.js.map +1 -0
- package/dist/n8n/index.d.ts +8 -0
- package/dist/n8n/index.d.ts.map +1 -0
- package/dist/n8n/index.js +14 -0
- package/dist/n8n/index.js.map +1 -0
- package/dist/n8n/launcher/n8n-launcher.d.ts +41 -0
- package/dist/n8n/launcher/n8n-launcher.d.ts.map +1 -0
- package/dist/n8n/launcher/n8n-launcher.js +186 -0
- package/dist/n8n/launcher/n8n-launcher.js.map +1 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.d.ts +13 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.js +103 -0
- package/dist/n8n/nodes/OctoClaudeCliTool.node.js.map +1 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.d.ts +14 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.js +431 -0
- package/dist/n8n/nodes/OctoCliChatModel.node.js.map +1 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.d.ts +13 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.js +100 -0
- package/dist/n8n/nodes/OctoCodexCliTool.node.js.map +1 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.d.ts +13 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.js +91 -0
- package/dist/n8n/nodes/OctoGeminiCliTool.node.js.map +1 -0
- package/dist/n8n/nodes/OctoKnowledge.node.d.ts +6 -0
- package/dist/n8n/nodes/OctoKnowledge.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoKnowledge.node.js +95 -0
- package/dist/n8n/nodes/OctoKnowledge.node.js.map +1 -0
- package/dist/n8n/nodes/OctoNotification.node.d.ts +6 -0
- package/dist/n8n/nodes/OctoNotification.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoNotification.node.js +72 -0
- package/dist/n8n/nodes/OctoNotification.node.js.map +1 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.d.ts +6 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.d.ts.map +1 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.js +60 -0
- package/dist/n8n/nodes/OctoSyncBridge.node.js.map +1 -0
- package/dist/n8n/nodes/n8n-node-types.d.ts +111 -0
- package/dist/n8n/nodes/n8n-node-types.d.ts.map +1 -0
- package/dist/n8n/nodes/n8n-node-types.js +30 -0
- package/dist/n8n/nodes/n8n-node-types.js.map +1 -0
- package/dist/n8n/nodes/octo-cli-chat-model.svg +23 -0
- package/dist/n8n/nodes/package.json +16 -0
- package/dist/n8n/proxy/css-injector.d.ts +3 -0
- package/dist/n8n/proxy/css-injector.d.ts.map +1 -0
- package/dist/n8n/proxy/css-injector.js +62 -0
- package/dist/n8n/proxy/css-injector.js.map +1 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.d.ts +12 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.d.ts.map +1 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.js +131 -0
- package/dist/n8n/proxy/n8n-proxy.middleware.js.map +1 -0
- package/dist/n8n/proxy/n8n-theme.css +45 -0
- package/dist/n8n/sync/n8n-user-sync.service.d.ts +75 -0
- package/dist/n8n/sync/n8n-user-sync.service.d.ts.map +1 -0
- package/dist/n8n/sync/n8n-user-sync.service.js +286 -0
- package/dist/n8n/sync/n8n-user-sync.service.js.map +1 -0
- package/dist/n8n/watcher/n8n-execution-watcher.d.ts +39 -0
- package/dist/n8n/watcher/n8n-execution-watcher.d.ts.map +1 -0
- package/dist/n8n/watcher/n8n-execution-watcher.js +110 -0
- package/dist/n8n/watcher/n8n-execution-watcher.js.map +1 -0
- package/dist/nodes/code.node.d.ts +24 -0
- package/dist/nodes/code.node.d.ts.map +1 -0
- package/dist/nodes/code.node.js +150 -0
- package/dist/nodes/code.node.js.map +1 -0
- package/dist/nodes/error-trigger.node.d.ts +15 -0
- package/dist/nodes/error-trigger.node.d.ts.map +1 -0
- package/dist/nodes/error-trigger.node.js +53 -0
- package/dist/nodes/error-trigger.node.js.map +1 -0
- package/dist/nodes/execute-command.node.d.ts +9 -0
- package/dist/nodes/execute-command.node.d.ts.map +1 -0
- package/dist/nodes/execute-command.node.js +81 -0
- package/dist/nodes/execute-command.node.js.map +1 -0
- package/dist/nodes/filter.node.d.ts +10 -0
- package/dist/nodes/filter.node.d.ts.map +1 -0
- package/dist/nodes/filter.node.js +95 -0
- package/dist/nodes/filter.node.js.map +1 -0
- package/dist/nodes/http-request.node.d.ts +11 -0
- package/dist/nodes/http-request.node.d.ts.map +1 -0
- package/dist/nodes/http-request.node.js +139 -0
- package/dist/nodes/http-request.node.js.map +1 -0
- package/dist/nodes/if.node.d.ts +13 -0
- package/dist/nodes/if.node.d.ts.map +1 -0
- package/dist/nodes/if.node.js +137 -0
- package/dist/nodes/if.node.js.map +1 -0
- package/dist/nodes/index.d.ts +12 -0
- package/dist/nodes/index.d.ts.map +1 -0
- package/dist/nodes/index.js +26 -0
- package/dist/nodes/index.js.map +1 -0
- package/dist/nodes/manual-trigger.node.d.ts +10 -0
- package/dist/nodes/manual-trigger.node.d.ts.map +1 -0
- package/dist/nodes/manual-trigger.node.js +36 -0
- package/dist/nodes/manual-trigger.node.js.map +1 -0
- package/dist/nodes/merge.node.d.ts +15 -0
- package/dist/nodes/merge.node.d.ts.map +1 -0
- package/dist/nodes/merge.node.js +99 -0
- package/dist/nodes/merge.node.js.map +1 -0
- package/dist/nodes/noop.node.d.ts +12 -0
- package/dist/nodes/noop.node.d.ts.map +1 -0
- package/dist/nodes/noop.node.js +32 -0
- package/dist/nodes/noop.node.js.map +1 -0
- package/dist/nodes/placeholder.node.d.ts +10 -0
- package/dist/nodes/placeholder.node.d.ts.map +1 -0
- package/dist/nodes/placeholder.node.js +50 -0
- package/dist/nodes/placeholder.node.js.map +1 -0
- package/dist/nodes/remove-duplicates.node.d.ts +9 -0
- package/dist/nodes/remove-duplicates.node.d.ts.map +1 -0
- package/dist/nodes/remove-duplicates.node.js +68 -0
- package/dist/nodes/remove-duplicates.node.js.map +1 -0
- package/dist/nodes/respond-to-webhook.node.d.ts +14 -0
- package/dist/nodes/respond-to-webhook.node.d.ts.map +1 -0
- package/dist/nodes/respond-to-webhook.node.js +116 -0
- package/dist/nodes/respond-to-webhook.node.js.map +1 -0
- package/dist/nodes/schedule-trigger.node.d.ts +9 -0
- package/dist/nodes/schedule-trigger.node.d.ts.map +1 -0
- package/dist/nodes/schedule-trigger.node.js +67 -0
- package/dist/nodes/schedule-trigger.node.js.map +1 -0
- package/dist/nodes/set.node.d.ts +12 -0
- package/dist/nodes/set.node.d.ts.map +1 -0
- package/dist/nodes/set.node.js +81 -0
- package/dist/nodes/set.node.js.map +1 -0
- package/dist/nodes/sort.node.d.ts +9 -0
- package/dist/nodes/sort.node.d.ts.map +1 -0
- package/dist/nodes/sort.node.js +61 -0
- package/dist/nodes/sort.node.js.map +1 -0
- package/dist/nodes/split-in-batches.node.d.ts +9 -0
- package/dist/nodes/split-in-batches.node.d.ts.map +1 -0
- package/dist/nodes/split-in-batches.node.js +53 -0
- package/dist/nodes/split-in-batches.node.js.map +1 -0
- package/dist/nodes/split-out.node.d.ts +9 -0
- package/dist/nodes/split-out.node.d.ts.map +1 -0
- package/dist/nodes/split-out.node.js +76 -0
- package/dist/nodes/split-out.node.js.map +1 -0
- package/dist/nodes/switch.node.d.ts +16 -0
- package/dist/nodes/switch.node.d.ts.map +1 -0
- package/dist/nodes/switch.node.js +156 -0
- package/dist/nodes/switch.node.js.map +1 -0
- package/dist/nodes/wait.node.d.ts +12 -0
- package/dist/nodes/wait.node.d.ts.map +1 -0
- package/dist/nodes/wait.node.js +81 -0
- package/dist/nodes/wait.node.js.map +1 -0
- package/dist/nodes/webhook.node.d.ts +9 -0
- package/dist/nodes/webhook.node.d.ts.map +1 -0
- package/dist/nodes/webhook.node.js +69 -0
- package/dist/nodes/webhook.node.js.map +1 -0
- package/dist/services/ai-workflow-session.service.d.ts +31 -0
- package/dist/services/ai-workflow-session.service.d.ts.map +1 -0
- package/dist/services/ai-workflow-session.service.js +118 -0
- package/dist/services/ai-workflow-session.service.js.map +1 -0
- package/dist/services/credential.service.d.ts +57 -0
- package/dist/services/credential.service.d.ts.map +1 -0
- package/dist/services/credential.service.js +155 -0
- package/dist/services/credential.service.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +14 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/push.service.d.ts +60 -0
- package/dist/services/push.service.d.ts.map +1 -0
- package/dist/services/push.service.js +121 -0
- package/dist/services/push.service.js.map +1 -0
- package/dist/services/workflow-ai.service.d.ts +61 -0
- package/dist/services/workflow-ai.service.d.ts.map +1 -0
- package/dist/services/workflow-ai.service.js +219 -0
- package/dist/services/workflow-ai.service.js.map +1 -0
- package/dist/services/workflow-context.service.d.ts +32 -0
- package/dist/services/workflow-context.service.d.ts.map +1 -0
- package/dist/services/workflow-context.service.js +155 -0
- package/dist/services/workflow-context.service.js.map +1 -0
- package/dist/services/workflow-engine.service.d.ts +90 -0
- package/dist/services/workflow-engine.service.d.ts.map +1 -0
- package/dist/services/workflow-engine.service.js +305 -0
- package/dist/services/workflow-engine.service.js.map +1 -0
- package/dist/services/workflow.service.d.ts +84 -0
- package/dist/services/workflow.service.d.ts.map +1 -0
- package/dist/services/workflow.service.js +241 -0
- package/dist/services/workflow.service.js.map +1 -0
- package/dist/triggers/cron-trigger.d.ts +39 -0
- package/dist/triggers/cron-trigger.d.ts.map +1 -0
- package/dist/triggers/cron-trigger.js +137 -0
- package/dist/triggers/cron-trigger.js.map +1 -0
- package/dist/triggers/index.d.ts +3 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +8 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/triggers/webhook-trigger.d.ts +51 -0
- package/dist/triggers/webhook-trigger.d.ts.map +1 -0
- package/dist/triggers/webhook-trigger.js +122 -0
- package/dist/triggers/webhook-trigger.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/node.types.d.ts +313 -0
- package/dist/types/node.types.d.ts.map +1 -0
- package/dist/types/node.types.js +23 -0
- package/dist/types/node.types.js.map +1 -0
- package/dist/types/workflow.types.d.ts +153 -0
- package/dist/types/workflow.types.d.ts.map +1 -0
- package/dist/types/workflow.types.js +44 -0
- package/dist/types/workflow.types.js.map +1 -0
- package/dist/utils/n8n-converter.d.ts +52 -0
- package/dist/utils/n8n-converter.d.ts.map +1 -0
- package/dist/utils/n8n-converter.js +107 -0
- package/dist/utils/n8n-converter.js.map +1 -0
- package/dist/utils/n8n-node-map.d.ts +6 -0
- package/dist/utils/n8n-node-map.d.ts.map +1 -0
- package/dist/utils/n8n-node-map.js +59 -0
- package/dist/utils/n8n-node-map.js.map +1 -0
- package/dist/workflow.module.d.ts +40 -0
- package/dist/workflow.module.d.ts.map +1 -0
- package/dist/workflow.module.js +240 -0
- package/dist/workflow.module.js.map +1 -0
- package/package.json +97 -0
- package/web/components/ChatPanel.tsx +344 -0
- package/web/components/N8nIframe.tsx +119 -0
- package/web/components/SessionPanel.tsx +301 -0
- package/web/components/ToolPanel.tsx +404 -0
- package/web/components/WorkflowDiff.tsx +161 -0
- package/web/components/WorkflowGraph.tsx +158 -0
- package/web/components/WorkflowPreviewPanel.tsx +186 -0
- package/web/hooks/use-n8n-session.ts +46 -0
- package/web/index.ts +29 -0
- package/web/manifest.ts +16 -0
- package/web/messages/en-US.json +94 -0
- package/web/messages/zh-CN.json +94 -0
- package/web/pages/AiDesignPage.tsx +215 -0
- package/web/pages/CredentialsPage.tsx +7 -0
- package/web/pages/ExecutionsPage.tsx +7 -0
- package/web/pages/WorkflowsPage.tsx +7 -0
- package/web/services/workflow-ai-service.ts +173 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.service.d.ts","sourceRoot":"","sources":["../../src/services/workflow.service.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAEnF,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EACV,mBAAmB,EAIpB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,mBAAmB,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,qBACa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAwC;IACpD,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,MAAM,CAAyD;IACvE,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,YAAY,CAA+B;IAEnD,sDAAsD;IACtD,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAgBvE;;OAEG;IACG,OAAO,CACX,IAAI,SAAI,EACR,QAAQ,SAAK,GACZ,OAAO,CAAC;QAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAShE;;OAEG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAQ7D;;OAEG;IACG,MAAM,CACV,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,wBAAwB,CAAC;IAiBpC;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC;;OAEG;IACG,OAAO,CACX,EAAE,EAAE,MAAM,EACV,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,OAAO,CAAC,uBAAuB,CAAC;IAsEnC;;OAEG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,IAAI,SAAI,EACR,QAAQ,SAAK,GACZ,OAAO,CAAC;QAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAU/D;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAQzE;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASzD;;OAEG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAoBlE;;OAEG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAkBtF;;OAEG;IACH,eAAe,IAAI,YAAY;CAGhC"}
|
|
@@ -0,0 +1,241 @@
|
|
|
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.WorkflowService = void 0;
|
|
10
|
+
const core_1 = require("@octo/core");
|
|
11
|
+
const workflow_definition_entity_js_1 = require("../entities/workflow-definition.entity.js");
|
|
12
|
+
const workflow_execution_entity_js_1 = require("../entities/workflow-execution.entity.js");
|
|
13
|
+
const workflow_executor_js_1 = require("../core/workflow-executor.js");
|
|
14
|
+
const node_registry_js_1 = require("../core/node-registry.js");
|
|
15
|
+
let WorkflowService = class WorkflowService {
|
|
16
|
+
repo;
|
|
17
|
+
executionRepo;
|
|
18
|
+
logger = core_1.Container.get(core_1.LoggerService).child('WorkflowService');
|
|
19
|
+
executor = new workflow_executor_js_1.WorkflowExecutor();
|
|
20
|
+
nodeRegistry = core_1.Container.get(node_registry_js_1.NodeRegistry);
|
|
21
|
+
/** Must be called after DataSource is initialized. */
|
|
22
|
+
initialize() {
|
|
23
|
+
const db = core_1.Container.get(core_1.DatabaseService);
|
|
24
|
+
this.repo = db.getRepository(workflow_definition_entity_js_1.WorkflowDefinitionEntity);
|
|
25
|
+
this.executionRepo = db.getRepository(workflow_execution_entity_js_1.WorkflowExecutionEntity);
|
|
26
|
+
this.logger.info('WorkflowService initialized');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a new workflow definition.
|
|
30
|
+
*/
|
|
31
|
+
async create(dto) {
|
|
32
|
+
const entity = this.repo.create({
|
|
33
|
+
name: dto.name,
|
|
34
|
+
description: dto.description ?? null,
|
|
35
|
+
definition: JSON.stringify(dto.definition),
|
|
36
|
+
status: 'inactive',
|
|
37
|
+
triggerType: dto.triggerType ?? 'manual',
|
|
38
|
+
triggerConfig: dto.triggerConfig ? JSON.stringify(dto.triggerConfig) : null,
|
|
39
|
+
createdBy: dto.createdBy ?? null,
|
|
40
|
+
});
|
|
41
|
+
const saved = await this.repo.save(entity);
|
|
42
|
+
this.logger.info(`Workflow created: ${saved.id} (${saved.name})`);
|
|
43
|
+
return saved;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* List all workflow definitions with pagination.
|
|
47
|
+
*/
|
|
48
|
+
async findAll(page = 1, pageSize = 20) {
|
|
49
|
+
const [items, total] = await this.repo.findAndCount({
|
|
50
|
+
order: { updatedAt: 'DESC' },
|
|
51
|
+
skip: (page - 1) * pageSize,
|
|
52
|
+
take: pageSize,
|
|
53
|
+
});
|
|
54
|
+
return { items, total };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Find a workflow by ID.
|
|
58
|
+
*/
|
|
59
|
+
async findById(id) {
|
|
60
|
+
const entity = await this.repo.findOneBy({ id });
|
|
61
|
+
if (!entity) {
|
|
62
|
+
throw core_1.AppError.notFound(`Workflow not found: ${id}`);
|
|
63
|
+
}
|
|
64
|
+
return entity;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Update a workflow definition.
|
|
68
|
+
*/
|
|
69
|
+
async update(id, dto) {
|
|
70
|
+
const entity = await this.findById(id);
|
|
71
|
+
if (dto.name !== undefined)
|
|
72
|
+
entity.name = dto.name;
|
|
73
|
+
if (dto.description !== undefined)
|
|
74
|
+
entity.description = dto.description ?? null;
|
|
75
|
+
if (dto.definition !== undefined)
|
|
76
|
+
entity.definition = JSON.stringify(dto.definition);
|
|
77
|
+
if (dto.status !== undefined)
|
|
78
|
+
entity.status = dto.status;
|
|
79
|
+
if (dto.triggerType !== undefined)
|
|
80
|
+
entity.triggerType = dto.triggerType;
|
|
81
|
+
if (dto.triggerConfig !== undefined) {
|
|
82
|
+
entity.triggerConfig = JSON.stringify(dto.triggerConfig);
|
|
83
|
+
}
|
|
84
|
+
const saved = await this.repo.save(entity);
|
|
85
|
+
this.logger.info(`Workflow updated: ${saved.id}`);
|
|
86
|
+
return saved;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Delete a workflow definition and its executions.
|
|
90
|
+
*/
|
|
91
|
+
async delete(id) {
|
|
92
|
+
const entity = await this.findById(id);
|
|
93
|
+
await this.executionRepo.delete({ workflowId: id });
|
|
94
|
+
await this.repo.remove(entity);
|
|
95
|
+
this.logger.info(`Workflow deleted: ${id}`);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Execute a workflow by ID.
|
|
99
|
+
*/
|
|
100
|
+
async execute(id, triggerData) {
|
|
101
|
+
const workflow = await this.findById(id);
|
|
102
|
+
// Parse the stored definition
|
|
103
|
+
let definition;
|
|
104
|
+
try {
|
|
105
|
+
definition = JSON.parse(workflow.definition);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
throw core_1.AppError.badRequest(`Invalid workflow definition JSON for workflow: ${id}`);
|
|
109
|
+
}
|
|
110
|
+
// Prepare trigger data as INodeExecutionData[]
|
|
111
|
+
const triggerItems = triggerData
|
|
112
|
+
? [{ json: triggerData }]
|
|
113
|
+
: undefined;
|
|
114
|
+
// Create execution record
|
|
115
|
+
const execution = this.executionRepo.create({
|
|
116
|
+
workflowId: id,
|
|
117
|
+
status: 'running',
|
|
118
|
+
triggerData: triggerData ? JSON.stringify(triggerData) : null,
|
|
119
|
+
startedAt: new Date(),
|
|
120
|
+
});
|
|
121
|
+
const savedExecution = await this.executionRepo.save(execution);
|
|
122
|
+
this.logger.info(`Executing workflow: ${id} (execution: ${savedExecution.id})`);
|
|
123
|
+
try {
|
|
124
|
+
// Run the executor
|
|
125
|
+
const result = await this.executor.execute(definition, triggerItems);
|
|
126
|
+
// Serialize the result — Map must be converted to a plain object
|
|
127
|
+
const serializedNodeResults = {};
|
|
128
|
+
for (const [key, value] of result.nodeResults) {
|
|
129
|
+
serializedNodeResults[key] = value;
|
|
130
|
+
}
|
|
131
|
+
const serializedResult = {
|
|
132
|
+
status: result.status,
|
|
133
|
+
startedAt: result.startedAt,
|
|
134
|
+
completedAt: result.completedAt,
|
|
135
|
+
nodeResults: serializedNodeResults,
|
|
136
|
+
runData: result.runData,
|
|
137
|
+
error: result.error,
|
|
138
|
+
};
|
|
139
|
+
savedExecution.status = result.status === 'completed' ? 'completed' : 'failed';
|
|
140
|
+
savedExecution.result = JSON.stringify(serializedResult);
|
|
141
|
+
savedExecution.error = result.error ?? null;
|
|
142
|
+
savedExecution.completedAt = new Date();
|
|
143
|
+
await this.executionRepo.save(savedExecution);
|
|
144
|
+
this.logger.info(`Workflow execution ${savedExecution.id} finished: ${savedExecution.status}`);
|
|
145
|
+
return savedExecution;
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
149
|
+
savedExecution.status = 'failed';
|
|
150
|
+
savedExecution.error = errorMsg;
|
|
151
|
+
savedExecution.completedAt = new Date();
|
|
152
|
+
await this.executionRepo.save(savedExecution);
|
|
153
|
+
this.logger.error(`Workflow execution ${savedExecution.id} failed: ${errorMsg}`);
|
|
154
|
+
return savedExecution;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get execution history for a workflow.
|
|
159
|
+
*/
|
|
160
|
+
async getExecutions(workflowId, page = 1, pageSize = 20) {
|
|
161
|
+
const [items, total] = await this.executionRepo.findAndCount({
|
|
162
|
+
where: { workflowId },
|
|
163
|
+
order: { startedAt: 'DESC' },
|
|
164
|
+
skip: (page - 1) * pageSize,
|
|
165
|
+
take: pageSize,
|
|
166
|
+
});
|
|
167
|
+
return { items, total };
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get a single execution by ID.
|
|
171
|
+
*/
|
|
172
|
+
async getExecution(executionId) {
|
|
173
|
+
const execution = await this.executionRepo.findOneBy({ id: executionId });
|
|
174
|
+
if (!execution) {
|
|
175
|
+
throw core_1.AppError.notFound(`Execution not found: ${executionId}`);
|
|
176
|
+
}
|
|
177
|
+
return execution;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Delete a single execution record.
|
|
181
|
+
*/
|
|
182
|
+
async deleteExecution(executionId) {
|
|
183
|
+
const execution = await this.executionRepo.findOneBy({ id: executionId });
|
|
184
|
+
if (!execution) {
|
|
185
|
+
throw core_1.AppError.notFound(`Execution not found: ${executionId}`);
|
|
186
|
+
}
|
|
187
|
+
await this.executionRepo.remove(execution);
|
|
188
|
+
this.logger.info(`Execution deleted: ${executionId}`);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Export a workflow definition as a portable JSON object.
|
|
192
|
+
*/
|
|
193
|
+
async exportWorkflow(id) {
|
|
194
|
+
const entity = await this.findById(id);
|
|
195
|
+
let definition;
|
|
196
|
+
try {
|
|
197
|
+
definition = JSON.parse(entity.definition);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
throw core_1.AppError.badRequest(`Invalid workflow definition JSON for workflow: ${id}`);
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
name: entity.name,
|
|
204
|
+
description: entity.description,
|
|
205
|
+
definition,
|
|
206
|
+
triggerType: entity.triggerType,
|
|
207
|
+
triggerConfig: entity.triggerConfig ? JSON.parse(entity.triggerConfig) : null,
|
|
208
|
+
exportedAt: new Date().toISOString(),
|
|
209
|
+
version: '1.0',
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Import a workflow from a portable JSON object.
|
|
214
|
+
*/
|
|
215
|
+
async importWorkflow(data) {
|
|
216
|
+
const name = data.name;
|
|
217
|
+
const description = data.description;
|
|
218
|
+
const definition = data.definition;
|
|
219
|
+
if (!name || !definition) {
|
|
220
|
+
throw core_1.AppError.badRequest('Import data must contain "name" and "definition"');
|
|
221
|
+
}
|
|
222
|
+
return this.create({
|
|
223
|
+
name,
|
|
224
|
+
description,
|
|
225
|
+
definition,
|
|
226
|
+
triggerType: data.triggerType,
|
|
227
|
+
triggerConfig: data.triggerConfig,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get the node registry for external access (e.g., editor node panel).
|
|
232
|
+
*/
|
|
233
|
+
getNodeRegistry() {
|
|
234
|
+
return this.nodeRegistry;
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
exports.WorkflowService = WorkflowService;
|
|
238
|
+
exports.WorkflowService = WorkflowService = __decorate([
|
|
239
|
+
(0, core_1.Service)()
|
|
240
|
+
], WorkflowService);
|
|
241
|
+
//# sourceMappingURL=workflow.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.service.js","sourceRoot":"","sources":["../../src/services/workflow.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cron Trigger Service — manages scheduled workflow executions.
|
|
3
|
+
*
|
|
4
|
+
* Each active workflow with triggerType='cron' gets a CronJob that
|
|
5
|
+
* fires the workflow on schedule.
|
|
6
|
+
*/
|
|
7
|
+
export declare class CronTriggerService {
|
|
8
|
+
private logger;
|
|
9
|
+
private jobs;
|
|
10
|
+
private repo;
|
|
11
|
+
/** Must be called after DataSource is initialized. */
|
|
12
|
+
initialize(): void;
|
|
13
|
+
/**
|
|
14
|
+
* Start a cron trigger for a specific workflow.
|
|
15
|
+
*/
|
|
16
|
+
start(workflowId: string, cronExpression: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Stop a cron trigger for a specific workflow.
|
|
19
|
+
*/
|
|
20
|
+
stop(workflowId: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Load and start all active cron workflows from the database.
|
|
23
|
+
* Called during module initialization.
|
|
24
|
+
*/
|
|
25
|
+
startAll(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Stop all active cron jobs. Called during module shutdown.
|
|
28
|
+
*/
|
|
29
|
+
stopAll(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Check if a workflow has an active cron trigger.
|
|
32
|
+
*/
|
|
33
|
+
isRunning(workflowId: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get count of active cron jobs.
|
|
36
|
+
*/
|
|
37
|
+
get activeCount(): number;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=cron-trigger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-trigger.d.ts","sourceRoot":"","sources":["../../src/triggers/cron-trigger.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,qBACa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAA4D;IAC1E,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,IAAI,CAAwC;IAEpD,sDAAsD;IACtD,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI;IAsCvD;;OAEG;IACH,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAS9B;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC/B;;OAEG;IACH,OAAO,IAAI,IAAI;IAUf;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}
|
|
@@ -0,0 +1,137 @@
|
|
|
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.CronTriggerService = void 0;
|
|
10
|
+
const core_1 = require("@octo/core");
|
|
11
|
+
const cron_1 = require("cron");
|
|
12
|
+
const workflow_definition_entity_js_1 = require("../entities/workflow-definition.entity.js");
|
|
13
|
+
const workflow_service_js_1 = require("../services/workflow.service.js");
|
|
14
|
+
/**
|
|
15
|
+
* Cron Trigger Service — manages scheduled workflow executions.
|
|
16
|
+
*
|
|
17
|
+
* Each active workflow with triggerType='cron' gets a CronJob that
|
|
18
|
+
* fires the workflow on schedule.
|
|
19
|
+
*/
|
|
20
|
+
let CronTriggerService = class CronTriggerService {
|
|
21
|
+
logger = core_1.Container.get(core_1.LoggerService).child('CronTriggerService');
|
|
22
|
+
jobs = new Map();
|
|
23
|
+
repo;
|
|
24
|
+
/** Must be called after DataSource is initialized. */
|
|
25
|
+
initialize() {
|
|
26
|
+
const db = core_1.Container.get(core_1.DatabaseService);
|
|
27
|
+
this.repo = db.getRepository(workflow_definition_entity_js_1.WorkflowDefinitionEntity);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Start a cron trigger for a specific workflow.
|
|
31
|
+
*/
|
|
32
|
+
start(workflowId, cronExpression) {
|
|
33
|
+
// Stop existing job if any
|
|
34
|
+
this.stop(workflowId);
|
|
35
|
+
try {
|
|
36
|
+
const job = cron_1.CronJob.from({
|
|
37
|
+
cronTime: cronExpression,
|
|
38
|
+
onTick: async () => {
|
|
39
|
+
this.logger.info(`Cron triggered for workflow: ${workflowId}`);
|
|
40
|
+
try {
|
|
41
|
+
const workflowService = core_1.Container.get(workflow_service_js_1.WorkflowService);
|
|
42
|
+
await workflowService.execute(workflowId, {
|
|
43
|
+
_trigger: 'cron',
|
|
44
|
+
_cronExpression: cronExpression,
|
|
45
|
+
_triggeredAt: new Date().toISOString(),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
50
|
+
this.logger.error(`Cron execution failed for workflow ${workflowId}: ${msg}`);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
start: true,
|
|
54
|
+
});
|
|
55
|
+
this.jobs.set(workflowId, job);
|
|
56
|
+
this.logger.info(`Cron trigger started for workflow ${workflowId}: ${cronExpression}`);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
60
|
+
this.logger.error(`Failed to start cron trigger for workflow ${workflowId}: ${msg}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Stop a cron trigger for a specific workflow.
|
|
65
|
+
*/
|
|
66
|
+
stop(workflowId) {
|
|
67
|
+
const existingJob = this.jobs.get(workflowId);
|
|
68
|
+
if (existingJob) {
|
|
69
|
+
existingJob.stop();
|
|
70
|
+
this.jobs.delete(workflowId);
|
|
71
|
+
this.logger.info(`Cron trigger stopped for workflow: ${workflowId}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Load and start all active cron workflows from the database.
|
|
76
|
+
* Called during module initialization.
|
|
77
|
+
*/
|
|
78
|
+
async startAll() {
|
|
79
|
+
try {
|
|
80
|
+
const workflows = await this.repo.find({
|
|
81
|
+
where: {
|
|
82
|
+
status: 'active',
|
|
83
|
+
triggerType: 'cron',
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
let started = 0;
|
|
87
|
+
for (const workflow of workflows) {
|
|
88
|
+
if (!workflow.triggerConfig)
|
|
89
|
+
continue;
|
|
90
|
+
try {
|
|
91
|
+
const config = JSON.parse(workflow.triggerConfig);
|
|
92
|
+
if (config.cronExpression) {
|
|
93
|
+
this.start(workflow.id, config.cronExpression);
|
|
94
|
+
started++;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
this.logger.warn(`Invalid trigger config for workflow ${workflow.id}, skipping`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
this.logger.info(`Started ${started} cron triggers from ${workflows.length} active cron workflows`);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
105
|
+
this.logger.error(`Failed to load cron workflows: ${msg}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Stop all active cron jobs. Called during module shutdown.
|
|
110
|
+
*/
|
|
111
|
+
stopAll() {
|
|
112
|
+
for (const [workflowId, job] of this.jobs) {
|
|
113
|
+
job.stop();
|
|
114
|
+
this.logger.debug(`Cron trigger stopped: ${workflowId}`);
|
|
115
|
+
}
|
|
116
|
+
const count = this.jobs.size;
|
|
117
|
+
this.jobs.clear();
|
|
118
|
+
this.logger.info(`Stopped ${count} cron triggers`);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if a workflow has an active cron trigger.
|
|
122
|
+
*/
|
|
123
|
+
isRunning(workflowId) {
|
|
124
|
+
return this.jobs.has(workflowId);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get count of active cron jobs.
|
|
128
|
+
*/
|
|
129
|
+
get activeCount() {
|
|
130
|
+
return this.jobs.size;
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
exports.CronTriggerService = CronTriggerService;
|
|
134
|
+
exports.CronTriggerService = CronTriggerService = __decorate([
|
|
135
|
+
(0, core_1.Service)()
|
|
136
|
+
], CronTriggerService);
|
|
137
|
+
//# sourceMappingURL=cron-trigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-trigger.js","sourceRoot":"","sources":["../../src/triggers/cron-trigger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/triggers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebhookTriggerService = exports.CronTriggerService = void 0;
|
|
4
|
+
var cron_trigger_js_1 = require("./cron-trigger.js");
|
|
5
|
+
Object.defineProperty(exports, "CronTriggerService", { enumerable: true, get: function () { return cron_trigger_js_1.CronTriggerService; } });
|
|
6
|
+
var webhook_trigger_js_1 = require("./webhook-trigger.js");
|
|
7
|
+
Object.defineProperty(exports, "WebhookTriggerService", { enumerable: true, get: function () { return webhook_trigger_js_1.WebhookTriggerService; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/triggers/index.ts"],"names":[],"mappings":";;;AAAA,qDAAuD;AAA9C,qHAAA,kBAAkB,OAAA;AAC3B,2DAA6D;AAApD,2HAAA,qBAAqB,OAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
interface WebhookRegistration {
|
|
2
|
+
workflowId: string;
|
|
3
|
+
path: string;
|
|
4
|
+
method: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Webhook Trigger Service — manages webhook-based workflow triggers.
|
|
8
|
+
*
|
|
9
|
+
* Registers unique URL paths that, when called, trigger the associated workflow.
|
|
10
|
+
* The webhook path format is: /api/webhooks/{path}
|
|
11
|
+
*/
|
|
12
|
+
export declare class WebhookTriggerService {
|
|
13
|
+
private logger;
|
|
14
|
+
/** Maps path to registration info. Key format: "METHOD:path" */
|
|
15
|
+
private registrations;
|
|
16
|
+
/** Maps workflowId to registration key for reverse lookup. */
|
|
17
|
+
private workflowToKey;
|
|
18
|
+
/**
|
|
19
|
+
* Register a webhook path for a workflow.
|
|
20
|
+
*/
|
|
21
|
+
register(workflowId: string, path: string, method?: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Unregister a webhook for a workflow.
|
|
24
|
+
*/
|
|
25
|
+
unregister(workflowId: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Handle an incoming webhook request.
|
|
28
|
+
* Finds the matching registration and triggers the workflow.
|
|
29
|
+
*
|
|
30
|
+
* @returns The workflow execution entity, or null if no registration matched.
|
|
31
|
+
*/
|
|
32
|
+
handleWebhook(path: string, method: string, body: Record<string, unknown>, headers: Record<string, string>, query?: Record<string, string>): Promise<{
|
|
33
|
+
executed: boolean;
|
|
34
|
+
workflowId?: string;
|
|
35
|
+
executionId?: string;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a path/method combination is registered.
|
|
39
|
+
*/
|
|
40
|
+
isRegistered(path: string, method?: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Get all registered webhooks.
|
|
43
|
+
*/
|
|
44
|
+
getAllRegistrations(): WebhookRegistration[];
|
|
45
|
+
/**
|
|
46
|
+
* Get the count of active webhook registrations.
|
|
47
|
+
*/
|
|
48
|
+
get activeCount(): number;
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=webhook-trigger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-trigger.d.ts","sourceRoot":"","sources":["../../src/triggers/webhook-trigger.ts"],"names":[],"mappings":"AAGA,UAAU,mBAAmB;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,qBACa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAA+D;IAE7E,gEAAgE;IAChE,OAAO,CAAC,aAAa,CAA0C;IAE/D,8DAA8D;IAC9D,OAAO,CAAC,aAAa,CAA6B;IAElD;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,IAAI;IA+BjE;;OAEG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IASpC;;;;;OAKG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA6C5E;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,OAAO;IAMpD;;OAEG;IACH,mBAAmB,IAAI,mBAAmB,EAAE;IAI5C;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}
|
|
@@ -0,0 +1,122 @@
|
|
|
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.WebhookTriggerService = void 0;
|
|
10
|
+
const core_1 = require("@octo/core");
|
|
11
|
+
const workflow_service_js_1 = require("../services/workflow.service.js");
|
|
12
|
+
/**
|
|
13
|
+
* Webhook Trigger Service — manages webhook-based workflow triggers.
|
|
14
|
+
*
|
|
15
|
+
* Registers unique URL paths that, when called, trigger the associated workflow.
|
|
16
|
+
* The webhook path format is: /api/webhooks/{path}
|
|
17
|
+
*/
|
|
18
|
+
let WebhookTriggerService = class WebhookTriggerService {
|
|
19
|
+
logger = core_1.Container.get(core_1.LoggerService).child('WebhookTriggerService');
|
|
20
|
+
/** Maps path to registration info. Key format: "METHOD:path" */
|
|
21
|
+
registrations = new Map();
|
|
22
|
+
/** Maps workflowId to registration key for reverse lookup. */
|
|
23
|
+
workflowToKey = new Map();
|
|
24
|
+
/**
|
|
25
|
+
* Register a webhook path for a workflow.
|
|
26
|
+
*/
|
|
27
|
+
register(workflowId, path, method = 'POST') {
|
|
28
|
+
// Normalize
|
|
29
|
+
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
|
30
|
+
const normalizedMethod = method.toUpperCase();
|
|
31
|
+
const key = `${normalizedMethod}:${normalizedPath}`;
|
|
32
|
+
// Check for conflicts
|
|
33
|
+
const existing = this.registrations.get(key);
|
|
34
|
+
if (existing && existing.workflowId !== workflowId) {
|
|
35
|
+
throw new Error(`Webhook path ${normalizedMethod} ${normalizedPath} is already registered for workflow ${existing.workflowId}`);
|
|
36
|
+
}
|
|
37
|
+
// Unregister any previous webhook for this workflow
|
|
38
|
+
this.unregister(workflowId);
|
|
39
|
+
const registration = {
|
|
40
|
+
workflowId,
|
|
41
|
+
path: normalizedPath,
|
|
42
|
+
method: normalizedMethod,
|
|
43
|
+
};
|
|
44
|
+
this.registrations.set(key, registration);
|
|
45
|
+
this.workflowToKey.set(workflowId, key);
|
|
46
|
+
this.logger.info(`Webhook registered: ${normalizedMethod} ${normalizedPath} -> workflow ${workflowId}`);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Unregister a webhook for a workflow.
|
|
50
|
+
*/
|
|
51
|
+
unregister(workflowId) {
|
|
52
|
+
const key = this.workflowToKey.get(workflowId);
|
|
53
|
+
if (key) {
|
|
54
|
+
this.registrations.delete(key);
|
|
55
|
+
this.workflowToKey.delete(workflowId);
|
|
56
|
+
this.logger.info(`Webhook unregistered for workflow: ${workflowId}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Handle an incoming webhook request.
|
|
61
|
+
* Finds the matching registration and triggers the workflow.
|
|
62
|
+
*
|
|
63
|
+
* @returns The workflow execution entity, or null if no registration matched.
|
|
64
|
+
*/
|
|
65
|
+
async handleWebhook(path, method, body, headers, query) {
|
|
66
|
+
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
|
67
|
+
const normalizedMethod = method.toUpperCase();
|
|
68
|
+
const key = `${normalizedMethod}:${normalizedPath}`;
|
|
69
|
+
const registration = this.registrations.get(key);
|
|
70
|
+
if (!registration) {
|
|
71
|
+
this.logger.debug(`No webhook registration found for ${normalizedMethod} ${normalizedPath}`);
|
|
72
|
+
return { executed: false };
|
|
73
|
+
}
|
|
74
|
+
this.logger.info(`Webhook triggered: ${normalizedMethod} ${normalizedPath} -> workflow ${registration.workflowId}`);
|
|
75
|
+
try {
|
|
76
|
+
const workflowService = core_1.Container.get(workflow_service_js_1.WorkflowService);
|
|
77
|
+
const execution = await workflowService.execute(registration.workflowId, {
|
|
78
|
+
_trigger: 'webhook',
|
|
79
|
+
_webhookPath: normalizedPath,
|
|
80
|
+
_webhookMethod: normalizedMethod,
|
|
81
|
+
body,
|
|
82
|
+
headers,
|
|
83
|
+
query: query ?? {},
|
|
84
|
+
});
|
|
85
|
+
return {
|
|
86
|
+
executed: true,
|
|
87
|
+
workflowId: registration.workflowId,
|
|
88
|
+
executionId: execution.id,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
93
|
+
this.logger.error(`Webhook execution failed for workflow ${registration.workflowId}: ${msg}`);
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check if a path/method combination is registered.
|
|
99
|
+
*/
|
|
100
|
+
isRegistered(path, method = 'POST') {
|
|
101
|
+
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
|
102
|
+
const key = `${method.toUpperCase()}:${normalizedPath}`;
|
|
103
|
+
return this.registrations.has(key);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get all registered webhooks.
|
|
107
|
+
*/
|
|
108
|
+
getAllRegistrations() {
|
|
109
|
+
return Array.from(this.registrations.values());
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get the count of active webhook registrations.
|
|
113
|
+
*/
|
|
114
|
+
get activeCount() {
|
|
115
|
+
return this.registrations.size;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
exports.WebhookTriggerService = WebhookTriggerService;
|
|
119
|
+
exports.WebhookTriggerService = WebhookTriggerService = __decorate([
|
|
120
|
+
(0, core_1.Service)()
|
|
121
|
+
], WebhookTriggerService);
|
|
122
|
+
//# sourceMappingURL=webhook-trigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-trigger.js","sourceRoot":"","sources":["../../src/triggers/webhook-trigger.ts"],"names":[],"mappings":"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"}
|