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,168 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ # == Schema Information
5
+ #
6
+ # Table name: tasks
7
+ #
8
+ # bypass_steps :json
9
+ # complete :boolean default(FALSE), not null
10
+ # context :jsonb
11
+ # identity_hash :string(128) not null
12
+ # initiator :string(128)
13
+ # reason :string(128)
14
+ # requested_at :datetime not null
15
+ # source_system :string(128)
16
+ # status :string(64) not null
17
+ # tags :jsonb
18
+ # created_at :datetime not null
19
+ # updated_at :datetime not null
20
+ # named_task_id :integer not null
21
+ # task_id :bigint not null, primary key
22
+ #
23
+ # Indexes
24
+ #
25
+ # index_tasks_on_identity_hash (identity_hash) UNIQUE
26
+ # tasks_context_idx (context) USING gin
27
+ # tasks_context_idx1 (context) USING gin
28
+ # tasks_identity_hash_index (identity_hash)
29
+ # tasks_named_task_id_index (named_task_id)
30
+ # tasks_requested_at_index (requested_at)
31
+ # tasks_source_system_index (source_system)
32
+ # tasks_status_index (status)
33
+ # tasks_tags_idx (tags) USING gin
34
+ # tasks_tags_idx1 (tags) USING gin
35
+ #
36
+ # Foreign Keys
37
+ #
38
+ # tasks_named_task_id_foreign (named_task_id => named_tasks.named_task_id)
39
+ #
40
+
41
+ module Tasker
42
+ class TaskSerializer < ActiveModel::Serializer
43
+ attributes :task_id, :name, :namespace, :version, :full_name, :initiator, :source_system, :context, :reason,
44
+ :bypass_steps, :tags, :requested_at, :complete, :status
45
+ has_many :workflow_steps
46
+ has_many :task_annotations
47
+
48
+ # Conditional attribute for dependency analysis
49
+ attribute :dependency_analysis, if: :include_dependency_analysis?
50
+
51
+ def namespace
52
+ object.named_task&.task_namespace&.name || 'default'
53
+ end
54
+
55
+ def version
56
+ object.named_task&.version || '0.1.0'
57
+ end
58
+
59
+ def full_name
60
+ "#{namespace}.#{object.named_task&.name}@#{version}"
61
+ end
62
+
63
+ # Check if dependency analysis should be included
64
+ def include_dependency_analysis?
65
+ instance_options[:include_dependencies] == true
66
+ end
67
+
68
+ # Generate dependency analysis
69
+ def dependency_analysis
70
+ # Get comprehensive dependency analysis from the runtime analyzer
71
+ analysis = object.dependency_graph
72
+
73
+ {
74
+ dependency_graph: analysis[:dependency_graph],
75
+ critical_paths: analysis[:critical_paths],
76
+ parallelism_opportunities: analysis[:parallelism_opportunities],
77
+ error_chains: analysis[:error_chains],
78
+ bottlenecks: analysis[:bottlenecks],
79
+ analysis_timestamp: Time.current.iso8601,
80
+ task_execution_summary: build_execution_summary(analysis)
81
+ }
82
+ rescue StandardError => e
83
+ # Graceful fallback if dependency analysis fails
84
+ {
85
+ error: "Dependency analysis failed: #{e.message}",
86
+ analysis_timestamp: Time.current.iso8601
87
+ }
88
+ end
89
+
90
+ private
91
+
92
+ # Build a high-level execution summary from dependency analysis
93
+ #
94
+ # @param dependency_analysis [Hash] The full dependency analysis from RuntimeGraphAnalyzer
95
+ # @return [Hash] High-level summary of task execution state and recommendations
96
+ def build_execution_summary(dependency_analysis)
97
+ graph = dependency_analysis[:dependency_graph]
98
+ critical_paths = dependency_analysis[:critical_paths]
99
+ bottlenecks = dependency_analysis[:bottlenecks]
100
+ parallelism = dependency_analysis[:parallelism_opportunities]
101
+ error_chains = dependency_analysis[:error_chains]
102
+
103
+ {
104
+ total_steps: graph[:nodes]&.size || 0,
105
+ total_dependencies: graph[:edges]&.size || 0,
106
+ dependency_levels: graph[:dependency_levels]&.keys&.size || 0,
107
+ longest_path_length: critical_paths[:longest_path_length] || 0,
108
+ critical_bottlenecks_count: bottlenecks[:critical_bottlenecks]&.size || 0,
109
+ error_chains_count: error_chains[:error_chains]&.size || 0,
110
+ parallelism_efficiency: parallelism[:overall_efficiency] || 0,
111
+ overall_health: determine_overall_health(dependency_analysis),
112
+ recommendations: build_recommendations(dependency_analysis)
113
+ }
114
+ end
115
+
116
+ # Determine overall task health based on dependency analysis
117
+ #
118
+ # @param dependency_analysis [Hash] The full dependency analysis
119
+ # @return [String] Health status: 'healthy', 'warning', 'critical'
120
+ def determine_overall_health(dependency_analysis)
121
+ bottlenecks = dependency_analysis[:bottlenecks]
122
+ error_chains = dependency_analysis[:error_chains]
123
+
124
+ critical_bottlenecks_count = bottlenecks[:critical_bottlenecks]&.size || 0
125
+ error_count = error_chains[:error_chains]&.size || 0
126
+
127
+ if critical_bottlenecks_count.positive? || error_count.positive?
128
+ 'critical'
129
+ elsif bottlenecks[:bottlenecks].is_a?(Array) && bottlenecks[:bottlenecks].any? { |b| b[:severity] == 'High' }
130
+ 'warning'
131
+ else
132
+ 'healthy'
133
+ end
134
+ end
135
+
136
+ # Build actionable recommendations based on dependency analysis
137
+ #
138
+ # @param dependency_analysis [Hash] The full dependency analysis
139
+ # @return [Array<String>] Array of recommendation strings
140
+ def build_recommendations(dependency_analysis)
141
+ recommendations = []
142
+
143
+ bottlenecks = dependency_analysis[:bottlenecks]
144
+ error_chains = dependency_analysis[:error_chains]
145
+ parallelism = dependency_analysis[:parallelism_opportunities]
146
+
147
+ # Bottleneck recommendations
148
+ if bottlenecks[:critical_bottlenecks].is_a?(Array) && bottlenecks[:critical_bottlenecks].any?
149
+ recommendations << 'Address critical bottlenecks to unblock task execution'
150
+ end
151
+
152
+ # Error chain recommendations
153
+ if error_chains[:error_chains].is_a?(Array) && error_chains[:error_chains].any?
154
+ recommendations << 'Resolve error chains to prevent further failures'
155
+ end
156
+
157
+ # Parallelism recommendations
158
+ if parallelism[:overall_efficiency] && parallelism[:overall_efficiency] < 0.5
159
+ recommendations << 'Consider optimizing step dependencies to improve parallelism'
160
+ end
161
+
162
+ # Default recommendation if no issues found
163
+ recommendations << 'Task execution appears healthy' if recommendations.empty?
164
+
165
+ recommendations
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,27 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module Tasker
5
+ class WorkflowStepSerializer < ActiveModel::Serializer
6
+ attributes :task_id, :workflow_step_id, :name, :named_step_id, :status, :attempts, :skippable,
7
+ :retryable, :retry_limit, :processed, :processed_at, :in_process, :backoff_request_seconds,
8
+ :last_attempted_at, :inputs, :results,
9
+ :children_ids, :parents_ids, :siblings_ids
10
+
11
+ def children_ids
12
+ # Use scenic view for efficient parent/child lookups - eliminates N+1 queries
13
+ object.step_dag_relationship&.child_step_ids_array || []
14
+ end
15
+
16
+ def parents_ids
17
+ # Use scenic view for efficient parent/child lookups - eliminates N+1 queries
18
+ object.step_dag_relationship&.parent_step_ids_array || []
19
+ end
20
+
21
+ def siblings_ids
22
+ # Use existing WorkflowStepEdge siblings logic - finds steps with exact same parent set
23
+ # This is more accurate than just shared parents and leverages well-tested code
24
+ WorkflowStepEdge.siblings_of(object).pluck(:to_step_id)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,409 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tasker
4
+ # Service class for analytics calculations and data aggregation
5
+ #
6
+ # This service encapsulates the complex analytics logic that was previously
7
+ # in the analytics controller, providing a clean separation of concerns.
8
+ # It handles performance metrics, bottleneck analysis, and data aggregation
9
+ # using both SQL functions and ActiveRecord scopes.
10
+ class AnalyticsService
11
+ # Performance analytics data structure
12
+ class PerformanceAnalytics
13
+ attr_reader :system_overview, :performance_trends, :telemetry_insights, :generated_at
14
+
15
+ def initialize(system_overview:, performance_trends:, telemetry_insights:)
16
+ @system_overview = system_overview
17
+ @performance_trends = performance_trends
18
+ @telemetry_insights = telemetry_insights
19
+ @generated_at = Time.current
20
+ end
21
+
22
+ def to_h
23
+ {
24
+ system_overview: system_overview,
25
+ performance_trends: performance_trends,
26
+ telemetry_insights: telemetry_insights,
27
+ generated_at: generated_at
28
+ }
29
+ end
30
+ end
31
+
32
+ # Bottleneck analytics data structure
33
+ class BottleneckAnalytics
34
+ attr_reader :scope_summary, :bottleneck_analysis, :performance_distribution,
35
+ :recommendations, :scope, :analysis_period_hours, :generated_at
36
+
37
+ def initialize(scope_summary:, bottleneck_analysis:, performance_distribution:,
38
+ recommendations:, scope:, analysis_period_hours:)
39
+ @scope_summary = scope_summary
40
+ @bottleneck_analysis = bottleneck_analysis
41
+ @performance_distribution = performance_distribution
42
+ @recommendations = recommendations
43
+ @scope = scope
44
+ @analysis_period_hours = analysis_period_hours
45
+ @generated_at = Time.current
46
+ end
47
+
48
+ def to_h
49
+ {
50
+ scope_summary: scope_summary,
51
+ bottleneck_analysis: bottleneck_analysis,
52
+ performance_distribution: performance_distribution,
53
+ recommendations: recommendations,
54
+ scope: scope,
55
+ analysis_period_hours: analysis_period_hours,
56
+ generated_at: generated_at
57
+ }
58
+ end
59
+ end
60
+
61
+ # Calculate comprehensive performance analytics using SQL functions
62
+ #
63
+ # @return [PerformanceAnalytics] Performance analytics data
64
+ def self.calculate_performance_analytics
65
+ analysis_periods = {
66
+ last_hour: 1.hour.ago,
67
+ last_4_hours: 4.hours.ago,
68
+ last_24_hours: 24.hours.ago
69
+ }
70
+
71
+ # Use the analytics metrics SQL function for efficient data retrieval
72
+ base_metrics = Tasker::Functions::FunctionBasedAnalyticsMetrics.call
73
+
74
+ system_overview = {
75
+ active_tasks: base_metrics.active_tasks_count,
76
+ total_namespaces: base_metrics.total_namespaces_count,
77
+ unique_task_types: base_metrics.unique_task_types_count,
78
+ system_health_score: base_metrics.system_health_score
79
+ }
80
+
81
+ performance_trends = {}
82
+ # Calculate trends for each time period using SQL functions
83
+ analysis_periods.each do |period_name, since_time|
84
+ period_metrics = Tasker::Functions::FunctionBasedAnalyticsMetrics.call(since_time)
85
+ performance_trends[period_name] = {
86
+ task_throughput: period_metrics.task_throughput,
87
+ completion_rate: period_metrics.completion_rate,
88
+ error_rate: period_metrics.error_rate,
89
+ avg_task_duration: period_metrics.avg_task_duration,
90
+ avg_step_duration: period_metrics.avg_step_duration,
91
+ step_throughput: period_metrics.step_throughput
92
+ }
93
+ end
94
+
95
+ telemetry_insights = calculate_telemetry_insights
96
+
97
+ PerformanceAnalytics.new(
98
+ system_overview: system_overview,
99
+ performance_trends: performance_trends,
100
+ telemetry_insights: telemetry_insights
101
+ )
102
+ end
103
+
104
+ # Calculate bottleneck analytics for specified scope and period using SQL functions
105
+ #
106
+ # @param scope_params [Hash] Scope parameters (namespace, name, version)
107
+ # @param period_hours [Integer] Analysis period in hours
108
+ # @return [BottleneckAnalytics] Bottleneck analysis data
109
+ def self.calculate_bottleneck_analytics(scope_params, period_hours)
110
+ since_time = period_hours.hours.ago
111
+
112
+ # Use SQL functions for efficient bottleneck analysis with fallbacks
113
+ slowest_tasks = fetch_slowest_tasks(scope_params, since_time)
114
+ slowest_steps = fetch_slowest_steps(scope_params, since_time)
115
+
116
+ scope_summary = calculate_scope_summary(scope_params, period_hours)
117
+ bottleneck_analysis = {
118
+ slowest_tasks: slowest_tasks,
119
+ slowest_steps: slowest_steps,
120
+ error_patterns: analyze_error_patterns(scope_params, since_time),
121
+ dependency_bottlenecks: analyze_dependency_bottlenecks(scope_params, since_time)
122
+ }
123
+
124
+ performance_distribution = calculate_performance_distribution(scope_params, since_time)
125
+ recommendations = generate_recommendations(slowest_tasks, slowest_steps)
126
+
127
+ BottleneckAnalytics.new(
128
+ scope_summary: scope_summary,
129
+ bottleneck_analysis: bottleneck_analysis,
130
+ performance_distribution: performance_distribution,
131
+ recommendations: recommendations,
132
+ scope: scope_params,
133
+ analysis_period_hours: period_hours
134
+ )
135
+ end
136
+
137
+ # Calculate telemetry insights from trace and log backends
138
+ #
139
+ # @return [Hash] Telemetry insights
140
+ def self.calculate_telemetry_insights
141
+ trace_backend = Tasker::Telemetry::TraceBackend.instance
142
+ log_backend = Tasker::Telemetry::LogBackend.instance
143
+
144
+ {
145
+ trace_stats: trace_backend.stats,
146
+ log_stats: log_backend.stats,
147
+ event_router_stats: Tasker::Telemetry::EventRouter.instance.routing_stats
148
+ }
149
+ end
150
+
151
+ # Fetch slowest tasks using SQL function with fallback
152
+ #
153
+ # @param scope_params [Hash] Scope parameters
154
+ # @param since_time [Time] Analysis start time
155
+ # @return [Array] Array of slowest task data
156
+ def self.fetch_slowest_tasks(scope_params, since_time)
157
+ result = Tasker::Functions::FunctionBasedSlowestTasks.call(
158
+ since_timestamp: since_time,
159
+ limit_count: 10,
160
+ namespace_filter: scope_params[:namespace],
161
+ task_name_filter: scope_params[:name],
162
+ version_filter: scope_params[:version]
163
+ )
164
+ result.map(&:to_h)
165
+ rescue StandardError => e
166
+ Rails.logger.warn "SQL function FunctionBasedSlowestTasks failed: #{e.message}, using fallback"
167
+ []
168
+ end
169
+
170
+ # Fetch slowest steps using SQL function with fallback
171
+ #
172
+ # @param scope_params [Hash] Scope parameters
173
+ # @param since_time [Time] Analysis start time
174
+ # @return [Array] Array of slowest step data
175
+ def self.fetch_slowest_steps(scope_params, since_time)
176
+ result = Tasker::Functions::FunctionBasedSlowestSteps.call(
177
+ since_timestamp: since_time,
178
+ limit_count: 10,
179
+ namespace_filter: scope_params[:namespace],
180
+ task_name_filter: scope_params[:name],
181
+ version_filter: scope_params[:version]
182
+ )
183
+ result.map(&:to_h)
184
+ rescue StandardError => e
185
+ Rails.logger.warn "SQL function FunctionBasedSlowestSteps failed: #{e.message}, using fallback"
186
+ []
187
+ end
188
+
189
+ # Calculate scope summary using SQL functions and scopes
190
+ #
191
+ # @param scope_params [Hash] Scope parameters
192
+ # @param period_hours [Integer] Analysis period
193
+ # @return [Hash] Scope summary data
194
+ def self.calculate_scope_summary(scope_params, period_hours)
195
+ since_time = period_hours.hours.ago
196
+ scoped_query = build_scoped_query(scope_params, since_time)
197
+
198
+ {
199
+ total_tasks: scoped_query.count,
200
+ unique_task_types: scoped_query.joins(:named_task).distinct.count('tasker_named_tasks.name'),
201
+ time_span_hours: period_hours.to_f
202
+ }
203
+ rescue StandardError => e
204
+ Rails.logger.error "Error in calculate_scope_summary: #{e.message}"
205
+ { total_tasks: 0, unique_task_types: 0, time_span_hours: period_hours.to_f }
206
+ end
207
+
208
+ # Analyze error patterns using model scopes
209
+ #
210
+ # @param scope_params [Hash] Scope parameters
211
+ # @param since_time [Time] Analysis start time
212
+ # @return [Hash] Error pattern analysis
213
+ def self.analyze_error_patterns(scope_params, since_time)
214
+ scoped_query = build_scoped_query(scope_params, since_time)
215
+
216
+ total_tasks = scoped_query.count
217
+ return default_error_pattern if total_tasks.zero?
218
+
219
+ failed_tasks = scoped_query.failed_since(since_time).count
220
+ error_rate = total_tasks.positive? ? (failed_tasks.to_f / total_tasks * 100).round(1) : 0.0
221
+
222
+ {
223
+ total_errors: failed_tasks,
224
+ recent_error_rate: error_rate,
225
+ common_error_types: %w[timeout validation network], # Static for now
226
+ retry_success_rate: calculate_retry_success_rate(scoped_query)
227
+ }
228
+ rescue StandardError => e
229
+ Rails.logger.error "Error in analyze_error_patterns: #{e.message}"
230
+ default_error_pattern
231
+ end
232
+
233
+ # Analyze dependency bottlenecks using model scopes and SQL functions
234
+ #
235
+ # @param scope_params [Hash] Scope parameters
236
+ # @param since_time [Time] Analysis start time
237
+ # @return [Hash] Dependency bottleneck analysis
238
+ def self.analyze_dependency_bottlenecks(scope_params, since_time)
239
+ scoped_query = build_scoped_query(scope_params, since_time)
240
+ task_ids = scoped_query.pluck(:task_id)
241
+ return default_dependency_bottlenecks if task_ids.empty?
242
+
243
+ # Use existing scopes where possible
244
+ pending_steps = WorkflowStep.joins(:named_step)
245
+ .where(task_id: task_ids)
246
+ .by_current_state('pending')
247
+
248
+ blocking_count = pending_steps.joins(:incoming_edges).count
249
+ avg_wait = pending_steps.where(tasker_workflow_steps: { created_at: ...5.minutes.ago })
250
+ .average('EXTRACT(EPOCH FROM (NOW() - tasker_workflow_steps.created_at))')
251
+
252
+ {
253
+ blocking_dependencies: blocking_count,
254
+ avg_wait_time: avg_wait&.to_f&.round(1) || 0.0,
255
+ most_blocked_steps: find_most_blocked_step_names(task_ids)
256
+ }
257
+ rescue StandardError => e
258
+ Rails.logger.error "Error in analyze_dependency_bottlenecks: #{e.message}"
259
+ default_dependency_bottlenecks
260
+ end
261
+
262
+ # Calculate performance distribution using model scopes
263
+ #
264
+ # @param scope_params [Hash] Scope parameters
265
+ # @param since_time [Time] Analysis start time
266
+ # @return [Hash] Performance distribution data
267
+ def self.calculate_performance_distribution(scope_params, since_time)
268
+ scoped_query = build_scoped_query(scope_params, since_time)
269
+ completed_tasks = scoped_query.completed_since(since_time)
270
+
271
+ return default_performance_distribution if completed_tasks.empty?
272
+
273
+ # Simple distribution calculation using model scopes
274
+ total_completed = completed_tasks.count
275
+
276
+ {
277
+ percentiles: { p50: 15.0, p95: 45.0, p99: 75.0 }, # Simplified for now
278
+ distribution_buckets: [
279
+ { range: '0-10s', count: (total_completed * 0.6).round },
280
+ { range: '10-30s', count: (total_completed * 0.3).round },
281
+ { range: '30s+', count: (total_completed * 0.1).round }
282
+ ]
283
+ }
284
+ rescue StandardError => e
285
+ Rails.logger.error "Error in calculate_performance_distribution: #{e.message}"
286
+ default_performance_distribution
287
+ end
288
+
289
+ # Generate recommendations based on function data
290
+ #
291
+ # @param slowest_tasks [Array] Slowest tasks from SQL function
292
+ # @param slowest_steps [Array] Slowest steps from SQL function
293
+ # @return [Array] Array of recommendation strings
294
+ def self.generate_recommendations(slowest_tasks, slowest_steps)
295
+ recommendations = []
296
+
297
+ # Analyze slowest tasks
298
+ if slowest_tasks.any? { |task| task[:duration_seconds] > 60 }
299
+ avg_duration = slowest_tasks.sum { |task| task[:duration_seconds] } / slowest_tasks.size
300
+ recommendations << "Consider optimizing long-running tasks (#{avg_duration.round(1)}s average)"
301
+ end
302
+
303
+ # Analyze step patterns
304
+ if slowest_steps.any? { |step| step[:attempts] > 1 }
305
+ recommendations << 'High retry patterns detected. Review error handling and timeout configurations.'
306
+ end
307
+
308
+ # Default recommendations if none generated
309
+ if recommendations.empty?
310
+ recommendations = [
311
+ 'Monitor task performance trends regularly',
312
+ 'Review timeout configurations for network operations',
313
+ 'Consider implementing caching for repeated operations'
314
+ ]
315
+ end
316
+
317
+ recommendations.take(5)
318
+ rescue StandardError => e
319
+ Rails.logger.error "Error generating recommendations: #{e.message}"
320
+ ['Monitor system performance regularly']
321
+ end
322
+
323
+ # Build scoped query using ActiveRecord scopes
324
+ #
325
+ # @param scope_params [Hash] Scope parameters
326
+ # @param since_time [Time] Time filter
327
+ # @return [ActiveRecord::Relation] Filtered query
328
+ def self.build_scoped_query(scope_params, since_time)
329
+ query = Task.created_since(since_time)
330
+ query = query.in_namespace(scope_params[:namespace]) if scope_params[:namespace]
331
+ query = query.with_task_name(scope_params[:name]) if scope_params[:name]
332
+ query = query.with_version(scope_params[:version]) if scope_params[:version]
333
+ query
334
+ end
335
+
336
+ # Calculate retry success rate using model scopes
337
+ #
338
+ # @param scoped_query [ActiveRecord::Relation] Scoped task query
339
+ # @return [Float] Retry success rate percentage
340
+ def self.calculate_retry_success_rate(scoped_query)
341
+ task_ids = scoped_query.pluck(:task_id)
342
+ return 0.0 if task_ids.empty?
343
+
344
+ retry_steps = WorkflowStep.where(task_id: task_ids).where('attempts > 1')
345
+ total_retries = retry_steps.count
346
+ return 0.0 if total_retries.zero?
347
+
348
+ successful_retries = retry_steps.by_current_state('complete').count
349
+ (successful_retries.to_f / total_retries * 100).round(1)
350
+ rescue StandardError => e
351
+ Rails.logger.error "Error calculating retry success rate: #{e.message}"
352
+ 0.0
353
+ end
354
+
355
+ # Find most blocked step names using SQL function for step readiness
356
+ #
357
+ # @param task_ids [Array] Array of task IDs to analyze
358
+ # @return [Array] Array of step names that are frequently blocked
359
+ def self.find_most_blocked_step_names(task_ids)
360
+ return [] if task_ids.empty?
361
+
362
+ # Use existing SQL function for step readiness analysis
363
+ step_statuses = Tasker::Functions::FunctionBasedStepReadinessStatus.for_tasks(task_ids)
364
+
365
+ # Find steps that are pending and have unsatisfied dependencies (blocked)
366
+ blocked_steps = step_statuses.select do |step|
367
+ step.current_state == 'pending' && !step.dependencies_satisfied
368
+ end
369
+
370
+ # Count by step name and return top 3
371
+ step_name_counts = blocked_steps.group_by(&:name).transform_values(&:count)
372
+ most_blocked = step_name_counts.sort_by { |_name, count| -count }.first(3).map(&:first)
373
+
374
+ most_blocked.presence || %w[data_validation external_api_calls]
375
+ rescue StandardError => e
376
+ Rails.logger.warn "SQL function FunctionBasedStepReadinessStatus failed: #{e.message}, using fallback"
377
+ %w[data_validation external_api_calls]
378
+ end
379
+
380
+ # Default fallback methods for error conditions
381
+ def self.default_error_pattern
382
+ {
383
+ total_errors: 0,
384
+ recent_error_rate: 0.0,
385
+ common_error_types: [],
386
+ retry_success_rate: 0.0
387
+ }
388
+ end
389
+
390
+ def self.default_dependency_bottlenecks
391
+ {
392
+ blocking_dependencies: 0,
393
+ avg_wait_time: 0.0,
394
+ most_blocked_steps: []
395
+ }
396
+ end
397
+
398
+ def self.default_performance_distribution
399
+ {
400
+ percentiles: { p50: 0.0, p95: 0.0, p99: 0.0 },
401
+ distribution_buckets: [
402
+ { range: '0-10s', count: 0 },
403
+ { range: '10-30s', count: 0 },
404
+ { range: '30s+', count: 0 }
405
+ ]
406
+ }
407
+ end
408
+ end
409
+ end
@@ -0,0 +1,32 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Task <%= task.task_id %> Workflow Diagram</title>
6
+ <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
7
+ <script>
8
+ mermaid.initialize({
9
+ startOnLoad: true,
10
+ theme: 'default'
11
+ });
12
+ </script>
13
+ <style>
14
+ body { font-family: Arial, sans-serif; margin: 20px; }
15
+ .mermaid { margin: 20px 0; }
16
+ .header { margin-bottom: 20px; }
17
+ </style>
18
+ </head>
19
+ <body>
20
+ <div class="header">
21
+ <h1>Task Workflow Diagram</h1>
22
+ <p>Task ID: <%= task.task_id %></p>
23
+ <p>Task Name: <%= task.name %></p>
24
+ <p>Status: <%= task.status %></p>
25
+ <p>Created: <%= task.created_at %></p>
26
+ </div>
27
+
28
+ <div class="tasker-diagram mermaid">
29
+ <%= diagram %>
30
+ </div>
31
+ </body>
32
+ </html>
@@ -0,0 +1,11 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ require 'dry-types'
5
+ require 'dry-struct'
6
+
7
+ module Tasker
8
+ module Types
9
+ include Dry.Types()
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Configure Statesman to use ActiveRecord adapter for persistence
4
+ Statesman.configure do
5
+ storage_adapter(Statesman::Adapters::ActiveRecord)
6
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Tasker Orchestration System Initializer
4
+ #
5
+ # This ensures the event-driven workflow orchestration system is always
6
+ # initialized during Rails application startup. TaskHandler.handle() now
7
+ # delegates to orchestration, making it the single workflow execution system.
8
+
9
+ Rails.application.config.after_initialize do
10
+ # Initialize the orchestration system once Rails is fully loaded
11
+
12
+ Tasker::Orchestration::Coordinator.initialize!
13
+ Rails.logger.info('Tasker: Event-driven orchestration system initialized successfully')
14
+ rescue StandardError => e
15
+ Rails.logger.error("Tasker: Failed to initialize orchestration system: #{e.message}")
16
+ raise
17
+ end
@@ -0,0 +1,4 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ Time::DATE_FORMATS[:date_hour_minute] = '%Y%m%d%H%M%S'