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.
Files changed (605) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +443 -0
  4. data/Rakefile +10 -0
  5. data/app/controllers/tasker/analytics_controller.rb +179 -0
  6. data/app/controllers/tasker/application_controller.rb +45 -0
  7. data/app/controllers/tasker/graphql_controller.rb +193 -0
  8. data/app/controllers/tasker/handlers_controller.rb +217 -0
  9. data/app/controllers/tasker/health_controller.rb +229 -0
  10. data/app/controllers/tasker/metrics_controller.rb +111 -0
  11. data/app/controllers/tasker/page_sort.rb +97 -0
  12. data/app/controllers/tasker/task_diagrams_controller.rb +30 -0
  13. data/app/controllers/tasker/tasks_controller.rb +123 -0
  14. data/app/controllers/tasker/workflow_steps_controller.rb +69 -0
  15. data/app/graphql/examples/all_tasks.graphql +22 -0
  16. data/app/graphql/examples/pending_tasks.graphql +23 -0
  17. data/app/graphql/tasker/graph_ql_types/annotation_type.rb +14 -0
  18. data/app/graphql/tasker/graph_ql_types/base_argument.rb +9 -0
  19. data/app/graphql/tasker/graph_ql_types/base_connection.rb +11 -0
  20. data/app/graphql/tasker/graph_ql_types/base_edge.rb +10 -0
  21. data/app/graphql/tasker/graph_ql_types/base_enum.rb +9 -0
  22. data/app/graphql/tasker/graph_ql_types/base_field.rb +10 -0
  23. data/app/graphql/tasker/graph_ql_types/base_input_object.rb +10 -0
  24. data/app/graphql/tasker/graph_ql_types/base_interface.rb +14 -0
  25. data/app/graphql/tasker/graph_ql_types/base_object.rb +10 -0
  26. data/app/graphql/tasker/graph_ql_types/base_scalar.rb +9 -0
  27. data/app/graphql/tasker/graph_ql_types/base_union.rb +11 -0
  28. data/app/graphql/tasker/graph_ql_types/dependent_system_object_map_type.rb +18 -0
  29. data/app/graphql/tasker/graph_ql_types/dependent_system_type.rb +13 -0
  30. data/app/graphql/tasker/graph_ql_types/mutation_type.rb +16 -0
  31. data/app/graphql/tasker/graph_ql_types/named_step_type.rb +16 -0
  32. data/app/graphql/tasker/graph_ql_types/named_task_type.rb +14 -0
  33. data/app/graphql/tasker/graph_ql_types/named_tasks_named_step_type.rb +19 -0
  34. data/app/graphql/tasker/graph_ql_types/node_type.rb +12 -0
  35. data/app/graphql/tasker/graph_ql_types/query_type.rb +20 -0
  36. data/app/graphql/tasker/graph_ql_types/task_annotation_type.rb +17 -0
  37. data/app/graphql/tasker/graph_ql_types/task_interface.rb +17 -0
  38. data/app/graphql/tasker/graph_ql_types/task_type.rb +26 -0
  39. data/app/graphql/tasker/graph_ql_types/workflow_step_type.rb +154 -0
  40. data/app/graphql/tasker/graph_ql_types.rb +42 -0
  41. data/app/graphql/tasker/mutations/base_mutation.rb +13 -0
  42. data/app/graphql/tasker/mutations/cancel_step.rb +29 -0
  43. data/app/graphql/tasker/mutations/cancel_task.rb +29 -0
  44. data/app/graphql/tasker/mutations/create_task.rb +52 -0
  45. data/app/graphql/tasker/mutations/update_step.rb +36 -0
  46. data/app/graphql/tasker/mutations/update_task.rb +41 -0
  47. data/app/graphql/tasker/queries/all_annotation_types.rb +17 -0
  48. data/app/graphql/tasker/queries/all_tasks.rb +23 -0
  49. data/app/graphql/tasker/queries/base_query.rb +9 -0
  50. data/app/graphql/tasker/queries/helpers.rb +16 -0
  51. data/app/graphql/tasker/queries/one_step.rb +24 -0
  52. data/app/graphql/tasker/queries/one_task.rb +18 -0
  53. data/app/graphql/tasker/queries/tasks_by_annotation.rb +31 -0
  54. data/app/graphql/tasker/queries/tasks_by_status.rb +30 -0
  55. data/app/graphql/tasker/tasker_rails_schema.rb +52 -0
  56. data/app/jobs/tasker/application_job.rb +8 -0
  57. data/app/jobs/tasker/metrics_export_job.rb +252 -0
  58. data/app/jobs/tasker/task_runner_job.rb +224 -0
  59. data/app/models/tasker/annotation_type.rb +26 -0
  60. data/app/models/tasker/application_record.rb +70 -0
  61. data/app/models/tasker/dependent_system.rb +26 -0
  62. data/app/models/tasker/dependent_system_object_map.rb +64 -0
  63. data/app/models/tasker/diagram/edge.rb +106 -0
  64. data/app/models/tasker/diagram/flowchart.rb +137 -0
  65. data/app/models/tasker/diagram/node.rb +99 -0
  66. data/app/models/tasker/named_step.rb +41 -0
  67. data/app/models/tasker/named_task.rb +121 -0
  68. data/app/models/tasker/named_tasks_named_step.rb +82 -0
  69. data/app/models/tasker/step_dag_relationship.rb +65 -0
  70. data/app/models/tasker/step_readiness_status.rb +59 -0
  71. data/app/models/tasker/task.rb +424 -0
  72. data/app/models/tasker/task_annotation.rb +36 -0
  73. data/app/models/tasker/task_diagram.rb +332 -0
  74. data/app/models/tasker/task_execution_context.rb +29 -0
  75. data/app/models/tasker/task_namespace.rb +41 -0
  76. data/app/models/tasker/task_transition.rb +235 -0
  77. data/app/models/tasker/workflow_step.rb +461 -0
  78. data/app/models/tasker/workflow_step_edge.rb +94 -0
  79. data/app/models/tasker/workflow_step_transition.rb +434 -0
  80. data/app/serializers/tasker/annotation_type_serializer.rb +8 -0
  81. data/app/serializers/tasker/handler_serializer.rb +109 -0
  82. data/app/serializers/tasker/task_annotation_serializer.rb +32 -0
  83. data/app/serializers/tasker/task_serializer.rb +168 -0
  84. data/app/serializers/tasker/workflow_step_serializer.rb +27 -0
  85. data/app/services/tasker/analytics_service.rb +409 -0
  86. data/app/views/tasker/task/_diagram.html.erb +32 -0
  87. data/config/initializers/dry_struct.rb +11 -0
  88. data/config/initializers/statesman.rb +6 -0
  89. data/config/initializers/tasker_orchestration.rb +17 -0
  90. data/config/initializers/time_formats.rb +4 -0
  91. data/config/routes.rb +34 -0
  92. data/config/tasker/subscriptions/example_integrations.yml +67 -0
  93. data/config/tasker/system_events.yml +305 -0
  94. data/db/functions/calculate_dependency_levels_v01.sql +45 -0
  95. data/db/functions/get_analytics_metrics_v01.sql +137 -0
  96. data/db/functions/get_slowest_steps_v01.sql +82 -0
  97. data/db/functions/get_slowest_tasks_v01.sql +96 -0
  98. data/db/functions/get_step_readiness_status_batch_v01.sql +140 -0
  99. data/db/functions/get_step_readiness_status_v01.sql +139 -0
  100. data/db/functions/get_system_health_counts_v01.sql +108 -0
  101. data/db/functions/get_task_execution_context_v01.sql +108 -0
  102. data/db/functions/get_task_execution_contexts_batch_v01.sql +104 -0
  103. data/db/init/schema.sql +2277 -0
  104. data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
  105. data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
  106. data/docs/APPLICATION_GENERATOR.md +384 -0
  107. data/docs/AUTH.md +1780 -0
  108. data/docs/CIRCUIT_BREAKER.md +224 -0
  109. data/docs/DEVELOPER_GUIDE.md +2665 -0
  110. data/docs/EVENT_SYSTEM.md +637 -0
  111. data/docs/EXECUTION_CONFIGURATION.md +341 -0
  112. data/docs/FLOW_CHART.md +149 -0
  113. data/docs/HEALTH.md +542 -0
  114. data/docs/METRICS.md +731 -0
  115. data/docs/OPTIMIZATION_PLAN.md +1479 -0
  116. data/docs/OVERVIEW.md +552 -0
  117. data/docs/QUICK_START.md +270 -0
  118. data/docs/REGISTRY_SYSTEMS.md +373 -0
  119. data/docs/REST_API.md +632 -0
  120. data/docs/ROADMAP.md +221 -0
  121. data/docs/SQL_FUNCTIONS.md +1408 -0
  122. data/docs/TASK_DIAGRAM.md +252 -0
  123. data/docs/TASK_EXECUTION_CONTROL_FLOW.md +237 -0
  124. data/docs/TELEMETRY.md +795 -0
  125. data/docs/TROUBLESHOOTING.md +756 -0
  126. data/docs/TaskHandlerGenerator.html +255 -0
  127. data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +907 -0
  128. data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1236 -0
  129. data/docs/Tasker/Analysis.html +117 -0
  130. data/docs/Tasker/AnalyticsController.html +450 -0
  131. data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +816 -0
  132. data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +586 -0
  133. data/docs/Tasker/AnalyticsService.html +2221 -0
  134. data/docs/Tasker/AnnotationType.html +137 -0
  135. data/docs/Tasker/AnnotationTypeSerializer.html +124 -0
  136. data/docs/Tasker/ApplicationController.html +147 -0
  137. data/docs/Tasker/ApplicationJob.html +128 -0
  138. data/docs/Tasker/ApplicationRecord.html +378 -0
  139. data/docs/Tasker/Authentication/AuthenticationError.html +124 -0
  140. data/docs/Tasker/Authentication/ConfigurationError.html +124 -0
  141. data/docs/Tasker/Authentication/Coordinator.html +242 -0
  142. data/docs/Tasker/Authentication/Interface.html +560 -0
  143. data/docs/Tasker/Authentication/InterfaceError.html +124 -0
  144. data/docs/Tasker/Authentication/NoneAuthenticator.html +338 -0
  145. data/docs/Tasker/Authentication.html +119 -0
  146. data/docs/Tasker/Authorization/AuthorizationError.html +139 -0
  147. data/docs/Tasker/Authorization/BaseCoordinator.html +927 -0
  148. data/docs/Tasker/Authorization/ConfigurationError.html +153 -0
  149. data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +428 -0
  150. data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +365 -0
  151. data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
  152. data/docs/Tasker/Authorization/ResourceRegistry.html +882 -0
  153. data/docs/Tasker/Authorization/UnauthorizedError.html +153 -0
  154. data/docs/Tasker/Authorization.html +582 -0
  155. data/docs/Tasker/CacheCapabilities.html +167 -0
  156. data/docs/Tasker/CacheStrategy.html +1297 -0
  157. data/docs/Tasker/Concerns/Authenticatable.html +116 -0
  158. data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +256 -0
  159. data/docs/Tasker/Concerns/Authorizable.html +816 -0
  160. data/docs/Tasker/Concerns/ControllerAuthorizable.html +157 -0
  161. data/docs/Tasker/Concerns/EventPublisher.html +4023 -0
  162. data/docs/Tasker/Concerns/IdempotentStateTransitions.html +806 -0
  163. data/docs/Tasker/Concerns/LifecycleEventHelpers.html +129 -0
  164. data/docs/Tasker/Concerns/OrchestrationPublisher.html +129 -0
  165. data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1075 -0
  166. data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +191 -0
  167. data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +126 -0
  168. data/docs/Tasker/Concerns/StateMachineBase.html +153 -0
  169. data/docs/Tasker/Concerns/StructuredLogging.html +1413 -0
  170. data/docs/Tasker/Concerns.html +117 -0
  171. data/docs/Tasker/Configuration/AuthConfiguration.html +1023 -0
  172. data/docs/Tasker/Configuration/ConfigurationProxy.html +581 -0
  173. data/docs/Tasker/Configuration/DatabaseConfiguration.html +475 -0
  174. data/docs/Tasker/Configuration/EngineConfiguration.html +1265 -0
  175. data/docs/Tasker/Configuration/HealthConfiguration.html +791 -0
  176. data/docs/Tasker/Configuration/TelemetryConfiguration.html +1308 -0
  177. data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +388 -0
  178. data/docs/Tasker/Configuration.html +1669 -0
  179. data/docs/Tasker/ConfigurationError.html +143 -0
  180. data/docs/Tasker/ConfiguredTask.html +514 -0
  181. data/docs/Tasker/Constants/EventDefinitions.html +590 -0
  182. data/docs/Tasker/Constants/LifecycleEvents.html +137 -0
  183. data/docs/Tasker/Constants/ObservabilityEvents/Step.html +152 -0
  184. data/docs/Tasker/Constants/ObservabilityEvents/Task.html +142 -0
  185. data/docs/Tasker/Constants/ObservabilityEvents.html +126 -0
  186. data/docs/Tasker/Constants/RegistryEvents.html +285 -0
  187. data/docs/Tasker/Constants/StepEvents.html +177 -0
  188. data/docs/Tasker/Constants/TaskEvents.html +167 -0
  189. data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +207 -0
  190. data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +191 -0
  191. data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +207 -0
  192. data/docs/Tasker/Constants/TaskExecution.html +126 -0
  193. data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +132 -0
  194. data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +207 -0
  195. data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +239 -0
  196. data/docs/Tasker/Constants/TaskFinalization.html +126 -0
  197. data/docs/Tasker/Constants/TaskStatuses.html +223 -0
  198. data/docs/Tasker/Constants/TestEvents.html +163 -0
  199. data/docs/Tasker/Constants/WorkflowEvents.html +222 -0
  200. data/docs/Tasker/Constants/WorkflowStepStatuses.html +223 -0
  201. data/docs/Tasker/Constants.html +561 -0
  202. data/docs/Tasker/DependentSystem.html +137 -0
  203. data/docs/Tasker/DependentSystemObjectMap.html +250 -0
  204. data/docs/Tasker/DetectorRegistry.html +598 -0
  205. data/docs/Tasker/Diagram/Edge.html +1191 -0
  206. data/docs/Tasker/Diagram/Flowchart.html +1539 -0
  207. data/docs/Tasker/Diagram/Node.html +1165 -0
  208. data/docs/Tasker/Diagram.html +117 -0
  209. data/docs/Tasker/Engine.html +215 -0
  210. data/docs/Tasker/Error.html +139 -0
  211. data/docs/Tasker/Events/Bus.html +1226 -0
  212. data/docs/Tasker/Events/Catalog/CatalogPrinter.html +258 -0
  213. data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +276 -0
  214. data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +294 -0
  215. data/docs/Tasker/Events/Catalog.html +1291 -0
  216. data/docs/Tasker/Events/CustomRegistry.html +943 -0
  217. data/docs/Tasker/Events/DefinitionLoader.html +575 -0
  218. data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +286 -0
  219. data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +312 -0
  220. data/docs/Tasker/Events/EventPayloadBuilder.html +664 -0
  221. data/docs/Tasker/Events/Publisher.html +365 -0
  222. data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1128 -0
  223. data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +270 -0
  224. data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +266 -0
  225. data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +2556 -0
  226. data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +723 -0
  227. data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +2251 -0
  228. data/docs/Tasker/Events/Subscribers.html +117 -0
  229. data/docs/Tasker/Events/SubscriptionLoader.html +493 -0
  230. data/docs/Tasker/Events.html +294 -0
  231. data/docs/Tasker/EventsGenerator.html +459 -0
  232. data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +135 -0
  233. data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +412 -0
  234. data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +598 -0
  235. data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +135 -0
  236. data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +453 -0
  237. data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +135 -0
  238. data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +453 -0
  239. data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1457 -0
  240. data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +135 -0
  241. data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +370 -0
  242. data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1250 -0
  243. data/docs/Tasker/Functions/FunctionWrapper.html +479 -0
  244. data/docs/Tasker/Functions.html +117 -0
  245. data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +244 -0
  246. data/docs/Tasker/Generators/AuthenticatorGenerator.html +373 -0
  247. data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +430 -0
  248. data/docs/Tasker/Generators/SubscriberGenerator.html +377 -0
  249. data/docs/Tasker/Generators/TaskHandlerGenerator.html +263 -0
  250. data/docs/Tasker/Generators.html +117 -0
  251. data/docs/Tasker/GraphQLTypes/AnnotationType.html +132 -0
  252. data/docs/Tasker/GraphQLTypes/BaseArgument.html +124 -0
  253. data/docs/Tasker/GraphQLTypes/BaseConnection.html +124 -0
  254. data/docs/Tasker/GraphQLTypes/BaseEdge.html +130 -0
  255. data/docs/Tasker/GraphQLTypes/BaseEnum.html +124 -0
  256. data/docs/Tasker/GraphQLTypes/BaseField.html +124 -0
  257. data/docs/Tasker/GraphQLTypes/BaseInputObject.html +124 -0
  258. data/docs/Tasker/GraphQLTypes/BaseInterface.html +116 -0
  259. data/docs/Tasker/GraphQLTypes/BaseObject.html +128 -0
  260. data/docs/Tasker/GraphQLTypes/BaseScalar.html +124 -0
  261. data/docs/Tasker/GraphQLTypes/BaseUnion.html +124 -0
  262. data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +132 -0
  263. data/docs/Tasker/GraphQLTypes/DependentSystemType.html +132 -0
  264. data/docs/Tasker/GraphQLTypes/MutationType.html +132 -0
  265. data/docs/Tasker/GraphQLTypes/NamedStepType.html +132 -0
  266. data/docs/Tasker/GraphQLTypes/NamedTaskType.html +132 -0
  267. data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +132 -0
  268. data/docs/Tasker/GraphQLTypes/NodeType.html +118 -0
  269. data/docs/Tasker/GraphQLTypes/QueryType.html +139 -0
  270. data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +132 -0
  271. data/docs/Tasker/GraphQLTypes/TaskInterface.html +111 -0
  272. data/docs/Tasker/GraphQLTypes/TaskType.html +201 -0
  273. data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +694 -0
  274. data/docs/Tasker/GraphQLTypes.html +130 -0
  275. data/docs/Tasker/GraphqlController.html +251 -0
  276. data/docs/Tasker/HandlerFactory.html +1518 -0
  277. data/docs/Tasker/HandlerSerializer.html +682 -0
  278. data/docs/Tasker/HandlersController.html +574 -0
  279. data/docs/Tasker/HashIdentityStrategy.html +278 -0
  280. data/docs/Tasker/Health/ReadinessChecker.html +712 -0
  281. data/docs/Tasker/Health/StatusChecker.html +653 -0
  282. data/docs/Tasker/Health.html +117 -0
  283. data/docs/Tasker/HealthController.html +523 -0
  284. data/docs/Tasker/IdentityStrategy.html +276 -0
  285. data/docs/Tasker/InvalidTaskHandlerConfig.html +135 -0
  286. data/docs/Tasker/LifecycleEvents/Events/Step.html +162 -0
  287. data/docs/Tasker/LifecycleEvents/Events/Task.html +162 -0
  288. data/docs/Tasker/LifecycleEvents/Events.html +204 -0
  289. data/docs/Tasker/LifecycleEvents/Publisher.html +132 -0
  290. data/docs/Tasker/LifecycleEvents.html +799 -0
  291. data/docs/Tasker/Logging/CorrelationIdGenerator.html +688 -0
  292. data/docs/Tasker/Logging.html +115 -0
  293. data/docs/Tasker/MetricsController.html +293 -0
  294. data/docs/Tasker/MetricsExportJob.html +414 -0
  295. data/docs/Tasker/Mutations/BaseMutation.html +128 -0
  296. data/docs/Tasker/Mutations/CancelStep.html +219 -0
  297. data/docs/Tasker/Mutations/CancelTask.html +221 -0
  298. data/docs/Tasker/Mutations/CreateTask.html +243 -0
  299. data/docs/Tasker/Mutations/UpdateStep.html +243 -0
  300. data/docs/Tasker/Mutations/UpdateTask.html +243 -0
  301. data/docs/Tasker/Mutations.html +117 -0
  302. data/docs/Tasker/NamedStep.html +216 -0
  303. data/docs/Tasker/NamedTask.html +910 -0
  304. data/docs/Tasker/NamedTasksNamedStep.html +435 -0
  305. data/docs/Tasker/Orchestration/BackoffCalculator.html +404 -0
  306. data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +258 -0
  307. data/docs/Tasker/Orchestration/ConnectionBuilder.html +435 -0
  308. data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +513 -0
  309. data/docs/Tasker/Orchestration/Coordinator.html +641 -0
  310. data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1045 -0
  311. data/docs/Tasker/Orchestration/Orchestrator.html +679 -0
  312. data/docs/Tasker/Orchestration/PluginIntegration.html +1127 -0
  313. data/docs/Tasker/Orchestration/ResponseProcessor.html +504 -0
  314. data/docs/Tasker/Orchestration/RetryHeaderParser.html +304 -0
  315. data/docs/Tasker/Orchestration/StepExecutor.html +995 -0
  316. data/docs/Tasker/Orchestration/StepSequenceFactory.html +644 -0
  317. data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +264 -0
  318. data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +254 -0
  319. data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +556 -0
  320. data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +348 -0
  321. data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +286 -0
  322. data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +432 -0
  323. data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +296 -0
  324. data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +314 -0
  325. data/docs/Tasker/Orchestration/TaskFinalizer.html +1212 -0
  326. data/docs/Tasker/Orchestration/TaskInitializer.html +766 -0
  327. data/docs/Tasker/Orchestration/TaskReenqueuer.html +506 -0
  328. data/docs/Tasker/Orchestration/ViableStepDiscovery.html +442 -0
  329. data/docs/Tasker/Orchestration/WorkflowCoordinator.html +510 -0
  330. data/docs/Tasker/Orchestration.html +130 -0
  331. data/docs/Tasker/PageSort/PageSortParamsBuilder.html +296 -0
  332. data/docs/Tasker/PageSort.html +247 -0
  333. data/docs/Tasker/PermanentError.html +518 -0
  334. data/docs/Tasker/ProceduralError.html +147 -0
  335. data/docs/Tasker/Queries/AllAnnotationTypes.html +217 -0
  336. data/docs/Tasker/Queries/AllTasks.html +221 -0
  337. data/docs/Tasker/Queries/BaseQuery.html +128 -0
  338. data/docs/Tasker/Queries/Helpers.html +187 -0
  339. data/docs/Tasker/Queries/OneStep.html +225 -0
  340. data/docs/Tasker/Queries/OneTask.html +217 -0
  341. data/docs/Tasker/Queries/TasksByAnnotation.html +231 -0
  342. data/docs/Tasker/Queries/TasksByStatus.html +233 -0
  343. data/docs/Tasker/Queries.html +119 -0
  344. data/docs/Tasker/Railtie.html +124 -0
  345. data/docs/Tasker/Registry/BaseRegistry.html +1690 -0
  346. data/docs/Tasker/Registry/EventPublisher.html +667 -0
  347. data/docs/Tasker/Registry/InterfaceValidator.html +569 -0
  348. data/docs/Tasker/Registry/RegistrationError.html +132 -0
  349. data/docs/Tasker/Registry/RegistryError.html +139 -0
  350. data/docs/Tasker/Registry/StatisticsCollector.html +841 -0
  351. data/docs/Tasker/Registry/SubscriberRegistry.html +1504 -0
  352. data/docs/Tasker/Registry/ValidationError.html +132 -0
  353. data/docs/Tasker/Registry.html +119 -0
  354. data/docs/Tasker/RetryableError.html +515 -0
  355. data/docs/Tasker/StateMachine/Compatibility.html +282 -0
  356. data/docs/Tasker/StateMachine/InvalidStateTransition.html +135 -0
  357. data/docs/Tasker/StateMachine/StepStateMachine/StandardizedPayloadBuilder.html +260 -0
  358. data/docs/Tasker/StateMachine/StepStateMachine.html +2215 -0
  359. data/docs/Tasker/StateMachine/TaskStateMachine.html +734 -0
  360. data/docs/Tasker/StateMachine.html +602 -0
  361. data/docs/Tasker/StepDagRelationship.html +657 -0
  362. data/docs/Tasker/StepHandler/Api/Config.html +1091 -0
  363. data/docs/Tasker/StepHandler/Api.html +884 -0
  364. data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +321 -0
  365. data/docs/Tasker/StepHandler/Base.html +970 -0
  366. data/docs/Tasker/StepHandler.html +119 -0
  367. data/docs/Tasker/StepReadinessStatus.html +836 -0
  368. data/docs/Tasker/Task.html +2575 -0
  369. data/docs/Tasker/TaskAnnotation.html +137 -0
  370. data/docs/Tasker/TaskAnnotationSerializer.html +124 -0
  371. data/docs/Tasker/TaskBuilder/StepNameValidator.html +264 -0
  372. data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +264 -0
  373. data/docs/Tasker/TaskBuilder.html +764 -0
  374. data/docs/Tasker/TaskDiagram/StepToStepEdgeBuilder.html +260 -0
  375. data/docs/Tasker/TaskDiagram/TaskToRootStepEdgeBuilder.html +290 -0
  376. data/docs/Tasker/TaskDiagram.html +548 -0
  377. data/docs/Tasker/TaskDiagramsController.html +240 -0
  378. data/docs/Tasker/TaskExecutionContext.html +469 -0
  379. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +238 -0
  380. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +254 -0
  381. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +988 -0
  382. data/docs/Tasker/TaskHandler/ClassMethods.html +357 -0
  383. data/docs/Tasker/TaskHandler/InstanceMethods.html +1396 -0
  384. data/docs/Tasker/TaskHandler/StepGroup.html +1748 -0
  385. data/docs/Tasker/TaskHandler.html +271 -0
  386. data/docs/Tasker/TaskNamespace.html +312 -0
  387. data/docs/Tasker/TaskRunnerJob.html +406 -0
  388. data/docs/Tasker/TaskSerializer.html +474 -0
  389. data/docs/Tasker/TaskTransition.html +1517 -0
  390. data/docs/Tasker/TaskWorkflowSummary.html +988 -0
  391. data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +132 -0
  392. data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +139 -0
  393. data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +132 -0
  394. data/docs/Tasker/TaskerRailsSchema.html +384 -0
  395. data/docs/Tasker/TasksController.html +595 -0
  396. data/docs/Tasker/Telemetry/EventMapping.html +1307 -0
  397. data/docs/Tasker/Telemetry/EventRouter.html +2178 -0
  398. data/docs/Tasker/Telemetry/Events/ExportEvents.html +246 -0
  399. data/docs/Tasker/Telemetry/Events.html +115 -0
  400. data/docs/Tasker/Telemetry/ExportCoordinator/DistributedLockTimeoutError.html +135 -0
  401. data/docs/Tasker/Telemetry/ExportCoordinator.html +2137 -0
  402. data/docs/Tasker/Telemetry/IntelligentCacheManager.html +1083 -0
  403. data/docs/Tasker/Telemetry/LogBackend.html +1088 -0
  404. data/docs/Tasker/Telemetry/MetricTypes/Counter.html +1054 -0
  405. data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +1270 -0
  406. data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +1492 -0
  407. data/docs/Tasker/Telemetry/MetricTypes.html +153 -0
  408. data/docs/Tasker/Telemetry/MetricsBackend.html +2510 -0
  409. data/docs/Tasker/Telemetry/MetricsExportService.html +578 -0
  410. data/docs/Tasker/Telemetry/PluginRegistry.html +1774 -0
  411. data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1835 -0
  412. data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +768 -0
  413. data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +747 -0
  414. data/docs/Tasker/Telemetry/Plugins.html +117 -0
  415. data/docs/Tasker/Telemetry/PrometheusExporter.html +481 -0
  416. data/docs/Tasker/Telemetry/TraceBackend.html +891 -0
  417. data/docs/Tasker/Telemetry.html +130 -0
  418. data/docs/Tasker/Types/AuthConfig.html +886 -0
  419. data/docs/Tasker/Types/BackoffConfig.html +1063 -0
  420. data/docs/Tasker/Types/BaseConfig.html +227 -0
  421. data/docs/Tasker/Types/CacheConfig.html +1731 -0
  422. data/docs/Tasker/Types/DatabaseConfig.html +388 -0
  423. data/docs/Tasker/Types/DependencyGraph.html +526 -0
  424. data/docs/Tasker/Types/DependencyGraphConfig.html +753 -0
  425. data/docs/Tasker/Types/EngineConfig.html +1181 -0
  426. data/docs/Tasker/Types/ExecutionConfig.html +1963 -0
  427. data/docs/Tasker/Types/GraphEdge.html +517 -0
  428. data/docs/Tasker/Types/GraphMetadata.html +781 -0
  429. data/docs/Tasker/Types/GraphNode.html +694 -0
  430. data/docs/Tasker/Types/HealthConfig.html +784 -0
  431. data/docs/Tasker/Types/StepSequence.html +353 -0
  432. data/docs/Tasker/Types/StepTemplate.html +1193 -0
  433. data/docs/Tasker/Types/TaskRequest.html +1179 -0
  434. data/docs/Tasker/Types/TelemetryConfig.html +2746 -0
  435. data/docs/Tasker/Types.html +154 -0
  436. data/docs/Tasker/WorkflowStep/StepFinder.html +282 -0
  437. data/docs/Tasker/WorkflowStep.html +2724 -0
  438. data/docs/Tasker/WorkflowStepEdge.html +304 -0
  439. data/docs/Tasker/WorkflowStepSerializer.html +305 -0
  440. data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +282 -0
  441. data/docs/Tasker/WorkflowStepTransition.html +2201 -0
  442. data/docs/Tasker/WorkflowStepsController.html +462 -0
  443. data/docs/Tasker.html +452 -0
  444. data/docs/VISION.md +584 -0
  445. data/docs/WHY.md +21 -0
  446. data/docs/_index.html +2375 -0
  447. data/docs/class_list.html +54 -0
  448. data/docs/css/common.css +1 -0
  449. data/docs/css/full_list.css +58 -0
  450. data/docs/css/style.css +503 -0
  451. data/docs/events/migration_plan_outcomes.md +80 -0
  452. data/docs/file.README.html +541 -0
  453. data/docs/file_list.html +59 -0
  454. data/docs/frames.html +22 -0
  455. data/docs/index.html +541 -0
  456. data/docs/js/app.js +344 -0
  457. data/docs/js/full_list.js +242 -0
  458. data/docs/js/jquery.js +4 -0
  459. data/docs/method_list.html +9182 -0
  460. data/docs/top-level-namespace.html +110 -0
  461. data/lib/generators/tasker/authenticator_generator.rb +301 -0
  462. data/lib/generators/tasker/authorization_coordinator_generator.rb +139 -0
  463. data/lib/generators/tasker/events_generator.rb +91 -0
  464. data/lib/generators/tasker/subscriber_generator.rb +107 -0
  465. data/lib/generators/tasker/task_handler_generator.rb +138 -0
  466. data/lib/generators/tasker/templates/api_token_authenticator.rb.erb +113 -0
  467. data/lib/generators/tasker/templates/api_token_authenticator_spec.rb.erb +144 -0
  468. data/lib/generators/tasker/templates/authorization_coordinator.rb.erb +95 -0
  469. data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +142 -0
  470. data/lib/generators/tasker/templates/custom_authenticator.rb.erb +108 -0
  471. data/lib/generators/tasker/templates/custom_authenticator_spec.rb.erb +162 -0
  472. data/lib/generators/tasker/templates/custom_events.yml.erb +62 -0
  473. data/lib/generators/tasker/templates/custom_subscriber.rb.erb +72 -0
  474. data/lib/generators/tasker/templates/devise_authenticator.rb.erb +101 -0
  475. data/lib/generators/tasker/templates/devise_authenticator_spec.rb.erb +126 -0
  476. data/lib/generators/tasker/templates/initialize.rb.erb +202 -0
  477. data/lib/generators/tasker/templates/jwt_authenticator.rb.erb +144 -0
  478. data/lib/generators/tasker/templates/jwt_authenticator_spec.rb.erb +298 -0
  479. data/lib/generators/tasker/templates/metrics_subscriber.rb.erb +258 -0
  480. data/lib/generators/tasker/templates/metrics_subscriber_spec.rb.erb +308 -0
  481. data/lib/generators/tasker/templates/omniauth_authenticator.rb.erb +135 -0
  482. data/lib/generators/tasker/templates/omniauth_authenticator_spec.rb.erb +196 -0
  483. data/lib/generators/tasker/templates/opentelemetry_initializer.rb +52 -0
  484. data/lib/generators/tasker/templates/subscriber.rb.erb +64 -0
  485. data/lib/generators/tasker/templates/subscriber_spec.rb.erb +80 -0
  486. data/lib/generators/tasker/templates/task_config.yaml.erb +117 -0
  487. data/lib/generators/tasker/templates/task_handler.rb.erb +59 -0
  488. data/lib/generators/tasker/templates/task_handler_spec.rb.erb +159 -0
  489. data/lib/tasker/analysis/runtime_graph_analyzer.rb +1168 -0
  490. data/lib/tasker/analysis/template_graph_analyzer.rb +328 -0
  491. data/lib/tasker/authentication/coordinator.rb +78 -0
  492. data/lib/tasker/authentication/errors.rb +9 -0
  493. data/lib/tasker/authentication/interface.rb +36 -0
  494. data/lib/tasker/authentication/none_authenticator.rb +26 -0
  495. data/lib/tasker/authorization/base_coordinator.rb +112 -0
  496. data/lib/tasker/authorization/errors.rb +26 -0
  497. data/lib/tasker/authorization/resource_constants.rb +74 -0
  498. data/lib/tasker/authorization/resource_registry.rb +143 -0
  499. data/lib/tasker/authorization.rb +75 -0
  500. data/lib/tasker/cache_capabilities.rb +131 -0
  501. data/lib/tasker/cache_strategy.rb +469 -0
  502. data/lib/tasker/concerns/authenticatable.rb +41 -0
  503. data/lib/tasker/concerns/authorizable.rb +204 -0
  504. data/lib/tasker/concerns/controller_authorizable.rb +124 -0
  505. data/lib/tasker/concerns/event_publisher.rb +716 -0
  506. data/lib/tasker/concerns/idempotent_state_transitions.rb +128 -0
  507. data/lib/tasker/concerns/state_machine_base.rb +218 -0
  508. data/lib/tasker/concerns/structured_logging.rb +387 -0
  509. data/lib/tasker/configuration.rb +325 -0
  510. data/lib/tasker/constants/event_definitions.rb +147 -0
  511. data/lib/tasker/constants/registry_events.rb +54 -0
  512. data/lib/tasker/constants.rb +417 -0
  513. data/lib/tasker/engine.rb +90 -0
  514. data/lib/tasker/errors.rb +90 -0
  515. data/lib/tasker/events/catalog.rb +432 -0
  516. data/lib/tasker/events/custom_registry.rb +175 -0
  517. data/lib/tasker/events/definition_loader.rb +199 -0
  518. data/lib/tasker/events/event_payload_builder.rb +461 -0
  519. data/lib/tasker/events/publisher.rb +149 -0
  520. data/lib/tasker/events/subscribers/base_subscriber.rb +601 -0
  521. data/lib/tasker/events/subscribers/metrics_subscriber.rb +120 -0
  522. data/lib/tasker/events/subscribers/telemetry_subscriber.rb +462 -0
  523. data/lib/tasker/events/subscription_loader.rb +161 -0
  524. data/lib/tasker/events.rb +37 -0
  525. data/lib/tasker/functions/function_based_analytics_metrics.rb +103 -0
  526. data/lib/tasker/functions/function_based_dependency_levels.rb +54 -0
  527. data/lib/tasker/functions/function_based_slowest_steps.rb +84 -0
  528. data/lib/tasker/functions/function_based_slowest_tasks.rb +84 -0
  529. data/lib/tasker/functions/function_based_step_readiness_status.rb +183 -0
  530. data/lib/tasker/functions/function_based_system_health_counts.rb +94 -0
  531. data/lib/tasker/functions/function_based_task_execution_context.rb +148 -0
  532. data/lib/tasker/functions/function_wrapper.rb +42 -0
  533. data/lib/tasker/functions.rb +12 -0
  534. data/lib/tasker/handler_factory.rb +322 -0
  535. data/lib/tasker/health/readiness_checker.rb +186 -0
  536. data/lib/tasker/health/status_checker.rb +203 -0
  537. data/lib/tasker/identity_strategy.rb +38 -0
  538. data/lib/tasker/logging/correlation_id_generator.rb +120 -0
  539. data/lib/tasker/orchestration/backoff_calculator.rb +184 -0
  540. data/lib/tasker/orchestration/connection_builder.rb +122 -0
  541. data/lib/tasker/orchestration/connection_pool_intelligence.rb +177 -0
  542. data/lib/tasker/orchestration/coordinator.rb +119 -0
  543. data/lib/tasker/orchestration/future_state_analyzer.rb +137 -0
  544. data/lib/tasker/orchestration/plugin_integration.rb +124 -0
  545. data/lib/tasker/orchestration/response_processor.rb +168 -0
  546. data/lib/tasker/orchestration/retry_header_parser.rb +78 -0
  547. data/lib/tasker/orchestration/step_executor.rb +941 -0
  548. data/lib/tasker/orchestration/step_sequence_factory.rb +67 -0
  549. data/lib/tasker/orchestration/task_finalizer.rb +564 -0
  550. data/lib/tasker/orchestration/task_initializer.rb +140 -0
  551. data/lib/tasker/orchestration/task_reenqueuer.rb +71 -0
  552. data/lib/tasker/orchestration/viable_step_discovery.rb +65 -0
  553. data/lib/tasker/orchestration/workflow_coordinator.rb +294 -0
  554. data/lib/tasker/orchestration.rb +45 -0
  555. data/lib/tasker/railtie.rb +9 -0
  556. data/lib/tasker/registry/base_registry.rb +177 -0
  557. data/lib/tasker/registry/event_publisher.rb +91 -0
  558. data/lib/tasker/registry/interface_validator.rb +140 -0
  559. data/lib/tasker/registry/statistics_collector.rb +381 -0
  560. data/lib/tasker/registry/subscriber_registry.rb +285 -0
  561. data/lib/tasker/registry.rb +22 -0
  562. data/lib/tasker/state_machine/step_state_machine.rb +508 -0
  563. data/lib/tasker/state_machine/task_state_machine.rb +192 -0
  564. data/lib/tasker/state_machine.rb +83 -0
  565. data/lib/tasker/step_handler/api.rb +410 -0
  566. data/lib/tasker/step_handler/base.rb +206 -0
  567. data/lib/tasker/task_builder.rb +432 -0
  568. data/lib/tasker/task_handler/class_methods.rb +324 -0
  569. data/lib/tasker/task_handler/instance_methods.rb +293 -0
  570. data/lib/tasker/task_handler/step_group.rb +182 -0
  571. data/lib/tasker/task_handler.rb +43 -0
  572. data/lib/tasker/telemetry/event_mapping.rb +126 -0
  573. data/lib/tasker/telemetry/event_router.rb +318 -0
  574. data/lib/tasker/telemetry/events/export_events.rb +38 -0
  575. data/lib/tasker/telemetry/export_coordinator.rb +497 -0
  576. data/lib/tasker/telemetry/intelligent_cache_manager.rb +508 -0
  577. data/lib/tasker/telemetry/log_backend.rb +224 -0
  578. data/lib/tasker/telemetry/metric_types.rb +368 -0
  579. data/lib/tasker/telemetry/metrics_backend.rb +1227 -0
  580. data/lib/tasker/telemetry/metrics_export_service.rb +392 -0
  581. data/lib/tasker/telemetry/plugin_registry.rb +333 -0
  582. data/lib/tasker/telemetry/plugins/base_exporter.rb +246 -0
  583. data/lib/tasker/telemetry/plugins/csv_exporter.rb +198 -0
  584. data/lib/tasker/telemetry/plugins/json_exporter.rb +141 -0
  585. data/lib/tasker/telemetry/prometheus_exporter.rb +249 -0
  586. data/lib/tasker/telemetry/trace_backend.rb +186 -0
  587. data/lib/tasker/telemetry.rb +59 -0
  588. data/lib/tasker/types/auth_config.rb +81 -0
  589. data/lib/tasker/types/backoff_config.rb +142 -0
  590. data/lib/tasker/types/cache_config.rb +257 -0
  591. data/lib/tasker/types/database_config.rb +39 -0
  592. data/lib/tasker/types/dependency_graph.rb +225 -0
  593. data/lib/tasker/types/dependency_graph_config.rb +149 -0
  594. data/lib/tasker/types/engine_config.rb +131 -0
  595. data/lib/tasker/types/execution_config.rb +289 -0
  596. data/lib/tasker/types/health_config.rb +84 -0
  597. data/lib/tasker/types/step_sequence.rb +24 -0
  598. data/lib/tasker/types/step_template.rb +63 -0
  599. data/lib/tasker/types/task_request.rb +60 -0
  600. data/lib/tasker/types/telemetry_config.rb +273 -0
  601. data/lib/tasker/types.rb +64 -0
  602. data/lib/tasker/version.rb +7 -0
  603. data/lib/tasker.rb +82 -0
  604. data/lib/tasks/tasker_tasks.rake +302 -0
  605. metadata +958 -0
