tasker-engine 0.1.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 (601) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +440 -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/tasks_controller.rb +123 -0
  13. data/app/controllers/tasker/workflow_steps_controller.rb +69 -0
  14. data/app/graphql/examples/all_tasks.graphql +22 -0
  15. data/app/graphql/examples/pending_tasks.graphql +23 -0
  16. data/app/graphql/tasker/graph_ql_types/annotation_type.rb +14 -0
  17. data/app/graphql/tasker/graph_ql_types/base_argument.rb +9 -0
  18. data/app/graphql/tasker/graph_ql_types/base_connection.rb +11 -0
  19. data/app/graphql/tasker/graph_ql_types/base_edge.rb +10 -0
  20. data/app/graphql/tasker/graph_ql_types/base_enum.rb +9 -0
  21. data/app/graphql/tasker/graph_ql_types/base_field.rb +10 -0
  22. data/app/graphql/tasker/graph_ql_types/base_input_object.rb +10 -0
  23. data/app/graphql/tasker/graph_ql_types/base_interface.rb +14 -0
  24. data/app/graphql/tasker/graph_ql_types/base_object.rb +10 -0
  25. data/app/graphql/tasker/graph_ql_types/base_scalar.rb +9 -0
  26. data/app/graphql/tasker/graph_ql_types/base_union.rb +11 -0
  27. data/app/graphql/tasker/graph_ql_types/dependent_system_object_map_type.rb +18 -0
  28. data/app/graphql/tasker/graph_ql_types/dependent_system_type.rb +13 -0
  29. data/app/graphql/tasker/graph_ql_types/mutation_type.rb +16 -0
  30. data/app/graphql/tasker/graph_ql_types/named_step_type.rb +16 -0
  31. data/app/graphql/tasker/graph_ql_types/named_task_type.rb +14 -0
  32. data/app/graphql/tasker/graph_ql_types/named_tasks_named_step_type.rb +19 -0
  33. data/app/graphql/tasker/graph_ql_types/node_type.rb +12 -0
  34. data/app/graphql/tasker/graph_ql_types/query_type.rb +20 -0
  35. data/app/graphql/tasker/graph_ql_types/task_annotation_type.rb +17 -0
  36. data/app/graphql/tasker/graph_ql_types/task_interface.rb +17 -0
  37. data/app/graphql/tasker/graph_ql_types/task_type.rb +26 -0
  38. data/app/graphql/tasker/graph_ql_types/workflow_step_type.rb +154 -0
  39. data/app/graphql/tasker/graph_ql_types.rb +42 -0
  40. data/app/graphql/tasker/mutations/base_mutation.rb +13 -0
  41. data/app/graphql/tasker/mutations/cancel_step.rb +29 -0
  42. data/app/graphql/tasker/mutations/cancel_task.rb +29 -0
  43. data/app/graphql/tasker/mutations/create_task.rb +52 -0
  44. data/app/graphql/tasker/mutations/update_step.rb +36 -0
  45. data/app/graphql/tasker/mutations/update_task.rb +41 -0
  46. data/app/graphql/tasker/queries/all_annotation_types.rb +17 -0
  47. data/app/graphql/tasker/queries/all_tasks.rb +23 -0
  48. data/app/graphql/tasker/queries/base_query.rb +9 -0
  49. data/app/graphql/tasker/queries/helpers.rb +16 -0
  50. data/app/graphql/tasker/queries/one_step.rb +24 -0
  51. data/app/graphql/tasker/queries/one_task.rb +18 -0
  52. data/app/graphql/tasker/queries/tasks_by_annotation.rb +31 -0
  53. data/app/graphql/tasker/queries/tasks_by_status.rb +30 -0
  54. data/app/graphql/tasker/tasker_rails_schema.rb +52 -0
  55. data/app/jobs/tasker/application_job.rb +8 -0
  56. data/app/jobs/tasker/metrics_export_job.rb +252 -0
  57. data/app/jobs/tasker/task_runner_job.rb +224 -0
  58. data/app/models/tasker/annotation_type.rb +26 -0
  59. data/app/models/tasker/application_record.rb +70 -0
  60. data/app/models/tasker/dependent_system.rb +26 -0
  61. data/app/models/tasker/dependent_system_object_map.rb +64 -0
  62. data/app/models/tasker/named_step.rb +41 -0
  63. data/app/models/tasker/named_task.rb +121 -0
  64. data/app/models/tasker/named_tasks_named_step.rb +82 -0
  65. data/app/models/tasker/step_dag_relationship.rb +65 -0
  66. data/app/models/tasker/step_readiness_status.rb +59 -0
  67. data/app/models/tasker/task.rb +414 -0
  68. data/app/models/tasker/task_annotation.rb +36 -0
  69. data/app/models/tasker/task_execution_context.rb +29 -0
  70. data/app/models/tasker/task_namespace.rb +41 -0
  71. data/app/models/tasker/task_transition.rb +235 -0
  72. data/app/models/tasker/workflow_step.rb +461 -0
  73. data/app/models/tasker/workflow_step_edge.rb +95 -0
  74. data/app/models/tasker/workflow_step_transition.rb +434 -0
  75. data/app/serializers/tasker/annotation_type_serializer.rb +8 -0
  76. data/app/serializers/tasker/handler_serializer.rb +109 -0
  77. data/app/serializers/tasker/task_annotation_serializer.rb +32 -0
  78. data/app/serializers/tasker/task_serializer.rb +168 -0
  79. data/app/serializers/tasker/workflow_step_serializer.rb +27 -0
  80. data/app/services/tasker/analytics_service.rb +409 -0
  81. data/config/initializers/dry_struct.rb +11 -0
  82. data/config/initializers/statesman.rb +6 -0
  83. data/config/initializers/tasker_orchestration.rb +17 -0
  84. data/config/initializers/time_formats.rb +4 -0
  85. data/config/routes.rb +34 -0
  86. data/config/tasker/subscriptions/example_integrations.yml +67 -0
  87. data/config/tasker/system_events.yml +305 -0
  88. data/db/functions/calculate_dependency_levels_v01.sql +45 -0
  89. data/db/functions/get_analytics_metrics_v01.sql +137 -0
  90. data/db/functions/get_slowest_steps_v01.sql +82 -0
  91. data/db/functions/get_slowest_tasks_v01.sql +96 -0
  92. data/db/functions/get_step_readiness_status_batch_v01.sql +140 -0
  93. data/db/functions/get_step_readiness_status_single_and_batch_v02.sql +223 -0
  94. data/db/functions/get_step_readiness_status_v01.sql +139 -0
  95. data/db/functions/get_system_health_counts_v01.sql +108 -0
  96. data/db/functions/get_task_execution_context_v01.sql +108 -0
  97. data/db/functions/get_task_execution_contexts_batch_v01.sql +104 -0
  98. data/db/init/schema.sql +2254 -0
  99. data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
  100. data/db/migrate/20250710110830_step_readiness_sql_functions_v02.rb +39 -0
  101. data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
  102. data/docs/APPLICATION_GENERATOR.md +384 -0
  103. data/docs/AUTH.md +1741 -0
  104. data/docs/CIRCUIT_BREAKER.md +224 -0
  105. data/docs/DEVELOPER_GUIDE.md +2664 -0
  106. data/docs/EVENT_SYSTEM.md +637 -0
  107. data/docs/EXECUTION_CONFIGURATION.md +341 -0
  108. data/docs/FLOW_CHART.md +149 -0
  109. data/docs/HEALTH.md +542 -0
  110. data/docs/METRICS.md +731 -0
  111. data/docs/OPTIMIZATION_PLAN.md +1479 -0
  112. data/docs/OVERVIEW.md +548 -0
  113. data/docs/QUICK_START.md +270 -0
  114. data/docs/REGISTRY_SYSTEMS.md +373 -0
  115. data/docs/REST_API.md +632 -0
  116. data/docs/REVERSIONING.md +404 -0
  117. data/docs/ROADMAP.md +221 -0
  118. data/docs/SQL_FUNCTIONS.md +1408 -0
  119. data/docs/TASK_EXECUTION_CONTROL_FLOW.md +237 -0
  120. data/docs/TELEMETRY.md +795 -0
  121. data/docs/TROUBLESHOOTING.md +756 -0
  122. data/docs/TaskHandlerGenerator.html +255 -0
  123. data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +907 -0
  124. data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1236 -0
  125. data/docs/Tasker/Analysis.html +117 -0
  126. data/docs/Tasker/AnalyticsController.html +450 -0
  127. data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +816 -0
  128. data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +586 -0
  129. data/docs/Tasker/AnalyticsService.html +2221 -0
  130. data/docs/Tasker/AnnotationType.html +137 -0
  131. data/docs/Tasker/AnnotationTypeSerializer.html +124 -0
  132. data/docs/Tasker/ApplicationController.html +147 -0
  133. data/docs/Tasker/ApplicationJob.html +128 -0
  134. data/docs/Tasker/ApplicationRecord.html +378 -0
  135. data/docs/Tasker/Authentication/AuthenticationError.html +124 -0
  136. data/docs/Tasker/Authentication/ConfigurationError.html +124 -0
  137. data/docs/Tasker/Authentication/Coordinator.html +242 -0
  138. data/docs/Tasker/Authentication/Interface.html +560 -0
  139. data/docs/Tasker/Authentication/InterfaceError.html +124 -0
  140. data/docs/Tasker/Authentication/NoneAuthenticator.html +338 -0
  141. data/docs/Tasker/Authentication.html +119 -0
  142. data/docs/Tasker/Authorization/AuthorizationError.html +139 -0
  143. data/docs/Tasker/Authorization/BaseCoordinator.html +927 -0
  144. data/docs/Tasker/Authorization/ConfigurationError.html +153 -0
  145. data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +428 -0
  146. data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +360 -0
  147. data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
  148. data/docs/Tasker/Authorization/ResourceRegistry.html +875 -0
  149. data/docs/Tasker/Authorization/UnauthorizedError.html +153 -0
  150. data/docs/Tasker/Authorization.html +582 -0
  151. data/docs/Tasker/CacheCapabilities.html +167 -0
  152. data/docs/Tasker/CacheStrategy.html +1297 -0
  153. data/docs/Tasker/Concerns/Authenticatable.html +116 -0
  154. data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +256 -0
  155. data/docs/Tasker/Concerns/Authorizable.html +816 -0
  156. data/docs/Tasker/Concerns/ControllerAuthorizable.html +157 -0
  157. data/docs/Tasker/Concerns/EventPublisher.html +4023 -0
  158. data/docs/Tasker/Concerns/IdempotentStateTransitions.html +806 -0
  159. data/docs/Tasker/Concerns/LifecycleEventHelpers.html +129 -0
  160. data/docs/Tasker/Concerns/OrchestrationPublisher.html +129 -0
  161. data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1075 -0
  162. data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +191 -0
  163. data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +126 -0
  164. data/docs/Tasker/Concerns/StateMachineBase.html +153 -0
  165. data/docs/Tasker/Concerns/StructuredLogging.html +1413 -0
  166. data/docs/Tasker/Concerns.html +117 -0
  167. data/docs/Tasker/Configuration/AuthConfiguration.html +1023 -0
  168. data/docs/Tasker/Configuration/ConfigurationProxy.html +581 -0
  169. data/docs/Tasker/Configuration/DatabaseConfiguration.html +475 -0
  170. data/docs/Tasker/Configuration/EngineConfiguration.html +1265 -0
  171. data/docs/Tasker/Configuration/HealthConfiguration.html +791 -0
  172. data/docs/Tasker/Configuration/TelemetryConfiguration.html +1308 -0
  173. data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +388 -0
  174. data/docs/Tasker/Configuration.html +1669 -0
  175. data/docs/Tasker/ConfigurationError.html +143 -0
  176. data/docs/Tasker/ConfiguredTask.html +514 -0
  177. data/docs/Tasker/Constants/EventDefinitions.html +590 -0
  178. data/docs/Tasker/Constants/LifecycleEvents.html +137 -0
  179. data/docs/Tasker/Constants/ObservabilityEvents/Step.html +152 -0
  180. data/docs/Tasker/Constants/ObservabilityEvents/Task.html +142 -0
  181. data/docs/Tasker/Constants/ObservabilityEvents.html +126 -0
  182. data/docs/Tasker/Constants/RegistryEvents.html +285 -0
  183. data/docs/Tasker/Constants/StepEvents.html +177 -0
  184. data/docs/Tasker/Constants/TaskEvents.html +167 -0
  185. data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +207 -0
  186. data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +191 -0
  187. data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +207 -0
  188. data/docs/Tasker/Constants/TaskExecution.html +126 -0
  189. data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +132 -0
  190. data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +207 -0
  191. data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +239 -0
  192. data/docs/Tasker/Constants/TaskFinalization.html +126 -0
  193. data/docs/Tasker/Constants/TaskStatuses.html +223 -0
  194. data/docs/Tasker/Constants/TestEvents.html +163 -0
  195. data/docs/Tasker/Constants/WorkflowEvents.html +222 -0
  196. data/docs/Tasker/Constants/WorkflowStepStatuses.html +223 -0
  197. data/docs/Tasker/Constants.html +561 -0
  198. data/docs/Tasker/DependentSystem.html +137 -0
  199. data/docs/Tasker/DependentSystemObjectMap.html +250 -0
  200. data/docs/Tasker/DetectorRegistry.html +598 -0
  201. data/docs/Tasker/Diagram/Edge.html +1191 -0
  202. data/docs/Tasker/Diagram/Flowchart.html +1539 -0
  203. data/docs/Tasker/Diagram/Node.html +1165 -0
  204. data/docs/Tasker/Diagram.html +117 -0
  205. data/docs/Tasker/Engine.html +215 -0
  206. data/docs/Tasker/Error.html +139 -0
  207. data/docs/Tasker/Events/Bus.html +1226 -0
  208. data/docs/Tasker/Events/Catalog/CatalogPrinter.html +258 -0
  209. data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +276 -0
  210. data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +294 -0
  211. data/docs/Tasker/Events/Catalog.html +1291 -0
  212. data/docs/Tasker/Events/CustomRegistry.html +943 -0
  213. data/docs/Tasker/Events/DefinitionLoader.html +575 -0
  214. data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +286 -0
  215. data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +312 -0
  216. data/docs/Tasker/Events/EventPayloadBuilder.html +664 -0
  217. data/docs/Tasker/Events/Publisher.html +365 -0
  218. data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1128 -0
  219. data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +270 -0
  220. data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +266 -0
  221. data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +2556 -0
  222. data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +723 -0
  223. data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +2251 -0
  224. data/docs/Tasker/Events/Subscribers.html +117 -0
  225. data/docs/Tasker/Events/SubscriptionLoader.html +493 -0
  226. data/docs/Tasker/Events.html +294 -0
  227. data/docs/Tasker/EventsGenerator.html +459 -0
  228. data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +135 -0
  229. data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +412 -0
  230. data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +598 -0
  231. data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +135 -0
  232. data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +453 -0
  233. data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +135 -0
  234. data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +453 -0
  235. data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1457 -0
  236. data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +135 -0
  237. data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +370 -0
  238. data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1250 -0
  239. data/docs/Tasker/Functions/FunctionWrapper.html +479 -0
  240. data/docs/Tasker/Functions.html +117 -0
  241. data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +244 -0
  242. data/docs/Tasker/Generators/AuthenticatorGenerator.html +373 -0
  243. data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +430 -0
  244. data/docs/Tasker/Generators/SubscriberGenerator.html +377 -0
  245. data/docs/Tasker/Generators/TaskHandlerGenerator.html +263 -0
  246. data/docs/Tasker/Generators.html +117 -0
  247. data/docs/Tasker/GraphQLTypes/AnnotationType.html +132 -0
  248. data/docs/Tasker/GraphQLTypes/BaseArgument.html +124 -0
  249. data/docs/Tasker/GraphQLTypes/BaseConnection.html +124 -0
  250. data/docs/Tasker/GraphQLTypes/BaseEdge.html +130 -0
  251. data/docs/Tasker/GraphQLTypes/BaseEnum.html +124 -0
  252. data/docs/Tasker/GraphQLTypes/BaseField.html +124 -0
  253. data/docs/Tasker/GraphQLTypes/BaseInputObject.html +124 -0
  254. data/docs/Tasker/GraphQLTypes/BaseInterface.html +116 -0
  255. data/docs/Tasker/GraphQLTypes/BaseObject.html +128 -0
  256. data/docs/Tasker/GraphQLTypes/BaseScalar.html +124 -0
  257. data/docs/Tasker/GraphQLTypes/BaseUnion.html +124 -0
  258. data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +132 -0
  259. data/docs/Tasker/GraphQLTypes/DependentSystemType.html +132 -0
  260. data/docs/Tasker/GraphQLTypes/MutationType.html +132 -0
  261. data/docs/Tasker/GraphQLTypes/NamedStepType.html +132 -0
  262. data/docs/Tasker/GraphQLTypes/NamedTaskType.html +132 -0
  263. data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +132 -0
  264. data/docs/Tasker/GraphQLTypes/NodeType.html +118 -0
  265. data/docs/Tasker/GraphQLTypes/QueryType.html +139 -0
  266. data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +132 -0
  267. data/docs/Tasker/GraphQLTypes/TaskInterface.html +111 -0
  268. data/docs/Tasker/GraphQLTypes/TaskType.html +201 -0
  269. data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +694 -0
  270. data/docs/Tasker/GraphQLTypes.html +130 -0
  271. data/docs/Tasker/GraphqlController.html +251 -0
  272. data/docs/Tasker/HandlerFactory.html +1528 -0
  273. data/docs/Tasker/HandlerSerializer.html +682 -0
  274. data/docs/Tasker/HandlersController.html +574 -0
  275. data/docs/Tasker/HashIdentityStrategy.html +278 -0
  276. data/docs/Tasker/Health/ReadinessChecker.html +712 -0
  277. data/docs/Tasker/Health/StatusChecker.html +653 -0
  278. data/docs/Tasker/Health.html +117 -0
  279. data/docs/Tasker/HealthController.html +523 -0
  280. data/docs/Tasker/IdentityStrategy.html +276 -0
  281. data/docs/Tasker/InvalidTaskHandlerConfig.html +135 -0
  282. data/docs/Tasker/LifecycleEvents/Events/Step.html +162 -0
  283. data/docs/Tasker/LifecycleEvents/Events/Task.html +162 -0
  284. data/docs/Tasker/LifecycleEvents/Events.html +204 -0
  285. data/docs/Tasker/LifecycleEvents/Publisher.html +132 -0
  286. data/docs/Tasker/LifecycleEvents.html +799 -0
  287. data/docs/Tasker/Logging/CorrelationIdGenerator.html +688 -0
  288. data/docs/Tasker/Logging.html +115 -0
  289. data/docs/Tasker/MetricsController.html +293 -0
  290. data/docs/Tasker/MetricsExportJob.html +414 -0
  291. data/docs/Tasker/Mutations/BaseMutation.html +128 -0
  292. data/docs/Tasker/Mutations/CancelStep.html +219 -0
  293. data/docs/Tasker/Mutations/CancelTask.html +221 -0
  294. data/docs/Tasker/Mutations/CreateTask.html +243 -0
  295. data/docs/Tasker/Mutations/UpdateStep.html +243 -0
  296. data/docs/Tasker/Mutations/UpdateTask.html +243 -0
  297. data/docs/Tasker/Mutations.html +117 -0
  298. data/docs/Tasker/NamedStep.html +216 -0
  299. data/docs/Tasker/NamedTask.html +910 -0
  300. data/docs/Tasker/NamedTasksNamedStep.html +435 -0
  301. data/docs/Tasker/Orchestration/BackoffCalculator.html +404 -0
  302. data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +258 -0
  303. data/docs/Tasker/Orchestration/ConnectionBuilder.html +435 -0
  304. data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +513 -0
  305. data/docs/Tasker/Orchestration/Coordinator.html +641 -0
  306. data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1045 -0
  307. data/docs/Tasker/Orchestration/Orchestrator.html +679 -0
  308. data/docs/Tasker/Orchestration/PluginIntegration.html +1127 -0
  309. data/docs/Tasker/Orchestration/ResponseProcessor.html +504 -0
  310. data/docs/Tasker/Orchestration/RetryHeaderParser.html +304 -0
  311. data/docs/Tasker/Orchestration/StepExecutor.html +995 -0
  312. data/docs/Tasker/Orchestration/StepSequenceFactory.html +644 -0
  313. data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +264 -0
  314. data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +254 -0
  315. data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +556 -0
  316. data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +348 -0
  317. data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +286 -0
  318. data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +432 -0
  319. data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +296 -0
  320. data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +314 -0
  321. data/docs/Tasker/Orchestration/TaskFinalizer.html +1212 -0
  322. data/docs/Tasker/Orchestration/TaskInitializer.html +766 -0
  323. data/docs/Tasker/Orchestration/TaskReenqueuer.html +506 -0
  324. data/docs/Tasker/Orchestration/ViableStepDiscovery.html +442 -0
  325. data/docs/Tasker/Orchestration/WorkflowCoordinator.html +510 -0
  326. data/docs/Tasker/Orchestration.html +130 -0
  327. data/docs/Tasker/PageSort/PageSortParamsBuilder.html +296 -0
  328. data/docs/Tasker/PageSort.html +247 -0
  329. data/docs/Tasker/PermanentError.html +518 -0
  330. data/docs/Tasker/ProceduralError.html +147 -0
  331. data/docs/Tasker/Queries/AllAnnotationTypes.html +217 -0
  332. data/docs/Tasker/Queries/AllTasks.html +221 -0
  333. data/docs/Tasker/Queries/BaseQuery.html +128 -0
  334. data/docs/Tasker/Queries/Helpers.html +187 -0
  335. data/docs/Tasker/Queries/OneStep.html +225 -0
  336. data/docs/Tasker/Queries/OneTask.html +217 -0
  337. data/docs/Tasker/Queries/TasksByAnnotation.html +231 -0
  338. data/docs/Tasker/Queries/TasksByStatus.html +233 -0
  339. data/docs/Tasker/Queries.html +119 -0
  340. data/docs/Tasker/Railtie.html +124 -0
  341. data/docs/Tasker/Registry/BaseRegistry.html +1690 -0
  342. data/docs/Tasker/Registry/EventPublisher.html +667 -0
  343. data/docs/Tasker/Registry/InterfaceValidator.html +569 -0
  344. data/docs/Tasker/Registry/RegistrationError.html +132 -0
  345. data/docs/Tasker/Registry/RegistryError.html +139 -0
  346. data/docs/Tasker/Registry/StatisticsCollector.html +841 -0
  347. data/docs/Tasker/Registry/SubscriberRegistry.html +1504 -0
  348. data/docs/Tasker/Registry/ValidationError.html +132 -0
  349. data/docs/Tasker/Registry.html +119 -0
  350. data/docs/Tasker/RetryableError.html +515 -0
  351. data/docs/Tasker/StateMachine/Compatibility.html +282 -0
  352. data/docs/Tasker/StateMachine/InvalidStateTransition.html +135 -0
  353. data/docs/Tasker/StateMachine/StepStateMachine/StandardizedPayloadBuilder.html +260 -0
  354. data/docs/Tasker/StateMachine/StepStateMachine.html +2215 -0
  355. data/docs/Tasker/StateMachine/TaskStateMachine.html +734 -0
  356. data/docs/Tasker/StateMachine.html +602 -0
  357. data/docs/Tasker/StepDagRelationship.html +657 -0
  358. data/docs/Tasker/StepHandler/Api/Config.html +1091 -0
  359. data/docs/Tasker/StepHandler/Api.html +884 -0
  360. data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +321 -0
  361. data/docs/Tasker/StepHandler/Base.html +970 -0
  362. data/docs/Tasker/StepHandler.html +119 -0
  363. data/docs/Tasker/StepReadinessStatus.html +836 -0
  364. data/docs/Tasker/Task.html +2478 -0
  365. data/docs/Tasker/TaskAnnotation.html +137 -0
  366. data/docs/Tasker/TaskAnnotationSerializer.html +124 -0
  367. data/docs/Tasker/TaskBuilder/StepNameValidator.html +264 -0
  368. data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +264 -0
  369. data/docs/Tasker/TaskBuilder.html +764 -0
  370. data/docs/Tasker/TaskDiagram/StepToStepEdgeBuilder.html +260 -0
  371. data/docs/Tasker/TaskDiagram/TaskToRootStepEdgeBuilder.html +290 -0
  372. data/docs/Tasker/TaskDiagram.html +548 -0
  373. data/docs/Tasker/TaskDiagramsController.html +240 -0
  374. data/docs/Tasker/TaskExecutionContext.html +469 -0
  375. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +238 -0
  376. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +254 -0
  377. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +988 -0
  378. data/docs/Tasker/TaskHandler/ClassMethods.html +395 -0
  379. data/docs/Tasker/TaskHandler/InstanceMethods.html +1396 -0
  380. data/docs/Tasker/TaskHandler/StepGroup.html +1748 -0
  381. data/docs/Tasker/TaskHandler.html +271 -0
  382. data/docs/Tasker/TaskNamespace.html +312 -0
  383. data/docs/Tasker/TaskRunnerJob.html +406 -0
  384. data/docs/Tasker/TaskSerializer.html +474 -0
  385. data/docs/Tasker/TaskTransition.html +1517 -0
  386. data/docs/Tasker/TaskWorkflowSummary.html +988 -0
  387. data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +132 -0
  388. data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +139 -0
  389. data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +132 -0
  390. data/docs/Tasker/TaskerRailsSchema.html +384 -0
  391. data/docs/Tasker/TasksController.html +595 -0
  392. data/docs/Tasker/Telemetry/EventMapping.html +1307 -0
  393. data/docs/Tasker/Telemetry/EventRouter.html +2178 -0
  394. data/docs/Tasker/Telemetry/Events/ExportEvents.html +246 -0
  395. data/docs/Tasker/Telemetry/Events.html +115 -0
  396. data/docs/Tasker/Telemetry/ExportCoordinator/DistributedLockTimeoutError.html +135 -0
  397. data/docs/Tasker/Telemetry/ExportCoordinator.html +2137 -0
  398. data/docs/Tasker/Telemetry/IntelligentCacheManager.html +1083 -0
  399. data/docs/Tasker/Telemetry/LogBackend.html +1088 -0
  400. data/docs/Tasker/Telemetry/MetricTypes/Counter.html +1054 -0
  401. data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +1270 -0
  402. data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +1492 -0
  403. data/docs/Tasker/Telemetry/MetricTypes.html +153 -0
  404. data/docs/Tasker/Telemetry/MetricsBackend.html +2510 -0
  405. data/docs/Tasker/Telemetry/MetricsExportService.html +578 -0
  406. data/docs/Tasker/Telemetry/PluginRegistry.html +1774 -0
  407. data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1835 -0
  408. data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +768 -0
  409. data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +747 -0
  410. data/docs/Tasker/Telemetry/Plugins.html +117 -0
  411. data/docs/Tasker/Telemetry/PrometheusExporter.html +481 -0
  412. data/docs/Tasker/Telemetry/TraceBackend.html +891 -0
  413. data/docs/Tasker/Telemetry.html +130 -0
  414. data/docs/Tasker/Types/AuthConfig.html +886 -0
  415. data/docs/Tasker/Types/BackoffConfig.html +1063 -0
  416. data/docs/Tasker/Types/BaseConfig.html +227 -0
  417. data/docs/Tasker/Types/CacheConfig.html +1731 -0
  418. data/docs/Tasker/Types/DatabaseConfig.html +388 -0
  419. data/docs/Tasker/Types/DependencyGraph.html +526 -0
  420. data/docs/Tasker/Types/DependencyGraphConfig.html +753 -0
  421. data/docs/Tasker/Types/EngineConfig.html +1181 -0
  422. data/docs/Tasker/Types/ExecutionConfig.html +1963 -0
  423. data/docs/Tasker/Types/GraphEdge.html +517 -0
  424. data/docs/Tasker/Types/GraphMetadata.html +781 -0
  425. data/docs/Tasker/Types/GraphNode.html +694 -0
  426. data/docs/Tasker/Types/HealthConfig.html +784 -0
  427. data/docs/Tasker/Types/StepSequence.html +353 -0
  428. data/docs/Tasker/Types/StepTemplate.html +1193 -0
  429. data/docs/Tasker/Types/TaskRequest.html +1179 -0
  430. data/docs/Tasker/Types/TelemetryConfig.html +2746 -0
  431. data/docs/Tasker/Types.html +154 -0
  432. data/docs/Tasker/WorkflowStep/StepFinder.html +282 -0
  433. data/docs/Tasker/WorkflowStep.html +2724 -0
  434. data/docs/Tasker/WorkflowStepEdge.html +306 -0
  435. data/docs/Tasker/WorkflowStepSerializer.html +305 -0
  436. data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +282 -0
  437. data/docs/Tasker/WorkflowStepTransition.html +2201 -0
  438. data/docs/Tasker/WorkflowStepsController.html +462 -0
  439. data/docs/Tasker.html +468 -0
  440. data/docs/VISION.md +584 -0
  441. data/docs/WHY.md +21 -0
  442. data/docs/_index.html +2319 -0
  443. data/docs/class_list.html +54 -0
  444. data/docs/css/common.css +1 -0
  445. data/docs/css/full_list.css +58 -0
  446. data/docs/css/style.css +503 -0
  447. data/docs/events/migration_plan_outcomes.md +80 -0
  448. data/docs/file.README.html +537 -0
  449. data/docs/file_list.html +59 -0
  450. data/docs/frames.html +22 -0
  451. data/docs/index.html +537 -0
  452. data/docs/js/app.js +344 -0
  453. data/docs/js/full_list.js +242 -0
  454. data/docs/js/jquery.js +4 -0
  455. data/docs/method_list.html +8854 -0
  456. data/docs/top-level-namespace.html +110 -0
  457. data/lib/generators/tasker/authenticator_generator.rb +301 -0
  458. data/lib/generators/tasker/authorization_coordinator_generator.rb +139 -0
  459. data/lib/generators/tasker/events_generator.rb +91 -0
  460. data/lib/generators/tasker/subscriber_generator.rb +107 -0
  461. data/lib/generators/tasker/task_handler_generator.rb +138 -0
  462. data/lib/generators/tasker/templates/api_token_authenticator.rb.erb +113 -0
  463. data/lib/generators/tasker/templates/api_token_authenticator_spec.rb.erb +144 -0
  464. data/lib/generators/tasker/templates/authorization_coordinator.rb.erb +82 -0
  465. data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +136 -0
  466. data/lib/generators/tasker/templates/custom_authenticator.rb.erb +108 -0
  467. data/lib/generators/tasker/templates/custom_authenticator_spec.rb.erb +162 -0
  468. data/lib/generators/tasker/templates/custom_events.yml.erb +62 -0
  469. data/lib/generators/tasker/templates/custom_subscriber.rb.erb +72 -0
  470. data/lib/generators/tasker/templates/devise_authenticator.rb.erb +101 -0
  471. data/lib/generators/tasker/templates/devise_authenticator_spec.rb.erb +126 -0
  472. data/lib/generators/tasker/templates/initialize.rb.erb +202 -0
  473. data/lib/generators/tasker/templates/jwt_authenticator.rb.erb +144 -0
  474. data/lib/generators/tasker/templates/jwt_authenticator_spec.rb.erb +298 -0
  475. data/lib/generators/tasker/templates/metrics_subscriber.rb.erb +258 -0
  476. data/lib/generators/tasker/templates/metrics_subscriber_spec.rb.erb +308 -0
  477. data/lib/generators/tasker/templates/omniauth_authenticator.rb.erb +135 -0
  478. data/lib/generators/tasker/templates/omniauth_authenticator_spec.rb.erb +196 -0
  479. data/lib/generators/tasker/templates/opentelemetry_initializer.rb +52 -0
  480. data/lib/generators/tasker/templates/subscriber.rb.erb +64 -0
  481. data/lib/generators/tasker/templates/subscriber_spec.rb.erb +80 -0
  482. data/lib/generators/tasker/templates/task_config.yaml.erb +117 -0
  483. data/lib/generators/tasker/templates/task_handler.rb.erb +60 -0
  484. data/lib/generators/tasker/templates/task_handler_spec.rb.erb +165 -0
  485. data/lib/tasker/analysis/runtime_graph_analyzer.rb +1168 -0
  486. data/lib/tasker/analysis/template_graph_analyzer.rb +328 -0
  487. data/lib/tasker/authentication/coordinator.rb +78 -0
  488. data/lib/tasker/authentication/errors.rb +9 -0
  489. data/lib/tasker/authentication/interface.rb +36 -0
  490. data/lib/tasker/authentication/none_authenticator.rb +26 -0
  491. data/lib/tasker/authorization/base_coordinator.rb +112 -0
  492. data/lib/tasker/authorization/errors.rb +26 -0
  493. data/lib/tasker/authorization/resource_constants.rb +73 -0
  494. data/lib/tasker/authorization/resource_registry.rb +136 -0
  495. data/lib/tasker/authorization.rb +75 -0
  496. data/lib/tasker/cache_capabilities.rb +131 -0
  497. data/lib/tasker/cache_strategy.rb +469 -0
  498. data/lib/tasker/concerns/authenticatable.rb +41 -0
  499. data/lib/tasker/concerns/authorizable.rb +204 -0
  500. data/lib/tasker/concerns/controller_authorizable.rb +124 -0
  501. data/lib/tasker/concerns/event_publisher.rb +716 -0
  502. data/lib/tasker/concerns/idempotent_state_transitions.rb +128 -0
  503. data/lib/tasker/concerns/state_machine_base.rb +218 -0
  504. data/lib/tasker/concerns/structured_logging.rb +387 -0
  505. data/lib/tasker/configuration.rb +325 -0
  506. data/lib/tasker/constants/event_definitions.rb +147 -0
  507. data/lib/tasker/constants/registry_events.rb +54 -0
  508. data/lib/tasker/constants.rb +417 -0
  509. data/lib/tasker/engine.rb +90 -0
  510. data/lib/tasker/errors.rb +90 -0
  511. data/lib/tasker/events/catalog.rb +432 -0
  512. data/lib/tasker/events/custom_registry.rb +175 -0
  513. data/lib/tasker/events/definition_loader.rb +199 -0
  514. data/lib/tasker/events/event_payload_builder.rb +461 -0
  515. data/lib/tasker/events/publisher.rb +149 -0
  516. data/lib/tasker/events/subscribers/base_subscriber.rb +601 -0
  517. data/lib/tasker/events/subscribers/metrics_subscriber.rb +120 -0
  518. data/lib/tasker/events/subscribers/telemetry_subscriber.rb +462 -0
  519. data/lib/tasker/events/subscription_loader.rb +161 -0
  520. data/lib/tasker/events.rb +37 -0
  521. data/lib/tasker/functions/function_based_analytics_metrics.rb +103 -0
  522. data/lib/tasker/functions/function_based_dependency_levels.rb +54 -0
  523. data/lib/tasker/functions/function_based_slowest_steps.rb +84 -0
  524. data/lib/tasker/functions/function_based_slowest_tasks.rb +84 -0
  525. data/lib/tasker/functions/function_based_step_readiness_status.rb +183 -0
  526. data/lib/tasker/functions/function_based_system_health_counts.rb +94 -0
  527. data/lib/tasker/functions/function_based_task_execution_context.rb +148 -0
  528. data/lib/tasker/functions/function_wrapper.rb +42 -0
  529. data/lib/tasker/functions.rb +12 -0
  530. data/lib/tasker/handler_factory.rb +327 -0
  531. data/lib/tasker/health/readiness_checker.rb +186 -0
  532. data/lib/tasker/health/status_checker.rb +203 -0
  533. data/lib/tasker/identity_strategy.rb +38 -0
  534. data/lib/tasker/logging/correlation_id_generator.rb +120 -0
  535. data/lib/tasker/orchestration/backoff_calculator.rb +184 -0
  536. data/lib/tasker/orchestration/connection_builder.rb +122 -0
  537. data/lib/tasker/orchestration/connection_pool_intelligence.rb +177 -0
  538. data/lib/tasker/orchestration/coordinator.rb +119 -0
  539. data/lib/tasker/orchestration/future_state_analyzer.rb +137 -0
  540. data/lib/tasker/orchestration/plugin_integration.rb +124 -0
  541. data/lib/tasker/orchestration/response_processor.rb +168 -0
  542. data/lib/tasker/orchestration/retry_header_parser.rb +78 -0
  543. data/lib/tasker/orchestration/step_executor.rb +941 -0
  544. data/lib/tasker/orchestration/step_sequence_factory.rb +67 -0
  545. data/lib/tasker/orchestration/task_finalizer.rb +564 -0
  546. data/lib/tasker/orchestration/task_initializer.rb +140 -0
  547. data/lib/tasker/orchestration/task_reenqueuer.rb +71 -0
  548. data/lib/tasker/orchestration/viable_step_discovery.rb +65 -0
  549. data/lib/tasker/orchestration/workflow_coordinator.rb +294 -0
  550. data/lib/tasker/orchestration.rb +45 -0
  551. data/lib/tasker/railtie.rb +9 -0
  552. data/lib/tasker/registry/base_registry.rb +177 -0
  553. data/lib/tasker/registry/event_publisher.rb +91 -0
  554. data/lib/tasker/registry/interface_validator.rb +140 -0
  555. data/lib/tasker/registry/statistics_collector.rb +381 -0
  556. data/lib/tasker/registry/subscriber_registry.rb +285 -0
  557. data/lib/tasker/registry.rb +22 -0
  558. data/lib/tasker/state_machine/step_state_machine.rb +508 -0
  559. data/lib/tasker/state_machine/task_state_machine.rb +192 -0
  560. data/lib/tasker/state_machine.rb +83 -0
  561. data/lib/tasker/step_handler/api.rb +410 -0
  562. data/lib/tasker/step_handler/base.rb +206 -0
  563. data/lib/tasker/task_builder.rb +432 -0
  564. data/lib/tasker/task_handler/class_methods.rb +327 -0
  565. data/lib/tasker/task_handler/instance_methods.rb +293 -0
  566. data/lib/tasker/task_handler/step_group.rb +182 -0
  567. data/lib/tasker/task_handler.rb +43 -0
  568. data/lib/tasker/telemetry/event_mapping.rb +126 -0
  569. data/lib/tasker/telemetry/event_router.rb +318 -0
  570. data/lib/tasker/telemetry/events/export_events.rb +38 -0
  571. data/lib/tasker/telemetry/export_coordinator.rb +497 -0
  572. data/lib/tasker/telemetry/intelligent_cache_manager.rb +508 -0
  573. data/lib/tasker/telemetry/log_backend.rb +224 -0
  574. data/lib/tasker/telemetry/metric_types.rb +416 -0
  575. data/lib/tasker/telemetry/metrics_backend.rb +1227 -0
  576. data/lib/tasker/telemetry/metrics_export_service.rb +392 -0
  577. data/lib/tasker/telemetry/plugin_registry.rb +333 -0
  578. data/lib/tasker/telemetry/plugins/base_exporter.rb +246 -0
  579. data/lib/tasker/telemetry/plugins/csv_exporter.rb +198 -0
  580. data/lib/tasker/telemetry/plugins/json_exporter.rb +141 -0
  581. data/lib/tasker/telemetry/prometheus_exporter.rb +249 -0
  582. data/lib/tasker/telemetry/trace_backend.rb +186 -0
  583. data/lib/tasker/telemetry.rb +59 -0
  584. data/lib/tasker/types/auth_config.rb +81 -0
  585. data/lib/tasker/types/backoff_config.rb +142 -0
  586. data/lib/tasker/types/cache_config.rb +257 -0
  587. data/lib/tasker/types/database_config.rb +39 -0
  588. data/lib/tasker/types/dependency_graph.rb +225 -0
  589. data/lib/tasker/types/dependency_graph_config.rb +149 -0
  590. data/lib/tasker/types/engine_config.rb +131 -0
  591. data/lib/tasker/types/execution_config.rb +289 -0
  592. data/lib/tasker/types/health_config.rb +84 -0
  593. data/lib/tasker/types/step_sequence.rb +24 -0
  594. data/lib/tasker/types/step_template.rb +63 -0
  595. data/lib/tasker/types/task_request.rb +60 -0
  596. data/lib/tasker/types/telemetry_config.rb +273 -0
  597. data/lib/tasker/types.rb +64 -0
  598. data/lib/tasker/version.rb +8 -0
  599. data/lib/tasker.rb +82 -0
  600. data/lib/tasks/tasker_tasks.rake +383 -0
  601. metadata +954 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: fde3286281cb8207b0ff8b4fd869af97c99694ce5cff7e81769bf43bee86cf3a
