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,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tasker
4
+ module Types
5
+ # Configuration type for core engine settings
6
+ #
7
+ # This configuration handles core Tasker engine settings including task handler
8
+ # directories, identity strategies, and custom event configurations.
9
+ # It provides the same functionality as the original EngineConfiguration but with
10
+ # dry-struct type safety and immutability.
11
+ #
12
+ # @example Basic usage
13
+ # config = EngineConfig.new(
14
+ # task_handler_directory: 'app/tasks',
15
+ # identity_strategy: :hash
16
+ # )
17
+ #
18
+ # @example Full configuration
19
+ # config = EngineConfig.new(
20
+ # task_handler_directory: 'app/tasks',
21
+ # task_config_directory: 'config/tasks',
22
+ # default_module_namespace: 'MyApp::Tasks',
23
+ # identity_strategy: :custom,
24
+ # identity_strategy_class: 'MyApp::CustomIdentityStrategy',
25
+ # custom_events_directories: ['config/events', 'lib/events']
26
+ # )
27
+ class EngineConfig < BaseConfig
28
+ transform_keys(&:to_sym)
29
+
30
+ # Directory where task handlers are located
31
+ #
32
+ # @!attribute [r] task_handler_directory
33
+ # @return [String] Task handler directory path
34
+ attribute :task_handler_directory, Types::String.default('tasks')
35
+
36
+ # Directory where task configuration files are located
37
+ #
38
+ # @!attribute [r] task_config_directory
39
+ # @return [String] Task configuration directory path
40
+ attribute :task_config_directory, Types::String.default('tasker/tasks')
41
+
42
+ # Default module namespace for task handlers
43
+ #
44
+ # @!attribute [r] default_module_namespace
45
+ # @return [String, nil] Default module namespace for generated handlers
46
+ attribute? :default_module_namespace, Types::String.optional.default(nil)
47
+
48
+ # The strategy to use for generating task identities
49
+ #
50
+ # @!attribute [r] identity_strategy
51
+ # @return [Symbol] Identity strategy (:default, :hash, :custom)
52
+ attribute :identity_strategy, Types::Symbol.default(:default)
53
+
54
+ # The class name to use for custom identity strategy
55
+ #
56
+ # @!attribute [r] identity_strategy_class
57
+ # @return [String, nil] Custom identity strategy class name
58
+ attribute? :identity_strategy_class, Types::String.optional.default(nil)
59
+
60
+ # Directories to search for custom event YAML files
61
+ #
62
+ # @!attribute [r] custom_events_directories
63
+ # @return [Array<String>] Custom event directories
64
+ attribute :custom_events_directories, Types::Array.of(Types::String).default(proc {
65
+ default_custom_events_directories
66
+ }.freeze, shared: true)
67
+
68
+ # Get default custom events directories
69
+ #
70
+ # @return [Array<String>] Default directories to search for custom events
71
+ def self.default_custom_events_directories
72
+ [
73
+ 'config/tasker/events'
74
+ ].freeze
75
+ end
76
+
77
+ # Creates and returns an appropriate identity strategy instance
78
+ #
79
+ # @return [Tasker::IdentityStrategy] The identity strategy instance
80
+ # @raise [ArgumentError] If an invalid strategy is specified
81
+ def identity_strategy_instance
82
+ case identity_strategy
83
+ when :default
84
+ Tasker::IdentityStrategy.new
85
+ when :hash
86
+ Tasker::HashIdentityStrategy.new
87
+ when :custom
88
+ if identity_strategy_class.nil?
89
+ raise ArgumentError, 'Custom identity strategy selected but no identity_strategy_class provided'
90
+ end
91
+
92
+ begin
93
+ identity_strategy_class.constantize.new
94
+ rescue NameError => e
95
+ raise ArgumentError, "Invalid identity_strategy_class: #{e.message}"
96
+ end
97
+ else
98
+ raise ArgumentError, "Unknown identity_strategy: #{identity_strategy}"
99
+ end
100
+ end
101
+
102
+ # Add custom event directories to the existing configuration
103
+ #
104
+ # Since dry-struct types are immutable, this returns a new instance.
105
+ #
106
+ # @param directories [Array<String>] Additional directories to search for events
107
+ # @return [EngineConfig] New instance with updated directories
108
+ def add_custom_events_directories(*directories)
109
+ new_directories = (custom_events_directories + directories.flatten).uniq
110
+ self.class.new(to_h.merge(custom_events_directories: new_directories))
111
+ end
112
+
113
+ # Set custom event directories (replaces the default list)
114
+ #
115
+ # Since dry-struct types are immutable, this returns a new instance.
116
+ #
117
+ # @param directories [Array<String>] Directories to search for events
118
+ # @return [EngineConfig] New instance with updated directories
119
+ def set_custom_events_directories(directories)
120
+ self.class.new(to_h.merge(custom_events_directories: directories.flatten))
121
+ end
122
+
123
+ private
124
+
125
+ # Use class method for default custom events directories
126
+ def default_custom_events_directories
127
+ self.class.default_custom_events_directories
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,289 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tasker
4
+ module Types
5
+ # Configuration type for step execution and concurrency settings
6
+ #
7
+ # This configuration exposes previously hardcoded execution constants
8
+ # used in concurrent step processing, timeout handling, and memory management.
9
+ #
10
+ # Strategic Design:
11
+ # - CONFIGURABLE: Performance characteristics that vary by deployment environment
12
+ # - ARCHITECTURAL: Carefully chosen constants based on Ruby/Rails characteristics
13
+ #
14
+ # @example Basic usage
15
+ # config = ExecutionConfig.new(
16
+ # max_concurrent_steps_limit: 20, # High-performance system
17
+ # batch_timeout_base_seconds: 60 # API-heavy workflows
18
+ # )
19
+ #
20
+ # @example Environment-specific tuning
21
+ # # Development environment
22
+ # config = ExecutionConfig.new(
23
+ # min_concurrent_steps: 2,
24
+ # max_concurrent_steps_limit: 6,
25
+ # concurrency_cache_duration: 60
26
+ # )
27
+ #
28
+ # # Production environment
29
+ # config = ExecutionConfig.new(
30
+ # min_concurrent_steps: 5,
31
+ # max_concurrent_steps_limit: 25,
32
+ # batch_timeout_base_seconds: 45,
33
+ # max_batch_timeout_seconds: 300
34
+ # )
35
+ class ExecutionConfig < BaseConfig
36
+ transform_keys(&:to_sym)
37
+
38
+ # ====================
39
+ # CONFIGURABLE SETTINGS
40
+ # ====================
41
+ # These affect performance characteristics and should vary by deployment
42
+
43
+ # Minimum concurrent steps allowed
44
+ #
45
+ # Conservative bound to ensure system stability even under extreme load.
46
+ # Small systems might prefer 2, large systems might prefer 5+.
47
+ #
48
+ # @!attribute [r] min_concurrent_steps
49
+ # @return [Integer] Minimum concurrent steps (default: 3)
50
+ attribute :min_concurrent_steps, Types::Integer.default(3)
51
+
52
+ # Maximum concurrent steps limit
53
+ #
54
+ # Upper bound for dynamic concurrency calculation.
55
+ # High-performance systems with large connection pools can handle 20-30+.
56
+ # Standard deployments typically use 8-15.
57
+ #
58
+ # @!attribute [r] max_concurrent_steps_limit
59
+ # @return [Integer] Maximum concurrent steps limit (default: 12)
60
+ attribute :max_concurrent_steps_limit, Types::Integer.default(12)
61
+
62
+ # Cache duration for concurrency calculation
63
+ #
64
+ # How long to cache the calculated optimal concurrency before recalculating.
65
+ # Busy systems might want shorter cache (15s), stable systems longer (60s).
66
+ #
67
+ # @!attribute [r] concurrency_cache_duration
68
+ # @return [Integer] Cache duration in seconds (default: 30)
69
+ attribute :concurrency_cache_duration, Types::Integer.default(30)
70
+
71
+ # Base timeout for batch execution
72
+ #
73
+ # Starting timeout before per-step adjustments.
74
+ # API-heavy workflows might need 60s+, simple workflows can use 15-20s.
75
+ #
76
+ # @!attribute [r] batch_timeout_base_seconds
77
+ # @return [Integer] Base timeout in seconds (default: 30)
78
+ attribute :batch_timeout_base_seconds, Types::Integer.default(30)
79
+
80
+ # Per-step timeout addition
81
+ #
82
+ # Additional timeout per step in a batch.
83
+ # Complex steps might need 10s+, simple steps can use 2-3s.
84
+ #
85
+ # @!attribute [r] batch_timeout_per_step_seconds
86
+ # @return [Integer] Per-step timeout in seconds (default: 5)
87
+ attribute :batch_timeout_per_step_seconds, Types::Integer.default(5)
88
+
89
+ # Maximum batch timeout ceiling
90
+ #
91
+ # Absolute maximum timeout regardless of batch size.
92
+ # Long-running workflows might need 300-600s, fast workflows 60-120s.
93
+ #
94
+ # @!attribute [r] max_batch_timeout_seconds
95
+ # @return [Integer] Maximum timeout in seconds (default: 120)
96
+ attribute :max_batch_timeout_seconds, Types::Integer.default(120)
97
+
98
+ # Connection pressure response factors
99
+ #
100
+ # Configurable factors that determine how connection pressure affects
101
+ # concurrency recommendations. Higher values are more aggressive,
102
+ # lower values are more conservative.
103
+ #
104
+ # @!attribute [r] connection_pressure_factors
105
+ # @return [Hash] Pressure response factors by pressure level
106
+ attribute :connection_pressure_factors, Types::Hash.default(proc {
107
+ {
108
+ low: 0.8, # Use 80% of available when pressure is low
109
+ moderate: 0.6, # Use 60% of available when pressure is moderate
110
+ high: 0.4, # Use 40% of available when pressure is high
111
+ critical: 0.2 # Use 20% of available when pressure is critical
112
+ }
113
+ }.freeze)
114
+
115
+ # Health assessment cache duration
116
+ #
117
+ # How long to cache connection health assessments before recalculating.
118
+ # Frequent assessments provide better responsiveness but add overhead.
119
+ #
120
+ # @!attribute [r] health_assessment_cache_duration
121
+ # @return [Integer] Cache duration in seconds (default: 30)
122
+ attribute :health_assessment_cache_duration, Types::Integer.default(30)
123
+
124
+ # Connection health log level
125
+ #
126
+ # Log level for connection health assessment messages.
127
+ # Production systems typically use 'info' or 'warn'.
128
+ #
129
+ # @!attribute [r] connection_health_log_level
130
+ # @return [String] Log level (default: 'debug')
131
+ attribute :connection_health_log_level, Types::String.default('debug')
132
+
133
+ # ====================
134
+ # ARCHITECTURAL CONSTANTS
135
+ # ====================
136
+ # These are carefully chosen based on Ruby/Rails characteristics
137
+ # and should NOT be exposed as configuration options
138
+
139
+ # Future cleanup wait time
140
+ #
141
+ # Time to wait for executing futures during cleanup.
142
+ # Based on Ruby Concurrent::Future characteristics - 1 second is optimal
143
+ # for most Ruby applications and provides good balance of responsiveness
144
+ # vs resource cleanup.
145
+ #
146
+ # @return [Integer] Wait time in seconds
147
+ def future_cleanup_wait_seconds
148
+ 1
149
+ end
150
+
151
+ # GC trigger batch size threshold
152
+ #
153
+ # Batch size that triggers intelligent garbage collection.
154
+ # Based on Ruby memory management patterns - 6 concurrent operations
155
+ # is typically where memory pressure becomes noticeable in Ruby.
156
+ #
157
+ # @return [Integer] Batch size threshold
158
+ def gc_trigger_batch_size_threshold
159
+ 6
160
+ end
161
+
162
+ # GC trigger duration threshold
163
+ #
164
+ # Batch duration that triggers intelligent garbage collection.
165
+ # Based on Ruby GC timing characteristics - 30 seconds is typically
166
+ # when Ruby benefits from explicit GC triggering.
167
+ #
168
+ # @return [Integer] Duration threshold in seconds
169
+ def gc_trigger_duration_threshold
170
+ 30
171
+ end
172
+
173
+ # ====================
174
+ # CALCULATED VALUES
175
+ # ====================
176
+
177
+ # Calculate batch timeout for a given batch size
178
+ #
179
+ # @param batch_size [Integer] Number of steps in the batch
180
+ # @return [Integer] Calculated timeout in seconds
181
+ def calculate_batch_timeout(batch_size)
182
+ calculated_timeout = batch_timeout_base_seconds + (batch_size * batch_timeout_per_step_seconds)
183
+ [calculated_timeout, max_batch_timeout_seconds].min
184
+ end
185
+
186
+ # Check if batch should trigger garbage collection
187
+ #
188
+ # @param batch_size [Integer] Size of the batch
189
+ # @param batch_duration [Float] Duration of batch execution in seconds
190
+ # @return [Boolean] Whether to trigger GC
191
+ def should_trigger_gc?(batch_size, batch_duration)
192
+ batch_size >= gc_trigger_batch_size_threshold ||
193
+ batch_duration >= gc_trigger_duration_threshold
194
+ end
195
+
196
+ # Validate concurrency bounds
197
+ #
198
+ # Ensures min <= max and both are positive
199
+ # @return [Array<String>] Validation errors (empty if valid)
200
+ def validate_concurrency_bounds
201
+ errors = []
202
+
203
+ errors << "min_concurrent_steps must be positive (got: #{min_concurrent_steps})" if min_concurrent_steps <= 0
204
+
205
+ if max_concurrent_steps_limit <= 0
206
+ errors << "max_concurrent_steps_limit must be positive (got: #{max_concurrent_steps_limit})"
207
+ end
208
+
209
+ if min_concurrent_steps > max_concurrent_steps_limit
210
+ errors << "min_concurrent_steps (#{min_concurrent_steps}) cannot exceed " \
211
+ "max_concurrent_steps_limit (#{max_concurrent_steps_limit})"
212
+ end
213
+
214
+ errors
215
+ end
216
+
217
+ # Validate timeout configuration
218
+ #
219
+ # Ensures timeouts are positive and logical
220
+ # @return [Array<String>] Validation errors (empty if valid)
221
+ def validate_timeout_configuration
222
+ errors = []
223
+
224
+ if batch_timeout_base_seconds <= 0
225
+ errors << "batch_timeout_base_seconds must be positive (got: #{batch_timeout_base_seconds})"
226
+ end
227
+
228
+ if batch_timeout_per_step_seconds <= 0
229
+ errors << "batch_timeout_per_step_seconds must be positive (got: #{batch_timeout_per_step_seconds})"
230
+ end
231
+
232
+ if max_batch_timeout_seconds <= batch_timeout_base_seconds
233
+ errors << "max_batch_timeout_seconds (#{max_batch_timeout_seconds}) must be greater than " \
234
+ "batch_timeout_base_seconds (#{batch_timeout_base_seconds})"
235
+ end
236
+
237
+ errors
238
+ end
239
+
240
+ # Validate connection configuration
241
+ #
242
+ # Ensures connection pressure factors and health settings are valid
243
+ # @return [Array<String>] Validation errors (empty if valid)
244
+ def validate_connection_configuration
245
+ errors = []
246
+
247
+ if health_assessment_cache_duration <= 0
248
+ errors << "health_assessment_cache_duration must be positive (got: #{health_assessment_cache_duration})"
249
+ end
250
+
251
+ # Validate connection pressure factors
252
+ required_pressure_levels = %i[low moderate high critical]
253
+ missing_levels = required_pressure_levels - connection_pressure_factors.keys
254
+ unless missing_levels.empty?
255
+ errors << "connection_pressure_factors missing required levels: #{missing_levels.join(', ')}"
256
+ end
257
+
258
+ connection_pressure_factors.each do |level, factor|
259
+ unless factor.is_a?(Numeric) && factor >= 0.0 && factor <= 1.0
260
+ errors << "connection_pressure_factors[#{level}] must be between 0.0 and 1.0 (got: #{factor})"
261
+ end
262
+ end
263
+
264
+ # Validate log level
265
+ valid_log_levels = %w[debug info warn error fatal]
266
+ unless valid_log_levels.include?(connection_health_log_level)
267
+ errors << "connection_health_log_level must be one of: #{valid_log_levels.join(', ')} " \
268
+ "(got: #{connection_health_log_level})"
269
+ end
270
+
271
+ errors
272
+ end
273
+
274
+ # Comprehensive validation
275
+ #
276
+ # @return [Boolean] True if valid, raises exception if invalid
277
+ # @raise [Dry::Struct::Error] If validation fails
278
+ # rubocop:disable Naming/PredicateMethod
279
+ def validate!
280
+ errors = validate_concurrency_bounds + validate_timeout_configuration + validate_connection_configuration
281
+
282
+ raise Dry::Struct::Error, "ExecutionConfig validation failed: #{errors.join(', ')}" unless errors.empty?
283
+
284
+ true
285
+ end
286
+ # rubocop:enable Naming/PredicateMethod
287
+ end
288
+ end
289
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tasker
4
+ module Types
5
+ # Configuration type for health check settings
6
+ #
7
+ # This configuration handles health check endpoint behavior and authentication requirements.
8
+ # It provides the same functionality as the original HealthConfiguration but with
9
+ # dry-struct type safety and immutability.
10
+ #
11
+ # @example Basic usage
12
+ # config = HealthConfig.new(
13
+ # status_requires_authentication: false,
14
+ # readiness_timeout_seconds: 10.0
15
+ # )
16
+ #
17
+ # @example Full configuration
18
+ # config = HealthConfig.new(
19
+ # status_endpoint_requires_auth: true,
20
+ # ready_requires_authentication: false,
21
+ # status_requires_authentication: true,
22
+ # readiness_timeout_seconds: 5.0,
23
+ # cache_duration_seconds: 15
24
+ # )
25
+ class HealthConfig < BaseConfig
26
+ transform_keys(&:to_sym)
27
+
28
+ # Custom boolean type that accepts various truthy/falsy values
29
+ BooleanType = Types::Bool.constructor do |value|
30
+ case value
31
+ when true, 'true', 'yes', '1', 1
32
+ true
33
+ when false, 'false', 'no', '0', 0, nil, ''
34
+ false
35
+ else
36
+ !value.nil? # Convert any other truthy value to true, falsy to false
37
+ end
38
+ end
39
+
40
+ # Whether status endpoint requires authentication (backward compatibility)
41
+ #
42
+ # @!attribute [r] status_endpoint_requires_auth
43
+ # @return [Boolean] Whether status endpoint requires auth
44
+ attribute :status_endpoint_requires_auth, BooleanType.default(true)
45
+
46
+ # Whether ready endpoint requires authentication (K8s compatibility)
47
+ #
48
+ # @!attribute [r] ready_requires_authentication
49
+ # @return [Boolean] Whether ready endpoint requires authentication
50
+ attribute :ready_requires_authentication, BooleanType.default(false)
51
+
52
+ # Whether status endpoint requires authentication
53
+ #
54
+ # @!attribute [r] status_requires_authentication
55
+ # @return [Boolean] Whether status endpoint requires authentication
56
+ attribute :status_requires_authentication, BooleanType.default(true)
57
+
58
+ # Timeout for readiness checks in seconds
59
+ #
60
+ # @!attribute [r] readiness_timeout_seconds
61
+ # @return [Float] Readiness check timeout in seconds
62
+ attribute :readiness_timeout_seconds, Types::Float.constrained(gt: 0).default(5.0)
63
+
64
+ # Cache duration for status data in seconds
65
+ #
66
+ # @!attribute [r] cache_duration_seconds
67
+ # @return [Integer] Cache duration in seconds
68
+ attribute :cache_duration_seconds, Types::Integer.constrained(gt: 0).default(15)
69
+
70
+ # Validate health configuration settings
71
+ #
72
+ # This method maintains compatibility with the original HealthConfiguration
73
+ # but is largely redundant since dry-struct handles validation automatically.
74
+ #
75
+ # @return [true] if valid
76
+ # @raise [StandardError] if invalid configuration found
77
+ def validate!
78
+ # dry-struct automatically validates types and constraints
79
+ # This method is kept for backward compatibility
80
+ true
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,24 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module Tasker
5
+ module Types
6
+ # StepSequence represents a sequence of workflow steps to be executed.
7
+ #
8
+ # It provides a container for an array of WorkflowStep instances and
9
+ # utility methods for working with the step sequence.
10
+ class StepSequence < Dry::Struct
11
+ # @!attribute [r] steps
12
+ # @return [Array<Tasker::WorkflowStep>] List of workflow steps in this sequence
13
+ attribute :steps, Types::Array.default([].freeze)
14
+
15
+ # Finds a step in the sequence by its name
16
+ #
17
+ # @param name [String] The name of the step to find
18
+ # @return [Tasker::WorkflowStep, nil] The matching step or nil if not found
19
+ def find_step_by_name(name)
20
+ Tasker::WorkflowStep.find_step_by_name(steps, name)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tasker
4
+ module Types
5
+ # StepTemplate defines the structure for workflow step templates
6
+ #
7
+ # A step template provides the blueprint for creating specific workflow steps
8
+ # in a task's sequence. It defines the behavior, dependencies, and configuration
9
+ # for steps of a particular type.
10
+ class StepTemplate < Dry::Struct
11
+ # @!attribute [r] dependent_system
12
+ # @return [String] The system that this step depends on for execution
13
+ attribute :dependent_system, Types::Strict::String
14
+
15
+ # @!attribute [r] name
16
+ # @return [String] The name identifier for this step template
17
+ attribute :name, Types::Strict::String
18
+
19
+ # @!attribute [r] description
20
+ # @return [String] A human-readable description of what this step does
21
+ attribute :description, Types::String
22
+
23
+ # @!attribute [r] default_retryable
24
+ # @return [Boolean] Whether this step can be retried by default
25
+ attribute :default_retryable, Types::Bool.default(true)
26
+
27
+ # @!attribute [r] default_retry_limit
28
+ # @return [Integer] The default maximum number of retry attempts
29
+ attribute :default_retry_limit, Types::Integer.default(3)
30
+
31
+ # @!attribute [r] skippable
32
+ # @return [Boolean] Whether this step can be skipped in the workflow
33
+ attribute :skippable, Types::Bool.default(false)
34
+
35
+ # @!attribute [r] handler_class
36
+ # @return [Class] The class that implements the step's logic
37
+ attribute :handler_class, Types::Class
38
+
39
+ # @!attribute [r] handler_config
40
+ # @return [Object, nil] Optional configuration for the step handler
41
+ attribute :handler_config, Types::Any.optional.default(nil)
42
+
43
+ # @!attribute [r] depends_on_step
44
+ # @return [String, nil] Optional name of a step that must be completed before this one
45
+ attribute :depends_on_step, Types::String.optional.default(nil)
46
+
47
+ # @!attribute [r] depends_on_steps
48
+ # @return [Array<String>] Names of steps that must be completed before this one
49
+ attribute :depends_on_steps, Types.Array(Types::String).default([].freeze)
50
+
51
+ # @!attribute [r] custom_events
52
+ # @return [Array<Hash>] Custom events that this step handler can publish
53
+ attribute :custom_events, Types.Array(Types::Hash).optional.default([].freeze)
54
+
55
+ # Returns all dependency step names as a single array
56
+ #
57
+ # @return [Array<String>] All step dependencies
58
+ def all_dependencies
59
+ [depends_on_step, *depends_on_steps].compact.uniq
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,60 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module Tasker
5
+ module Types
6
+ # TaskRequest represents a request to perform a task within the system
7
+ #
8
+ # It contains all the necessary information to identify, track, and execute a task
9
+ # including context data, metadata, and configuration for the task execution.
10
+ class TaskRequest < Dry::Struct
11
+ # @!attribute [r] name
12
+ # @return [String] The name of the task to be performed
13
+ attribute :name, Types::Strict::String
14
+
15
+ # @!attribute [r] namespace
16
+ # @return [String] The namespace of the task to be performed
17
+ attribute :namespace, Types::Strict::String.default('default')
18
+
19
+ # @!attribute [r] version
20
+ # @return [String] The version of the task to be performed
21
+ attribute :version, Types::Strict::String.default('0.1.0')
22
+
23
+ # @!attribute [r] context
24
+ # @return [Hash] Context data required for task execution, containing task-specific information
25
+ attribute :context, Types::Hash
26
+
27
+ # @!attribute [r] status
28
+ # @return [String] Current status of the task (e.g., PENDING, IN_PROGRESS, COMPLETED, FAILED)
29
+ attribute :status, Types::String.default(Constants::TaskStatuses::PENDING)
30
+
31
+ # @!attribute [r] initiator
32
+ # @return [String] The entity or system that initiated this task request
33
+ attribute :initiator, Types::String.default(Constants::UNKNOWN)
34
+
35
+ # @!attribute [r] source_system
36
+ # @return [String] The system from which this task originated
37
+ attribute :source_system, Types::String.default(Constants::UNKNOWN)
38
+
39
+ # @!attribute [r] reason
40
+ # @return [String] The reason why this task was requested
41
+ attribute :reason, Types::String.default(Constants::UNKNOWN)
42
+
43
+ # @!attribute [r] complete
44
+ # @return [Boolean] Indicates whether the task has been completed
45
+ attribute :complete, Types::Bool.default(false)
46
+
47
+ # @!attribute [r] tags
48
+ # @return [Array<String>] Tags associated with this task for categorization or filtering
49
+ attribute :tags, Types::Array.of(Types::String).default([].freeze)
50
+
51
+ # @!attribute [r] bypass_steps
52
+ # @return [Array<String>] List of step names that should be bypassed during task execution
53
+ attribute :bypass_steps, Types::Array.of(Types::String).default([].freeze)
54
+
55
+ # @!attribute [r] requested_at
56
+ # @return [Time] Timestamp when the task was initially requested
57
+ attribute(:requested_at, Types::JSON::Time.default { Time.zone.now })
58
+ end
59
+ end
60
+ end