@@ -0,0 +1,417 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ require_relative 'events/definition_loader'
5
+ require_relative 'constants/event_definitions'
6
+
7
+ module Tasker
8
+ # Constants used throughout the Tasker gem
9
+ #
10
+ # This module contains constants for workflow step and task statuses,
11
+ # validation states, and configuration schemas.
12
+ #
13
+ # Event constants are generated from YAML definitions in config/tasker/system_events.yml
14
+ # Run `rake tasker:generate_constants` to regenerate after YAML changes.
15
+ module Constants
16
+ # Status values for workflow steps
17
+ module WorkflowStepStatuses
18
+ # Step is waiting to be processed
19
+ PENDING = 'pending'
20
+ # Step is currently being processed
21
+ IN_PROGRESS = 'in_progress'
22
+ # Step encountered an error during processing
23
+ ERROR = 'error'
24
+ # Step completed successfully
25
+ COMPLETE = 'complete'
26
+ # Step was manually marked as resolved
27
+ RESOLVED_MANUALLY = 'resolved_manually'
28
+ # Step was cancelled
29
+ CANCELLED = 'cancelled'
30
+ end
31
+
32
+ # Status values for tasks
33
+ module TaskStatuses
34
+ # Task is waiting to be processed
35
+ PENDING = 'pending'
36
+ # Task is currently being processed
37
+ IN_PROGRESS = 'in_progress'
38
+ # Task encountered an error during processing
39
+ ERROR = 'error'
40
+ # Task completed successfully
41
+ COMPLETE = 'complete'
42
+ # Task was manually marked as resolved
43
+ RESOLVED_MANUALLY = 'resolved_manually'
44
+ # Task was cancelled
45
+ CANCELLED = 'cancelled'
46
+ end
47
+
48
+ # Task execution context status values from TaskExecutionContext view
49
+ module TaskExecution
50
+ # Execution status values - indicate current workflow execution state
51
+ module ExecutionStatus
52
+ # Task has steps ready for immediate execution
53
+ HAS_READY_STEPS = 'has_ready_steps'
54
+ # Task has steps currently being processed
55
+ PROCESSING = 'processing'
56
+ # Task is blocked by failed steps with no ready steps
57
+ BLOCKED_BY_FAILURES = 'blocked_by_failures'
58
+ # All task steps have completed successfully
59
+ ALL_COMPLETE = 'all_complete'
60
+ # Task is waiting for step dependencies to be satisfied
61
+ WAITING_FOR_DEPENDENCIES = 'waiting_for_dependencies'
62
+ end
63
+
64
+ # Recommended action values - indicate what should happen next
65
+ module RecommendedAction
66
+ # Execute the steps that are ready for processing
67
+ EXECUTE_READY_STEPS = 'execute_ready_steps'
68
+ # Wait for currently processing steps to complete
69
+ WAIT_FOR_COMPLETION = 'wait_for_completion'
70
+ # Handle failed steps that are blocking progress
71
+ HANDLE_FAILURES = 'handle_failures'
72
+ # Finalize the task as all steps are complete
73
+ FINALIZE_TASK = 'finalize_task'
74
+ # Wait for dependencies to be satisfied
75
+ WAIT_FOR_DEPENDENCIES = 'wait_for_dependencies'
76
+ end
77
+
78
+ # Health status values - indicate overall workflow health
79
+ module HealthStatus
80
+ # No failed steps, workflow is healthy
81
+ HEALTHY = 'healthy'
82
+ # Has failed steps but also has ready steps (can make progress)
83
+ RECOVERING = 'recovering'
84
+ # Has failed steps and no ready steps (intervention needed)
85
+ BLOCKED = 'blocked'
86
+ # Health status cannot be determined
87
+ UNKNOWN = 'unknown'
88
+ end
89
+ end
90
+
91
+ # All valid status values for workflow steps
92
+ VALID_WORKFLOW_STEP_STATUSES = [
93
+ WorkflowStepStatuses::PENDING,
94
+ WorkflowStepStatuses::IN_PROGRESS,
95
+ WorkflowStepStatuses::ERROR,
96
+ WorkflowStepStatuses::COMPLETE,
97
+ WorkflowStepStatuses::CANCELLED,
98
+ WorkflowStepStatuses::RESOLVED_MANUALLY
99
+ ].freeze
100
+
101
+ # Status values for steps that are not ready to be processed
102
+ UNREADY_WORKFLOW_STEP_STATUSES = [
103
+ WorkflowStepStatuses::IN_PROGRESS,
104
+ WorkflowStepStatuses::COMPLETE,
105
+ WorkflowStepStatuses::CANCELLED,
106
+ WorkflowStepStatuses::RESOLVED_MANUALLY
107
+ ].freeze
108
+
109
+ # All valid status values for tasks
110
+ VALID_TASK_STATUSES = [
111
+ TaskStatuses::PENDING,
112
+ TaskStatuses::IN_PROGRESS,
113
+ TaskStatuses::ERROR,
114
+ TaskStatuses::COMPLETE,
115
+ TaskStatuses::CANCELLED,
116
+ TaskStatuses::RESOLVED_MANUALLY
117
+ ].freeze
118
+
119
+ # Step status values that indicate completion (success or otherwise)
120
+ VALID_STEP_COMPLETION_STATES = [
121
+ WorkflowStepStatuses::COMPLETE,
122
+ WorkflowStepStatuses::RESOLVED_MANUALLY,
123
+ WorkflowStepStatuses::CANCELLED
124
+ ].freeze
125
+
126
+ # Step status values that indicate the step is still in a working state
127
+ VALID_STEP_STILL_WORKING_STATES = [WorkflowStepStatuses::PENDING, WorkflowStepStatuses::IN_PROGRESS].freeze
128
+
129
+ # All valid execution status values from TaskExecutionContext view
130
+ VALID_TASK_EXECUTION_STATUSES = [
131
+ TaskExecution::ExecutionStatus::HAS_READY_STEPS,
132
+ TaskExecution::ExecutionStatus::PROCESSING,
133
+ TaskExecution::ExecutionStatus::BLOCKED_BY_FAILURES,
134
+ TaskExecution::ExecutionStatus::ALL_COMPLETE,
135
+ TaskExecution::ExecutionStatus::WAITING_FOR_DEPENDENCIES
136
+ ].freeze
137
+
138
+ # All valid recommended action values from TaskExecutionContext view
139
+ VALID_TASK_RECOMMENDED_ACTIONS = [
140
+ TaskExecution::RecommendedAction::EXECUTE_READY_STEPS,
141
+ TaskExecution::RecommendedAction::WAIT_FOR_COMPLETION,
142
+ TaskExecution::RecommendedAction::HANDLE_FAILURES,
143
+ TaskExecution::RecommendedAction::FINALIZE_TASK,
144
+ TaskExecution::RecommendedAction::WAIT_FOR_DEPENDENCIES
145
+ ].freeze
146
+
147
+ # All valid health status values from TaskExecutionContext view
148
+ VALID_TASK_HEALTH_STATUSES = [
149
+ TaskExecution::HealthStatus::HEALTHY,
150
+ TaskExecution::HealthStatus::RECOVERING,
151
+ TaskExecution::HealthStatus::BLOCKED,
152
+ TaskExecution::HealthStatus::UNKNOWN
153
+ ].freeze
154
+
155
+ # Execution statuses that indicate the task can make immediate progress
156
+ ACTIONABLE_TASK_EXECUTION_STATUSES = [
157
+ TaskExecution::ExecutionStatus::HAS_READY_STEPS
158
+ ].freeze
159
+
160
+ # Execution statuses that indicate the task should be re-enqueued for later
161
+ REENQUEUE_TASK_EXECUTION_STATUSES = [
162
+ TaskExecution::ExecutionStatus::PROCESSING,
163
+ TaskExecution::ExecutionStatus::WAITING_FOR_DEPENDENCIES
164
+ ].freeze
165
+
166
+ # Execution statuses that indicate the task needs intervention
167
+ INTERVENTION_TASK_EXECUTION_STATUSES = [
168
+ TaskExecution::ExecutionStatus::BLOCKED_BY_FAILURES
169
+ ].freeze
170
+
171
+ # Default value for unknown identifiers
172
+ UNKNOWN = 'unknown'
173
+
174
+ # JSON schema for validating task handler YAML configurations
175
+ YAML_SCHEMA = {
176
+ type: 'object',
177
+ required: %w[name task_handler_class step_templates],
178
+ properties: {
179
+ name: { type: 'string' },
180
+ module_namespace: { type: 'string', default: nil },
181
+ task_handler_class: { type: 'string' },
182
+ concurrent: { type: 'boolean', default: true },
183
+ default_dependent_system: { type: 'string' },
184
+ named_steps: {
185
+ type: 'array',
186
+ items: { type: 'string' }
187
+ },
188
+ schema: { type: 'object' },
189
+ step_templates: {
190
+ type: 'array',
191
+ items: {
192
+ type: 'object',
193
+ required: %w[name handler_class],
194
+ properties: {
195
+ dependent_system: { type: 'string' },
196
+ name: { type: 'string' },
197
+ description: { type: 'string' },
198
+ default_retryable: { type: 'boolean' },
199
+ default_retry_limit: { type: 'integer' },
200
+ skippable: { type: 'boolean' },
201
+ handler_class: { type: 'string' },
202
+ depends_on_step: { type: 'string' },
203
+ depends_on_steps: {
204
+ type: 'array',
205
+ items: { type: 'string' }
206
+ },
207
+ handler_config: { type: 'object' },
208
+ custom_events: {
209
+ type: 'array',
210
+ items: {
211
+ type: 'object',
212
+ required: %w[name],
213
+ properties: {
214
+ name: { type: 'string' },
215
+ description: { type: 'string' }
216
+ }
217
+ }
218
+ }
219
+ }
220
+ }
221
+ },
222
+ environments: {
223
+ type: 'object',
224
+ additionalProperties: {
225
+ type: 'object',
226
+ properties: {
227
+ step_templates: {
228
+ type: 'array',
229
+ items: {
230
+ type: 'object',
231
+ required: %w[name],
232
+ properties: {
233
+ name: { type: 'string' },
234
+ handler_config: { type: 'object' }
235
+ }
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
241
+ }
242
+ }.freeze
243
+
244
+ # Task lifecycle event constants
245
+ module TaskEvents
246
+ INITIALIZE_REQUESTED = 'task.initialize_requested'
247
+ START_REQUESTED = 'task.start_requested'
248
+ COMPLETED = 'task.completed'
249
+ FAILED = 'task.failed'
250
+ RETRY_REQUESTED = 'task.retry_requested'
251
+ CANCELLED = 'task.cancelled'
252
+ RESOLVED_MANUALLY = 'task.resolved_manually'
253
+ BEFORE_TRANSITION = 'task.before_transition'
254
+ end
255
+
256
+ # Step lifecycle event constants
257
+ module StepEvents
258
+ INITIALIZE_REQUESTED = 'step.initialize_requested'
259
+ EXECUTION_REQUESTED = 'step.execution_requested'
260
+ BEFORE_HANDLE = 'step.before_handle'
261
+ HANDLE = 'step.handle'
262
+ COMPLETED = 'step.completed'
263
+ FAILED = 'step.failed'
264
+ RETRY_REQUESTED = 'step.retry_requested'
265
+ CANCELLED = 'step.cancelled'
266
+ RESOLVED_MANUALLY = 'step.resolved_manually'
267
+ BEFORE_TRANSITION = 'step.before_transition'
268
+ end
269
+
270
+ # Workflow orchestration event constants
271
+ module WorkflowEvents
272
+ TASK_STARTED = 'workflow.task_started'
273
+ TASK_COMPLETED = 'workflow.task_completed'
274
+ TASK_FAILED = 'workflow.task_failed'
275
+ STEP_COMPLETED = 'workflow.step_completed'
276
+ STEP_FAILED = 'workflow.step_failed'
277
+ VIABLE_STEPS_DISCOVERED = 'workflow.viable_steps_discovered'
278
+ NO_VIABLE_STEPS = 'workflow.no_viable_steps'
279
+ ORCHESTRATION_REQUESTED = 'workflow.orchestration_requested'
280
+ TASK_FINALIZATION_STARTED = 'workflow.task_finalization_started'
281
+ TASK_FINALIZATION_COMPLETED = 'workflow.task_finalization_completed'
282
+ TASK_REENQUEUE_STARTED = 'workflow.task_reenqueue_started'
283
+ TASK_REENQUEUE_REQUESTED = 'workflow.task_reenqueue_requested'
284
+ TASK_REENQUEUE_FAILED = 'workflow.task_reenqueue_failed'
285
+ TASK_REENQUEUE_DELAYED = 'workflow.task_reenqueue_delayed'
286
+ TASK_STATE_UNCLEAR = 'workflow.task_state_unclear'
287
+ STEP_EXECUTION_FAILED = 'workflow.step_execution_failed'
288
+ VIABLE_STEPS_BATCH_READY = 'workflow.viable_steps_batch_ready'
289
+ STEPS_EXECUTION_STARTED = 'workflow.steps_execution_started'
290
+ STEPS_EXECUTION_COMPLETED = 'workflow.steps_execution_completed'
291
+ end
292
+
293
+ # Observability and telemetry event constants
294
+ module ObservabilityEvents
295
+ # Task-level observability events
296
+ module Task
297
+ HANDLE = 'observability.task.handle'
298
+ ENQUEUE = 'observability.task.enqueue'
299
+ FINALIZE = 'observability.task.finalize'
300
+ end
301
+
302
+ # Step-level observability events
303
+ module Step
304
+ HANDLE = 'observability.step.handle'
305
+ FIND_VIABLE = 'observability.step.find_viable'
306
+ BACKOFF = 'observability.step.backoff'
307
+ SKIP = 'observability.step.skip'
308
+ MAX_RETRIES_REACHED = 'observability.step.max_retries_reached'
309
+ end
310
+ end
311
+
312
+ # Test event constants
313
+ module TestEvents
314
+ BASIC_EVENT = 'test.event'
315
+ SLOW_EVENT = 'slow.event'
316
+ TEST_EVENT = 'test.event'
317
+ CUSTOM_EVENT = 'custom.event'
318
+ # Alternative casing event for testing
319
+ TEST_DOT_EVENT = 'Test.Event'
320
+ end
321
+
322
+ # Task finalization reason constants
323
+ module TaskFinalization
324
+ # Error messages for task failure scenarios
325
+ module ErrorMessages
326
+ STEPS_IN_ERROR_STATE = 'steps_in_error_state'
327
+ end
328
+
329
+ # Reasons for re-enqueueing tasks (asynchronous processing)
330
+ module ReenqueueReasons
331
+ # Unable to determine context
332
+ CONTEXT_UNAVAILABLE = 'context_unavailable'
333
+ # Steps are currently in progress
334
+ STEPS_IN_PROGRESS = 'steps_in_progress'
335
+ # Waiting for dependency completion
336
+ AWAITING_DEPENDENCIES = 'awaiting_dependencies'
337
+ # Ready steps are available for processing
338
+ READY_STEPS_AVAILABLE = 'ready_steps_available'
339
+ # General workflow continuation
340
+ CONTINUING_WORKFLOW = 'continuing_workflow'
341
+ # Default reason for pending steps (from TaskReenqueuer)
342
+ PENDING_STEPS_REMAINING = 'pending_steps_remaining'
343
+ # Default reason for retry backoff (from TaskReenqueuer)
344
+ RETRY_BACKOFF = 'retry_backoff'
345
+ end
346
+
347
+ # Reasons for setting tasks to pending (synchronous processing)
348
+ module PendingReasons
349
+ # Unable to determine context
350
+ CONTEXT_UNAVAILABLE = 'context_unavailable'
351
+ # Waiting for current steps to complete
352
+ WAITING_FOR_STEP_COMPLETION = 'waiting_for_step_completion'
353
+ # Waiting for dependencies to be satisfied
354
+ WAITING_FOR_DEPENDENCIES = 'waiting_for_dependencies'
355
+ # Ready for immediate processing
356
+ READY_FOR_PROCESSING = 'ready_for_processing'
357
+ # Workflow temporarily paused
358
+ WORKFLOW_PAUSED = 'workflow_paused'
359
+ end
360
+ end
361
+
362
+ # All valid re-enqueue reason values for task finalization
363
+ VALID_TASK_REENQUEUE_REASONS = [
364
+ TaskFinalization::ReenqueueReasons::CONTEXT_UNAVAILABLE,
365
+ TaskFinalization::ReenqueueReasons::STEPS_IN_PROGRESS,
366
+ TaskFinalization::ReenqueueReasons::AWAITING_DEPENDENCIES,
367
+ TaskFinalization::ReenqueueReasons::READY_STEPS_AVAILABLE,
368
+ TaskFinalization::ReenqueueReasons::CONTINUING_WORKFLOW,
369
+ TaskFinalization::ReenqueueReasons::PENDING_STEPS_REMAINING,
370
+ TaskFinalization::ReenqueueReasons::RETRY_BACKOFF
371
+ ].freeze
372
+
373
+ # All valid pending reason values for task finalization
374
+ VALID_TASK_PENDING_REASONS = [
375
+ TaskFinalization::PendingReasons::CONTEXT_UNAVAILABLE,
376
+ TaskFinalization::PendingReasons::WAITING_FOR_STEP_COMPLETION,
377
+ TaskFinalization::PendingReasons::WAITING_FOR_DEPENDENCIES,
378
+ TaskFinalization::PendingReasons::READY_FOR_PROCESSING,
379
+ TaskFinalization::PendingReasons::WORKFLOW_PAUSED
380
+ ].freeze
381
+
382
+ # Task Transition Event Map
383
+ TASK_TRANSITION_EVENT_MAP = {
384
+ # Initial state transitions (from nil/initial)
385
+ [nil, TaskStatuses::PENDING] => TaskEvents::INITIALIZE_REQUESTED,
386
+ [nil, TaskStatuses::IN_PROGRESS] => TaskEvents::START_REQUESTED,
387
+ [nil, TaskStatuses::COMPLETE] => TaskEvents::COMPLETED,
388
+ [nil, TaskStatuses::ERROR] => TaskEvents::FAILED,
389
+ [nil, TaskStatuses::CANCELLED] => TaskEvents::CANCELLED,
390
+ [nil, TaskStatuses::RESOLVED_MANUALLY] => TaskEvents::RESOLVED_MANUALLY,
391
+
392
+ # Normal state transitions
393
+ [TaskStatuses::PENDING,
394
+ TaskStatuses::IN_PROGRESS] => TaskEvents::START_REQUESTED,
395
+ [TaskStatuses::PENDING, TaskStatuses::CANCELLED] => TaskEvents::CANCELLED,
396
+ [TaskStatuses::PENDING, TaskStatuses::ERROR] => TaskEvents::FAILED,
397
+
398
+ [TaskStatuses::IN_PROGRESS,
399
+ TaskStatuses::PENDING] => TaskEvents::INITIALIZE_REQUESTED,
400
+ [TaskStatuses::IN_PROGRESS,
401
+ TaskStatuses::COMPLETE] => TaskEvents::COMPLETED,
402
+ [TaskStatuses::IN_PROGRESS, TaskStatuses::ERROR] => TaskEvents::FAILED,
403
+ [TaskStatuses::IN_PROGRESS,
404
+ TaskStatuses::CANCELLED] => TaskEvents::CANCELLED,
405
+
406
+ [TaskStatuses::ERROR,
407
+ TaskStatuses::PENDING] => TaskEvents::RETRY_REQUESTED,
408
+ [TaskStatuses::ERROR,
409
+ TaskStatuses::RESOLVED_MANUALLY] => TaskEvents::RESOLVED_MANUALLY,
410
+
411
+ # New transitions for admin override scenarios
412
+ [TaskStatuses::COMPLETE, TaskStatuses::CANCELLED] => TaskEvents::CANCELLED,
413
+ [TaskStatuses::RESOLVED_MANUALLY,
414
+ TaskStatuses::CANCELLED] => TaskEvents::CANCELLED
415
+ }.freeze
416
+ end
417
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Rails engine for Tasker gem
4
+ #
5
+ # This engine handles Rails-specific setup, autoloading configuration,
6
+ # and loading of production runtime components. Development/test-only
7
+ # dependencies are handled by the Gemfile and should not be loaded here.
8
+
9
+ # Required Rails framework
10
+ require 'rails'
11
+
12
+ # Runtime dependencies from gemspec that need explicit loading
13
+ require 'active_model_serializers'
14
+ require 'graphql'
15
+ require 'json-schema'
16
+ require 'pg'
17
+ require 'faraday'
18
+ require 'scenic'
19
+
20
+ module Tasker
21
+ class Engine < ::Rails::Engine
22
+ isolate_namespace Tasker
23
+
24
+ # Configure paths before initialization to let Zeitwerk handle autoloading
25
+ config.before_configuration do |app|
26
+ app.config.autoload_paths << root.join('lib')
27
+ app.config.eager_load_paths << root.join('lib')
28
+ end
29
+
30
+ # Validate required configuration files
31
+ initializer 'tasker.validate_configuration', before: :load_config_initializers do |_app|
32
+ # Check for required system configuration files
33
+ system_events_yaml = root.join('config', 'tasker', 'system_events.yml')
34
+
35
+ unless File.exist?(system_events_yaml)
36
+ raise Tasker::ConfigurationError,
37
+ "Required configuration file missing: #{system_events_yaml}. " \
38
+ 'This file contains essential state machine mappings for Tasker. ' \
39
+ 'Please ensure it exists or reinstall the gem.'
40
+ end
41
+ end
42
+
43
+ # Initialize essential components before app initialization
44
+ initializer 'tasker.setup', before: :load_config_initializers do |_app|
45
+ # Load core components that need explicit initialization
46
+ require 'tasker/constants'
47
+ require 'tasker/configuration'
48
+ require 'tasker/types'
49
+ require 'tasker/handler_factory'
50
+ require 'tasker/identity_strategy'
51
+ require 'tasker/task_handler'
52
+ require 'tasker/task_builder'
53
+ require 'tasker/state_machine'
54
+ require 'tasker/orchestration'
55
+ require 'tasker/events'
56
+ require 'tasker/events/publisher'
57
+ require 'tasker/events/catalog'
58
+ require 'tasker/events/subscribers/base_subscriber'
59
+ require 'tasker/events/subscribers/telemetry_subscriber'
60
+ require 'tasker/functions'
61
+
62
+ # Configure Statesman for state machine support
63
+ Tasker::StateMachine.configure_statesman
64
+
65
+ # Configure generators for Rails integration
66
+ config.generators.api_only = true
67
+ config.generators.test_framework = :rspec
68
+ config.application_controller = 'ActionController::API'
69
+ end
70
+
71
+ # Initialize orchestration system after Rails is fully loaded
72
+ initializer 'tasker.orchestration', after: :load_config_initializers do |_app|
73
+ # Initialize the orchestration system in all environments
74
+ # This ensures consistent behavior between test, development, and production
75
+ Tasker::Orchestration::Coordinator.initialize!
76
+ end
77
+
78
+ config.generators do |g|
79
+ g.test_framework :rspec
80
+ g.fixture_replacement :factory_bot
81
+ g.factory_bot dir: 'spec/factories'
82
+ end
83
+
84
+ class << self
85
+ def configure(&)
86
+ yield(Engine.config)
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tasker
4
+ # Base error class for all Tasker-related errors
5
+ class Error < StandardError; end
6
+
7
+ # Raised when there are configuration-related issues in Tasker
8
+ class ConfigurationError < Error; end
9
+
10
+ # Base class for all Tasker-specific errors that occur during workflow execution
11
+ class ProceduralError < Error; end
12
+
13
+ # Error indicating a step failed but should be retried with backoff
14
+ #
15
+ # Use this error when an operation fails due to temporary conditions like:
16
+ # - Network timeouts
17
+ # - Rate limiting (429 status)
18
+ # - Server errors (5xx status)
19
+ # - Temporary service unavailability
20
+ #
21
+ # @example Basic retryable error
22
+ # raise Tasker::RetryableError, "Payment service timeout"
23
+ #
24
+ # @example With retry delay
25
+ # raise Tasker::RetryableError.new("Rate limited", retry_after: 60)
26
+ #
27
+ # @example With context for monitoring
28
+ # raise Tasker::RetryableError.new(
29
+ # "External API unavailable",
30
+ # retry_after: 30,
31
+ # context: { service: 'billing_api', error_code: 503 }
32
+ # )
33
+ class RetryableError < ProceduralError
34
+ # @return [Integer, nil] Suggested retry delay in seconds
35
+ attr_reader :retry_after
36
+
37
+ # @return [Hash] Additional context for error monitoring and debugging
38
+ attr_reader :context
39
+
40
+ # @param message [String] Error message
41
+ # @param retry_after [Integer, nil] Suggested retry delay in seconds
42
+ # @param context [Hash] Additional context for monitoring
43
+ def initialize(message, retry_after: nil, context: {})
44
+ super(message)
45
+ @retry_after = retry_after
46
+ @context = context
47
+ end
48
+ end
49
+
50
+ # Error indicating a step failed permanently and should not be retried
51
+ #
52
+ # Use this error when an operation fails due to permanent conditions like:
53
+ # - Invalid request data (400 status)
54
+ # - Authentication/authorization failures (401/403 status)
55
+ # - Validation errors (422 status)
56
+ # - Resource not found when it should exist (404 status in some contexts)
57
+ # - Business logic violations
58
+ #
59
+ # @example Basic permanent error
60
+ # raise Tasker::PermanentError, "Invalid user ID format"
61
+ #
62
+ # @example With error code for categorization
63
+ # raise Tasker::PermanentError.new(
64
+ # "Insufficient funds for transaction",
65
+ # error_code: 'INSUFFICIENT_FUNDS'
66
+ # )
67
+ #
68
+ # @example With context for monitoring
69
+ # raise Tasker::PermanentError.new(
70
+ # "User not authorized for this operation",
71
+ # error_code: 'AUTHORIZATION_FAILED',
72
+ # context: { user_id: 123, operation: 'admin_access' }
73
+ # )
74
+ class PermanentError < ProceduralError
75
+ # @return [String, nil] Machine-readable error code for categorization
76
+ attr_reader :error_code
77
+
78
+ # @return [Hash] Additional context for error monitoring and debugging
79
+ attr_reader :context
80
+
81
+ # @param message [String] Error message
82
+ # @param error_code [String, nil] Machine-readable error code
83
+ # @param context [Hash] Additional context for monitoring
84
+ def initialize(message, error_code: nil, context: {})
85
+ super(message)
86
+ @error_code = error_code
87
+ @context = context
88
+ end
89
+ end
90
+ end