@solidxai/core 0.1.13-beta.3 → 0.1.13-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/seed.command.d.ts +2 -0
- package/dist/commands/seed.command.d.ts.map +1 -1
- package/dist/commands/seed.command.js +21 -0
- package/dist/commands/seed.command.js.map +1 -1
- package/dist/entities/workflow-trigger-execution.entity.js +1 -1
- package/dist/entities/workflow-trigger-execution.entity.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +1 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +44 -27
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +80 -67
- package/dist/services/workflow/nodes/execution-fail.node.d.ts +6 -0
- package/dist/services/workflow/nodes/execution-fail.node.d.ts.map +1 -0
- package/dist/services/workflow/nodes/execution-fail.node.js +81 -0
- package/dist/services/workflow/nodes/execution-fail.node.js.map +1 -0
- package/dist/services/workflow/nodes/for-each.node.d.ts +2 -0
- package/dist/services/workflow/nodes/for-each.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/for-each.node.js +114 -5
- package/dist/services/workflow/nodes/for-each.node.js.map +1 -1
- package/dist/services/workflow/nodes/if.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/if.node.js +7 -0
- package/dist/services/workflow/nodes/if.node.js.map +1 -1
- package/dist/services/workflow/nodes/log-write.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/log-write.node.js +2 -0
- package/dist/services/workflow/nodes/log-write.node.js.map +1 -1
- package/dist/services/workflow/nodes/loop-until.node.d.ts +12 -0
- package/dist/services/workflow/nodes/loop-until.node.d.ts.map +1 -0
- package/dist/services/workflow/nodes/loop-until.node.js +281 -0
- package/dist/services/workflow/nodes/loop-until.node.js.map +1 -0
- package/dist/services/workflow/nodes/parallel.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/parallel.node.js +7 -0
- package/dist/services/workflow/nodes/parallel.node.js.map +1 -1
- package/dist/services/workflow/nodes/sequential.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/sequential.node.js +7 -0
- package/dist/services/workflow/nodes/sequential.node.js.map +1 -1
- package/dist/services/workflow/nodes/switch.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/switch.node.js +7 -0
- package/dist/services/workflow/nodes/switch.node.js.map +1 -1
- package/dist/services/workflow/workflow-definition-validator.service.d.ts.map +1 -1
- package/dist/services/workflow/workflow-definition-validator.service.js +5 -2
- package/dist/services/workflow/workflow-definition-validator.service.js.map +1 -1
- package/dist/services/workflow/workflow-expression.service.d.ts.map +1 -1
- package/dist/services/workflow/workflow-expression.service.js +5 -0
- package/dist/services/workflow/workflow-expression.service.js.map +1 -1
- package/dist/services/workflow/workflow-node-registry.service.d.ts +2 -1
- package/dist/services/workflow/workflow-node-registry.service.d.ts.map +1 -1
- package/dist/services/workflow/workflow-node-registry.service.js +7 -0
- package/dist/services/workflow/workflow-node-registry.service.js.map +1 -1
- package/dist/services/workflow/workflow-runtime.service.d.ts +8 -0
- package/dist/services/workflow/workflow-runtime.service.d.ts.map +1 -1
- package/dist/services/workflow/workflow-runtime.service.js +197 -32
- package/dist/services/workflow/workflow-runtime.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +4 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/types/workflow-dsl.types.d.ts +14 -0
- package/dist/types/workflow-dsl.types.d.ts.map +1 -1
- package/dist/types/workflow-dsl.types.js.map +1 -1
- package/dist-tests/api/authenticate.spec.js +119 -0
- package/dist-tests/api/authenticate.spec.js.map +1 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
- package/dist-tests/api/ping.spec.js +21 -0
- package/dist-tests/api/ping.spec.js.map +1 -0
- package/dist-tests/helpers/auth.js +41 -0
- package/dist-tests/helpers/auth.js.map +1 -0
- package/dist-tests/helpers/env.js +11 -0
- package/dist-tests/helpers/env.js.map +1 -0
- package/docs/agent-builder/notebook-lm-prompt-for-agent-builder.md +136 -0
- package/docs/agent-builder/team-ready-note-agent-builder.md +305 -0
- package/docs/agent-hub-grooming.md +301 -0
- package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +438 -0
- package/docs/dashboards/dashboard-curl-smoke-tests.txt +146 -0
- package/docs/dashboards/delete-legacy-dashboard-metadata.sql +172 -0
- package/docs/datasource-introspection-ddl-analysis.md +326 -0
- package/docs/datasource-introspection-implementation-plan.md +306 -0
- package/docs/grouping-enhancements.md +89 -0
- package/docs/java-spring/README.md +3 -0
- package/docs/java-spring/solid-core-module-deep-dive-report.md +1317 -0
- package/docs/module-package-import-handoff.md +691 -0
- package/docs/seed-changes.md +65 -0
- package/docs/test-data-workflow.md +200 -0
- package/docs/type-declaration-import-issue.md +24 -0
- package/docs/workflow/business-automation-example-notes.md +309 -0
- package/docs/workflow/control-flow-node-addition-sop.md +324 -0
- package/docs/workflow/data-engineering-pipeline-example-notes.md +330 -0
- package/docs/workflow/foreach-example-notes.md +187 -0
- package/docs/workflow/hello-world-example-notes.md +271 -0
- package/docs/workflow/kestra-concepts-plugins-blueprints.md +315 -0
- package/docs/workflow/loop-until-example-notes.md +198 -0
- package/docs/workflow/microservices-and-apis-example-notes.md +264 -0
- package/docs/workflow/samples.md +25 -0
- package/docs/workflow/what-is-kestra.md +79 -0
- package/docs/workflow/workflow-core-module-handoff-summary.md +191 -0
- package/docs/workflow/workflow-module-brd.md +185 -0
- package/docs/workflow/workflow-module-domain-model.md +252 -0
- package/docs/workflow/workflow-module-metadata-dsl.md +302 -0
- package/docs/workflow/workflow-module-technical-spec.md +293 -0
- package/docs/workflow/workflow-node-type-contracts.md +635 -0
- package/docs/workflow/workflow-node-ui-metadata-contract.md +1262 -0
- package/docs/workflow/workflow-solidx-model-field-spec.md +284 -0
- package/package.json +1 -1
- package/src/commands/seed.command.ts +19 -0
- package/src/entities/workflow-trigger-execution.entity.ts +1 -1
- package/src/index.ts +2 -0
- package/src/interfaces.ts +1 -0
- package/src/seeders/module-metadata-seeder.service.ts +50 -36
- package/src/seeders/seed-data/solid-core-metadata.json +80 -67
- package/src/services/workflow/nodes/execution-fail.node.ts +82 -0
- package/src/services/workflow/nodes/for-each.node.ts +140 -6
- package/src/services/workflow/nodes/if.node.ts +7 -0
- package/src/services/workflow/nodes/log-write.node.ts +2 -0
- package/src/services/workflow/nodes/loop-until.node.ts +343 -0
- package/src/services/workflow/nodes/parallel.node.ts +7 -0
- package/src/services/workflow/nodes/sequential.node.ts +7 -0
- package/src/services/workflow/nodes/switch.node.ts +7 -0
- package/src/services/workflow/workflow-definition-validator.service.ts +5 -2
- package/src/services/workflow/workflow-expression.service.ts +5 -0
- package/src/services/workflow/workflow-node-registry.service.ts +11 -0
- package/src/services/workflow/workflow-runtime.service.ts +274 -39
- package/src/solid-core.module.ts +4 -0
- package/src/types/workflow-dsl.types.ts +43 -0
- package/.claude/settings.local.json +0 -16
- package/CLAUDE.md +0 -26
- package/src/services/1.js +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-definition-validator.service.js","sourceRoot":"","sources":["../../../src/services/workflow/workflow-definition-validator.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAiE;AAMjE,qFAA+E;AAC/E,6CAAmD;AAG5C,IAAM,kCAAkC,GAAxC,MAAM,kCAAkC;IAC7C,YAA6B,QAAqC;QAArC,aAAQ,GAAR,QAAQ,CAA6B;IAAG,CAAC;IAEtE,QAAQ,CAAC,UAAiC;QACxC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,4BAAmB,CAC3B,sDAAsD,CACvD,CAAC;QACJ,CAAC;QAED,IACE,UAAU,CAAC,QAAQ,KAAK,SAAS;YACjC,UAAU,CAAC,QAAQ,KAAK,IAAI;YAC5B,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EACnC,CAAC;YACD,MAAM,IAAI,4BAAmB,CAC3B,8DAA8D,CAC/D,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAEO,gBAAgB,CAAC,UAAiC;QACxD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QACrC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,MAAM,CAC5C,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,KAAK,UAAU,IAAI,CAAC,OAAO,CAAC,QAAQ,CAC/D,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,4BAAmB,CAC3B,mBAAmB,QAAQ,iEAAiE,CAC7F,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,eAAe,CACrB,OAAkC,EAClC,UAAuB;QAEvB,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,4BAAmB,CAAC,2CAA2C,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,4BAAmB,CAAC,wCAAwC,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,4BAAmB,CAC3B,kCAAkC,OAAO,CAAC,EAAE,IAAI,CACjD,CAAC;QACJ,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAE3B,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,4BAAmB,CAC3B,qBAAqB,OAAO,CAAC,EAAE,2BAA2B,OAAO,CAAC,IAAI,IAAI,CAC3E,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,cAAc,GAClB,OAAO,CAAC,aAAa,EAAE,cAAc,IAAI,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC;YACvE,IAAI,CAAC,cAAc,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;gBAC1D,MAAM,IAAI,4BAAmB,CAC3B,qBAAqB,OAAO,CAAC,EAAE,+BAA+B,CAC/D,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,kCAAoB,CAAC,KAAK,CAAC,cAAc,EAAE;oBACzC,WAAW,EAAE,IAAI,IAAI,EAAE;oBACvB,EAAE,EAAE,OAAO,CAAC,aAAa,EAAE,QAAQ,IAAI,KAAK;iBAC7C,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,4BAAmB,CAC3B,qBAAqB,OAAO,CAAC,EAAE,qCAAqC,KAAK,EAAE,OAAO,IAAI,cAAc,EAAE,CACvG,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7E,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChE,MAAM,IAAI,4BAAmB,CAC3B,qBAAqB,OAAO,CAAC,EAAE,qCAAqC,MAAM,IAAI,CAC/E,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,eAAoB;QAC1C,IACE,eAAe;YACf,OAAO,eAAe,KAAK,QAAQ;YACnC,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAC/B,CAAC;YACD,OAAO,CACL,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC;gBAChE,eAAe,CAAC,OAAO,KAAK,SAAS;gBACrC,eAAe,CAAC,OAAO,KAAK,IAAI,CACjC,CAAC;QACJ,CAAC;QAED,OAAO,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,IAAI,CAAC;IACnE,CAAC;IAEO,aAAa,CAAC,KAA+B,EAAE,OAAoB;QACzE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,IAA4B,EAAE,OAAoB;QACrE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,4BAAmB,CAAC,wCAAwC,CAAC,CAAC;QAC1E,CAAC;QAED,KAAK,MAAM,cAAc,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;YAC/D,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;gBAC/D,MAAM,IAAI,4BAAmB,CAC3B,kBAAkB,IAAI,CAAC,EAAE,IAAI,SAAS,iCAAiC,cAAc,iEAAiE,CACvJ,CAAC;YACJ,CAAC;QACH,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAU,EAAE,CAAC;YACtE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,IACE,UAAU,KAAK,SAAS;gBACxB,UAAU,KAAK,IAAI;gBACnB,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAC1B,CAAC;gBACD,MAAM,IAAI,4BAAmB,CAC3B,kBAAkB,IAAI,CAAC,EAAE,IAAI,SAAS,YAAY,QAAQ,mCAAmC,CAC9F,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IACE,IAAI,CAAC,KAAK,KAAK,SAAS;YACxB,IAAI,CAAC,KAAK,KAAK,IAAI;YACnB,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAC7D,CAAC;YACD,MAAM,IAAI,4BAAmB,CAC3B,kBAAkB,IAAI,CAAC,EAAE,IAAI,SAAS,4DAA4D,CACnG,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACjD,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC9B,MAAM,IAAI,4BAAmB,CAC3B,kBAAkB,IAAI,CAAC,EAAE,IAAI,SAAS,WAAW,OAAO,qBAAqB,CAC9E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,4BAAmB,CAAC,qCAAqC,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,4BAAmB,CAAC,+BAA+B,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAErB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,4BAAmB,CAAC,kBAAkB,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,4BAAmB,CAC3B,kBAAkB,IAAI,CAAC,EAAE,2BAA2B,IAAI,CAAC,IAAI,IAAI,CAClE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,4BAAmB,CAAC,kBAAkB,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,4BAAmB,CAC3B,kBAAkB,IAAI,CAAC,EAAE,6BAA6B,IAAI,CAAC,IAAI,IAAI,CACpE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YACpD,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AApNY,gFAAkC;6CAAlC,kCAAkC;IAD9C,IAAA,mBAAU,GAAE;qCAE4B,4DAA2B;GADvD,kCAAkC,CAoN9C","sourcesContent":["import { BadRequestException, Injectable } from '@nestjs/common';\nimport {\n WorkflowDefinitionDsl,\n WorkflowNodeDefinition,\n WorkflowTriggerDefinition,\n} from '../../types/workflow-dsl.types';\nimport { WorkflowNodeRegistryService } from './workflow-node-registry.service';\nimport { CronExpressionParser } from 'cron-parser';\n\n@Injectable()\nexport class WorkflowDefinitionValidatorService {\n constructor(private readonly registry: WorkflowNodeRegistryService) {}\n\n validate(definition: WorkflowDefinitionDsl) {\n if (!definition || !Array.isArray(definition.nodes)) {\n throw new BadRequestException(\n 'Workflow definition YAML must include a nodes array.',\n );\n }\n\n if (\n definition.triggers !== undefined &&\n definition.triggers !== null &&\n !Array.isArray(definition.triggers)\n ) {\n throw new BadRequestException(\n 'Workflow definition triggers must be an array when provided.',\n );\n }\n\n const nodeIds = new Set<string>();\n this.validateNodes(definition.nodes, nodeIds);\n this.validateTriggers(definition);\n }\n\n private validateTriggers(definition: WorkflowDefinitionDsl) {\n const triggers = definition.triggers ?? [];\n const triggerIds = new Set<string>();\n const activeScheduleTriggers = triggers.filter(\n (trigger) => trigger?.type === 'schedule' && !trigger.disabled,\n );\n\n for (const trigger of triggers) {\n this.validateTrigger(trigger, triggerIds);\n }\n\n if (!activeScheduleTriggers.length) {\n return;\n }\n\n const inputs = definition.inputs ?? {};\n for (const [inputKey, inputDefinition] of Object.entries(inputs)) {\n if (!this.inputHasDefault(inputDefinition)) {\n throw new BadRequestException(\n `Workflow input \"${inputKey}\" requires a default value before enabling a scheduled trigger.`,\n );\n }\n }\n }\n\n private validateTrigger(\n trigger: WorkflowTriggerDefinition,\n triggerIds: Set<string>,\n ) {\n if (!trigger || typeof trigger !== 'object' || Array.isArray(trigger)) {\n throw new BadRequestException('Every workflow trigger must be an object.');\n }\n\n if (!trigger.id) {\n throw new BadRequestException('Every workflow trigger requires an id.');\n }\n\n if (triggerIds.has(trigger.id)) {\n throw new BadRequestException(\n `Duplicate workflow trigger id \"${trigger.id}\".`,\n );\n }\n triggerIds.add(trigger.id);\n\n if (!['schedule', 'webhook'].includes(trigger.type)) {\n throw new BadRequestException(\n `Workflow trigger \"${trigger.id}\" has unsupported type \"${trigger.type}\".`,\n );\n }\n\n if (trigger.type === 'schedule') {\n const cronExpression =\n trigger.configuration?.cronExpression ?? trigger.configuration?.cron;\n if (!cronExpression || typeof cronExpression !== 'string') {\n throw new BadRequestException(\n `Workflow trigger \"${trigger.id}\" requires a cron expression.`,\n );\n }\n\n try {\n CronExpressionParser.parse(cronExpression, {\n currentDate: new Date(),\n tz: trigger.configuration?.timezone ?? 'UTC',\n });\n } catch (error: any) {\n throw new BadRequestException(\n `Workflow trigger \"${trigger.id}\" has an invalid cron expression: ${error?.message ?? cronExpression}`,\n );\n }\n }\n\n if (trigger.type === 'webhook') {\n const method = String(trigger.configuration?.method ?? 'POST').toUpperCase();\n if (!['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(method)) {\n throw new BadRequestException(\n `Workflow trigger \"${trigger.id}\" has unsupported webhook method \"${method}\".`,\n );\n }\n }\n }\n\n private inputHasDefault(inputDefinition: any): boolean {\n if (\n inputDefinition &&\n typeof inputDefinition === 'object' &&\n !Array.isArray(inputDefinition)\n ) {\n return (\n Object.prototype.hasOwnProperty.call(inputDefinition, 'default') &&\n inputDefinition.default !== undefined &&\n inputDefinition.default !== null\n );\n }\n\n return inputDefinition !== undefined && inputDefinition !== null;\n }\n\n private validateNodes(nodes: WorkflowNodeDefinition[], nodeIds: Set<string>) {\n for (const node of nodes) {\n this.validateNode(node, nodeIds);\n }\n }\n\n private validateNode(node: WorkflowNodeDefinition, nodeIds: Set<string>) {\n if (!node || typeof node !== 'object' || Array.isArray(node)) {\n throw new BadRequestException('Every workflow node must be an object.');\n }\n\n for (const unsupportedKey of ['children', 'branches', 'nodes']) {\n if (Object.prototype.hasOwnProperty.call(node, unsupportedKey)) {\n throw new BadRequestException(\n `Workflow node \"${node.id ?? 'unknown'}\" uses unsupported child key \"${unsupportedKey}\". Use \"tasks\", \"then\", \"else\", \"defaults\", or \"cases\" instead.`,\n );\n }\n }\n\n for (const childKey of ['tasks', 'then', 'else', 'defaults'] as const) {\n const childValue = node[childKey];\n if (\n childValue !== undefined &&\n childValue !== null &&\n !Array.isArray(childValue)\n ) {\n throw new BadRequestException(\n `Workflow node \"${node.id ?? 'unknown'}\" field \"${childKey}\" must be an array when provided.`,\n );\n }\n }\n\n if (\n node.cases !== undefined &&\n node.cases !== null &&\n (typeof node.cases !== 'object' || Array.isArray(node.cases))\n ) {\n throw new BadRequestException(\n `Workflow node \"${node.id ?? 'unknown'}\" field \"cases\" must be an object of arrays when provided.`,\n );\n }\n\n if (node.cases && typeof node.cases === 'object') {\n for (const [caseKey, caseNodes] of Object.entries(node.cases)) {\n if (!Array.isArray(caseNodes)) {\n throw new BadRequestException(\n `Workflow node \"${node.id ?? 'unknown'}\" case \"${caseKey}\" must be an array.`,\n );\n }\n }\n }\n\n if (!node.id) {\n throw new BadRequestException('Every workflow node requires an id.');\n }\n\n if (nodeIds.has(node.id)) {\n throw new BadRequestException(`Duplicate workflow node id \"${node.id}\".`);\n }\n\n nodeIds.add(node.id);\n\n if (!node.kind) {\n throw new BadRequestException(`Workflow node \"${node.id}\" requires kind.`);\n }\n\n if (!['task', 'control', 'subflow'].includes(node.kind)) {\n throw new BadRequestException(\n `Workflow node \"${node.id}\" has unsupported kind \"${node.kind}\".`,\n );\n }\n\n if (!node.type) {\n throw new BadRequestException(`Workflow node \"${node.id}\" requires type.`);\n }\n\n if (!this.registry.has(node.type)) {\n throw new BadRequestException(\n `Workflow node \"${node.id}\" uses unregistered type \"${node.type}\".`,\n );\n }\n\n this.validateNodes(node.tasks ?? [], nodeIds);\n this.validateNodes(node.then ?? [], nodeIds);\n this.validateNodes(node.else ?? [], nodeIds);\n this.validateNodes(node.defaults ?? [], nodeIds);\n Object.values(node.cases ?? {}).forEach((caseNodes) => {\n this.validateNodes(caseNodes, nodeIds);\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"workflow-definition-validator.service.js","sourceRoot":"","sources":["../../../src/services/workflow/workflow-definition-validator.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Injectable } from '@nestjs/common';\nimport {\n WorkflowDefinitionDsl,\n WorkflowNodeDefinition,\n WorkflowTriggerDefinition,\n} from '../../types/workflow-dsl.types';\nimport { WorkflowNodeRegistryService } from './workflow-node-registry.service';\nimport { CronExpressionParser } from 'cron-parser';\n\n@Injectable()\nexport class WorkflowDefinitionValidatorService {\n constructor(private readonly registry: WorkflowNodeRegistryService) {}\n\n validate(definition: WorkflowDefinitionDsl) {\n if (!definition || !Array.isArray(definition.nodes)) {\n throw new BadRequestException(\n 'Workflow definition YAML must include a nodes array.',\n );\n }\n\n if (\n definition.triggers !== undefined &&\n definition.triggers !== null &&\n !Array.isArray(definition.triggers)\n ) {\n throw new BadRequestException(\n 'Workflow definition triggers must be an array when provided.',\n );\n }\n\n const nodeIds = new Set<string>();\n this.validateNodes(definition.nodes, nodeIds);\n this.validateNodes(definition.errors ?? [], nodeIds);\n this.validateNodes(definition.finally ?? [], nodeIds);\n this.validateTriggers(definition);\n }\n\n private validateTriggers(definition: WorkflowDefinitionDsl) {\n const triggers = definition.triggers ?? [];\n const triggerIds = new Set<string>();\n const activeScheduleTriggers = triggers.filter(\n (trigger) => trigger?.type === 'schedule' && !trigger.disabled,\n );\n\n for (const trigger of triggers) {\n this.validateTrigger(trigger, triggerIds);\n }\n\n if (!activeScheduleTriggers.length) {\n return;\n }\n\n const inputs = definition.inputs ?? {};\n for (const [inputKey, inputDefinition] of Object.entries(inputs)) {\n if (!this.inputHasDefault(inputDefinition)) {\n throw new BadRequestException(\n `Workflow input \"${inputKey}\" requires a default value before enabling a scheduled trigger.`,\n );\n }\n }\n }\n\n private validateTrigger(\n trigger: WorkflowTriggerDefinition,\n triggerIds: Set<string>,\n ) {\n if (!trigger || typeof trigger !== 'object' || Array.isArray(trigger)) {\n throw new BadRequestException('Every workflow trigger must be an object.');\n }\n\n if (!trigger.id) {\n throw new BadRequestException('Every workflow trigger requires an id.');\n }\n\n if (triggerIds.has(trigger.id)) {\n throw new BadRequestException(\n `Duplicate workflow trigger id \"${trigger.id}\".`,\n );\n }\n triggerIds.add(trigger.id);\n\n if (!['schedule', 'webhook'].includes(trigger.type)) {\n throw new BadRequestException(\n `Workflow trigger \"${trigger.id}\" has unsupported type \"${trigger.type}\".`,\n );\n }\n\n if (trigger.type === 'schedule') {\n const cronExpression =\n trigger.configuration?.cronExpression ?? trigger.configuration?.cron;\n if (!cronExpression || typeof cronExpression !== 'string') {\n throw new BadRequestException(\n `Workflow trigger \"${trigger.id}\" requires a cron expression.`,\n );\n }\n\n try {\n CronExpressionParser.parse(cronExpression, {\n currentDate: new Date(),\n tz: trigger.configuration?.timezone ?? 'UTC',\n });\n } catch (error: any) {\n throw new BadRequestException(\n `Workflow trigger \"${trigger.id}\" has an invalid cron expression: ${error?.message ?? cronExpression}`,\n );\n }\n }\n\n if (trigger.type === 'webhook') {\n const method = String(trigger.configuration?.method ?? 'POST').toUpperCase();\n if (!['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(method)) {\n throw new BadRequestException(\n `Workflow trigger \"${trigger.id}\" has unsupported webhook method \"${method}\".`,\n );\n }\n }\n }\n\n private inputHasDefault(inputDefinition: any): boolean {\n if (\n inputDefinition &&\n typeof inputDefinition === 'object' &&\n !Array.isArray(inputDefinition)\n ) {\n return (\n Object.prototype.hasOwnProperty.call(inputDefinition, 'default') &&\n inputDefinition.default !== undefined &&\n inputDefinition.default !== null\n );\n }\n\n return inputDefinition !== undefined && inputDefinition !== null;\n }\n\n private validateNodes(nodes: WorkflowNodeDefinition[], nodeIds: Set<string>) {\n for (const node of nodes) {\n this.validateNode(node, nodeIds);\n }\n }\n\n private validateNode(node: WorkflowNodeDefinition, nodeIds: Set<string>) {\n if (!node || typeof node !== 'object' || Array.isArray(node)) {\n throw new BadRequestException('Every workflow node must be an object.');\n }\n\n for (const unsupportedKey of ['children', 'branches', 'nodes']) {\n if (Object.prototype.hasOwnProperty.call(node, unsupportedKey)) {\n throw new BadRequestException(\n `Workflow node \"${node.id ?? 'unknown'}\" uses unsupported child key \"${unsupportedKey}\". Use \"tasks\", \"then\", \"else\", \"defaults\", \"errors\", or \"cases\" instead.`,\n );\n }\n }\n\n for (const childKey of ['tasks', 'then', 'else', 'defaults', 'errors'] as const) {\n const childValue = node[childKey];\n if (\n childValue !== undefined &&\n childValue !== null &&\n !Array.isArray(childValue)\n ) {\n throw new BadRequestException(\n `Workflow node \"${node.id ?? 'unknown'}\" field \"${childKey}\" must be an array when provided.`,\n );\n }\n }\n\n if (\n node.cases !== undefined &&\n node.cases !== null &&\n (typeof node.cases !== 'object' || Array.isArray(node.cases))\n ) {\n throw new BadRequestException(\n `Workflow node \"${node.id ?? 'unknown'}\" field \"cases\" must be an object of arrays when provided.`,\n );\n }\n\n if (node.cases && typeof node.cases === 'object') {\n for (const [caseKey, caseNodes] of Object.entries(node.cases)) {\n if (!Array.isArray(caseNodes)) {\n throw new BadRequestException(\n `Workflow node \"${node.id ?? 'unknown'}\" case \"${caseKey}\" must be an array.`,\n );\n }\n }\n }\n\n if (!node.id) {\n throw new BadRequestException('Every workflow node requires an id.');\n }\n\n if (nodeIds.has(node.id)) {\n throw new BadRequestException(`Duplicate workflow node id \"${node.id}\".`);\n }\n\n nodeIds.add(node.id);\n\n if (!node.kind) {\n throw new BadRequestException(`Workflow node \"${node.id}\" requires kind.`);\n }\n\n if (!['task', 'control', 'subflow'].includes(node.kind)) {\n throw new BadRequestException(\n `Workflow node \"${node.id}\" has unsupported kind \"${node.kind}\".`,\n );\n }\n\n if (!node.type) {\n throw new BadRequestException(`Workflow node \"${node.id}\" requires type.`);\n }\n\n if (!this.registry.has(node.type)) {\n throw new BadRequestException(\n `Workflow node \"${node.id}\" uses unregistered type \"${node.type}\".`,\n );\n }\n\n this.validateNodes(node.tasks ?? [], nodeIds);\n this.validateNodes(node.then ?? [], nodeIds);\n this.validateNodes(node.else ?? [], nodeIds);\n this.validateNodes(node.defaults ?? [], nodeIds);\n this.validateNodes(node.errors ?? [], nodeIds);\n Object.values(node.cases ?? {}).forEach((caseNodes) => {\n this.validateNodes(caseNodes, nodeIds);\n });\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-expression.service.d.ts","sourceRoot":"","sources":["../../../src/services/workflow/workflow-expression.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,gCAAgC,CAAC;AAExC,qBACa,yBAA0B,YAAW,0BAA0B;IAC1E,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,sBAAsB,GAAG,CAAC;IA2BlE,iBAAiB,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO;IAa5E,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,GAAG;IAkB3E,OAAO,CAAC,yBAAyB;IAsBjC,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,WAAW;
|
|
1
|
+
{"version":3,"file":"workflow-expression.service.d.ts","sourceRoot":"","sources":["../../../src/services/workflow/workflow-expression.service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,gCAAgC,CAAC;AAExC,qBACa,yBAA0B,YAAW,0BAA0B;IAC1E,WAAW,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,sBAAsB,GAAG,CAAC;IA2BlE,iBAAiB,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO;IAa5E,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,GAAG;IAkB3E,OAAO,CAAC,yBAAyB;IAsBjC,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,WAAW;IA+BnB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,QAAQ;CAMjB"}
|
|
@@ -118,9 +118,14 @@ let WorkflowExpressionService = class WorkflowExpressionService {
|
|
|
118
118
|
node: context.node,
|
|
119
119
|
item: context.item,
|
|
120
120
|
index: context.index,
|
|
121
|
+
parent: context.parent,
|
|
122
|
+
parents: context.parents,
|
|
123
|
+
loops: context.loops,
|
|
124
|
+
error: context.error,
|
|
121
125
|
};
|
|
122
126
|
const parts = path
|
|
123
127
|
.replace(/\[(?:'|")([^'"]+)(?:'|")\]/g, '.$1')
|
|
128
|
+
.replace(/\[(\d+)\]/g, '.$1')
|
|
124
129
|
.split('.')
|
|
125
130
|
.filter(Boolean);
|
|
126
131
|
return parts.reduce((current, key) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-expression.service.js","sourceRoot":"","sources":["../../../src/services/workflow/workflow-expression.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport {\n WorkflowExpressionResolver,\n WorkflowRuntimeContext,\n} from '../../types/workflow-dsl.types';\n\n@Injectable()\nexport class WorkflowExpressionService implements WorkflowExpressionResolver {\n interpolate<T = any>(value: T, context: WorkflowRuntimeContext): T {\n if (Array.isArray(value)) {\n return value.map((entry) => this.interpolate(entry, context)) as T;\n }\n\n if (value && typeof value === 'object') {\n return Object.entries(value).reduce((acc, [key, entry]) => {\n acc[key] = this.interpolate(entry, context);\n return acc;\n }, {} as Record<string, any>) as T;\n }\n\n if (typeof value !== 'string') {\n return value;\n }\n\n const exactExpression = value.match(/^\\s*\\{\\{\\s*(.*?)\\s*\\}\\}\\s*$/);\n if (exactExpression) {\n return this.resolveExpression(exactExpression[1], context);\n }\n\n return value.replace(/\\{\\{\\s*(.*?)\\s*\\}\\}/g, (_match, expression) => {\n const resolved = this.resolveExpression(expression, context);\n return resolved === null || resolved === undefined ? '' : String(resolved);\n }) as T;\n }\n\n evaluateCondition(expression: any, context: WorkflowRuntimeContext): boolean {\n const resolved =\n typeof expression === 'string'\n ? this.resolveExpression(this.unwrapExpression(expression), context)\n : expression;\n\n if (typeof resolved === 'string') {\n return this.evaluateBooleanExpression(resolved, context);\n }\n\n return Boolean(resolved);\n }\n\n resolveExpression(expression: string, context: WorkflowRuntimeContext): any {\n const trimmed = expression.trim();\n\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (trimmed === 'null') return null;\n if (trimmed === 'undefined') return undefined;\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) return Number(trimmed);\n if (this.isQuoted(trimmed)) return trimmed.slice(1, -1);\n\n const comparison = this.evaluateComparison(trimmed, context);\n if (comparison !== undefined) {\n return comparison;\n }\n\n return this.resolvePath(trimmed, context);\n }\n\n private evaluateBooleanExpression(\n expression: string,\n context: WorkflowRuntimeContext,\n ): boolean {\n const orParts = this.splitTopLevel(expression, '||');\n if (orParts.length > 1) {\n return orParts.some((part) => this.evaluateCondition(part, context));\n }\n\n const andParts = this.splitTopLevel(expression, '&&');\n if (andParts.length > 1) {\n return andParts.every((part) => this.evaluateCondition(part, context));\n }\n\n const comparison = this.evaluateComparison(expression, context);\n if (comparison !== undefined) {\n return comparison;\n }\n\n return Boolean(this.resolveExpression(expression, context));\n }\n\n private evaluateComparison(\n expression: string,\n context: WorkflowRuntimeContext,\n ): boolean | undefined {\n const match = expression.match(/^(.+?)\\s*(===|!==|==|!=|>=|<=|>|<)\\s*(.+)$/);\n if (!match) {\n return undefined;\n }\n\n const left = this.resolveOperand(match[1], context);\n const operator = match[2];\n const right = this.resolveOperand(match[3], context);\n\n switch (operator) {\n case '===':\n return left === right;\n case '!==':\n return left !== right;\n case '==':\n return left == right;\n case '!=':\n return left != right;\n case '>=':\n return Number(left) >= Number(right);\n case '<=':\n return Number(left) <= Number(right);\n case '>':\n return Number(left) > Number(right);\n case '<':\n return Number(left) < Number(right);\n default:\n return undefined;\n }\n }\n\n private resolveOperand(\n operand: string,\n context: WorkflowRuntimeContext,\n ): any {\n return this.resolveExpression(this.unwrapExpression(operand), context);\n }\n\n private resolvePath(path: string, context: WorkflowRuntimeContext): any {\n const root = {\n inputs: context.input,\n input: context.input,\n variables: context.variables,\n secrets: context.secrets,\n outputs: context.outputs,\n execution: context.execution,\n node: context.node,\n item: context.item,\n index: context.index,\n };\n\n const parts = path\n .replace(/\\[(?:'|\")([^'\"]+)(?:'|\")\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n\n return parts.reduce((current, key) => {\n if (current === null || current === undefined) {\n return undefined;\n }\n return current[key];\n }, root as any);\n }\n\n private unwrapExpression(expression: string): string {\n const match = expression.trim().match(/^\\{\\{\\s*(.*?)\\s*\\}\\}$/);\n return match ? match[1] : expression.trim();\n }\n\n private splitTopLevel(expression: string, token: string): string[] {\n return expression\n .split(token)\n .map((part) => part.trim())\n .filter(Boolean);\n }\n\n private isQuoted(value: string): boolean {\n return (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"workflow-expression.service.js","sourceRoot":"","sources":["../../../src/services/workflow/workflow-expression.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport {\n WorkflowExpressionResolver,\n WorkflowRuntimeContext,\n} from '../../types/workflow-dsl.types';\n\n@Injectable()\nexport class WorkflowExpressionService implements WorkflowExpressionResolver {\n interpolate<T = any>(value: T, context: WorkflowRuntimeContext): T {\n if (Array.isArray(value)) {\n return value.map((entry) => this.interpolate(entry, context)) as T;\n }\n\n if (value && typeof value === 'object') {\n return Object.entries(value).reduce((acc, [key, entry]) => {\n acc[key] = this.interpolate(entry, context);\n return acc;\n }, {} as Record<string, any>) as T;\n }\n\n if (typeof value !== 'string') {\n return value;\n }\n\n const exactExpression = value.match(/^\\s*\\{\\{\\s*(.*?)\\s*\\}\\}\\s*$/);\n if (exactExpression) {\n return this.resolveExpression(exactExpression[1], context);\n }\n\n return value.replace(/\\{\\{\\s*(.*?)\\s*\\}\\}/g, (_match, expression) => {\n const resolved = this.resolveExpression(expression, context);\n return resolved === null || resolved === undefined ? '' : String(resolved);\n }) as T;\n }\n\n evaluateCondition(expression: any, context: WorkflowRuntimeContext): boolean {\n const resolved =\n typeof expression === 'string'\n ? this.resolveExpression(this.unwrapExpression(expression), context)\n : expression;\n\n if (typeof resolved === 'string') {\n return this.evaluateBooleanExpression(resolved, context);\n }\n\n return Boolean(resolved);\n }\n\n resolveExpression(expression: string, context: WorkflowRuntimeContext): any {\n const trimmed = expression.trim();\n\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (trimmed === 'null') return null;\n if (trimmed === 'undefined') return undefined;\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) return Number(trimmed);\n if (this.isQuoted(trimmed)) return trimmed.slice(1, -1);\n\n const comparison = this.evaluateComparison(trimmed, context);\n if (comparison !== undefined) {\n return comparison;\n }\n\n return this.resolvePath(trimmed, context);\n }\n\n private evaluateBooleanExpression(\n expression: string,\n context: WorkflowRuntimeContext,\n ): boolean {\n const orParts = this.splitTopLevel(expression, '||');\n if (orParts.length > 1) {\n return orParts.some((part) => this.evaluateCondition(part, context));\n }\n\n const andParts = this.splitTopLevel(expression, '&&');\n if (andParts.length > 1) {\n return andParts.every((part) => this.evaluateCondition(part, context));\n }\n\n const comparison = this.evaluateComparison(expression, context);\n if (comparison !== undefined) {\n return comparison;\n }\n\n return Boolean(this.resolveExpression(expression, context));\n }\n\n private evaluateComparison(\n expression: string,\n context: WorkflowRuntimeContext,\n ): boolean | undefined {\n const match = expression.match(/^(.+?)\\s*(===|!==|==|!=|>=|<=|>|<)\\s*(.+)$/);\n if (!match) {\n return undefined;\n }\n\n const left = this.resolveOperand(match[1], context);\n const operator = match[2];\n const right = this.resolveOperand(match[3], context);\n\n switch (operator) {\n case '===':\n return left === right;\n case '!==':\n return left !== right;\n case '==':\n return left == right;\n case '!=':\n return left != right;\n case '>=':\n return Number(left) >= Number(right);\n case '<=':\n return Number(left) <= Number(right);\n case '>':\n return Number(left) > Number(right);\n case '<':\n return Number(left) < Number(right);\n default:\n return undefined;\n }\n }\n\n private resolveOperand(\n operand: string,\n context: WorkflowRuntimeContext,\n ): any {\n return this.resolveExpression(this.unwrapExpression(operand), context);\n }\n\n private resolvePath(path: string, context: WorkflowRuntimeContext): any {\n const root = {\n inputs: context.input,\n input: context.input,\n variables: context.variables,\n secrets: context.secrets,\n outputs: context.outputs,\n execution: context.execution,\n node: context.node,\n item: context.item,\n index: context.index,\n parent: context.parent,\n parents: context.parents,\n loops: context.loops,\n error: context.error,\n };\n\n const parts = path\n .replace(/\\[(?:'|\")([^'\"]+)(?:'|\")\\]/g, '.$1')\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n\n return parts.reduce((current, key) => {\n if (current === null || current === undefined) {\n return undefined;\n }\n return current[key];\n }, root as any);\n }\n\n private unwrapExpression(expression: string): string {\n const match = expression.trim().match(/^\\{\\{\\s*(.*?)\\s*\\}\\}$/);\n return match ? match[1] : expression.trim();\n }\n\n private splitTopLevel(expression: string, token: string): string[] {\n return expression\n .split(token)\n .map((part) => part.trim())\n .filter(Boolean);\n }\n\n private isQuoted(value: string): boolean {\n return (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n );\n }\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OnModuleInit } from '@nestjs/common';
|
|
2
2
|
import { DiscoveryService, Reflector } from '@nestjs/core';
|
|
3
3
|
import { WorkflowNodeHandler } from '../../interfaces/workflow-node-handler.interface';
|
|
4
|
-
import { WorkflowNodeMetadataResponse } from '../../types/workflow-dsl.types';
|
|
4
|
+
import { WorkflowNodeMetadataResponse, WorkflowNodeProviderMetadata } from '../../types/workflow-dsl.types';
|
|
5
5
|
export declare class WorkflowNodeRegistryService implements OnModuleInit {
|
|
6
6
|
private readonly discoveryService;
|
|
7
7
|
private readonly reflector;
|
|
@@ -10,6 +10,7 @@ export declare class WorkflowNodeRegistryService implements OnModuleInit {
|
|
|
10
10
|
constructor(discoveryService: DiscoveryService, reflector: Reflector);
|
|
11
11
|
onModuleInit(): void;
|
|
12
12
|
get(type: string): WorkflowNodeHandler;
|
|
13
|
+
getMetadata(type: string): WorkflowNodeProviderMetadata;
|
|
13
14
|
list(): WorkflowNodeMetadataResponse[];
|
|
14
15
|
has(type: string): boolean;
|
|
15
16
|
private registerProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-node-registry.service.d.ts","sourceRoot":"","sources":["../../../src/services/workflow/workflow-node-registry.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EACL,4BAA4B,
|
|
1
|
+
{"version":3,"file":"workflow-node-registry.service.d.ts","sourceRoot":"","sources":["../../../src/services/workflow/workflow-node-registry.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AACvF,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC7B,MAAM,gCAAgC,CAAC;AAOxC,qBACa,2BAA4B,YAAW,YAAY;IAK5D,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAL5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgD;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqD;gBAG5D,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,SAAS;IAGvC,YAAY;IAYZ,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB;IAWtC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,4BAA4B;IAWvD,IAAI,IAAI,4BAA4B,EAAE;IActC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,OAAO,CAAC,gBAAgB;IAiCxB,OAAO,CAAC,kBAAkB;CAkC3B"}
|
|
@@ -34,6 +34,13 @@ let WorkflowNodeRegistryService = WorkflowNodeRegistryService_1 = class Workflow
|
|
|
34
34
|
}
|
|
35
35
|
return provider.handler;
|
|
36
36
|
}
|
|
37
|
+
getMetadata(type) {
|
|
38
|
+
const provider = this.providers.get(type);
|
|
39
|
+
if (!provider) {
|
|
40
|
+
throw new common_1.BadRequestException(`No workflow node provider registered for type "${type}".`);
|
|
41
|
+
}
|
|
42
|
+
return provider.metadata;
|
|
43
|
+
}
|
|
37
44
|
list() {
|
|
38
45
|
return Array.from(this.providers.values())
|
|
39
46
|
.map(({ metadata }) => this.toMetadataResponse(metadata))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-node-registry.service.js","sourceRoot":"","sources":["../../../src/services/workflow/workflow-node-registry.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"workflow-node-registry.service.js","sourceRoot":"","sources":["../../../src/services/workflow/workflow-node-registry.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAKwB;AACxB,uCAA2D;AAE3D,wGAE2D;AAapD,IAAM,2BAA2B,mCAAjC,MAAM,2BAA2B;IAItC,YACmB,gBAAkC,EAClC,SAAoB;QADpB,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,cAAS,GAAT,SAAS,CAAW;QALtB,WAAM,GAAG,IAAI,eAAM,CAAC,6BAA2B,CAAC,IAAI,CAAC,CAAC;QACtD,cAAS,GAAG,IAAI,GAAG,EAA0C,CAAC;IAK5E,CAAC;IAEJ,YAAY;QACV,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,EAAE,CAAC;YAC5D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,uCAAuC,KAAK,CAAC,IAAI,CAC/C,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CACtB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACf,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,IAAY;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,4BAAmB,CAC3B,kDAAkD,IAAI,IAAI,CAC3D,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,4BAAmB,CAC3B,kDAAkD,IAAI,IAAI,CAC3D,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;aACvC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;aACxD,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;YACzC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;YAC3C,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;gBACnC,OAAO,YAAY,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YACnD,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;IACP,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAEO,gBAAgB,CAAC,QAAyB;QAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACnC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YAChD,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CACjC,kEAA+B,EAC/B,QAAQ,CACT,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAA2C,CAAC;QACtE,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,2BAA2B,QAAQ,CAAC,IAAI,+BAA+B,CACxE,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,0CAA0C,QAAQ,CAAC,IAAI,YAAY,CACpE,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IAEO,kBAAkB,CACxB,QAAsC;QAEtC,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE,EAAE,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC;QAExD,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACb,CAAC,CAAC;oBACE,GAAG,QAAQ,CAAC,EAAE;oBACd,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,YAAY;iBACvC;gBACH,CAAC,CAAC,YAAY;oBACZ,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE;oBACxB,CAAC,CAAC,SAAS;SAChB,CAAC;IACJ,CAAC;CACF,CAAA;AAhIY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,mBAAU,GAAE;qCAM0B,uBAAgB;QACvB,gBAAS;GAN5B,2BAA2B,CAgIvC","sourcesContent":["import {\n BadRequestException,\n Injectable,\n Logger,\n OnModuleInit,\n} from '@nestjs/common';\nimport { DiscoveryService, Reflector } from '@nestjs/core';\nimport { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';\nimport {\n WORKFLOW_NODE_PROVIDER_METADATA,\n} from '../../decorators/workflow-node-provider.decorator';\nimport { WorkflowNodeHandler } from '../../interfaces/workflow-node-handler.interface';\nimport {\n WorkflowNodeMetadataResponse,\n WorkflowNodeProviderMetadata,\n} from '../../types/workflow-dsl.types';\n\ninterface RegisteredWorkflowNodeProvider {\n metadata: WorkflowNodeProviderMetadata;\n handler: WorkflowNodeHandler;\n}\n\n@Injectable()\nexport class WorkflowNodeRegistryService implements OnModuleInit {\n private readonly logger = new Logger(WorkflowNodeRegistryService.name);\n private readonly providers = new Map<string, RegisteredWorkflowNodeProvider>();\n\n constructor(\n private readonly discoveryService: DiscoveryService,\n private readonly reflector: Reflector,\n ) {}\n\n onModuleInit() {\n for (const provider of this.discoveryService.getProviders()) {\n this.registerProvider(provider);\n }\n\n this.logger.log(\n `Registered workflow node providers: ${Array.from(\n this.providers.keys(),\n ).join(', ')}`,\n );\n }\n\n get(type: string): WorkflowNodeHandler {\n const provider = this.providers.get(type);\n if (!provider) {\n throw new BadRequestException(\n `No workflow node provider registered for type \"${type}\".`,\n );\n }\n\n return provider.handler;\n }\n\n getMetadata(type: string): WorkflowNodeProviderMetadata {\n const provider = this.providers.get(type);\n if (!provider) {\n throw new BadRequestException(\n `No workflow node provider registered for type \"${type}\".`,\n );\n }\n\n return provider.metadata;\n }\n\n list(): WorkflowNodeMetadataResponse[] {\n return Array.from(this.providers.values())\n .map(({ metadata }) => this.toMetadataResponse(metadata))\n .sort((left, right) => {\n const leftCategory = left.category ?? '';\n const rightCategory = right.category ?? '';\n if (leftCategory !== rightCategory) {\n return leftCategory.localeCompare(rightCategory);\n }\n\n return (left.label ?? left.type).localeCompare(right.label ?? right.type);\n });\n }\n\n has(type: string): boolean {\n return this.providers.has(type);\n }\n\n private registerProvider(provider: InstanceWrapper) {\n const metatype = provider.metatype;\n if (!metatype || typeof metatype !== 'function') {\n return;\n }\n\n const metadata = this.reflector.get<WorkflowNodeProviderMetadata>(\n WORKFLOW_NODE_PROVIDER_METADATA,\n metatype,\n );\n\n if (!metadata?.type) {\n return;\n }\n\n const instance = provider.instance as WorkflowNodeHandler | undefined;\n if (!instance || typeof instance.execute !== 'function') {\n this.logger.warn(\n `Workflow node provider \"${metadata.type}\" has no executable instance.`,\n );\n return;\n }\n\n if (this.providers.has(metadata.type)) {\n this.logger.warn(\n `Duplicate workflow node provider type \"${metadata.type}\" ignored.`,\n );\n return;\n }\n\n this.providers.set(metadata.type, { metadata, handler: instance });\n }\n\n private toMetadataResponse(\n metadata: WorkflowNodeProviderMetadata,\n ): WorkflowNodeMetadataResponse {\n const resolvedIcon = metadata.ui?.icon ?? metadata.icon;\n\n return {\n type: metadata.type,\n kind: metadata.kind,\n version: metadata.version,\n category: metadata.category,\n subcategory: metadata.subcategory,\n label: metadata.label,\n description: metadata.description,\n icon: resolvedIcon,\n tags: metadata.tags,\n configSchema: metadata.configSchema,\n uiSchema: metadata.uiSchema,\n outputSchema: metadata.outputSchema,\n examples: metadata.examples,\n metrics: metadata.metrics,\n definitions: metadata.definitions,\n authoring: metadata.authoring,\n runtime: metadata.runtime,\n documentation: metadata.documentation,\n ui: metadata.ui\n ? {\n ...metadata.ui,\n icon: metadata.ui.icon ?? resolvedIcon,\n }\n : resolvedIcon\n ? { icon: resolvedIcon }\n : undefined,\n };\n }\n}\n"]}
|
|
@@ -36,6 +36,11 @@ export declare class WorkflowRuntimeService {
|
|
|
36
36
|
private resolveWorkflowVariables;
|
|
37
37
|
private runNodes;
|
|
38
38
|
private runNode;
|
|
39
|
+
private runGlobalErrorHandlers;
|
|
40
|
+
private runFinallyHandlers;
|
|
41
|
+
private runLocalErrorHandlers;
|
|
42
|
+
private runErrorHandlers;
|
|
43
|
+
private buildErrorContext;
|
|
39
44
|
private assertDefinitionYaml;
|
|
40
45
|
private readEnqueuedExecutionRequest;
|
|
41
46
|
private findExecutionOrThrow;
|
|
@@ -46,6 +51,9 @@ export declare class WorkflowRuntimeService {
|
|
|
46
51
|
private nextLogSequence;
|
|
47
52
|
private countNodes;
|
|
48
53
|
private nodeLogMetadata;
|
|
54
|
+
private getRuntimeContextOutput;
|
|
55
|
+
private cloneOutput;
|
|
56
|
+
private deletePath;
|
|
49
57
|
private summarizeValue;
|
|
50
58
|
private errorMessage;
|
|
51
59
|
private summarizeError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-runtime.service.d.ts","sourceRoot":"","sources":["../../../src/services/workflow/workflow-runtime.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIxC,OAAO,EAEL,wBAAwB,EACxB,yBAAyB,EAG1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,kCAAkC,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAG3F,qBACa,sBAAsB;IAK/B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,iCAAiC;IAVpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;gBAI/C,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,2BAA2B,EACrC,UAAU,EAAE,yBAAyB,EACrC,MAAM,EAAE,8BAA8B,EACtC,SAAS,EAAE,kCAAkC,EAC7C,qBAAqB,EAAE,qBAAqB,EAC5C,iCAAiC,EAAE,gBAAgB,CAAC,6BAA6B,CAAC;IAG/F,qBAAqB,CACzB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,yBAAyB,CAAC;IAQ/B,0BAA0B,CAC9B,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,yBAAyB,CAAC;IAQ/B,sBAAsB,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,yBAAyB,CAAC;IAQ/B,2BAA2B,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,yBAAyB,CAAC;YAQvB,sBAAsB;YAqBtB,iBAAiB;IAiBzB,wBAAwB,CAC5B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,yBAAyB,CAAC;YAoBvB,iBAAiB;
|
|
1
|
+
{"version":3,"file":"workflow-runtime.service.d.ts","sourceRoot":"","sources":["../../../src/services/workflow/workflow-runtime.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -118,7 +118,11 @@ let WorkflowRuntimeService = WorkflowRuntimeService_1 = class WorkflowRuntimeSer
|
|
|
118
118
|
const execution = existingExecution
|
|
119
119
|
? await this.writer.startExecution(existingExecution, effectiveRequest)
|
|
120
120
|
: await this.writer.createExecution(definition, effectiveRequest);
|
|
121
|
-
const nodeCount = this.countNodes(
|
|
121
|
+
const nodeCount = this.countNodes([
|
|
122
|
+
...(definitionDsl.nodes ?? []),
|
|
123
|
+
...(definitionDsl.errors ?? []),
|
|
124
|
+
...(definitionDsl.finally ?? []),
|
|
125
|
+
]);
|
|
122
126
|
const outputs = {};
|
|
123
127
|
const runtimeContext = {
|
|
124
128
|
execution,
|
|
@@ -131,22 +135,48 @@ let WorkflowRuntimeService = WorkflowRuntimeService_1 = class WorkflowRuntimeSer
|
|
|
131
135
|
log: 0,
|
|
132
136
|
},
|
|
133
137
|
};
|
|
138
|
+
this.logger.log(`Starting workflow execution ${execution.executionIdentifier} for ${definition.key} with ${nodeCount} node(s).`);
|
|
139
|
+
await this.writer.writeLog(execution, undefined, {
|
|
140
|
+
level: 'info',
|
|
141
|
+
eventType: 'execution.started',
|
|
142
|
+
message: `Workflow execution started for ${definition.key}.`,
|
|
143
|
+
metadata: {
|
|
144
|
+
executionIdentifier: execution.executionIdentifier,
|
|
145
|
+
workflowKey: definition.key,
|
|
146
|
+
triggerType: execution.triggerType,
|
|
147
|
+
nodeCount,
|
|
148
|
+
inputKeys: Object.keys(runtimeContext.input ?? {}),
|
|
149
|
+
variableKeys: Object.keys(runtimeContext.variables ?? {}),
|
|
150
|
+
},
|
|
151
|
+
}, this.nextLogSequence(runtimeContext));
|
|
152
|
+
let executionError;
|
|
153
|
+
try {
|
|
154
|
+
await this.runNodes(definitionDsl.nodes, runtimeContext);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
executionError = error;
|
|
158
|
+
await this.runGlobalErrorHandlers(definitionDsl, runtimeContext, error);
|
|
159
|
+
}
|
|
134
160
|
try {
|
|
135
|
-
this.
|
|
161
|
+
await this.runFinallyHandlers(definitionDsl, runtimeContext);
|
|
162
|
+
}
|
|
163
|
+
catch (finallyError) {
|
|
136
164
|
await this.writer.writeLog(execution, undefined, {
|
|
137
|
-
level: '
|
|
138
|
-
eventType: '
|
|
139
|
-
message: `
|
|
165
|
+
level: 'error',
|
|
166
|
+
eventType: 'finally.failed',
|
|
167
|
+
message: `Finally handler failed: ${this.errorMessage(finallyError)}.`,
|
|
168
|
+
context: this.summarizeError(finallyError),
|
|
140
169
|
metadata: {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
nodeCount,
|
|
145
|
-
inputKeys: Object.keys(runtimeContext.input ?? {}),
|
|
146
|
-
variableKeys: Object.keys(runtimeContext.variables ?? {}),
|
|
170
|
+
originalError: executionError
|
|
171
|
+
? this.summarizeError(executionError)
|
|
172
|
+
: undefined,
|
|
147
173
|
},
|
|
148
174
|
}, this.nextLogSequence(runtimeContext));
|
|
149
|
-
|
|
175
|
+
if (!executionError) {
|
|
176
|
+
executionError = finallyError;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (!executionError) {
|
|
150
180
|
const completed = await this.writer.completeExecution(execution, outputs);
|
|
151
181
|
this.logger.log(`Completed workflow execution ${completed.executionIdentifier} for ${definition.key} in ${completed.durationMs ?? 0} ms.`);
|
|
152
182
|
await this.writer.writeLog(completed, undefined, {
|
|
@@ -161,21 +191,19 @@ let WorkflowRuntimeService = WorkflowRuntimeService_1 = class WorkflowRuntimeSer
|
|
|
161
191
|
}, this.nextLogSequence(runtimeContext));
|
|
162
192
|
return this.toResponse(completed);
|
|
163
193
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return this.toResponse(failed);
|
|
178
|
-
}
|
|
194
|
+
const failed = await this.writer.failExecution(execution, executionError);
|
|
195
|
+
this.logger.error(`Failed workflow execution ${failed.executionIdentifier} for ${definition.key}: ${failed.errorSummary}`, executionError instanceof Error ? executionError.stack : undefined);
|
|
196
|
+
await this.writer.writeLog(failed, undefined, {
|
|
197
|
+
level: 'error',
|
|
198
|
+
eventType: 'execution.failed',
|
|
199
|
+
message: failed.errorSummary,
|
|
200
|
+
context: this.summarizeError(executionError),
|
|
201
|
+
metadata: {
|
|
202
|
+
executionIdentifier: failed.executionIdentifier,
|
|
203
|
+
durationMs: failed.durationMs,
|
|
204
|
+
},
|
|
205
|
+
}, this.nextLogSequence(runtimeContext));
|
|
206
|
+
return this.toResponse(failed);
|
|
179
207
|
}
|
|
180
208
|
async getExecutionStatus(executionId) {
|
|
181
209
|
const execution = await this.findExecutionOrThrow(executionId);
|
|
@@ -263,10 +291,11 @@ let WorkflowRuntimeService = WorkflowRuntimeService_1 = class WorkflowRuntimeSer
|
|
|
263
291
|
});
|
|
264
292
|
}
|
|
265
293
|
async runNodes(nodes, context) {
|
|
294
|
+
const nodeOutputs = {};
|
|
266
295
|
for (const node of nodes ?? []) {
|
|
267
|
-
await this.runNode(node, context);
|
|
296
|
+
nodeOutputs[node.id] = await this.runNode(node, context);
|
|
268
297
|
}
|
|
269
|
-
return
|
|
298
|
+
return nodeOutputs;
|
|
270
299
|
}
|
|
271
300
|
async runNode(node, context) {
|
|
272
301
|
const inputPayload = {
|
|
@@ -286,7 +315,7 @@ let WorkflowRuntimeService = WorkflowRuntimeService_1 = class WorkflowRuntimeSer
|
|
|
286
315
|
message: `Skipped disabled node ${node.id}.`,
|
|
287
316
|
metadata: this.nodeLogMetadata(node, context, step),
|
|
288
317
|
}, this.nextLogSequence(context));
|
|
289
|
-
return;
|
|
318
|
+
return context.outputs[node.id];
|
|
290
319
|
}
|
|
291
320
|
try {
|
|
292
321
|
await this.writer.writeLog(context.execution, step, {
|
|
@@ -319,7 +348,7 @@ let WorkflowRuntimeService = WorkflowRuntimeService_1 = class WorkflowRuntimeSer
|
|
|
319
348
|
},
|
|
320
349
|
});
|
|
321
350
|
const output = result.output ?? {};
|
|
322
|
-
context.outputs[node.id] = output;
|
|
351
|
+
context.outputs[node.id] = this.getRuntimeContextOutput(node, output);
|
|
323
352
|
for (const artifact of result.artifacts ?? []) {
|
|
324
353
|
await this.writer.writeArtifact(context.execution, step, artifact);
|
|
325
354
|
}
|
|
@@ -339,6 +368,7 @@ let WorkflowRuntimeService = WorkflowRuntimeService_1 = class WorkflowRuntimeSer
|
|
|
339
368
|
artifactCount: result.artifacts?.length ?? 0,
|
|
340
369
|
},
|
|
341
370
|
}, this.nextLogSequence(context));
|
|
371
|
+
return output;
|
|
342
372
|
}
|
|
343
373
|
catch (error) {
|
|
344
374
|
await this.writer.failStep(step, error);
|
|
@@ -353,7 +383,7 @@ let WorkflowRuntimeService = WorkflowRuntimeService_1 = class WorkflowRuntimeSer
|
|
|
353
383
|
context: this.summarizeError(error),
|
|
354
384
|
metadata: this.nodeLogMetadata(node, context, step),
|
|
355
385
|
}, this.nextLogSequence(context));
|
|
356
|
-
return;
|
|
386
|
+
return context.outputs[node.id];
|
|
357
387
|
}
|
|
358
388
|
await this.writer.writeLog(context.execution, step, {
|
|
359
389
|
level: 'error',
|
|
@@ -362,9 +392,106 @@ let WorkflowRuntimeService = WorkflowRuntimeService_1 = class WorkflowRuntimeSer
|
|
|
362
392
|
context: this.summarizeError(error),
|
|
363
393
|
metadata: this.nodeLogMetadata(node, context, step),
|
|
364
394
|
}, this.nextLogSequence(context));
|
|
395
|
+
await this.runLocalErrorHandlers(node, context, error);
|
|
365
396
|
throw error;
|
|
366
397
|
}
|
|
367
398
|
}
|
|
399
|
+
async runGlobalErrorHandlers(definitionDsl, context, error) {
|
|
400
|
+
const errorNodes = definitionDsl.errors ?? [];
|
|
401
|
+
if (!errorNodes.length) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
await this.runErrorHandlers(errorNodes, context, error, 'global', undefined, undefined);
|
|
405
|
+
}
|
|
406
|
+
async runFinallyHandlers(definitionDsl, context) {
|
|
407
|
+
const finallyNodes = definitionDsl.finally ?? [];
|
|
408
|
+
if (!finallyNodes.length) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
await this.writer.writeLog(context.execution, undefined, {
|
|
412
|
+
level: 'info',
|
|
413
|
+
eventType: 'finally.started',
|
|
414
|
+
message: 'Running workflow finally handlers.',
|
|
415
|
+
metadata: {
|
|
416
|
+
handlerNodeCount: finallyNodes.length,
|
|
417
|
+
},
|
|
418
|
+
}, this.nextLogSequence(context));
|
|
419
|
+
await this.runNodes(finallyNodes, context);
|
|
420
|
+
await this.writer.writeLog(context.execution, undefined, {
|
|
421
|
+
level: 'info',
|
|
422
|
+
eventType: 'finally.completed',
|
|
423
|
+
message: 'Workflow finally handlers completed.',
|
|
424
|
+
metadata: {
|
|
425
|
+
handlerNodeCount: finallyNodes.length,
|
|
426
|
+
},
|
|
427
|
+
}, this.nextLogSequence(context));
|
|
428
|
+
}
|
|
429
|
+
async runLocalErrorHandlers(node, context, error) {
|
|
430
|
+
const errorNodes = node.errors ?? [];
|
|
431
|
+
if (!errorNodes.length) {
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
await this.runErrorHandlers(errorNodes, context, error, 'local', node.id, context.stepExecution?.stepExecutionKey);
|
|
435
|
+
}
|
|
436
|
+
async runErrorHandlers(errorNodes, context, error, scope, sourceNodeId, sourceStepExecutionKey) {
|
|
437
|
+
const errorContext = this.buildErrorContext(error, sourceNodeId, sourceStepExecutionKey);
|
|
438
|
+
await this.writer.writeLog(context.execution, undefined, {
|
|
439
|
+
level: 'warn',
|
|
440
|
+
eventType: `error-handler.${scope}.started`,
|
|
441
|
+
message: scope === 'global'
|
|
442
|
+
? 'Running workflow-level error handlers.'
|
|
443
|
+
: `Running local error handlers for node ${sourceNodeId}.`,
|
|
444
|
+
context: errorContext,
|
|
445
|
+
metadata: {
|
|
446
|
+
sourceNodeId,
|
|
447
|
+
sourceStepExecutionKey,
|
|
448
|
+
handlerNodeCount: errorNodes.length,
|
|
449
|
+
},
|
|
450
|
+
}, this.nextLogSequence(context));
|
|
451
|
+
try {
|
|
452
|
+
await this.runNodes(errorNodes, {
|
|
453
|
+
...context,
|
|
454
|
+
error: errorContext,
|
|
455
|
+
parentNodeId: sourceNodeId ?? context.parentNodeId,
|
|
456
|
+
parentStepExecutionKey: sourceStepExecutionKey ?? context.parentStepExecutionKey,
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
catch (handlerError) {
|
|
460
|
+
await this.writer.writeLog(context.execution, undefined, {
|
|
461
|
+
level: 'error',
|
|
462
|
+
eventType: `error-handler.${scope}.failed`,
|
|
463
|
+
message: `Error handler failed: ${this.errorMessage(handlerError)}.`,
|
|
464
|
+
context: this.summarizeError(handlerError),
|
|
465
|
+
metadata: {
|
|
466
|
+
originalError: errorContext,
|
|
467
|
+
sourceNodeId,
|
|
468
|
+
sourceStepExecutionKey,
|
|
469
|
+
},
|
|
470
|
+
}, this.nextLogSequence(context));
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
await this.writer.writeLog(context.execution, undefined, {
|
|
474
|
+
level: 'info',
|
|
475
|
+
eventType: `error-handler.${scope}.completed`,
|
|
476
|
+
message: scope === 'global'
|
|
477
|
+
? 'Workflow-level error handlers completed.'
|
|
478
|
+
: `Local error handlers completed for node ${sourceNodeId}.`,
|
|
479
|
+
context: errorContext,
|
|
480
|
+
metadata: {
|
|
481
|
+
sourceNodeId,
|
|
482
|
+
sourceStepExecutionKey,
|
|
483
|
+
},
|
|
484
|
+
}, this.nextLogSequence(context));
|
|
485
|
+
}
|
|
486
|
+
buildErrorContext(error, nodeId, stepExecutionKey) {
|
|
487
|
+
const summary = this.summarizeError(error);
|
|
488
|
+
return {
|
|
489
|
+
...summary,
|
|
490
|
+
message: this.errorMessage(error),
|
|
491
|
+
nodeId,
|
|
492
|
+
stepExecutionKey,
|
|
493
|
+
};
|
|
494
|
+
}
|
|
368
495
|
assertDefinitionYaml(value) {
|
|
369
496
|
if (!value || typeof value !== 'string') {
|
|
370
497
|
throw new common_1.BadRequestException('Workflow definition YAML must be stored as a string.');
|
|
@@ -469,6 +596,7 @@ let WorkflowRuntimeService = WorkflowRuntimeService_1 = class WorkflowRuntimeSer
|
|
|
469
596
|
...(node.then ?? []),
|
|
470
597
|
...(node.else ?? []),
|
|
471
598
|
...(node.defaults ?? []),
|
|
599
|
+
...(node.errors ?? []),
|
|
472
600
|
...Object.values(node.cases ?? {}).flat(),
|
|
473
601
|
];
|
|
474
602
|
return count + 1 + this.countNodes(nestedNodes);
|
|
@@ -494,6 +622,43 @@ let WorkflowRuntimeService = WorkflowRuntimeService_1 = class WorkflowRuntimeSer
|
|
|
494
622
|
availableOutputNodeIds: Object.keys(context.outputs ?? {}),
|
|
495
623
|
};
|
|
496
624
|
}
|
|
625
|
+
getRuntimeContextOutput(node, output) {
|
|
626
|
+
const hiddenOutputPaths = this.registry
|
|
627
|
+
.getMetadata(node.type)
|
|
628
|
+
.authoring?.outputs?.filter((definition) => definition.includeInRuntimeContext === false)
|
|
629
|
+
.map((definition) => definition.path ?? definition.key)
|
|
630
|
+
.filter(Boolean) ?? [];
|
|
631
|
+
if (!hiddenOutputPaths.length || !output || typeof output !== 'object') {
|
|
632
|
+
return output;
|
|
633
|
+
}
|
|
634
|
+
const runtimeOutput = this.cloneOutput(output);
|
|
635
|
+
hiddenOutputPaths.forEach((path) => {
|
|
636
|
+
this.deletePath(runtimeOutput, path);
|
|
637
|
+
});
|
|
638
|
+
return runtimeOutput;
|
|
639
|
+
}
|
|
640
|
+
cloneOutput(output) {
|
|
641
|
+
if (typeof structuredClone === 'function') {
|
|
642
|
+
return structuredClone(output);
|
|
643
|
+
}
|
|
644
|
+
return JSON.parse(JSON.stringify(output));
|
|
645
|
+
}
|
|
646
|
+
deletePath(target, path) {
|
|
647
|
+
const parts = path.split('.').filter(Boolean);
|
|
648
|
+
if (!parts.length) {
|
|
649
|
+
return;
|
|
650
|
+
}
|
|
651
|
+
let cursor = target;
|
|
652
|
+
for (let index = 0; index < parts.length - 1; index += 1) {
|
|
653
|
+
cursor = cursor?.[parts[index]];
|
|
654
|
+
if (!cursor || typeof cursor !== 'object') {
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
if (cursor && typeof cursor === 'object') {
|
|
659
|
+
delete cursor[parts[parts.length - 1]];
|
|
660
|
+
}
|
|
661
|
+
}
|
|
497
662
|
summarizeValue(value) {
|
|
498
663
|
if (Array.isArray(value)) {
|
|
499
664
|
return {
|