codika 3.0.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/LICENSE +21 -0
- package/README.md +68 -0
- package/dist/cli/commands/completion.d.ts +15 -0
- package/dist/cli/commands/completion.d.ts.map +1 -0
- package/dist/cli/commands/completion.js +810 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/config/clear.d.ts +12 -0
- package/dist/cli/commands/config/clear.d.ts.map +1 -0
- package/dist/cli/commands/config/clear.js +35 -0
- package/dist/cli/commands/config/clear.js.map +1 -0
- package/dist/cli/commands/config/index.d.ts +15 -0
- package/dist/cli/commands/config/index.d.ts.map +1 -0
- package/dist/cli/commands/config/index.js +21 -0
- package/dist/cli/commands/config/index.js.map +1 -0
- package/dist/cli/commands/config/set.d.ts +41 -0
- package/dist/cli/commands/config/set.d.ts.map +1 -0
- package/dist/cli/commands/config/set.js +185 -0
- package/dist/cli/commands/config/set.js.map +1 -0
- package/dist/cli/commands/config/show.d.ts +12 -0
- package/dist/cli/commands/config/show.d.ts.map +1 -0
- package/dist/cli/commands/config/show.js +45 -0
- package/dist/cli/commands/config/show.js.map +1 -0
- package/dist/cli/commands/deploy/documents.d.ts +12 -0
- package/dist/cli/commands/deploy/documents.d.ts.map +1 -0
- package/dist/cli/commands/deploy/documents.js +217 -0
- package/dist/cli/commands/deploy/documents.js.map +1 -0
- package/dist/cli/commands/deploy/index.d.ts +14 -0
- package/dist/cli/commands/deploy/index.d.ts.map +1 -0
- package/dist/cli/commands/deploy/index.js +21 -0
- package/dist/cli/commands/deploy/index.js.map +1 -0
- package/dist/cli/commands/deploy/process-data-ingestion.d.ts +13 -0
- package/dist/cli/commands/deploy/process-data-ingestion.d.ts.map +1 -0
- package/dist/cli/commands/deploy/process-data-ingestion.js +226 -0
- package/dist/cli/commands/deploy/process-data-ingestion.js.map +1 -0
- package/dist/cli/commands/deploy/use-case.d.ts +9 -0
- package/dist/cli/commands/deploy/use-case.d.ts.map +1 -0
- package/dist/cli/commands/deploy/use-case.js +212 -0
- package/dist/cli/commands/deploy/use-case.js.map +1 -0
- package/dist/cli/commands/get/execution.d.ts +9 -0
- package/dist/cli/commands/get/execution.d.ts.map +1 -0
- package/dist/cli/commands/get/execution.js +159 -0
- package/dist/cli/commands/get/execution.js.map +1 -0
- package/dist/cli/commands/get/index.d.ts +13 -0
- package/dist/cli/commands/get/index.d.ts.map +1 -0
- package/dist/cli/commands/get/index.js +20 -0
- package/dist/cli/commands/get/index.js.map +1 -0
- package/dist/cli/commands/get/skills.d.ts +15 -0
- package/dist/cli/commands/get/skills.d.ts.map +1 -0
- package/dist/cli/commands/get/skills.js +135 -0
- package/dist/cli/commands/get/skills.js.map +1 -0
- package/dist/cli/commands/get/use-case.d.ts +9 -0
- package/dist/cli/commands/get/use-case.d.ts.map +1 -0
- package/dist/cli/commands/get/use-case.js +186 -0
- package/dist/cli/commands/get/use-case.js.map +1 -0
- package/dist/cli/commands/init.d.ts +14 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +347 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/integration/delete.d.ts +13 -0
- package/dist/cli/commands/integration/delete.d.ts.map +1 -0
- package/dist/cli/commands/integration/delete.js +140 -0
- package/dist/cli/commands/integration/delete.js.map +1 -0
- package/dist/cli/commands/integration/index.d.ts +13 -0
- package/dist/cli/commands/integration/index.d.ts.map +1 -0
- package/dist/cli/commands/integration/index.js +20 -0
- package/dist/cli/commands/integration/index.js.map +1 -0
- package/dist/cli/commands/integration/list.d.ts +13 -0
- package/dist/cli/commands/integration/list.d.ts.map +1 -0
- package/dist/cli/commands/integration/list.js +129 -0
- package/dist/cli/commands/integration/list.js.map +1 -0
- package/dist/cli/commands/integration/set.d.ts +13 -0
- package/dist/cli/commands/integration/set.d.ts.map +1 -0
- package/dist/cli/commands/integration/set.js +253 -0
- package/dist/cli/commands/integration/set.js.map +1 -0
- package/dist/cli/commands/list/executions.d.ts +12 -0
- package/dist/cli/commands/list/executions.d.ts.map +1 -0
- package/dist/cli/commands/list/executions.js +168 -0
- package/dist/cli/commands/list/executions.js.map +1 -0
- package/dist/cli/commands/list/index.d.ts +11 -0
- package/dist/cli/commands/list/index.d.ts.map +1 -0
- package/dist/cli/commands/list/index.js +14 -0
- package/dist/cli/commands/list/index.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +12 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +58 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/project/create.d.ts +8 -0
- package/dist/cli/commands/project/create.d.ts.map +1 -0
- package/dist/cli/commands/project/create.js +109 -0
- package/dist/cli/commands/project/create.js.map +1 -0
- package/dist/cli/commands/project/index.d.ts +12 -0
- package/dist/cli/commands/project/index.d.ts.map +1 -0
- package/dist/cli/commands/project/index.js +15 -0
- package/dist/cli/commands/project/index.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +12 -0
- package/dist/cli/commands/publish.d.ts.map +1 -0
- package/dist/cli/commands/publish.js +152 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/redeploy.d.ts +11 -0
- package/dist/cli/commands/redeploy.d.ts.map +1 -0
- package/dist/cli/commands/redeploy.js +166 -0
- package/dist/cli/commands/redeploy.js.map +1 -0
- package/dist/cli/commands/status.d.ts +63 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +290 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/trigger.d.ts +8 -0
- package/dist/cli/commands/trigger.d.ts.map +1 -0
- package/dist/cli/commands/trigger.js +247 -0
- package/dist/cli/commands/trigger.js.map +1 -0
- package/dist/cli/commands/use.d.ts +13 -0
- package/dist/cli/commands/use.d.ts.map +1 -0
- package/dist/cli/commands/use.js +92 -0
- package/dist/cli/commands/use.js.map +1 -0
- package/dist/cli/commands/verify/index.d.ts +13 -0
- package/dist/cli/commands/verify/index.d.ts.map +1 -0
- package/dist/cli/commands/verify/index.js +18 -0
- package/dist/cli/commands/verify/index.js.map +1 -0
- package/dist/cli/commands/verify/use-case.d.ts +23 -0
- package/dist/cli/commands/verify/use-case.d.ts.map +1 -0
- package/dist/cli/commands/verify/use-case.js +94 -0
- package/dist/cli/commands/verify/use-case.js.map +1 -0
- package/dist/cli/commands/verify/workflow.d.ts +22 -0
- package/dist/cli/commands/verify/workflow.d.ts.map +1 -0
- package/dist/cli/commands/verify/workflow.js +82 -0
- package/dist/cli/commands/verify/workflow.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +13 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +126 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/cli/index.d.ts +24 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +90 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/templates/claude-md-template.d.ts +12 -0
- package/dist/cli/templates/claude-md-template.d.ts.map +1 -0
- package/dist/cli/templates/claude-md-template.js +162 -0
- package/dist/cli/templates/claude-md-template.js.map +1 -0
- package/dist/cli/templates/config-template.d.ts +18 -0
- package/dist/cli/templates/config-template.d.ts.map +1 -0
- package/dist/cli/templates/config-template.js +350 -0
- package/dist/cli/templates/config-template.js.map +1 -0
- package/dist/cli/templates/skill-templates.d.ts +24 -0
- package/dist/cli/templates/skill-templates.d.ts.map +1 -0
- package/dist/cli/templates/skill-templates.js +117 -0
- package/dist/cli/templates/skill-templates.js.map +1 -0
- package/dist/cli/templates/slug.d.ts +9 -0
- package/dist/cli/templates/slug.d.ts.map +1 -0
- package/dist/cli/templates/slug.js +17 -0
- package/dist/cli/templates/slug.js.map +1 -0
- package/dist/cli/templates/workflow-templates.d.ts +693 -0
- package/dist/cli/templates/workflow-templates.d.ts.map +1 -0
- package/dist/cli/templates/workflow-templates.js +516 -0
- package/dist/cli/templates/workflow-templates.js.map +1 -0
- package/dist/cli/utils/output.d.ts +65 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +188 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/cli/utils/validation-output.d.ts +21 -0
- package/dist/cli/utils/validation-output.d.ts.map +1 -0
- package/dist/cli/utils/validation-output.js +204 -0
- package/dist/cli/utils/validation-output.js.map +1 -0
- package/dist/data/integration-fields.d.ts +27 -0
- package/dist/data/integration-fields.d.ts.map +1 -0
- package/dist/data/integration-fields.js +361 -0
- package/dist/data/integration-fields.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/types/process-types.d.ts +740 -0
- package/dist/types/process-types.d.ts.map +1 -0
- package/dist/types/process-types.js +22 -0
- package/dist/types/process-types.js.map +1 -0
- package/dist/utils/config.d.ts +127 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +315 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/data-ingestion-deploy-client.d.ts +53 -0
- package/dist/utils/data-ingestion-deploy-client.d.ts.map +1 -0
- package/dist/utils/data-ingestion-deploy-client.js +63 -0
- package/dist/utils/data-ingestion-deploy-client.js.map +1 -0
- package/dist/utils/data-ingestion-deployer.d.ts +78 -0
- package/dist/utils/data-ingestion-deployer.d.ts.map +1 -0
- package/dist/utils/data-ingestion-deployer.js +119 -0
- package/dist/utils/data-ingestion-deployer.js.map +1 -0
- package/dist/utils/deploy-client.d.ts +55 -0
- package/dist/utils/deploy-client.d.ts.map +1 -0
- package/dist/utils/deploy-client.js +73 -0
- package/dist/utils/deploy-client.js.map +1 -0
- package/dist/utils/deployment-archiver.d.ts +110 -0
- package/dist/utils/deployment-archiver.d.ts.map +1 -0
- package/dist/utils/deployment-archiver.js +158 -0
- package/dist/utils/deployment-archiver.js.map +1 -0
- package/dist/utils/document-deploy-client.d.ts +41 -0
- package/dist/utils/document-deploy-client.d.ts.map +1 -0
- package/dist/utils/document-deploy-client.js +46 -0
- package/dist/utils/document-deploy-client.js.map +1 -0
- package/dist/utils/encryption.d.ts +85 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +162 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/execution-client.d.ts +71 -0
- package/dist/utils/execution-client.d.ts.map +1 -0
- package/dist/utils/execution-client.js +56 -0
- package/dist/utils/execution-client.js.map +1 -0
- package/dist/utils/integration-client.d.ts +134 -0
- package/dist/utils/integration-client.d.ts.map +1 -0
- package/dist/utils/integration-client.js +109 -0
- package/dist/utils/integration-client.js.map +1 -0
- package/dist/utils/list-executions-client.d.ts +47 -0
- package/dist/utils/list-executions-client.d.ts.map +1 -0
- package/dist/utils/list-executions-client.js +50 -0
- package/dist/utils/list-executions-client.js.map +1 -0
- package/dist/utils/metadata-client.d.ts +90 -0
- package/dist/utils/metadata-client.d.ts.map +1 -0
- package/dist/utils/metadata-client.js +66 -0
- package/dist/utils/metadata-client.js.map +1 -0
- package/dist/utils/project-client.d.ts +70 -0
- package/dist/utils/project-client.d.ts.map +1 -0
- package/dist/utils/project-client.js +63 -0
- package/dist/utils/project-client.js.map +1 -0
- package/dist/utils/project-json.d.ts +71 -0
- package/dist/utils/project-json.d.ts.map +1 -0
- package/dist/utils/project-json.js +129 -0
- package/dist/utils/project-json.js.map +1 -0
- package/dist/utils/publish-client.d.ts +53 -0
- package/dist/utils/publish-client.d.ts.map +1 -0
- package/dist/utils/publish-client.js +64 -0
- package/dist/utils/publish-client.js.map +1 -0
- package/dist/utils/redeploy-client.d.ts +39 -0
- package/dist/utils/redeploy-client.d.ts.map +1 -0
- package/dist/utils/redeploy-client.js +51 -0
- package/dist/utils/redeploy-client.js.map +1 -0
- package/dist/utils/skill-parser.d.ts +52 -0
- package/dist/utils/skill-parser.d.ts.map +1 -0
- package/dist/utils/skill-parser.js +127 -0
- package/dist/utils/skill-parser.js.map +1 -0
- package/dist/utils/skills-client.d.ts +39 -0
- package/dist/utils/skills-client.d.ts.map +1 -0
- package/dist/utils/skills-client.js +32 -0
- package/dist/utils/skills-client.js.map +1 -0
- package/dist/utils/trigger-client.d.ts +78 -0
- package/dist/utils/trigger-client.d.ts.map +1 -0
- package/dist/utils/trigger-client.js +81 -0
- package/dist/utils/trigger-client.js.map +1 -0
- package/dist/utils/use-case-deployer.d.ts +93 -0
- package/dist/utils/use-case-deployer.d.ts.map +1 -0
- package/dist/utils/use-case-deployer.js +270 -0
- package/dist/utils/use-case-deployer.js.map +1 -0
- package/dist/utils/version-manager.d.ts +63 -0
- package/dist/utils/version-manager.d.ts.map +1 -0
- package/dist/utils/version-manager.js +91 -0
- package/dist/utils/version-manager.js.map +1 -0
- package/dist/utils/workflow-encoding.d.ts +26 -0
- package/dist/utils/workflow-encoding.d.ts.map +1 -0
- package/dist/utils/workflow-encoding.js +41 -0
- package/dist/utils/workflow-encoding.js.map +1 -0
- package/dist/validation/fixer.d.ts +56 -0
- package/dist/validation/fixer.d.ts.map +1 -0
- package/dist/validation/fixer.js +168 -0
- package/dist/validation/fixer.js.map +1 -0
- package/dist/validation/rules/codika-init-required.d.ts +18 -0
- package/dist/validation/rules/codika-init-required.d.ts.map +1 -0
- package/dist/validation/rules/codika-init-required.js +70 -0
- package/dist/validation/rules/codika-init-required.js.map +1 -0
- package/dist/validation/rules/codika-submit-result.d.ts +22 -0
- package/dist/validation/rules/codika-submit-result.d.ts.map +1 -0
- package/dist/validation/rules/codika-submit-result.js +144 -0
- package/dist/validation/rules/codika-submit-result.js.map +1 -0
- package/dist/validation/rules/error-branch-required.d.ts +24 -0
- package/dist/validation/rules/error-branch-required.d.ts.map +1 -0
- package/dist/validation/rules/error-branch-required.js +103 -0
- package/dist/validation/rules/error-branch-required.js.map +1 -0
- package/dist/validation/rules/index.d.ts +18 -0
- package/dist/validation/rules/index.d.ts.map +1 -0
- package/dist/validation/rules/index.js +28 -0
- package/dist/validation/rules/index.js.map +1 -0
- package/dist/validation/rules/schedule-webhook-convergence.d.ts +24 -0
- package/dist/validation/rules/schedule-webhook-convergence.d.ts.map +1 -0
- package/dist/validation/rules/schedule-webhook-convergence.js +129 -0
- package/dist/validation/rules/schedule-webhook-convergence.js.map +1 -0
- package/dist/validation/rules/subworkflow-min-params.d.ts +21 -0
- package/dist/validation/rules/subworkflow-min-params.d.ts.map +1 -0
- package/dist/validation/rules/subworkflow-min-params.js +84 -0
- package/dist/validation/rules/subworkflow-min-params.js.map +1 -0
- package/dist/validation/runner.d.ts +43 -0
- package/dist/validation/runner.d.ts.map +1 -0
- package/dist/validation/runner.js +335 -0
- package/dist/validation/runner.js.map +1 -0
- package/dist/validation/types.d.ts +155 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +8 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/use-case-scripts/calledby-consistency.d.ts +23 -0
- package/dist/validation/use-case-scripts/calledby-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/calledby-consistency.js +236 -0
- package/dist/validation/use-case-scripts/calledby-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/config-exports.d.ts +17 -0
- package/dist/validation/use-case-scripts/config-exports.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/config-exports.js +93 -0
- package/dist/validation/use-case-scripts/config-exports.js.map +1 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.d.ts +21 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.js +378 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.js.map +1 -0
- package/dist/validation/use-case-scripts/index.d.ts +27 -0
- package/dist/validation/use-case-scripts/index.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/index.js +52 -0
- package/dist/validation/use-case-scripts/index.js.map +1 -0
- package/dist/validation/use-case-scripts/integration-inheritance.d.ts +35 -0
- package/dist/validation/use-case-scripts/integration-inheritance.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/integration-inheritance.js +348 -0
- package/dist/validation/use-case-scripts/integration-inheritance.js.map +1 -0
- package/dist/validation/use-case-scripts/schema-types.d.ts +21 -0
- package/dist/validation/use-case-scripts/schema-types.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/schema-types.js +134 -0
- package/dist/validation/use-case-scripts/schema-types.js.map +1 -0
- package/dist/validation/use-case-scripts/skill-consistency.d.ts +21 -0
- package/dist/validation/use-case-scripts/skill-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/skill-consistency.js +180 -0
- package/dist/validation/use-case-scripts/skill-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/subworkflow-references.d.ts +22 -0
- package/dist/validation/use-case-scripts/subworkflow-references.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/subworkflow-references.js +139 -0
- package/dist/validation/use-case-scripts/subworkflow-references.js.map +1 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.d.ts +25 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.js +265 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/trigger-types.d.ts +20 -0
- package/dist/validation/use-case-scripts/trigger-types.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/trigger-types.js +177 -0
- package/dist/validation/use-case-scripts/trigger-types.js.map +1 -0
- package/dist/validation/use-case-scripts/triggers-required.d.ts +23 -0
- package/dist/validation/use-case-scripts/triggers-required.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/triggers-required.js +111 -0
- package/dist/validation/use-case-scripts/triggers-required.js.map +1 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.d.ts +28 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.js +288 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/workflow-imports.d.ts +16 -0
- package/dist/validation/use-case-scripts/workflow-imports.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/workflow-imports.js +206 -0
- package/dist/validation/use-case-scripts/workflow-imports.js.map +1 -0
- package/dist/validation/workflow-scripts/credential-placeholders.d.ts +21 -0
- package/dist/validation/workflow-scripts/credential-placeholders.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/credential-placeholders.js +278 -0
- package/dist/validation/workflow-scripts/credential-placeholders.js.map +1 -0
- package/dist/validation/workflow-scripts/db-always-output.d.ts +16 -0
- package/dist/validation/workflow-scripts/db-always-output.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/db-always-output.js +95 -0
- package/dist/validation/workflow-scripts/db-always-output.js.map +1 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.d.ts +15 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.js +85 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.js.map +1 -0
- package/dist/validation/workflow-scripts/index.d.ts +31 -0
- package/dist/validation/workflow-scripts/index.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/index.js +58 -0
- package/dist/validation/workflow-scripts/index.js.map +1 -0
- package/dist/validation/workflow-scripts/instparm-quoting.d.ts +21 -0
- package/dist/validation/workflow-scripts/instparm-quoting.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/instparm-quoting.js +59 -0
- package/dist/validation/workflow-scripts/instparm-quoting.js.map +1 -0
- package/dist/validation/workflow-scripts/llm-model-id.d.ts +17 -0
- package/dist/validation/workflow-scripts/llm-model-id.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/llm-model-id.js +171 -0
- package/dist/validation/workflow-scripts/llm-model-id.js.map +1 -0
- package/dist/validation/workflow-scripts/llm-output-access.d.ts +23 -0
- package/dist/validation/workflow-scripts/llm-output-access.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/llm-output-access.js +274 -0
- package/dist/validation/workflow-scripts/llm-output-access.js.map +1 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.d.ts +20 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.js +87 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.js.map +1 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.d.ts +29 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.js +154 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.js.map +1 -0
- package/dist/validation/workflow-scripts/retry-backoff.d.ts +16 -0
- package/dist/validation/workflow-scripts/retry-backoff.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/retry-backoff.js +197 -0
- package/dist/validation/workflow-scripts/retry-backoff.js.map +1 -0
- package/dist/validation/workflow-scripts/webhook-id.d.ts +17 -0
- package/dist/validation/workflow-scripts/webhook-id.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/webhook-id.js +79 -0
- package/dist/validation/workflow-scripts/webhook-id.js.map +1 -0
- package/dist/validation/workflow-scripts/workflow-format.d.ts +16 -0
- package/dist/validation/workflow-scripts/workflow-format.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/workflow-format.js +51 -0
- package/dist/validation/workflow-scripts/workflow-format.js.map +1 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.d.ts +21 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.js +78 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.js.map +1 -0
- package/dist/validation/workflow-scripts/workflow-settings.d.ts +19 -0
- package/dist/validation/workflow-scripts/workflow-settings.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/workflow-settings.js +131 -0
- package/dist/validation/workflow-scripts/workflow-settings.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: MERGE-BEFORE-TERMINAL
|
|
3
|
+
*
|
|
4
|
+
* Validates that Merge nodes are never directly connected to terminal
|
|
5
|
+
* Codika nodes (Submit Result / Report Error / Ingestion Callback).
|
|
6
|
+
*
|
|
7
|
+
* A Merge node immediately before a terminal Codika node causes the
|
|
8
|
+
* workflow to hang indefinitely: the Merge waits for ALL inputs, but
|
|
9
|
+
* typically only one conditional branch executes.
|
|
10
|
+
*
|
|
11
|
+
* Merge → Code → Submit Result is fine (indirect).
|
|
12
|
+
* Merge → Submit Result is a MUST-fix violation (direct).
|
|
13
|
+
*/
|
|
14
|
+
export const metadata = {
|
|
15
|
+
id: 'MERGE-BEFORE-TERMINAL',
|
|
16
|
+
name: 'merge_before_terminal',
|
|
17
|
+
severity: 'must',
|
|
18
|
+
description: 'Merge nodes must not connect directly to terminal Codika nodes',
|
|
19
|
+
details: 'A Merge node immediately before Codika Submit Result or Report Error ' +
|
|
20
|
+
'causes the workflow to hang because the Merge waits for all inputs. ' +
|
|
21
|
+
'Insert a processing node (e.g., Code or Set) between the Merge and the terminal node, ' +
|
|
22
|
+
'or duplicate the terminal node on each branch.',
|
|
23
|
+
category: 'structure',
|
|
24
|
+
};
|
|
25
|
+
const CODIKA_NODE_TYPE = 'n8n-nodes-codika.codika';
|
|
26
|
+
const MERGE_NODE_TYPE = 'n8n-nodes-base.merge';
|
|
27
|
+
const TERMINAL_OPERATIONS = new Set(['submitResult', 'reportError', 'ingestionCallback']);
|
|
28
|
+
/**
|
|
29
|
+
* Check for Merge nodes directly connected to terminal Codika nodes
|
|
30
|
+
*/
|
|
31
|
+
export function checkMergeBeforeTerminal(content, path) {
|
|
32
|
+
const findings = [];
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = JSON.parse(content);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const nodes = parsed.nodes || [];
|
|
41
|
+
const connections = parsed.connections || {};
|
|
42
|
+
if (nodes.length === 0)
|
|
43
|
+
return [];
|
|
44
|
+
// Build node lookup by name
|
|
45
|
+
const nodeByName = new Map();
|
|
46
|
+
for (const node of nodes) {
|
|
47
|
+
nodeByName.set(node.name, node);
|
|
48
|
+
}
|
|
49
|
+
// Find all Merge nodes
|
|
50
|
+
const mergeNodes = nodes.filter(n => n.type === MERGE_NODE_TYPE);
|
|
51
|
+
for (const mergeNode of mergeNodes) {
|
|
52
|
+
const mergeConnections = connections[mergeNode.name];
|
|
53
|
+
if (!mergeConnections?.main)
|
|
54
|
+
continue;
|
|
55
|
+
// Check all output indices
|
|
56
|
+
for (const outputGroup of mergeConnections.main) {
|
|
57
|
+
if (!Array.isArray(outputGroup))
|
|
58
|
+
continue;
|
|
59
|
+
for (const conn of outputGroup) {
|
|
60
|
+
const targetNode = nodeByName.get(conn.node);
|
|
61
|
+
if (!targetNode)
|
|
62
|
+
continue;
|
|
63
|
+
// Check if target is a terminal Codika node
|
|
64
|
+
if (targetNode.type === CODIKA_NODE_TYPE &&
|
|
65
|
+
TERMINAL_OPERATIONS.has(targetNode.parameters?.operation)) {
|
|
66
|
+
findings.push({
|
|
67
|
+
rule: metadata.id,
|
|
68
|
+
severity: metadata.severity,
|
|
69
|
+
path,
|
|
70
|
+
message: `Merge node "${mergeNode.name}" connects directly to terminal node "${targetNode.name}" — this will cause the workflow to hang`,
|
|
71
|
+
raw_details: 'The Merge node waits for ALL inputs before passing data downstream, but ' +
|
|
72
|
+
'typically only one conditional branch runs. This causes an infinite wait. ' +
|
|
73
|
+
'Insert a processing node between the Merge and the terminal Codika node, ' +
|
|
74
|
+
'or duplicate the terminal node on each branch feeding into the Merge.',
|
|
75
|
+
nodeId: mergeNode.id,
|
|
76
|
+
guideRef: {
|
|
77
|
+
path: 'specific/codika-nodes.md',
|
|
78
|
+
section: 'Critical Workflow Rules',
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return findings;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=merge-before-terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-before-terminal.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/merge-before-terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: PLACEHOLDER-SYNTAX
|
|
3
|
+
*
|
|
4
|
+
* Validates Codika placeholder patterns in workflow files.
|
|
5
|
+
*
|
|
6
|
+
* This validator has TWO responsibilities:
|
|
7
|
+
* 1. Validate known placeholders have correct suffixes (MUST severity - errors)
|
|
8
|
+
* 2. Detect unknown/unrecognized placeholders (SHOULD severity - warnings)
|
|
9
|
+
*
|
|
10
|
+
* Known placeholder patterns and their required suffixes:
|
|
11
|
+
* - ORGSECRET_*_TERCESORG (organization secrets)
|
|
12
|
+
* - PROCDATA_*_ATADCORP (process data)
|
|
13
|
+
* - USERDATA_*_ATADRESU (user data)
|
|
14
|
+
* - MEMSECRT_*_TRCESMEM (member secrets)
|
|
15
|
+
* - FLEXCRED_*_DERCXELF (flexible credentials)
|
|
16
|
+
* - USERCRED_*_DERCRESU (user credentials)
|
|
17
|
+
* - ORGCRED_*_DERCGRO (organization credentials)
|
|
18
|
+
* - INSTCRED_*_DERCTSNI (instance credentials)
|
|
19
|
+
* - SUBWKFL_*_LFKWBUS (subworkflow references)
|
|
20
|
+
* - INSTPARM_*_MRAPTSNI (instance parameters)
|
|
21
|
+
*/
|
|
22
|
+
import type { Finding } from '../types.js';
|
|
23
|
+
import type { RuleMetadata } from '../types.js';
|
|
24
|
+
export declare const metadata: RuleMetadata;
|
|
25
|
+
/**
|
|
26
|
+
* Check for placeholders with incorrect suffixes and unknown placeholders
|
|
27
|
+
*/
|
|
28
|
+
export declare function checkPlaceholderSyntax(content: string, path: string): Finding[];
|
|
29
|
+
//# sourceMappingURL=placeholder-syntax.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placeholder-syntax.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/placeholder-syntax.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,QAAQ,EAAE,YAQtB,CAAC;AAgEF;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAgF/E"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: PLACEHOLDER-SYNTAX
|
|
3
|
+
*
|
|
4
|
+
* Validates Codika placeholder patterns in workflow files.
|
|
5
|
+
*
|
|
6
|
+
* This validator has TWO responsibilities:
|
|
7
|
+
* 1. Validate known placeholders have correct suffixes (MUST severity - errors)
|
|
8
|
+
* 2. Detect unknown/unrecognized placeholders (SHOULD severity - warnings)
|
|
9
|
+
*
|
|
10
|
+
* Known placeholder patterns and their required suffixes:
|
|
11
|
+
* - ORGSECRET_*_TERCESORG (organization secrets)
|
|
12
|
+
* - PROCDATA_*_ATADCORP (process data)
|
|
13
|
+
* - USERDATA_*_ATADRESU (user data)
|
|
14
|
+
* - MEMSECRT_*_TRCESMEM (member secrets)
|
|
15
|
+
* - FLEXCRED_*_DERCXELF (flexible credentials)
|
|
16
|
+
* - USERCRED_*_DERCRESU (user credentials)
|
|
17
|
+
* - ORGCRED_*_DERCGRO (organization credentials)
|
|
18
|
+
* - INSTCRED_*_DERCTSNI (instance credentials)
|
|
19
|
+
* - SUBWKFL_*_LFKWBUS (subworkflow references)
|
|
20
|
+
* - INSTPARM_*_MRAPTSNI (instance parameters)
|
|
21
|
+
*/
|
|
22
|
+
export const metadata = {
|
|
23
|
+
id: 'PLACEHOLDER-SYNTAX',
|
|
24
|
+
name: 'placeholder_syntax',
|
|
25
|
+
severity: 'must',
|
|
26
|
+
description: 'Placeholders must use correct suffix format',
|
|
27
|
+
details: 'Each placeholder type has a specific required suffix. Check the placeholder documentation for correct formats.',
|
|
28
|
+
fixable: true,
|
|
29
|
+
category: 'placeholder',
|
|
30
|
+
};
|
|
31
|
+
// Placeholder prefix to expected suffix mapping
|
|
32
|
+
const PLACEHOLDER_SUFFIXES = {
|
|
33
|
+
'ORGSECRET': 'TERCESORG',
|
|
34
|
+
'PROCDATA': 'ATADCORP',
|
|
35
|
+
'USERDATA': 'ATADRESU',
|
|
36
|
+
'MEMSECRT': 'TRCESMEM',
|
|
37
|
+
'FLEXCRED': 'DERCXELF',
|
|
38
|
+
'USERCRED': 'DERCRESU',
|
|
39
|
+
'ORGCRED': 'DERCGRO',
|
|
40
|
+
'INSTCRED': 'DERCTSNI',
|
|
41
|
+
'SUBWKFL': 'LFKWBUS',
|
|
42
|
+
'INSTPARM': 'MRAPTSNI',
|
|
43
|
+
};
|
|
44
|
+
// All valid prefixes
|
|
45
|
+
const VALID_PREFIXES = Object.keys(PLACEHOLDER_SUFFIXES);
|
|
46
|
+
// Regex to find ALL potential Codika-style placeholders
|
|
47
|
+
// Matches: {{UPPERCASE_WITH_UNDERSCORES}} (no spaces, no special chars, no lowercase)
|
|
48
|
+
// This catches EVERYTHING that looks like a Codika placeholder
|
|
49
|
+
const ALL_UPPERCASE_PLACEHOLDERS = /\{\{([A-Z][A-Z0-9_]*)\}\}/g;
|
|
50
|
+
// Regex to find known placeholders with their structure
|
|
51
|
+
// Matches: {{PREFIX_NAME_SUFFIX}} where PREFIX is one of our known prefixes
|
|
52
|
+
const KNOWN_PLACEHOLDER_REGEX = /\{\{(ORGSECRET|PROCDATA|USERDATA|MEMSECRT|FLEXCRED|USERCRED|ORGCRED|INSTCRED|SUBWKFL|INSTPARM)_([A-Z0-9_]+)_([A-Z]+)\}\}/g;
|
|
53
|
+
/**
|
|
54
|
+
* Check if a placeholder matches a known valid pattern
|
|
55
|
+
*/
|
|
56
|
+
function matchesKnownPattern(placeholder) {
|
|
57
|
+
for (const [prefix, expectedSuffix] of Object.entries(PLACEHOLDER_SUFFIXES)) {
|
|
58
|
+
// Check if it starts with this prefix followed by underscore
|
|
59
|
+
if (placeholder.startsWith(prefix + '_')) {
|
|
60
|
+
// Try to extract the structure: PREFIX_NAME_SUFFIX
|
|
61
|
+
const afterPrefix = placeholder.slice(prefix.length + 1);
|
|
62
|
+
const lastUnderscoreIndex = afterPrefix.lastIndexOf('_');
|
|
63
|
+
if (lastUnderscoreIndex > 0) {
|
|
64
|
+
const name = afterPrefix.slice(0, lastUnderscoreIndex);
|
|
65
|
+
const suffix = afterPrefix.slice(lastUnderscoreIndex + 1);
|
|
66
|
+
return {
|
|
67
|
+
isKnown: true,
|
|
68
|
+
prefix,
|
|
69
|
+
name,
|
|
70
|
+
suffix,
|
|
71
|
+
expectedSuffix,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return { isKnown: false };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Calculate line number from content and match index
|
|
80
|
+
*/
|
|
81
|
+
function getLineNumber(content, index) {
|
|
82
|
+
return content.substring(0, index).split('\n').length;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check for placeholders with incorrect suffixes and unknown placeholders
|
|
86
|
+
*/
|
|
87
|
+
export function checkPlaceholderSyntax(content, path) {
|
|
88
|
+
const findings = [];
|
|
89
|
+
// Track which positions we've already processed (to avoid duplicates)
|
|
90
|
+
const processedPositions = new Set();
|
|
91
|
+
// First pass: Check known placeholders with wrong suffixes (MUST severity)
|
|
92
|
+
KNOWN_PLACEHOLDER_REGEX.lastIndex = 0;
|
|
93
|
+
let match;
|
|
94
|
+
while ((match = KNOWN_PLACEHOLDER_REGEX.exec(content)) !== null) {
|
|
95
|
+
const fullMatch = match[0];
|
|
96
|
+
const prefix = match[1];
|
|
97
|
+
const name = match[2];
|
|
98
|
+
const actualSuffix = match[3];
|
|
99
|
+
const expectedSuffix = PLACEHOLDER_SUFFIXES[prefix];
|
|
100
|
+
// Mark this position as processed
|
|
101
|
+
processedPositions.add(match.index);
|
|
102
|
+
if (actualSuffix !== expectedSuffix) {
|
|
103
|
+
const lineNumber = getLineNumber(content, match.index);
|
|
104
|
+
const correctPlaceholder = `{{${prefix}_${name}_${expectedSuffix}}}`;
|
|
105
|
+
findings.push({
|
|
106
|
+
rule: metadata.id,
|
|
107
|
+
severity: 'must',
|
|
108
|
+
path,
|
|
109
|
+
message: `Invalid placeholder suffix: ${fullMatch} should end with _${expectedSuffix}`,
|
|
110
|
+
raw_details: `Replace ${fullMatch} with ${correctPlaceholder}`,
|
|
111
|
+
line: lineNumber,
|
|
112
|
+
fixable: true,
|
|
113
|
+
fix: {
|
|
114
|
+
description: `Fix suffix: ${fullMatch} -> ${correctPlaceholder}`,
|
|
115
|
+
apply: (fileContent) => {
|
|
116
|
+
return fileContent.replace(fullMatch, correctPlaceholder);
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Second pass: Find ALL uppercase placeholders and check for unknown ones
|
|
123
|
+
ALL_UPPERCASE_PLACEHOLDERS.lastIndex = 0;
|
|
124
|
+
while ((match = ALL_UPPERCASE_PLACEHOLDERS.exec(content)) !== null) {
|
|
125
|
+
// Skip if we already processed this position (known placeholder with valid/invalid suffix)
|
|
126
|
+
if (processedPositions.has(match.index)) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const fullMatch = match[0];
|
|
130
|
+
const placeholder = match[1]; // The content inside {{ }}
|
|
131
|
+
// Check if this matches a known pattern
|
|
132
|
+
const result = matchesKnownPattern(placeholder);
|
|
133
|
+
if (result.isKnown) {
|
|
134
|
+
// It's a known prefix - we already handled it in first pass if suffix was wrong
|
|
135
|
+
// But if it got here, the suffix is correct, so skip
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// This is an UNKNOWN placeholder - report as warning (not error)
|
|
139
|
+
// It might be intentional or a typo in the prefix — flag it but don't block
|
|
140
|
+
const lineNumber = getLineNumber(content, match.index);
|
|
141
|
+
findings.push({
|
|
142
|
+
rule: metadata.id,
|
|
143
|
+
severity: 'should',
|
|
144
|
+
path,
|
|
145
|
+
message: `Unknown placeholder pattern: ${fullMatch}`,
|
|
146
|
+
raw_details: `This doesn't match any known Codika placeholder pattern. Valid prefixes are: ${VALID_PREFIXES.join(', ')}. Each placeholder must follow the pattern: {{PREFIX_NAME_SUFFIX}} with the correct suffix for each prefix.`,
|
|
147
|
+
line: lineNumber,
|
|
148
|
+
fixable: false,
|
|
149
|
+
// No fix for unknown placeholders - we don't know what they should be
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return findings;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=placeholder-syntax.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placeholder-syntax.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/placeholder-syntax.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: RETRY-BACKOFF
|
|
3
|
+
*
|
|
4
|
+
* Validates that API/HTTP nodes have retry configuration enabled.
|
|
5
|
+
* Replaces flowlint-core R1 with better node type detection and auto-fix.
|
|
6
|
+
*
|
|
7
|
+
* Flagged node types: HTTP Request, Google, Facebook, Slack, Twilio,
|
|
8
|
+
* and other external API integrations.
|
|
9
|
+
*
|
|
10
|
+
* Excluded: Internal nodes (Code, IF, Set, Merge, triggers, Codika nodes,
|
|
11
|
+
* sub-workflow calls, etc.)
|
|
12
|
+
*/
|
|
13
|
+
import type { Finding, RuleMetadata } from '../types.js';
|
|
14
|
+
export declare const metadata: RuleMetadata;
|
|
15
|
+
export declare function checkRetryBackoff(content: string, path: string): Finding[];
|
|
16
|
+
//# sourceMappingURL=retry-backoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-backoff.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/retry-backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,QAAQ,EAAE,YAQtB,CAAC;AA8JF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAkD1E"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: RETRY-BACKOFF
|
|
3
|
+
*
|
|
4
|
+
* Validates that API/HTTP nodes have retry configuration enabled.
|
|
5
|
+
* Replaces flowlint-core R1 with better node type detection and auto-fix.
|
|
6
|
+
*
|
|
7
|
+
* Flagged node types: HTTP Request, Google, Facebook, Slack, Twilio,
|
|
8
|
+
* and other external API integrations.
|
|
9
|
+
*
|
|
10
|
+
* Excluded: Internal nodes (Code, IF, Set, Merge, triggers, Codika nodes,
|
|
11
|
+
* sub-workflow calls, etc.)
|
|
12
|
+
*/
|
|
13
|
+
export const metadata = {
|
|
14
|
+
id: 'RETRY-BACKOFF',
|
|
15
|
+
name: 'retry_backoff',
|
|
16
|
+
severity: 'should',
|
|
17
|
+
description: 'API/HTTP nodes should have retry configuration enabled',
|
|
18
|
+
details: 'Enable "Retry on Fail" in node settings to handle transient API failures gracefully',
|
|
19
|
+
fixable: true,
|
|
20
|
+
category: 'resilience',
|
|
21
|
+
};
|
|
22
|
+
// Default retry configuration for auto-fix
|
|
23
|
+
const DEFAULT_MAX_TRIES = 3;
|
|
24
|
+
const DEFAULT_WAIT_BETWEEN_TRIES = 1000;
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Node type classification
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Node types that are internal / control-flow and should NOT be flagged.
|
|
30
|
+
* Checked by exact match on the last segment of the type.
|
|
31
|
+
*/
|
|
32
|
+
const INTERNAL_NODE_NAMES = new Set([
|
|
33
|
+
'code',
|
|
34
|
+
'function',
|
|
35
|
+
'functionItem',
|
|
36
|
+
'if',
|
|
37
|
+
'switch',
|
|
38
|
+
'set',
|
|
39
|
+
'merge',
|
|
40
|
+
'noOp',
|
|
41
|
+
'stickyNote',
|
|
42
|
+
'splitInBatches',
|
|
43
|
+
'itemLists',
|
|
44
|
+
'dateTime',
|
|
45
|
+
'crypto',
|
|
46
|
+
'xml',
|
|
47
|
+
'html',
|
|
48
|
+
'markdown',
|
|
49
|
+
'compression',
|
|
50
|
+
'renameKeys',
|
|
51
|
+
'splitOut',
|
|
52
|
+
'aggregate',
|
|
53
|
+
'removeDuplicates',
|
|
54
|
+
'limit',
|
|
55
|
+
'sort',
|
|
56
|
+
'filter',
|
|
57
|
+
'respondToWebhook',
|
|
58
|
+
'wait',
|
|
59
|
+
'executeWorkflow',
|
|
60
|
+
'executeWorkflowTrigger',
|
|
61
|
+
'webhook',
|
|
62
|
+
'scheduleTrigger',
|
|
63
|
+
'manualTrigger',
|
|
64
|
+
'errorTrigger',
|
|
65
|
+
'workflowTrigger',
|
|
66
|
+
'emailReadImap',
|
|
67
|
+
'codika',
|
|
68
|
+
'localFileTrigger',
|
|
69
|
+
'readBinaryFiles',
|
|
70
|
+
'writeBinaryFile',
|
|
71
|
+
'readPdf',
|
|
72
|
+
'convertToFile',
|
|
73
|
+
'extractFromFile',
|
|
74
|
+
// Database / data-store nodes (reliable internal connections)
|
|
75
|
+
'supabase',
|
|
76
|
+
'postgres',
|
|
77
|
+
'mySql',
|
|
78
|
+
'mongoDb',
|
|
79
|
+
'redis',
|
|
80
|
+
'elasticsearch',
|
|
81
|
+
]);
|
|
82
|
+
/**
|
|
83
|
+
* Determine if a node type represents an external API call that should have retry.
|
|
84
|
+
*/
|
|
85
|
+
function isApiNode(type) {
|
|
86
|
+
// Extract the node name (last segment after the last dot)
|
|
87
|
+
const segments = type.split('.');
|
|
88
|
+
const nodeName = segments[segments.length - 1];
|
|
89
|
+
// Skip internal/control-flow nodes
|
|
90
|
+
if (INTERNAL_NODE_NAMES.has(nodeName)) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
// Skip Codika custom nodes
|
|
94
|
+
if (type.includes('codika')) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
// Skip LangChain nodes (AI chain internals, not direct API calls)
|
|
98
|
+
if (type.includes('langchain')) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
// Skip trigger nodes (they receive, not send)
|
|
102
|
+
if (nodeName.toLowerCase().endsWith('trigger')) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
// Flag known external API / SaaS integration patterns
|
|
106
|
+
// Excludes databases (supabase, postgres, mysql, mongodb, redis, elasticsearch)
|
|
107
|
+
// which are typically on internal networks with reliable connections
|
|
108
|
+
const apiPatterns = /http|request|google|gmail|facebook|slack|telegram|twilio|notion|airtable|hubspot|stripe|microsoft|outlook|teams|discord|github|gitlab|jira|asana|trello|shopify|mailchimp|sendgrid|aws|azure|s3/i;
|
|
109
|
+
if (apiPatterns.test(type)) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
// Flag httpRequest explicitly
|
|
113
|
+
if (nodeName === 'httpRequest') {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
// For other node types, check if they're likely API integrations
|
|
117
|
+
// (nodes from n8n-nodes-base that aren't in the internal list are usually integrations)
|
|
118
|
+
if (type.startsWith('n8n-nodes-base.') && !INTERNAL_NODE_NAMES.has(nodeName)) {
|
|
119
|
+
// Only flag if the name suggests an external service
|
|
120
|
+
// (conservative: don't flag unknown nodes)
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Check if a node has retry configuration enabled.
|
|
127
|
+
* Checks three locations (same as flowlint R1):
|
|
128
|
+
* 1. node.parameters.options.retryOnFail
|
|
129
|
+
* 2. node.parameters.retryOnFail
|
|
130
|
+
* 3. node.retryOnFail (top-level)
|
|
131
|
+
*/
|
|
132
|
+
function hasRetryEnabled(node) {
|
|
133
|
+
// Check top-level
|
|
134
|
+
if (node.retryOnFail === true)
|
|
135
|
+
return true;
|
|
136
|
+
// Check parameters
|
|
137
|
+
const params = node.parameters || {};
|
|
138
|
+
if (params.retryOnFail === true)
|
|
139
|
+
return true;
|
|
140
|
+
// Check parameters.options
|
|
141
|
+
const options = params.options;
|
|
142
|
+
if (options?.retryOnFail === true)
|
|
143
|
+
return true;
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Main validation function
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
export function checkRetryBackoff(content, path) {
|
|
150
|
+
const findings = [];
|
|
151
|
+
let workflow;
|
|
152
|
+
try {
|
|
153
|
+
workflow = JSON.parse(content);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return findings;
|
|
157
|
+
}
|
|
158
|
+
if (!workflow.nodes || !Array.isArray(workflow.nodes)) {
|
|
159
|
+
return findings;
|
|
160
|
+
}
|
|
161
|
+
for (const node of workflow.nodes) {
|
|
162
|
+
if (!isApiNode(node.type))
|
|
163
|
+
continue;
|
|
164
|
+
if (hasRetryEnabled(node))
|
|
165
|
+
continue;
|
|
166
|
+
findings.push({
|
|
167
|
+
rule: metadata.id,
|
|
168
|
+
severity: metadata.severity,
|
|
169
|
+
path,
|
|
170
|
+
message: `Node "${node.name}" is missing retry/backoff configuration`,
|
|
171
|
+
raw_details: 'Enable "Retry on Fail" in the node settings. This helps handle transient API ' +
|
|
172
|
+
'failures (timeouts, rate limits, 5xx errors) gracefully.',
|
|
173
|
+
nodeId: node.id,
|
|
174
|
+
fixable: true,
|
|
175
|
+
fix: {
|
|
176
|
+
description: `Enable retry on "${node.name}" (3 retries, 1s wait)`,
|
|
177
|
+
apply: (fileContent) => {
|
|
178
|
+
const parsed = JSON.parse(fileContent);
|
|
179
|
+
const target = parsed.nodes.find((n) => n.id === node.id);
|
|
180
|
+
if (target) {
|
|
181
|
+
target.retryOnFail = true;
|
|
182
|
+
// Only set defaults if not already configured
|
|
183
|
+
if (target.maxTries === undefined) {
|
|
184
|
+
target.maxTries = DEFAULT_MAX_TRIES;
|
|
185
|
+
}
|
|
186
|
+
if (target.waitBetweenTries === undefined) {
|
|
187
|
+
target.waitBetweenTries = DEFAULT_WAIT_BETWEEN_TRIES;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return JSON.stringify(parsed, null, 2);
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return findings;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=retry-backoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-backoff.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/retry-backoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: WEBHOOK-ID
|
|
3
|
+
*
|
|
4
|
+
* Validates that every n8n-nodes-base.webhook node has a `webhookId`
|
|
5
|
+
* property at the node level (sibling to name, type, parameters).
|
|
6
|
+
*
|
|
7
|
+
* Without webhookId, the webhook path is never registered in production
|
|
8
|
+
* even when the workflow is active, causing 404 errors at runtime.
|
|
9
|
+
*/
|
|
10
|
+
import type { Finding } from '../types.js';
|
|
11
|
+
import type { RuleMetadata } from '../types.js';
|
|
12
|
+
export declare const metadata: RuleMetadata;
|
|
13
|
+
/**
|
|
14
|
+
* Check that all webhook nodes have a webhookId property.
|
|
15
|
+
*/
|
|
16
|
+
export declare function checkWebhookId(content: string, path: string): Finding[];
|
|
17
|
+
//# sourceMappingURL=webhook-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-id.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/webhook-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,QAAQ,EAAE,YAQtB,CAAC;AAeF;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAmDvE"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: WEBHOOK-ID
|
|
3
|
+
*
|
|
4
|
+
* Validates that every n8n-nodes-base.webhook node has a `webhookId`
|
|
5
|
+
* property at the node level (sibling to name, type, parameters).
|
|
6
|
+
*
|
|
7
|
+
* Without webhookId, the webhook path is never registered in production
|
|
8
|
+
* even when the workflow is active, causing 404 errors at runtime.
|
|
9
|
+
*/
|
|
10
|
+
export const metadata = {
|
|
11
|
+
id: 'WEBHOOK-ID',
|
|
12
|
+
name: 'webhook_id',
|
|
13
|
+
severity: 'must',
|
|
14
|
+
description: 'Webhook nodes must have a webhookId property for production registration',
|
|
15
|
+
details: 'Add a "webhookId" string property to each webhook node (sibling to name/type/parameters)',
|
|
16
|
+
fixable: true,
|
|
17
|
+
category: 'webhook',
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Generate a webhookId by slugifying the node name.
|
|
21
|
+
* Lowercases, replaces spaces and non-alphanumeric chars with hyphens,
|
|
22
|
+
* collapses consecutive hyphens, and trims leading/trailing hyphens.
|
|
23
|
+
*/
|
|
24
|
+
function slugify(name) {
|
|
25
|
+
return name
|
|
26
|
+
.toLowerCase()
|
|
27
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
28
|
+
.replace(/-+/g, '-')
|
|
29
|
+
.replace(/^-|-$/g, '');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check that all webhook nodes have a webhookId property.
|
|
33
|
+
*/
|
|
34
|
+
export function checkWebhookId(content, path) {
|
|
35
|
+
const findings = [];
|
|
36
|
+
let parsed;
|
|
37
|
+
try {
|
|
38
|
+
parsed = JSON.parse(content);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
const nodes = parsed.nodes;
|
|
44
|
+
if (!Array.isArray(nodes)) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
for (const node of nodes) {
|
|
48
|
+
if (node.type !== 'n8n-nodes-base.webhook') {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (!node.webhookId || typeof node.webhookId !== 'string') {
|
|
52
|
+
const generatedId = slugify(node.name || 'webhook');
|
|
53
|
+
findings.push({
|
|
54
|
+
rule: metadata.id,
|
|
55
|
+
severity: metadata.severity,
|
|
56
|
+
path,
|
|
57
|
+
message: `Webhook node "${node.name}" is missing webhookId property`,
|
|
58
|
+
raw_details: `Add "webhookId": "${generatedId}" to the node object (sibling to name/type/parameters)`,
|
|
59
|
+
fixable: true,
|
|
60
|
+
fix: {
|
|
61
|
+
description: `Add webhookId "${generatedId}" to webhook node "${node.name}"`,
|
|
62
|
+
apply: (fileContent) => {
|
|
63
|
+
const data = JSON.parse(fileContent);
|
|
64
|
+
for (const n of data.nodes) {
|
|
65
|
+
if (n.type === 'n8n-nodes-base.webhook' &&
|
|
66
|
+
n.name === node.name &&
|
|
67
|
+
(!n.webhookId || typeof n.webhookId !== 'string')) {
|
|
68
|
+
n.webhookId = slugify(n.name || 'webhook');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return JSON.stringify(data, null, 2);
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return findings;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=webhook-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-id.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/webhook-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,CAAC,MAAM,QAAQ,GAAiB;IACpC,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,0EAA0E;IACvF,OAAO,EAAE,0FAA0F;IACnG,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF;;;;GAIG;AACH,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,IAAY;IAC1D,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAU,MAAM,CAAC,KAAK,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;YAC3C,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;YAEpD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ,CAAC,EAAE;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI;gBACJ,OAAO,EAAE,iBAAiB,IAAI,CAAC,IAAI,iCAAiC;gBACpE,WAAW,EAAE,qBAAqB,WAAW,wDAAwD;gBACrG,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE;oBACH,WAAW,EAAE,kBAAkB,WAAW,sBAAsB,IAAI,CAAC,IAAI,GAAG;oBAC5E,KAAK,EAAE,CAAC,WAAmB,EAAE,EAAE;wBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;wBACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;4BAC3B,IACE,CAAC,CAAC,IAAI,KAAK,wBAAwB;gCACnC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;gCACpB,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,EACjD,CAAC;gCACD,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;4BAC7C,CAAC;wBACH,CAAC;wBACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBACvC,CAAC;iBACF;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: WORKFLOW-FORMAT
|
|
3
|
+
*
|
|
4
|
+
* Validates that workflow JSON files use canonical formatting:
|
|
5
|
+
* JSON.stringify(parsed, null, 2) + '\n'
|
|
6
|
+
*
|
|
7
|
+
* This must be the LAST script in the workflowScripts array so that
|
|
8
|
+
* its fix normalizes formatting after all other fixes have run.
|
|
9
|
+
*/
|
|
10
|
+
import type { Finding, RuleMetadata } from '../types.js';
|
|
11
|
+
export declare const metadata: RuleMetadata;
|
|
12
|
+
/**
|
|
13
|
+
* Check that workflow JSON uses canonical formatting
|
|
14
|
+
*/
|
|
15
|
+
export declare function checkWorkflowFormat(content: string, path: string): Finding[];
|
|
16
|
+
//# sourceMappingURL=workflow-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-format.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/workflow-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,QAAQ,EAAE,YAUtB,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CA8B5E"}
|