@ductape/sdk 0.0.4 → 0.0.6
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/README.md +87 -53
- package/dist/agents/agent-context.d.ts +100 -0
- package/dist/agents/agent-context.js +604 -0
- package/dist/agents/agent-context.js.map +1 -0
- package/dist/agents/agent-executor.d.ts +180 -0
- package/dist/agents/agent-executor.js +715 -0
- package/dist/agents/agent-executor.js.map +1 -0
- package/dist/agents/agents.service.d.ts +310 -0
- package/dist/agents/agents.service.js +1253 -0
- package/dist/agents/agents.service.js.map +1 -0
- package/dist/agents/index.d.ts +55 -0
- package/dist/agents/index.js +110 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/memory-manager.d.ts +182 -0
- package/dist/agents/memory-manager.js +383 -0
- package/dist/agents/memory-manager.js.map +1 -0
- package/dist/agents/tool-registry.d.ts +141 -0
- package/dist/agents/tool-registry.js +355 -0
- package/dist/agents/tool-registry.js.map +1 -0
- package/dist/agents/types/agents.types.d.ts +1240 -0
- package/dist/agents/types/agents.types.js +12 -0
- package/dist/agents/types/agents.types.js.map +1 -0
- package/dist/agents/types/index.d.ts +6 -0
- package/dist/agents/types/index.js +23 -0
- package/dist/agents/types/index.js.map +1 -0
- package/dist/agents/vector-store-adapter.d.ts +108 -0
- package/dist/agents/vector-store-adapter.js +213 -0
- package/dist/agents/vector-store-adapter.js.map +1 -0
- package/dist/api/services/appApi.service.d.ts +51 -5
- package/dist/api/services/appApi.service.js +116 -9
- package/dist/api/services/appApi.service.js.map +1 -1
- package/dist/api/services/logsApi.service.d.ts +51 -0
- package/dist/api/services/logsApi.service.js +19 -2
- package/dist/api/services/logsApi.service.js.map +1 -1
- package/dist/api/services/pricingApi.service.d.ts +10 -0
- package/dist/api/services/pricingApi.service.js +34 -0
- package/dist/api/services/pricingApi.service.js.map +1 -0
- package/dist/api/services/processorApi.service.d.ts +900 -2
- package/dist/api/services/processorApi.service.js +665 -12
- package/dist/api/services/processorApi.service.js.map +1 -1
- package/dist/api/services/productsApi.service.d.ts +130 -1
- package/dist/api/services/productsApi.service.js +198 -11
- package/dist/api/services/productsApi.service.js.map +1 -1
- package/dist/api/services/resilienceApi.service.d.ts +106 -0
- package/dist/api/services/resilienceApi.service.js +224 -0
- package/dist/api/services/resilienceApi.service.js.map +1 -0
- package/dist/api/services/secretsApi.service.d.ts +50 -0
- package/dist/api/services/secretsApi.service.js +113 -0
- package/dist/api/services/secretsApi.service.js.map +1 -0
- package/dist/api/services/webhooksApi.service.js +13 -6
- package/dist/api/services/webhooksApi.service.js.map +1 -1
- package/dist/api/services/workflowApi.service.d.ts +199 -0
- package/dist/api/services/workflowApi.service.js +201 -0
- package/dist/api/services/workflowApi.service.js.map +1 -0
- package/dist/api/services/workspaceApi.service.d.ts +8 -0
- package/dist/api/services/workspaceApi.service.js +20 -0
- package/dist/api/services/workspaceApi.service.js.map +1 -1
- package/dist/api/urls.d.ts +92 -1
- package/dist/api/urls.js +118 -18
- package/dist/api/urls.js.map +1 -1
- package/dist/api/utils/auth.utils.d.ts +1 -3
- package/dist/api/utils/auth.utils.js.map +1 -1
- package/dist/api/utils/cache.utils.d.ts +1 -1
- package/dist/api/utils/cache.utils.js +2 -2
- package/dist/api/utils/cache.utils.js.map +1 -1
- package/dist/api/utils/strings.utils.d.ts +2 -0
- package/dist/api/utils/strings.utils.js +14 -0
- package/dist/api/utils/strings.utils.js.map +1 -1
- package/dist/apps/services/app.service.d.ts +42 -33
- package/dist/apps/services/app.service.js +574 -223
- package/dist/apps/services/app.service.js.map +1 -1
- package/dist/apps/utils/auth-context-manager.d.ts +137 -0
- package/dist/apps/utils/auth-context-manager.js +248 -0
- package/dist/apps/utils/auth-context-manager.js.map +1 -0
- package/dist/apps/utils/credential-manager.d.ts +128 -0
- package/dist/apps/utils/credential-manager.js +199 -0
- package/dist/apps/utils/credential-manager.js.map +1 -0
- package/dist/apps/utils/index.d.ts +10 -0
- package/dist/apps/utils/index.js +54 -0
- package/dist/apps/utils/index.js.map +1 -0
- package/dist/apps/utils/input-helpers.d.ts +67 -0
- package/dist/apps/utils/input-helpers.js +185 -0
- package/dist/apps/utils/input-helpers.js.map +1 -0
- package/dist/apps/utils/input-resolver.d.ts +165 -0
- package/dist/apps/utils/input-resolver.js +477 -0
- package/dist/apps/utils/input-resolver.js.map +1 -0
- package/dist/apps/utils/oauth-manager.d.ts +196 -0
- package/dist/apps/utils/oauth-manager.js +429 -0
- package/dist/apps/utils/oauth-manager.js.map +1 -0
- package/dist/apps/validators/joi-validators/create.appAction.validator.d.ts +1 -2
- package/dist/apps/validators/joi-validators/create.appAction.validator.js +22 -2
- package/dist/apps/validators/joi-validators/create.appAction.validator.js.map +1 -1
- package/dist/apps/validators/joi-validators/update.app.validator.js +2 -0
- package/dist/apps/validators/joi-validators/update.app.validator.js.map +1 -1
- package/dist/apps/validators/joi-validators/update.appAction.validator.js +23 -2
- package/dist/apps/validators/joi-validators/update.appAction.validator.js.map +1 -1
- package/dist/apps/validators/joi-validators/update.appActionResponse.validator.d.ts +1 -1
- package/dist/apps/validators/joi-validators/update.appActionResponse.validator.js +34 -1
- package/dist/apps/validators/joi-validators/update.appActionResponse.validator.js.map +1 -1
- package/dist/bin.d.ts +26 -0
- package/dist/bin.js +28 -0
- package/dist/bin.js.map +1 -0
- package/dist/brokers/brokers.service.d.ts +435 -0
- package/dist/brokers/brokers.service.js +1205 -0
- package/dist/brokers/brokers.service.js.map +1 -0
- package/dist/brokers/index.d.ts +46 -0
- package/dist/brokers/index.js +83 -0
- package/dist/brokers/index.js.map +1 -0
- package/dist/brokers/types/index.d.ts +567 -0
- package/dist/brokers/types/index.js +8 -0
- package/dist/brokers/types/index.js.map +1 -0
- package/dist/brokers/utils/broker.util.d.ts +33 -0
- package/dist/brokers/utils/broker.util.js +125 -0
- package/dist/brokers/utils/broker.util.js.map +1 -0
- package/dist/{processor/services/messagebrokers → brokers/utils/providers}/aws-sqs.service.d.ts +3 -2
- package/dist/brokers/utils/providers/aws-sqs.service.js +71 -0
- package/dist/brokers/utils/providers/aws-sqs.service.js.map +1 -0
- package/dist/{processor/services/messagebrokers → brokers/utils/providers}/google-pubsub.service.d.ts +2 -2
- package/dist/{processor/services/messagebrokers → brokers/utils/providers}/google-pubsub.service.js +16 -7
- package/dist/brokers/utils/providers/google-pubsub.service.js.map +1 -0
- package/dist/brokers/utils/providers/index.d.ts +6 -0
- package/dist/brokers/utils/providers/index.js +16 -0
- package/dist/brokers/utils/providers/index.js.map +1 -0
- package/dist/brokers/utils/providers/kafka.service.d.ts +23 -0
- package/dist/brokers/utils/providers/kafka.service.js +131 -0
- package/dist/brokers/utils/providers/kafka.service.js.map +1 -0
- package/dist/brokers/utils/providers/nats.service.d.ts +18 -0
- package/dist/brokers/utils/providers/nats.service.js +63 -0
- package/dist/brokers/utils/providers/nats.service.js.map +1 -0
- package/dist/brokers/utils/providers/rabbitmq.service.d.ts +25 -0
- package/dist/brokers/utils/providers/rabbitmq.service.js +138 -0
- package/dist/brokers/utils/providers/rabbitmq.service.js.map +1 -0
- package/dist/{processor/services/messagebrokers → brokers/utils/providers}/redis.service.d.ts +3 -3
- package/dist/{processor/services/messagebrokers → brokers/utils/providers}/redis.service.js +25 -14
- package/dist/brokers/utils/providers/redis.service.js.map +1 -0
- package/dist/cache/cache.manager.d.ts +308 -0
- package/dist/cache/cache.manager.js +900 -0
- package/dist/cache/cache.manager.js.map +1 -0
- package/dist/cache/cache.service.d.ts +191 -0
- package/dist/cache/cache.service.js +594 -0
- package/dist/cache/cache.service.js.map +1 -0
- package/dist/cache/index.d.ts +52 -0
- package/dist/cache/index.js +81 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/types/index.d.ts +110 -0
- package/dist/cache/types/index.js +6 -0
- package/dist/cache/types/index.js.map +1 -0
- package/dist/clients/apps.client.js +1 -1
- package/dist/clients/apps.client.js.map +1 -1
- package/dist/clients/pricing.client.d.ts +3 -0
- package/dist/clients/pricing.client.js +33 -0
- package/dist/clients/pricing.client.js.map +1 -0
- package/dist/database/actions/action-manager.d.ts +170 -0
- package/dist/database/actions/action-manager.js +465 -0
- package/dist/database/actions/action-manager.js.map +1 -0
- package/dist/database/actions/index.d.ts +6 -0
- package/dist/database/actions/index.js +13 -0
- package/dist/database/actions/index.js.map +1 -0
- package/dist/database/adapters/adapter.factory.d.ts +62 -0
- package/dist/database/adapters/adapter.factory.js +97 -0
- package/dist/database/adapters/adapter.factory.js.map +1 -0
- package/dist/database/adapters/base.adapter.d.ts +423 -0
- package/dist/database/adapters/base.adapter.js +260 -0
- package/dist/database/adapters/base.adapter.js.map +1 -0
- package/dist/database/adapters/cassandra.adapter.d.ts +92 -0
- package/dist/database/adapters/cassandra.adapter.js +1091 -0
- package/dist/database/adapters/cassandra.adapter.js.map +1 -0
- package/dist/database/adapters/dynamodb.adapter.d.ts +110 -0
- package/dist/database/adapters/dynamodb.adapter.js +1564 -0
- package/dist/database/adapters/dynamodb.adapter.js.map +1 -0
- package/dist/database/adapters/index.d.ts +11 -0
- package/dist/database/adapters/index.js +27 -0
- package/dist/database/adapters/index.js.map +1 -0
- package/dist/database/adapters/mariadb.adapter.d.ts +100 -0
- package/dist/database/adapters/mariadb.adapter.js +247 -0
- package/dist/database/adapters/mariadb.adapter.js.map +1 -0
- package/dist/database/adapters/mongodb.adapter.d.ts +121 -0
- package/dist/database/adapters/mongodb.adapter.js +1284 -0
- package/dist/database/adapters/mongodb.adapter.js.map +1 -0
- package/dist/database/adapters/mysql.adapter.d.ts +86 -0
- package/dist/database/adapters/mysql.adapter.js +1371 -0
- package/dist/database/adapters/mysql.adapter.js.map +1 -0
- package/dist/database/adapters/postgresql.adapter.d.ts +90 -0
- package/dist/database/adapters/postgresql.adapter.js +1487 -0
- package/dist/database/adapters/postgresql.adapter.js.map +1 -0
- package/dist/database/databases.service.d.ts +1476 -0
- package/dist/database/databases.service.js +3068 -0
- package/dist/database/databases.service.js.map +1 -0
- package/dist/database/index.d.ts +46 -0
- package/dist/database/index.js +109 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/migrations/index.d.ts +6 -0
- package/dist/database/migrations/index.js +12 -0
- package/dist/database/migrations/index.js.map +1 -0
- package/dist/database/migrations/migration-engine.d.ts +136 -0
- package/dist/database/migrations/migration-engine.js +1421 -0
- package/dist/database/migrations/migration-engine.js.map +1 -0
- package/dist/database/operators/aggregation-builder.d.ts +67 -0
- package/dist/database/operators/aggregation-builder.js +841 -0
- package/dist/database/operators/aggregation-builder.js.map +1 -0
- package/dist/database/operators/index.d.ts +7 -0
- package/dist/database/operators/index.js +15 -0
- package/dist/database/operators/index.js.map +1 -0
- package/dist/database/operators/query-builder.d.ts +69 -0
- package/dist/database/operators/query-builder.js +447 -0
- package/dist/database/operators/query-builder.js.map +1 -0
- package/dist/database/presave/decrypt.d.ts +25 -0
- package/dist/database/presave/decrypt.js +146 -0
- package/dist/database/presave/decrypt.js.map +1 -0
- package/dist/database/presave/index.d.ts +9 -0
- package/dist/database/presave/index.js +18 -0
- package/dist/database/presave/index.js.map +1 -0
- package/dist/database/presave/presave-processor.d.ts +148 -0
- package/dist/database/presave/presave-processor.js +702 -0
- package/dist/database/presave/presave-processor.js.map +1 -0
- package/dist/database/schema/index.d.ts +7 -0
- package/dist/database/schema/index.js +13 -0
- package/dist/database/schema/index.js.map +1 -0
- package/dist/database/schema/schema-manager.d.ts +258 -0
- package/dist/database/schema/schema-manager.js +638 -0
- package/dist/database/schema/schema-manager.js.map +1 -0
- package/dist/database/transactions/index.d.ts +6 -0
- package/dist/database/transactions/index.js +13 -0
- package/dist/database/transactions/index.js.map +1 -0
- package/dist/database/transactions/transaction-manager.d.ts +113 -0
- package/dist/database/transactions/transaction-manager.js +344 -0
- package/dist/database/transactions/transaction-manager.js.map +1 -0
- package/dist/database/triggers/index.d.ts +7 -0
- package/dist/database/triggers/index.js +14 -0
- package/dist/database/triggers/index.js.map +1 -0
- package/dist/database/triggers/trigger-processor.d.ts +239 -0
- package/dist/database/triggers/trigger-processor.js +1034 -0
- package/dist/database/triggers/trigger-processor.js.map +1 -0
- package/dist/database/types/action.interface.d.ts +148 -0
- package/dist/database/types/action.interface.js +6 -0
- package/dist/database/types/action.interface.js.map +1 -0
- package/dist/database/types/aggregation.interface.d.ts +185 -0
- package/dist/database/types/aggregation.interface.js +6 -0
- package/dist/database/types/aggregation.interface.js.map +1 -0
- package/dist/database/types/connection.interface.d.ts +137 -0
- package/dist/database/types/connection.interface.js +6 -0
- package/dist/database/types/connection.interface.js.map +1 -0
- package/dist/database/types/dashboard.interface.d.ts +74 -0
- package/dist/database/types/dashboard.interface.js +7 -0
- package/dist/database/types/dashboard.interface.js.map +1 -0
- package/dist/database/types/enums.d.ts +195 -0
- package/dist/database/types/enums.js +244 -0
- package/dist/database/types/enums.js.map +1 -0
- package/dist/database/types/index.d.ts +15 -0
- package/dist/database/types/index.js +31 -0
- package/dist/database/types/index.js.map +1 -0
- package/dist/database/types/migration.interface.d.ts +686 -0
- package/dist/database/types/migration.interface.js +9 -0
- package/dist/database/types/migration.interface.js.map +1 -0
- package/dist/database/types/presave.interface.d.ts +292 -0
- package/dist/database/types/presave.interface.js +60 -0
- package/dist/database/types/presave.interface.js.map +1 -0
- package/dist/database/types/query.interface.d.ts +205 -0
- package/dist/database/types/query.interface.js +6 -0
- package/dist/database/types/query.interface.js.map +1 -0
- package/dist/database/types/schema.interface.d.ts +412 -0
- package/dist/database/types/schema.interface.js +6 -0
- package/dist/database/types/schema.interface.js.map +1 -0
- package/dist/database/types/transaction.interface.d.ts +84 -0
- package/dist/database/types/transaction.interface.js +6 -0
- package/dist/database/types/transaction.interface.js.map +1 -0
- package/dist/database/types/trigger.interface.d.ts +612 -0
- package/dist/database/types/trigger.interface.js +121 -0
- package/dist/database/types/trigger.interface.js.map +1 -0
- package/dist/database/types/write.interface.d.ts +216 -0
- package/dist/database/types/write.interface.js +6 -0
- package/dist/database/types/write.interface.js.map +1 -0
- package/dist/database/utils/database-error.d.ts +96 -0
- package/dist/database/utils/database-error.js +221 -0
- package/dist/database/utils/database-error.js.map +1 -0
- package/dist/database/utils/index.d.ts +6 -0
- package/dist/database/utils/index.js +11 -0
- package/dist/database/utils/index.js.map +1 -0
- package/dist/graph/adapters/adapter.factory.d.ts +47 -0
- package/dist/graph/adapters/adapter.factory.js +77 -0
- package/dist/graph/adapters/adapter.factory.js.map +1 -0
- package/dist/graph/adapters/arangodb.adapter.d.ts +86 -0
- package/dist/graph/adapters/arangodb.adapter.js +1588 -0
- package/dist/graph/adapters/arangodb.adapter.js.map +1 -0
- package/dist/graph/adapters/base.adapter.d.ts +264 -0
- package/dist/graph/adapters/base.adapter.js +156 -0
- package/dist/graph/adapters/base.adapter.js.map +1 -0
- package/dist/graph/adapters/index.d.ts +11 -0
- package/dist/graph/adapters/index.js +21 -0
- package/dist/graph/adapters/index.js.map +1 -0
- package/dist/graph/adapters/memgraph.adapter.d.ts +110 -0
- package/dist/graph/adapters/memgraph.adapter.js +1452 -0
- package/dist/graph/adapters/memgraph.adapter.js.map +1 -0
- package/dist/graph/adapters/neo4j.adapter.d.ts +81 -0
- package/dist/graph/adapters/neo4j.adapter.js +1317 -0
- package/dist/graph/adapters/neo4j.adapter.js.map +1 -0
- package/dist/graph/adapters/neptune.adapter.d.ts +82 -0
- package/dist/graph/adapters/neptune.adapter.js +1369 -0
- package/dist/graph/adapters/neptune.adapter.js.map +1 -0
- package/dist/graph/graphs.service.d.ts +606 -0
- package/dist/graph/graphs.service.js +2434 -0
- package/dist/graph/graphs.service.js.map +1 -0
- package/dist/graph/index.d.ts +57 -0
- package/dist/graph/index.js +77 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/transactions/index.d.ts +4 -0
- package/dist/graph/transactions/index.js +9 -0
- package/dist/graph/transactions/index.js.map +1 -0
- package/dist/graph/transactions/transaction-manager.d.ts +61 -0
- package/dist/graph/transactions/transaction-manager.js +126 -0
- package/dist/graph/transactions/transaction-manager.js.map +1 -0
- package/dist/graph/types/connection.interface.d.ts +149 -0
- package/dist/graph/types/connection.interface.js +9 -0
- package/dist/graph/types/connection.interface.js.map +1 -0
- package/dist/graph/types/enums.d.ts +101 -0
- package/dist/graph/types/enums.js +114 -0
- package/dist/graph/types/enums.js.map +1 -0
- package/dist/graph/types/index.d.ts +13 -0
- package/dist/graph/types/index.js +20 -0
- package/dist/graph/types/index.js.map +1 -0
- package/dist/graph/types/node.interface.d.ts +248 -0
- package/dist/graph/types/node.interface.js +9 -0
- package/dist/graph/types/node.interface.js.map +1 -0
- package/dist/graph/types/query.interface.d.ts +175 -0
- package/dist/graph/types/query.interface.js +9 -0
- package/dist/graph/types/query.interface.js.map +1 -0
- package/dist/graph/types/relationship.interface.d.ts +207 -0
- package/dist/graph/types/relationship.interface.js +9 -0
- package/dist/graph/types/relationship.interface.js.map +1 -0
- package/dist/graph/types/schema.interface.d.ts +295 -0
- package/dist/graph/types/schema.interface.js +9 -0
- package/dist/graph/types/schema.interface.js.map +1 -0
- package/dist/graph/types/transaction.interface.d.ts +55 -0
- package/dist/graph/types/transaction.interface.js +9 -0
- package/dist/graph/types/transaction.interface.js.map +1 -0
- package/dist/graph/types/traversal.interface.d.ts +181 -0
- package/dist/graph/types/traversal.interface.js +9 -0
- package/dist/graph/types/traversal.interface.js.map +1 -0
- package/dist/graph/utils/graph-error.d.ts +71 -0
- package/dist/graph/utils/graph-error.js +142 -0
- package/dist/graph/utils/graph-error.js.map +1 -0
- package/dist/graph/utils/index.d.ts +4 -0
- package/dist/graph/utils/index.js +9 -0
- package/dist/graph/utils/index.js.map +1 -0
- package/dist/imports/imports.service.d.ts +3 -3
- package/dist/imports/imports.service.js +8 -7
- package/dist/imports/imports.service.js.map +1 -1
- package/dist/imports/imports.types.d.ts +8 -0
- package/dist/imports/repos/openApi.repo.d.ts +1 -2
- package/dist/imports/repos/openApi.repo.js +409 -70
- package/dist/imports/repos/openApi.repo.js.map +1 -1
- package/dist/imports/repos/postmanV21.repo.d.ts +1 -1
- package/dist/imports/repos/postmanV21.repo.js +126 -83
- package/dist/imports/repos/postmanV21.repo.js.map +1 -1
- package/dist/index.d.ts +3926 -269
- package/dist/index.js +5475 -682
- package/dist/index.js.map +1 -1
- package/dist/init.interface.d.ts +407 -0
- package/dist/{processor/services/messagebrokers/messagebrokers.type.js → init.interface.js} +1 -1
- package/dist/init.interface.js.map +1 -0
- package/dist/inputs/inputs.service.d.ts +1 -1
- package/dist/inputs/inputs.service.js +2 -2
- package/dist/inputs/inputs.service.js.map +1 -1
- package/dist/inputs/utils/inputs.utils.create.js +1 -1
- package/dist/inputs/utils/inputs.utils.create.js.map +1 -1
- package/dist/jobs/index.d.ts +38 -0
- package/dist/jobs/index.js +50 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/jobs.service.d.ts +154 -0
- package/dist/jobs/jobs.service.js +491 -0
- package/dist/jobs/jobs.service.js.map +1 -0
- package/dist/jobs/jobs.state.d.ts +113 -0
- package/dist/jobs/jobs.state.js +447 -0
- package/dist/jobs/jobs.state.js.map +1 -0
- package/dist/jobs/types.d.ts +449 -0
- package/dist/jobs/types.js +74 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/logs/logs.service.js +6 -1
- package/dist/logs/logs.service.js.map +1 -1
- package/dist/logs/logs.types.d.ts +33 -1
- package/dist/logs/logs.types.js +17 -0
- package/dist/logs/logs.types.js.map +1 -1
- package/dist/models/index.d.ts +6 -0
- package/dist/models/index.js +11 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/models.service.d.ts +137 -0
- package/dist/models/models.service.js +195 -0
- package/dist/models/models.service.js.map +1 -0
- package/dist/notifications/index.d.ts +13 -0
- package/dist/notifications/index.js +26 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/notifications.service.d.ts +268 -0
- package/dist/notifications/notifications.service.js +905 -0
- package/dist/notifications/notifications.service.js.map +1 -0
- package/dist/notifications/types/index.d.ts +4 -0
- package/dist/notifications/types/index.js +21 -0
- package/dist/notifications/types/index.js.map +1 -0
- package/dist/notifications/types/notifications.types.d.ts +452 -0
- package/dist/notifications/types/notifications.types.js +49 -0
- package/dist/notifications/types/notifications.types.js.map +1 -0
- package/dist/parsers/index.d.ts +3 -0
- package/dist/parsers/index.js +27 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/pipelines/postman.pipelines.d.ts +15 -0
- package/dist/parsers/pipelines/postman.pipelines.js +103 -0
- package/dist/parsers/pipelines/postman.pipelines.js.map +1 -0
- package/dist/parsers/types/postman.types.d.ts +200 -0
- package/dist/parsers/types/postman.types.js +3 -0
- package/dist/parsers/types/postman.types.js.map +1 -0
- package/dist/parsers/utils/postman.utils.d.ts +12 -0
- package/dist/parsers/utils/postman.utils.js +116 -0
- package/dist/parsers/utils/postman.utils.js.map +1 -0
- package/dist/parsers/validators/postman-auth.validators.d.ts +10 -0
- package/dist/parsers/validators/postman-auth.validators.js +127 -0
- package/dist/parsers/validators/postman-auth.validators.js.map +1 -0
- package/dist/parsers/validators/postman-request.validators.d.ts +13 -0
- package/dist/parsers/validators/postman-request.validators.js +139 -0
- package/dist/parsers/validators/postman-request.validators.js.map +1 -0
- package/dist/parsers/validators/postman-response.validators.d.ts +13 -0
- package/dist/parsers/validators/postman-response.validators.js +150 -0
- package/dist/parsers/validators/postman-response.validators.js.map +1 -0
- package/dist/parsers/validators/postman-variable.validators.d.ts +14 -0
- package/dist/parsers/validators/postman-variable.validators.js +163 -0
- package/dist/parsers/validators/postman-variable.validators.js.map +1 -0
- package/dist/pricing/pricing.repo.js +1 -0
- package/dist/pricing/pricing.repo.js.map +1 -0
- package/dist/pricing/pricing.service.d.ts +24 -0
- package/dist/pricing/pricing.service.js +51 -0
- package/dist/pricing/pricing.service.js.map +1 -0
- package/dist/pricing/pricing.types.d.ts +76 -0
- package/dist/pricing/pricing.types.js +21 -0
- package/dist/pricing/pricing.types.js.map +1 -0
- package/dist/pricing/utils/string.utils.d.ts +1 -0
- package/dist/pricing/utils/string.utils.js +9 -0
- package/dist/pricing/utils/string.utils.js.map +1 -0
- package/dist/processor/repos/sms.repo.d.ts +4 -4
- package/dist/processor/repos/sms.repo.js +23 -10
- package/dist/processor/repos/sms.repo.js.map +1 -1
- package/dist/processor/services/processor.service.d.ts +251 -78
- package/dist/processor/services/processor.service.js +2803 -1495
- package/dist/processor/services/processor.service.js.map +1 -1
- package/dist/processor/services/request.service.d.ts +36 -0
- package/dist/processor/services/request.service.js +304 -0
- package/dist/processor/services/request.service.js.map +1 -0
- package/dist/processor/types/request.types.d.ts +14 -0
- package/dist/processor/types/request.types.js +3 -0
- package/dist/processor/types/request.types.js.map +1 -0
- package/dist/processor/utils/processor.utils.d.ts +8 -0
- package/dist/processor/utils/processor.utils.js +152 -12
- package/dist/processor/utils/processor.utils.js.map +1 -1
- package/dist/processor/utils/request.utils.d.ts +20 -0
- package/dist/processor/utils/request.utils.js +113 -0
- package/dist/processor/utils/request.utils.js.map +1 -0
- package/dist/processor/utils/storage.util.js +63 -40
- package/dist/processor/utils/storage.util.js.map +1 -1
- package/dist/products/services/products.service.d.ts +386 -76
- package/dist/products/services/products.service.js +3221 -419
- package/dist/products/services/products.service.js.map +1 -1
- package/dist/products/utils/string.utils.d.ts +1 -1
- package/dist/products/utils/string.utils.js +14 -2
- package/dist/products/utils/string.utils.js.map +1 -1
- package/dist/products/validators/index.d.ts +7 -1
- package/dist/products/validators/index.js +16 -1
- package/dist/products/validators/index.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productAgent.validator.d.ts +3 -0
- package/dist/products/validators/joi-validators/create.productAgent.validator.js +266 -0
- package/dist/products/validators/joi-validators/create.productAgent.validator.js.map +1 -0
- package/dist/products/validators/joi-validators/create.productApp.validator.js +2 -2
- package/dist/products/validators/joi-validators/create.productApp.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productDatabase.validator.js +5 -0
- package/dist/products/validators/joi-validators/create.productDatabase.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productEnv.validator.js +1 -0
- package/dist/products/validators/joi-validators/create.productEnv.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productFeature.validator.js +1 -1
- package/dist/products/validators/joi-validators/create.productGraph.validator.js +89 -0
- package/dist/products/validators/joi-validators/create.productGraph.validator.js.map +1 -0
- package/dist/products/validators/joi-validators/create.productHealthcheck.validator.d.ts +4 -0
- package/dist/{processor/services/messagebrokers/rabbitmq.service.js → products/validators/joi-validators/create.productHealthcheck.validator.js} +23 -32
- package/dist/products/validators/joi-validators/create.productHealthcheck.validator.js.map +1 -0
- package/dist/products/validators/joi-validators/create.productJob.validator.js +2 -2
- package/dist/products/validators/joi-validators/create.productJob.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productMessageBrokerTopic.validator.js +1 -0
- package/dist/products/validators/joi-validators/create.productMessageBrokerTopic.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productMessageBrokers.validator.js +81 -25
- package/dist/products/validators/joi-validators/create.productMessageBrokers.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productModel.validator.d.ts +3 -0
- package/dist/products/validators/joi-validators/create.productModel.validator.js +132 -0
- package/dist/products/validators/joi-validators/create.productModel.validator.js.map +1 -0
- package/dist/products/validators/joi-validators/create.productNotification.validator.js +150 -51
- package/dist/products/validators/joi-validators/create.productNotification.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productStorage.validator.js +77 -18
- package/dist/products/validators/joi-validators/create.productStorage.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/create.productVector.validator.d.ts +3 -0
- package/dist/products/validators/joi-validators/create.productVector.validator.js +136 -0
- package/dist/products/validators/joi-validators/create.productVector.validator.js.map +1 -0
- package/dist/products/validators/joi-validators/create.userAuth.validator.js +1 -0
- package/dist/products/validators/joi-validators/create.userAuth.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/update.dataValue.validator.js +1 -0
- package/dist/products/validators/joi-validators/update.dataValue.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/update.productDatabase.validator.js +5 -0
- package/dist/products/validators/joi-validators/update.productDatabase.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/update.productEnv.validator.js +3 -0
- package/dist/products/validators/joi-validators/update.productEnv.validator.js.map +1 -1
- package/dist/products/validators/joi-validators/update.productGraph.validator.js +88 -0
- package/dist/products/validators/joi-validators/update.productGraph.validator.js.map +1 -0
- package/dist/products/validators/joi-validators/update.userAuth.validator.js +1 -0
- package/dist/products/validators/joi-validators/update.userAuth.validator.js.map +1 -1
- package/dist/resilience/fallback.service.d.ts +141 -0
- package/dist/resilience/fallback.service.js +766 -0
- package/dist/resilience/fallback.service.js.map +1 -0
- package/dist/resilience/healthcheck.service.d.ts +159 -0
- package/dist/resilience/healthcheck.service.js +943 -0
- package/dist/resilience/healthcheck.service.js.map +1 -0
- package/dist/resilience/index.d.ts +104 -0
- package/dist/resilience/index.js +140 -0
- package/dist/resilience/index.js.map +1 -0
- package/dist/resilience/quota.service.d.ts +83 -0
- package/dist/resilience/quota.service.js +518 -0
- package/dist/resilience/quota.service.js.map +1 -0
- package/dist/resilience/resilience.service.d.ts +98 -0
- package/dist/resilience/resilience.service.js +560 -0
- package/dist/resilience/resilience.service.js.map +1 -0
- package/dist/resilience/types/index.d.ts +513 -0
- package/dist/resilience/types/index.js +29 -0
- package/dist/resilience/types/index.js.map +1 -0
- package/dist/secrets/index.d.ts +10 -0
- package/dist/secrets/index.js +33 -0
- package/dist/secrets/index.js.map +1 -0
- package/dist/secrets/secrets.resolver.d.ts +52 -0
- package/dist/secrets/secrets.resolver.js +236 -0
- package/dist/secrets/secrets.resolver.js.map +1 -0
- package/dist/secrets/secrets.service.d.ts +93 -0
- package/dist/secrets/secrets.service.js +246 -0
- package/dist/secrets/secrets.service.js.map +1 -0
- package/dist/secrets/secrets.types.d.ts +188 -0
- package/dist/secrets/secrets.types.js +87 -0
- package/dist/secrets/secrets.types.js.map +1 -0
- package/dist/sessions/index.d.ts +50 -0
- package/dist/sessions/index.js +96 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/sessions.helper.d.ts +88 -0
- package/dist/sessions/sessions.helper.js +133 -0
- package/dist/sessions/sessions.helper.js.map +1 -0
- package/dist/sessions/sessions.resolver.d.ts +188 -0
- package/dist/sessions/sessions.resolver.js +603 -0
- package/dist/sessions/sessions.resolver.js.map +1 -0
- package/dist/sessions/sessions.service.d.ts +194 -0
- package/dist/sessions/sessions.service.js +987 -0
- package/dist/sessions/sessions.service.js.map +1 -0
- package/dist/sessions/types/index.d.ts +342 -0
- package/dist/sessions/types/index.js +6 -0
- package/dist/sessions/types/index.js.map +1 -0
- package/dist/storage/index.d.ts +66 -0
- package/dist/storage/index.js +99 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/storage.service.d.ts +177 -0
- package/dist/storage/storage.service.js +897 -0
- package/dist/storage/storage.service.js.map +1 -0
- package/dist/storage/types/index.d.ts +267 -0
- package/dist/storage/types/index.js +6 -0
- package/dist/storage/types/index.js.map +1 -0
- package/dist/storage/utils/storage.util.d.ts +62 -0
- package/dist/storage/utils/storage.util.js +593 -0
- package/dist/storage/utils/storage.util.js.map +1 -0
- package/dist/types/appBuilder.types.d.ts +13 -14
- package/dist/types/enums.d.ts +11 -1
- package/dist/types/enums.js +10 -0
- package/dist/types/enums.js.map +1 -1
- package/dist/types/index.types.d.ts +9 -4
- package/dist/types/index.types.js +0 -1
- package/dist/types/index.types.js.map +1 -1
- package/dist/types/inputs.types.d.ts +1 -0
- package/dist/types/inputs.types.js +4 -3
- package/dist/types/inputs.types.js.map +1 -1
- package/dist/types/pricing.types.d.ts +4 -0
- package/dist/types/pricing.types.js +3 -0
- package/dist/types/pricing.types.js.map +1 -0
- package/dist/types/processor.types.d.ts +324 -18
- package/dist/types/processor.types.js +9 -1
- package/dist/types/processor.types.js.map +1 -1
- package/dist/types/productsBuilder.types.d.ts +1007 -23
- package/dist/types/productsBuilder.types.js +216 -2
- package/dist/types/productsBuilder.types.js.map +1 -1
- package/dist/types/request-tracker.interface.js +1 -0
- package/dist/types/request-tracker.interface.js.map +1 -0
- package/dist/types/requests.types.d.ts +2 -0
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.js +5 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/index.d.ts +0 -2
- package/dist/utils/index.js +24 -52
- package/dist/utils/index.js.map +1 -1
- package/dist/vector/actions/action-manager.d.ts +140 -0
- package/dist/vector/actions/action-manager.js +356 -0
- package/dist/vector/actions/action-manager.js.map +1 -0
- package/dist/vector/adapters/base.adapter.d.ts +169 -0
- package/dist/vector/adapters/base.adapter.js +218 -0
- package/dist/vector/adapters/base.adapter.js.map +1 -0
- package/dist/vector/adapters/index.d.ts +10 -0
- package/dist/vector/adapters/index.js +19 -0
- package/dist/vector/adapters/index.js.map +1 -0
- package/dist/vector/adapters/memory.adapter.d.ts +85 -0
- package/dist/vector/adapters/memory.adapter.js +505 -0
- package/dist/vector/adapters/memory.adapter.js.map +1 -0
- package/dist/vector/adapters/pinecone.adapter.d.ts +52 -0
- package/dist/vector/adapters/pinecone.adapter.js +433 -0
- package/dist/vector/adapters/pinecone.adapter.js.map +1 -0
- package/dist/vector/adapters/qdrant.adapter.d.ts +56 -0
- package/dist/vector/adapters/qdrant.adapter.js +442 -0
- package/dist/vector/adapters/qdrant.adapter.js.map +1 -0
- package/dist/vector/adapters/weaviate.adapter.d.ts +68 -0
- package/dist/vector/adapters/weaviate.adapter.js +661 -0
- package/dist/vector/adapters/weaviate.adapter.js.map +1 -0
- package/dist/vector/index.d.ts +36 -0
- package/dist/vector/index.js +70 -0
- package/dist/vector/index.js.map +1 -0
- package/dist/vector/types/action.interface.d.ts +195 -0
- package/dist/vector/types/action.interface.js +100 -0
- package/dist/vector/types/action.interface.js.map +1 -0
- package/dist/vector/types/connection.interface.d.ts +151 -0
- package/dist/vector/types/connection.interface.js +8 -0
- package/dist/vector/types/connection.interface.js.map +1 -0
- package/dist/vector/types/embedding.interface.d.ts +144 -0
- package/dist/vector/types/embedding.interface.js +8 -0
- package/dist/vector/types/embedding.interface.js.map +1 -0
- package/dist/vector/types/enums.d.ts +104 -0
- package/dist/vector/types/enums.js +113 -0
- package/dist/vector/types/enums.js.map +1 -0
- package/dist/vector/types/index.d.ts +11 -0
- package/dist/vector/types/index.js +23 -0
- package/dist/vector/types/index.js.map +1 -0
- package/dist/vector/types/vector.interface.d.ts +315 -0
- package/dist/vector/types/vector.interface.js +8 -0
- package/dist/vector/types/vector.interface.js.map +1 -0
- package/dist/vector/utils/index.d.ts +6 -0
- package/dist/vector/utils/index.js +11 -0
- package/dist/vector/utils/index.js.map +1 -0
- package/dist/vector/utils/vector-error.d.ts +69 -0
- package/dist/vector/utils/vector-error.js +116 -0
- package/dist/vector/utils/vector-error.js.map +1 -0
- package/dist/vector/vector-database.service.d.ts +476 -0
- package/dist/vector/vector-database.service.js +892 -0
- package/dist/vector/vector-database.service.js.map +1 -0
- package/dist/vector/vector.service.d.ts +283 -0
- package/dist/vector/vector.service.js +544 -0
- package/dist/vector/vector.service.js.map +1 -0
- package/dist/warehouse/executor/index.d.ts +5 -0
- package/dist/warehouse/executor/index.js +12 -0
- package/dist/warehouse/executor/index.js.map +1 -0
- package/dist/warehouse/executor/joins/index.d.ts +5 -0
- package/dist/warehouse/executor/joins/index.js +11 -0
- package/dist/warehouse/executor/joins/index.js.map +1 -0
- package/dist/warehouse/executor/joins/join-executor.d.ts +101 -0
- package/dist/warehouse/executor/joins/join-executor.js +493 -0
- package/dist/warehouse/executor/joins/join-executor.js.map +1 -0
- package/dist/warehouse/executor/joins/semantic-join.d.ts +64 -0
- package/dist/warehouse/executor/joins/semantic-join.js +241 -0
- package/dist/warehouse/executor/joins/semantic-join.js.map +1 -0
- package/dist/warehouse/executor/single-source-executor.d.ts +155 -0
- package/dist/warehouse/executor/single-source-executor.js +573 -0
- package/dist/warehouse/executor/single-source-executor.js.map +1 -0
- package/dist/warehouse/index.d.ts +79 -0
- package/dist/warehouse/index.js +111 -0
- package/dist/warehouse/index.js.map +1 -0
- package/dist/warehouse/parser/index.d.ts +4 -0
- package/dist/warehouse/parser/index.js +10 -0
- package/dist/warehouse/parser/index.js.map +1 -0
- package/dist/warehouse/parser/query-parser.d.ts +181 -0
- package/dist/warehouse/parser/query-parser.js +415 -0
- package/dist/warehouse/parser/query-parser.js.map +1 -0
- package/dist/warehouse/registry/data-source-registry.d.ts +207 -0
- package/dist/warehouse/registry/data-source-registry.js +396 -0
- package/dist/warehouse/registry/data-source-registry.js.map +1 -0
- package/dist/warehouse/registry/index.d.ts +4 -0
- package/dist/warehouse/registry/index.js +9 -0
- package/dist/warehouse/registry/index.js.map +1 -0
- package/dist/warehouse/transactions/index.d.ts +4 -0
- package/dist/warehouse/transactions/index.js +9 -0
- package/dist/warehouse/transactions/index.js.map +1 -0
- package/dist/warehouse/transactions/saga-orchestrator.d.ts +92 -0
- package/dist/warehouse/transactions/saga-orchestrator.js +383 -0
- package/dist/warehouse/transactions/saga-orchestrator.js.map +1 -0
- package/dist/warehouse/types/index.d.ts +9 -0
- package/dist/warehouse/types/index.js +33 -0
- package/dist/warehouse/types/index.js.map +1 -0
- package/dist/warehouse/types/join.interface.d.ts +225 -0
- package/dist/warehouse/types/join.interface.js +87 -0
- package/dist/warehouse/types/join.interface.js.map +1 -0
- package/dist/warehouse/types/query.interface.d.ts +232 -0
- package/dist/warehouse/types/query.interface.js +9 -0
- package/dist/warehouse/types/query.interface.js.map +1 -0
- package/dist/warehouse/types/transaction.interface.d.ts +236 -0
- package/dist/warehouse/types/transaction.interface.js +74 -0
- package/dist/warehouse/types/transaction.interface.js.map +1 -0
- package/dist/warehouse/types/where.interface.d.ts +208 -0
- package/dist/warehouse/types/where.interface.js +89 -0
- package/dist/warehouse/types/where.interface.js.map +1 -0
- package/dist/warehouse/warehouse.service.d.ts +200 -0
- package/dist/warehouse/warehouse.service.js +470 -0
- package/dist/warehouse/warehouse.service.js.map +1 -0
- package/dist/workflows/index.d.ts +30 -0
- package/dist/workflows/index.js +64 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/types/index.d.ts +6 -0
- package/dist/workflows/types/index.js +23 -0
- package/dist/workflows/types/index.js.map +1 -0
- package/dist/workflows/types/workflows.types.d.ts +1095 -0
- package/dist/workflows/types/workflows.types.js +13 -0
- package/dist/workflows/types/workflows.types.js.map +1 -0
- package/dist/workflows/workflow-builder.d.ts +70 -0
- package/dist/workflows/workflow-builder.js +353 -0
- package/dist/workflows/workflow-builder.js.map +1 -0
- package/dist/workflows/workflow-executor.d.ts +287 -0
- package/dist/workflows/workflow-executor.js +2399 -0
- package/dist/workflows/workflow-executor.js.map +1 -0
- package/dist/workflows/workflows.service.d.ts +412 -0
- package/dist/workflows/workflows.service.js +2188 -0
- package/dist/workflows/workflows.service.js.map +1 -0
- package/package.json +83 -11
- package/dist/actions/actions.repo.js +0 -13
- package/dist/actions/actions.repo.js.map +0 -1
- package/dist/actions/actions.service.js +0 -24
- package/dist/actions/actions.service.js.map +0 -1
- package/dist/actions/utils/actions.util.read.d.ts +0 -0
- package/dist/actions/utils/actions.util.read.js +0 -427
- package/dist/actions/utils/actions.util.read.js.map +0 -1
- package/dist/api/services/integrationsApi.service.d.ts +0 -18
- package/dist/api/services/integrationsApi.service.js +0 -80
- package/dist/api/services/integrationsApi.service.js.map +0 -1
- package/dist/appBuilder/services/app.service.d.ts +0 -111
- package/dist/appBuilder/services/app.service.js +0 -737
- package/dist/appBuilder/services/app.service.js.map +0 -1
- package/dist/appBuilder/services/appBuilder.service.d.ts +0 -111
- package/dist/appBuilder/services/appBuilder.service.js +0 -662
- package/dist/appBuilder/services/appBuilder.service.js.map +0 -1
- package/dist/appBuilder/utils/objects.utils.d.ts +0 -3
- package/dist/appBuilder/utils/objects.utils.js +0 -9
- package/dist/appBuilder/utils/objects.utils.js.map +0 -1
- package/dist/appBuilder/utils/string.utils.d.ts +0 -2
- package/dist/appBuilder/utils/string.utils.js +0 -57
- package/dist/appBuilder/utils/string.utils.js.map +0 -1
- package/dist/appBuilder/validators/index.d.ts +0 -19
- package/dist/appBuilder/validators/index.js +0 -40
- package/dist/appBuilder/validators/index.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/create.app.validator.js +0 -10
- package/dist/appBuilder/validators/joi-validators/create.app.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/create.appAction.validator.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/create.appAction.validator.js +0 -20
- package/dist/appBuilder/validators/joi-validators/create.appAction.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/create.appActionResponse.validator.d.ts +0 -7
- package/dist/appBuilder/validators/joi-validators/create.appActionResponse.validator.js +0 -44
- package/dist/appBuilder/validators/joi-validators/create.appActionResponse.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/create.appAuth.validator.d.ts +0 -3
- package/dist/appBuilder/validators/joi-validators/create.appAuth.validator.js +0 -31
- package/dist/appBuilder/validators/joi-validators/create.appAuth.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/create.appBody.validators.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/create.appBody.validators.js +0 -11
- package/dist/appBuilder/validators/joi-validators/create.appBody.validators.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/create.appConstants.validator.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/create.appConstants.validator.js +0 -12
- package/dist/appBuilder/validators/joi-validators/create.appConstants.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/create.appEnv.validator.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/create.appEnv.validator.js +0 -17
- package/dist/appBuilder/validators/joi-validators/create.appEnv.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/create.appEvent.validator.d.ts +0 -5
- package/dist/appBuilder/validators/joi-validators/create.appEvent.validator.js +0 -30
- package/dist/appBuilder/validators/joi-validators/create.appEvent.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/create.appVariable.validator.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/create.appVariable.validator.js +0 -14
- package/dist/appBuilder/validators/joi-validators/create.appVariable.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/sample.validator.d.ts +0 -5
- package/dist/appBuilder/validators/joi-validators/sample.validator.js +0 -26
- package/dist/appBuilder/validators/joi-validators/sample.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/update.app.validator.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/update.app.validator.js +0 -34
- package/dist/appBuilder/validators/joi-validators/update.app.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/update.appAction.validator.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/update.appAction.validator.js +0 -23
- package/dist/appBuilder/validators/joi-validators/update.appAction.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/update.appActionResponse.validator.d.ts +0 -3
- package/dist/appBuilder/validators/joi-validators/update.appActionResponse.validator.js +0 -21
- package/dist/appBuilder/validators/joi-validators/update.appActionResponse.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/update.appAuth.validator.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/update.appAuth.validator.js +0 -19
- package/dist/appBuilder/validators/joi-validators/update.appAuth.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/update.appConstants.validator.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/update.appConstants.validator.js +0 -12
- package/dist/appBuilder/validators/joi-validators/update.appConstants.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/update.appEnv.validator.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/update.appEnv.validator.js +0 -17
- package/dist/appBuilder/validators/joi-validators/update.appEnv.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/update.appEvent.validator.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/update.appEvent.validator.js +0 -16
- package/dist/appBuilder/validators/joi-validators/update.appEvent.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/update.appVariables.validator.d.ts +0 -4
- package/dist/appBuilder/validators/joi-validators/update.appVariables.validator.js +0 -14
- package/dist/appBuilder/validators/joi-validators/update.appVariables.validator.js.map +0 -1
- package/dist/appBuilder/validators/joi-validators/update.validation.entityData.validator.js +0 -27
- package/dist/appBuilder/validators/joi-validators/update.validation.entityData.validator.js.map +0 -1
- package/dist/apps/validators/joi-validators/create.appEvent.validator.d.ts +0 -5
- package/dist/apps/validators/joi-validators/create.appEvent.validator.js +0 -30
- package/dist/apps/validators/joi-validators/create.appEvent.validator.js.map +0 -1
- package/dist/apps/validators/joi-validators/update.appEvent.validator.d.ts +0 -4
- package/dist/apps/validators/joi-validators/update.appEvent.validator.js +0 -16
- package/dist/apps/validators/joi-validators/update.appEvent.validator.js.map +0 -1
- package/dist/clients/integrations.client.d.ts +0 -2
- package/dist/clients/integrations.client.js +0 -26
- package/dist/clients/integrations.client.js.map +0 -1
- package/dist/integrationsBuilder/services/integration.service.d.ts +0 -138
- package/dist/integrationsBuilder/services/integration.service.js +0 -1148
- package/dist/integrationsBuilder/services/integration.service.js.map +0 -1
- package/dist/integrationsBuilder/services/integrationBuilder.service.d.ts +0 -130
- package/dist/integrationsBuilder/services/integrationBuilder.service.js +0 -1017
- package/dist/integrationsBuilder/services/integrationBuilder.service.js.map +0 -1
- package/dist/integrationsBuilder/utils/objects.utils.d.ts +0 -2
- package/dist/integrationsBuilder/utils/objects.utils.js +0 -48
- package/dist/integrationsBuilder/utils/objects.utils.js.map +0 -1
- package/dist/integrationsBuilder/utils/string.utils.d.ts +0 -1
- package/dist/integrationsBuilder/utils/string.utils.js +0 -9
- package/dist/integrationsBuilder/utils/string.utils.js.map +0 -1
- package/dist/integrationsBuilder/validators/index.d.ts +0 -18
- package/dist/integrationsBuilder/validators/index.js +0 -38
- package/dist/integrationsBuilder/validators/index.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/create.integration.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/create.integration.validator.js +0 -10
- package/dist/integrationsBuilder/validators/joi-validators/create.integration.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationApp.validator.d.ts +0 -4
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationApp.validator.js +0 -26
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationApp.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationCache.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationCache.validator.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationCache.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationDatabase.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationDatabase.validator.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationDatabase.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationEnv.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationEnv.validator.js +0 -10
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationEnv.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationFeature.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationFeature.validator.js +0 -60
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationFeature.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationFunction.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationFunction.validator.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationFunction.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationJob.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationJob.validator.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationJob.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationNotification.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationNotification.validator.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/create.integrationNotification.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationApp.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationApp.validator.js +0 -9
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationApp.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationCache.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationCache.validator.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationCache.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationDatabase.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationDatabase.validator.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationDatabase.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationEnv.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationEnv.validator.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationEnv.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationFeature.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationFeature.validator.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationFeature.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationFunction.validator copy.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationFunction.validator copy.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationFunction.validator copy.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationJob.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationJob.validator.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationJob.validator.js.map +0 -1
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationNotification.validator.d.ts +0 -3
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationNotification.validator.js +0 -8
- package/dist/integrationsBuilder/validators/joi-validators/update.integrationNotification.validator.js.map +0 -1
- package/dist/postman.d.ts +0 -1
- package/dist/postman.js +0 -21674
- package/dist/postman.js.map +0 -1
- package/dist/processor/services/fallback.service.d.ts +0 -5
- package/dist/processor/services/fallback.service.js +0 -43
- package/dist/processor/services/fallback.service.js.map +0 -1
- package/dist/processor/services/messagebrokers/aws-sqs.service.js +0 -77
- package/dist/processor/services/messagebrokers/aws-sqs.service.js.map +0 -1
- package/dist/processor/services/messagebrokers/google-pubsub.service.js.map +0 -1
- package/dist/processor/services/messagebrokers/index.d.ts +0 -3
- package/dist/processor/services/messagebrokers/index.js +0 -26
- package/dist/processor/services/messagebrokers/index.js.map +0 -1
- package/dist/processor/services/messagebrokers/kafka.service.d.ts +0 -14
- package/dist/processor/services/messagebrokers/kafka.service.js +0 -45
- package/dist/processor/services/messagebrokers/kafka.service.js.map +0 -1
- package/dist/processor/services/messagebrokers/messagebrokers.type.d.ts +0 -6
- package/dist/processor/services/messagebrokers/messagebrokers.type.js.map +0 -1
- package/dist/processor/services/messagebrokers/rabbitmq.service.d.ts +0 -14
- package/dist/processor/services/messagebrokers/rabbitmq.service.js.map +0 -1
- package/dist/processor/services/messagebrokers/redis.service.js.map +0 -1
- package/dist/processor/services/quota.service.d.ts +0 -15
- package/dist/processor/services/quota.service.js +0 -63
- package/dist/processor/services/quota.service.js.map +0 -1
- package/dist/processor/utils/mongo.util.d.ts +0 -0
- package/dist/processor/utils/mongo.util.js +0 -152
- package/dist/processor/utils/mongo.util.js.map +0 -1
- package/dist/processor/utils/postgres.util.d.ts +0 -14
- package/dist/processor/utils/postgres.util.js +0 -83
- package/dist/processor/utils/postgres.util.js.map +0 -1
- package/dist/products/validators/joi-validators/create.product.validator.d.ts +0 -3
- package/dist/products/validators/joi-validators/create.product.validator.js +0 -10
- package/dist/products/validators/joi-validators/create.product.validator.js.map +0 -1
- package/dist/test/test.appBuilder.d.ts +0 -1
- package/dist/test/test.appBuilder.js +0 -16
- package/dist/test/test.appBuilder.js.map +0 -1
- package/dist/test/test.import.d.ts +0 -1
- package/dist/test/test.import.js +0 -1460
- package/dist/test/test.import.js.map +0 -1
- package/dist/test/test.import.openapi.d.ts +0 -1
- package/dist/test/test.import.openapi.js +0 -76
- package/dist/test/test.import.openapi.js.map +0 -1
- package/dist/test/test.imports.d.ts +0 -1
- package/dist/test/test.imports.js +0 -62
- package/dist/test/test.imports.js.map +0 -1
- package/dist/test/test.logs.d.ts +0 -1
- package/dist/test/test.logs.js +0 -18
- package/dist/test/test.logs.js.map +0 -1
- package/dist/test/test.processor.d.ts +0 -1
- package/dist/test/test.processor.js +0 -123
- package/dist/test/test.processor.js.map +0 -1
- package/dist/test/test.productBuilder.d.ts +0 -1
- package/dist/test/test.productBuilder.js +0 -661
- package/dist/test/test.productBuilder.js.map +0 -1
- package/dist/test.appBuilder.d.ts +0 -1
- package/dist/test.appBuilder.js +0 -14
- package/dist/test.appBuilder.js.map +0 -1
- package/dist/test.import.d.ts +0 -0
- package/dist/test.import.js +0 -24
- package/dist/test.import.js.map +0 -1
- package/dist/test.imports.d.ts +0 -1
- package/dist/test.imports.js +0 -28
- package/dist/test.imports.js.map +0 -1
- package/dist/test.integrationBuilder.d.ts +0 -1
- package/dist/test.integrationBuilder.js +0 -276
- package/dist/test.integrationBuilder.js.map +0 -1
- package/dist/test.processor.d.ts +0 -1
- package/dist/test.processor.js +0 -23
- package/dist/test.processor.js.map +0 -1
- package/dist/test.utils.d.ts +0 -1
- package/dist/test.utils.js +0 -25
- package/dist/test.utils.js.map +0 -1
- package/dist/types/integrationsBuilder.types.d.ts +0 -276
- package/dist/types/integrationsBuilder.types.js +0 -51
- package/dist/types/integrationsBuilder.types.js.map +0 -1
- /package/dist/{actions/actions.repo.d.ts → pricing/pricing.repo.d.ts} +0 -0
- /package/dist/{appBuilder/validators/joi-validators/create.app.validator.d.ts → products/validators/joi-validators/create.productGraph.validator.d.ts} +0 -0
- /package/dist/{appBuilder/validators/joi-validators/update.validation.entityData.validator.d.ts → products/validators/joi-validators/update.productGraph.validator.d.ts} +0 -0
- /package/dist/{actions/actions.service.d.ts → types/request-tracker.interface.d.ts} +0 -0
|
@@ -0,0 +1,2188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Workflow Service
|
|
4
|
+
*
|
|
5
|
+
* Main service class for workflow operations.
|
|
6
|
+
* Provides CRUD operations and execution for Ductape Workflows.
|
|
7
|
+
*
|
|
8
|
+
* Based on Ductape Workflows Code-First API documentation.
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
44
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
45
|
+
};
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.workflowService = exports.WorkflowService = exports.WorkflowError = void 0;
|
|
48
|
+
const crypto_1 = require("crypto");
|
|
49
|
+
const products_service_1 = __importDefault(require("../products/services/products.service"));
|
|
50
|
+
const processor_service_1 = __importDefault(require("../processor/services/processor.service"));
|
|
51
|
+
const workflowApi_service_1 = require("../api/services/workflowApi.service");
|
|
52
|
+
const logs_service_1 = __importDefault(require("../logs/logs.service"));
|
|
53
|
+
const logs_types_1 = require("../logs/logs.types");
|
|
54
|
+
const processor_utils_1 = require("../processor/utils/processor.utils");
|
|
55
|
+
const cache_manager_1 = require("../cache/cache.manager");
|
|
56
|
+
const productsBuilder_types_1 = require("../types/productsBuilder.types");
|
|
57
|
+
const workflow_executor_1 = require("./workflow-executor");
|
|
58
|
+
/**
|
|
59
|
+
* Error class for workflow-related errors
|
|
60
|
+
*/
|
|
61
|
+
class WorkflowError extends Error {
|
|
62
|
+
constructor(message, code, details) {
|
|
63
|
+
if (typeof window !== 'undefined') {
|
|
64
|
+
throw new Error('Ductape SDK can only be initialized in a server environment.');
|
|
65
|
+
}
|
|
66
|
+
super(message);
|
|
67
|
+
this.code = code;
|
|
68
|
+
this.details = details;
|
|
69
|
+
this.name = 'WorkflowError';
|
|
70
|
+
}
|
|
71
|
+
static configurationError(message) {
|
|
72
|
+
return new WorkflowError(message, 'CONFIGURATION_ERROR');
|
|
73
|
+
}
|
|
74
|
+
static validationError(message, details) {
|
|
75
|
+
return new WorkflowError(message, 'VALIDATION_ERROR', details);
|
|
76
|
+
}
|
|
77
|
+
static notFoundError(message) {
|
|
78
|
+
return new WorkflowError(message, 'NOT_FOUND');
|
|
79
|
+
}
|
|
80
|
+
static executionError(message, details) {
|
|
81
|
+
return new WorkflowError(message, 'EXECUTION_ERROR', details);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.WorkflowError = WorkflowError;
|
|
85
|
+
/**
|
|
86
|
+
* Main Workflow Service class
|
|
87
|
+
* Provides unified interface for workflow management and execution
|
|
88
|
+
*/
|
|
89
|
+
class WorkflowService {
|
|
90
|
+
/**
|
|
91
|
+
* Create a new WorkflowService instance
|
|
92
|
+
* @param config - Optional configuration for authentication and workspace context
|
|
93
|
+
*/
|
|
94
|
+
constructor(config) {
|
|
95
|
+
/** Service configuration */
|
|
96
|
+
this.config = null;
|
|
97
|
+
/** ProductBuilder instances cache (keyed by product tag) */
|
|
98
|
+
this.productBuilders = new Map();
|
|
99
|
+
/** Local workflow configurations */
|
|
100
|
+
this.localConfigs = new Map();
|
|
101
|
+
/** Workflow API service for backend communication */
|
|
102
|
+
this.workflowApiService = null;
|
|
103
|
+
/** LogService instance for logging operations */
|
|
104
|
+
this.logService = null;
|
|
105
|
+
/** Current product ID for logging */
|
|
106
|
+
this.productId = '';
|
|
107
|
+
/** Cache manager for 3-tier caching */
|
|
108
|
+
this.cacheManager = null;
|
|
109
|
+
/** Local cache for cache configurations to avoid repeated API calls */
|
|
110
|
+
this.cacheConfigCache = new Map();
|
|
111
|
+
console.log('[WorkflowService] constructor', { hasConfig: !!config, env_type: config === null || config === void 0 ? void 0 : config.env_type, hasRedis: !!(config === null || config === void 0 ? void 0 : config.redis_client) });
|
|
112
|
+
this.config = config || null;
|
|
113
|
+
this._privateKey = (config === null || config === void 0 ? void 0 : config.private_key) || '';
|
|
114
|
+
if (config) {
|
|
115
|
+
this.workflowApiService = new workflowApi_service_1.WorkflowApiService(config.env_type);
|
|
116
|
+
console.log('[WorkflowService] WorkflowApiService initialized', { env_type: config.env_type });
|
|
117
|
+
// Initialize CacheManager if Redis client is provided
|
|
118
|
+
if (config.redis_client) {
|
|
119
|
+
this.cacheManager = new cache_manager_1.CacheManager({
|
|
120
|
+
workspace_id: config.workspace_id,
|
|
121
|
+
public_key: config.public_key,
|
|
122
|
+
user_id: config.user_id,
|
|
123
|
+
token: config.token,
|
|
124
|
+
env_type: config.env_type,
|
|
125
|
+
redis_client: config.redis_client,
|
|
126
|
+
});
|
|
127
|
+
console.log('[WorkflowService] CacheManager initialized');
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log('[WorkflowService] No redis_client provided, cache disabled');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
console.log('[WorkflowService] No config provided, service unconfigured');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// ==================== CONFIGURATION ====================
|
|
138
|
+
/**
|
|
139
|
+
* Update service configuration
|
|
140
|
+
*/
|
|
141
|
+
updateConfig(config) {
|
|
142
|
+
console.log('[WorkflowService] updateConfig', { env_type: config.env_type, workspace_id: config.workspace_id });
|
|
143
|
+
this.config = config;
|
|
144
|
+
this.workflowApiService = new workflowApi_service_1.WorkflowApiService(config.env_type);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get auth payload for API calls
|
|
148
|
+
*/
|
|
149
|
+
getAuthPayload() {
|
|
150
|
+
if (!this.config) {
|
|
151
|
+
console.log('[WorkflowService] getAuthPayload failed: no config');
|
|
152
|
+
throw WorkflowError.configurationError('WorkflowService not configured. Please provide config when initializing.');
|
|
153
|
+
}
|
|
154
|
+
const hasAccessKey = !!this.config.access_key;
|
|
155
|
+
console.log('[WorkflowService] getAuthPayload', { user_id: this.config.user_id, workspace_id: this.config.workspace_id, hasAccessKey });
|
|
156
|
+
return Object.assign({ user_id: this.config.user_id, workspace_id: this.config.workspace_id, public_key: this.config.public_key, token: this.config.token }, (this.config.access_key && { access_key: this.config.access_key }));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Ensure WorkflowApiService is initialized
|
|
160
|
+
*/
|
|
161
|
+
ensureApiService() {
|
|
162
|
+
if (!this.workflowApiService) {
|
|
163
|
+
console.log('[WorkflowService] ensureApiService failed: WorkflowApiService not initialized');
|
|
164
|
+
throw WorkflowError.configurationError('WorkflowService not configured. Please provide config when initializing.');
|
|
165
|
+
}
|
|
166
|
+
return this.workflowApiService;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get service configuration
|
|
170
|
+
*/
|
|
171
|
+
getConfig() {
|
|
172
|
+
var _a;
|
|
173
|
+
console.log('[WorkflowService] getConfig', { hasConfig: !!this.config, env_type: (_a = this.config) === null || _a === void 0 ? void 0 : _a.env_type });
|
|
174
|
+
return this.config;
|
|
175
|
+
}
|
|
176
|
+
// ==================== PRODUCT BUILDER MANAGEMENT ====================
|
|
177
|
+
/**
|
|
178
|
+
* Create a new ProductBuilder instance
|
|
179
|
+
*/
|
|
180
|
+
createNewProductBuilder() {
|
|
181
|
+
if (!this.config) {
|
|
182
|
+
console.log('[WorkflowService] createNewProductBuilder failed: no config');
|
|
183
|
+
throw WorkflowError.configurationError('WorkflowService not configured. Please provide config when initializing.');
|
|
184
|
+
}
|
|
185
|
+
console.log('[WorkflowService] createNewProductBuilder', { env_type: this.config.env_type, hasAccessKey: !!this.config.access_key });
|
|
186
|
+
return new products_service_1.default({
|
|
187
|
+
workspace_id: this.config.workspace_id,
|
|
188
|
+
public_key: this.config.public_key,
|
|
189
|
+
user_id: this.config.user_id,
|
|
190
|
+
token: this.config.token,
|
|
191
|
+
env_type: this.config.env_type,
|
|
192
|
+
access_key: this.config.access_key,
|
|
193
|
+
workspace_private_key: this._privateKey || undefined,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get or create a ProductBuilder instance for the given product tag
|
|
198
|
+
*/
|
|
199
|
+
async getProductBuilder(productTag) {
|
|
200
|
+
let builder = this.productBuilders.get(productTag);
|
|
201
|
+
if (!builder) {
|
|
202
|
+
console.log('[WorkflowService] getProductBuilder creating new builder', { productTag });
|
|
203
|
+
builder = this.createNewProductBuilder();
|
|
204
|
+
await builder.initializeProductByTag(productTag);
|
|
205
|
+
this.productBuilders.set(productTag, builder);
|
|
206
|
+
// Update productId for logging
|
|
207
|
+
this.productId = builder.fetchProductId() || '';
|
|
208
|
+
console.log('[WorkflowService] getProductBuilder initialized', { productTag, productId: this.productId });
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
console.log('[WorkflowService] getProductBuilder cache hit', { productTag });
|
|
212
|
+
}
|
|
213
|
+
return builder;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Initialize logging service
|
|
217
|
+
*/
|
|
218
|
+
initializeLogService() {
|
|
219
|
+
if (!this.logService && this.config) {
|
|
220
|
+
console.log('[WorkflowService] initializeLogService', { productId: this.productId });
|
|
221
|
+
this.logService = new logs_service_1.default({
|
|
222
|
+
product_id: this.productId,
|
|
223
|
+
workspace_id: this.config.workspace_id,
|
|
224
|
+
public_key: this.config.public_key,
|
|
225
|
+
user_id: this.config.user_id,
|
|
226
|
+
token: this.config.token,
|
|
227
|
+
env_type: this.config.env_type,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Validate cache tag exists in product and return cache configuration
|
|
233
|
+
*/
|
|
234
|
+
async validateCache(productTag, cacheTag) {
|
|
235
|
+
const cacheKey = `${productTag}:${cacheTag}`;
|
|
236
|
+
const cached = this.cacheConfigCache.get(cacheKey);
|
|
237
|
+
const now = Date.now();
|
|
238
|
+
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
239
|
+
console.log('[WorkflowService] validateCache', { productTag, cacheTag, cacheKey, hasCached: !!cached });
|
|
240
|
+
// Return cached config if still valid
|
|
241
|
+
if (cached && (now - cached.fetchedAt) < CACHE_TTL) {
|
|
242
|
+
console.log('[WorkflowService] validateCache using cached config', { cacheKey, expiry: cached.expiry });
|
|
243
|
+
return { expiry: cached.expiry };
|
|
244
|
+
}
|
|
245
|
+
// Fetch from API and cache the result
|
|
246
|
+
const builder = await this.getProductBuilder(productTag);
|
|
247
|
+
const cache = await builder.fetchCache(cacheTag);
|
|
248
|
+
if (!cache) {
|
|
249
|
+
console.log('[WorkflowService] validateCache cache config not found', { cacheTag });
|
|
250
|
+
throw WorkflowError.validationError(`Cache configuration '${cacheTag}' does not exist`);
|
|
251
|
+
}
|
|
252
|
+
this.cacheConfigCache.set(cacheKey, { expiry: cache.expiry, fetchedAt: now });
|
|
253
|
+
console.log('[WorkflowService] validateCache fetched and cached', { cacheKey, expiry: cache.expiry });
|
|
254
|
+
return { expiry: cache.expiry };
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Create a new ProcessorService instance for job scheduling
|
|
258
|
+
*/
|
|
259
|
+
createNewProcessor() {
|
|
260
|
+
if (!this.config) {
|
|
261
|
+
console.log('[WorkflowService] createNewProcessor failed: no config');
|
|
262
|
+
throw WorkflowError.configurationError('WorkflowService not configured. Please provide config when initializing.');
|
|
263
|
+
}
|
|
264
|
+
console.log('[WorkflowService] createNewProcessor', { env_type: this.config.env_type, hasAccessKey: !!this.config.access_key });
|
|
265
|
+
return new processor_service_1.default({
|
|
266
|
+
workspace_id: this.config.workspace_id,
|
|
267
|
+
public_key: this.config.public_key,
|
|
268
|
+
user_id: this.config.user_id,
|
|
269
|
+
token: this.config.token,
|
|
270
|
+
env_type: this.config.env_type,
|
|
271
|
+
private_key: this._privateKey,
|
|
272
|
+
access_key: this.config.access_key,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
// ==================== WORKFLOW CRUD OPERATIONS ====================
|
|
276
|
+
/**
|
|
277
|
+
* Create a new workflow from JSON schema
|
|
278
|
+
*
|
|
279
|
+
* @example
|
|
280
|
+
* ```ts
|
|
281
|
+
* await ductape.workflows.create('my-product', {
|
|
282
|
+
* tag: 'order-fulfillment',
|
|
283
|
+
* name: 'Order Fulfillment',
|
|
284
|
+
* steps: [
|
|
285
|
+
* { tag: 'validate', type: 'action', app: 'orders', event: 'validate', input: {} },
|
|
286
|
+
* { tag: 'process', type: 'database_action', database: 'orders-db', event: 'create', input: {} },
|
|
287
|
+
* ],
|
|
288
|
+
* envs: [{ slug: 'prd' }],
|
|
289
|
+
* });
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
292
|
+
async create(productTag, workflowData) {
|
|
293
|
+
var _a, _b, _c;
|
|
294
|
+
console.log('[WorkflowService] create ENTRY', { productTag, tag: workflowData.tag, name: workflowData.name, stepsCount: (_b = (_a = workflowData.steps) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0 });
|
|
295
|
+
// Validate required fields
|
|
296
|
+
if (!workflowData.name || !workflowData.tag || !((_c = workflowData.steps) === null || _c === void 0 ? void 0 : _c.length)) {
|
|
297
|
+
console.log('[WorkflowService] create validation failed: missing name, tag, or steps');
|
|
298
|
+
throw WorkflowError.validationError('Workflow requires name, tag, and at least one step');
|
|
299
|
+
}
|
|
300
|
+
// Persist to backend using ProductBuilder
|
|
301
|
+
const builder = await this.getProductBuilder(productTag);
|
|
302
|
+
console.log('[WorkflowService] create calling builder.createWorkflow', { tag: workflowData.tag });
|
|
303
|
+
await builder.createWorkflow(workflowData);
|
|
304
|
+
// Store locally
|
|
305
|
+
const localConfig = {
|
|
306
|
+
name: workflowData.name,
|
|
307
|
+
tag: workflowData.tag,
|
|
308
|
+
description: workflowData.description,
|
|
309
|
+
input: workflowData.input,
|
|
310
|
+
output: workflowData.output,
|
|
311
|
+
steps: workflowData.steps,
|
|
312
|
+
signals: workflowData.signals,
|
|
313
|
+
queries: workflowData.queries,
|
|
314
|
+
options: workflowData.options,
|
|
315
|
+
envs: workflowData.envs,
|
|
316
|
+
};
|
|
317
|
+
this.localConfigs.set(workflowData.tag, localConfig);
|
|
318
|
+
console.log('[WorkflowService] create SUCCESS', { productTag, tag: workflowData.tag });
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Fetch all workflows for a product
|
|
322
|
+
*
|
|
323
|
+
* @example
|
|
324
|
+
* ```ts
|
|
325
|
+
* const workflows = await ductape.workflows.fetchAll('my-product');
|
|
326
|
+
* workflows.forEach(wf => console.log(wf.name, wf.tag));
|
|
327
|
+
* ```
|
|
328
|
+
*/
|
|
329
|
+
async fetchAll(productTag) {
|
|
330
|
+
var _a;
|
|
331
|
+
console.log('[WorkflowService] fetchAll ENTRY', { productTag });
|
|
332
|
+
// Return local configs if no product tag
|
|
333
|
+
if (!productTag) {
|
|
334
|
+
const localCount = this.localConfigs.size;
|
|
335
|
+
console.log('[WorkflowService] fetchAll no productTag, returning local configs', { count: localCount });
|
|
336
|
+
return Array.from(this.localConfigs.values());
|
|
337
|
+
}
|
|
338
|
+
// Fetch from API using ProductBuilder
|
|
339
|
+
try {
|
|
340
|
+
const builder = await this.getProductBuilder(productTag);
|
|
341
|
+
console.log('[WorkflowService] fetchAll calling builder.fetchWorkflows', { productTag });
|
|
342
|
+
const workflows = await builder.fetchWorkflows();
|
|
343
|
+
// Convert IProductWorkflow[] to IWorkflowConfig[]
|
|
344
|
+
const result = workflows.map((wf) => this.productWorkflowToConfig(wf));
|
|
345
|
+
console.log('[WorkflowService] fetchAll SUCCESS', { productTag, count: result.length });
|
|
346
|
+
return result;
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
// Fall back to local configs if API fails
|
|
350
|
+
console.log('[WorkflowService] fetchAll API failed, falling back to local', { productTag, error: (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error });
|
|
351
|
+
return Array.from(this.localConfigs.values());
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Fetch a specific workflow by tag
|
|
356
|
+
*
|
|
357
|
+
* @example
|
|
358
|
+
* ```ts
|
|
359
|
+
* const workflow = await ductape.workflows.fetch('order-fulfillment', 'my-product');
|
|
360
|
+
* console.log(workflow?.name, workflow?.steps.length);
|
|
361
|
+
* ```
|
|
362
|
+
*/
|
|
363
|
+
async fetch(workflowTag, productTag) {
|
|
364
|
+
var _a, _b;
|
|
365
|
+
console.log('[WorkflowService] fetch ENTRY', { workflowTag, productTag });
|
|
366
|
+
// If productTag is provided, fetch from API
|
|
367
|
+
if (productTag) {
|
|
368
|
+
try {
|
|
369
|
+
const builder = await this.getProductBuilder(productTag);
|
|
370
|
+
console.log('[WorkflowService] fetch calling builder.fetchWorkflow', { workflowTag, productTag });
|
|
371
|
+
const workflow = await builder.fetchWorkflow(workflowTag);
|
|
372
|
+
if (workflow) {
|
|
373
|
+
const config = this.productWorkflowToConfig(workflow);
|
|
374
|
+
// Update local cache
|
|
375
|
+
this.localConfigs.set(workflowTag, config);
|
|
376
|
+
console.log('[WorkflowService] fetch SUCCESS from API', { workflowTag, productTag, stepsCount: (_a = config.steps) === null || _a === void 0 ? void 0 : _a.length });
|
|
377
|
+
return config;
|
|
378
|
+
}
|
|
379
|
+
console.log('[WorkflowService] fetch not found on API', { workflowTag, productTag });
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
// Fall back to local config
|
|
384
|
+
console.log('[WorkflowService] fetch API failed, trying local', { workflowTag, productTag, error: (_b = error === null || error === void 0 ? void 0 : error.message) !== null && _b !== void 0 ? _b : error });
|
|
385
|
+
return this.localConfigs.get(workflowTag) || null;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
const local = this.localConfigs.get(workflowTag) || null;
|
|
389
|
+
console.log('[WorkflowService] fetch from local only', { workflowTag, found: !!local });
|
|
390
|
+
return local;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Update a workflow
|
|
394
|
+
*
|
|
395
|
+
* @example
|
|
396
|
+
* ```ts
|
|
397
|
+
* await ductape.workflows.update('order-fulfillment', 'my-product', {
|
|
398
|
+
* description: 'Updated description',
|
|
399
|
+
* options: { timeout: 3600000 },
|
|
400
|
+
* });
|
|
401
|
+
* ```
|
|
402
|
+
*/
|
|
403
|
+
async update(workflowTag, productTag, updates) {
|
|
404
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
405
|
+
console.log('[WorkflowService] update ENTRY', { workflowTag, productTag, updateKeys: Object.keys(updates || {}) });
|
|
406
|
+
// Update in backend
|
|
407
|
+
const builder = await this.getProductBuilder(productTag);
|
|
408
|
+
await builder.updateWorkflow(workflowTag, updates);
|
|
409
|
+
// Update local cache
|
|
410
|
+
const existing = this.localConfigs.get(workflowTag);
|
|
411
|
+
if (existing) {
|
|
412
|
+
const updated = Object.assign(Object.assign({}, existing), { name: updates.name || existing.name, description: (_a = updates.description) !== null && _a !== void 0 ? _a : existing.description, input: (_b = updates.input) !== null && _b !== void 0 ? _b : existing.input, output: (_c = updates.output) !== null && _c !== void 0 ? _c : existing.output, steps: updates.steps || existing.steps, signals: (_d = updates.signals) !== null && _d !== void 0 ? _d : existing.signals, queries: (_e = updates.queries) !== null && _e !== void 0 ? _e : existing.queries, options: (_f = updates.options) !== null && _f !== void 0 ? _f : existing.options, envs: (_g = updates.envs) !== null && _g !== void 0 ? _g : existing.envs });
|
|
413
|
+
this.localConfigs.set(workflowTag, updated);
|
|
414
|
+
}
|
|
415
|
+
console.log('[WorkflowService] update SUCCESS', { workflowTag, productTag });
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Delete a workflow
|
|
419
|
+
*
|
|
420
|
+
* @example
|
|
421
|
+
* ```ts
|
|
422
|
+
* await ductape.workflows.delete('order-fulfillment', 'my-product');
|
|
423
|
+
* ```
|
|
424
|
+
*/
|
|
425
|
+
async delete(workflowTag, productTag) {
|
|
426
|
+
console.log('[WorkflowService] delete ENTRY', { workflowTag, productTag });
|
|
427
|
+
// Delete from backend
|
|
428
|
+
const builder = await this.getProductBuilder(productTag);
|
|
429
|
+
await builder.deleteWorkflow(workflowTag);
|
|
430
|
+
// Remove from local cache
|
|
431
|
+
this.localConfigs.delete(workflowTag);
|
|
432
|
+
console.log('[WorkflowService] delete SUCCESS', { workflowTag, productTag });
|
|
433
|
+
}
|
|
434
|
+
// ==================== CODE-FIRST API ====================
|
|
435
|
+
/**
|
|
436
|
+
* Define a workflow using the code-first API
|
|
437
|
+
* Compiles the handler to JSON schema and creates the workflow in one step
|
|
438
|
+
*
|
|
439
|
+
* @example
|
|
440
|
+
* ```ts
|
|
441
|
+
* const orderWorkflow = await ductape.workflows.define({
|
|
442
|
+
* product: 'my-product',
|
|
443
|
+
* tag: 'order-fulfillment',
|
|
444
|
+
* name: 'Order Fulfillment',
|
|
445
|
+
* handler: async (ctx) => {
|
|
446
|
+
* const validation = await ctx.step('validate', async () => {
|
|
447
|
+
* return ctx.action.run({
|
|
448
|
+
* app: 'inventory-service',
|
|
449
|
+
* event: 'validate-order',
|
|
450
|
+
* input: { body: ctx.input },
|
|
451
|
+
* });
|
|
452
|
+
* });
|
|
453
|
+
*
|
|
454
|
+
* if (!validation.valid) {
|
|
455
|
+
* return { success: false, error: validation.reason };
|
|
456
|
+
* }
|
|
457
|
+
*
|
|
458
|
+
* return { success: true };
|
|
459
|
+
* },
|
|
460
|
+
* });
|
|
461
|
+
* ```
|
|
462
|
+
*/
|
|
463
|
+
async define(options) {
|
|
464
|
+
var _a, _b;
|
|
465
|
+
console.log('[WorkflowService] define ENTRY', { tag: options.tag, name: options.name, product: options.product });
|
|
466
|
+
// Validate required fields
|
|
467
|
+
if (!options.tag || !options.name || !options.handler) {
|
|
468
|
+
console.log('[WorkflowService] define validation failed: missing tag, name, or handler');
|
|
469
|
+
throw WorkflowError.validationError('Workflow definition requires tag, name, and handler');
|
|
470
|
+
}
|
|
471
|
+
// Create a workflow compiler instance
|
|
472
|
+
const compiler = new WorkflowCompiler(options);
|
|
473
|
+
// Compile the handler to JSON schema (await so async handler runs and steps are captured)
|
|
474
|
+
console.log('[WorkflowService] define compiling handler (compileAsync)', { tag: options.tag });
|
|
475
|
+
const schema = await compiler.compileAsync();
|
|
476
|
+
console.log('[WorkflowService] define compiled schema', { tag: schema.tag, stepsCount: (_b = (_a = schema.steps) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0 });
|
|
477
|
+
// If product is specified, create the workflow
|
|
478
|
+
if (options.product) {
|
|
479
|
+
console.log('[WorkflowService] define creating workflow on backend', { product: options.product, tag: schema.tag });
|
|
480
|
+
await this.create(options.product, schema);
|
|
481
|
+
}
|
|
482
|
+
// Store locally
|
|
483
|
+
const localConfig = {
|
|
484
|
+
name: schema.name,
|
|
485
|
+
tag: schema.tag,
|
|
486
|
+
description: schema.description,
|
|
487
|
+
input: schema.input,
|
|
488
|
+
output: schema.output,
|
|
489
|
+
steps: schema.steps,
|
|
490
|
+
signals: schema.signals,
|
|
491
|
+
queries: schema.queries,
|
|
492
|
+
options: schema.options,
|
|
493
|
+
envs: schema.envs,
|
|
494
|
+
};
|
|
495
|
+
this.localConfigs.set(schema.tag, localConfig);
|
|
496
|
+
console.log('[WorkflowService] define SUCCESS', { tag: options.tag, product: options.product });
|
|
497
|
+
// Return the defined workflow with compile method
|
|
498
|
+
return {
|
|
499
|
+
tag: options.tag,
|
|
500
|
+
name: options.name,
|
|
501
|
+
handler: options.handler,
|
|
502
|
+
compile: () => schema,
|
|
503
|
+
schema,
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
// ==================== WORKFLOW EXECUTION ====================
|
|
507
|
+
/**
|
|
508
|
+
* Execute a workflow
|
|
509
|
+
*
|
|
510
|
+
* @example
|
|
511
|
+
* ```ts
|
|
512
|
+
* const result = await ductape.workflows.execute({
|
|
513
|
+
* product: 'my-product',
|
|
514
|
+
* env: 'production',
|
|
515
|
+
* tag: 'order-fulfillment',
|
|
516
|
+
* input: {
|
|
517
|
+
* order_id: 'ORD-12345',
|
|
518
|
+
* items: [{ product_id: 'PROD-1', quantity: 2 }],
|
|
519
|
+
* },
|
|
520
|
+
* });
|
|
521
|
+
*
|
|
522
|
+
* console.log(result.status); // 'completed' | 'failed' | 'rolled_back'
|
|
523
|
+
* console.log(result.output);
|
|
524
|
+
* ```
|
|
525
|
+
*/
|
|
526
|
+
async execute(options) {
|
|
527
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
528
|
+
console.log('[WorkflowService] execute ENTRY', { product: options.product, env: options.env, tag: options.tag, hasSession: !!options.session, cache: options.cache });
|
|
529
|
+
if (!this.config) {
|
|
530
|
+
console.log('[WorkflowService] execute failed: no config');
|
|
531
|
+
throw WorkflowError.configurationError('WorkflowService not configured. Please provide config when initializing.');
|
|
532
|
+
}
|
|
533
|
+
const process_id = (0, processor_utils_1.generateObjectId)();
|
|
534
|
+
console.log('[WorkflowService] execute process_id', { process_id });
|
|
535
|
+
// Session log fields (will be populated if session is provided)
|
|
536
|
+
let sessionLogFields = {};
|
|
537
|
+
let resolvedOptions = options;
|
|
538
|
+
// Fetch the workflow configuration from backend
|
|
539
|
+
const builder = await this.getProductBuilder(options.product);
|
|
540
|
+
console.log('[WorkflowService] execute fetching workflow', { tag: options.tag, product: options.product });
|
|
541
|
+
const workflow = await builder.fetchWorkflow(options.tag);
|
|
542
|
+
if (!workflow) {
|
|
543
|
+
console.log('[WorkflowService] execute workflow not found', { tag: options.tag });
|
|
544
|
+
throw WorkflowError.notFoundError(`Workflow ${options.tag} not found`);
|
|
545
|
+
}
|
|
546
|
+
console.log('[WorkflowService] execute workflow loaded', { tag: workflow.tag, stepsCount: (_b = (_a = workflow.steps) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0 });
|
|
547
|
+
// Process session if provided - verify and resolve $Session{} references
|
|
548
|
+
if (options.session) {
|
|
549
|
+
const privateKey = builder.fetchPrivateKey();
|
|
550
|
+
if (privateKey) {
|
|
551
|
+
const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
|
|
552
|
+
const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env, {
|
|
553
|
+
fetchSessionSelector: async (sessionTag) => {
|
|
554
|
+
const sessionConfig = await builder.fetchSession(sessionTag);
|
|
555
|
+
return sessionConfig === null || sessionConfig === void 0 ? void 0 : sessionConfig.selector;
|
|
556
|
+
},
|
|
557
|
+
});
|
|
558
|
+
if (sessionResult.error) {
|
|
559
|
+
console.log('[WorkflowService] execute session validation failed', { error: sessionResult.error });
|
|
560
|
+
throw WorkflowError.executionError(`Session validation failed: ${sessionResult.error}`);
|
|
561
|
+
}
|
|
562
|
+
resolvedOptions = sessionResult.input;
|
|
563
|
+
sessionLogFields = sessionResult.logFields;
|
|
564
|
+
console.log('[WorkflowService] execute session resolved', { hasLogFields: Object.keys(sessionLogFields).length > 0 });
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
// Initialize logging
|
|
568
|
+
this.initializeLogService();
|
|
569
|
+
const baseLogs = Object.assign({ product_tag: options.product, workspace_id: this.config.workspace_id, env: options.env, process_id, type: logs_types_1.LogEventTypes.WORKFLOW, parent_tag: options.tag, data: { workflow: options.tag, operation: 'execute' } }, sessionLogFields);
|
|
570
|
+
(_c = this.logService) === null || _c === void 0 ? void 0 : _c.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow execute - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
|
|
571
|
+
const { cache } = options;
|
|
572
|
+
try {
|
|
573
|
+
// Check cache for idempotency (prevent duplicate executions with same input)
|
|
574
|
+
if (cache && this.cacheManager && this._privateKey) {
|
|
575
|
+
console.log('[WorkflowService] execute checking cache', { cache, tag: options.tag });
|
|
576
|
+
const cacheConfig = await this.validateCache(options.product, cache);
|
|
577
|
+
const cacheOptions = {
|
|
578
|
+
cache_tag: cache,
|
|
579
|
+
product_tag: options.product,
|
|
580
|
+
component_tag: options.tag,
|
|
581
|
+
component_type: 'workflow',
|
|
582
|
+
operation: 'execute',
|
|
583
|
+
input: { tag: options.tag, input: resolvedOptions.input },
|
|
584
|
+
privateKey: this._privateKey,
|
|
585
|
+
expiry: cacheConfig.expiry,
|
|
586
|
+
};
|
|
587
|
+
const cached = await this.cacheManager.fetch(cacheOptions);
|
|
588
|
+
if (cached.hit && cached.data) {
|
|
589
|
+
console.log('[WorkflowService] execute cache HIT', { cache, source: cached.source });
|
|
590
|
+
(_d = this.logService) === null || _d === void 0 ? void 0 : _d.add(Object.assign(Object.assign({}, baseLogs), { message: `Workflow execute - cache hit (${cached.source})`, successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS, data: { workflow: options.tag, operation: 'execute', cache_source: cached.source }, cache_tag: cache, cache_key: cached.key, cache_status: true }));
|
|
591
|
+
(_e = this.logService) === null || _e === void 0 ? void 0 : _e.publish();
|
|
592
|
+
return cached.data;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
// Create and run the workflow executor with resolved options and session context (pass builder to avoid duplicate init)
|
|
596
|
+
console.log('[WorkflowService] execute creating WorkflowExecutor and running', { tag: options.tag });
|
|
597
|
+
const executor = new workflow_executor_1.WorkflowExecutor(this.config, workflow, resolvedOptions, this._privateKey, sessionLogFields, builder);
|
|
598
|
+
const result = await executor.execute();
|
|
599
|
+
console.log('[WorkflowService] execute executor completed', { tag: options.tag, status: result === null || result === void 0 ? void 0 : result.status });
|
|
600
|
+
// Store in cache for idempotency (fire-and-forget)
|
|
601
|
+
if (cache && this.cacheManager && this._privateKey) {
|
|
602
|
+
const cacheConfig = await this.validateCache(options.product, cache);
|
|
603
|
+
this.cacheManager.store({
|
|
604
|
+
cache_tag: cache,
|
|
605
|
+
product_tag: options.product,
|
|
606
|
+
component_tag: options.tag,
|
|
607
|
+
component_type: 'workflow',
|
|
608
|
+
operation: 'execute',
|
|
609
|
+
input: { tag: options.tag, input: resolvedOptions.input },
|
|
610
|
+
privateKey: this._privateKey,
|
|
611
|
+
expiry: cacheConfig.expiry,
|
|
612
|
+
}, result);
|
|
613
|
+
}
|
|
614
|
+
(_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow execute - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
|
|
615
|
+
(_g = this.logService) === null || _g === void 0 ? void 0 : _g.publish();
|
|
616
|
+
console.log('[WorkflowService] execute SUCCESS', { tag: options.tag, process_id });
|
|
617
|
+
return result;
|
|
618
|
+
}
|
|
619
|
+
catch (error) {
|
|
620
|
+
console.log('[WorkflowService] execute FAILED', { tag: options.tag, process_id, error: (_h = error === null || error === void 0 ? void 0 : error.message) !== null && _h !== void 0 ? _h : error });
|
|
621
|
+
(_j = this.logService) === null || _j === void 0 ? void 0 : _j.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow execute - failed', failed_execution: true, data: { workflow: options.tag, operation: 'execute', error: error.message || String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
|
|
622
|
+
await ((_k = this.logService) === null || _k === void 0 ? void 0 : _k.publish());
|
|
623
|
+
throw error;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
// ==================== WORKFLOW DISPATCH ====================
|
|
627
|
+
/**
|
|
628
|
+
* Dispatch a workflow to run as a scheduled job
|
|
629
|
+
*
|
|
630
|
+
* @example
|
|
631
|
+
* ```ts
|
|
632
|
+
* // Schedule a workflow to run in 1 hour
|
|
633
|
+
* const result = await ductape.workflows.dispatch({
|
|
634
|
+
* product: 'my-product',
|
|
635
|
+
* env: 'production',
|
|
636
|
+
* workflow: 'order-fulfillment',
|
|
637
|
+
* input: { order_id: 'ORD-123' },
|
|
638
|
+
* schedule: { start_at: Date.now() + 3600000 },
|
|
639
|
+
* });
|
|
640
|
+
*
|
|
641
|
+
* // Run on a cron schedule
|
|
642
|
+
* const result = await ductape.workflows.dispatch({
|
|
643
|
+
* product: 'my-product',
|
|
644
|
+
* env: 'production',
|
|
645
|
+
* workflow: 'daily-report',
|
|
646
|
+
* input: {},
|
|
647
|
+
* schedule: { cron: '0 0 * * *' }, // Daily at midnight
|
|
648
|
+
* });
|
|
649
|
+
* ```
|
|
650
|
+
*/
|
|
651
|
+
async dispatch(data) {
|
|
652
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
653
|
+
console.log('[WorkflowService] dispatch ENTRY', { product: data.product, env: data.env, workflow: data.workflow, schedule: !!data.schedule, session: !!data.session, cache: data.cache });
|
|
654
|
+
const process_id = (0, processor_utils_1.generateObjectId)();
|
|
655
|
+
const processorService = this.createNewProcessor();
|
|
656
|
+
const productBuilder = await this.getProductBuilder(data.product);
|
|
657
|
+
const schedule = data.schedule || {};
|
|
658
|
+
const startAt = typeof schedule.start_at === 'string' ? new Date(schedule.start_at).getTime() : schedule.start_at || Date.now();
|
|
659
|
+
// Generate job tag based on workflow
|
|
660
|
+
const jobTag = `workflow:${data.workflow}`;
|
|
661
|
+
console.log('[WorkflowService] dispatch jobTag', { jobTag, startAt, cron: schedule.cron, every: schedule.every });
|
|
662
|
+
// Session log fields (will be populated if session is provided)
|
|
663
|
+
let sessionLogFields = {};
|
|
664
|
+
let resolvedData = data;
|
|
665
|
+
// Process session if provided - verify and resolve $Session{} references
|
|
666
|
+
if (data.session) {
|
|
667
|
+
const privateKey = productBuilder.fetchPrivateKey();
|
|
668
|
+
if (privateKey) {
|
|
669
|
+
const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
|
|
670
|
+
const sessionResult = await processSessionForExecution(data.session, privateKey, data, data.env, {
|
|
671
|
+
fetchSessionSelector: async (sessionTag) => {
|
|
672
|
+
const sessionConfig = await productBuilder.fetchSession(sessionTag);
|
|
673
|
+
return sessionConfig === null || sessionConfig === void 0 ? void 0 : sessionConfig.selector;
|
|
674
|
+
},
|
|
675
|
+
});
|
|
676
|
+
if (sessionResult.error) {
|
|
677
|
+
console.log('[WorkflowService] dispatch session validation failed', { error: sessionResult.error });
|
|
678
|
+
throw WorkflowError.executionError(`Session validation failed: ${sessionResult.error}`);
|
|
679
|
+
}
|
|
680
|
+
resolvedData = sessionResult.input;
|
|
681
|
+
sessionLogFields = sessionResult.logFields;
|
|
682
|
+
console.log('[WorkflowService] dispatch session resolved');
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
// Initialize logging
|
|
686
|
+
this.initializeLogService();
|
|
687
|
+
const baseLogs = Object.assign({ product_tag: data.product, workspace_id: ((_a = this.config) === null || _a === void 0 ? void 0 : _a.workspace_id) || '', env: data.env, process_id, type: logs_types_1.LogEventTypes.WORKFLOW, parent_tag: data.workflow, data: { workflow: data.workflow, operation: 'dispatch' } }, sessionLogFields);
|
|
688
|
+
(_b = this.logService) === null || _b === void 0 ? void 0 : _b.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow dispatch - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
|
|
689
|
+
const { cache } = data;
|
|
690
|
+
try {
|
|
691
|
+
// Check cache for idempotency (prevent duplicate dispatches with same input)
|
|
692
|
+
if (cache && this.cacheManager && this._privateKey) {
|
|
693
|
+
console.log('[WorkflowService] dispatch checking cache', { cache, workflow: data.workflow });
|
|
694
|
+
const cacheConfig = await this.validateCache(data.product, cache);
|
|
695
|
+
const cacheOptions = {
|
|
696
|
+
cache_tag: cache,
|
|
697
|
+
product_tag: data.product,
|
|
698
|
+
component_tag: data.workflow,
|
|
699
|
+
component_type: 'workflow',
|
|
700
|
+
operation: 'dispatch',
|
|
701
|
+
input: { workflow: data.workflow, input: data.input, schedule: data.schedule },
|
|
702
|
+
privateKey: this._privateKey,
|
|
703
|
+
expiry: cacheConfig.expiry,
|
|
704
|
+
};
|
|
705
|
+
const cached = await this.cacheManager.fetch(cacheOptions);
|
|
706
|
+
if (cached.hit && cached.data) {
|
|
707
|
+
console.log('[WorkflowService] dispatch cache HIT', { cache, source: cached.source });
|
|
708
|
+
(_c = this.logService) === null || _c === void 0 ? void 0 : _c.add(Object.assign(Object.assign({}, baseLogs), { message: `Workflow dispatch - cache hit (${cached.source})`, successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS, data: { workflow: data.workflow, operation: 'dispatch', cache_source: cached.source }, cache_tag: cache, cache_key: cached.key, cache_status: true }));
|
|
709
|
+
(_d = this.logService) === null || _d === void 0 ? void 0 : _d.publish();
|
|
710
|
+
return cached.data;
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
// Check if job exists, if not create it
|
|
714
|
+
console.log('[WorkflowService] dispatch fetching existing job', { jobTag });
|
|
715
|
+
const existingJob = await productBuilder.fetchJob(jobTag);
|
|
716
|
+
if (!existingJob) {
|
|
717
|
+
console.log('[WorkflowService] dispatch job not found, creating', { jobTag });
|
|
718
|
+
await productBuilder.createJob({
|
|
719
|
+
tag: jobTag,
|
|
720
|
+
name: `Workflow: ${data.workflow}`,
|
|
721
|
+
description: `Auto-created job for workflow ${data.workflow}`,
|
|
722
|
+
type: productsBuilder_types_1.JobEventTypes.WORKFLOW, // Use workflow job type
|
|
723
|
+
app: data.workflow,
|
|
724
|
+
event: 'execute',
|
|
725
|
+
executions: 0,
|
|
726
|
+
intervals: schedule.every || 0,
|
|
727
|
+
start_at: startAt,
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
const jobInput = {
|
|
731
|
+
product: data.product,
|
|
732
|
+
env: data.env,
|
|
733
|
+
event: jobTag,
|
|
734
|
+
input: resolvedData.input,
|
|
735
|
+
retries: data.retries || 0,
|
|
736
|
+
start_at: startAt,
|
|
737
|
+
session: data.session,
|
|
738
|
+
cache: data.cache,
|
|
739
|
+
repeat: schedule.cron || schedule.every
|
|
740
|
+
? {
|
|
741
|
+
cron: schedule.cron,
|
|
742
|
+
every: schedule.every,
|
|
743
|
+
limit: schedule.limit,
|
|
744
|
+
endDate: schedule.endDate,
|
|
745
|
+
tz: schedule.tz,
|
|
746
|
+
}
|
|
747
|
+
: undefined,
|
|
748
|
+
};
|
|
749
|
+
console.log('[WorkflowService] dispatch calling processJob', { jobTag, hasRepeat: !!(schedule.cron || schedule.every) });
|
|
750
|
+
await processorService.processJob(jobInput);
|
|
751
|
+
const isRecurring = !!(schedule.cron || schedule.every);
|
|
752
|
+
console.log('[WorkflowService] dispatch processJob completed', { isRecurring });
|
|
753
|
+
let nextRunAt;
|
|
754
|
+
if (isRecurring && schedule.every) {
|
|
755
|
+
nextRunAt = startAt + schedule.every;
|
|
756
|
+
}
|
|
757
|
+
const job_id = (0, crypto_1.randomUUID)();
|
|
758
|
+
const result = {
|
|
759
|
+
job_id,
|
|
760
|
+
status: startAt > Date.now() ? 'scheduled' : 'queued',
|
|
761
|
+
scheduled_at: startAt,
|
|
762
|
+
recurring: isRecurring,
|
|
763
|
+
next_run_at: nextRunAt,
|
|
764
|
+
};
|
|
765
|
+
// Store in cache for idempotency (fire-and-forget)
|
|
766
|
+
if (cache && this.cacheManager && this._privateKey) {
|
|
767
|
+
const cacheConfig = await this.validateCache(data.product, cache);
|
|
768
|
+
this.cacheManager.store({
|
|
769
|
+
cache_tag: cache,
|
|
770
|
+
product_tag: data.product,
|
|
771
|
+
component_tag: data.workflow,
|
|
772
|
+
component_type: 'workflow',
|
|
773
|
+
operation: 'dispatch',
|
|
774
|
+
input: { workflow: data.workflow, input: data.input, schedule: data.schedule },
|
|
775
|
+
privateKey: this._privateKey,
|
|
776
|
+
expiry: cacheConfig.expiry,
|
|
777
|
+
}, result);
|
|
778
|
+
}
|
|
779
|
+
(_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow dispatch - success', successful_execution: true, data: { workflow: data.workflow, operation: 'dispatch', job_id }, status: logs_types_1.LogEventStatus.SUCCESS }));
|
|
780
|
+
(_f = this.logService) === null || _f === void 0 ? void 0 : _f.publish();
|
|
781
|
+
console.log('[WorkflowService] dispatch SUCCESS', { workflow: data.workflow, job_id: result.job_id, status: result.status });
|
|
782
|
+
return result;
|
|
783
|
+
}
|
|
784
|
+
catch (error) {
|
|
785
|
+
console.log('[WorkflowService] dispatch FAILED', { workflow: data.workflow, error: String(error) });
|
|
786
|
+
(_g = this.logService) === null || _g === void 0 ? void 0 : _g.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow dispatch - failed', failed_execution: true, data: { workflow: data.workflow, operation: 'dispatch', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
|
|
787
|
+
await ((_h = this.logService) === null || _h === void 0 ? void 0 : _h.publish());
|
|
788
|
+
throw error;
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
// ==================== SIGNAL & QUERY ====================
|
|
792
|
+
/**
|
|
793
|
+
* Send a signal to a running workflow
|
|
794
|
+
*
|
|
795
|
+
* @example
|
|
796
|
+
* ```ts
|
|
797
|
+
* await ductape.workflows.signal({
|
|
798
|
+
* product: 'my-product',
|
|
799
|
+
* env: 'production',
|
|
800
|
+
* workflow_id: 'wf-123',
|
|
801
|
+
* signal: 'approve',
|
|
802
|
+
* payload: { approver_id: 'user-456', comments: 'Approved' },
|
|
803
|
+
* });
|
|
804
|
+
* ```
|
|
805
|
+
*/
|
|
806
|
+
async signal(options) {
|
|
807
|
+
var _a, _b, _c, _d, _e, _f;
|
|
808
|
+
console.log('[WorkflowService] signal ENTRY', { workflow_id: options.workflow_id, signal: options.signal, product: options.product, env: options.env });
|
|
809
|
+
const process_id = (0, processor_utils_1.generateObjectId)();
|
|
810
|
+
// Initialize logging
|
|
811
|
+
if (options.product) {
|
|
812
|
+
await this.getProductBuilder(options.product);
|
|
813
|
+
}
|
|
814
|
+
this.initializeLogService();
|
|
815
|
+
const baseLogs = {
|
|
816
|
+
product_tag: options.product,
|
|
817
|
+
workspace_id: ((_a = this.config) === null || _a === void 0 ? void 0 : _a.workspace_id) || '',
|
|
818
|
+
env: options.env,
|
|
819
|
+
process_id,
|
|
820
|
+
type: logs_types_1.LogEventTypes.WORKFLOW,
|
|
821
|
+
parent_tag: options.workflow_id,
|
|
822
|
+
child_tag: options.signal,
|
|
823
|
+
data: { workflow_id: options.workflow_id, signal: options.signal, operation: 'signal' },
|
|
824
|
+
};
|
|
825
|
+
(_b = this.logService) === null || _b === void 0 ? void 0 : _b.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow signal - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
|
|
826
|
+
try {
|
|
827
|
+
const apiService = this.ensureApiService();
|
|
828
|
+
const auth = this.getAuthPayload();
|
|
829
|
+
console.log('[WorkflowService] signal calling apiService.sendSignal', { workflow_id: options.workflow_id, signal: options.signal });
|
|
830
|
+
await apiService.sendSignal(options.workflow_id, {
|
|
831
|
+
product: options.product,
|
|
832
|
+
env: options.env,
|
|
833
|
+
signal: options.signal,
|
|
834
|
+
payload: options.payload,
|
|
835
|
+
}, auth);
|
|
836
|
+
console.log('[WorkflowService] signal SUCCESS', { workflow_id: options.workflow_id, signal: options.signal });
|
|
837
|
+
(_c = this.logService) === null || _c === void 0 ? void 0 : _c.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow signal - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
|
|
838
|
+
(_d = this.logService) === null || _d === void 0 ? void 0 : _d.publish();
|
|
839
|
+
}
|
|
840
|
+
catch (error) {
|
|
841
|
+
console.log('[WorkflowService] signal FAILED', { workflow_id: options.workflow_id, signal: options.signal, error: String(error) });
|
|
842
|
+
(_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow signal - failed', failed_execution: true, data: { workflow_id: options.workflow_id, signal: options.signal, operation: 'signal', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
|
|
843
|
+
await ((_f = this.logService) === null || _f === void 0 ? void 0 : _f.publish());
|
|
844
|
+
throw error;
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
/**
|
|
848
|
+
* Query a running workflow
|
|
849
|
+
*
|
|
850
|
+
* @example
|
|
851
|
+
* ```ts
|
|
852
|
+
* const status = await ductape.workflows.query({
|
|
853
|
+
* product: 'my-product',
|
|
854
|
+
* env: 'production',
|
|
855
|
+
* workflow_id: 'wf-123',
|
|
856
|
+
* query: 'getStatus',
|
|
857
|
+
* });
|
|
858
|
+
*
|
|
859
|
+
* console.log(status.current_step, status.progress);
|
|
860
|
+
* ```
|
|
861
|
+
*/
|
|
862
|
+
async query(options) {
|
|
863
|
+
console.log('[WorkflowService] query ENTRY', { workflow_id: options.workflow_id, query: options.query, product: options.product, env: options.env });
|
|
864
|
+
// Query is handled by getting workflow status and extracting query result
|
|
865
|
+
const status = await this.status({
|
|
866
|
+
product: options.product,
|
|
867
|
+
env: options.env,
|
|
868
|
+
workflow_id: options.workflow_id,
|
|
869
|
+
});
|
|
870
|
+
if (!status) {
|
|
871
|
+
console.log('[WorkflowService] query workflow not found', { workflow_id: options.workflow_id });
|
|
872
|
+
throw WorkflowError.notFoundError(`Workflow ${options.workflow_id} not found`);
|
|
873
|
+
}
|
|
874
|
+
const result = (status.state[options.query] || status);
|
|
875
|
+
console.log('[WorkflowService] query SUCCESS', { workflow_id: options.workflow_id, query: options.query, hasResult: result !== undefined });
|
|
876
|
+
// Return the state which contains query results
|
|
877
|
+
return result;
|
|
878
|
+
}
|
|
879
|
+
// ==================== REPLAY, RESTART & RESUME ====================
|
|
880
|
+
/**
|
|
881
|
+
* Replay a workflow with the same input
|
|
882
|
+
*
|
|
883
|
+
* @example
|
|
884
|
+
* ```ts
|
|
885
|
+
* const result = await ductape.workflows.replay({
|
|
886
|
+
* product: 'my-product',
|
|
887
|
+
* env: 'production',
|
|
888
|
+
* workflow_id: 'wf-123',
|
|
889
|
+
* reason: 'Debugging payment failure',
|
|
890
|
+
* });
|
|
891
|
+
* ```
|
|
892
|
+
*/
|
|
893
|
+
async replay(options) {
|
|
894
|
+
var _a, _b, _c, _d, _e, _f;
|
|
895
|
+
console.log('[WorkflowService] replay ENTRY', { workflow_id: options.workflow_id, product: options.product, env: options.env });
|
|
896
|
+
const process_id = (0, processor_utils_1.generateObjectId)();
|
|
897
|
+
if (!this.config) {
|
|
898
|
+
console.log('[WorkflowService] replay failed: no config');
|
|
899
|
+
throw WorkflowError.configurationError('WorkflowService not configured. Please provide config when initializing.');
|
|
900
|
+
}
|
|
901
|
+
// Initialize logging
|
|
902
|
+
await this.getProductBuilder(options.product);
|
|
903
|
+
this.initializeLogService();
|
|
904
|
+
const baseLogs = {
|
|
905
|
+
product_tag: options.product,
|
|
906
|
+
workspace_id: ((_a = this.config) === null || _a === void 0 ? void 0 : _a.workspace_id) || '',
|
|
907
|
+
env: options.env,
|
|
908
|
+
process_id,
|
|
909
|
+
type: logs_types_1.LogEventTypes.WORKFLOW,
|
|
910
|
+
parent_tag: options.workflow_id,
|
|
911
|
+
data: { workflow_id: options.workflow_id, operation: 'replay' },
|
|
912
|
+
};
|
|
913
|
+
(_b = this.logService) === null || _b === void 0 ? void 0 : _b.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow replay - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
|
|
914
|
+
try {
|
|
915
|
+
// Get original workflow execution state from backend
|
|
916
|
+
console.log('[WorkflowService] replay fetching original status', { workflow_id: options.workflow_id });
|
|
917
|
+
const originalStatus = await this.status({
|
|
918
|
+
product: options.product,
|
|
919
|
+
env: options.env,
|
|
920
|
+
workflow_id: options.workflow_id,
|
|
921
|
+
});
|
|
922
|
+
if (!originalStatus) {
|
|
923
|
+
console.log('[WorkflowService] replay original workflow not found', { workflow_id: options.workflow_id });
|
|
924
|
+
throw WorkflowError.notFoundError(`Workflow ${options.workflow_id} not found`);
|
|
925
|
+
}
|
|
926
|
+
console.log('[WorkflowService] replay original status', { workflow_tag: originalStatus.workflow_tag, status: originalStatus.status });
|
|
927
|
+
// Execute with the same input
|
|
928
|
+
console.log('[WorkflowService] replay executing with same input', { tag: originalStatus.workflow_tag });
|
|
929
|
+
const result = await this.execute({
|
|
930
|
+
product: options.product,
|
|
931
|
+
env: options.env,
|
|
932
|
+
tag: originalStatus.workflow_tag,
|
|
933
|
+
input: originalStatus.input || {},
|
|
934
|
+
idempotency_key: options.idempotency_key,
|
|
935
|
+
});
|
|
936
|
+
(_c = this.logService) === null || _c === void 0 ? void 0 : _c.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow replay - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
|
|
937
|
+
(_d = this.logService) === null || _d === void 0 ? void 0 : _d.publish();
|
|
938
|
+
console.log('[WorkflowService] replay SUCCESS', { workflow_id: options.workflow_id, replayed_from: options.workflow_id });
|
|
939
|
+
return Object.assign(Object.assign({}, result), { replayed_from: options.workflow_id });
|
|
940
|
+
}
|
|
941
|
+
catch (error) {
|
|
942
|
+
console.log('[WorkflowService] replay FAILED', { workflow_id: options.workflow_id, error: String(error) });
|
|
943
|
+
(_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { message: 'Workflow replay - failed', failed_execution: true, data: { workflow_id: options.workflow_id, operation: 'replay', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
|
|
944
|
+
await ((_f = this.logService) === null || _f === void 0 ? void 0 : _f.publish());
|
|
945
|
+
throw error;
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* Restart a workflow with new or modified input
|
|
950
|
+
*
|
|
951
|
+
* @example
|
|
952
|
+
* ```ts
|
|
953
|
+
* const result = await ductape.workflows.restart({
|
|
954
|
+
* product: 'my-product',
|
|
955
|
+
* env: 'production',
|
|
956
|
+
* workflow_id: 'wf-123',
|
|
957
|
+
* input: { email: 'corrected@email.com' },
|
|
958
|
+
* reason: 'Customer email was incorrect',
|
|
959
|
+
* });
|
|
960
|
+
* ```
|
|
961
|
+
*/
|
|
962
|
+
async restart(options) {
|
|
963
|
+
console.log('[WorkflowService] restart ENTRY', { workflow_id: options.workflow_id, product: options.product, env: options.env, hasInput: !!options.input });
|
|
964
|
+
if (!this.config) {
|
|
965
|
+
console.log('[WorkflowService] restart failed: no config');
|
|
966
|
+
throw WorkflowError.configurationError('WorkflowService not configured. Please provide config when initializing.');
|
|
967
|
+
}
|
|
968
|
+
// Get original workflow execution state from backend
|
|
969
|
+
const originalStatus = await this.status({
|
|
970
|
+
product: options.product,
|
|
971
|
+
env: options.env,
|
|
972
|
+
workflow_id: options.workflow_id,
|
|
973
|
+
});
|
|
974
|
+
if (!originalStatus) {
|
|
975
|
+
console.log('[WorkflowService] restart workflow not found', { workflow_id: options.workflow_id });
|
|
976
|
+
throw WorkflowError.notFoundError(`Workflow ${options.workflow_id} not found`);
|
|
977
|
+
}
|
|
978
|
+
console.log('[WorkflowService] restart original status', { workflow_tag: originalStatus.workflow_tag });
|
|
979
|
+
// Determine the new input
|
|
980
|
+
let newInput;
|
|
981
|
+
if (options.input) {
|
|
982
|
+
newInput = options.input;
|
|
983
|
+
}
|
|
984
|
+
else if (options.input_override && options.merge_input) {
|
|
985
|
+
newInput = Object.assign(Object.assign({}, (originalStatus.input || {})), options.input_override);
|
|
986
|
+
}
|
|
987
|
+
else if (options.input_override) {
|
|
988
|
+
newInput = options.input_override;
|
|
989
|
+
}
|
|
990
|
+
else {
|
|
991
|
+
newInput = originalStatus.input || {};
|
|
992
|
+
}
|
|
993
|
+
// Execute with the new input
|
|
994
|
+
console.log('[WorkflowService] restart executing with new input', { tag: originalStatus.workflow_tag, inputKeys: Object.keys(newInput || {}) });
|
|
995
|
+
const result = await this.execute({
|
|
996
|
+
product: options.product,
|
|
997
|
+
env: options.env,
|
|
998
|
+
tag: originalStatus.workflow_tag,
|
|
999
|
+
input: newInput,
|
|
1000
|
+
});
|
|
1001
|
+
console.log('[WorkflowService] restart SUCCESS', { workflow_id: options.workflow_id, restarted_from: options.workflow_id });
|
|
1002
|
+
return Object.assign(Object.assign({}, result), { restarted_from: options.workflow_id });
|
|
1003
|
+
}
|
|
1004
|
+
/**
|
|
1005
|
+
* Resume a paused or failed workflow from where it stopped
|
|
1006
|
+
*
|
|
1007
|
+
* @example
|
|
1008
|
+
* ```ts
|
|
1009
|
+
* const result = await ductape.workflows.resume({
|
|
1010
|
+
* product: 'my-product',
|
|
1011
|
+
* env: 'production',
|
|
1012
|
+
* workflow_id: 'wf-123',
|
|
1013
|
+
* from_checkpoint: 'payment-complete',
|
|
1014
|
+
* });
|
|
1015
|
+
* ```
|
|
1016
|
+
*/
|
|
1017
|
+
async resume(options) {
|
|
1018
|
+
var _a, _b;
|
|
1019
|
+
console.log('[WorkflowService] resume ENTRY', { workflow_id: options.workflow_id, product: options.product, env: options.env, from_checkpoint: options.from_checkpoint, from_step: options.from_step });
|
|
1020
|
+
if (!this.config) {
|
|
1021
|
+
console.log('[WorkflowService] resume failed: no config');
|
|
1022
|
+
throw WorkflowError.configurationError('WorkflowService not configured. Please provide config when initializing.');
|
|
1023
|
+
}
|
|
1024
|
+
// Get original workflow execution state from backend
|
|
1025
|
+
const originalStatus = await this.status({
|
|
1026
|
+
product: options.product,
|
|
1027
|
+
env: options.env,
|
|
1028
|
+
workflow_id: options.workflow_id,
|
|
1029
|
+
});
|
|
1030
|
+
if (!originalStatus) {
|
|
1031
|
+
console.log('[WorkflowService] resume workflow not found', { workflow_id: options.workflow_id });
|
|
1032
|
+
throw WorkflowError.notFoundError(`Workflow ${options.workflow_id} not found`);
|
|
1033
|
+
}
|
|
1034
|
+
console.log('[WorkflowService] resume original status', { workflow_tag: originalStatus.workflow_tag, completed_steps: (_b = (_a = originalStatus.completed_steps) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0 });
|
|
1035
|
+
// Fetch the workflow configuration
|
|
1036
|
+
const builder = await this.getProductBuilder(options.product);
|
|
1037
|
+
const workflow = await builder.fetchWorkflow(originalStatus.workflow_tag);
|
|
1038
|
+
if (!workflow) {
|
|
1039
|
+
console.log('[WorkflowService] resume workflow config not found', { tag: originalStatus.workflow_tag });
|
|
1040
|
+
throw WorkflowError.notFoundError(`Workflow ${originalStatus.workflow_tag} not found`);
|
|
1041
|
+
}
|
|
1042
|
+
// Create executor with resume options
|
|
1043
|
+
console.log('[WorkflowService] resume creating executor and resuming', { tag: workflow.tag });
|
|
1044
|
+
const executor = new workflow_executor_1.WorkflowExecutor(this.config, workflow, {
|
|
1045
|
+
product: options.product,
|
|
1046
|
+
env: options.env,
|
|
1047
|
+
tag: originalStatus.workflow_tag,
|
|
1048
|
+
input: Object.assign(Object.assign({}, (originalStatus.input || {})), (options.input || {})),
|
|
1049
|
+
}, this._privateKey);
|
|
1050
|
+
// Resume execution (executor handles skipping completed steps)
|
|
1051
|
+
const result = await executor.resume({
|
|
1052
|
+
completed_steps: originalStatus.completed_steps,
|
|
1053
|
+
state: originalStatus.state,
|
|
1054
|
+
from_checkpoint: options.from_checkpoint,
|
|
1055
|
+
from_step: options.from_step,
|
|
1056
|
+
skip_steps: options.skip_steps,
|
|
1057
|
+
});
|
|
1058
|
+
console.log('[WorkflowService] resume SUCCESS', { workflow_id: options.workflow_id, resumed_from: options.workflow_id });
|
|
1059
|
+
return Object.assign(Object.assign({}, result), { resumed_from: options.workflow_id, resumed_checkpoint: options.from_checkpoint });
|
|
1060
|
+
}
|
|
1061
|
+
/**
|
|
1062
|
+
* Replay a workflow starting from a specific step
|
|
1063
|
+
*
|
|
1064
|
+
* @example
|
|
1065
|
+
* ```ts
|
|
1066
|
+
* const result = await ductape.workflows.replayFromStep({
|
|
1067
|
+
* product: 'my-product',
|
|
1068
|
+
* env: 'production',
|
|
1069
|
+
* workflow_id: 'wf-123',
|
|
1070
|
+
* from_step: 'process-payment',
|
|
1071
|
+
* });
|
|
1072
|
+
* ```
|
|
1073
|
+
*/
|
|
1074
|
+
async replayFromStep(options) {
|
|
1075
|
+
console.log('[WorkflowService] replayFromStep ENTRY', { workflow_id: options.workflow_id, from_step: options.from_step, product: options.product, env: options.env });
|
|
1076
|
+
if (!this.config) {
|
|
1077
|
+
console.log('[WorkflowService] replayFromStep failed: no config');
|
|
1078
|
+
throw WorkflowError.configurationError('WorkflowService not configured. Please provide config when initializing.');
|
|
1079
|
+
}
|
|
1080
|
+
// Get original workflow execution state
|
|
1081
|
+
const originalStatus = await this.status({
|
|
1082
|
+
product: options.product,
|
|
1083
|
+
env: options.env,
|
|
1084
|
+
workflow_id: options.workflow_id,
|
|
1085
|
+
});
|
|
1086
|
+
if (!originalStatus) {
|
|
1087
|
+
console.log('[WorkflowService] replayFromStep workflow not found', { workflow_id: options.workflow_id });
|
|
1088
|
+
throw WorkflowError.notFoundError(`Workflow ${options.workflow_id} not found`);
|
|
1089
|
+
}
|
|
1090
|
+
// Fetch the workflow configuration
|
|
1091
|
+
const builder = await this.getProductBuilder(options.product);
|
|
1092
|
+
const workflow = await builder.fetchWorkflow(originalStatus.workflow_tag);
|
|
1093
|
+
if (!workflow) {
|
|
1094
|
+
console.log('[WorkflowService] replayFromStep workflow config not found', { tag: originalStatus.workflow_tag });
|
|
1095
|
+
throw WorkflowError.notFoundError(`Workflow ${originalStatus.workflow_tag} not found`);
|
|
1096
|
+
}
|
|
1097
|
+
// Find steps before from_step to mark as completed
|
|
1098
|
+
const stepIndex = workflow.steps.findIndex((s) => s.tag === options.from_step);
|
|
1099
|
+
if (stepIndex === -1) {
|
|
1100
|
+
console.log('[WorkflowService] replayFromStep step not found', { from_step: options.from_step });
|
|
1101
|
+
throw WorkflowError.validationError(`Step ${options.from_step} not found in workflow`);
|
|
1102
|
+
}
|
|
1103
|
+
const completedSteps = workflow.steps.slice(0, stepIndex).map((s) => s.tag);
|
|
1104
|
+
console.log('[WorkflowService] replayFromStep stepIndex and completedSteps', { from_step: options.from_step, stepIndex, completedStepsCount: completedSteps.length });
|
|
1105
|
+
// Create executor with partial state
|
|
1106
|
+
const executor = new workflow_executor_1.WorkflowExecutor(this.config, workflow, {
|
|
1107
|
+
product: options.product,
|
|
1108
|
+
env: options.env,
|
|
1109
|
+
tag: originalStatus.workflow_tag,
|
|
1110
|
+
input: originalStatus.input || {},
|
|
1111
|
+
}, this._privateKey);
|
|
1112
|
+
// Resume from the specified step with overridden outputs
|
|
1113
|
+
const result = await executor.resume({
|
|
1114
|
+
completed_steps: completedSteps,
|
|
1115
|
+
state: originalStatus.state,
|
|
1116
|
+
step_outputs: options.step_outputs,
|
|
1117
|
+
});
|
|
1118
|
+
console.log('[WorkflowService] replayFromStep SUCCESS', { workflow_id: options.workflow_id, from_step: options.from_step });
|
|
1119
|
+
return Object.assign(Object.assign({}, result), { replayed_from: options.workflow_id });
|
|
1120
|
+
}
|
|
1121
|
+
// ==================== STATUS & MANAGEMENT ====================
|
|
1122
|
+
/**
|
|
1123
|
+
* Get the status of a workflow execution
|
|
1124
|
+
*
|
|
1125
|
+
* @example
|
|
1126
|
+
* ```ts
|
|
1127
|
+
* const status = await ductape.workflows.status({
|
|
1128
|
+
* product: 'my-product',
|
|
1129
|
+
* env: 'production',
|
|
1130
|
+
* workflow_id: 'wf-123',
|
|
1131
|
+
* });
|
|
1132
|
+
* ```
|
|
1133
|
+
*/
|
|
1134
|
+
async status(options) {
|
|
1135
|
+
console.log('[WorkflowService] status ENTRY', { workflow_id: options.workflow_id, product: options.product, env: options.env });
|
|
1136
|
+
const apiService = this.ensureApiService();
|
|
1137
|
+
const auth = this.getAuthPayload();
|
|
1138
|
+
const response = await apiService.getStatus(options.workflow_id, options.product, options.env, auth);
|
|
1139
|
+
if (!response) {
|
|
1140
|
+
console.log('[WorkflowService] status not found', { workflow_id: options.workflow_id });
|
|
1141
|
+
return null;
|
|
1142
|
+
}
|
|
1143
|
+
console.log('[WorkflowService] status SUCCESS', { workflow_id: response.workflow_id, workflow_tag: response.workflow_tag, status: response.status });
|
|
1144
|
+
return {
|
|
1145
|
+
workflow_id: response.workflow_id,
|
|
1146
|
+
workflow_tag: response.workflow_tag,
|
|
1147
|
+
status: response.status,
|
|
1148
|
+
current_step: response.current_step,
|
|
1149
|
+
completed_steps: response.completed_steps,
|
|
1150
|
+
state: response.state,
|
|
1151
|
+
started_at: response.started_at,
|
|
1152
|
+
updated_at: response.updated_at,
|
|
1153
|
+
input: response.input,
|
|
1154
|
+
output: response.output,
|
|
1155
|
+
error: response.error,
|
|
1156
|
+
};
|
|
1157
|
+
}
|
|
1158
|
+
/**
|
|
1159
|
+
* Cancel a running workflow
|
|
1160
|
+
*
|
|
1161
|
+
* @example
|
|
1162
|
+
* ```ts
|
|
1163
|
+
* const result = await ductape.workflows.cancel({
|
|
1164
|
+
* product: 'my-product',
|
|
1165
|
+
* env: 'production',
|
|
1166
|
+
* workflow_id: 'wf-123',
|
|
1167
|
+
* reason: 'User requested cancellation',
|
|
1168
|
+
* });
|
|
1169
|
+
* ```
|
|
1170
|
+
*/
|
|
1171
|
+
async cancel(options) {
|
|
1172
|
+
var _a, _b, _c, _d;
|
|
1173
|
+
console.log('[WorkflowService] cancel ENTRY', {
|
|
1174
|
+
workflow_id: options.workflow_id,
|
|
1175
|
+
product: options.product,
|
|
1176
|
+
env: options.env,
|
|
1177
|
+
reason: options.reason,
|
|
1178
|
+
});
|
|
1179
|
+
const apiService = this.ensureApiService();
|
|
1180
|
+
const auth = this.getAuthPayload();
|
|
1181
|
+
const response = await apiService.cancel(options.workflow_id, options.product, options.env, options.reason || 'Cancelled by user', auth);
|
|
1182
|
+
console.log('[WorkflowService] cancel SUCCESS', {
|
|
1183
|
+
workflow_id: options.workflow_id,
|
|
1184
|
+
cancelled: response.cancelled,
|
|
1185
|
+
rolled_back_count: (_b = (_a = response.rolled_back_steps) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0,
|
|
1186
|
+
failed_rollbacks_count: (_d = (_c = response.failed_rollbacks) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0,
|
|
1187
|
+
});
|
|
1188
|
+
return {
|
|
1189
|
+
cancelled: response.cancelled,
|
|
1190
|
+
rolled_back_steps: response.rolled_back_steps,
|
|
1191
|
+
failed_rollbacks: response.failed_rollbacks,
|
|
1192
|
+
};
|
|
1193
|
+
}
|
|
1194
|
+
/**
|
|
1195
|
+
* Get the execution history of a workflow
|
|
1196
|
+
*
|
|
1197
|
+
* @example
|
|
1198
|
+
* ```ts
|
|
1199
|
+
* const history = await ductape.workflows.history({
|
|
1200
|
+
* product: 'my-product',
|
|
1201
|
+
* env: 'production',
|
|
1202
|
+
* workflow_id: 'wf-123',
|
|
1203
|
+
* });
|
|
1204
|
+
* ```
|
|
1205
|
+
*/
|
|
1206
|
+
async history(options) {
|
|
1207
|
+
var _a, _b, _c, _d;
|
|
1208
|
+
console.log('[WorkflowService] history ENTRY', { workflow_id: options.workflow_id, product: options.product, env: options.env });
|
|
1209
|
+
const apiService = this.ensureApiService();
|
|
1210
|
+
const auth = this.getAuthPayload();
|
|
1211
|
+
const response = await apiService.getHistory(options.workflow_id, options.product, options.env, auth);
|
|
1212
|
+
console.log('[WorkflowService] history SUCCESS', { workflow_id: response.workflow_id, eventsCount: (_b = (_a = response.events) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0, checkpointsCount: (_d = (_c = response.checkpoints) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0 });
|
|
1213
|
+
return {
|
|
1214
|
+
workflow_id: response.workflow_id,
|
|
1215
|
+
workflow_tag: response.workflow_tag,
|
|
1216
|
+
status: response.status,
|
|
1217
|
+
events: response.events.map((e) => ({
|
|
1218
|
+
type: e.type,
|
|
1219
|
+
timestamp: e.timestamp,
|
|
1220
|
+
data: e.data,
|
|
1221
|
+
})),
|
|
1222
|
+
checkpoints: response.checkpoints,
|
|
1223
|
+
replays: response.replays,
|
|
1224
|
+
restarts: response.restarts,
|
|
1225
|
+
};
|
|
1226
|
+
}
|
|
1227
|
+
/**
|
|
1228
|
+
* Get detailed information about a specific step
|
|
1229
|
+
*
|
|
1230
|
+
* @example
|
|
1231
|
+
* ```ts
|
|
1232
|
+
* const detail = await ductape.workflows.stepDetail({
|
|
1233
|
+
* product: 'my-product',
|
|
1234
|
+
* env: 'production',
|
|
1235
|
+
* workflow_id: 'wf-123',
|
|
1236
|
+
* step_tag: 'process-payment',
|
|
1237
|
+
* });
|
|
1238
|
+
* ```
|
|
1239
|
+
*/
|
|
1240
|
+
async stepDetail(options) {
|
|
1241
|
+
console.log('[WorkflowService] stepDetail ENTRY', { workflow_id: options.workflow_id, step_tag: options.step_tag, product: options.product, env: options.env });
|
|
1242
|
+
const apiService = this.ensureApiService();
|
|
1243
|
+
const auth = this.getAuthPayload();
|
|
1244
|
+
const response = await apiService.getStepDetail(options.workflow_id, options.step_tag, options.product, options.env, auth);
|
|
1245
|
+
if (!response) {
|
|
1246
|
+
console.log('[WorkflowService] stepDetail not found', { workflow_id: options.workflow_id, step_tag: options.step_tag });
|
|
1247
|
+
return null;
|
|
1248
|
+
}
|
|
1249
|
+
console.log('[WorkflowService] stepDetail SUCCESS', { workflow_id: options.workflow_id, step_tag: response.tag, status: response.status });
|
|
1250
|
+
return {
|
|
1251
|
+
tag: response.tag,
|
|
1252
|
+
name: response.name,
|
|
1253
|
+
status: response.status,
|
|
1254
|
+
input: response.input,
|
|
1255
|
+
output: response.output,
|
|
1256
|
+
error: response.error,
|
|
1257
|
+
attempts: response.attempts,
|
|
1258
|
+
start_time: response.start_time,
|
|
1259
|
+
end_time: response.end_time,
|
|
1260
|
+
duration: response.duration,
|
|
1261
|
+
rollback_status: response.rollback_status,
|
|
1262
|
+
rollback_error: response.rollback_error,
|
|
1263
|
+
};
|
|
1264
|
+
}
|
|
1265
|
+
/**
|
|
1266
|
+
* List all related executions (replays, restarts, resumes)
|
|
1267
|
+
*
|
|
1268
|
+
* @example
|
|
1269
|
+
* ```ts
|
|
1270
|
+
* const related = await ductape.workflows.relatedExecutions({
|
|
1271
|
+
* product: 'my-product',
|
|
1272
|
+
* env: 'production',
|
|
1273
|
+
* workflow_id: 'wf-123',
|
|
1274
|
+
* });
|
|
1275
|
+
* ```
|
|
1276
|
+
*/
|
|
1277
|
+
async relatedExecutions(options) {
|
|
1278
|
+
var _a, _b;
|
|
1279
|
+
console.log('[WorkflowService] relatedExecutions ENTRY', { workflow_id: options.workflow_id, product: options.product, env: options.env });
|
|
1280
|
+
const apiService = this.ensureApiService();
|
|
1281
|
+
const auth = this.getAuthPayload();
|
|
1282
|
+
const response = await apiService.getRelatedExecutions(options.workflow_id, options.product, options.env, auth);
|
|
1283
|
+
console.log('[WorkflowService] relatedExecutions SUCCESS', { workflow_id: options.workflow_id, executionsCount: (_b = (_a = response.executions) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0 });
|
|
1284
|
+
return {
|
|
1285
|
+
original: response.original,
|
|
1286
|
+
executions: response.executions.map((e) => ({
|
|
1287
|
+
workflow_id: e.workflow_id,
|
|
1288
|
+
type: e.type,
|
|
1289
|
+
status: e.status,
|
|
1290
|
+
created_at: e.created_at,
|
|
1291
|
+
replayed_from: e.replayed_from,
|
|
1292
|
+
restarted_from: e.restarted_from,
|
|
1293
|
+
resumed_from: e.resumed_from,
|
|
1294
|
+
})),
|
|
1295
|
+
};
|
|
1296
|
+
}
|
|
1297
|
+
/**
|
|
1298
|
+
* Compare two workflow executions
|
|
1299
|
+
*
|
|
1300
|
+
* @example
|
|
1301
|
+
* ```ts
|
|
1302
|
+
* const comparison = await ductape.workflows.compare({
|
|
1303
|
+
* product: 'my-product',
|
|
1304
|
+
* env: 'production',
|
|
1305
|
+
* workflow_ids: ['wf-123', 'wf-456'],
|
|
1306
|
+
* });
|
|
1307
|
+
* ```
|
|
1308
|
+
*/
|
|
1309
|
+
async compare(options) {
|
|
1310
|
+
console.log('[WorkflowService] compare ENTRY', { workflow_ids: options.workflow_ids, product: options.product, env: options.env });
|
|
1311
|
+
const apiService = this.ensureApiService();
|
|
1312
|
+
const auth = this.getAuthPayload();
|
|
1313
|
+
const response = await apiService.compareExecutions(options.workflow_ids, options.product, options.env, auth);
|
|
1314
|
+
console.log('[WorkflowService] compare SUCCESS', { workflow_ids: response.workflows });
|
|
1315
|
+
return {
|
|
1316
|
+
workflows: response.workflows,
|
|
1317
|
+
input_diff: response.input_diff,
|
|
1318
|
+
step_diffs: response.step_diffs,
|
|
1319
|
+
outcome_diff: response.outcome_diff,
|
|
1320
|
+
};
|
|
1321
|
+
}
|
|
1322
|
+
// ==================== HELPER METHODS ====================
|
|
1323
|
+
/**
|
|
1324
|
+
* Convert IProductWorkflow to IWorkflowConfig
|
|
1325
|
+
*/
|
|
1326
|
+
productWorkflowToConfig(workflow) {
|
|
1327
|
+
return {
|
|
1328
|
+
name: workflow.name,
|
|
1329
|
+
tag: workflow.tag,
|
|
1330
|
+
description: workflow.description,
|
|
1331
|
+
input: workflow.input,
|
|
1332
|
+
output: workflow.output,
|
|
1333
|
+
steps: workflow.steps,
|
|
1334
|
+
signals: workflow.signals,
|
|
1335
|
+
queries: workflow.queries,
|
|
1336
|
+
options: workflow.options,
|
|
1337
|
+
envs: workflow.envs,
|
|
1338
|
+
};
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
exports.WorkflowService = WorkflowService;
|
|
1342
|
+
// ==================== WORKFLOW COMPILER ====================
|
|
1343
|
+
/** Symbol to detect workflow input proxy when serializing step input to operator strings */
|
|
1344
|
+
const INPUT_PROXY_SYMBOL = Symbol.for('RecordingContext.inputProxy');
|
|
1345
|
+
/** Symbol to detect step result proxy (values are already operator strings) */
|
|
1346
|
+
const STEP_RESULT_PROXY_SYMBOL = Symbol.for('RecordingContext.stepResultProxy');
|
|
1347
|
+
/** Symbol on step result proxy to get the operator string (for nested result paths) */
|
|
1348
|
+
const STEP_RESULT_REF_STRING = Symbol.for('RecordingContext.stepResultRefString');
|
|
1349
|
+
/**
|
|
1350
|
+
* Create a proxy for ctx.input so that ctx.input.field compiles to $Input{field}.
|
|
1351
|
+
* When the whole proxy is used as a value (e.g. body: ctx.input), it is replaced
|
|
1352
|
+
* with an object of $Input{key} for each key in the workflow input schema.
|
|
1353
|
+
*/
|
|
1354
|
+
function createInputProxy(schemaKeys) {
|
|
1355
|
+
const refs = Object.fromEntries(schemaKeys.map((k) => [k, `$Input{${k}}`]));
|
|
1356
|
+
const proxy = new Proxy(refs, {
|
|
1357
|
+
get(target, prop) {
|
|
1358
|
+
if (prop === INPUT_PROXY_SYMBOL)
|
|
1359
|
+
return true;
|
|
1360
|
+
if (typeof prop === 'string' && prop in target)
|
|
1361
|
+
return target[prop];
|
|
1362
|
+
return `$Input{${String(prop)}}`;
|
|
1363
|
+
},
|
|
1364
|
+
});
|
|
1365
|
+
proxy[INPUT_PROXY_SYMBOL] = true;
|
|
1366
|
+
return proxy;
|
|
1367
|
+
}
|
|
1368
|
+
/**
|
|
1369
|
+
* Create a proxy for a step result so that result.field compiles to $Sequence{main}{stepTag}{field}.
|
|
1370
|
+
* Supports nested paths: result.data.nested.foo → $Sequence{main}{stepTag}{data.nested.foo}.
|
|
1371
|
+
* When a property is read, recordUsage(stepTag) is called so depends_on can be inferred.
|
|
1372
|
+
*/
|
|
1373
|
+
function createStepResultProxy(workflowTag, stepTag, pathPrefix = '', recordUsage) {
|
|
1374
|
+
const refString = pathPrefix ? `$Sequence{main}{${stepTag}}{${pathPrefix}}` : undefined;
|
|
1375
|
+
return new Proxy({}, {
|
|
1376
|
+
get(_, prop) {
|
|
1377
|
+
if (prop === STEP_RESULT_PROXY_SYMBOL)
|
|
1378
|
+
return true;
|
|
1379
|
+
if (prop === STEP_RESULT_REF_STRING)
|
|
1380
|
+
return refString;
|
|
1381
|
+
// So template literals like `${paymentResult.transactionId}` get the operator string
|
|
1382
|
+
if (prop === Symbol.toPrimitive) {
|
|
1383
|
+
return (hint) => (hint === 'string' && refString ? refString : undefined);
|
|
1384
|
+
}
|
|
1385
|
+
if (prop === 'toString' || prop === 'valueOf') {
|
|
1386
|
+
return () => refString !== null && refString !== void 0 ? refString : '';
|
|
1387
|
+
}
|
|
1388
|
+
if (typeof prop === 'string') {
|
|
1389
|
+
recordUsage === null || recordUsage === void 0 ? void 0 : recordUsage(stepTag);
|
|
1390
|
+
}
|
|
1391
|
+
const fullPath = pathPrefix ? `${pathPrefix}.${String(prop)}` : String(prop);
|
|
1392
|
+
return createStepResultProxy(workflowTag, stepTag, fullPath, recordUsage);
|
|
1393
|
+
},
|
|
1394
|
+
});
|
|
1395
|
+
}
|
|
1396
|
+
/**
|
|
1397
|
+
* Recursively convert recorded step input to operator strings per Ductape operator docs.
|
|
1398
|
+
* - Replaces input-proxy values with { key: '$Input{key}', ... } for all workflow input keys.
|
|
1399
|
+
* - Leaves values that are already operator strings (e.g. from step result proxy) as-is.
|
|
1400
|
+
* - Strings containing operator refs ($Input{...}, $Sequence{main}{...}{...}, $Now) are converted to $Concat([...], "").
|
|
1401
|
+
* - Default delimiter is "" so template literals like `receipts/${ctx.input.orderId}.txt` become receipts/ORD-001.txt not receipts/ ORD-001 .txt.
|
|
1402
|
+
* - Recurses into plain objects and arrays; leaves other primitives unchanged.
|
|
1403
|
+
*/
|
|
1404
|
+
const OPERATOR_REF_IN_STRING_REGEX = /(\$Input\{[^}]+\}|\$Sequence\{main\}\{[^}]+\}\{[^}]*\}|\$Now)/g;
|
|
1405
|
+
function convertStringToConcatIfOperatorRefs(str, delimiter = '') {
|
|
1406
|
+
OPERATOR_REF_IN_STRING_REGEX.lastIndex = 0;
|
|
1407
|
+
const tokens = str.split(OPERATOR_REF_IN_STRING_REGEX);
|
|
1408
|
+
const parts = [];
|
|
1409
|
+
for (const t of tokens) {
|
|
1410
|
+
if (!t)
|
|
1411
|
+
continue;
|
|
1412
|
+
const isOp = t.startsWith('$Input{') || t.startsWith('$Sequence{') || t === '$Now';
|
|
1413
|
+
if (isOp) {
|
|
1414
|
+
parts.push(t);
|
|
1415
|
+
}
|
|
1416
|
+
else {
|
|
1417
|
+
const trimmed = t.trim();
|
|
1418
|
+
if (trimmed.length > 0)
|
|
1419
|
+
parts.push(trimmed);
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
if (parts.length <= 1)
|
|
1423
|
+
return str;
|
|
1424
|
+
return `$Concat([${parts.map((s) => (s.startsWith('$') ? s : JSON.stringify(s))).join(', ')}], "${delimiter.replace(/"/g, '\\"')}")`;
|
|
1425
|
+
}
|
|
1426
|
+
function convertToOperatorInput(value, inputProxy, schemaKeys) {
|
|
1427
|
+
if (value === null || value === undefined)
|
|
1428
|
+
return value;
|
|
1429
|
+
if (inputProxy && value === inputProxy) {
|
|
1430
|
+
return Object.fromEntries(schemaKeys.map((k) => [k, `$Input{${k}}`]));
|
|
1431
|
+
}
|
|
1432
|
+
const v = value;
|
|
1433
|
+
if (typeof v === 'object' && v !== null && v[INPUT_PROXY_SYMBOL] === true) {
|
|
1434
|
+
return Object.fromEntries(schemaKeys.map((k) => [k, `$Input{${k}}`]));
|
|
1435
|
+
}
|
|
1436
|
+
// Step result proxy (including nested result.data.foo) exposes operator string via STEP_RESULT_REF_STRING
|
|
1437
|
+
if (typeof v === 'object' && v !== null && typeof v[STEP_RESULT_REF_STRING] === 'string') {
|
|
1438
|
+
return v[STEP_RESULT_REF_STRING];
|
|
1439
|
+
}
|
|
1440
|
+
if (Array.isArray(value)) {
|
|
1441
|
+
return value.map((item) => convertToOperatorInput(item, inputProxy, schemaKeys));
|
|
1442
|
+
}
|
|
1443
|
+
if (typeof value === 'object' && value !== null && !(value instanceof Date)) {
|
|
1444
|
+
const out = {};
|
|
1445
|
+
for (const key of Object.keys(value)) {
|
|
1446
|
+
out[key] = convertToOperatorInput(value[key], inputProxy, schemaKeys);
|
|
1447
|
+
}
|
|
1448
|
+
return out;
|
|
1449
|
+
}
|
|
1450
|
+
if (typeof value === 'string') {
|
|
1451
|
+
return convertStringToConcatIfOperatorRefs(value);
|
|
1452
|
+
}
|
|
1453
|
+
return value;
|
|
1454
|
+
}
|
|
1455
|
+
/**
|
|
1456
|
+
* Recording context that captures step definitions during handler execution.
|
|
1457
|
+
* Uses operator strings ($Input{field}, $Sequence{main}{stepTag}{field}) per Ductape operator docs.
|
|
1458
|
+
*/
|
|
1459
|
+
/** Build a step condition from a branch override so the step only runs when the overridden step's output matches (e.g. $Step{validate}{valid} == true). */
|
|
1460
|
+
function buildConditionFromOverride(stepTag, override) {
|
|
1461
|
+
if (override === null || override === undefined)
|
|
1462
|
+
return '';
|
|
1463
|
+
if (typeof override !== 'object' || Array.isArray(override)) {
|
|
1464
|
+
return `$Step{${stepTag}}{value} == ${JSON.stringify(override)}`;
|
|
1465
|
+
}
|
|
1466
|
+
const parts = [];
|
|
1467
|
+
for (const [key, val] of Object.entries(override)) {
|
|
1468
|
+
if (typeof val !== 'object' || val === null || Array.isArray(val)) {
|
|
1469
|
+
parts.push(`$Step{${stepTag}}{${key}} == ${JSON.stringify(val)}`);
|
|
1470
|
+
}
|
|
1471
|
+
}
|
|
1472
|
+
return parts.length === 0 ? '' : parts.join(' && ');
|
|
1473
|
+
}
|
|
1474
|
+
/** Build a step condition from a scenario (recordInput) so the step only runs when workflow input matches (e.g. $Input{type} == 'a'). */
|
|
1475
|
+
function buildConditionFromScenario(scenario) {
|
|
1476
|
+
const parts = [];
|
|
1477
|
+
for (const [key, val] of Object.entries(scenario)) {
|
|
1478
|
+
if (val !== undefined && (typeof val !== 'object' || val === null || Array.isArray(val))) {
|
|
1479
|
+
parts.push(`$Input{${key}} == ${JSON.stringify(val)}`);
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
return parts.length === 0 ? '' : parts.join(' && ');
|
|
1483
|
+
}
|
|
1484
|
+
/** Create ctx.input that prefers recordInput values (for loops/switch) and falls back to $Input{field} for other keys. */
|
|
1485
|
+
function createHybridInputProxy(recordInput, inputProxy) {
|
|
1486
|
+
const base = recordInput !== null && recordInput !== void 0 ? recordInput : {};
|
|
1487
|
+
if (!inputProxy)
|
|
1488
|
+
return base;
|
|
1489
|
+
return new Proxy(base, {
|
|
1490
|
+
get(target, prop) {
|
|
1491
|
+
if (typeof prop !== 'string')
|
|
1492
|
+
return target[prop];
|
|
1493
|
+
if (prop in target && target[prop] !== undefined) {
|
|
1494
|
+
return target[prop];
|
|
1495
|
+
}
|
|
1496
|
+
return inputProxy[prop];
|
|
1497
|
+
},
|
|
1498
|
+
has(target, prop) {
|
|
1499
|
+
return prop in target || (inputProxy && prop in inputProxy);
|
|
1500
|
+
},
|
|
1501
|
+
});
|
|
1502
|
+
}
|
|
1503
|
+
class RecordingContext {
|
|
1504
|
+
constructor(_input, workflowTag, workflowInputSchema, stepResultOverrides, scenarioCondition, recordInput) {
|
|
1505
|
+
this._steps = [];
|
|
1506
|
+
this._stepOrder = 0;
|
|
1507
|
+
this._currentStepTag = null;
|
|
1508
|
+
/** Step being built for the current ctx.step() call; updated in place by _updateCurrentStep so we emit one step per ctx.step(). */
|
|
1509
|
+
this._pendingStep = null;
|
|
1510
|
+
this._pendingRollback = null;
|
|
1511
|
+
this._inputProxy = null;
|
|
1512
|
+
/** Step tags whose result was read during the current step (for inferring depends_on) */
|
|
1513
|
+
this._stepResultDependencies = new Set();
|
|
1514
|
+
/** When set, the next step we push gets this condition (from a prior step's branch override). */
|
|
1515
|
+
this._pendingConditionFromOverride = null;
|
|
1516
|
+
this._stepResultOverrides = {};
|
|
1517
|
+
/** When set (from recordScenarios), every step we push gets this condition so it only runs when input matches. */
|
|
1518
|
+
this._scenarioCondition = null;
|
|
1519
|
+
this._recordInput = null;
|
|
1520
|
+
this._hybridInput = null;
|
|
1521
|
+
this._workflowTag = workflowTag;
|
|
1522
|
+
this._inputSchemaKeys = workflowInputSchema ? Object.keys(workflowInputSchema) : [];
|
|
1523
|
+
this._stepResultOverrides = stepResultOverrides !== null && stepResultOverrides !== void 0 ? stepResultOverrides : {};
|
|
1524
|
+
this._scenarioCondition = scenarioCondition !== null && scenarioCondition !== void 0 ? scenarioCondition : null;
|
|
1525
|
+
this._recordInput = recordInput !== null && recordInput !== void 0 ? recordInput : null;
|
|
1526
|
+
if (this._inputSchemaKeys.length > 0) {
|
|
1527
|
+
this._inputProxy = createInputProxy(this._inputSchemaKeys);
|
|
1528
|
+
}
|
|
1529
|
+
this._hybridInput = createHybridInputProxy(this._recordInput, this._inputProxy);
|
|
1530
|
+
}
|
|
1531
|
+
// Readonly workflow metadata — prefer recordInput for control flow (loops, switch), fall back to $Input{field}
|
|
1532
|
+
get input() {
|
|
1533
|
+
var _a, _b;
|
|
1534
|
+
return ((_b = (_a = this._hybridInput) !== null && _a !== void 0 ? _a : this._inputProxy) !== null && _b !== void 0 ? _b : {});
|
|
1535
|
+
}
|
|
1536
|
+
get workflow_id() {
|
|
1537
|
+
return `compile-${this._workflowTag}`;
|
|
1538
|
+
}
|
|
1539
|
+
get workflow_tag() {
|
|
1540
|
+
return this._workflowTag;
|
|
1541
|
+
}
|
|
1542
|
+
get env() {
|
|
1543
|
+
return 'compile';
|
|
1544
|
+
}
|
|
1545
|
+
get product() {
|
|
1546
|
+
return 'compile';
|
|
1547
|
+
}
|
|
1548
|
+
get context() {
|
|
1549
|
+
return {};
|
|
1550
|
+
}
|
|
1551
|
+
get state() {
|
|
1552
|
+
return {};
|
|
1553
|
+
}
|
|
1554
|
+
get steps() {
|
|
1555
|
+
return {};
|
|
1556
|
+
}
|
|
1557
|
+
get completed_steps() {
|
|
1558
|
+
return [];
|
|
1559
|
+
}
|
|
1560
|
+
get current_step() {
|
|
1561
|
+
return this._currentStepTag;
|
|
1562
|
+
}
|
|
1563
|
+
/** At record time returns "$Now" so template literals like `at ${ctx.now()}` compile to $Concat(..., "$Now"). */
|
|
1564
|
+
get now() {
|
|
1565
|
+
return '$Now';
|
|
1566
|
+
}
|
|
1567
|
+
/**
|
|
1568
|
+
* Record a step definition
|
|
1569
|
+
*/
|
|
1570
|
+
async step(tag, handler, rollback, options) {
|
|
1571
|
+
this._currentStepTag = tag;
|
|
1572
|
+
this._stepOrder++;
|
|
1573
|
+
this._stepResultDependencies = new Set();
|
|
1574
|
+
// Create step placeholder - will be updated in place by component calls (_updateCurrentStep)
|
|
1575
|
+
const step = {
|
|
1576
|
+
tag,
|
|
1577
|
+
name: tag,
|
|
1578
|
+
type: productsBuilder_types_1.WorkflowStepType.ACTION,
|
|
1579
|
+
event: '',
|
|
1580
|
+
input: {},
|
|
1581
|
+
options,
|
|
1582
|
+
};
|
|
1583
|
+
this._pendingStep = step;
|
|
1584
|
+
// Execute handler to capture component calls and step return value
|
|
1585
|
+
let stepReturn;
|
|
1586
|
+
try {
|
|
1587
|
+
stepReturn = await handler();
|
|
1588
|
+
}
|
|
1589
|
+
catch (e) {
|
|
1590
|
+
// Ignore errors during compilation - we're just tracing
|
|
1591
|
+
}
|
|
1592
|
+
this._pendingStep = null;
|
|
1593
|
+
// Parse and store step output in schema (operator strings for downstream $Step{tag}{field} references)
|
|
1594
|
+
const valueToCapture = stepReturn !== undefined && stepReturn !== null && typeof stepReturn === 'object' && !Array.isArray(stepReturn)
|
|
1595
|
+
? stepReturn.output !== undefined && stepReturn.process_id !== undefined
|
|
1596
|
+
? stepReturn.output
|
|
1597
|
+
: stepReturn
|
|
1598
|
+
: stepReturn;
|
|
1599
|
+
if (valueToCapture !== undefined && valueToCapture !== null && typeof valueToCapture === 'object' && !Array.isArray(valueToCapture)) {
|
|
1600
|
+
step.output = convertToOperatorInput(valueToCapture, this._inputProxy, this._inputSchemaKeys);
|
|
1601
|
+
}
|
|
1602
|
+
else if (valueToCapture !== undefined && valueToCapture !== null) {
|
|
1603
|
+
step.output = { value: convertToOperatorInput(valueToCapture, this._inputProxy, this._inputSchemaKeys) };
|
|
1604
|
+
}
|
|
1605
|
+
else {
|
|
1606
|
+
step.output = {};
|
|
1607
|
+
}
|
|
1608
|
+
// If rollback was provided, try to capture it
|
|
1609
|
+
if (rollback && this._pendingRollback) {
|
|
1610
|
+
step.rollback = this._pendingRollback;
|
|
1611
|
+
this._pendingRollback = null;
|
|
1612
|
+
}
|
|
1613
|
+
// Always add the step (even when no component was called — e.g. validate-order that only returns)
|
|
1614
|
+
if (!step.event) {
|
|
1615
|
+
step.event = step.tag;
|
|
1616
|
+
}
|
|
1617
|
+
if (this._stepResultDependencies.size > 0) {
|
|
1618
|
+
step.depends_on = Array.from(this._stepResultDependencies);
|
|
1619
|
+
}
|
|
1620
|
+
// Apply conditions: scenario (e.g. $Input{type} == 'a') and/or branch override (e.g. $Step{validate}{valid} == true)
|
|
1621
|
+
const condParts = [];
|
|
1622
|
+
if (this._scenarioCondition)
|
|
1623
|
+
condParts.push(`(${this._scenarioCondition})`);
|
|
1624
|
+
if (this._pendingConditionFromOverride) {
|
|
1625
|
+
condParts.push(`(${this._pendingConditionFromOverride})`);
|
|
1626
|
+
this._pendingConditionFromOverride = null;
|
|
1627
|
+
}
|
|
1628
|
+
if (condParts.length > 0)
|
|
1629
|
+
step.condition = condParts.join(' && ');
|
|
1630
|
+
const overrideForThisStep = this._stepResultOverrides[tag];
|
|
1631
|
+
if (overrideForThisStep !== undefined) {
|
|
1632
|
+
this._pendingConditionFromOverride = buildConditionFromOverride(tag, overrideForThisStep);
|
|
1633
|
+
}
|
|
1634
|
+
this._steps.push(step);
|
|
1635
|
+
this._currentStepTag = null;
|
|
1636
|
+
// When branchOverrides[tag] is set, return it so the handler continues past if (!result.x) return (records both branches)
|
|
1637
|
+
if (overrideForThisStep !== undefined) {
|
|
1638
|
+
return overrideForThisStep;
|
|
1639
|
+
}
|
|
1640
|
+
// Return step-result proxy so result.field compiles to $Sequence{main}{stepTag}{field}
|
|
1641
|
+
const recordUsage = (depTag) => this._stepResultDependencies.add(depTag);
|
|
1642
|
+
return createStepResultProxy(this._workflowTag, step.tag, '', recordUsage);
|
|
1643
|
+
}
|
|
1644
|
+
// ==================== COMPONENT CONTEXTS ====================
|
|
1645
|
+
get action() {
|
|
1646
|
+
return {
|
|
1647
|
+
run: async (options) => {
|
|
1648
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.ACTION, options.action, {
|
|
1649
|
+
app: options.app,
|
|
1650
|
+
input: options.input,
|
|
1651
|
+
options: { retries: options.retries, timeout: options.timeout },
|
|
1652
|
+
});
|
|
1653
|
+
return {};
|
|
1654
|
+
},
|
|
1655
|
+
};
|
|
1656
|
+
}
|
|
1657
|
+
get database() {
|
|
1658
|
+
return {
|
|
1659
|
+
execute: async (options) => {
|
|
1660
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.DATABASE_ACTION, options.event, {
|
|
1661
|
+
database: options.database,
|
|
1662
|
+
input: options.input,
|
|
1663
|
+
options: { retries: options.retries, timeout: options.timeout },
|
|
1664
|
+
});
|
|
1665
|
+
return {};
|
|
1666
|
+
},
|
|
1667
|
+
query: async (options) => {
|
|
1668
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.DATABASE_ACTION, options.event, {
|
|
1669
|
+
database: options.database,
|
|
1670
|
+
input: options.params || {},
|
|
1671
|
+
});
|
|
1672
|
+
return [];
|
|
1673
|
+
},
|
|
1674
|
+
insert: async (options) => {
|
|
1675
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.DATABASE_ACTION, options.event, {
|
|
1676
|
+
database: options.database,
|
|
1677
|
+
input: { table: options.table, data: options.data },
|
|
1678
|
+
});
|
|
1679
|
+
return {};
|
|
1680
|
+
},
|
|
1681
|
+
update: async (options) => {
|
|
1682
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.DATABASE_ACTION, options.event, {
|
|
1683
|
+
database: options.database,
|
|
1684
|
+
input: { table: options.table, data: options.data, where: options.where },
|
|
1685
|
+
});
|
|
1686
|
+
return {};
|
|
1687
|
+
},
|
|
1688
|
+
delete: async (options) => {
|
|
1689
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.DATABASE_ACTION, options.event, {
|
|
1690
|
+
database: options.database,
|
|
1691
|
+
input: { table: options.table, where: options.where },
|
|
1692
|
+
});
|
|
1693
|
+
return true;
|
|
1694
|
+
},
|
|
1695
|
+
};
|
|
1696
|
+
}
|
|
1697
|
+
get graph() {
|
|
1698
|
+
return {
|
|
1699
|
+
execute: async (options) => {
|
|
1700
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.GRAPH, options.action, {
|
|
1701
|
+
graph: options.graph,
|
|
1702
|
+
input: options.input,
|
|
1703
|
+
});
|
|
1704
|
+
return {};
|
|
1705
|
+
},
|
|
1706
|
+
createNode: async (options) => {
|
|
1707
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.GRAPH, 'createNode', {
|
|
1708
|
+
graph: options.graph,
|
|
1709
|
+
input: { labels: options.labels, properties: options.properties },
|
|
1710
|
+
});
|
|
1711
|
+
return {};
|
|
1712
|
+
},
|
|
1713
|
+
updateNode: async (options) => {
|
|
1714
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.GRAPH, 'updateNode', {
|
|
1715
|
+
graph: options.graph,
|
|
1716
|
+
input: { id: options.id, properties: options.properties },
|
|
1717
|
+
});
|
|
1718
|
+
return {};
|
|
1719
|
+
},
|
|
1720
|
+
deleteNode: async (options) => {
|
|
1721
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.GRAPH, 'deleteNode', {
|
|
1722
|
+
graph: options.graph,
|
|
1723
|
+
input: { id: options.id },
|
|
1724
|
+
});
|
|
1725
|
+
},
|
|
1726
|
+
createRelationship: async (options) => {
|
|
1727
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.GRAPH, 'createRelationship', {
|
|
1728
|
+
graph: options.graph,
|
|
1729
|
+
input: { from: options.from, to: options.to, type: options.type, properties: options.properties },
|
|
1730
|
+
});
|
|
1731
|
+
return {};
|
|
1732
|
+
},
|
|
1733
|
+
deleteRelationship: async (options) => {
|
|
1734
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.GRAPH, 'deleteRelationship', {
|
|
1735
|
+
graph: options.graph,
|
|
1736
|
+
input: { id: options.id },
|
|
1737
|
+
});
|
|
1738
|
+
},
|
|
1739
|
+
query: async (options) => {
|
|
1740
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.GRAPH, options.action, {
|
|
1741
|
+
graph: options.graph,
|
|
1742
|
+
input: options.params || {},
|
|
1743
|
+
});
|
|
1744
|
+
return [];
|
|
1745
|
+
},
|
|
1746
|
+
};
|
|
1747
|
+
}
|
|
1748
|
+
get notification() {
|
|
1749
|
+
return {
|
|
1750
|
+
send: async (options) => {
|
|
1751
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.NOTIFICATION, options.event, {
|
|
1752
|
+
notification: options.notification,
|
|
1753
|
+
input: options.input,
|
|
1754
|
+
options: { retries: options.retries },
|
|
1755
|
+
});
|
|
1756
|
+
},
|
|
1757
|
+
email: async (options) => {
|
|
1758
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.NOTIFICATION, options.event, {
|
|
1759
|
+
notification: options.notification,
|
|
1760
|
+
input: { recipients: options.recipients, subject: options.subject, template: options.template },
|
|
1761
|
+
});
|
|
1762
|
+
},
|
|
1763
|
+
push: async (options) => {
|
|
1764
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.NOTIFICATION, options.event, {
|
|
1765
|
+
notification: options.notification,
|
|
1766
|
+
input: { tokens: options.tokens, title: options.title, body: options.body, data: options.data },
|
|
1767
|
+
});
|
|
1768
|
+
},
|
|
1769
|
+
sms: async (options) => {
|
|
1770
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.NOTIFICATION, options.event, {
|
|
1771
|
+
notification: options.notification,
|
|
1772
|
+
input: { phones: options.phones, message: options.message },
|
|
1773
|
+
});
|
|
1774
|
+
},
|
|
1775
|
+
};
|
|
1776
|
+
}
|
|
1777
|
+
get storage() {
|
|
1778
|
+
return {
|
|
1779
|
+
upload: async (options) => {
|
|
1780
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.STORAGE, options.event, {
|
|
1781
|
+
storage: options.storage,
|
|
1782
|
+
input: options.input,
|
|
1783
|
+
options: { retries: options.retries },
|
|
1784
|
+
});
|
|
1785
|
+
return { file_key: '', url: '' };
|
|
1786
|
+
},
|
|
1787
|
+
download: async (options) => {
|
|
1788
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.STORAGE, options.event, {
|
|
1789
|
+
storage: options.storage,
|
|
1790
|
+
input: options.input,
|
|
1791
|
+
});
|
|
1792
|
+
return { content: '', content_type: '', size: 0 };
|
|
1793
|
+
},
|
|
1794
|
+
delete: async (options) => {
|
|
1795
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.STORAGE, options.event, {
|
|
1796
|
+
storage: options.storage,
|
|
1797
|
+
input: options.input,
|
|
1798
|
+
});
|
|
1799
|
+
},
|
|
1800
|
+
};
|
|
1801
|
+
}
|
|
1802
|
+
/** Ductape primitive: message broker produce. Records a produce step (event = "broker-tag:topic-tag"). */
|
|
1803
|
+
get messaging() {
|
|
1804
|
+
return {
|
|
1805
|
+
produce: async (options) => {
|
|
1806
|
+
const colon = options.event.indexOf(':');
|
|
1807
|
+
const broker = colon >= 0 ? options.event.slice(0, colon) : options.event;
|
|
1808
|
+
const topic = colon >= 0 ? options.event.slice(colon + 1) : options.event;
|
|
1809
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.PRODUCE, topic, {
|
|
1810
|
+
broker,
|
|
1811
|
+
input: { message: options.message },
|
|
1812
|
+
});
|
|
1813
|
+
},
|
|
1814
|
+
};
|
|
1815
|
+
}
|
|
1816
|
+
/** @deprecated Prefer ctx.messaging.produce() */
|
|
1817
|
+
get publish() {
|
|
1818
|
+
return {
|
|
1819
|
+
send: async (options) => {
|
|
1820
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.PRODUCE, options.event, {
|
|
1821
|
+
broker: options.broker,
|
|
1822
|
+
input: options.input,
|
|
1823
|
+
options: { retries: options.retries },
|
|
1824
|
+
});
|
|
1825
|
+
},
|
|
1826
|
+
};
|
|
1827
|
+
}
|
|
1828
|
+
get feature() {
|
|
1829
|
+
return {
|
|
1830
|
+
run: async (options) => {
|
|
1831
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.FEATURE, options.feature, {
|
|
1832
|
+
input: options.input,
|
|
1833
|
+
options: { retries: options.retries, timeout: options.timeout },
|
|
1834
|
+
});
|
|
1835
|
+
return {};
|
|
1836
|
+
},
|
|
1837
|
+
};
|
|
1838
|
+
}
|
|
1839
|
+
get quota() {
|
|
1840
|
+
return {
|
|
1841
|
+
execute: async (options) => {
|
|
1842
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.QUOTA, 'execute', {
|
|
1843
|
+
quota: options.quota,
|
|
1844
|
+
input: options.input,
|
|
1845
|
+
options: { timeout: options.timeout },
|
|
1846
|
+
});
|
|
1847
|
+
return {};
|
|
1848
|
+
},
|
|
1849
|
+
};
|
|
1850
|
+
}
|
|
1851
|
+
get fallback() {
|
|
1852
|
+
return {
|
|
1853
|
+
execute: async (options) => {
|
|
1854
|
+
this._updateCurrentStep(productsBuilder_types_1.WorkflowStepType.FALLBACK, 'execute', {
|
|
1855
|
+
fallback: options.fallback,
|
|
1856
|
+
input: options.input,
|
|
1857
|
+
options: { timeout: options.timeout },
|
|
1858
|
+
});
|
|
1859
|
+
return {};
|
|
1860
|
+
},
|
|
1861
|
+
};
|
|
1862
|
+
}
|
|
1863
|
+
get healthcheck() {
|
|
1864
|
+
return {
|
|
1865
|
+
getStatus: async (tag) => {
|
|
1866
|
+
return { status: 'available', lastChecked: new Date().toISOString(), lastLatency: 0 };
|
|
1867
|
+
},
|
|
1868
|
+
};
|
|
1869
|
+
}
|
|
1870
|
+
get transform() {
|
|
1871
|
+
return {
|
|
1872
|
+
size: (obj) => Object.keys(obj).length,
|
|
1873
|
+
length: (arr) => arr.length,
|
|
1874
|
+
parseJson: (str) => JSON.parse(str),
|
|
1875
|
+
stringify: (obj) => JSON.stringify(obj),
|
|
1876
|
+
upper: (str) => str.toUpperCase(),
|
|
1877
|
+
lower: (str) => str.toLowerCase(),
|
|
1878
|
+
trim: (str) => str.trim(),
|
|
1879
|
+
split: (str, separator) => str.split(separator),
|
|
1880
|
+
join: (arr, separator) => arr.join(separator),
|
|
1881
|
+
now: () => Date.now(),
|
|
1882
|
+
formatDate: (date, format) => new Date(date).toISOString(),
|
|
1883
|
+
};
|
|
1884
|
+
}
|
|
1885
|
+
// ==================== DATA REFERENCES ====================
|
|
1886
|
+
variable(app, key) {
|
|
1887
|
+
return `$Variable{${app}}{${key}}`;
|
|
1888
|
+
}
|
|
1889
|
+
constant(app, key) {
|
|
1890
|
+
return `$Constant{${app}}{${key}}`;
|
|
1891
|
+
}
|
|
1892
|
+
token(key) {
|
|
1893
|
+
return `$Secret{${key}}`;
|
|
1894
|
+
}
|
|
1895
|
+
get auth() {
|
|
1896
|
+
return {};
|
|
1897
|
+
}
|
|
1898
|
+
default(value, fallback) {
|
|
1899
|
+
return value !== null && value !== void 0 ? value : fallback;
|
|
1900
|
+
}
|
|
1901
|
+
// ==================== CONTROL FLOW ====================
|
|
1902
|
+
async sleep(duration) {
|
|
1903
|
+
const ms = typeof duration === 'string' ? this._parseDuration(duration) : duration;
|
|
1904
|
+
this._addControlStep(productsBuilder_types_1.WorkflowStepType.SLEEP, 'sleep', { duration: ms });
|
|
1905
|
+
}
|
|
1906
|
+
async waitForSignal(signal, options) {
|
|
1907
|
+
const signals = Array.isArray(signal) ? signal : [signal];
|
|
1908
|
+
const timeout = (options === null || options === void 0 ? void 0 : options.timeout)
|
|
1909
|
+
? typeof options.timeout === 'string'
|
|
1910
|
+
? this._parseDuration(options.timeout)
|
|
1911
|
+
: options.timeout
|
|
1912
|
+
: undefined;
|
|
1913
|
+
this._addControlStep(productsBuilder_types_1.WorkflowStepType.WAIT_FOR_SIGNAL, signals[0], {
|
|
1914
|
+
signals,
|
|
1915
|
+
options: timeout ? { timeout } : undefined,
|
|
1916
|
+
});
|
|
1917
|
+
return {};
|
|
1918
|
+
}
|
|
1919
|
+
async checkpoint(name, metadata) {
|
|
1920
|
+
this._addControlStep(productsBuilder_types_1.WorkflowStepType.CHECKPOINT, name, { metadata });
|
|
1921
|
+
}
|
|
1922
|
+
// ==================== STATE MANAGEMENT ====================
|
|
1923
|
+
setState(key, value) {
|
|
1924
|
+
// No-op during compilation
|
|
1925
|
+
}
|
|
1926
|
+
getState(key) {
|
|
1927
|
+
return undefined;
|
|
1928
|
+
}
|
|
1929
|
+
// ==================== LOGGING ====================
|
|
1930
|
+
get log() {
|
|
1931
|
+
return {
|
|
1932
|
+
debug: (message, data) => { },
|
|
1933
|
+
info: (message, data) => { },
|
|
1934
|
+
warn: (message, data) => { },
|
|
1935
|
+
error: (message, data) => { },
|
|
1936
|
+
};
|
|
1937
|
+
}
|
|
1938
|
+
// ==================== CHILD WORKFLOWS ====================
|
|
1939
|
+
async workflow(childId, tag, input, options) {
|
|
1940
|
+
this._addControlStep(productsBuilder_types_1.WorkflowStepType.CHILD_WORKFLOW, 'execute', {
|
|
1941
|
+
workflow: tag,
|
|
1942
|
+
input,
|
|
1943
|
+
options: options
|
|
1944
|
+
? {
|
|
1945
|
+
timeout: options.timeout
|
|
1946
|
+
? typeof options.timeout === 'string'
|
|
1947
|
+
? this._parseDuration(options.timeout)
|
|
1948
|
+
: options.timeout
|
|
1949
|
+
: undefined,
|
|
1950
|
+
retries: options.retries,
|
|
1951
|
+
}
|
|
1952
|
+
: undefined,
|
|
1953
|
+
});
|
|
1954
|
+
return {};
|
|
1955
|
+
}
|
|
1956
|
+
// ==================== ROLLBACK ====================
|
|
1957
|
+
async triggerRollback(reason) {
|
|
1958
|
+
return { success: true, rolled_back_steps: [], reason };
|
|
1959
|
+
}
|
|
1960
|
+
// ==================== INTERNAL HELPERS ====================
|
|
1961
|
+
_updateCurrentStep(type, event, data) {
|
|
1962
|
+
if (!this._currentStepTag)
|
|
1963
|
+
return;
|
|
1964
|
+
// Update the step we're currently building (one step per ctx.step()), so we don't duplicate
|
|
1965
|
+
const step = this._pendingStep && this._pendingStep.tag === this._currentStepTag
|
|
1966
|
+
? this._pendingStep
|
|
1967
|
+
: this._steps.find((s) => s.tag === this._currentStepTag);
|
|
1968
|
+
if (!step) {
|
|
1969
|
+
const newStep = {
|
|
1970
|
+
tag: this._currentStepTag,
|
|
1971
|
+
type,
|
|
1972
|
+
event,
|
|
1973
|
+
input: data.input || {},
|
|
1974
|
+
};
|
|
1975
|
+
this._steps.push(newStep);
|
|
1976
|
+
this._updateStepProperties(newStep, type, event, data);
|
|
1977
|
+
return;
|
|
1978
|
+
}
|
|
1979
|
+
this._updateStepProperties(step, type, event, data);
|
|
1980
|
+
}
|
|
1981
|
+
_updateStepProperties(step, type, event, data) {
|
|
1982
|
+
// Update step properties
|
|
1983
|
+
step.type = type;
|
|
1984
|
+
step.event = event;
|
|
1985
|
+
if (data.app)
|
|
1986
|
+
step.app = data.app;
|
|
1987
|
+
if (data.database)
|
|
1988
|
+
step.database = data.database;
|
|
1989
|
+
if (data.graph)
|
|
1990
|
+
step.graph = data.graph;
|
|
1991
|
+
if (data.storage)
|
|
1992
|
+
step.storage = data.storage;
|
|
1993
|
+
if (data.notification)
|
|
1994
|
+
step.notification = data.notification;
|
|
1995
|
+
if (data.broker)
|
|
1996
|
+
step.broker = data.broker;
|
|
1997
|
+
if (data.quota)
|
|
1998
|
+
step.quota = data.quota;
|
|
1999
|
+
if (data.fallback)
|
|
2000
|
+
step.fallback = data.fallback;
|
|
2001
|
+
if (data.workflow)
|
|
2002
|
+
step.workflow = data.workflow;
|
|
2003
|
+
if (data.input) {
|
|
2004
|
+
step.input = convertToOperatorInput(data.input, this._inputProxy, this._inputSchemaKeys);
|
|
2005
|
+
}
|
|
2006
|
+
if (data.options)
|
|
2007
|
+
step.options = Object.assign(Object.assign({}, step.options), data.options);
|
|
2008
|
+
}
|
|
2009
|
+
_addControlStep(type, event, data) {
|
|
2010
|
+
const tag = `${type}-${this._stepOrder++}`;
|
|
2011
|
+
const input = convertToOperatorInput(data, this._inputProxy, this._inputSchemaKeys);
|
|
2012
|
+
this._steps.push({
|
|
2013
|
+
tag,
|
|
2014
|
+
type,
|
|
2015
|
+
event,
|
|
2016
|
+
input,
|
|
2017
|
+
});
|
|
2018
|
+
}
|
|
2019
|
+
_parseDuration(duration) {
|
|
2020
|
+
const match = duration.match(/^(\d+)(ms|s|m|h|d)$/);
|
|
2021
|
+
if (!match)
|
|
2022
|
+
return parseInt(duration, 10) || 0;
|
|
2023
|
+
const value = parseInt(match[1], 10);
|
|
2024
|
+
const unit = match[2];
|
|
2025
|
+
switch (unit) {
|
|
2026
|
+
case 'ms':
|
|
2027
|
+
return value;
|
|
2028
|
+
case 's':
|
|
2029
|
+
return value * 1000;
|
|
2030
|
+
case 'm':
|
|
2031
|
+
return value * 60 * 1000;
|
|
2032
|
+
case 'h':
|
|
2033
|
+
return value * 60 * 60 * 1000;
|
|
2034
|
+
case 'd':
|
|
2035
|
+
return value * 24 * 60 * 60 * 1000;
|
|
2036
|
+
default:
|
|
2037
|
+
return value;
|
|
2038
|
+
}
|
|
2039
|
+
}
|
|
2040
|
+
/** Convert a value (e.g. handler return) to operator form for workflow output schema */
|
|
2041
|
+
captureOutput(value) {
|
|
2042
|
+
if (value === undefined || value === null)
|
|
2043
|
+
return {};
|
|
2044
|
+
const converted = convertToOperatorInput(value, this._inputProxy, this._inputSchemaKeys);
|
|
2045
|
+
if (typeof converted === 'object' && converted !== null && !Array.isArray(converted)) {
|
|
2046
|
+
return converted;
|
|
2047
|
+
}
|
|
2048
|
+
return { value: converted };
|
|
2049
|
+
}
|
|
2050
|
+
/** Get collected steps */
|
|
2051
|
+
getSteps() {
|
|
2052
|
+
return this._steps;
|
|
2053
|
+
}
|
|
2054
|
+
}
|
|
2055
|
+
/**
|
|
2056
|
+
* Compiles code-first workflow definitions to JSON schema
|
|
2057
|
+
* Uses runtime handler tracing to capture step definitions
|
|
2058
|
+
*/
|
|
2059
|
+
class WorkflowCompiler {
|
|
2060
|
+
constructor(options) {
|
|
2061
|
+
this.options = options;
|
|
2062
|
+
}
|
|
2063
|
+
/**
|
|
2064
|
+
* Compile the workflow definition to JSON schema
|
|
2065
|
+
* Executes the handler with a recording context to capture step definitions
|
|
2066
|
+
*/
|
|
2067
|
+
compile() {
|
|
2068
|
+
var _a, _b, _c, _d;
|
|
2069
|
+
const mockInput = ((_a = this.options.recordInput) !== null && _a !== void 0 ? _a : {});
|
|
2070
|
+
const recordingCtx = new RecordingContext(mockInput, this.options.tag, this.options.input, this.options.branchOverrides, undefined, ((_b = this.options.recordInput) !== null && _b !== void 0 ? _b : {}));
|
|
2071
|
+
// Execute handler to trace step definitions
|
|
2072
|
+
try {
|
|
2073
|
+
// Run the handler synchronously to capture all step calls
|
|
2074
|
+
// Note: This won't await async operations, but will capture the step structure
|
|
2075
|
+
const handlerPromise = this.options.handler(recordingCtx);
|
|
2076
|
+
// For synchronous tracing, we don't need to await
|
|
2077
|
+
// The recording context captures calls as they're made
|
|
2078
|
+
if (handlerPromise && typeof handlerPromise.then === 'function') {
|
|
2079
|
+
// Handler is async - we capture what we can synchronously
|
|
2080
|
+
// For full async tracing, use compileAsync()
|
|
2081
|
+
}
|
|
2082
|
+
}
|
|
2083
|
+
catch (e) {
|
|
2084
|
+
// Ignore errors during compilation - we're tracing structure, not executing
|
|
2085
|
+
}
|
|
2086
|
+
return {
|
|
2087
|
+
name: this.options.name,
|
|
2088
|
+
tag: this.options.tag,
|
|
2089
|
+
description: this.options.description,
|
|
2090
|
+
input: (_c = this.options.input) !== null && _c !== void 0 ? _c : {},
|
|
2091
|
+
output: (_d = this.options.output) !== null && _d !== void 0 ? _d : {},
|
|
2092
|
+
steps: recordingCtx.getSteps(),
|
|
2093
|
+
signals: this.options.signals
|
|
2094
|
+
? Object.fromEntries(Object.entries(this.options.signals).map(([name, config]) => [name, { name, input: config.input }]))
|
|
2095
|
+
: undefined,
|
|
2096
|
+
queries: this.options.queries
|
|
2097
|
+
? Object.fromEntries(Object.entries(this.options.queries).map(([name, config]) => {
|
|
2098
|
+
var _a;
|
|
2099
|
+
return [
|
|
2100
|
+
name,
|
|
2101
|
+
{ name, handler: (_a = config.handler) === null || _a === void 0 ? void 0 : _a.toString() },
|
|
2102
|
+
];
|
|
2103
|
+
}))
|
|
2104
|
+
: undefined,
|
|
2105
|
+
options: this.options.options,
|
|
2106
|
+
envs: this.options.envs,
|
|
2107
|
+
};
|
|
2108
|
+
}
|
|
2109
|
+
/**
|
|
2110
|
+
* Compile the workflow definition asynchronously
|
|
2111
|
+
* Fully awaits the handler to capture all step definitions.
|
|
2112
|
+
* With recordScenarios, runs the handler once per scenario and merges steps (for switch-style branches).
|
|
2113
|
+
* With recordInput, uses that as ctx.input so loops and control flow see real values.
|
|
2114
|
+
*/
|
|
2115
|
+
async compileAsync() {
|
|
2116
|
+
var _a, _b, _c, _d;
|
|
2117
|
+
const scenarios = this.options.recordScenarios && this.options.recordScenarios.length > 0
|
|
2118
|
+
? this.options.recordScenarios
|
|
2119
|
+
: [(_a = this.options.recordInput) !== null && _a !== void 0 ? _a : {}];
|
|
2120
|
+
const stepsByTag = new Map();
|
|
2121
|
+
const stepOrder = [];
|
|
2122
|
+
let handlerOutput = undefined;
|
|
2123
|
+
let lastCtx = null;
|
|
2124
|
+
for (const scenario of scenarios) {
|
|
2125
|
+
const scenarioObj = typeof scenario === 'object' && scenario !== null ? scenario : {};
|
|
2126
|
+
const scenarioCondition = this.options.recordScenarios && Object.keys(scenarioObj).length > 0
|
|
2127
|
+
? buildConditionFromScenario(scenarioObj)
|
|
2128
|
+
: null;
|
|
2129
|
+
const recordInput = Object.keys(scenarioObj).length > 0
|
|
2130
|
+
? scenarioObj
|
|
2131
|
+
: ((_b = this.options.recordInput) !== null && _b !== void 0 ? _b : {});
|
|
2132
|
+
const recordingCtx = new RecordingContext((recordInput !== null && recordInput !== void 0 ? recordInput : {}), this.options.tag, this.options.input, this.options.branchOverrides, scenarioCondition, recordInput);
|
|
2133
|
+
lastCtx = recordingCtx;
|
|
2134
|
+
try {
|
|
2135
|
+
const out = await this.options.handler(recordingCtx);
|
|
2136
|
+
if (out !== undefined && out !== null)
|
|
2137
|
+
handlerOutput = out;
|
|
2138
|
+
}
|
|
2139
|
+
catch (_) { }
|
|
2140
|
+
for (const s of recordingCtx.getSteps()) {
|
|
2141
|
+
const existing = stepsByTag.get(s.tag);
|
|
2142
|
+
if (existing) {
|
|
2143
|
+
const c1 = existing.condition;
|
|
2144
|
+
const c2 = s.condition;
|
|
2145
|
+
if (c1 && c2)
|
|
2146
|
+
existing.condition = `(${c1}) || (${c2})`;
|
|
2147
|
+
else if (c2)
|
|
2148
|
+
existing.condition = c2;
|
|
2149
|
+
}
|
|
2150
|
+
else {
|
|
2151
|
+
stepsByTag.set(s.tag, Object.assign({}, s));
|
|
2152
|
+
stepOrder.push(s.tag);
|
|
2153
|
+
}
|
|
2154
|
+
}
|
|
2155
|
+
}
|
|
2156
|
+
const finalSteps = stepOrder.map((tag) => stepsByTag.get(tag)).filter(Boolean);
|
|
2157
|
+
const output = handlerOutput !== undefined && handlerOutput !== null && lastCtx
|
|
2158
|
+
? lastCtx.captureOutput(handlerOutput)
|
|
2159
|
+
: ((_c = this.options.output) !== null && _c !== void 0 ? _c : {});
|
|
2160
|
+
return {
|
|
2161
|
+
name: this.options.name,
|
|
2162
|
+
tag: this.options.tag,
|
|
2163
|
+
description: this.options.description,
|
|
2164
|
+
input: (_d = this.options.input) !== null && _d !== void 0 ? _d : {},
|
|
2165
|
+
output: output,
|
|
2166
|
+
steps: finalSteps,
|
|
2167
|
+
signals: this.options.signals
|
|
2168
|
+
? Object.fromEntries(Object.entries(this.options.signals).map(([name, config]) => [name, { name, input: config.input }]))
|
|
2169
|
+
: undefined,
|
|
2170
|
+
queries: this.options.queries
|
|
2171
|
+
? Object.fromEntries(Object.entries(this.options.queries).map(([name, config]) => {
|
|
2172
|
+
var _a;
|
|
2173
|
+
return [
|
|
2174
|
+
name,
|
|
2175
|
+
{ name, handler: (_a = config.handler) === null || _a === void 0 ? void 0 : _a.toString() },
|
|
2176
|
+
];
|
|
2177
|
+
}))
|
|
2178
|
+
: undefined,
|
|
2179
|
+
options: this.options.options,
|
|
2180
|
+
envs: this.options.envs,
|
|
2181
|
+
};
|
|
2182
|
+
}
|
|
2183
|
+
}
|
|
2184
|
+
// Export singleton instance for convenience
|
|
2185
|
+
exports.workflowService = new WorkflowService();
|
|
2186
|
+
// Default export
|
|
2187
|
+
exports.default = WorkflowService;
|
|
2188
|
+
//# sourceMappingURL=workflows.service.js.map
|