4
+ data.tar.gz: 3e89558b96d0888936ee09b4e3459c408bd16e76582a2b5e0d2195af26048498
5
+ SHA512:
6
+ metadata.gz: 1a28755986bc08a1e9957e6ab5bbc8722c814351658181af811a8e72d5f0cfd13a0035e4b2eb7d68658695af1fef84375cf3f3380e86d9c483df32b77a121ec7
7
+ data.tar.gz: c63989cc7763b9218479ac73c01a7aab3cc7c61002dfd205efe4e0f516a8b2ee56811b3b7c717e28df1b83dd724fa74bc720b0fc08b061e9c1ce429356d83651
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright 2021 Pete Taylor
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,440 @@
1
+ [![CI](https://github.com/tasker-systems/tasker/actions/workflows/main.yml/badge.svg)](https://github.com/tasker-systems/tasker/actions/workflows/main.yml)
2
+ ![GitHub](https://img.shields.io/github/license/tasker-systems/tasker)
3
+ ![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/tasker-systems/tasker?color=blue&sort=semver)
4
+ [![GitBook](https://img.shields.io/static/v1?message=Documented%20on%20GitBook&logo=gitbook&logoColor=ffffff&label=%20&labelColor=5c5c5c&color=3F89A1)](https://www.gitbook.com/preview?utm_source=gitbook_readme_badge&utm_medium=organic&utm_campaign=preview_documentation&utm_content=link)
5
+
6
+ # Tasker: Making Complex Workflows Easy-ish
7
+
8
+ ## What is Tasker?
9
+
10
+ Tasker is a **production-ready Rails engine** that transforms complex, multi-step processes into reliable, observable workflows. It handles the orchestration complexity so you can focus on your business logic.
11
+
12
+ ### 🚀 Key Capabilities
13
+ - **Complex Workflow Patterns**: Linear, diamond, tree, and parallel merge workflows
14
+ - **Intelligent Retry Logic**: Exponential backoff with configurable retry limits
15
+ - **Production Resilience**: Automatic failure recovery and retry orchestration
16
+ - **Complete Observability**: Event-driven architecture with comprehensive telemetry
17
+ - **Enterprise Security**: Authentication & authorization with GraphQL operation-level permissions
18
+ - **High Performance**: SQL-function based orchestration with 4x performance gains
19
+ - **Thread-Safe Registry Systems**: Enterprise-grade registry architecture with structured logging
20
+ - **Advanced Plugin Architecture**: Extensible plugin system with format-based discovery
21
+
22
+ Perfect for processes that involve multiple interdependent steps, require automatic retries, need visibility into progress and errors, and must handle transient failures gracefully.
23
+
24
+ ## Quick Installation
25
+
26
+ ### Option 1: Add to Existing Rails App
27
+
28
+ Add Tasker to your Rails app's `Gemfile`:
29
+
30
+ ```ruby
31
+ gem 'tasker-engine', '~> 0.1.0'
32
+ ```
33
+
34
+ Install and run the migrations:
35
+
36
+ ```bash
37
+ bundle exec rails tasker:install:migrations
38
+ bundle exec rails tasker:install:database_objects
39
+ bundle exec rails db:migrate
40
+ ```
41
+
42
+ Mount the engine and set up configuration:
43
+
44
+ ```ruby
45
+ # config/routes.rb
46
+ Rails.application.routes.draw do
47
+ mount Tasker::Engine, at: '/tasker', as: 'tasker'
48
+ end
49
+ ```
50
+
51
+ ```bash
52
+ bundle exec rails tasker:setup
53
+ ```
54
+
55
+ ### Option 2: Generate Complete Application
56
+
57
+ Create a production-ready Rails application with Tasker integration in one command:
58
+
59
+ ```bash
60
+ # Traditional setup
61
+ curl -fsSL https://raw.githubusercontent.com/tasker-systems/tasker/main/scripts/install-tasker-app.sh | bash
62
+
63
+ # Docker-based development environment
64
+ curl -fsSL https://raw.githubusercontent.com/tasker-systems/tasker/main/scripts/install-tasker-app.sh | bash -s -- \
65
+ --app-name my-tasker-app \
66
+ --docker \
67
+ --with-observability
68
+ ```
69
+
70
+ Includes complete application templates for e-commerce, inventory management, and customer onboarding workflows. See [Application Generator Guide](docs/APPLICATION_GENERATOR.md) for details.
71
+
72
+ ## Core Concepts
73
+
74
+ Tasker organizes workflows around these key concepts:
75
+
76
+ - **Tasks**: The overall process to be executed
77
+ - **TaskNamespaces**: Organizational hierarchy for grouping related task types
78
+ - **TaskHandlers**: Classes that define and coordinate workflow steps
79
+ - **Steps**: Individual units of work within a task
80
+ - **StepHandlers**: Classes that implement the logic for each step
81
+ - **Dependencies**: Relationships between steps that determine execution order
82
+ - **Versioning**: Semantic versioning support for task handlers with coexistence
83
+
84
+ ### TaskNamespace Organization
85
+
86
+ Tasker supports organizing task handlers into logical namespaces for better organization and isolation:
87
+
88
+ ```ruby
89
+ # Different namespaces can have tasks with the same name
90
+ payments_task = Tasker::HandlerFactory.instance.get(
91
+ 'process_order',
92
+ namespace_name: 'payments',
93
+ version: '2.1.0'
94
+ )
95
+
96
+ inventory_task = Tasker::HandlerFactory.instance.get(
97
+ 'process_order',
98
+ namespace_name: 'inventory',
99
+ version: '1.5.0'
100
+ )
101
+ ```
102
+
103
+ Common namespace patterns:
104
+ - **`payments`** - Payment processing workflows
105
+ - **`inventory`** - Stock and inventory management
106
+ - **`notifications`** - Email, SMS, and alert workflows
107
+ - **`integrations`** - Third-party API integrations
108
+ - **`data_processing`** - ETL and data transformation workflows
109
+ - **`default`** - General-purpose workflows (used when no namespace specified)
110
+
111
+ ## Simple Example: Order Processing
112
+
113
+ Create a task handler for processing orders:
114
+
115
+ ```bash
116
+ rails generate tasker:task_handler OrderProcess
117
+ ```
118
+
119
+ This creates a complete workflow structure:
120
+
121
+ **YAML Configuration** (`config/tasker/tasks/order_process.yaml`):
122
+ ```yaml
123
+ ---
124
+ name: order_process
125
+ namespace_name: default
126
+ version: 0.1.0
127
+ task_handler_class: OrderProcess
128
+
129
+ step_templates:
130
+ - name: validate_order
131
+ description: Validate order details
132
+ handler_class: OrderProcess::StepHandler::ValidateOrderHandler
133
+
134
+ - name: process_payment
135
+ description: Process payment for the order
136
+ depends_on_step: validate_order
137
+ handler_class: OrderProcess::StepHandler::ProcessPaymentHandler
138
+ default_retryable: true
139
+ default_retry_limit: 3
140
+
141
+ - name: send_confirmation
142
+ description: Send confirmation email
143
+ depends_on_step: process_payment
144
+ handler_class: OrderProcess::StepHandler::SendConfirmationHandler
145
+ ```
146
+
147
+ **Step Handler Implementation**:
148
+ ```ruby
149
+ module OrderProcess
150
+ module StepHandler
151
+ class ValidateOrderHandler < Tasker::StepHandler::Base
152
+ def process(task, sequence, step)
153
+ order_id = task.context['order_id']
154
+ order = Order.find(order_id)
155
+
156
+ raise "Order not found" unless order
157
+ raise "Order already processed" if order.processed?
158
+
159
+ { order: order.as_json, valid: true }
160
+ end
161
+ end
162
+ end
163
+ end
164
+ ```
165
+
166
+ **Using Your Workflow**:
167
+ ```ruby
168
+ # Create and execute a task
169
+ task_request = Tasker::Types::TaskRequest.new(
170
+ name: 'order_process',
171
+ namespace: 'default', # Optional - defaults to 'default'
172
+ version: '0.1.0', # Optional - defaults to '0.1.0'
173
+ context: { order_id: 12345 }
174
+ )
175
+
176
+ # Handler lookup now supports namespace + version
177
+ handler = Tasker::HandlerFactory.instance.get(
178
+ 'order_process',
179
+ namespace_name: 'default', # Optional - defaults to 'default'
180
+ version: '0.1.0' # Optional - defaults to '0.1.0'
181
+ )
182
+ task = handler.initialize_task!(task_request)
183
+
184
+ # Task is now queued for processing with automatic retry logic
185
+ ```
186
+
187
+ ## Advanced Features
188
+
189
+ ### Authentication & Authorization
190
+
191
+ Tasker includes enterprise-grade security that works with any Rails authentication system:
192
+
193
+ ```ruby
194
+ # config/initializers/tasker.rb
195
+ Tasker::Configuration.configuration do |config|
196
+ config.auth do |auth|
197
+ auth.authentication_enabled = true
198
+ auth.authenticator_class = 'YourAuthenticator'
199
+ auth.authorization_enabled = true
200
+ auth.authorization_coordinator_class = 'YourAuthorizationCoordinator'
201
+ end
202
+ end
203
+ ```
204
+
205
+ **Automatic GraphQL Security**: Operations are automatically mapped to permissions:
206
+ ```ruby
207
+ # GraphQL query automatically requires tasker.task:index permission
208
+ query { tasks { taskId status } }
209
+
210
+ # GraphQL mutation automatically requires tasker.task:create permission
211
+ mutation { createTask(input: { name: "New Task" }) { taskId } }
212
+ ```
213
+
214
+ ### REST API & Handler Discovery
215
+
216
+ Tasker provides comprehensive REST API endpoints for handler discovery, task management, and dependency graph analysis:
217
+
218
+ **Handler Discovery API**:
219
+ ```bash
220
+ # List all namespaces with handler counts
221
+ curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
222
+ https://your-app.com/tasker/handlers
223
+
224
+ # List handlers in specific namespace
225
+ curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
226
+ https://your-app.com/tasker/handlers/payments
227
+
228
+ # Get handler details with dependency graph
229
+ curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
230
+ https://your-app.com/tasker/handlers/payments/process_order?version=2.1.0
231
+ ```
232
+
233
+ **Response includes dependency graph visualization**:
234
+ ```json
235
+ {
236
+ "id": "process_order",
237
+ "namespace": "payments",
238
+ "version": "2.1.0",
239
+ "step_templates": [...],
240
+ "dependency_graph": {
241
+ "nodes": ["validate_order", "process_payment", "send_confirmation"],
242
+ "edges": [
243
+ {"from": "validate_order", "to": "process_payment"},
244
+ {"from": "process_payment", "to": "send_confirmation"}
245
+ ],
246
+ "execution_order": ["validate_order", "process_payment", "send_confirmation"]
247
+ }
248
+ }
249
+ ```
250
+
251
+ **Task Management API**:
252
+ ```bash
253
+ # Create task with namespace/version support
254
+ curl -X POST -H "Authorization: Bearer YOUR_JWT_TOKEN" \
255
+ -H "Content-Type: application/json" \
256
+ -d '{"name": "process_order", "namespace": "payments", "version": "2.1.0", "context": {"order_id": 123}}' \
257
+ https://your-app.com/tasker/tasks
258
+
259
+ # List tasks with namespace filtering
260
+ curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
261
+ "https://your-app.com/tasker/tasks?namespace=payments&version=2.1.0"
262
+ ```
263
+
264
+ ### Event System & Integrations
265
+
266
+ Tasker provides comprehensive event-driven observability for custom integrations:
267
+
268
+ ```ruby
269
+ class OrderEventsSubscriber < Tasker::Events::Subscribers::BaseSubscriber
270
+ subscribe_to 'task.completed', 'task.failed'
271
+
272
+ def handle_task_completed(event)
273
+ task_id = safe_get(event, :task_id)
274
+ NotificationService.send_success_email(task_id: task_id)
275
+ end
276
+
277
+ def handle_task_failed(event)
278
+ task_id = safe_get(event, :task_id)
279
+ error_message = safe_get(event, :error_message)
280
+ AlertService.send_failure_alert(task_id: task_id, error: error_message)
281
+ end
282
+ end
283
+ ```
284
+
285
+ ### Telemetry & Observability
286
+
287
+ Built-in OpenTelemetry integration provides complete observability:
288
+
289
+ ```ruby
290
+ # config/initializers/tasker.rb
291
+ Tasker::Configuration.configuration do |config|
292
+ config.telemetry do |tel|
293
+ tel.enabled = true
294
+ tel.service_name = 'my-app-workflows'
295
+ tel.service_version = '0.1.0'
296
+ end
297
+ end
298
+ ```
299
+
300
+ Compatible with Jaeger, Zipkin, Honeycomb, and other OpenTelemetry-compatible tools.
301
+
302
+ ### Registry System Architecture
303
+
304
+ Tasker features enterprise-grade registry systems with thread-safe operations and comprehensive observability:
305
+
306
+ **Thread-Safe Registries**:
307
+ - **HandlerFactory**: Thread-safe task handler registration with `Concurrent::Hash` storage
308
+ - **PluginRegistry**: Format-based plugin discovery with auto-discovery capabilities
309
+ - **SubscriberRegistry**: Event subscriber management with structured logging
310
+
311
+ **Advanced Features**:
312
+ - **Structured Logging**: Correlation IDs and JSON formatting for comprehensive observability
313
+ - **Interface Validation**: Fail-fast validation with detailed error messages
314
+ - **Replace Operations**: Conflict resolution with `replace: true` parameter
315
+ - **Event Integration**: Registry operations fully integrated with the 56-event system
316
+
317
+ **Production Benefits**:
318
+ ```ruby
319
+ # Thread-safe operations with structured logging
320
+ Tasker::HandlerFactory.instance.register(
321
+ 'order_processor',
322
+ OrderHandler,
323
+ namespace_name: 'payments',
324
+ version: '2.1.0',
325
+ replace: true # Handles conflicts gracefully
326
+ )
327
+
328
+ # Automatic structured logging with correlation IDs
329
+ # {"timestamp":"2024-01-15T10:30:45Z","correlation_id":"tsk_abc123","component":"handler_factory","message":"Registry item registered","entity_id":"payments/order_processor/2.1.0","event_type":"registered"}
330
+ ```
331
+
332
+ ### Health Monitoring & Production Readiness
333
+
334
+ Tasker provides enterprise-grade health endpoints for production deployments:
335
+
336
+ ```ruby
337
+ # Kubernetes readiness probe - checks database connectivity
338
+ GET /tasker/health/ready
339
+
340
+ # Kubernetes liveness probe - lightweight health check
341
+ GET /tasker/health/live
342
+
343
+ # Detailed status endpoint - comprehensive system metrics
344
+ GET /tasker/health/status
345
+ ```
346
+
347
+ **Optional Authentication & Authorization**:
348
+ ```ruby
349
+ # config/initializers/tasker.rb
350
+ Tasker::Configuration.configuration do |config|
351
+ config.health do |health|
352
+ health.status_requires_authentication = true # Secure detailed status
353
+ end
354
+
355
+ config.auth do |auth|
356
+ auth.authorization_enabled = true
357
+ # Status endpoint requires tasker.health_status:index permission
358
+ end
359
+ end
360
+ ```
361
+
362
+ **Performance Optimized**: Uses SQL functions and 15-second caching for sub-100ms response times.
363
+
364
+ ## Key Benefits
365
+
366
+ ### For Developers
367
+ - **Quick Setup**: Working workflows in minutes with generators
368
+ - **Clear Structure**: YAML configuration with Ruby implementation
369
+ - **Comprehensive Testing**: Built-in test infrastructure and patterns
370
+ - **Rich Documentation**: Extensive guides and examples
371
+
372
+ ### For Operations
373
+ - **Production Ready**: Battle-tested retry logic and error handling
374
+ - **Health Monitoring**: Enterprise-grade health endpoints for K8s and load balancers
375
+ - **Observable**: Complete event system with telemetry integration
376
+ - **Secure**: Enterprise-grade authentication and authorization
377
+ - **Performant**: SQL-function based orchestration with proven performance
378
+ - **Thread-Safe**: Concurrent registry operations with structured logging and correlation IDs
379
+ - **Reliable**: 100% test coverage with comprehensive validation and error handling
380
+
381
+ ### For Business
382
+ - **Reliable**: Automatic retry with exponential backoff
383
+ - **Scalable**: Handles complex workflows with multiple dependencies
384
+ - **Maintainable**: Clear separation of concerns and documented patterns
385
+ - **Extensible**: Event system enables custom integrations
386
+
387
+ ## What's Next?
388
+
389
+ ### 🚀 Get Started Quickly
390
+ - **[Quick Start Guide](docs/QUICK_START.md)** - Build your first workflow in 15 minutes
391
+ - **[Developer Guide](docs/DEVELOPER_GUIDE.md)** - Comprehensive implementation guide
392
+ - **[Examples](spec/examples/)** - Real-world workflow patterns and implementations
393
+
394
+ ### 🔧 Advanced Topics
395
+ - **[REST API Guide](docs/REST_API.md)** - Complete REST API documentation with handler discovery
396
+ - **[Registry Systems](docs/REGISTRY_SYSTEMS.md)** - Thread-safe registry architecture and structured logging
397
+ - **[Authentication & Authorization](docs/AUTH.md)** - Complete security system
398
+ - **[Health Monitoring](docs/HEALTH.md)** - Production health endpoints and monitoring
399
+ - **[Event System](docs/EVENT_SYSTEM.md)** - Observability and integrations
400
+ - **[Telemetry](docs/TELEMETRY.md)** - OpenTelemetry setup and monitoring
401
+ - **[Performance](docs/SQL_FUNCTIONS.md)** - High-performance SQL functions
402
+ - **[Circuit Breaker](docs/CIRCUIT_BREAKER.md)** - Distributed, SQL-driven retry architecture
403
+
404
+ ### 📚 Additional Resources
405
+ - **[Application Generator](docs/APPLICATION_GENERATOR.md)** - One-line app creation with Docker support and validation
406
+ - **[System Overview](docs/OVERVIEW.md)** - Architecture and configuration
407
+ - **[Troubleshooting](docs/TROUBLESHOOTING.md)** - Common issues and solutions
408
+
409
+ ## Requirements & Dependencies
410
+
411
+ - **Ruby**: 3.2+
412
+ - **Rails**: 7.2+
413
+ - **Database**: PostgreSQL (required for SQL functions)
414
+ - **Background Jobs**: Compatible with ActiveJob (Sidekiq recommended)
415
+
416
+ ## Development & Testing
417
+
418
+ ```bash
419
+ # Set up development environment
420
+ bundle install
421
+ bundle exec rake db:schema:load
422
+
423
+ # Run tests
424
+ bundle exec rspec spec
425
+
426
+ # Run linter
427
+ bundle exec rubocop
428
+ ```
429
+
430
+ ## Contributing
431
+
432
+ We welcome contributions! Please see our [development guidelines](docs/DEVELOPER_GUIDE.md) for information on setting up your development environment and our coding standards.
433
+
434
+ ## License
435
+
436
+ The gem is available as open source under the terms of the [MIT License](./LICENSE).
437
+
438
+ ---
439
+
440
+ **Tasker** transforms complex workflows into reliable, observable processes. Focus on your business logic while Tasker handles the orchestration complexity.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+
5
+ APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
6
+ load 'rails/tasks/engine.rake'
7
+
8
+ load 'rails/tasks/statistics.rake'
9
+
10
+ require 'bundler/gem_tasks'
@@ -0,0 +1,179 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency 'tasker/application_controller'
4
+
5
+ module Tasker
6
+ # Analytics controller providing performance and bottleneck analysis endpoints.
7
+ #
8
+ # This controller provides analytics endpoints:
9
+ # - `/analytics/performance` - System-wide performance metrics with caching
10
+ # - `/analytics/bottlenecks` - Bottleneck analysis scoped by task/version/namespace
11
+ #
12
+ # All endpoints use the authorization system with appropriate permissions.
13
+ # If authorization is disabled, access is allowed. If enabled, users need
14
+ # the corresponding analytics permissions.
15
+ #
16
+ # Analytics calculations are handled by Tasker::AnalyticsService for better
17
+ # separation of concerns.
18
+ class AnalyticsController < ApplicationController
19
+ # Set cache headers to prevent default caching (we use intelligent caching)
20
+ before_action :set_cache_headers
21
+
22
+ # Initialize intelligent cache for expensive analytics operations
23
+ before_action :set_intelligent_cache
24
+
25
+ # Performance analytics endpoint with intelligent caching
26
+ # Provides system-wide performance metrics and trends
27
+ #
28
+ # @return [JSON] Performance metrics and analytics
29
+ def performance
30
+ cache_key = "tasker:analytics:performance:#{performance_cache_version}"
31
+
32
+ cached_result = @intelligent_cache.intelligent_fetch(cache_key, base_ttl: 90.seconds) do
33
+ performance_analytics = Tasker::AnalyticsService.calculate_performance_analytics
34
+
35
+ {
36
+ **performance_analytics.to_h,
37
+ cache_info: {
38
+ cached: true,
39
+ cache_key: cache_key,
40
+ ttl_base: '90 seconds'
41
+ }
42
+ }
43
+ end
44
+
45
+ render json: cached_result, status: :ok
46
+ rescue StandardError => e
47
+ render json: {
48
+ error: 'Performance analytics failed',
49
+ message: e.message,
50
+ timestamp: Time.current.iso8601
51
+ }, status: :service_unavailable
52
+ end
53
+
54
+ # Bottleneck analysis endpoint scoped by task parameters
55
+ # Provides bottleneck analysis for specific task contexts
56
+ #
57
+ # Query parameters:
58
+ # - namespace: Filter by task namespace (optional)
59
+ # - name: Filter by task name (optional)
60
+ # - version: Filter by task version (optional)
61
+ # - period: Analysis period in hours (default: 24)
62
+ #
63
+ # @return [JSON] Bottleneck analysis for specified scope
64
+ def bottlenecks
65
+ # Extract and validate scope parameters
66
+ scope_params = extract_scope_parameters
67
+ analysis_period = params[:period]&.to_i || 24
68
+
69
+ # Generate cache key based on scope and period
70
+ cache_key = "tasker:analytics:bottlenecks:#{bottlenecks_cache_version(scope_params, analysis_period)}"
71
+
72
+ cached_result = @intelligent_cache.intelligent_fetch(cache_key, base_ttl: 2.minutes) do
73
+ bottleneck_analytics = Tasker::AnalyticsService.calculate_bottleneck_analytics(
74
+ scope_params,
75
+ analysis_period
76
+ )
77
+
78
+ {
79
+ **bottleneck_analytics.to_h,
80
+ cache_info: {
81
+ cached: true,
82
+ cache_key: cache_key,
83
+ ttl_base: '2 minutes'
84
+ }
85
+ }
86
+ end
87
+
88
+ render json: cached_result, status: :ok
89
+ rescue StandardError => e
90
+ render json: {
91
+ error: 'Bottleneck analysis failed',
92
+ message: e.message,
93
+ scope: extract_scope_parameters,
94
+ timestamp: Time.current.iso8601
95
+ }, status: :service_unavailable
96
+ end
97
+
98
+ private
99
+
100
+ def set_intelligent_cache
101
+ @intelligent_cache = Tasker::Telemetry::IntelligentCacheManager.new
102
+ end
103
+
104
+ # Extract and validate scope parameters for bottleneck analysis
105
+ #
106
+ # @return [Hash] Validated scope parameters
107
+ def extract_scope_parameters
108
+ scope = {}
109
+ scope[:namespace] = params[:namespace] if params[:namespace].present?
110
+ scope[:name] = params[:name] if params[:name].present?
111
+ scope[:version] = params[:version] if params[:version].present?
112
+ scope
113
+ end
114
+
115
+ # Generate cache version for performance analytics
116
+ #
117
+ # @return [String] Cache version that changes when system state changes
118
+ def performance_cache_version
119
+ current_10min_interval = "#{Time.current.strftime('%Y%m%d%H%M')[0..-2]}0" # Round to 10-minute intervals
120
+
121
+ # Include recent activity indicators for cache invalidation
122
+ recent_tasks = Task.created_since(30.minutes.ago).count
123
+ recent_completions = WorkflowStep.completed_since(30.minutes.ago).count
124
+
125
+ "v1:#{current_10min_interval}:#{recent_tasks}:#{recent_completions}"
126
+ end
127
+
128
+ # Generate cache version for bottleneck analysis
129
+ #
130
+ # @param scope_params [Hash] Scope parameters for the analysis
131
+ # @param period [Integer] Analysis period in hours
132
+ # @return [String] Cache version for bottleneck analysis
133
+ def bottlenecks_cache_version(scope_params, period)
134
+ current_10min_interval = "#{Time.current.strftime('%Y%m%d%H%M')[0..-2]}0" # Round to 10-minute intervals
135
+ scope_hash = scope_params.values.join('_').presence || 'all'
136
+
137
+ "v1:#{current_10min_interval}:#{scope_hash}:#{period}h"
138
+ end
139
+
140
+ # Override the resource name for authorization
141
+ # Maps analytics actions to analytics resource
142
+ #
143
+ # @return [String] The resource name for authorization
144
+ def tasker_resource_name
145
+ Tasker::Authorization::ResourceConstants::RESOURCES::ANALYTICS
146
+ end
147
+
148
+ # Override the action name for authorization
149
+ # Maps all actions to index permission for analytics
150
+ #
151
+ # @return [Symbol] The action name for authorization
152
+ def tasker_action_name
153
+ Tasker::Authorization::ResourceConstants::ACTIONS::INDEX
154
+ end
155
+
156
+ # Override authentication check for analytics endpoint
157
+ # Uses telemetry configuration for consistency with metrics
158
+ #
159
+ # @return [Boolean] True if authentication should be skipped
160
+ def skip_authentication?
161
+ !Tasker::Configuration.configuration.telemetry.metrics_auth_required
162
+ end
163
+
164
+ # Override authorization check for analytics endpoint
165
+ # Uses telemetry configuration for consistency with metrics
166
+ #
167
+ # @return [Boolean] True if authorization should be skipped
168
+ def skip_authorization?
169
+ !Tasker::Configuration.configuration.telemetry.metrics_auth_required
170
+ end
171
+
172
+ # Set appropriate cache control headers for analytics endpoints
173
+ def set_cache_headers
174
+ response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
175
+ response.headers['Pragma'] = 'no-cache'
176
+ response.headers['Expires'] = '0'
177
+ end
178
+ end
179
+ end