tasker-engine 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +443 -0
- data/Rakefile +10 -0
- data/app/controllers/tasker/analytics_controller.rb +179 -0
- data/app/controllers/tasker/application_controller.rb +45 -0
- data/app/controllers/tasker/graphql_controller.rb +193 -0
- data/app/controllers/tasker/handlers_controller.rb +217 -0
- data/app/controllers/tasker/health_controller.rb +229 -0
- data/app/controllers/tasker/metrics_controller.rb +111 -0
- data/app/controllers/tasker/page_sort.rb +97 -0
- data/app/controllers/tasker/task_diagrams_controller.rb +30 -0
- data/app/controllers/tasker/tasks_controller.rb +123 -0
- data/app/controllers/tasker/workflow_steps_controller.rb +69 -0
- data/app/graphql/examples/all_tasks.graphql +22 -0
- data/app/graphql/examples/pending_tasks.graphql +23 -0
- data/app/graphql/tasker/graph_ql_types/annotation_type.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/base_argument.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_connection.rb +11 -0
- data/app/graphql/tasker/graph_ql_types/base_edge.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_enum.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_field.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_input_object.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_interface.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/base_object.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_scalar.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_union.rb +11 -0
- data/app/graphql/tasker/graph_ql_types/dependent_system_object_map_type.rb +18 -0
- data/app/graphql/tasker/graph_ql_types/dependent_system_type.rb +13 -0
- data/app/graphql/tasker/graph_ql_types/mutation_type.rb +16 -0
- data/app/graphql/tasker/graph_ql_types/named_step_type.rb +16 -0
- data/app/graphql/tasker/graph_ql_types/named_task_type.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/named_tasks_named_step_type.rb +19 -0
- data/app/graphql/tasker/graph_ql_types/node_type.rb +12 -0
- data/app/graphql/tasker/graph_ql_types/query_type.rb +20 -0
- data/app/graphql/tasker/graph_ql_types/task_annotation_type.rb +17 -0
- data/app/graphql/tasker/graph_ql_types/task_interface.rb +17 -0
- data/app/graphql/tasker/graph_ql_types/task_type.rb +26 -0
- data/app/graphql/tasker/graph_ql_types/workflow_step_type.rb +154 -0
- data/app/graphql/tasker/graph_ql_types.rb +42 -0
- data/app/graphql/tasker/mutations/base_mutation.rb +13 -0
- data/app/graphql/tasker/mutations/cancel_step.rb +29 -0
- data/app/graphql/tasker/mutations/cancel_task.rb +29 -0
- data/app/graphql/tasker/mutations/create_task.rb +52 -0
- data/app/graphql/tasker/mutations/update_step.rb +36 -0
- data/app/graphql/tasker/mutations/update_task.rb +41 -0
- data/app/graphql/tasker/queries/all_annotation_types.rb +17 -0
- data/app/graphql/tasker/queries/all_tasks.rb +23 -0
- data/app/graphql/tasker/queries/base_query.rb +9 -0
- data/app/graphql/tasker/queries/helpers.rb +16 -0
- data/app/graphql/tasker/queries/one_step.rb +24 -0
- data/app/graphql/tasker/queries/one_task.rb +18 -0
- data/app/graphql/tasker/queries/tasks_by_annotation.rb +31 -0
- data/app/graphql/tasker/queries/tasks_by_status.rb +30 -0
- data/app/graphql/tasker/tasker_rails_schema.rb +52 -0
- data/app/jobs/tasker/application_job.rb +8 -0
- data/app/jobs/tasker/metrics_export_job.rb +252 -0
- data/app/jobs/tasker/task_runner_job.rb +224 -0
- data/app/models/tasker/annotation_type.rb +26 -0
- data/app/models/tasker/application_record.rb +70 -0
- data/app/models/tasker/dependent_system.rb +26 -0
- data/app/models/tasker/dependent_system_object_map.rb +64 -0
- data/app/models/tasker/diagram/edge.rb +106 -0
- data/app/models/tasker/diagram/flowchart.rb +137 -0
- data/app/models/tasker/diagram/node.rb +99 -0
- data/app/models/tasker/named_step.rb +41 -0
- data/app/models/tasker/named_task.rb +121 -0
- data/app/models/tasker/named_tasks_named_step.rb +82 -0
- data/app/models/tasker/step_dag_relationship.rb +65 -0
- data/app/models/tasker/step_readiness_status.rb +59 -0
- data/app/models/tasker/task.rb +424 -0
- data/app/models/tasker/task_annotation.rb +36 -0
- data/app/models/tasker/task_diagram.rb +332 -0
- data/app/models/tasker/task_execution_context.rb +29 -0
- data/app/models/tasker/task_namespace.rb +41 -0
- data/app/models/tasker/task_transition.rb +235 -0
- data/app/models/tasker/workflow_step.rb +461 -0
- data/app/models/tasker/workflow_step_edge.rb +94 -0
- data/app/models/tasker/workflow_step_transition.rb +434 -0
- data/app/serializers/tasker/annotation_type_serializer.rb +8 -0
- data/app/serializers/tasker/handler_serializer.rb +109 -0
- data/app/serializers/tasker/task_annotation_serializer.rb +32 -0
- data/app/serializers/tasker/task_serializer.rb +168 -0
- data/app/serializers/tasker/workflow_step_serializer.rb +27 -0
- data/app/services/tasker/analytics_service.rb +409 -0
- data/app/views/tasker/task/_diagram.html.erb +32 -0
- data/config/initializers/dry_struct.rb +11 -0
- data/config/initializers/statesman.rb +6 -0
- data/config/initializers/tasker_orchestration.rb +17 -0
- data/config/initializers/time_formats.rb +4 -0
- data/config/routes.rb +34 -0
- data/config/tasker/subscriptions/example_integrations.yml +67 -0
- data/config/tasker/system_events.yml +305 -0
- data/db/functions/calculate_dependency_levels_v01.sql +45 -0
- data/db/functions/get_analytics_metrics_v01.sql +137 -0
- data/db/functions/get_slowest_steps_v01.sql +82 -0
- data/db/functions/get_slowest_tasks_v01.sql +96 -0
- data/db/functions/get_step_readiness_status_batch_v01.sql +140 -0
- data/db/functions/get_step_readiness_status_v01.sql +139 -0
- data/db/functions/get_system_health_counts_v01.sql +108 -0
- data/db/functions/get_task_execution_context_v01.sql +108 -0
- data/db/functions/get_task_execution_contexts_batch_v01.sql +104 -0
- data/db/init/schema.sql +2277 -0
- data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
- data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
- data/docs/APPLICATION_GENERATOR.md +384 -0
- data/docs/AUTH.md +1780 -0
- data/docs/CIRCUIT_BREAKER.md +224 -0
- data/docs/DEVELOPER_GUIDE.md +2665 -0
- data/docs/EVENT_SYSTEM.md +637 -0
- data/docs/EXECUTION_CONFIGURATION.md +341 -0
- data/docs/FLOW_CHART.md +149 -0
- data/docs/HEALTH.md +542 -0
- data/docs/METRICS.md +731 -0
- data/docs/OPTIMIZATION_PLAN.md +1479 -0
- data/docs/OVERVIEW.md +552 -0
- data/docs/QUICK_START.md +270 -0
- data/docs/REGISTRY_SYSTEMS.md +373 -0
- data/docs/REST_API.md +632 -0
- data/docs/ROADMAP.md +221 -0
- data/docs/SQL_FUNCTIONS.md +1408 -0
- data/docs/TASK_DIAGRAM.md +252 -0
- data/docs/TASK_EXECUTION_CONTROL_FLOW.md +237 -0
- data/docs/TELEMETRY.md +795 -0
- data/docs/TROUBLESHOOTING.md +756 -0
- data/docs/TaskHandlerGenerator.html +255 -0
- data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +907 -0
- data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1236 -0
- data/docs/Tasker/Analysis.html +117 -0
- data/docs/Tasker/AnalyticsController.html +450 -0
- data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +816 -0
- data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +586 -0
- data/docs/Tasker/AnalyticsService.html +2221 -0
- data/docs/Tasker/AnnotationType.html +137 -0
- data/docs/Tasker/AnnotationTypeSerializer.html +124 -0
- data/docs/Tasker/ApplicationController.html +147 -0
- data/docs/Tasker/ApplicationJob.html +128 -0
- data/docs/Tasker/ApplicationRecord.html +378 -0
- data/docs/Tasker/Authentication/AuthenticationError.html +124 -0
- data/docs/Tasker/Authentication/ConfigurationError.html +124 -0
- data/docs/Tasker/Authentication/Coordinator.html +242 -0
- data/docs/Tasker/Authentication/Interface.html +560 -0
- data/docs/Tasker/Authentication/InterfaceError.html +124 -0
- data/docs/Tasker/Authentication/NoneAuthenticator.html +338 -0
- data/docs/Tasker/Authentication.html +119 -0
- data/docs/Tasker/Authorization/AuthorizationError.html +139 -0
- data/docs/Tasker/Authorization/BaseCoordinator.html +927 -0
- data/docs/Tasker/Authorization/ConfigurationError.html +153 -0
- data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +428 -0
- data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +365 -0
- data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
- data/docs/Tasker/Authorization/ResourceRegistry.html +882 -0
- data/docs/Tasker/Authorization/UnauthorizedError.html +153 -0
- data/docs/Tasker/Authorization.html +582 -0
- data/docs/Tasker/CacheCapabilities.html +167 -0
- data/docs/Tasker/CacheStrategy.html +1297 -0
- data/docs/Tasker/Concerns/Authenticatable.html +116 -0
- data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +256 -0
- data/docs/Tasker/Concerns/Authorizable.html +816 -0
- data/docs/Tasker/Concerns/ControllerAuthorizable.html +157 -0
- data/docs/Tasker/Concerns/EventPublisher.html +4023 -0
- data/docs/Tasker/Concerns/IdempotentStateTransitions.html +806 -0
- data/docs/Tasker/Concerns/LifecycleEventHelpers.html +129 -0
- data/docs/Tasker/Concerns/OrchestrationPublisher.html +129 -0
- data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1075 -0
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +191 -0
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +126 -0
- data/docs/Tasker/Concerns/StateMachineBase.html +153 -0
- data/docs/Tasker/Concerns/StructuredLogging.html +1413 -0
- data/docs/Tasker/Concerns.html +117 -0
- data/docs/Tasker/Configuration/AuthConfiguration.html +1023 -0
- data/docs/Tasker/Configuration/ConfigurationProxy.html +581 -0
- data/docs/Tasker/Configuration/DatabaseConfiguration.html +475 -0
- data/docs/Tasker/Configuration/EngineConfiguration.html +1265 -0
- data/docs/Tasker/Configuration/HealthConfiguration.html +791 -0
- data/docs/Tasker/Configuration/TelemetryConfiguration.html +1308 -0
- data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +388 -0
- data/docs/Tasker/Configuration.html +1669 -0
- data/docs/Tasker/ConfigurationError.html +143 -0
- data/docs/Tasker/ConfiguredTask.html +514 -0
- data/docs/Tasker/Constants/EventDefinitions.html +590 -0
- data/docs/Tasker/Constants/LifecycleEvents.html +137 -0
- data/docs/Tasker/Constants/ObservabilityEvents/Step.html +152 -0
- data/docs/Tasker/Constants/ObservabilityEvents/Task.html +142 -0
- data/docs/Tasker/Constants/ObservabilityEvents.html +126 -0
- data/docs/Tasker/Constants/RegistryEvents.html +285 -0
- data/docs/Tasker/Constants/StepEvents.html +177 -0
- data/docs/Tasker/Constants/TaskEvents.html +167 -0
- data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +207 -0
- data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +191 -0
- data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +207 -0
- data/docs/Tasker/Constants/TaskExecution.html +126 -0
- data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +132 -0
- data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +207 -0
- data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +239 -0
- data/docs/Tasker/Constants/TaskFinalization.html +126 -0
- data/docs/Tasker/Constants/TaskStatuses.html +223 -0
- data/docs/Tasker/Constants/TestEvents.html +163 -0
- data/docs/Tasker/Constants/WorkflowEvents.html +222 -0
- data/docs/Tasker/Constants/WorkflowStepStatuses.html +223 -0
- data/docs/Tasker/Constants.html +561 -0
- data/docs/Tasker/DependentSystem.html +137 -0
- data/docs/Tasker/DependentSystemObjectMap.html +250 -0
- data/docs/Tasker/DetectorRegistry.html +598 -0
- data/docs/Tasker/Diagram/Edge.html +1191 -0
- data/docs/Tasker/Diagram/Flowchart.html +1539 -0
- data/docs/Tasker/Diagram/Node.html +1165 -0
- data/docs/Tasker/Diagram.html +117 -0
- data/docs/Tasker/Engine.html +215 -0
- data/docs/Tasker/Error.html +139 -0
- data/docs/Tasker/Events/Bus.html +1226 -0
- data/docs/Tasker/Events/Catalog/CatalogPrinter.html +258 -0
- data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +276 -0
- data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +294 -0
- data/docs/Tasker/Events/Catalog.html +1291 -0
- data/docs/Tasker/Events/CustomRegistry.html +943 -0
- data/docs/Tasker/Events/DefinitionLoader.html +575 -0
- data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +286 -0
- data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +312 -0
- data/docs/Tasker/Events/EventPayloadBuilder.html +664 -0
- data/docs/Tasker/Events/Publisher.html +365 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1128 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +270 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +266 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +2556 -0
- data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +723 -0
- data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +2251 -0
- data/docs/Tasker/Events/Subscribers.html +117 -0
- data/docs/Tasker/Events/SubscriptionLoader.html +493 -0
- data/docs/Tasker/Events.html +294 -0
- data/docs/Tasker/EventsGenerator.html +459 -0
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +412 -0
- data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +598 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +453 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +453 -0
- data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1457 -0
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +370 -0
- data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1250 -0
- data/docs/Tasker/Functions/FunctionWrapper.html +479 -0
- data/docs/Tasker/Functions.html +117 -0
- data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +244 -0
- data/docs/Tasker/Generators/AuthenticatorGenerator.html +373 -0
- data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +430 -0
- data/docs/Tasker/Generators/SubscriberGenerator.html +377 -0
- data/docs/Tasker/Generators/TaskHandlerGenerator.html +263 -0
- data/docs/Tasker/Generators.html +117 -0
- data/docs/Tasker/GraphQLTypes/AnnotationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/BaseArgument.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseConnection.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseEdge.html +130 -0
- data/docs/Tasker/GraphQLTypes/BaseEnum.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseField.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseInputObject.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseInterface.html +116 -0
- data/docs/Tasker/GraphQLTypes/BaseObject.html +128 -0
- data/docs/Tasker/GraphQLTypes/BaseScalar.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseUnion.html +124 -0
- data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +132 -0
- data/docs/Tasker/GraphQLTypes/DependentSystemType.html +132 -0
- data/docs/Tasker/GraphQLTypes/MutationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedStepType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedTaskType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NodeType.html +118 -0
- data/docs/Tasker/GraphQLTypes/QueryType.html +139 -0
- data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/TaskInterface.html +111 -0
- data/docs/Tasker/GraphQLTypes/TaskType.html +201 -0
- data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +694 -0
- data/docs/Tasker/GraphQLTypes.html +130 -0
- data/docs/Tasker/GraphqlController.html +251 -0
- data/docs/Tasker/HandlerFactory.html +1518 -0
- data/docs/Tasker/HandlerSerializer.html +682 -0
- data/docs/Tasker/HandlersController.html +574 -0
- data/docs/Tasker/HashIdentityStrategy.html +278 -0
- data/docs/Tasker/Health/ReadinessChecker.html +712 -0
- data/docs/Tasker/Health/StatusChecker.html +653 -0
- data/docs/Tasker/Health.html +117 -0
- data/docs/Tasker/HealthController.html +523 -0
- data/docs/Tasker/IdentityStrategy.html +276 -0
- data/docs/Tasker/InvalidTaskHandlerConfig.html +135 -0
- data/docs/Tasker/LifecycleEvents/Events/Step.html +162 -0
- data/docs/Tasker/LifecycleEvents/Events/Task.html +162 -0
- data/docs/Tasker/LifecycleEvents/Events.html +204 -0
- data/docs/Tasker/LifecycleEvents/Publisher.html +132 -0
- data/docs/Tasker/LifecycleEvents.html +799 -0
- data/docs/Tasker/Logging/CorrelationIdGenerator.html +688 -0
- data/docs/Tasker/Logging.html +115 -0
- data/docs/Tasker/MetricsController.html +293 -0
- data/docs/Tasker/MetricsExportJob.html +414 -0
- data/docs/Tasker/Mutations/BaseMutation.html +128 -0
- data/docs/Tasker/Mutations/CancelStep.html +219 -0
- data/docs/Tasker/Mutations/CancelTask.html +221 -0
- data/docs/Tasker/Mutations/CreateTask.html +243 -0
- data/docs/Tasker/Mutations/UpdateStep.html +243 -0
- data/docs/Tasker/Mutations/UpdateTask.html +243 -0
- data/docs/Tasker/Mutations.html +117 -0
- data/docs/Tasker/NamedStep.html +216 -0
- data/docs/Tasker/NamedTask.html +910 -0
- data/docs/Tasker/NamedTasksNamedStep.html +435 -0
- data/docs/Tasker/Orchestration/BackoffCalculator.html +404 -0
- data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +258 -0
- data/docs/Tasker/Orchestration/ConnectionBuilder.html +435 -0
- data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +513 -0
- data/docs/Tasker/Orchestration/Coordinator.html +641 -0
- data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1045 -0
- data/docs/Tasker/Orchestration/Orchestrator.html +679 -0
- data/docs/Tasker/Orchestration/PluginIntegration.html +1127 -0
- data/docs/Tasker/Orchestration/ResponseProcessor.html +504 -0
- data/docs/Tasker/Orchestration/RetryHeaderParser.html +304 -0
- data/docs/Tasker/Orchestration/StepExecutor.html +995 -0
- data/docs/Tasker/Orchestration/StepSequenceFactory.html +644 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +264 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +254 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +556 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +348 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +286 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +432 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +296 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +314 -0
- data/docs/Tasker/Orchestration/TaskFinalizer.html +1212 -0
- data/docs/Tasker/Orchestration/TaskInitializer.html +766 -0
- data/docs/Tasker/Orchestration/TaskReenqueuer.html +506 -0
- data/docs/Tasker/Orchestration/ViableStepDiscovery.html +442 -0
- data/docs/Tasker/Orchestration/WorkflowCoordinator.html +510 -0
- data/docs/Tasker/Orchestration.html +130 -0
- data/docs/Tasker/PageSort/PageSortParamsBuilder.html +296 -0
- data/docs/Tasker/PageSort.html +247 -0
- data/docs/Tasker/PermanentError.html +518 -0
- data/docs/Tasker/ProceduralError.html +147 -0
- data/docs/Tasker/Queries/AllAnnotationTypes.html +217 -0
- data/docs/Tasker/Queries/AllTasks.html +221 -0
- data/docs/Tasker/Queries/BaseQuery.html +128 -0
- data/docs/Tasker/Queries/Helpers.html +187 -0
- data/docs/Tasker/Queries/OneStep.html +225 -0
- data/docs/Tasker/Queries/OneTask.html +217 -0
- data/docs/Tasker/Queries/TasksByAnnotation.html +231 -0
- data/docs/Tasker/Queries/TasksByStatus.html +233 -0
- data/docs/Tasker/Queries.html +119 -0
- data/docs/Tasker/Railtie.html +124 -0
- data/docs/Tasker/Registry/BaseRegistry.html +1690 -0
- data/docs/Tasker/Registry/EventPublisher.html +667 -0
- data/docs/Tasker/Registry/InterfaceValidator.html +569 -0
- data/docs/Tasker/Registry/RegistrationError.html +132 -0
- data/docs/Tasker/Registry/RegistryError.html +139 -0
- data/docs/Tasker/Registry/StatisticsCollector.html +841 -0
- data/docs/Tasker/Registry/SubscriberRegistry.html +1504 -0
- data/docs/Tasker/Registry/ValidationError.html +132 -0
- data/docs/Tasker/Registry.html +119 -0
- data/docs/Tasker/RetryableError.html +515 -0
- data/docs/Tasker/StateMachine/Compatibility.html +282 -0
- data/docs/Tasker/StateMachine/InvalidStateTransition.html +135 -0
- data/docs/Tasker/StateMachine/StepStateMachine/StandardizedPayloadBuilder.html +260 -0
- data/docs/Tasker/StateMachine/StepStateMachine.html +2215 -0
- data/docs/Tasker/StateMachine/TaskStateMachine.html +734 -0
- data/docs/Tasker/StateMachine.html +602 -0
- data/docs/Tasker/StepDagRelationship.html +657 -0
- data/docs/Tasker/StepHandler/Api/Config.html +1091 -0
- data/docs/Tasker/StepHandler/Api.html +884 -0
- data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +321 -0
- data/docs/Tasker/StepHandler/Base.html +970 -0
- data/docs/Tasker/StepHandler.html +119 -0
- data/docs/Tasker/StepReadinessStatus.html +836 -0
- data/docs/Tasker/Task.html +2575 -0
- data/docs/Tasker/TaskAnnotation.html +137 -0
- data/docs/Tasker/TaskAnnotationSerializer.html +124 -0
- data/docs/Tasker/TaskBuilder/StepNameValidator.html +264 -0
- data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +264 -0
- data/docs/Tasker/TaskBuilder.html +764 -0
- data/docs/Tasker/TaskDiagram/StepToStepEdgeBuilder.html +260 -0
- data/docs/Tasker/TaskDiagram/TaskToRootStepEdgeBuilder.html +290 -0
- data/docs/Tasker/TaskDiagram.html +548 -0
- data/docs/Tasker/TaskDiagramsController.html +240 -0
- data/docs/Tasker/TaskExecutionContext.html +469 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +238 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +254 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +988 -0
- data/docs/Tasker/TaskHandler/ClassMethods.html +357 -0
- data/docs/Tasker/TaskHandler/InstanceMethods.html +1396 -0
- data/docs/Tasker/TaskHandler/StepGroup.html +1748 -0
- data/docs/Tasker/TaskHandler.html +271 -0
- data/docs/Tasker/TaskNamespace.html +312 -0
- data/docs/Tasker/TaskRunnerJob.html +406 -0
- data/docs/Tasker/TaskSerializer.html +474 -0
- data/docs/Tasker/TaskTransition.html +1517 -0
- data/docs/Tasker/TaskWorkflowSummary.html +988 -0
- data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +132 -0
- data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +139 -0
- data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +132 -0
- data/docs/Tasker/TaskerRailsSchema.html +384 -0
- data/docs/Tasker/TasksController.html +595 -0
- data/docs/Tasker/Telemetry/EventMapping.html +1307 -0
- data/docs/Tasker/Telemetry/EventRouter.html +2178 -0
- data/docs/Tasker/Telemetry/Events/ExportEvents.html +246 -0
- data/docs/Tasker/Telemetry/Events.html +115 -0
- data/docs/Tasker/Telemetry/ExportCoordinator/DistributedLockTimeoutError.html +135 -0
- data/docs/Tasker/Telemetry/ExportCoordinator.html +2137 -0
- data/docs/Tasker/Telemetry/IntelligentCacheManager.html +1083 -0
- data/docs/Tasker/Telemetry/LogBackend.html +1088 -0
- data/docs/Tasker/Telemetry/MetricTypes/Counter.html +1054 -0
- data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +1270 -0
- data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +1492 -0
- data/docs/Tasker/Telemetry/MetricTypes.html +153 -0
- data/docs/Tasker/Telemetry/MetricsBackend.html +2510 -0
- data/docs/Tasker/Telemetry/MetricsExportService.html +578 -0
- data/docs/Tasker/Telemetry/PluginRegistry.html +1774 -0
- data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1835 -0
- data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +768 -0
- data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +747 -0
- data/docs/Tasker/Telemetry/Plugins.html +117 -0
- data/docs/Tasker/Telemetry/PrometheusExporter.html +481 -0
- data/docs/Tasker/Telemetry/TraceBackend.html +891 -0
- data/docs/Tasker/Telemetry.html +130 -0
- data/docs/Tasker/Types/AuthConfig.html +886 -0
- data/docs/Tasker/Types/BackoffConfig.html +1063 -0
- data/docs/Tasker/Types/BaseConfig.html +227 -0
- data/docs/Tasker/Types/CacheConfig.html +1731 -0
- data/docs/Tasker/Types/DatabaseConfig.html +388 -0
- data/docs/Tasker/Types/DependencyGraph.html +526 -0
- data/docs/Tasker/Types/DependencyGraphConfig.html +753 -0
- data/docs/Tasker/Types/EngineConfig.html +1181 -0
- data/docs/Tasker/Types/ExecutionConfig.html +1963 -0
- data/docs/Tasker/Types/GraphEdge.html +517 -0
- data/docs/Tasker/Types/GraphMetadata.html +781 -0
- data/docs/Tasker/Types/GraphNode.html +694 -0
- data/docs/Tasker/Types/HealthConfig.html +784 -0
- data/docs/Tasker/Types/StepSequence.html +353 -0
- data/docs/Tasker/Types/StepTemplate.html +1193 -0
- data/docs/Tasker/Types/TaskRequest.html +1179 -0
- data/docs/Tasker/Types/TelemetryConfig.html +2746 -0
- data/docs/Tasker/Types.html +154 -0
- data/docs/Tasker/WorkflowStep/StepFinder.html +282 -0
- data/docs/Tasker/WorkflowStep.html +2724 -0
- data/docs/Tasker/WorkflowStepEdge.html +304 -0
- data/docs/Tasker/WorkflowStepSerializer.html +305 -0
- data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +282 -0
- data/docs/Tasker/WorkflowStepTransition.html +2201 -0
- data/docs/Tasker/WorkflowStepsController.html +462 -0
- data/docs/Tasker.html +452 -0
- data/docs/VISION.md +584 -0
- data/docs/WHY.md +21 -0
- data/docs/_index.html +2375 -0
- data/docs/class_list.html +54 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +58 -0
- data/docs/css/style.css +503 -0
- data/docs/events/migration_plan_outcomes.md +80 -0
- data/docs/file.README.html +541 -0
- data/docs/file_list.html +59 -0
- data/docs/frames.html +22 -0
- data/docs/index.html +541 -0
- data/docs/js/app.js +344 -0
- data/docs/js/full_list.js +242 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +9182 -0
- data/docs/top-level-namespace.html +110 -0
- data/lib/generators/tasker/authenticator_generator.rb +301 -0
- data/lib/generators/tasker/authorization_coordinator_generator.rb +139 -0
- data/lib/generators/tasker/events_generator.rb +91 -0
- data/lib/generators/tasker/subscriber_generator.rb +107 -0
- data/lib/generators/tasker/task_handler_generator.rb +138 -0
- data/lib/generators/tasker/templates/api_token_authenticator.rb.erb +113 -0
- data/lib/generators/tasker/templates/api_token_authenticator_spec.rb.erb +144 -0
- data/lib/generators/tasker/templates/authorization_coordinator.rb.erb +95 -0
- data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +142 -0
- data/lib/generators/tasker/templates/custom_authenticator.rb.erb +108 -0
- data/lib/generators/tasker/templates/custom_authenticator_spec.rb.erb +162 -0
- data/lib/generators/tasker/templates/custom_events.yml.erb +62 -0
- data/lib/generators/tasker/templates/custom_subscriber.rb.erb +72 -0
- data/lib/generators/tasker/templates/devise_authenticator.rb.erb +101 -0
- data/lib/generators/tasker/templates/devise_authenticator_spec.rb.erb +126 -0
- data/lib/generators/tasker/templates/initialize.rb.erb +202 -0
- data/lib/generators/tasker/templates/jwt_authenticator.rb.erb +144 -0
- data/lib/generators/tasker/templates/jwt_authenticator_spec.rb.erb +298 -0
- data/lib/generators/tasker/templates/metrics_subscriber.rb.erb +258 -0
- data/lib/generators/tasker/templates/metrics_subscriber_spec.rb.erb +308 -0
- data/lib/generators/tasker/templates/omniauth_authenticator.rb.erb +135 -0
- data/lib/generators/tasker/templates/omniauth_authenticator_spec.rb.erb +196 -0
- data/lib/generators/tasker/templates/opentelemetry_initializer.rb +52 -0
- data/lib/generators/tasker/templates/subscriber.rb.erb +64 -0
- data/lib/generators/tasker/templates/subscriber_spec.rb.erb +80 -0
- data/lib/generators/tasker/templates/task_config.yaml.erb +117 -0
- data/lib/generators/tasker/templates/task_handler.rb.erb +59 -0
- data/lib/generators/tasker/templates/task_handler_spec.rb.erb +159 -0
- data/lib/tasker/analysis/runtime_graph_analyzer.rb +1168 -0
- data/lib/tasker/analysis/template_graph_analyzer.rb +328 -0
- data/lib/tasker/authentication/coordinator.rb +78 -0
- data/lib/tasker/authentication/errors.rb +9 -0
- data/lib/tasker/authentication/interface.rb +36 -0
- data/lib/tasker/authentication/none_authenticator.rb +26 -0
- data/lib/tasker/authorization/base_coordinator.rb +112 -0
- data/lib/tasker/authorization/errors.rb +26 -0
- data/lib/tasker/authorization/resource_constants.rb +74 -0
- data/lib/tasker/authorization/resource_registry.rb +143 -0
- data/lib/tasker/authorization.rb +75 -0
- data/lib/tasker/cache_capabilities.rb +131 -0
- data/lib/tasker/cache_strategy.rb +469 -0
- data/lib/tasker/concerns/authenticatable.rb +41 -0
- data/lib/tasker/concerns/authorizable.rb +204 -0
- data/lib/tasker/concerns/controller_authorizable.rb +124 -0
- data/lib/tasker/concerns/event_publisher.rb +716 -0
- data/lib/tasker/concerns/idempotent_state_transitions.rb +128 -0
- data/lib/tasker/concerns/state_machine_base.rb +218 -0
- data/lib/tasker/concerns/structured_logging.rb +387 -0
- data/lib/tasker/configuration.rb +325 -0
- data/lib/tasker/constants/event_definitions.rb +147 -0
- data/lib/tasker/constants/registry_events.rb +54 -0
- data/lib/tasker/constants.rb +417 -0
- data/lib/tasker/engine.rb +90 -0
- data/lib/tasker/errors.rb +90 -0
- data/lib/tasker/events/catalog.rb +432 -0
- data/lib/tasker/events/custom_registry.rb +175 -0
- data/lib/tasker/events/definition_loader.rb +199 -0
- data/lib/tasker/events/event_payload_builder.rb +461 -0
- data/lib/tasker/events/publisher.rb +149 -0
- data/lib/tasker/events/subscribers/base_subscriber.rb +601 -0
- data/lib/tasker/events/subscribers/metrics_subscriber.rb +120 -0
- data/lib/tasker/events/subscribers/telemetry_subscriber.rb +462 -0
- data/lib/tasker/events/subscription_loader.rb +161 -0
- data/lib/tasker/events.rb +37 -0
- data/lib/tasker/functions/function_based_analytics_metrics.rb +103 -0
- data/lib/tasker/functions/function_based_dependency_levels.rb +54 -0
- data/lib/tasker/functions/function_based_slowest_steps.rb +84 -0
- data/lib/tasker/functions/function_based_slowest_tasks.rb +84 -0
- data/lib/tasker/functions/function_based_step_readiness_status.rb +183 -0
- data/lib/tasker/functions/function_based_system_health_counts.rb +94 -0
- data/lib/tasker/functions/function_based_task_execution_context.rb +148 -0
- data/lib/tasker/functions/function_wrapper.rb +42 -0
- data/lib/tasker/functions.rb +12 -0
- data/lib/tasker/handler_factory.rb +322 -0
- data/lib/tasker/health/readiness_checker.rb +186 -0
- data/lib/tasker/health/status_checker.rb +203 -0
- data/lib/tasker/identity_strategy.rb +38 -0
- data/lib/tasker/logging/correlation_id_generator.rb +120 -0
- data/lib/tasker/orchestration/backoff_calculator.rb +184 -0
- data/lib/tasker/orchestration/connection_builder.rb +122 -0
- data/lib/tasker/orchestration/connection_pool_intelligence.rb +177 -0
- data/lib/tasker/orchestration/coordinator.rb +119 -0
- data/lib/tasker/orchestration/future_state_analyzer.rb +137 -0
- data/lib/tasker/orchestration/plugin_integration.rb +124 -0
- data/lib/tasker/orchestration/response_processor.rb +168 -0
- data/lib/tasker/orchestration/retry_header_parser.rb +78 -0
- data/lib/tasker/orchestration/step_executor.rb +941 -0
- data/lib/tasker/orchestration/step_sequence_factory.rb +67 -0
- data/lib/tasker/orchestration/task_finalizer.rb +564 -0
- data/lib/tasker/orchestration/task_initializer.rb +140 -0
- data/lib/tasker/orchestration/task_reenqueuer.rb +71 -0
- data/lib/tasker/orchestration/viable_step_discovery.rb +65 -0
- data/lib/tasker/orchestration/workflow_coordinator.rb +294 -0
- data/lib/tasker/orchestration.rb +45 -0
- data/lib/tasker/railtie.rb +9 -0
- data/lib/tasker/registry/base_registry.rb +177 -0
- data/lib/tasker/registry/event_publisher.rb +91 -0
- data/lib/tasker/registry/interface_validator.rb +140 -0
- data/lib/tasker/registry/statistics_collector.rb +381 -0
- data/lib/tasker/registry/subscriber_registry.rb +285 -0
- data/lib/tasker/registry.rb +22 -0
- data/lib/tasker/state_machine/step_state_machine.rb +508 -0
- data/lib/tasker/state_machine/task_state_machine.rb +192 -0
- data/lib/tasker/state_machine.rb +83 -0
- data/lib/tasker/step_handler/api.rb +410 -0
- data/lib/tasker/step_handler/base.rb +206 -0
- data/lib/tasker/task_builder.rb +432 -0
- data/lib/tasker/task_handler/class_methods.rb +324 -0
- data/lib/tasker/task_handler/instance_methods.rb +293 -0
- data/lib/tasker/task_handler/step_group.rb +182 -0
- data/lib/tasker/task_handler.rb +43 -0
- data/lib/tasker/telemetry/event_mapping.rb +126 -0
- data/lib/tasker/telemetry/event_router.rb +318 -0
- data/lib/tasker/telemetry/events/export_events.rb +38 -0
- data/lib/tasker/telemetry/export_coordinator.rb +497 -0
- data/lib/tasker/telemetry/intelligent_cache_manager.rb +508 -0
- data/lib/tasker/telemetry/log_backend.rb +224 -0
- data/lib/tasker/telemetry/metric_types.rb +368 -0
- data/lib/tasker/telemetry/metrics_backend.rb +1227 -0
- data/lib/tasker/telemetry/metrics_export_service.rb +392 -0
- data/lib/tasker/telemetry/plugin_registry.rb +333 -0
- data/lib/tasker/telemetry/plugins/base_exporter.rb +246 -0
- data/lib/tasker/telemetry/plugins/csv_exporter.rb +198 -0
- data/lib/tasker/telemetry/plugins/json_exporter.rb +141 -0
- data/lib/tasker/telemetry/prometheus_exporter.rb +249 -0
- data/lib/tasker/telemetry/trace_backend.rb +186 -0
- data/lib/tasker/telemetry.rb +59 -0
- data/lib/tasker/types/auth_config.rb +81 -0
- data/lib/tasker/types/backoff_config.rb +142 -0
- data/lib/tasker/types/cache_config.rb +257 -0
- data/lib/tasker/types/database_config.rb +39 -0
- data/lib/tasker/types/dependency_graph.rb +225 -0
- data/lib/tasker/types/dependency_graph_config.rb +149 -0
- data/lib/tasker/types/engine_config.rb +131 -0
- data/lib/tasker/types/execution_config.rb +289 -0
- data/lib/tasker/types/health_config.rb +84 -0
- data/lib/tasker/types/step_sequence.rb +24 -0
- data/lib/tasker/types/step_template.rb +63 -0
- data/lib/tasker/types/task_request.rb +60 -0
- data/lib/tasker/types/telemetry_config.rb +273 -0
- data/lib/tasker/types.rb +64 -0
- data/lib/tasker/version.rb +7 -0
- data/lib/tasker.rb +82 -0
- data/lib/tasks/tasker_tasks.rake +302 -0
- metadata +958 -0
@@ -0,0 +1,252 @@
|
|
1
|
+
# Tasker Task Diagrams
|
2
|
+
|
3
|
+
The `Tasker::TaskDiagram` class provides a way to visualize task workflows using Mermaid diagrams. This makes it easy to understand the current state of a task's workflow and the relationships between its steps.
|
4
|
+
|
5
|
+
## Features
|
6
|
+
|
7
|
+
Tasker::TaskDiagram includes:
|
8
|
+
|
9
|
+
- A native diagram implementation (no external gems required)
|
10
|
+
- Automatic color-coding of workflow steps based on their status
|
11
|
+
- Direct generation of Mermaid syntax for flowcharts
|
12
|
+
- Support for embedding diagrams in web pages
|
13
|
+
- Complete HTML document generation with the diagram embedded
|
14
|
+
|
15
|
+
## Basic Usage
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
# Create a diagram for a task
|
19
|
+
task = Tasker::Task.find(task_id)
|
20
|
+
diagram = Tasker::TaskDiagram.new(task)
|
21
|
+
|
22
|
+
# Generate Mermaid syntax
|
23
|
+
mermaid_string = diagram.to_mermaid
|
24
|
+
|
25
|
+
# Generate a complete HTML document with the embedded diagram
|
26
|
+
html_document = diagram.to_html
|
27
|
+
|
28
|
+
# Convert diagram to JSON format
|
29
|
+
json_data = diagram.to_json
|
30
|
+
```
|
31
|
+
|
32
|
+
## Adding Links to REST Endpoints
|
33
|
+
|
34
|
+
You can add clickable links to each workflow step by providing a base URL when creating the diagram:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
# Create a diagram with links to REST endpoints
|
38
|
+
base_url = "https://example.com/api"
|
39
|
+
diagram = Tasker::TaskDiagram.new(task, base_url)
|
40
|
+
|
41
|
+
# Each step in the diagram will link to {base_url}/workflow_steps/{workflow_step_id}
|
42
|
+
```
|
43
|
+
|
44
|
+
## Diagram Rendering Options
|
45
|
+
|
46
|
+
The TaskDiagram class provides two main methods for visualization:
|
47
|
+
|
48
|
+
### to_mermaid
|
49
|
+
|
50
|
+
This method returns a string containing the Mermaid diagram syntax, which can be embedded in Markdown files, documentation, or any Mermaid-compatible viewer.
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
diagram = Tasker::TaskDiagram.new(task)
|
54
|
+
mermaid_string = diagram.to_mermaid
|
55
|
+
|
56
|
+
# Example output:
|
57
|
+
# graph TD
|
58
|
+
# subgraph "Task 123: MyTask"
|
59
|
+
# task_123["Task: MyTask<br/>ID: 123<br/>Status: COMPLETE"]
|
60
|
+
# step_456["Step: step1<br/>Status: COMPLETE<br/>Attempts: 1"]
|
61
|
+
# task_123 --> step_456
|
62
|
+
# ...
|
63
|
+
# end
|
64
|
+
```
|
65
|
+
|
66
|
+
### to_html
|
67
|
+
|
68
|
+
This method returns a complete HTML document with the Mermaid diagram embedded and ready to view in a web browser. The HTML includes:
|
69
|
+
|
70
|
+
- The Mermaid JavaScript library for rendering
|
71
|
+
- Basic styling for the diagram
|
72
|
+
- Task information in a header section
|
73
|
+
- The rendered diagram
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
diagram = Tasker::TaskDiagram.new(task)
|
77
|
+
html = diagram.to_html
|
78
|
+
|
79
|
+
# Save to a file for viewing
|
80
|
+
File.write("task_#{task.task_id}_diagram.html", html)
|
81
|
+
```
|
82
|
+
|
83
|
+
### to_json
|
84
|
+
|
85
|
+
This method returns the diagram data as a JSON string with nodes, edges, and diagram properties. This is useful for APIs and for custom rendering.
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
diagram = Tasker::TaskDiagram.new(task)
|
89
|
+
json = diagram.to_json
|
90
|
+
|
91
|
+
# Example output:
|
92
|
+
# {
|
93
|
+
# "nodes": [
|
94
|
+
# {"id": "task_123", "label": "Task: MyTask\nID: 123\nStatus: COMPLETE", ...},
|
95
|
+
# {"id": "step_456", "label": "Step: step1\nStatus: COMPLETE\nAttempts: 1", ...}
|
96
|
+
# ],
|
97
|
+
# "edges": [
|
98
|
+
# {"source_id": "task_123", "target_id": "step_456", ...}
|
99
|
+
# ],
|
100
|
+
# "direction": "TD",
|
101
|
+
# "title": "Task 123: MyTask"
|
102
|
+
# }
|
103
|
+
```
|
104
|
+
|
105
|
+
## Templates
|
106
|
+
|
107
|
+
The HTML rendering uses an ERB template located in the app/views/tasker/task directory:
|
108
|
+
|
109
|
+
- `_diagram.html.erb`: Complete HTML document template for standalone viewing
|
110
|
+
|
111
|
+
You can customize this template to match your application's styling and requirements.
|
112
|
+
|
113
|
+
## Visual Features
|
114
|
+
|
115
|
+
The diagram includes the following visual features:
|
116
|
+
|
117
|
+
- Color-coded steps based on their status:
|
118
|
+
- PENDING: Light blue
|
119
|
+
- IN_PROGRESS: Light green
|
120
|
+
- COMPLETE: Green
|
121
|
+
- ERROR: Red
|
122
|
+
- CANCELLED: Gray
|
123
|
+
|
124
|
+
- Task information at the top, including:
|
125
|
+
- Task name
|
126
|
+
- Task ID
|
127
|
+
- Current status
|
128
|
+
|
129
|
+
- Step information, including:
|
130
|
+
- Step name
|
131
|
+
- Status
|
132
|
+
- Number of attempts
|
133
|
+
- Error information (for steps in ERROR status)
|
134
|
+
|
135
|
+
- Directed edges showing the workflow dependencies between steps
|
136
|
+
|
137
|
+
## Native Diagram Implementation
|
138
|
+
|
139
|
+
The TaskDiagram uses a custom, native diagram implementation with the following components:
|
140
|
+
|
141
|
+
### Tasker::Diagram::Node
|
142
|
+
|
143
|
+
Represents a node in the diagram with properties like:
|
144
|
+
- `id`: Unique identifier
|
145
|
+
- `label`: Display text (supports HTML line breaks with `<br/>`)
|
146
|
+
- `shape`: Node shape (box, circle, etc.)
|
147
|
+
- `style`: CSS styling for the node
|
148
|
+
- `url`: Optional URL for clickable nodes
|
149
|
+
|
150
|
+
### Tasker::Diagram::Edge
|
151
|
+
|
152
|
+
Represents a connection between nodes with properties like:
|
153
|
+
- `source_id`: ID of the source node
|
154
|
+
- `target_id`: ID of the target node
|
155
|
+
- `label`: Text displayed on the edge (shown within pipes `|` in the syntax)
|
156
|
+
- `type`: Edge style (solid, dashed, etc.)
|
157
|
+
- `direction`: Arrow direction (forward, back, both, none)
|
158
|
+
|
159
|
+
### Tasker::Diagram::Flowchart
|
160
|
+
|
161
|
+
Represents a complete flowchart containing nodes and edges with properties like:
|
162
|
+
- `nodes`: Collection of nodes
|
163
|
+
- `edges`: Collection of edges
|
164
|
+
- `direction`: Layout direction (TD, LR, etc.)
|
165
|
+
- `title`: Optional title for the diagram (shown as a subgraph title)
|
166
|
+
|
167
|
+
All these components support JSON serialization and generation of Mermaid syntax.
|
168
|
+
|
169
|
+
## Examples
|
170
|
+
|
171
|
+
### Controller Integration
|
172
|
+
|
173
|
+
You can easily integrate the task diagram into a controller action:
|
174
|
+
|
175
|
+
```ruby
|
176
|
+
class TasksController < ApplicationController
|
177
|
+
def diagram
|
178
|
+
@task = Tasker::Task.find(params[:id])
|
179
|
+
diagram = Tasker::TaskDiagram.new(@task, request.base_url)
|
180
|
+
|
181
|
+
respond_to do |format|
|
182
|
+
format.html { render html: diagram.to_html.html_safe }
|
183
|
+
format.text { render plain: diagram.to_mermaid }
|
184
|
+
format.json { render json: diagram.to_json }
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
```
|
189
|
+
|
190
|
+
### Use in API Responses
|
191
|
+
|
192
|
+
```ruby
|
193
|
+
def show
|
194
|
+
task = Tasker::Task.find(params[:id])
|
195
|
+
diagram = Tasker::TaskDiagram.new(task, request.base_url)
|
196
|
+
|
197
|
+
render json: {
|
198
|
+
task: task.as_json,
|
199
|
+
diagram: JSON.parse(diagram.to_json),
|
200
|
+
mermaid_syntax: diagram.to_mermaid
|
201
|
+
}
|
202
|
+
end
|
203
|
+
```
|
204
|
+
|
205
|
+
### Use in Rails Views
|
206
|
+
|
207
|
+
```erb
|
208
|
+
<!-- Using a div with Mermaid class -->
|
209
|
+
<div class="mermaid">
|
210
|
+
<%= Tasker::TaskDiagram.new(@task).to_mermaid %>
|
211
|
+
</div>
|
212
|
+
|
213
|
+
<!-- Include the Mermaid JS library in your layout -->
|
214
|
+
<% content_for :head do %>
|
215
|
+
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
|
216
|
+
<script>
|
217
|
+
document.addEventListener('DOMContentLoaded', function() {
|
218
|
+
mermaid.initialize({ startOnLoad: true });
|
219
|
+
});
|
220
|
+
</script>
|
221
|
+
<% end %>
|
222
|
+
```
|
223
|
+
|
224
|
+
### Mermaid Syntax Updates
|
225
|
+
|
226
|
+
The current Mermaid syntax follows these conventions:
|
227
|
+
|
228
|
+
1. Nodes use HTML line breaks with `<br/>` tags instead of newlines
|
229
|
+
```
|
230
|
+
nodeId["Multi-line<br/>content here"]
|
231
|
+
```
|
232
|
+
|
233
|
+
2. Edge labels use pipe syntax for clarity
|
234
|
+
```
|
235
|
+
A -->|"connects to"| B
|
236
|
+
```
|
237
|
+
|
238
|
+
3. Titles are implemented as subgraphs rather than title directives
|
239
|
+
```
|
240
|
+
subgraph "Task 123: Process Order"
|
241
|
+
// nodes and edges here
|
242
|
+
end
|
243
|
+
```
|
244
|
+
|
245
|
+
### Customizing the Template
|
246
|
+
|
247
|
+
You can modify the template to match your application's styling or add additional information:
|
248
|
+
|
249
|
+
```ruby
|
250
|
+
# Customize the template in:
|
251
|
+
# app/views/tasker/task/_diagram.html.erb # Full HTML document
|
252
|
+
```
|
@@ -0,0 +1,237 @@
|
|
1
|
+
# Task Execution Control Flow
|
2
|
+
|
3
|
+
This document describes the orchestration patterns and control flow for task execution in Tasker, with particular focus on the coordination between WorkflowCoordinator and TaskFinalizer components.
|
4
|
+
|
5
|
+
## Overview
|
6
|
+
|
7
|
+
Tasker's task execution follows a sophisticated orchestration pattern that supports both coordinated workflow execution and autonomous task management. The system uses a **dual finalization strategy** to handle different execution contexts while maintaining consistency and preventing race conditions.
|
8
|
+
|
9
|
+
## Core Components
|
10
|
+
|
11
|
+
### 1. WorkflowCoordinator
|
12
|
+
- **Role**: Primary orchestration engine for task execution
|
13
|
+
- **Responsibility**: Manages step-by-step execution within a single workflow session
|
14
|
+
- **Scope**: Single task execution from start to completion
|
15
|
+
|
16
|
+
### 2. TaskFinalizer
|
17
|
+
- **Role**: Task state management and completion logic
|
18
|
+
- **Responsibility**: Determines task completion, handles state transitions, manages reenqueuing
|
19
|
+
- **Scope**: Can operate independently or as part of coordinated execution
|
20
|
+
|
21
|
+
### 3. Execution Context Separation
|
22
|
+
The system distinguishes between two execution contexts:
|
23
|
+
- **Coordinated Execution**: Within an active WorkflowCoordinator session
|
24
|
+
- **Autonomous Execution**: Independent task management and cleanup
|
25
|
+
|
26
|
+
## Control Flow Patterns
|
27
|
+
|
28
|
+
### Pattern 1: Coordinated Workflow Execution (Production Primary Path)
|
29
|
+
|
30
|
+
```
|
31
|
+
TaskRunnerJob.perform(task_id)
|
32
|
+
↓
|
33
|
+
TaskHandler.handle(task)
|
34
|
+
↓
|
35
|
+
WorkflowCoordinator.execute_workflow(task, task_handler)
|
36
|
+
↓
|
37
|
+
[Step Execution Loop]
|
38
|
+
↓
|
39
|
+
WorkflowCoordinator → task_handler.finalize(task, sequence, processed_steps)
|
40
|
+
↓
|
41
|
+
TaskHandler.finalize → task_finalizer.finalize_task_with_steps(task, sequence, processed_steps)
|
42
|
+
↓
|
43
|
+
FinalizationProcessor.finalize_with_steps(task, processed_steps, finalizer)
|
44
|
+
↓
|
45
|
+
TaskFinalizer.finalize_task(task.task_id, synchronous: true) ← SYNCHRONOUS
|
46
|
+
```
|
47
|
+
|
48
|
+
**Key Characteristics:**
|
49
|
+
- **Single-threaded execution** within the workflow coordinator
|
50
|
+
- **Synchronous finalization** prevents reenqueuing/step execution conflicts
|
51
|
+
- **Rich event publishing** with processed step context
|
52
|
+
- **Coordinated state management** with workflow awareness
|
53
|
+
|
54
|
+
### Pattern 2: Autonomous Task Management (Event-Driven)
|
55
|
+
|
56
|
+
```
|
57
|
+
Event: TaskFinalizer.handle_no_viable_steps(event)
|
58
|
+
↓
|
59
|
+
TaskFinalizer.finalize_task(task_id) ← Default: synchronous: false
|
60
|
+
↓
|
61
|
+
[Autonomous decision making]
|
62
|
+
↓
|
63
|
+
May reenqueue task or execute ready steps independently
|
64
|
+
```
|
65
|
+
|
66
|
+
**Key Characteristics:**
|
67
|
+
- **Event-driven activation** outside workflow sessions
|
68
|
+
- **Asynchronous finalization** allows autonomous orchestration decisions
|
69
|
+
- **Independent reenqueuing** based on task state analysis
|
70
|
+
- **Cleanup and continuation** logic for orphaned or stalled tasks
|
71
|
+
|
72
|
+
## Synchronous vs Asynchronous Finalization
|
73
|
+
|
74
|
+
### Synchronous Finalization (`synchronous: true`)
|
75
|
+
|
76
|
+
**When Used:**
|
77
|
+
- Called from `FinalizationProcessor.finalize_with_steps`
|
78
|
+
- During coordinated workflow execution
|
79
|
+
- At the end of a WorkflowCoordinator session
|
80
|
+
|
81
|
+
**Behavior:**
|
82
|
+
```ruby
|
83
|
+
if synchronous
|
84
|
+
# In synchronous mode, we can't actually execute steps here
|
85
|
+
# The calling code should handle step execution
|
86
|
+
Rails.logger.info("TaskFinalizer: Task #{task.task_id} ready for synchronous step execution")
|
87
|
+
else
|
88
|
+
# In asynchronous mode, reenqueue immediately for step execution
|
89
|
+
finalizer.reenqueue_task_with_context(task, context,
|
90
|
+
reason: Constants::TaskFinalization::ReenqueueReasons::READY_STEPS_AVAILABLE)
|
91
|
+
end
|
92
|
+
```
|
93
|
+
|
94
|
+
**Purpose:**
|
95
|
+
- **Prevents execution conflicts** with active WorkflowCoordinator
|
96
|
+
- **Defers orchestration decisions** to the coordinating workflow
|
97
|
+
- **Maintains state consistency** without competing execution attempts
|
98
|
+
- **Enables event publishing** while respecting execution boundaries
|
99
|
+
|
100
|
+
### Asynchronous Finalization (`synchronous: false`)
|
101
|
+
|
102
|
+
**When Used:**
|
103
|
+
- Default behavior for standalone finalization calls
|
104
|
+
- Event-driven task cleanup (`handle_no_viable_steps`)
|
105
|
+
- Independent task management scenarios
|
106
|
+
|
107
|
+
**Behavior:**
|
108
|
+
- **Can reenqueue tasks** for further processing
|
109
|
+
- **Can execute ready steps** autonomously
|
110
|
+
- **Makes independent orchestration decisions**
|
111
|
+
- **Handles cleanup and continuation** logic
|
112
|
+
|
113
|
+
## Event Flow and Observability
|
114
|
+
|
115
|
+
### Coordinated Execution Events
|
116
|
+
```
|
117
|
+
1. publish_finalization_started(task, processed_steps, context)
|
118
|
+
2. [Standard finalization logic with synchronous: true]
|
119
|
+
3. publish_finalization_completed(task, processed_steps, final_context)
|
120
|
+
```
|
121
|
+
|
122
|
+
**Event Payload Includes:**
|
123
|
+
- `processed_steps_count`
|
124
|
+
- `execution_status`
|
125
|
+
- `health_status`
|
126
|
+
- `completion_percentage`
|
127
|
+
- `total_steps`, `ready_steps`, `failed_steps`
|
128
|
+
- `recommended_action`
|
129
|
+
|
130
|
+
### Autonomous Execution Events
|
131
|
+
Standard task state transition events without detailed step context.
|
132
|
+
|
133
|
+
## State Management
|
134
|
+
|
135
|
+
### Task State Transitions
|
136
|
+
Both execution patterns handle the same core state transitions:
|
137
|
+
|
138
|
+
```
|
139
|
+
PENDING → IN_PROGRESS → COMPLETE/FAILED
|
140
|
+
```
|
141
|
+
|
142
|
+
### Coordination States
|
143
|
+
Additional states managed during coordinated execution:
|
144
|
+
- **READY_STEPS_AVAILABLE**: Steps ready for execution
|
145
|
+
- **AWAITING_DEPENDENCIES**: Waiting for step dependencies
|
146
|
+
- **STEPS_IN_PROGRESS**: Active step processing
|
147
|
+
- **BLOCKED_BY_FAILURES**: Error state requiring intervention
|
148
|
+
|
149
|
+
## Reenqueuing Strategy
|
150
|
+
|
151
|
+
### Synchronous Context (No Reenqueuing)
|
152
|
+
- Task state transitions occur
|
153
|
+
- Events are published
|
154
|
+
- **Control returns to WorkflowCoordinator**
|
155
|
+
- Coordinator decides next actions
|
156
|
+
|
157
|
+
### Asynchronous Context (Autonomous Reenqueuing)
|
158
|
+
- Task state transitions occur
|
159
|
+
- **TaskFinalizer makes reenqueuing decisions**
|
160
|
+
- Tasks are queued for continued processing
|
161
|
+
- Independent of any workflow session
|
162
|
+
|
163
|
+
## Error Handling and Recovery
|
164
|
+
|
165
|
+
### Coordinated Execution
|
166
|
+
- Errors bubble up to WorkflowCoordinator
|
167
|
+
- Coordinated retry and recovery logic
|
168
|
+
- Workflow-aware error handling
|
169
|
+
|
170
|
+
### Autonomous Execution
|
171
|
+
- Independent error handling
|
172
|
+
- Automatic reenqueuing for recoverable failures
|
173
|
+
- Isolated failure management
|
174
|
+
|
175
|
+
## Design Rationale
|
176
|
+
|
177
|
+
### Why Two Execution Patterns?
|
178
|
+
|
179
|
+
1. **Execution Conflict Prevention**: Prevents race conditions between WorkflowCoordinator and TaskFinalizer when both might attempt step execution
|
180
|
+
|
181
|
+
2. **Orchestration Control**: Allows WorkflowCoordinator to maintain full control over execution timing and step ordering
|
182
|
+
|
183
|
+
3. **Event Integration**: Enables rich observability events without interfering with execution flow
|
184
|
+
|
185
|
+
4. **Clean Separation**: Separates "finalization as part of workflow execution" from "finalization as independent task cleanup"
|
186
|
+
|
187
|
+
5. **Architectural Flexibility**: Supports both coordinated workflow sessions and autonomous task management
|
188
|
+
|
189
|
+
### Performance Considerations
|
190
|
+
|
191
|
+
- **Reduced Reenqueuing**: Synchronous finalization eliminates unnecessary reenqueuing during active workflow sessions
|
192
|
+
- **Optimized Event Publishing**: Rich events only published when step context is available
|
193
|
+
- **Efficient State Management**: Single state transition cycle per execution context
|
194
|
+
|
195
|
+
## Best Practices
|
196
|
+
|
197
|
+
### For Framework Development
|
198
|
+
|
199
|
+
1. **Always use `finalize_task_with_steps`** when finalizing from workflow execution
|
200
|
+
2. **Use default `finalize_task`** for event-driven cleanup
|
201
|
+
3. **Respect the synchronous flag** in finalization logic
|
202
|
+
4. **Publish appropriate events** for each execution context
|
203
|
+
|
204
|
+
### For Task Handler Implementation
|
205
|
+
|
206
|
+
1. **Call `finalize()` method** at end of task execution - it handles coordination automatically
|
207
|
+
2. **Don't call TaskFinalizer directly** from task handlers
|
208
|
+
3. **Implement `update_annotations()`** hook for custom finalization logic
|
209
|
+
|
210
|
+
### For Event Subscribers
|
211
|
+
|
212
|
+
1. **Handle both execution patterns** in event subscribers
|
213
|
+
2. **Check event context** to understand execution pattern
|
214
|
+
3. **Don't assume step context** in all finalization events
|
215
|
+
|
216
|
+
## Troubleshooting
|
217
|
+
|
218
|
+
### Common Issues
|
219
|
+
|
220
|
+
1. **Duplicate Execution**: Usually caused by calling both execution patterns simultaneously
|
221
|
+
2. **Missing Events**: Check if using appropriate finalization method for context
|
222
|
+
3. **State Inconsistencies**: Verify synchronous flag usage in custom finalization logic
|
223
|
+
|
224
|
+
### Debugging Steps
|
225
|
+
|
226
|
+
1. Check TaskFinalizer logs for synchronous flag values
|
227
|
+
2. Trace event publishing to identify execution pattern
|
228
|
+
3. Verify WorkflowCoordinator session boundaries
|
229
|
+
4. Monitor reenqueuing patterns for autonomous vs coordinated execution
|
230
|
+
|
231
|
+
## Future Considerations
|
232
|
+
|
233
|
+
The dual finalization pattern provides a foundation for:
|
234
|
+
- **Distributed orchestration** across multiple coordinators
|
235
|
+
- **Hierarchical workflow management** with nested coordination
|
236
|
+
- **Advanced retry strategies** with context-aware reenqueuing
|
237
|
+
- **Performance optimizations** through execution pattern analysis
|