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,257 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tasker
4
+ module Types
5
+ # Configuration type for intelligent cache strategy settings
6
+ #
7
+ # This configuration provides strategic control over cache behavior while
8
+ # maintaining consistent infrastructure naming through constants.
9
+ #
10
+ # Strategic Design:
11
+ # - CONFIGURABLE: Algorithm parameters that vary by workload characteristics
12
+ # - CONFIGURABLE: Performance thresholds that vary by deployment environment
13
+ # - CONSTANTS: Infrastructure naming for consistency across deployments
14
+ #
15
+ # @example Basic usage
16
+ # config = CacheConfig.new(
17
+ # default_ttl: 600, # 10 minutes for stable data
18
+ # hit_rate_smoothing_factor: 0.8 # Less aggressive smoothing
19
+ # )
20
+ #
21
+ # @example Environment-specific tuning
22
+ # # Development environment - shorter TTLs for rapid iteration
23
+ # config = CacheConfig.new(
24
+ # default_ttl: 120, # 2 minutes
25
+ # adaptive_ttl_enabled: false, # Disable complexity
26
+ # performance_tracking_enabled: false # Reduce overhead
27
+ # )
28
+ #
29
+ # # Production environment - optimized for performance
30
+ # config = CacheConfig.new(
31
+ # default_ttl: 300, # 5 minutes
32
+ # hit_rate_smoothing_factor: 0.95, # Aggressive smoothing
33
+ # access_frequency_decay_rate: 0.98, # Slow decay
34
+ # adaptive_ttl_enabled: true, # Enable intelligence
35
+ # performance_tracking_enabled: true # Full observability
36
+ # )
37
+ #
38
+ # # High-performance environment - maximum efficiency
39
+ # config = CacheConfig.new(
40
+ # default_ttl: 600, # 10 minutes
41
+ # min_adaptive_ttl: 60, # 1 minute minimum
42
+ # max_adaptive_ttl: 7200, # 2 hours maximum
43
+ # cache_pressure_threshold: 0.9, # High threshold
44
+ # adaptive_calculation_interval: 15 # Frequent recalculation
45
+ # )
46
+ class CacheConfig < BaseConfig
47
+ transform_keys(&:to_sym)
48
+
49
+ # ====================
50
+ # CONFIGURABLE SETTINGS
51
+ # ====================
52
+ # These affect performance characteristics and should vary by deployment
53
+
54
+ # Default cache TTL in seconds
55
+ #
56
+ # Base time-to-live for cache entries before adaptive calculation.
57
+ # Fast-changing data might need 60-120s, stable data can use 300-600s.
58
+ #
59
+ # @!attribute [r] default_ttl
60
+ # @return [Integer] Default TTL in seconds (default: 300)
61
+ attribute :default_ttl, Types::Integer.default(300)
62
+
63
+ # Enable adaptive TTL calculation
64
+ #
65
+ # Whether to use intelligent TTL adjustment based on hit rates and generation time.
66
+ # Development environments might disable this for simplicity.
67
+ #
68
+ # @!attribute [r] adaptive_ttl_enabled
69
+ # @return [Boolean] Whether adaptive TTL is enabled (default: true)
70
+ attribute :adaptive_ttl_enabled, Types::Bool.default(true)
71
+
72
+ # Enable performance tracking
73
+ #
74
+ # Whether to track cache performance metrics for adaptive calculation.
75
+ # Adds small overhead but enables intelligent optimization.
76
+ #
77
+ # @!attribute [r] performance_tracking_enabled
78
+ # @return [Boolean] Whether performance tracking is enabled (default: true)
79
+ attribute :performance_tracking_enabled, Types::Bool.default(true)
80
+
81
+ # Hit rate smoothing factor for exponential moving average
82
+ #
83
+ # Controls how quickly hit rate adapts to new data.
84
+ # Higher values (0.95+) = slower adaptation, more stable
85
+ # Lower values (0.8-) = faster adaptation, more responsive
86
+ #
87
+ # @!attribute [r] hit_rate_smoothing_factor
88
+ # @return [Float] Smoothing factor (default: 0.9)
89
+ attribute :hit_rate_smoothing_factor, Types::Float.default(0.9)
90
+
91
+ # Access frequency decay rate for daily patterns
92
+ #
93
+ # Controls how access frequency decays over time.
94
+ # Higher values (0.98+) = slow decay, long memory
95
+ # Lower values (0.9-) = fast decay, short memory
96
+ #
97
+ # @!attribute [r] access_frequency_decay_rate
98
+ # @return [Float] Decay rate (default: 0.95)
99
+ attribute :access_frequency_decay_rate, Types::Float.default(0.95)
100
+
101
+ # Minimum adaptive TTL bound
102
+ #
103
+ # Absolute minimum TTL regardless of adaptive calculation.
104
+ # Prevents thrashing with very short cache times.
105
+ #
106
+ # @!attribute [r] min_adaptive_ttl
107
+ # @return [Integer] Minimum TTL in seconds (default: 30)
108
+ attribute :min_adaptive_ttl, Types::Integer.default(30)
109
+
110
+ # Maximum adaptive TTL bound
111
+ #
112
+ # Absolute maximum TTL regardless of adaptive calculation.
113
+ # Prevents stale data with very long cache times.
114
+ #
115
+ # @!attribute [r] max_adaptive_ttl
116
+ # @return [Integer] Maximum TTL in seconds (default: 3600)
117
+ attribute :max_adaptive_ttl, Types::Integer.default(3600)
118
+
119
+ # Dashboard cache TTL
120
+ #
121
+ # Specific TTL for dashboard and analytics queries.
122
+ # Should be shorter than default for responsive dashboards.
123
+ #
124
+ # @!attribute [r] dashboard_cache_ttl
125
+ # @return [Integer] Dashboard TTL in seconds (default: 120)
126
+ attribute :dashboard_cache_ttl, Types::Integer.default(120)
127
+
128
+ # Cache pressure threshold
129
+ #
130
+ # Utilization threshold that triggers cache pressure responses.
131
+ # Higher values = more aggressive caching, lower = more conservative.
132
+ #
133
+ # @!attribute [r] cache_pressure_threshold
134
+ # @return [Float] Pressure threshold (default: 0.8)
135
+ attribute :cache_pressure_threshold, Types::Float.default(0.8)
136
+
137
+ # Adaptive calculation interval
138
+ #
139
+ # How often to recalculate adaptive TTL values in seconds.
140
+ # Shorter intervals = more responsive, longer = more stable.
141
+ #
142
+ # @!attribute [r] adaptive_calculation_interval
143
+ # @return [Integer] Calculation interval in seconds (default: 30)
144
+ attribute :adaptive_calculation_interval, Types::Integer.default(30)
145
+
146
+ # ====================
147
+ # VALIDATION METHODS
148
+ # ====================
149
+
150
+ # Validate TTL configuration
151
+ #
152
+ # Ensures TTL values are positive and logical
153
+ # @return [Array<String>] Validation errors (empty if valid)
154
+ def validate_ttl_configuration
155
+ errors = []
156
+
157
+ errors << "default_ttl must be positive (got: #{default_ttl})" if default_ttl <= 0
158
+
159
+ errors << "min_adaptive_ttl must be positive (got: #{min_adaptive_ttl})" if min_adaptive_ttl <= 0
160
+
161
+ errors << "max_adaptive_ttl must be positive (got: #{max_adaptive_ttl})" if max_adaptive_ttl <= 0
162
+
163
+ if min_adaptive_ttl >= max_adaptive_ttl
164
+ errors << "min_adaptive_ttl (#{min_adaptive_ttl}) must be less than max_adaptive_ttl (#{max_adaptive_ttl})"
165
+ end
166
+
167
+ errors << "dashboard_cache_ttl must be positive (got: #{dashboard_cache_ttl})" if dashboard_cache_ttl <= 0
168
+
169
+ errors
170
+ end
171
+
172
+ # Validate algorithm parameters
173
+ #
174
+ # Ensures smoothing factors and thresholds are within valid ranges
175
+ # @return [Array<String>] Validation errors (empty if valid)
176
+ def validate_algorithm_parameters
177
+ errors = []
178
+
179
+ unless (0.0..1.0).cover?(hit_rate_smoothing_factor)
180
+ errors << "hit_rate_smoothing_factor must be between 0.0 and 1.0 (got: #{hit_rate_smoothing_factor})"
181
+ end
182
+
183
+ unless (0.0..1.0).cover?(access_frequency_decay_rate)
184
+ errors << "access_frequency_decay_rate must be between 0.0 and 1.0 (got: #{access_frequency_decay_rate})"
185
+ end
186
+
187
+ unless (0.0..1.0).cover?(cache_pressure_threshold)
188
+ errors << "cache_pressure_threshold must be between 0.0 and 1.0 (got: #{cache_pressure_threshold})"
189
+ end
190
+
191
+ if adaptive_calculation_interval <= 0
192
+ errors << "adaptive_calculation_interval must be positive (got: #{adaptive_calculation_interval})"
193
+ end
194
+
195
+ errors
196
+ end
197
+
198
+ # Validate entire configuration
199
+ #
200
+ # Runs all validation checks and raises if any errors found
201
+ # @raise [ArgumentError] If configuration is invalid
202
+ def validate!
203
+ errors = validate_ttl_configuration + validate_algorithm_parameters
204
+
205
+ return if errors.empty?
206
+
207
+ raise ArgumentError, "Invalid cache configuration: #{errors.join(', ')}"
208
+ end
209
+
210
+ # Calculate adaptive TTL based on performance data
211
+ #
212
+ # @param base_ttl [Integer] Base TTL to adjust
213
+ # @param hit_rate [Float] Current cache hit rate (0.0-1.0)
214
+ # @param generation_time [Float] Average generation time in seconds
215
+ # @param access_frequency [Integer] Access frequency count
216
+ # @return [Integer] Calculated adaptive TTL
217
+ def calculate_adaptive_ttl(base_ttl, hit_rate: 0.0, generation_time: 0.0, access_frequency: 0)
218
+ return base_ttl unless adaptive_ttl_enabled
219
+
220
+ # Start with base TTL as float for more precise calculations
221
+ adaptive_ttl = base_ttl.to_f
222
+
223
+ # Adjust based on hit rate (only if we have meaningful data)
224
+ if hit_rate > 0.8
225
+ adaptive_ttl *= 1.5 # High hit rate, extend TTL
226
+ elsif hit_rate > 0.0 && hit_rate < 0.3
227
+ adaptive_ttl *= 0.7 # Low hit rate, reduce TTL
228
+ end
229
+
230
+ # Adjust based on generation time (only if we have meaningful data)
231
+ if generation_time > 1.0
232
+ adaptive_ttl *= 1.3 # Expensive to generate, cache longer
233
+ elsif generation_time > 0.0 && generation_time < 0.1
234
+ adaptive_ttl *= 0.8 # Cheap to generate, cache shorter
235
+ end
236
+
237
+ # Adjust based on access frequency (only if we have meaningful data)
238
+ if access_frequency > 100
239
+ adaptive_ttl *= 1.2 # Frequently accessed, cache longer
240
+ elsif access_frequency.positive? && access_frequency < 5
241
+ adaptive_ttl *= 0.9 # Rarely accessed, cache shorter
242
+ end
243
+
244
+ # Convert to integer and apply bounds
245
+ adaptive_ttl.to_i.clamp(min_adaptive_ttl, max_adaptive_ttl)
246
+ end
247
+
248
+ # Check if cache is under pressure
249
+ #
250
+ # @param utilization [Float] Current cache utilization (0.0-1.0)
251
+ # @return [Boolean] Whether cache is under pressure
252
+ def cache_under_pressure?(utilization)
253
+ utilization >= cache_pressure_threshold
254
+ end
255
+ end
256
+ end
257
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tasker
4
+ module Types
5
+ # Configuration type for database settings
6
+ #
7
+ # This configuration handles database connection settings for Tasker.
8
+ # It provides the same functionality as the original DatabaseConfiguration but with
9
+ # dry-struct type safety and immutability.
10
+ #
11
+ # @example Basic usage
12
+ # config = DatabaseConfig.new(
13
+ # name: :secondary,
14
+ # enable_secondary_database: true
15
+ # )
16
+ #
17
+ # @example Default configuration
18
+ # config = DatabaseConfig.new
19
+ # # Uses default database, no secondary database
20
+ class DatabaseConfig < BaseConfig
21
+ transform_keys(&:to_sym)
22
+
23
+ # Database name or configuration key type that accepts strings or symbols
24
+ NameType = Types::String | Types::Symbol
25
+
26
+ # Named database configuration from database.yml
27
+ #
28
+ # @!attribute [r] name
29
+ # @return [String, Symbol, nil] Named database configuration key
30
+ attribute? :name, NameType.optional.default(nil)
31
+
32
+ # Whether to use a secondary database for Tasker models
33
+ #
34
+ # @!attribute [r] enable_secondary_database
35
+ # @return [Boolean] Whether to use secondary database
36
+ attribute :enable_secondary_database, Types::Bool.default(false)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,225 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tasker
4
+ module Types
5
+ # Represents a single node in a dependency graph
6
+ #
7
+ # A node can represent either a step template (for template graphs)
8
+ # or a workflow step instance (for runtime graphs).
9
+ #
10
+ # @example Template graph node
11
+ # node = GraphNode.new(
12
+ # id: 'validate_payment',
13
+ # name: 'validate_payment',
14
+ # type: 'step_template',
15
+ # metadata: { retryable: true, retry_limit: 3 }
16
+ # )
17
+ #
18
+ # @example Runtime graph node
19
+ # node = GraphNode.new(
20
+ # id: '12345',
21
+ # name: 'validate_payment',
22
+ # type: 'workflow_step',
23
+ # state: 'complete',
24
+ # readiness_status: { ready_for_execution: false },
25
+ # metadata: { step_class: 'ValidatePaymentStep' }
26
+ # )
27
+ class GraphNode < Dry::Struct
28
+ transform_keys(&:to_sym)
29
+
30
+ # Unique identifier for this node
31
+ # For templates: step name
32
+ # For runtime: step ID as string
33
+ #
34
+ # @!attribute [r] id
35
+ # @return [String] Node identifier
36
+ attribute :id, Types::String
37
+
38
+ # Human-readable name of the node
39
+ #
40
+ # @!attribute [r] name
41
+ # @return [String] Node name
42
+ attribute :name, Types::String
43
+
44
+ # Type of node: 'step_template' or 'workflow_step'
45
+ #
46
+ # @!attribute [r] type
47
+ # @return [String] Node type
48
+ attribute :type, Types::String
49
+
50
+ # Current state (for runtime graphs only)
51
+ #
52
+ # @!attribute [r] state
53
+ # @return [String, nil] Current state of the step
54
+ attribute? :state, Types::String.optional
55
+
56
+ # Readiness status information (for runtime graphs only)
57
+ #
58
+ # @!attribute [r] readiness_status
59
+ # @return [Hash, nil] Step readiness information
60
+ attribute? :readiness_status, Types::Hash.optional
61
+
62
+ # Additional metadata about the node
63
+ #
64
+ # @!attribute [r] metadata
65
+ # @return [Hash] Node metadata
66
+ attribute :metadata, Types::Hash.default({}.freeze)
67
+ end
68
+
69
+ # Represents a relationship between two nodes in a dependency graph
70
+ #
71
+ # @example Basic edge
72
+ # edge = GraphEdge.new(
73
+ # from: 'validate_payment',
74
+ # to: 'update_inventory',
75
+ # relationship: 'prerequisite'
76
+ # )
77
+ #
78
+ # @example Edge with metadata
79
+ # edge = GraphEdge.new(
80
+ # from: 'step_1',
81
+ # to: 'step_2',
82
+ # relationship: 'prerequisite',
83
+ # metadata: { weight: 1.5, critical_path: true }
84
+ # )
85
+ class GraphEdge < Dry::Struct
86
+ transform_keys(&:to_sym)
87
+
88
+ # Source node identifier
89
+ #
90
+ # @!attribute [r] from
91
+ # @return [String] Source node ID
92
+ attribute :from, Types::String
93
+
94
+ # Target node identifier
95
+ #
96
+ # @!attribute [r] to
97
+ # @return [String] Target node ID
98
+ attribute :to, Types::String
99
+
100
+ # Type of relationship between nodes
101
+ #
102
+ # @!attribute [r] relationship
103
+ # @return [String] Relationship type
104
+ attribute :relationship, Types::String.default('prerequisite')
105
+
106
+ # Additional metadata about the relationship
107
+ #
108
+ # @!attribute [r] metadata
109
+ # @return [Hash] Edge metadata
110
+ attribute :metadata, Types::Hash.default({}.freeze)
111
+ end
112
+
113
+ # Metadata about the overall dependency graph
114
+ #
115
+ # @example Template graph metadata
116
+ # metadata = GraphMetadata.new(
117
+ # graph_type: 'template',
118
+ # handler_name: 'order_processing',
119
+ # total_nodes: 5,
120
+ # total_edges: 4
121
+ # )
122
+ #
123
+ # @example Runtime graph metadata
124
+ # metadata = GraphMetadata.new(
125
+ # graph_type: 'runtime',
126
+ # task_id: '12345',
127
+ # total_nodes: 5,
128
+ # total_edges: 4,
129
+ # execution_context: {
130
+ # ready_steps: 2,
131
+ # blocked_steps: 1,
132
+ # completed_steps: 2
133
+ # }
134
+ # )
135
+ class GraphMetadata < Dry::Struct
136
+ transform_keys(&:to_sym)
137
+
138
+ # Type of graph: 'template' or 'runtime'
139
+ #
140
+ # @!attribute [r] graph_type
141
+ # @return [String] Graph type
142
+ attribute :graph_type, Types::String
143
+
144
+ # Handler name (for template graphs)
145
+ #
146
+ # @!attribute [r] handler_name
147
+ # @return [String, nil] Task handler name
148
+ attribute? :handler_name, Types::String.optional
149
+
150
+ # Task ID (for runtime graphs)
151
+ #
152
+ # @!attribute [r] task_id
153
+ # @return [String, nil] Task identifier
154
+ attribute? :task_id, Types::String.optional
155
+
156
+ # Total number of nodes in the graph
157
+ #
158
+ # @!attribute [r] total_nodes
159
+ # @return [Integer] Node count
160
+ attribute :total_nodes, Types::Integer
161
+
162
+ # Total number of edges in the graph
163
+ #
164
+ # @!attribute [r] total_edges
165
+ # @return [Integer] Edge count
166
+ attribute :total_edges, Types::Integer
167
+
168
+ # Execution context information (for runtime graphs only)
169
+ #
170
+ # @!attribute [r] execution_context
171
+ # @return [Hash, nil] Runtime execution information
172
+ attribute? :execution_context, Types::Hash.optional
173
+
174
+ # Additional metadata
175
+ #
176
+ # @!attribute [r] additional_data
177
+ # @return [Hash] Additional graph metadata
178
+ attribute :additional_data, Types::Hash.default({}.freeze)
179
+ end
180
+
181
+ # Complete dependency graph structure
182
+ #
183
+ # @example Template dependency graph
184
+ # graph = DependencyGraph.new(
185
+ # nodes: [node1, node2],
186
+ # edges: [edge1],
187
+ # metadata: template_metadata
188
+ # )
189
+ #
190
+ # @example Runtime dependency graph
191
+ # graph = DependencyGraph.new(
192
+ # nodes: [runtime_node1, runtime_node2],
193
+ # edges: [runtime_edge1],
194
+ # metadata: runtime_metadata
195
+ # )
196
+ class DependencyGraph < BaseConfig
197
+ transform_keys(&:to_sym)
198
+
199
+ # All nodes in the dependency graph
200
+ #
201
+ # @!attribute [r] nodes
202
+ # @return [Array<GraphNode>] Graph nodes
203
+ attribute :nodes, Types::Array.of(GraphNode)
204
+
205
+ # All edges in the dependency graph
206
+ #
207
+ # @!attribute [r] edges
208
+ # @return [Array<GraphEdge>] Graph edges
209
+ attribute :edges, Types::Array.of(GraphEdge)
210
+
211
+ # Metadata about the overall graph
212
+ #
213
+ # @!attribute [r] metadata
214
+ # @return [GraphMetadata] Graph metadata
215
+ attribute :metadata, GraphMetadata
216
+
217
+ def initialize(*)
218
+ super
219
+ # Explicitly freeze arrays for immutability
220
+ nodes.freeze
221
+ edges.freeze
222
+ end
223
+ end
224
+ end
225
+ end
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tasker
4
+ module Types
5
+ # Configuration type for dependency graph calculation settings
6
+ #
7
+ # This configuration exposes previously hardcoded calculation constants
8
+ # used in dependency graph analysis and bottleneck detection.
9
+ #
10
+ # @example Basic usage
11
+ # config = DependencyGraphConfig.new(
12
+ # impact_multipliers: { downstream_weight: 5, blocked_weight: 15 }
13
+ # )
14
+ #
15
+ # @example With all options
16
+ # config = DependencyGraphConfig.new(
17
+ # impact_multipliers: {
18
+ # downstream_weight: 5,
19
+ # blocked_weight: 15,
20
+ # path_length_weight: 10,
21
+ # completed_penalty: 15,
22
+ # blocked_penalty: 25,
23
+ # error_penalty: 30,
24
+ # retry_penalty: 10
25
+ # },
26
+ # severity_multipliers: {
27
+ # error_state: 2.0,
28
+ # exhausted_retry_bonus: 0.5,
29
+ # dependency_issue: 1.2
30
+ # },
31
+ # penalty_constants: {
32
+ # retry_instability: 3,
33
+ # non_retryable: 10,
34
+ # exhausted_retry: 20
35
+ # },
36
+ # severity_thresholds: {
37
+ # critical: 100,
38
+ # high: 50,
39
+ # medium: 20
40
+ # },
41
+ # duration_estimates: {
42
+ # base_step_seconds: 30,
43
+ # error_penalty_seconds: 60,
44
+ # retry_penalty_seconds: 30
45
+ # }
46
+ # )
47
+ class DependencyGraphConfig < BaseConfig
48
+ transform_keys(&:to_sym)
49
+
50
+ # Impact multipliers for bottleneck scoring calculations
51
+ #
52
+ # These multipliers affect how different factors influence the final
53
+ # bottleneck impact scores in RuntimeGraphAnalyzer.
54
+ #
55
+ # @!attribute [r] impact_multipliers
56
+ # @return [Hash<Symbol, Integer>] Impact calculation multipliers
57
+ attribute :impact_multipliers, Types::Hash.schema(
58
+ downstream_weight: Types::Integer.default(5),
59
+ blocked_weight: Types::Integer.default(15),
60
+ path_length_weight: Types::Integer.default(10),
61
+ completed_penalty: Types::Integer.default(15),
62
+ blocked_penalty: Types::Integer.default(25),
63
+ error_penalty: Types::Integer.default(30),
64
+ retry_penalty: Types::Integer.default(10)
65
+ ).constructor { |value| value.respond_to?(:deep_symbolize_keys) ? value.deep_symbolize_keys : value }
66
+ .default({
67
+ downstream_weight: 5,
68
+ blocked_weight: 15,
69
+ path_length_weight: 10,
70
+ completed_penalty: 15,
71
+ blocked_penalty: 25,
72
+ error_penalty: 30,
73
+ retry_penalty: 10
74
+ }.freeze)
75
+
76
+ # Severity multipliers for state-based calculations
77
+ #
78
+ # These multipliers adjust impact scores based on step states
79
+ # and execution conditions.
80
+ #
81
+ # @!attribute [r] severity_multipliers
82
+ # @return [Hash<Symbol, Float>] State severity multipliers
83
+ attribute :severity_multipliers, Types::Hash.schema(
84
+ error_state: Types::Float.default(2.0),
85
+ exhausted_retry_bonus: Types::Float.default(0.5),
86
+ dependency_issue: Types::Float.default(1.2)
87
+ ).constructor { |value| value.respond_to?(:deep_symbolize_keys) ? value.deep_symbolize_keys : value }
88
+ .default({
89
+ error_state: 2.0,
90
+ exhausted_retry_bonus: 0.5,
91
+ dependency_issue: 1.2
92
+ }.freeze)
93
+
94
+ # Penalty constants for problematic step conditions
95
+ #
96
+ # These constants add penalty points for retry instability,
97
+ # non-retryable issues, and exhausted retry attempts.
98
+ #
99
+ # @!attribute [r] penalty_constants
100
+ # @return [Hash<Symbol, Integer>] Penalty calculation constants
101
+ attribute :penalty_constants, Types::Hash.schema(
102
+ retry_instability: Types::Integer.default(3),
103
+ non_retryable: Types::Integer.default(10),
104
+ exhausted_retry: Types::Integer.default(20)
105
+ ).constructor { |value| value.respond_to?(:deep_symbolize_keys) ? value.deep_symbolize_keys : value }
106
+ .default({
107
+ retry_instability: 3,
108
+ non_retryable: 10,
109
+ exhausted_retry: 20
110
+ }.freeze)
111
+
112
+ # Severity thresholds for impact score classification
113
+ #
114
+ # These thresholds determine when bottlenecks are classified as
115
+ # Critical, High, Medium, or Low severity.
116
+ #
117
+ # @!attribute [r] severity_thresholds
118
+ # @return [Hash<Symbol, Integer>] Severity classification thresholds
119
+ attribute :severity_thresholds, Types::Hash.schema(
120
+ critical: Types::Integer.default(100),
121
+ high: Types::Integer.default(50),
122
+ medium: Types::Integer.default(20)
123
+ ).constructor { |value| value.respond_to?(:deep_symbolize_keys) ? value.deep_symbolize_keys : value }
124
+ .default({
125
+ critical: 100,
126
+ high: 50,
127
+ medium: 20
128
+ }.freeze)
129
+
130
+ # Duration estimation constants for path analysis
131
+ #
132
+ # These constants are used for estimating execution times
133
+ # and calculating path durations.
134
+ #
135
+ # @!attribute [r] duration_estimates
136
+ # @return [Hash<Symbol, Integer>] Duration estimation constants in seconds
137
+ attribute :duration_estimates, Types::Hash.schema(
138
+ base_step_seconds: Types::Integer.default(30),
139
+ error_penalty_seconds: Types::Integer.default(60),
140
+ retry_penalty_seconds: Types::Integer.default(30)
141
+ ).constructor { |value| value.respond_to?(:deep_symbolize_keys) ? value.deep_symbolize_keys : value }
142
+ .default({
143
+ base_step_seconds: 30,
144
+ error_penalty_seconds: 60,
145
+ retry_penalty_seconds: 30
146
+ }.freeze)
147
+ end
148
+ end
149
+ end