n8n-workflow-builder-mcp 0.1.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/.cursor/rules/cursor_rules.mdc +53 -0
- package/.cursor/rules/dev_workflow.mdc +219 -0
- package/.cursor/rules/mcp.mdc +430 -0
- package/.cursor/rules/self_improve.mdc +72 -0
- package/.cursor/rules/taskmaster.mdc +382 -0
- package/.cursorignore +1 -0
- package/.cursorrules +4 -0
- package/.env.example +23 -0
- package/.eslintrc.json +38 -0
- package/.github/workflows/npm-publish-github-packages.yml +55 -0
- package/.prettierrc +9 -0
- package/.roo/rules/dev_workflow.md +219 -0
- package/.roo/rules/mcp.md +430 -0
- package/.roo/rules/roo_rules.md +53 -0
- package/.roo/rules/self_improve.md +72 -0
- package/.roo/rules/taskmaster.md +382 -0
- package/.roo/rules-architect/architect-rules +93 -0
- package/.roo/rules-ask/ask-rules +89 -0
- package/.roo/rules-boomerang/boomerang-rules +181 -0
- package/.roo/rules-code/code-rules +61 -0
- package/.roo/rules-debug/debug-rules +68 -0
- package/.roo/rules-test/test-rules +61 -0
- package/.roomodes +63 -0
- package/.taskmasterconfig +31 -0
- package/.windsurfrules +2382 -0
- package/LICENSE +21 -0
- package/README.md +210 -0
- package/config/credentials/credentials.json +1 -0
- package/config/default.js +41 -0
- package/package.json +56 -0
- package/scripts/demo-n8n-integration.js +161 -0
- package/scripts/demo-workflow-generator.js +102 -0
- package/scripts/init.sh +36 -0
- package/scripts/prd.txt +197 -0
- package/src/index.ts +1440 -0
- package/src/middleware/auth.js +273 -0
- package/src/middleware/authorize.js +183 -0
- package/src/middleware/logging.js +64 -0
- package/src/middleware/mcp.js +187 -0
- package/src/middleware/rateLimiter.js +82 -0
- package/src/middleware/validation.js +241 -0
- package/src/models/credential.js +359 -0
- package/src/models/llmService.js +236 -0
- package/src/models/n8nIntegration.js +542 -0
- package/src/models/storage.js +196 -0
- package/src/models/tool.js +148 -0
- package/src/models/user.js +164 -0
- package/src/models/workflow.js +229 -0
- package/src/routes/toolDefinitions.js +62 -0
- package/src/routes/toolExecution.js +79 -0
- package/src/tools/__index.js +242 -0
- package/src/tools/connectionManagement.js +500 -0
- package/src/tools/n8nIntegration.js +370 -0
- package/src/tools/nodeDiscovery.js +488 -0
- package/src/tools/nodeManagement.js +674 -0
- package/src/tools/toolDefinitions.js +660 -0
- package/src/tools/workflowCreation.js +100 -0
- package/src/tools/workflowGenerator.js +152 -0
- package/src/tools/workflowStorage.js +113 -0
- package/src/tools/workflowTesting.js +285 -0
- package/src/utils/encryption.js +164 -0
- package/src/utils/logger.js +84 -0
- package/src/utils/mcp.js +85 -0
- package/src/utils/securityLogger.js +109 -0
- package/tests/auth.test.js +402 -0
- package/tests/authorize.test.js +208 -0
- package/tests/run-memory-tests.js +55 -0
- package/tests/run-tests.js +55 -0
- package/tests/server.test.js +203 -0
- package/tests/unit/add-ai-connections.test.js +385 -0
- package/tests/unit/connectionManagement.test.js +309 -0
- package/tests/unit/langchain-llm-format.test.js +259 -0
- package/tests/unit/memory-connection.test.js +140 -0
- package/tests/unit/memory-integration.test.js +253 -0
- package/tests/unit/n8nIntegration.test.js +291 -0
- package/tests/unit/nodeDiscovery.test.js +270 -0
- package/tests/unit/nodeManagement.test.js +522 -0
- package/tests/unit/utils/mcp-test-utils.js +94 -0
- package/tests/unit/workflowCreation.test.js +110 -0
- package/tests/unit/workflowTesting.test.js +269 -0
- package/tests/user.test.js +181 -0
- package/tsconfig.json +20 -0
- package/workflow_nodes/Brandfetch.json +85 -0
- package/workflow_nodes/WorkflowTrigger.json +28 -0
- package/workflow_nodes/actionNetwork.json +218 -0
- package/workflow_nodes/activeCampaign.json +722 -0
- package/workflow_nodes/activeCampaignTrigger.json +52 -0
- package/workflow_nodes/acuitySchedulingTrigger.json +8 -0
- package/workflow_nodes/adalo.json +123 -0
- package/workflow_nodes/affinity.json +203 -0
- package/workflow_nodes/affinityTrigger.json +124 -0
- package/workflow_nodes/aggregate.json +119 -0
- package/workflow_nodes/agileCrm.json +503 -0
- package/workflow_nodes/aiTransform.json +17 -0
- package/workflow_nodes/airtable.json +226 -0
- package/workflow_nodes/airtableTrigger.json +120 -0
- package/workflow_nodes/airtop.json +10 -0
- package/workflow_nodes/amqp.json +62 -0
- package/workflow_nodes/amqpTrigger.json +8 -0
- package/workflow_nodes/apiTemplateIo.json +147 -0
- package/workflow_nodes/asana.json +446 -0
- package/workflow_nodes/asanaTrigger.json +52 -0
- package/workflow_nodes/automizy.json +195 -0
- package/workflow_nodes/autopilot.json +287 -0
- package/workflow_nodes/autopilotTrigger.json +8 -0
- package/workflow_nodes/awsCertificateManager.json +223 -0
- package/workflow_nodes/awsComprehend.json +125 -0
- package/workflow_nodes/awsDynamoDb.json +251 -0
- package/workflow_nodes/awsElb.json +174 -0
- package/workflow_nodes/awsLambda.json +69 -0
- package/workflow_nodes/awsRekognition.json +191 -0
- package/workflow_nodes/awsS3.json +32 -0
- package/workflow_nodes/awsSes.json +302 -0
- package/workflow_nodes/awsSns.json +110 -0
- package/workflow_nodes/awsSnsTrigger.json +47 -0
- package/workflow_nodes/awsSqs.json +140 -0
- package/workflow_nodes/awsTextract.json +43 -0
- package/workflow_nodes/awsTranscribe.json +217 -0
- package/workflow_nodes/azureCosmosDb.json +8 -0
- package/workflow_nodes/azureStorage.json +17 -0
- package/workflow_nodes/bambooHr.json +8 -0
- package/workflow_nodes/bannerbear.json +126 -0
- package/workflow_nodes/baserow.json +277 -0
- package/workflow_nodes/beeminder.json +146 -0
- package/workflow_nodes/bitbucketTrigger.json +62 -0
- package/workflow_nodes/bitly.json +130 -0
- package/workflow_nodes/bitwarden.json +224 -0
- package/workflow_nodes/box.json +457 -0
- package/workflow_nodes/boxTrigger.json +8 -0
- package/workflow_nodes/brevo.json +41 -0
- package/workflow_nodes/brevoTrigger.json +145 -0
- package/workflow_nodes/bubble.json +212 -0
- package/workflow_nodes/calTrigger.json +91 -0
- package/workflow_nodes/calendlyTrigger.json +71 -0
- package/workflow_nodes/chargebee.json +217 -0
- package/workflow_nodes/chargebeeTrigger.json +187 -0
- package/workflow_nodes/circleCi.json +89 -0
- package/workflow_nodes/ciscoWebex.json +593 -0
- package/workflow_nodes/ciscoWebexTrigger.json +159 -0
- package/workflow_nodes/clearbit.json +138 -0
- package/workflow_nodes/clickUp.json +793 -0
- package/workflow_nodes/clickUpTrigger.json +188 -0
- package/workflow_nodes/clockify.json +372 -0
- package/workflow_nodes/clockifyTrigger.json +26 -0
- package/workflow_nodes/cloudflare.json +103 -0
- package/workflow_nodes/cockpit.json +161 -0
- package/workflow_nodes/coda.json +242 -0
- package/workflow_nodes/code.json +40 -0
- package/workflow_nodes/coinGecko.json +363 -0
- package/workflow_nodes/compareDatasets.json +14 -0
- package/workflow_nodes/compression.json +66 -0
- package/workflow_nodes/contentful.json +29 -0
- package/workflow_nodes/convertKit.json +159 -0
- package/workflow_nodes/convertKitTrigger.json +109 -0
- package/workflow_nodes/convertToFile.json +64 -0
- package/workflow_nodes/copper.json +239 -0
- package/workflow_nodes/copperTrigger.json +8 -0
- package/workflow_nodes/cortex.json +348 -0
- package/workflow_nodes/crateDb.json +90 -0
- package/workflow_nodes/cron.json +23 -0
- package/workflow_nodes/crowdDev.json +8 -0
- package/workflow_nodes/crowdDevTrigger.json +8 -0
- package/workflow_nodes/crypto.json +147 -0
- package/workflow_nodes/customerIo.json +206 -0
- package/workflow_nodes/customerIoTrigger.json +185 -0
- package/workflow_nodes/dateTime.json +39 -0
- package/workflow_nodes/debughelper.json +162 -0
- package/workflow_nodes/deepL.json +103 -0
- package/workflow_nodes/demio.json +187 -0
- package/workflow_nodes/dhl.json +53 -0
- package/workflow_nodes/discord.json +81 -0
- package/workflow_nodes/discourse.json +319 -0
- package/workflow_nodes/disqus.json +254 -0
- package/workflow_nodes/drift.json +112 -0
- package/workflow_nodes/dropbox.json +258 -0
- package/workflow_nodes/dropcontact.json +154 -0
- package/workflow_nodes/e2eTest.json +70 -0
- package/workflow_nodes/editImage.json +132 -0
- package/workflow_nodes/egoi.json +220 -0
- package/workflow_nodes/elasticSecurity.json +401 -0
- package/workflow_nodes/elasticsearch.json +422 -0
- package/workflow_nodes/emailReadImap.json +88 -0
- package/workflow_nodes/emailSend.json +38 -0
- package/workflow_nodes/emelia.json +201 -0
- package/workflow_nodes/emeliaTrigger.json +57 -0
- package/workflow_nodes/erpNext.json +139 -0
- package/workflow_nodes/errorTrigger.json +15 -0
- package/workflow_nodes/evaluationMetrics.json +21 -0
- package/workflow_nodes/eventbriteTrigger.json +125 -0
- package/workflow_nodes/executeCommand.json +25 -0
- package/workflow_nodes/executeWorkflow.json +102 -0
- package/workflow_nodes/executeWorkflowTrigger.json +65 -0
- package/workflow_nodes/executionData.json +35 -0
- package/workflow_nodes/extractFromFile.json +71 -0
- package/workflow_nodes/facebookGraphApi.json +234 -0
- package/workflow_nodes/facebookLeadAdsTrigger.json +8 -0
- package/workflow_nodes/facebookTrigger.json +112 -0
- package/workflow_nodes/figmaTrigger.json +8 -0
- package/workflow_nodes/filemaker.json +268 -0
- package/workflow_nodes/filter.json +24 -0
- package/workflow_nodes/flow.json +323 -0
- package/workflow_nodes/flowTrigger.json +52 -0
- package/workflow_nodes/form.json +25 -0
- package/workflow_nodes/formIoTrigger.json +59 -0
- package/workflow_nodes/formTrigger.json +8 -0
- package/workflow_nodes/formstackTrigger.json +8 -0
- package/workflow_nodes/freshdesk.json +584 -0
- package/workflow_nodes/freshservice.json +899 -0
- package/workflow_nodes/freshworksCrm.json +772 -0
- package/workflow_nodes/ftp.json +127 -0
- package/workflow_nodes/function.json +22 -0
- package/workflow_nodes/functionItem.json +22 -0
- package/workflow_nodes/gSuiteAdmin.json +562 -0
- package/workflow_nodes/getResponse.json +310 -0
- package/workflow_nodes/getResponseTrigger.json +82 -0
- package/workflow_nodes/ghost.json +290 -0
- package/workflow_nodes/git.json +184 -0
- package/workflow_nodes/github.json +732 -0
- package/workflow_nodes/githubTrigger.json +317 -0
- package/workflow_nodes/gitlab.json +544 -0
- package/workflow_nodes/gitlabTrigger.json +61 -0
- package/workflow_nodes/gmail.json +62 -0
- package/workflow_nodes/gmailTrigger.json +127 -0
- package/workflow_nodes/goToWebinar.json +430 -0
- package/workflow_nodes/gong.json +22 -0
- package/workflow_nodes/googleAds.json +116 -0
- package/workflow_nodes/googleAnalytics.json +28 -0
- package/workflow_nodes/googleBigQuery.json +38 -0
- package/workflow_nodes/googleBooks.json +154 -0
- package/workflow_nodes/googleBusinessProfile.json +277 -0
- package/workflow_nodes/googleBusinessProfileTrigger.json +55 -0
- package/workflow_nodes/googleCalendar.json +474 -0
- package/workflow_nodes/googleCalendarTrigger.json +72 -0
- package/workflow_nodes/googleChat.json +187 -0
- package/workflow_nodes/googleCloudNaturalLanguage.json +171 -0
- package/workflow_nodes/googleCloudStorage.json +466 -0
- package/workflow_nodes/googleContacts.json +481 -0
- package/workflow_nodes/googleDocs.json +312 -0
- package/workflow_nodes/googleDrive.json +920 -0
- package/workflow_nodes/googleDriveTrigger.json +181 -0
- package/workflow_nodes/googleFirebaseCloudFirestore.json +156 -0
- package/workflow_nodes/googleFirebaseRealtimeDatabase.json +75 -0
- package/workflow_nodes/googlePerspective.json +94 -0
- package/workflow_nodes/googleSheets.json +98 -0
- package/workflow_nodes/googleSheetsTrigger.json +192 -0
- package/workflow_nodes/googleSlides.json +186 -0
- package/workflow_nodes/googleTasks.json +198 -0
- package/workflow_nodes/googleTranslate.json +80 -0
- package/workflow_nodes/gotify.json +110 -0
- package/workflow_nodes/grafana.json +155 -0
- package/workflow_nodes/graphql.json +165 -0
- package/workflow_nodes/grist.json +13 -0
- package/workflow_nodes/gumroadTrigger.json +8 -0
- package/workflow_nodes/hackerNews.json +100 -0
- package/workflow_nodes/haloPSA.json +286 -0
- package/workflow_nodes/harvest.json +699 -0
- package/workflow_nodes/helpScout.json +629 -0
- package/workflow_nodes/helpScoutTrigger.json +8 -0
- package/workflow_nodes/highLevel.json +8 -0
- package/workflow_nodes/homeAssistant.json +201 -0
- package/workflow_nodes/html.json +118 -0
- package/workflow_nodes/htmlExtract.json +87 -0
- package/workflow_nodes/httpRequest.json +472 -0
- package/workflow_nodes/hubspot.json +62 -0
- package/workflow_nodes/hubspotTrigger.json +138 -0
- package/workflow_nodes/humanticAi.json +82 -0
- package/workflow_nodes/hunter.json +168 -0
- package/workflow_nodes/iCal.json +20 -0
- package/workflow_nodes/if.json +24 -0
- package/workflow_nodes/intercom.json +335 -0
- package/workflow_nodes/interval.json +8 -0
- package/workflow_nodes/invoiceNinja.json +882 -0
- package/workflow_nodes/invoiceNinjaTrigger.json +11 -0
- package/workflow_nodes/itemLists.json +313 -0
- package/workflow_nodes/iterable.json +168 -0
- package/workflow_nodes/jenkins.json +172 -0
- package/workflow_nodes/jira.json +529 -0
- package/workflow_nodes/jiraTrigger.json +308 -0
- package/workflow_nodes/jotFormTrigger.json +44 -0
- package/workflow_nodes/jwt.json +195 -0
- package/workflow_nodes/kafka.json +132 -0
- package/workflow_nodes/kafkaTrigger.json +11 -0
- package/workflow_nodes/keap.json +915 -0
- package/workflow_nodes/keapTrigger.json +37 -0
- package/workflow_nodes/kitemaker.json +153 -0
- package/workflow_nodes/koBoToolbox.json +337 -0
- package/workflow_nodes/koBoToolboxTrigger.json +8 -0
- package/workflow_nodes/langchain_Summarization Chain.json +60 -0
- package/workflow_nodes/langchain_agent.json +145 -0
- package/workflow_nodes/langchain_allowFileUploads.json +180 -0
- package/workflow_nodes/langchain_chainLlm.json +16 -0
- package/workflow_nodes/langchain_chainSummarization.json +119 -0
- package/workflow_nodes/langchain_code.json +62 -0
- package/workflow_nodes/langchain_documentBinaryInputLoader.json +8 -0
- package/workflow_nodes/langchain_documentDefaultDataLoader.json +8 -0
- package/workflow_nodes/langchain_documentGithubLoader.json +8 -0
- package/workflow_nodes/langchain_documentJsonInputLoader.json +8 -0
- package/workflow_nodes/langchain_embeddingDimensions.json +17 -0
- package/workflow_nodes/langchain_embeddingsAwsBedrock.json +8 -0
- package/workflow_nodes/langchain_embeddingsAzureOpenAi.json +151 -0
- package/workflow_nodes/langchain_embeddingsCohere.json +8 -0
- package/workflow_nodes/langchain_embeddingsGoogleGemini.json +8 -0
- package/workflow_nodes/langchain_embeddingsGoogleVertex.json +8 -0
- package/workflow_nodes/langchain_embeddingsHuggingFaceInference.json +8 -0
- package/workflow_nodes/langchain_embeddingsMistralCloud.json +8 -0
- package/workflow_nodes/langchain_embeddingsOllama.json +8 -0
- package/workflow_nodes/langchain_informationExtractor.json +81 -0
- package/workflow_nodes/langchain_lmChatAwsBedrock.json +8 -0
- package/workflow_nodes/langchain_lmChatAzureOpenAi.json +151 -0
- package/workflow_nodes/langchain_lmChatDeepSeek.json +10 -0
- package/workflow_nodes/langchain_lmChatGoogleGemini.json +31 -0
- package/workflow_nodes/langchain_lmChatGoogleVertex.json +32 -0
- package/workflow_nodes/langchain_lmChatGroq.json +8 -0
- package/workflow_nodes/langchain_lmChatMistralCloud.json +8 -0
- package/workflow_nodes/langchain_lmChatOllama.json +8 -0
- package/workflow_nodes/langchain_lmChatOpenAi.json +155 -0
- package/workflow_nodes/langchain_lmChatOpenRouter.json +10 -0
- package/workflow_nodes/langchain_lmChatXAiGrok.json +10 -0
- package/workflow_nodes/langchain_lmCohere.json +8 -0
- package/workflow_nodes/langchain_lmOllama.json +8 -0
- package/workflow_nodes/langchain_lmOpenAi.json +251 -0
- package/workflow_nodes/langchain_lmOpenHuggingFaceInference.json +8 -0
- package/workflow_nodes/langchain_manualChatTrigger.json +11 -0
- package/workflow_nodes/langchain_mcpClientTool.json +86 -0
- package/workflow_nodes/langchain_mcpTrigger.json +8 -0
- package/workflow_nodes/langchain_memoryBufferWindow.json +13 -0
- package/workflow_nodes/langchain_memoryChatRetriever.json +22 -0
- package/workflow_nodes/langchain_memoryManager.json +106 -0
- package/workflow_nodes/langchain_memoryMongoDbChat.json +10 -0
- package/workflow_nodes/langchain_memoryMotorhead.json +13 -0
- package/workflow_nodes/langchain_memoryPostgresChat.json +13 -0
- package/workflow_nodes/langchain_memoryRedisChat.json +15 -0
- package/workflow_nodes/langchain_memoryXata.json +14 -0
- package/workflow_nodes/langchain_memoryZep.json +13 -0
- package/workflow_nodes/langchain_model.json +155 -0
- package/workflow_nodes/langchain_mongoCollection.json +16 -0
- package/workflow_nodes/langchain_notice.json +22 -0
- package/workflow_nodes/langchain_openAiAssistant.json +132 -0
- package/workflow_nodes/langchain_options.json +17 -0
- package/workflow_nodes/langchain_outputParserAutofixing.json +8 -0
- package/workflow_nodes/langchain_outputParserItemList.json +8 -0
- package/workflow_nodes/langchain_outputParserStructured.json +12 -0
- package/workflow_nodes/langchain_pineconeNamespace.json +16 -0
- package/workflow_nodes/langchain_queryName.json +16 -0
- package/workflow_nodes/langchain_retrieverContextualCompression.json +8 -0
- package/workflow_nodes/langchain_retrieverMultiQuery.json +8 -0
- package/workflow_nodes/langchain_retrieverVectorStore.json +8 -0
- package/workflow_nodes/langchain_retrieverWorkflow.json +103 -0
- package/workflow_nodes/langchain_sentimentAnalysis.json +52 -0
- package/workflow_nodes/langchain_systemPromptTemplate.json +47 -0
- package/workflow_nodes/langchain_tableName.json +23 -0
- package/workflow_nodes/langchain_textClassifier.json +66 -0
- package/workflow_nodes/langchain_textSplitterCharacterTextSplitter.json +8 -0
- package/workflow_nodes/langchain_textSplitterRecursiveCharacterTextSplitter.json +8 -0
- package/workflow_nodes/langchain_textSplitterTokenSplitter.json +8 -0
- package/workflow_nodes/langchain_toolCalculator.json +8 -0
- package/workflow_nodes/langchain_toolCode.json +12 -0
- package/workflow_nodes/langchain_toolHttpRequest.json +232 -0
- package/workflow_nodes/langchain_toolSearXng.json +8 -0
- package/workflow_nodes/langchain_toolSerpApi.json +8 -0
- package/workflow_nodes/langchain_toolThink.json +8 -0
- package/workflow_nodes/langchain_toolVectorStore.json +11 -0
- package/workflow_nodes/langchain_toolWikipedia.json +8 -0
- package/workflow_nodes/langchain_toolWolframAlpha.json +8 -0
- package/workflow_nodes/langchain_toolWorkflow.json +8 -0
- package/workflow_nodes/langchain_vectorStoreInMemoryInsert.json +29 -0
- package/workflow_nodes/langchain_vectorStoreInMemoryLoad.json +8 -0
- package/workflow_nodes/langchain_vectorStorePineconeInsert.json +37 -0
- package/workflow_nodes/langchain_vectorStorePineconeLoad.json +8 -0
- package/workflow_nodes/langchain_vectorStoreSupabaseInsert.json +32 -0
- package/workflow_nodes/langchain_vectorStoreSupabaseLoad.json +8 -0
- package/workflow_nodes/langchain_vectorStoreZepInsert.json +46 -0
- package/workflow_nodes/langchain_vectorStoreZepLoad.json +8 -0
- package/workflow_nodes/ldap.json +182 -0
- package/workflow_nodes/lemlist.json +44 -0
- package/workflow_nodes/lemlistTrigger.json +45 -0
- package/workflow_nodes/limit.json +26 -0
- package/workflow_nodes/line.json +95 -0
- package/workflow_nodes/linear.json +151 -0
- package/workflow_nodes/linearTrigger.json +71 -0
- package/workflow_nodes/lingvaNex.json +66 -0
- package/workflow_nodes/linkedIn.json +142 -0
- package/workflow_nodes/localFileTrigger.json +120 -0
- package/workflow_nodes/lonescale.json +171 -0
- package/workflow_nodes/lonescaleTrigger.json +8 -0
- package/workflow_nodes/magento2.json +164 -0
- package/workflow_nodes/mailcheck.json +46 -0
- package/workflow_nodes/mailchimp.json +507 -0
- package/workflow_nodes/mailchimpTrigger.json +100 -0
- package/workflow_nodes/mailerLite.json +24 -0
- package/workflow_nodes/mailerLiteTrigger.json +74 -0
- package/workflow_nodes/mailgun.json +81 -0
- package/workflow_nodes/mailjet.json +201 -0
- package/workflow_nodes/mailjetTrigger.json +8 -0
- package/workflow_nodes/mandrill.json +372 -0
- package/workflow_nodes/manualTrigger.json +8 -0
- package/workflow_nodes/markdown.json +376 -0
- package/workflow_nodes/marketstack.json +126 -0
- package/workflow_nodes/matrix.json +264 -0
- package/workflow_nodes/mattermost.json +8 -0
- package/workflow_nodes/mautic.json +564 -0
- package/workflow_nodes/mauticTrigger.json +54 -0
- package/workflow_nodes/medium.json +209 -0
- package/workflow_nodes/merge.json +125 -0
- package/workflow_nodes/messageBird.json +182 -0
- package/workflow_nodes/metabase.json +175 -0
- package/workflow_nodes/microsoftDynamicsCrm.json +100 -0
- package/workflow_nodes/microsoftEntra.json +51 -0
- package/workflow_nodes/microsoftExcel.json +35 -0
- package/workflow_nodes/microsoftGraphSecurity.json +113 -0
- package/workflow_nodes/microsoftOneDrive.json +232 -0
- package/workflow_nodes/microsoftOneDriveTrigger.json +80 -0
- package/workflow_nodes/microsoftOutlook.json +40 -0
- package/workflow_nodes/microsoftOutlookTrigger.json +24 -0
- package/workflow_nodes/microsoftSql.json +81 -0
- package/workflow_nodes/microsoftTeams.json +36 -0
- package/workflow_nodes/microsoftToDo.json +181 -0
- package/workflow_nodes/mindee.json +86 -0
- package/workflow_nodes/misp.json +399 -0
- package/workflow_nodes/mocean.json +103 -0
- package/workflow_nodes/mondayCom.json +290 -0
- package/workflow_nodes/mongoDb.json +16 -0
- package/workflow_nodes/monicaCrm.json +543 -0
- package/workflow_nodes/moveBinaryData.json +121 -0
- package/workflow_nodes/mqtt.json +67 -0
- package/workflow_nodes/mqttTrigger.json +47 -0
- package/workflow_nodes/msg91.json +65 -0
- package/workflow_nodes/mySql.json +111 -0
- package/workflow_nodes/n8n.json +75 -0
- package/workflow_nodes/n8nTrigger.json +27 -0
- package/workflow_nodes/nasa.json +310 -0
- package/workflow_nodes/netlify.json +87 -0
- package/workflow_nodes/netlifyTrigger.json +68 -0
- package/workflow_nodes/netscalerAdc.json +243 -0
- package/workflow_nodes/nextCloud.json +312 -0
- package/workflow_nodes/noOp.json +8 -0
- package/workflow_nodes/nocoDb.json +276 -0
- package/workflow_nodes/notion.json +8 -0
- package/workflow_nodes/notionTrigger.json +75 -0
- package/workflow_nodes/npm.json +64 -0
- package/workflow_nodes/odoo.json +344 -0
- package/workflow_nodes/okta.json +97 -0
- package/workflow_nodes/oneSimpleApi.json +281 -0
- package/workflow_nodes/onfleet.json +316 -0
- package/workflow_nodes/onfleetTrigger.json +8 -0
- package/workflow_nodes/openAi.json +154 -0
- package/workflow_nodes/openThesaurus.json +81 -0
- package/workflow_nodes/openWeatherMap.json +129 -0
- package/workflow_nodes/orbit.json +375 -0
- package/workflow_nodes/oura.json +74 -0
- package/workflow_nodes/paddle.json +403 -0
- package/workflow_nodes/pagerDuty.json +351 -0
- package/workflow_nodes/payPal.json +196 -0
- package/workflow_nodes/payPalTrigger.json +40 -0
- package/workflow_nodes/peekalink.json +41 -0
- package/workflow_nodes/phantombuster.json +172 -0
- package/workflow_nodes/philipsHue.json +177 -0
- package/workflow_nodes/pipedrive.json +860 -0
- package/workflow_nodes/pipedriveTrigger.json +11 -0
- package/workflow_nodes/plivo.json +91 -0
- package/workflow_nodes/postHog.json +122 -0
- package/workflow_nodes/postbin.json +60 -0
- package/workflow_nodes/postgres.json +109 -0
- package/workflow_nodes/postgresTrigger.json +8 -0
- package/workflow_nodes/postmarkTrigger.json +72 -0
- package/workflow_nodes/profitWell.json +305 -0
- package/workflow_nodes/pushbullet.json +186 -0
- package/workflow_nodes/pushcut.json +75 -0
- package/workflow_nodes/pushcutTrigger.json +8 -0
- package/workflow_nodes/pushover.json +159 -0
- package/workflow_nodes/questDb.json +94 -0
- package/workflow_nodes/quickChart.json +188 -0
- package/workflow_nodes/quickbase.json +205 -0
- package/workflow_nodes/quickbooks.json +550 -0
- package/workflow_nodes/rabbitmq.json +165 -0
- package/workflow_nodes/rabbitmqTrigger.json +8 -0
- package/workflow_nodes/raindrop.json +216 -0
- package/workflow_nodes/readBinaryFile.json +26 -0
- package/workflow_nodes/readBinaryFiles.json +26 -0
- package/workflow_nodes/readPDF.json +31 -0
- package/workflow_nodes/readWriteFile.json +27 -0
- package/workflow_nodes/reddit.json +309 -0
- package/workflow_nodes/redis.json +183 -0
- package/workflow_nodes/redisTrigger.json +8 -0
- package/workflow_nodes/removeDuplicates.json +8 -0
- package/workflow_nodes/renameKeys.json +67 -0
- package/workflow_nodes/respondToWebhook.json +126 -0
- package/workflow_nodes/rocketchat.json +216 -0
- package/workflow_nodes/rssFeedRead.json +28 -0
- package/workflow_nodes/rssFeedReadTrigger.json +17 -0
- package/workflow_nodes/rundeck.json +79 -0
- package/workflow_nodes/s3.json +425 -0
- package/workflow_nodes/salesforce.json +1137 -0
- package/workflow_nodes/salesforceTrigger.json +122 -0
- package/workflow_nodes/salesmate.json +467 -0
- package/workflow_nodes/scheduleTrigger.json +270 -0
- package/workflow_nodes/seaTable.json +8 -0
- package/workflow_nodes/seaTableTrigger.json +87 -0
- package/workflow_nodes/securityScorecard.json +459 -0
- package/workflow_nodes/segment.json +219 -0
- package/workflow_nodes/sendGrid.json +359 -0
- package/workflow_nodes/sendy.json +225 -0
- package/workflow_nodes/sentryIo.json +426 -0
- package/workflow_nodes/serviceNow.json +544 -0
- package/workflow_nodes/set.json +124 -0
- package/workflow_nodes/shopify.json +707 -0
- package/workflow_nodes/shopifyTrigger.json +8 -0
- package/workflow_nodes/signl4.json +133 -0
- package/workflow_nodes/simulate.json +30 -0
- package/workflow_nodes/simulateTrigger.json +8 -0
- package/workflow_nodes/slack.json +62 -0
- package/workflow_nodes/slackTrigger.json +135 -0
- package/workflow_nodes/sms77.json +121 -0
- package/workflow_nodes/snowflake.json +65 -0
- package/workflow_nodes/sort.json +57 -0
- package/workflow_nodes/splitInBatches.json +30 -0
- package/workflow_nodes/splitOut.json +62 -0
- package/workflow_nodes/splunk.json +40 -0
- package/workflow_nodes/spontit.json +123 -0
- package/workflow_nodes/spotify.json +285 -0
- package/workflow_nodes/spreadsheetFile.json +8 -0
- package/workflow_nodes/sseTrigger.json +8 -0
- package/workflow_nodes/ssh.json +105 -0
- package/workflow_nodes/stackby.json +85 -0
- package/workflow_nodes/start.json +15 -0
- package/workflow_nodes/stickyNote.json +36 -0
- package/workflow_nodes/stopAndError.json +8 -0
- package/workflow_nodes/storyblok.json +138 -0
- package/workflow_nodes/strapi.json +138 -0
- package/workflow_nodes/strava.json +427 -0
- package/workflow_nodes/stravaTrigger.json +79 -0
- package/workflow_nodes/stripe.json +357 -0
- package/workflow_nodes/stripeTrigger.json +775 -0
- package/workflow_nodes/summarize.json +124 -0
- package/workflow_nodes/supabase.json +136 -0
- package/workflow_nodes/surveyMonkeyTrigger.json +160 -0
- package/workflow_nodes/switch.json +91 -0
- package/workflow_nodes/syncroMsp.json +8 -0
- package/workflow_nodes/taiga.json +340 -0
- package/workflow_nodes/taigaTrigger.json +81 -0
- package/workflow_nodes/tapfiliate.json +241 -0
- package/workflow_nodes/telegram.json +612 -0
- package/workflow_nodes/telegramTrigger.json +142 -0
- package/workflow_nodes/theHive.json +497 -0
- package/workflow_nodes/theHiveProject.json +8 -0
- package/workflow_nodes/theHiveProjectTrigger.json +162 -0
- package/workflow_nodes/theHiveTrigger.json +101 -0
- package/workflow_nodes/timescaleDb.json +95 -0
- package/workflow_nodes/todoist.json +285 -0
- package/workflow_nodes/togglTrigger.json +24 -0
- package/workflow_nodes/totp.json +86 -0
- package/workflow_nodes/travisCi.json +142 -0
- package/workflow_nodes/trello.json +609 -0
- package/workflow_nodes/trelloTrigger.json +8 -0
- package/workflow_nodes/twake.json +76 -0
- package/workflow_nodes/twilio.json +95 -0
- package/workflow_nodes/twilioTrigger.json +46 -0
- package/workflow_nodes/twist.json +376 -0
- package/workflow_nodes/twitter.json +40 -0
- package/workflow_nodes/typeformTrigger.json +62 -0
- package/workflow_nodes/unleashedSoftware.json +154 -0
- package/workflow_nodes/uplead.json +72 -0
- package/workflow_nodes/uproc.json +26 -0
- package/workflow_nodes/uptimeRobot.json +453 -0
- package/workflow_nodes/urlScanIo.json +113 -0
- package/workflow_nodes/venafiTlsProtectCloud.json +310 -0
- package/workflow_nodes/venafiTlsProtectCloudTrigger.json +38 -0
- package/workflow_nodes/venafiTlsProtectDatacenter.json +491 -0
- package/workflow_nodes/vero.json +158 -0
- package/workflow_nodes/vonage.json +125 -0
- package/workflow_nodes/wait.json +71 -0
- package/workflow_nodes/webflow.json +38 -0
- package/workflow_nodes/webflowTrigger.json +8 -0
- package/workflow_nodes/webhook.json +55 -0
- package/workflow_nodes/wekan.json +460 -0
- package/workflow_nodes/whatsApp.json +476 -0
- package/workflow_nodes/whatsAppTrigger.json +103 -0
- package/workflow_nodes/wise.json +330 -0
- package/workflow_nodes/wiseTrigger.json +8 -0
- package/workflow_nodes/wooCommerce.json +812 -0
- package/workflow_nodes/wooCommerceTrigger.json +8 -0
- package/workflow_nodes/wordpress.json +500 -0
- package/workflow_nodes/workableTrigger.json +51 -0
- package/workflow_nodes/writeBinaryFile.json +34 -0
- package/workflow_nodes/wufooTrigger.json +37 -0
- package/workflow_nodes/xero.json +530 -0
- package/workflow_nodes/xml.json +129 -0
- package/workflow_nodes/youTube.json +578 -0
- package/workflow_nodes/yourls.json +71 -0
- package/workflow_nodes/zammad.json +406 -0
- package/workflow_nodes/zendesk.json +526 -0
- package/workflow_nodes/zendeskTrigger.json +187 -0
- package/workflow_nodes/zohoCrm.json +721 -0
- package/workflow_nodes/zoom.json +507 -0
- package/workflow_nodes/zulip.json +371 -0
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* n8n Integration Module
|
|
3
|
+
*
|
|
4
|
+
* Provides communication and workflow management functionality for n8n instances.
|
|
5
|
+
* Supports both REST API and filesystem integration methods.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs').promises;
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const fetch = require('node-fetch');
|
|
11
|
+
const { logger } = require('../utils/logger');
|
|
12
|
+
const config = require('../../config/default');
|
|
13
|
+
const { workflowStorage } = require('./storage');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Determines the integration type based on configuration
|
|
17
|
+
* Returns 'api' if n8n.apiKey is configured or 'api' is explicitly configured
|
|
18
|
+
* Returns 'filesystem' if configured or if apiKey is not set
|
|
19
|
+
*/
|
|
20
|
+
const getIntegrationType = () => {
|
|
21
|
+
const configType = config.n8n.integrationType;
|
|
22
|
+
|
|
23
|
+
// If explicitly configured, use that
|
|
24
|
+
if (configType === 'api') {
|
|
25
|
+
return 'api';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (configType === 'filesystem') {
|
|
29
|
+
return 'filesystem';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Auto-detection (default)
|
|
33
|
+
if (config.n8n.apiKey) {
|
|
34
|
+
return 'api';
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return 'filesystem';
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* n8n Integration Service
|
|
42
|
+
*/
|
|
43
|
+
const n8nIntegration = {
|
|
44
|
+
/**
|
|
45
|
+
* Deploy a workflow to n8n
|
|
46
|
+
*
|
|
47
|
+
* @param {string} workflowIdOrPath - ID or path of the workflow to deploy
|
|
48
|
+
* @returns {Promise<Object>} Result of the deployment operation
|
|
49
|
+
*/
|
|
50
|
+
async deployWorkflow(workflowIdOrPath) {
|
|
51
|
+
try {
|
|
52
|
+
// Load workflow from storage
|
|
53
|
+
const workflow = await workflowStorage.loadWorkflow(workflowIdOrPath);
|
|
54
|
+
if (!workflow) {
|
|
55
|
+
throw new Error(`Workflow with ID/path ${workflowIdOrPath} not found`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const integrationType = getIntegrationType();
|
|
59
|
+
logger.info('Deploying workflow', {
|
|
60
|
+
id: workflowIdOrPath,
|
|
61
|
+
integrationType,
|
|
62
|
+
name: workflow.name || 'Unnamed Workflow'
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
if (integrationType === 'api') {
|
|
66
|
+
// Deploy via n8n API
|
|
67
|
+
const response = await fetch(`${config.n8n.apiUrl}workflows`, {
|
|
68
|
+
method: 'POST',
|
|
69
|
+
headers: {
|
|
70
|
+
'Content-Type': 'application/json',
|
|
71
|
+
'X-N8N-API-KEY': config.n8n.apiKey
|
|
72
|
+
},
|
|
73
|
+
body: JSON.stringify(workflow)
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
const errorData = await response.json().catch(() => ({}));
|
|
78
|
+
logger.error('n8n API error during deployment', {
|
|
79
|
+
status: response.status,
|
|
80
|
+
error: errorData
|
|
81
|
+
});
|
|
82
|
+
throw new Error(`Failed to deploy workflow: ${response.status} ${response.statusText}`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const result = await response.json();
|
|
86
|
+
logger.info('Workflow deployed successfully via API', { id: result.id });
|
|
87
|
+
return {
|
|
88
|
+
success: true,
|
|
89
|
+
id: result.id,
|
|
90
|
+
message: 'Workflow deployed successfully via API',
|
|
91
|
+
n8nId: result.id
|
|
92
|
+
};
|
|
93
|
+
} else if (integrationType === 'filesystem') {
|
|
94
|
+
// If workflow doesn't have an id, generate one
|
|
95
|
+
if (!workflow.id) {
|
|
96
|
+
workflow.id = path.basename(workflowIdOrPath, '.json');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Ensure the n8n workflows directory exists in the config
|
|
100
|
+
if (!config.n8n.workflowsPath) {
|
|
101
|
+
throw new Error('n8n.workflowsPath is not configured');
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Deploy via filesystem
|
|
105
|
+
const n8nWorkflowsDir = path.resolve(process.cwd(), config.n8n.workflowsPath || './n8n-workflows');
|
|
106
|
+
await fs.mkdir(n8nWorkflowsDir, { recursive: true });
|
|
107
|
+
|
|
108
|
+
const filePath = path.join(n8nWorkflowsDir, `${workflow.id}.json`);
|
|
109
|
+
await fs.writeFile(filePath, JSON.stringify(workflow, null, 2));
|
|
110
|
+
|
|
111
|
+
logger.info('Workflow deployed successfully via filesystem', {
|
|
112
|
+
id: workflow.id,
|
|
113
|
+
path: filePath
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
success: true,
|
|
118
|
+
id: workflow.id,
|
|
119
|
+
path: filePath,
|
|
120
|
+
message: 'Workflow deployed successfully via filesystem'
|
|
121
|
+
};
|
|
122
|
+
} else {
|
|
123
|
+
throw new Error('Invalid integration type');
|
|
124
|
+
}
|
|
125
|
+
} catch (error) {
|
|
126
|
+
logger.error('Failed to deploy workflow', { error: error.message });
|
|
127
|
+
throw new Error(`Failed to deploy workflow: ${error.message}`);
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Activate or deactivate a workflow in n8n
|
|
133
|
+
*
|
|
134
|
+
* @param {string} workflowIdOrPath - ID or path of the workflow
|
|
135
|
+
* @param {boolean} [activate=true] - Whether to activate or deactivate
|
|
136
|
+
* @returns {Promise<Object>} Result of the operation
|
|
137
|
+
*/
|
|
138
|
+
async activateWorkflow(workflowIdOrPath, activate = true) {
|
|
139
|
+
try {
|
|
140
|
+
const integrationType = getIntegrationType();
|
|
141
|
+
logger.info(`${activate ? 'Activating' : 'Deactivating'} workflow`, {
|
|
142
|
+
id: workflowIdOrPath,
|
|
143
|
+
integrationType
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
if (integrationType === 'api') {
|
|
147
|
+
// Determine the n8n workflow ID
|
|
148
|
+
let n8nWorkflowId;
|
|
149
|
+
|
|
150
|
+
// If the input looks like a path, extract the filename without extension
|
|
151
|
+
if (workflowIdOrPath.includes('/') || workflowIdOrPath.includes('\\')) {
|
|
152
|
+
n8nWorkflowId = path.basename(workflowIdOrPath, '.json');
|
|
153
|
+
} else {
|
|
154
|
+
n8nWorkflowId = workflowIdOrPath;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Activate via n8n API
|
|
158
|
+
const response = await fetch(`${config.n8n.apiUrl}workflows/${n8nWorkflowId}/activate`, {
|
|
159
|
+
method: 'POST',
|
|
160
|
+
headers: {
|
|
161
|
+
'Content-Type': 'application/json',
|
|
162
|
+
'X-N8N-API-KEY': config.n8n.apiKey
|
|
163
|
+
},
|
|
164
|
+
body: JSON.stringify({ active: activate })
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
if (!response.ok) {
|
|
168
|
+
const errorData = await response.json().catch(() => ({}));
|
|
169
|
+
logger.error('n8n API error during activation', {
|
|
170
|
+
status: response.status,
|
|
171
|
+
error: errorData
|
|
172
|
+
});
|
|
173
|
+
throw new Error(`Failed to ${activate ? 'activate' : 'deactivate'} workflow: ${response.status} ${response.statusText}`);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const result = await response.json();
|
|
177
|
+
logger.info(`Workflow ${activate ? 'activated' : 'deactivated'} successfully via API`, {
|
|
178
|
+
id: result.id
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
success: true,
|
|
183
|
+
id: result.id,
|
|
184
|
+
active: activate,
|
|
185
|
+
message: `Workflow ${activate ? 'activated' : 'deactivated'} successfully`
|
|
186
|
+
};
|
|
187
|
+
} else if (integrationType === 'filesystem') {
|
|
188
|
+
// Load the workflow
|
|
189
|
+
const workflow = await workflowStorage.loadWorkflow(workflowIdOrPath);
|
|
190
|
+
if (!workflow) {
|
|
191
|
+
throw new Error(`Workflow with ID/path ${workflowIdOrPath} not found`);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Update workflow active status
|
|
195
|
+
workflow.active = activate;
|
|
196
|
+
|
|
197
|
+
// Save back to original location
|
|
198
|
+
if (workflowIdOrPath.includes('/') || workflowIdOrPath.includes('\\')) {
|
|
199
|
+
await fs.writeFile(workflowIdOrPath, JSON.stringify(workflow, null, 2));
|
|
200
|
+
} else {
|
|
201
|
+
// For backward compatibility, save to the default location
|
|
202
|
+
const filePath = path.join(config.storage.workflowsPath, `${workflowIdOrPath}.json`);
|
|
203
|
+
await fs.writeFile(filePath, JSON.stringify(workflow, null, 2));
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// If n8n workflows directory is configured, also update there
|
|
207
|
+
if (config.n8n.workflowsPath) {
|
|
208
|
+
const n8nWorkflowsDir = path.resolve(process.cwd(), config.n8n.workflowsPath);
|
|
209
|
+
const n8nFilePath = path.join(n8nWorkflowsDir, `${workflow.id || path.basename(workflowIdOrPath, '.json')}.json`);
|
|
210
|
+
|
|
211
|
+
// Check if the file exists in n8n workflows directory
|
|
212
|
+
try {
|
|
213
|
+
await fs.access(n8nFilePath);
|
|
214
|
+
await fs.writeFile(n8nFilePath, JSON.stringify(workflow, null, 2));
|
|
215
|
+
logger.info(`Updated workflow in n8n directory: ${activate ? 'active' : 'inactive'}`, {
|
|
216
|
+
path: n8nFilePath
|
|
217
|
+
});
|
|
218
|
+
} catch (err) {
|
|
219
|
+
logger.warn('Workflow not found in n8n directory, not updated', {
|
|
220
|
+
path: n8nFilePath
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
logger.info(`Workflow ${activate ? 'activated' : 'deactivated'} successfully via filesystem`, {
|
|
226
|
+
id: workflow.id || workflowIdOrPath
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
return {
|
|
230
|
+
success: true,
|
|
231
|
+
id: workflow.id || path.basename(workflowIdOrPath, '.json'),
|
|
232
|
+
active: activate,
|
|
233
|
+
message: `Workflow ${activate ? 'activated' : 'deactivated'} successfully`
|
|
234
|
+
};
|
|
235
|
+
} else {
|
|
236
|
+
throw new Error('Invalid integration type');
|
|
237
|
+
}
|
|
238
|
+
} catch (error) {
|
|
239
|
+
logger.error(`Failed to ${activate ? 'activate' : 'deactivate'} workflow`, {
|
|
240
|
+
error: error.message
|
|
241
|
+
});
|
|
242
|
+
throw new Error(`Failed to ${activate ? 'activate' : 'deactivate'} workflow: ${error.message}`);
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Retrieve a workflow from n8n
|
|
248
|
+
*
|
|
249
|
+
* @param {string} workflowId - ID of the workflow in n8n
|
|
250
|
+
* @returns {Promise<Object>} The retrieved workflow data
|
|
251
|
+
*/
|
|
252
|
+
async getWorkflow(workflowId) {
|
|
253
|
+
try {
|
|
254
|
+
const integrationType = getIntegrationType();
|
|
255
|
+
logger.info('Retrieving workflow from n8n', { id: workflowId, integrationType });
|
|
256
|
+
|
|
257
|
+
if (integrationType === 'api') {
|
|
258
|
+
// Retrieve via n8n API
|
|
259
|
+
const response = await fetch(`${config.n8n.apiUrl}workflows/${workflowId}`, {
|
|
260
|
+
method: 'GET',
|
|
261
|
+
headers: {
|
|
262
|
+
'X-N8N-API-KEY': config.n8n.apiKey
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
if (!response.ok) {
|
|
267
|
+
if (response.status === 404) {
|
|
268
|
+
return { success: false, message: 'Workflow not found in n8n' };
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const errorData = await response.json().catch(() => ({}));
|
|
272
|
+
logger.error('n8n API error during retrieval', {
|
|
273
|
+
status: response.status,
|
|
274
|
+
error: errorData
|
|
275
|
+
});
|
|
276
|
+
throw new Error(`Failed to retrieve workflow: ${response.status} ${response.statusText}`);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const workflow = await response.json();
|
|
280
|
+
logger.info('Workflow retrieved successfully via API', { id: workflow.id });
|
|
281
|
+
|
|
282
|
+
return {
|
|
283
|
+
success: true,
|
|
284
|
+
workflow,
|
|
285
|
+
message: 'Workflow retrieved successfully'
|
|
286
|
+
};
|
|
287
|
+
} else if (integrationType === 'filesystem') {
|
|
288
|
+
// If n8n workflows directory is not configured, return error
|
|
289
|
+
if (!config.n8n.workflowsPath) {
|
|
290
|
+
throw new Error('n8n.workflowsPath is not configured');
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Retrieve via filesystem
|
|
294
|
+
const n8nWorkflowsDir = path.resolve(process.cwd(), config.n8n.workflowsPath);
|
|
295
|
+
const filePath = path.join(n8nWorkflowsDir, `${workflowId}.json`);
|
|
296
|
+
|
|
297
|
+
try {
|
|
298
|
+
const data = await fs.readFile(filePath, 'utf8');
|
|
299
|
+
const workflow = JSON.parse(data);
|
|
300
|
+
|
|
301
|
+
logger.info('Workflow retrieved successfully via filesystem', {
|
|
302
|
+
id: workflowId,
|
|
303
|
+
path: filePath
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
return {
|
|
307
|
+
success: true,
|
|
308
|
+
workflow,
|
|
309
|
+
path: filePath,
|
|
310
|
+
message: 'Workflow retrieved successfully'
|
|
311
|
+
};
|
|
312
|
+
} catch (error) {
|
|
313
|
+
if (error.code === 'ENOENT') {
|
|
314
|
+
return { success: false, message: 'Workflow not found in n8n' };
|
|
315
|
+
}
|
|
316
|
+
throw error;
|
|
317
|
+
}
|
|
318
|
+
} else {
|
|
319
|
+
throw new Error('Invalid integration type');
|
|
320
|
+
}
|
|
321
|
+
} catch (error) {
|
|
322
|
+
logger.error('Failed to retrieve workflow from n8n', { error: error.message });
|
|
323
|
+
throw new Error(`Failed to retrieve workflow from n8n: ${error.message}`);
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Check the execution status of a workflow in n8n
|
|
329
|
+
*
|
|
330
|
+
* @param {string} workflowId - ID of the workflow in n8n
|
|
331
|
+
* @returns {Promise<Object>} The status information
|
|
332
|
+
*/
|
|
333
|
+
async checkExecutionStatus(workflowId) {
|
|
334
|
+
try {
|
|
335
|
+
// Only available via API
|
|
336
|
+
if (getIntegrationType() !== 'api') {
|
|
337
|
+
return {
|
|
338
|
+
success: false,
|
|
339
|
+
message: 'Execution status check is only available with API integration'
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
logger.info('Checking workflow execution status', { id: workflowId });
|
|
344
|
+
|
|
345
|
+
// Get most recent executions
|
|
346
|
+
const response = await fetch(`${config.n8n.apiUrl}executions?workflowId=${workflowId}&limit=1`, {
|
|
347
|
+
method: 'GET',
|
|
348
|
+
headers: {
|
|
349
|
+
'X-N8N-API-KEY': config.n8n.apiKey
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
if (!response.ok) {
|
|
354
|
+
const errorData = await response.json().catch(() => ({}));
|
|
355
|
+
logger.error('n8n API error during execution status check', {
|
|
356
|
+
status: response.status,
|
|
357
|
+
error: errorData
|
|
358
|
+
});
|
|
359
|
+
throw new Error(`Failed to check execution status: ${response.status} ${response.statusText}`);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const data = await response.json();
|
|
363
|
+
const executions = data.data || [];
|
|
364
|
+
|
|
365
|
+
if (executions.length === 0) {
|
|
366
|
+
return {
|
|
367
|
+
success: true,
|
|
368
|
+
hasExecutions: false,
|
|
369
|
+
message: 'No executions found for this workflow'
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const latestExecution = executions[0];
|
|
374
|
+
logger.info('Workflow execution status retrieved', {
|
|
375
|
+
id: workflowId,
|
|
376
|
+
executionId: latestExecution.id,
|
|
377
|
+
status: latestExecution.status
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
return {
|
|
381
|
+
success: true,
|
|
382
|
+
hasExecutions: true,
|
|
383
|
+
latestExecution: {
|
|
384
|
+
id: latestExecution.id,
|
|
385
|
+
status: latestExecution.status,
|
|
386
|
+
startedAt: latestExecution.startedAt,
|
|
387
|
+
finishedAt: latestExecution.finishedAt,
|
|
388
|
+
mode: latestExecution.mode
|
|
389
|
+
},
|
|
390
|
+
message: 'Execution status retrieved successfully'
|
|
391
|
+
};
|
|
392
|
+
} catch (error) {
|
|
393
|
+
logger.error('Failed to check workflow execution status', { error: error.message });
|
|
394
|
+
throw new Error(`Failed to check workflow execution status: ${error.message}`);
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* List workflows from n8n
|
|
400
|
+
*
|
|
401
|
+
* @param {Object} [options] - Optional parameters for filtering and pagination
|
|
402
|
+
* @returns {Promise<Object>} The list of workflows
|
|
403
|
+
*/
|
|
404
|
+
async listWorkflows(options = {}) {
|
|
405
|
+
try {
|
|
406
|
+
const integrationType = getIntegrationType();
|
|
407
|
+
logger.info('Listing workflows from n8n', { integrationType });
|
|
408
|
+
|
|
409
|
+
if (integrationType === 'api') {
|
|
410
|
+
// Construct query parameters
|
|
411
|
+
const queryParams = new URLSearchParams();
|
|
412
|
+
if (options.active !== undefined) {
|
|
413
|
+
queryParams.append('active', options.active);
|
|
414
|
+
}
|
|
415
|
+
if (options.limit) {
|
|
416
|
+
queryParams.append('limit', options.limit);
|
|
417
|
+
}
|
|
418
|
+
if (options.offset) {
|
|
419
|
+
queryParams.append('offset', options.offset);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// List via n8n API
|
|
423
|
+
const response = await fetch(`${config.n8n.apiUrl}workflows?${queryParams.toString()}`, {
|
|
424
|
+
method: 'GET',
|
|
425
|
+
headers: {
|
|
426
|
+
'X-N8N-API-KEY': config.n8n.apiKey
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
if (!response.ok) {
|
|
431
|
+
const errorData = await response.json().catch(() => ({}));
|
|
432
|
+
logger.error('n8n API error during workflow listing', {
|
|
433
|
+
status: response.status,
|
|
434
|
+
error: errorData
|
|
435
|
+
});
|
|
436
|
+
throw new Error(`Failed to list workflows: ${response.status} ${response.statusText}`);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
const data = await response.json();
|
|
440
|
+
const workflows = data.data || [];
|
|
441
|
+
|
|
442
|
+
logger.info('Workflows listed successfully via API', { count: workflows.length });
|
|
443
|
+
|
|
444
|
+
return {
|
|
445
|
+
success: true,
|
|
446
|
+
workflows: workflows.map(w => ({
|
|
447
|
+
id: w.id,
|
|
448
|
+
name: w.name,
|
|
449
|
+
active: w.active,
|
|
450
|
+
createdAt: w.createdAt,
|
|
451
|
+
updatedAt: w.updatedAt
|
|
452
|
+
})),
|
|
453
|
+
count: workflows.length,
|
|
454
|
+
message: `Retrieved ${workflows.length} workflows from n8n`
|
|
455
|
+
};
|
|
456
|
+
} else if (integrationType === 'filesystem') {
|
|
457
|
+
// If n8n workflows directory is not configured, return error
|
|
458
|
+
if (!config.n8n.workflowsPath) {
|
|
459
|
+
throw new Error('n8n.workflowsPath is not configured');
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// List via filesystem
|
|
463
|
+
const n8nWorkflowsDir = path.resolve(process.cwd(), config.n8n.workflowsPath);
|
|
464
|
+
|
|
465
|
+
try {
|
|
466
|
+
await fs.access(n8nWorkflowsDir);
|
|
467
|
+
} catch (error) {
|
|
468
|
+
if (error.code === 'ENOENT') {
|
|
469
|
+
logger.warn('n8n workflows directory not found', { path: n8nWorkflowsDir });
|
|
470
|
+
return {
|
|
471
|
+
success: true,
|
|
472
|
+
workflows: [],
|
|
473
|
+
count: 0,
|
|
474
|
+
message: 'n8n workflows directory not found'
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
throw error;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
const files = await fs.readdir(n8nWorkflowsDir);
|
|
481
|
+
const jsonFiles = files.filter(file => file.endsWith('.json'));
|
|
482
|
+
|
|
483
|
+
// Apply pagination if options provided
|
|
484
|
+
const { limit, offset } = options;
|
|
485
|
+
const paginatedFiles = limit
|
|
486
|
+
? jsonFiles.slice(offset || 0, (offset || 0) + limit)
|
|
487
|
+
: jsonFiles;
|
|
488
|
+
|
|
489
|
+
// Process each workflow file
|
|
490
|
+
const workflowPromises = paginatedFiles.map(async (file) => {
|
|
491
|
+
const filePath = path.join(n8nWorkflowsDir, file);
|
|
492
|
+
try {
|
|
493
|
+
const data = await fs.readFile(filePath, 'utf8');
|
|
494
|
+
const workflow = JSON.parse(data);
|
|
495
|
+
|
|
496
|
+
return {
|
|
497
|
+
id: workflow.id || path.basename(file, '.json'),
|
|
498
|
+
name: workflow.name || 'Unnamed Workflow',
|
|
499
|
+
active: workflow.active || false,
|
|
500
|
+
createdAt: workflow.createdAt,
|
|
501
|
+
updatedAt: workflow.updatedAt,
|
|
502
|
+
path: filePath
|
|
503
|
+
};
|
|
504
|
+
} catch (error) {
|
|
505
|
+
logger.error('Error reading workflow file', { path: filePath, error: error.message });
|
|
506
|
+
return null;
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
// Wait for all files to be processed
|
|
511
|
+
const workflows = (await Promise.all(workflowPromises)).filter(w => w !== null);
|
|
512
|
+
|
|
513
|
+
// Apply active filter if provided
|
|
514
|
+
const filteredWorkflows = options.active !== undefined
|
|
515
|
+
? workflows.filter(w => w.active === options.active)
|
|
516
|
+
: workflows;
|
|
517
|
+
|
|
518
|
+
logger.info('Workflows listed successfully via filesystem', {
|
|
519
|
+
count: filteredWorkflows.length,
|
|
520
|
+
path: n8nWorkflowsDir
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
return {
|
|
524
|
+
success: true,
|
|
525
|
+
workflows: filteredWorkflows,
|
|
526
|
+
count: filteredWorkflows.length,
|
|
527
|
+
message: `Retrieved ${filteredWorkflows.length} workflows from n8n`
|
|
528
|
+
};
|
|
529
|
+
} else {
|
|
530
|
+
throw new Error('Invalid integration type');
|
|
531
|
+
}
|
|
532
|
+
} catch (error) {
|
|
533
|
+
logger.error('Failed to list workflows from n8n', { error: error.message });
|
|
534
|
+
throw new Error(`Failed to list workflows from n8n: ${error.message}`);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
};
|
|
538
|
+
|
|
539
|
+
module.exports = {
|
|
540
|
+
n8nIntegration,
|
|
541
|
+
getIntegrationType
|
|
542
|
+
};
|