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,541 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.9.37
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "README";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="file_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+ <span class="title">File: README</span>
41
+
42
+ </div>
43
+
44
+ <div id="search">
45
+
46
+ <a class="full_list_link" id="class_list_link"
47
+ href="class_list.html">
48
+
49
+ <svg width="24" height="24">
50
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
51
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
52
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
53
+ </svg>
54
+ </a>
55
+
56
+ </div>
57
+ <div class="clear"></div>
58
+ </div>
59
+
60
+ <div id="content"><div id='filecontents'>
61
+ <p><a href="https://github.com/tasker-systems/tasker/actions/workflows/main.yml"><img src="https://github.com/tasker-systems/tasker/actions/workflows/main.yml/badge.svg" alt="CI"></a> <img src="https://img.shields.io/github/license/tasker-systems/tasker" alt="GitHub"> <img src="https://img.shields.io/github/v/release/tasker-systems/tasker?color=blue&amp;sort=semver" alt="GitHub"> release (latest SemVer) <a href="https://www.gitbook.com/preview?utm_source=gitbook_readme_badge&amp;utm_medium=organic&amp;utm_campaign=preview_documentation&amp;utm_content=link"><img src="https://img.shields.io/static/v1?message=Documented%20on%20GitBook&amp;logo=gitbook&amp;logoColor=ffffff&amp;label=%20&amp;labelColor=5c5c5c&amp;color=3F89A1" alt="GitBook"></a></p>
62
+
63
+ <h1 id="label-Tasker-3A+Making+Complex+Workflows+Easy-ish">Tasker: Making Complex Workflows Easy-ish</h1>
64
+
65
+ <h2 id="label-What+is+Tasker-3F">What is Tasker?</h2>
66
+
67
+ <p>Tasker is a <strong>production-ready Rails engine</strong> that transforms complex, multi-step processes into reliable, observable workflows. It handles the orchestration complexity so you can focus on your business logic.</p>
68
+
69
+ <h3 id="label-F0-9F-9A-80+Key+Capabilities">๐Ÿš€ Key Capabilities</h3>
70
+ <ul><li>
71
+ <p><strong>Complex Workflow Patterns</strong>: Linear, diamond, tree, and parallel merge workflows</p>
72
+ </li><li>
73
+ <p><strong>Intelligent Retry Logic</strong>: Exponential backoff with configurable retry limits</p>
74
+ </li><li>
75
+ <p><strong>Production Resilience</strong>: Automatic failure recovery and retry orchestration</p>
76
+ </li><li>
77
+ <p><strong>Complete Observability</strong>: Event-driven architecture with comprehensive telemetry</p>
78
+ </li><li>
79
+ <p><strong>Enterprise Security</strong>: Authentication &amp; authorization with GraphQL operation-level permissions</p>
80
+ </li><li>
81
+ <p><strong>High Performance</strong>: SQL-function based orchestration with 4x performance gains</p>
82
+ </li><li>
83
+ <p><strong>Thread-Safe Registry Systems</strong>: Enterprise-grade registry architecture with structured logging</p>
84
+ </li><li>
85
+ <p><strong>Advanced Plugin Architecture</strong>: Extensible plugin system with format-based discovery</p>
86
+ </li></ul>
87
+
88
+ <p>Perfect for processes that involve multiple interdependent steps, require automatic retries, need visibility into progress and errors, and must handle transient failures gracefully.</p>
89
+
90
+ <h2 id="label-Quick+Installation">Quick Installation</h2>
91
+
92
+ <h3 id="label-Option+1-3A+Add+to+Existing+Rails+App">Option 1: Add to Existing Rails App</h3>
93
+
94
+ <p>Add Tasker to your Rails appโ€™s <code>Gemfile</code>:</p>
95
+
96
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_source'>source</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>https://rubygems.pkg.github.com/tasker-systems</span><span class='tstring_end'>&#39;</span></span> <span class='kw'>do</span>
97
+ <span class='id identifier rubyid_gem'>gem</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>tasker-engine</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>~&gt; 1.0.0</span><span class='tstring_end'>&#39;</span></span>
98
+ <span class='kw'>end</span>
99
+ </code></pre>
100
+
101
+ <p>Install and run the migrations:</p>
102
+
103
+ <pre class="code ruby"><code class="ruby">bundle exec rails tasker:install:migrations
104
+ bundle exec rails tasker:install:database_objects
105
+ bundle exec rails db:migrate
106
+ </code></pre>
107
+
108
+ <p>Mount the engine and set up configuration:</p>
109
+
110
+ <pre class="code ruby"><code class="ruby"><span class='comment'># config/routes.rb
111
+ </span><span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_application'>application</span><span class='period'>.</span><span class='id identifier rubyid_routes'>routes</span><span class='period'>.</span><span class='id identifier rubyid_draw'>draw</span> <span class='kw'>do</span>
112
+ <span class='id identifier rubyid_mount'>mount</span> <span class='const'><span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/Engine.html" title="Tasker::Engine (class)">Engine</a></span></span><span class='comma'>,</span> <span class='label'>at:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>/tasker</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>as:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>tasker</span><span class='tstring_end'>&#39;</span></span>
113
+ <span class='kw'>end</span>
114
+ </code></pre>
115
+
116
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_bundle'>bundle</span> <span class='id identifier rubyid_exec'>exec</span> <span class='id identifier rubyid_rails'>rails</span> <span class='label'>tasker:</span><span class='id identifier rubyid_setup'>setup</span>
117
+ </code></pre>
118
+
119
+ <h3 id="label-Option+2-3A+Generate+Complete+Application+-28v2.6.1-29">Option 2: Generate Complete Application (v2.6.1)</h3>
120
+
121
+ <p>Create a production-ready Rails application with Tasker integration in one command:</p>
122
+
123
+ <pre class="code ruby"><code class="ruby"># Traditional setup
124
+ curl -fsSL https://raw.githubusercontent.com/tasker-systems/tasker/main/scripts/install-tasker-app.sh | bash
125
+
126
+ # Docker-based development environment
127
+ curl -fsSL https://raw.githubusercontent.com/tasker-systems/tasker/main/scripts/install-tasker-app.sh | bash -s -- \
128
+ --app-name my-tasker-app \
129
+ --docker \
130
+ --with-observability
131
+ </code></pre>
132
+
133
+ <p>Includes complete application templates for e-commerce, inventory management, and customer onboarding workflows. See <a href="docs/APPLICATION_GENERATOR_md.html">Application Generator Guide</a> for details.</p>
134
+
135
+ <h2 id="label-Core+Concepts">Core Concepts</h2>
136
+
137
+ <p>Tasker organizes workflows around these key concepts:</p>
138
+ <ul><li>
139
+ <p><strong>Tasks</strong>: The overall process to be executed</p>
140
+ </li><li>
141
+ <p><strong>TaskNamespaces</strong>: Organizational hierarchy for grouping related task types</p>
142
+ </li><li>
143
+ <p><strong>TaskHandlers</strong>: Classes that define and coordinate workflow steps</p>
144
+ </li><li>
145
+ <p><strong>Steps</strong>: Individual units of work within a task</p>
146
+ </li><li>
147
+ <p><strong>StepHandlers</strong>: Classes that implement the logic for each step</p>
148
+ </li><li>
149
+ <p><strong>Dependencies</strong>: Relationships between steps that determine execution order</p>
150
+ </li><li>
151
+ <p><strong>Versioning</strong>: Semantic versioning support for task handlers with coexistence</p>
152
+ </li></ul>
153
+
154
+ <h3 id="label-TaskNamespace+Organization">TaskNamespace Organization</h3>
155
+
156
+ <p>Tasker supports organizing task handlers into logical namespaces for better organization and isolation:</p>
157
+
158
+ <pre class="code ruby"><code class="ruby"><span class='comment'># Different namespaces can have tasks with the same name
159
+ </span><span class='id identifier rubyid_payments_task'>payments_task</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/HandlerFactory.html" title="Tasker::HandlerFactory (class)">HandlerFactory</a></span></span><span class='period'>.</span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span><span class='lparen'>(</span>
160
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>process_order</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
161
+ <span class='label'>namespace_name:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>payments</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
162
+ <span class='label'>version:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>2.1.0</span><span class='tstring_end'>&#39;</span></span>
163
+ <span class='rparen'>)</span>
164
+
165
+ <span class='id identifier rubyid_inventory_task'>inventory_task</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/HandlerFactory.html" title="Tasker::HandlerFactory (class)">HandlerFactory</a></span></span><span class='period'>.</span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span><span class='lparen'>(</span>
166
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>process_order</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
167
+ <span class='label'>namespace_name:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>inventory</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
168
+ <span class='label'>version:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>1.5.0</span><span class='tstring_end'>&#39;</span></span>
169
+ <span class='rparen'>)</span>
170
+ </code></pre>
171
+
172
+ <p>Common namespace patterns: - <strong><code>payments</code></strong> - Payment processing workflows - <strong><code>inventory</code></strong> - Stock and inventory management - <strong><code>notifications</code></strong> - Email, SMS, and alert workflows - <strong><code>integrations</code></strong> - Third-party API integrations - <strong><code>data_processing</code></strong> - ETL and data transformation workflows - <strong><code>default</code></strong> - General-purpose workflows (used when no namespace specified)</p>
173
+
174
+ <h2 id="label-Simple+Example-3A+Order+Processing">Simple Example: Order Processing</h2>
175
+
176
+ <p>Create a task handler for processing orders:</p>
177
+
178
+ <pre class="code ruby"><code class="ruby">rails generate tasker:task_handler OrderProcess
179
+ </code></pre>
180
+
181
+ <p>This creates a complete workflow structure:</p>
182
+
183
+ <p><strong>YAML Configuration</strong> (<code>config/tasker/tasks/order_process.yaml</code>):</p>
184
+
185
+ <pre class="code ruby"><code class="ruby">---
186
+ name: order_process
187
+ namespace_name: default
188
+ version: 1.0.0
189
+ task_handler_class: OrderProcess
190
+
191
+ step_templates:
192
+ - name: validate_order
193
+ description: Validate order details
194
+ handler_class: OrderProcess::StepHandler::ValidateOrderHandler
195
+
196
+ - name: process_payment
197
+ description: Process payment for the order
198
+ depends_on_step: validate_order
199
+ handler_class: OrderProcess::StepHandler::ProcessPaymentHandler
200
+ default_retryable: true
201
+ default_retry_limit: 3
202
+
203
+ - name: send_confirmation
204
+ description: Send confirmation email
205
+ depends_on_step: process_payment
206
+ handler_class: OrderProcess::StepHandler::SendConfirmationHandler
207
+ </code></pre>
208
+
209
+ <p><strong>Step Handler Implementation</strong>:</p>
210
+
211
+ <pre class="code ruby"><code class="ruby"><span class='kw'>module</span> <span class='const'>OrderProcess</span>
212
+ <span class='kw'>module</span> <span class='const'>StepHandler</span>
213
+ <span class='kw'>class</span> <span class='const'>ValidateOrderHandler</span> <span class='op'>&lt;</span> <span class='const'><span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/StepHandler.html" title="Tasker::StepHandler (module)">StepHandler</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/StepHandler/Base.html" title="Tasker::StepHandler::Base (class)">Base</a></span></span>
214
+ <span class='kw'>def</span> <span class='id identifier rubyid_process'>process</span><span class='lparen'>(</span><span class='id identifier rubyid_task'>task</span><span class='comma'>,</span> <span class='id identifier rubyid_sequence'>sequence</span><span class='comma'>,</span> <span class='id identifier rubyid_step'>step</span><span class='rparen'>)</span>
215
+ <span class='id identifier rubyid_order_id'>order_id</span> <span class='op'>=</span> <span class='id identifier rubyid_task'>task</span><span class='period'>.</span><span class='id identifier rubyid_context'>context</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>order_id</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span>
216
+ <span class='id identifier rubyid_order'>order</span> <span class='op'>=</span> <span class='const'>Order</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span><span class='lparen'>(</span><span class='id identifier rubyid_order_id'>order_id</span><span class='rparen'>)</span>
217
+
218
+ <span class='id identifier rubyid_raise'>raise</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Order not found</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>unless</span> <span class='id identifier rubyid_order'>order</span>
219
+ <span class='id identifier rubyid_raise'>raise</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Order already processed</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='id identifier rubyid_order'>order</span><span class='period'>.</span><span class='id identifier rubyid_processed?'>processed?</span>
220
+
221
+ <span class='lbrace'>{</span> <span class='label'>order:</span> <span class='id identifier rubyid_order'>order</span><span class='period'>.</span><span class='id identifier rubyid_as_json'>as_json</span><span class='comma'>,</span> <span class='label'>valid:</span> <span class='kw'>true</span> <span class='rbrace'>}</span>
222
+ <span class='kw'>end</span>
223
+ <span class='kw'>end</span>
224
+ <span class='kw'>end</span>
225
+ <span class='kw'>end</span>
226
+ </code></pre>
227
+
228
+ <p><strong>Using Your Workflow</strong>:</p>
229
+
230
+ <pre class="code ruby"><code class="ruby"><span class='comment'># Create and execute a task
231
+ </span><span class='id identifier rubyid_task_request'>task_request</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/Types.html" title="Tasker::Types (module)">Types</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/Types/TaskRequest.html" title="Tasker::Types::TaskRequest (class)">TaskRequest</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
232
+ <span class='label'>name:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>order_process</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
233
+ <span class='label'>namespace:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>default</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='comment'># Optional - defaults to &#39;default&#39;
234
+ </span> <span class='label'>version:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>1.0.0</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='comment'># Optional - defaults to &#39;0.1.0&#39;
235
+ </span> <span class='label'>context:</span> <span class='lbrace'>{</span> <span class='label'>order_id:</span> <span class='int'>12345</span> <span class='rbrace'>}</span>
236
+ <span class='rparen'>)</span>
237
+
238
+ <span class='comment'># Handler lookup now supports namespace + version
239
+ </span><span class='id identifier rubyid_handler'>handler</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/HandlerFactory.html" title="Tasker::HandlerFactory (class)">HandlerFactory</a></span></span><span class='period'>.</span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span><span class='lparen'>(</span>
240
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>order_process</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
241
+ <span class='label'>namespace_name:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>default</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='comment'># Optional - defaults to &#39;default&#39;
242
+ </span> <span class='label'>version:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>1.0.0</span><span class='tstring_end'>&#39;</span></span> <span class='comment'># Optional - defaults to &#39;0.1.0&#39;
243
+ </span><span class='rparen'>)</span>
244
+ <span class='id identifier rubyid_task'>task</span> <span class='op'>=</span> <span class='id identifier rubyid_handler'>handler</span><span class='period'>.</span><span class='id identifier rubyid_initialize_task!'>initialize_task!</span><span class='lparen'>(</span><span class='id identifier rubyid_task_request'>task_request</span><span class='rparen'>)</span>
245
+
246
+ <span class='comment'># Task is now queued for processing with automatic retry logic
247
+ </span></code></pre>
248
+
249
+ <h2 id="label-Advanced+Features">Advanced Features</h2>
250
+
251
+ <h3 id="label-Authentication+-26+Authorization">Authentication &amp; Authorization</h3>
252
+
253
+ <p>Tasker includes enterprise-grade security that works with any Rails authentication system:</p>
254
+
255
+ <pre class="code ruby"><code class="ruby"><span class='comment'># config/initializers/tasker.rb
256
+ </span><span class='const'><span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='period'>.</span><span class='id identifier rubyid_configuration'><span class='object_link'><a href="Tasker.html#configuration-class_method" title="Tasker.configuration (method)">configuration</a></span></span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_config'>config</span><span class='op'>|</span>
257
+ <span class='id identifier rubyid_config'>config</span><span class='period'>.</span><span class='id identifier rubyid_auth'>auth</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_auth'>auth</span><span class='op'>|</span>
258
+ <span class='id identifier rubyid_auth'>auth</span><span class='period'>.</span><span class='id identifier rubyid_authentication_enabled'>authentication_enabled</span> <span class='op'>=</span> <span class='kw'>true</span>
259
+ <span class='id identifier rubyid_auth'>auth</span><span class='period'>.</span><span class='id identifier rubyid_authenticator_class'>authenticator_class</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>YourAuthenticator</span><span class='tstring_end'>&#39;</span></span>
260
+ <span class='id identifier rubyid_auth'>auth</span><span class='period'>.</span><span class='id identifier rubyid_authorization_enabled'>authorization_enabled</span> <span class='op'>=</span> <span class='kw'>true</span>
261
+ <span class='id identifier rubyid_auth'>auth</span><span class='period'>.</span><span class='id identifier rubyid_authorization_coordinator_class'>authorization_coordinator_class</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>YourAuthorizationCoordinator</span><span class='tstring_end'>&#39;</span></span>
262
+ <span class='kw'>end</span>
263
+ <span class='kw'>end</span>
264
+ </code></pre>
265
+
266
+ <p><strong>Automatic GraphQL Security</strong>: Operations are automatically mapped to permissions:</p>
267
+
268
+ <pre class="code ruby"><code class="ruby"><span class='comment'># GraphQL query automatically requires tasker.task:index permission
269
+ </span><span class='id identifier rubyid_query'>query</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_tasks'>tasks</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_taskId'>taskId</span> <span class='id identifier rubyid_status'>status</span> <span class='rbrace'>}</span> <span class='rbrace'>}</span>
270
+
271
+ <span class='comment'># GraphQL mutation automatically requires tasker.task:create permission
272
+ </span><span class='id identifier rubyid_mutation'>mutation</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_createTask'>createTask</span><span class='lparen'>(</span><span class='label'>input:</span> <span class='lbrace'>{</span> <span class='label'>name:</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>New Task</span><span class='tstring_end'>&quot;</span></span> <span class='rbrace'>}</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='id identifier rubyid_taskId'>taskId</span> <span class='rbrace'>}</span> <span class='rbrace'>}</span>
273
+ </code></pre>
274
+
275
+ <h3 id="label-REST+API+-26+Handler+Discovery">REST API &amp; Handler Discovery</h3>
276
+
277
+ <p>Tasker provides comprehensive REST API endpoints for handler discovery, task management, and dependency graph analysis:</p>
278
+
279
+ <p><strong>Handler Discovery API</strong>:</p>
280
+
281
+ <pre class="code ruby"><code class="ruby"># List all namespaces with handler counts
282
+ curl -H &quot;Authorization: Bearer YOUR_JWT_TOKEN&quot; \
283
+ https://your-app.com/tasker/handlers
284
+
285
+ # List handlers in specific namespace
286
+ curl -H &quot;Authorization: Bearer YOUR_JWT_TOKEN&quot; \
287
+ https://your-app.com/tasker/handlers/payments
288
+
289
+ # Get handler details with dependency graph
290
+ curl -H &quot;Authorization: Bearer YOUR_JWT_TOKEN&quot; \
291
+ https://your-app.com/tasker/handlers/payments/process_order?version=2.1.0
292
+ </code></pre>
293
+
294
+ <p><strong>Response includes dependency graph visualization</strong>:</p>
295
+
296
+ <pre class="code ruby"><code class="ruby">{
297
+ &quot;id&quot;: &quot;process_order&quot;,
298
+ &quot;namespace&quot;: &quot;payments&quot;,
299
+ &quot;version&quot;: &quot;2.1.0&quot;,
300
+ &quot;step_templates&quot;: [...],
301
+ &quot;dependency_graph&quot;: {
302
+ &quot;nodes&quot;: [&quot;validate_order&quot;, &quot;process_payment&quot;, &quot;send_confirmation&quot;],
303
+ &quot;edges&quot;: [
304
+ {&quot;from&quot;: &quot;validate_order&quot;, &quot;to&quot;: &quot;process_payment&quot;},
305
+ {&quot;from&quot;: &quot;process_payment&quot;, &quot;to&quot;: &quot;send_confirmation&quot;}
306
+ ],
307
+ &quot;execution_order&quot;: [&quot;validate_order&quot;, &quot;process_payment&quot;, &quot;send_confirmation&quot;]
308
+ }
309
+ }
310
+ </code></pre>
311
+
312
+ <p><strong>Task Management API</strong>:</p>
313
+
314
+ <pre class="code ruby"><code class="ruby"># Create task with namespace/version support
315
+ curl -X POST -H &quot;Authorization: Bearer YOUR_JWT_TOKEN&quot; \
316
+ -H &quot;Content-Type: application/json&quot; \
317
+ -d &#39;{&quot;name&quot;: &quot;process_order&quot;, &quot;namespace&quot;: &quot;payments&quot;, &quot;version&quot;: &quot;2.1.0&quot;, &quot;context&quot;: {&quot;order_id&quot;: 123}}&#39; \
318
+ https://your-app.com/tasker/tasks
319
+
320
+ # List tasks with namespace filtering
321
+ curl -H &quot;Authorization: Bearer YOUR_JWT_TOKEN&quot; \
322
+ &quot;https://your-app.com/tasker/tasks?namespace=payments&amp;version=2.1.0&quot;
323
+ </code></pre>
324
+
325
+ <h3 id="label-Event+System+-26+Integrations">Event System &amp; Integrations</h3>
326
+
327
+ <p>Tasker provides comprehensive event-driven observability for custom integrations:</p>
328
+
329
+ <pre class="code ruby"><code class="ruby"><span class='kw'>class</span> <span class='const'>OrderEventsSubscriber</span> <span class='op'>&lt;</span> <span class='const'><span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/Events.html" title="Tasker::Events (module)">Events</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/Events/Subscribers.html" title="Tasker::Events::Subscribers (module)">Subscribers</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/Events/Subscribers/BaseSubscriber.html" title="Tasker::Events::Subscribers::BaseSubscriber (class)">BaseSubscriber</a></span></span>
330
+ <span class='id identifier rubyid_subscribe_to'>subscribe_to</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>task.completed</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>task.failed</span><span class='tstring_end'>&#39;</span></span>
331
+
332
+ <span class='kw'>def</span> <span class='id identifier rubyid_handle_task_completed'>handle_task_completed</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
333
+ <span class='id identifier rubyid_task_id'>task_id</span> <span class='op'>=</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:task_id</span><span class='rparen'>)</span>
334
+ <span class='const'>NotificationService</span><span class='period'>.</span><span class='id identifier rubyid_send_success_email'>send_success_email</span><span class='lparen'>(</span><span class='label'>task_id:</span> <span class='id identifier rubyid_task_id'>task_id</span><span class='rparen'>)</span>
335
+ <span class='kw'>end</span>
336
+
337
+ <span class='kw'>def</span> <span class='id identifier rubyid_handle_task_failed'>handle_task_failed</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='rparen'>)</span>
338
+ <span class='id identifier rubyid_task_id'>task_id</span> <span class='op'>=</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:task_id</span><span class='rparen'>)</span>
339
+ <span class='id identifier rubyid_error_message'>error_message</span> <span class='op'>=</span> <span class='id identifier rubyid_safe_get'>safe_get</span><span class='lparen'>(</span><span class='id identifier rubyid_event'>event</span><span class='comma'>,</span> <span class='symbol'>:error_message</span><span class='rparen'>)</span>
340
+ <span class='const'>AlertService</span><span class='period'>.</span><span class='id identifier rubyid_send_failure_alert'>send_failure_alert</span><span class='lparen'>(</span><span class='label'>task_id:</span> <span class='id identifier rubyid_task_id'>task_id</span><span class='comma'>,</span> <span class='label'>error:</span> <span class='id identifier rubyid_error_message'>error_message</span><span class='rparen'>)</span>
341
+ <span class='kw'>end</span>
342
+ <span class='kw'>end</span>
343
+ </code></pre>
344
+
345
+ <h3 id="label-Telemetry+-26+Observability">Telemetry &amp; Observability</h3>
346
+
347
+ <p>Built-in OpenTelemetry integration provides complete observability:</p>
348
+
349
+ <pre class="code ruby"><code class="ruby"><span class='comment'># config/initializers/tasker.rb
350
+ </span><span class='const'><span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='period'>.</span><span class='id identifier rubyid_configuration'><span class='object_link'><a href="Tasker.html#configuration-class_method" title="Tasker.configuration (method)">configuration</a></span></span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_config'>config</span><span class='op'>|</span>
351
+ <span class='id identifier rubyid_config'>config</span><span class='period'>.</span><span class='id identifier rubyid_telemetry'>telemetry</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_tel'>tel</span><span class='op'>|</span>
352
+ <span class='id identifier rubyid_tel'>tel</span><span class='period'>.</span><span class='id identifier rubyid_enabled'>enabled</span> <span class='op'>=</span> <span class='kw'>true</span>
353
+ <span class='id identifier rubyid_tel'>tel</span><span class='period'>.</span><span class='id identifier rubyid_service_name'>service_name</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>my-app-workflows</span><span class='tstring_end'>&#39;</span></span>
354
+ <span class='id identifier rubyid_tel'>tel</span><span class='period'>.</span><span class='id identifier rubyid_service_version'>service_version</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>1.0.0</span><span class='tstring_end'>&#39;</span></span>
355
+ <span class='kw'>end</span>
356
+ <span class='kw'>end</span>
357
+ </code></pre>
358
+
359
+ <p>Compatible with Jaeger, Zipkin, Honeycomb, and other OpenTelemetry-compatible tools.</p>
360
+
361
+ <h3 id="label-Registry+System+Architecture">Registry System Architecture</h3>
362
+
363
+ <p>Tasker features enterprise-grade registry systems with thread-safe operations and comprehensive observability:</p>
364
+
365
+ <p><strong>Thread-Safe Registries</strong>: - <strong>HandlerFactory</strong>: Thread-safe task handler registration with <code>Concurrent::Hash</code> storage - <strong>PluginRegistry</strong>: Format-based plugin discovery with auto-discovery capabilities - <strong>SubscriberRegistry</strong>: Event subscriber management with structured logging</p>
366
+
367
+ <p><strong>Advanced Features</strong>: - <strong>Structured Logging</strong>: Correlation IDs and JSON formatting for comprehensive observability - <strong>Interface Validation</strong>: Fail-fast validation with detailed error messages - <strong>Replace Operations</strong>: Conflict resolution with <code>replace: true</code> parameter - <strong>Event Integration</strong>: Registry operations fully integrated with the 56-event system</p>
368
+
369
+ <p><strong>Production Benefits</strong>:</p>
370
+
371
+ <pre class="code ruby"><code class="ruby"><span class='comment'># Thread-safe operations with structured logging
372
+ </span><span class='const'><span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Tasker/HandlerFactory.html" title="Tasker::HandlerFactory (class)">HandlerFactory</a></span></span><span class='period'>.</span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_register'>register</span><span class='lparen'>(</span>
373
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>order_processor</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
374
+ <span class='const'>OrderHandler</span><span class='comma'>,</span>
375
+ <span class='label'>namespace_name:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>payments</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
376
+ <span class='label'>version:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>2.1.0</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
377
+ <span class='label'>replace:</span> <span class='kw'>true</span> <span class='comment'># Handles conflicts gracefully
378
+ </span><span class='rparen'>)</span>
379
+
380
+ <span class='comment'># Automatic structured logging with correlation IDs
381
+ </span><span class='comment'># {&quot;timestamp&quot;:&quot;2024-01-15T10:30:45Z&quot;,&quot;correlation_id&quot;:&quot;tsk_abc123&quot;,&quot;component&quot;:&quot;handler_factory&quot;,&quot;message&quot;:&quot;Registry item registered&quot;,&quot;entity_id&quot;:&quot;payments/order_processor/2.1.0&quot;,&quot;event_type&quot;:&quot;registered&quot;}
382
+ </span></code></pre>
383
+
384
+ <h3 id="label-Health+Monitoring+-26+Production+Readiness">Health Monitoring &amp; Production Readiness</h3>
385
+
386
+ <p>Tasker provides enterprise-grade health endpoints for production deployments:</p>
387
+
388
+ <pre class="code ruby"><code class="ruby"># Kubernetes readiness probe - checks database connectivity
389
+ GET /tasker/health/ready
390
+
391
+ # Kubernetes liveness probe - lightweight health check
392
+ GET /tasker/health/live
393
+
394
+ # Detailed status endpoint - comprehensive system metrics
395
+ GET /tasker/health/status
396
+ </code></pre>
397
+
398
+ <p><strong>Optional Authentication &amp; Authorization</strong>:</p>
399
+
400
+ <pre class="code ruby"><code class="ruby"><span class='comment'># config/initializers/tasker.rb
401
+ </span><span class='const'><span class='object_link'><a href="Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='period'>.</span><span class='id identifier rubyid_configuration'><span class='object_link'><a href="Tasker.html#configuration-class_method" title="Tasker.configuration (method)">configuration</a></span></span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_config'>config</span><span class='op'>|</span>
402
+ <span class='id identifier rubyid_config'>config</span><span class='period'>.</span><span class='id identifier rubyid_health'>health</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_health'>health</span><span class='op'>|</span>
403
+ <span class='id identifier rubyid_health'>health</span><span class='period'>.</span><span class='id identifier rubyid_status_requires_authentication'>status_requires_authentication</span> <span class='op'>=</span> <span class='kw'>true</span> <span class='comment'># Secure detailed status
404
+ </span> <span class='kw'>end</span>
405
+
406
+ <span class='id identifier rubyid_config'>config</span><span class='period'>.</span><span class='id identifier rubyid_auth'>auth</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_auth'>auth</span><span class='op'>|</span>
407
+ <span class='id identifier rubyid_auth'>auth</span><span class='period'>.</span><span class='id identifier rubyid_authorization_enabled'>authorization_enabled</span> <span class='op'>=</span> <span class='kw'>true</span>
408
+ <span class='comment'># Status endpoint requires tasker.health_status:index permission
409
+ </span> <span class='kw'>end</span>
410
+ <span class='kw'>end</span>
411
+ </code></pre>
412
+
413
+ <p><strong>Performance Optimized</strong>: Uses SQL functions and 15-second caching for sub-100ms response times.</p>
414
+
415
+ <h2 id="label-Key+Benefits">Key Benefits</h2>
416
+
417
+ <h3 id="label-For+Developers">For Developers</h3>
418
+ <ul><li>
419
+ <p><strong>Quick Setup</strong>: Working workflows in minutes with generators</p>
420
+ </li><li>
421
+ <p><strong>Clear Structure</strong>: YAML configuration with Ruby implementation</p>
422
+ </li><li>
423
+ <p><strong>Comprehensive Testing</strong>: Built-in test infrastructure and patterns</p>
424
+ </li><li>
425
+ <p><strong>Rich Documentation</strong>: Extensive guides and examples</p>
426
+ </li></ul>
427
+
428
+ <h3 id="label-For+Operations">For Operations</h3>
429
+ <ul><li>
430
+ <p><strong>Production Ready</strong>: Battle-tested retry logic and error handling</p>
431
+ </li><li>
432
+ <p><strong>Health Monitoring</strong>: Enterprise-grade health endpoints for K8s and load balancers</p>
433
+ </li><li>
434
+ <p><strong>Observable</strong>: Complete event system with telemetry integration</p>
435
+ </li><li>
436
+ <p><strong>Secure</strong>: Enterprise-grade authentication and authorization</p>
437
+ </li><li>
438
+ <p><strong>Performant</strong>: SQL-function based orchestration with proven performance</p>
439
+ </li><li>
440
+ <p><strong>Thread-Safe</strong>: Concurrent registry operations with structured logging and correlation IDs</p>
441
+ </li><li>
442
+ <p><strong>Reliable</strong>: 100% test coverage with comprehensive validation and error handling</p>
443
+ </li></ul>
444
+
445
+ <h3 id="label-For+Business">For Business</h3>
446
+ <ul><li>
447
+ <p><strong>Reliable</strong>: Automatic retry with exponential backoff</p>
448
+ </li><li>
449
+ <p><strong>Scalable</strong>: Handles complex workflows with multiple dependencies</p>
450
+ </li><li>
451
+ <p><strong>Maintainable</strong>: Clear separation of concerns and documented patterns</p>
452
+ </li><li>
453
+ <p><strong>Extensible</strong>: Event system enables custom integrations</p>
454
+ </li></ul>
455
+
456
+ <h2 id="label-What-27s+Next-3F">Whatโ€™s Next?</h2>
457
+
458
+ <h3 id="label-F0-9F-9A-80+Get+Started+Quickly">๐Ÿš€ Get Started Quickly</h3>
459
+ <ul><li>
460
+ <p><strong>Start Guide[docs/QUICK_START.md]</strong> - Build your first workflow in 15 minutes</p>
461
+ </li><li>
462
+ <p><strong>Guide[docs/DEVELOPER_GUIDE.md]</strong> - Comprehensive implementation guide</p>
463
+ </li><li>
464
+ <p><strong>Examples[spec/examples/]</strong> - Real-world workflow patterns and implementations</p>
465
+ </li></ul>
466
+
467
+ <h3 id="label-F0-9F-94-A7+Advanced+Topics">๐Ÿ”ง Advanced Topics</h3>
468
+ <ul><li>
469
+ <p><strong>API Guide[docs/REST_API.md]</strong> - Complete REST API documentation with handler discovery</p>
470
+ </li><li>
471
+ <p><strong>Systems[docs/REGISTRY_SYSTEMS.md]</strong> - Thread-safe registry architecture and structured logging</p>
472
+ </li><li>
473
+ <p><strong>&amp; Authorization[docs/AUTH.md]</strong> - Complete security system</p>
474
+ </li><li>
475
+ <p><strong>Monitoring[docs/HEALTH.md]</strong> - Production health endpoints and monitoring</p>
476
+ </li><li>
477
+ <p><strong>System[docs/EVENT_SYSTEM.md]</strong> - Observability and integrations</p>
478
+ </li><li>
479
+ <p><strong>Telemetry[docs/TELEMETRY.md]</strong> - OpenTelemetry setup and monitoring</p>
480
+ </li><li>
481
+ <p><strong>Performance[docs/SQL_FUNCTIONS.md]</strong> - High-performance SQL functions</p>
482
+ </li><li>
483
+ <p><strong>Breaker[docs/CIRCUIT_BREAKER.md]</strong> - Distributed, SQL-driven retry architecture</p>
484
+ </li></ul>
485
+
486
+ <h3 id="label-F0-9F-93-9A+Additional+Resources">๐Ÿ“š Additional Resources</h3>
487
+ <ul><li>
488
+ <p><strong>Generator[docs/APPLICATION_GENERATOR.md]</strong> - One-line app creation with Docker support and validation</p>
489
+ </li><li>
490
+ <p><strong>Overview[docs/OVERVIEW.md]</strong> - Architecture and configuration</p>
491
+ </li><li>
492
+ <p><strong>Diagrams[docs/TASK_DIAGRAM.md]</strong> - Visual workflow representation</p>
493
+ </li><li>
494
+ <p><strong>Troubleshooting[docs/TROUBLESHOOTING.md]</strong> - Common issues and solutions</p>
495
+ </li></ul>
496
+
497
+ <h2 id="label-Requirements+-26+Dependencies">Requirements &amp; Dependencies</h2>
498
+ <ul><li>
499
+ <p><strong>Ruby</strong>: 3.2+</p>
500
+ </li><li>
501
+ <p><strong>Rails</strong>: 7.2+</p>
502
+ </li><li>
503
+ <p><strong>Database</strong>: PostgreSQL (required for SQL functions)</p>
504
+ </li><li>
505
+ <p><strong>Background Jobs</strong>: Compatible with ActiveJob (Sidekiq recommended)</p>
506
+ </li></ul>
507
+
508
+ <h2 id="label-Development+-26+Testing">Development &amp; Testing</h2>
509
+
510
+ <pre class="code ruby"><code class="ruby"># Set up development environment
511
+ bundle install
512
+ bundle exec rake db:schema:load
513
+
514
+ # Run tests
515
+ bundle exec rspec spec
516
+
517
+ # Run linter
518
+ bundle exec rubocop
519
+ </code></pre>
520
+
521
+ <h2 id="label-Contributing">Contributing</h2>
522
+
523
+ <p>We welcome contributions! Please see our <a href="docs/DEVELOPER_GUIDE_md.html">development guidelines</a> for information on setting up your development environment and our coding standards.</p>
524
+
525
+ <h2 id="label-License">License</h2>
526
+
527
+ <p>The gem is available as open source under the terms of the <a href="./LICENSE">MIT License</a>.</p>
528
+ <hr>
529
+
530
+ <p><strong>Tasker</strong> transforms complex workflows into reliable, observable processes. Focus on your business logic while Tasker handles the orchestration complexity.</p>
531
+ </div></div>
532
+
533
+ <div id="footer">
534
+ Generated on Tue Jul 1 16:47:34 2025 by
535
+ <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
536
+ 0.9.37 (ruby-3.2.4).
537
+ </div>
538
+
539
+ </div>
540
+ </body>
541
+ </html>