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,508 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tasker
4
+ module Telemetry
5
+ # Intelligent cache management with adaptive TTL and distributed coordination
6
+ #
7
+ # This class implements a strategic constants vs configuration approach:
8
+ # - CONSTANTS: Infrastructure naming for consistency across deployments
9
+ # - CONFIGURABLE: Algorithm parameters for workload-specific tuning
10
+ #
11
+ # **Phase 2.1 Enhancement: Distributed Coordination**
12
+ # Leverages proven MetricsBackend patterns for multi-container coordination:
13
+ # - Instance ID generation (hostname-pid pattern)
14
+ # - Cache capability detection with adaptive strategies
15
+ # - Multi-strategy coordination (distributed_atomic, distributed_basic, local_only)
16
+ # - Atomic operations with fallback strategies
17
+ #
18
+ # Features:
19
+ # - Kubernetes-ready distributed cache coordination
20
+ # - Rails.cache abstraction (works with Redis, Memcached, File, Memory)
21
+ # - Configurable smoothing factors for different workload patterns
22
+ # - Comprehensive performance tracking with structured logging
23
+ #
24
+ # @example Basic usage
25
+ # manager = IntelligentCacheManager.new
26
+ # result = manager.intelligent_fetch('expensive_key') { expensive_computation }
27
+ #
28
+ # @example With custom configuration
29
+ # config = Tasker::Types::CacheConfig.new(hit_rate_smoothing_factor: 0.95)
30
+ # manager = IntelligentCacheManager.new(config)
31
+ # result = manager.intelligent_fetch('key', base_ttl: 600) { data }
32
+ #
33
+ class IntelligentCacheManager
34
+ include Tasker::Concerns::StructuredLogging
35
+
36
+ # ✅ CONSTANTS: Infrastructure naming (consistency across deployments)
37
+ CACHE_PERFORMANCE_KEY_PREFIX = 'tasker:cache_perf'
38
+ DASHBOARD_CACHE_KEY_PREFIX = 'tasker:dashboard'
39
+ WORKFLOW_CACHE_KEY_PREFIX = 'tasker:workflow'
40
+ PERFORMANCE_RETENTION_PERIOD = 1.hour
41
+ COORDINATION_RETRY_ATTEMPTS = 3
42
+
43
+ # ✅ CONSTANTS: Coordination strategy thresholds (algorithmic, not configurable)
44
+ ATOMIC_OPERATION_TIMEOUT = 5.seconds
45
+ BASIC_COORDINATION_TIMEOUT = 10.seconds
46
+ LOCAL_COORDINATION_TIMEOUT = 1.second
47
+
48
+ attr_reader :config, :instance_id, :cache_capabilities, :coordination_strategy
49
+
50
+ # Initialize intelligent cache manager with distributed coordination
51
+ #
52
+ # @param config [Tasker::Types::CacheConfig, nil] Cache configuration
53
+ def initialize(config = nil)
54
+ @config = config || Tasker.configuration.cache
55
+
56
+ # Use unified cache strategy for capability detection
57
+ @cache_strategy = Tasker::CacheStrategy.detect
58
+ @instance_id = @cache_strategy.instance_id
59
+ @coordination_strategy = @cache_strategy.coordination_mode
60
+
61
+ # Extract capabilities for backward compatibility
62
+ @cache_capabilities = @cache_strategy.export_capabilities
63
+ @coordination_config = configure_coordination_parameters
64
+
65
+ log_structured(:info, 'IntelligentCacheManager initialized',
66
+ coordination_strategy: @coordination_strategy,
67
+ cache_store: @cache_strategy.store_class_name,
68
+ instance_id: @instance_id,
69
+ adaptive_ttl_enabled: @config.adaptive_ttl_enabled,
70
+ performance_tracking_enabled: @config.performance_tracking_enabled)
71
+ end
72
+
73
+ # Main intelligent cache method with distributed coordination
74
+ #
75
+ # @param cache_key [String] The cache key
76
+ # @param base_ttl [Integer] Base TTL in seconds
77
+ # @yield Block that generates the value if cache miss
78
+ # @return [Object] The cached or generated value
79
+ def intelligent_fetch(cache_key, base_ttl: @config.default_ttl, &)
80
+ case @coordination_strategy
81
+ when :distributed_atomic
82
+ intelligent_fetch_with_atomic_coordination(cache_key, base_ttl, &)
83
+ when :distributed_basic
84
+ intelligent_fetch_with_basic_coordination(cache_key, base_ttl, &)
85
+ when :local_only
86
+ intelligent_fetch_with_local_tracking(cache_key, base_ttl, &)
87
+ else
88
+ # Fallback to basic Rails.cache behavior
89
+ Rails.cache.fetch(cache_key, expires_in: base_ttl, &)
90
+ end
91
+ end
92
+
93
+ # Clear performance data for a specific cache key
94
+ #
95
+ # @param cache_key [String] The cache key to clear performance data for
96
+ # @return [Boolean] Success status
97
+ def clear_performance_data(cache_key)
98
+ performance_key = build_performance_key(cache_key)
99
+ Rails.cache.delete(performance_key)
100
+
101
+ log_structured(:debug, 'Cache performance data cleared',
102
+ cache_key: cache_key,
103
+ performance_key: performance_key,
104
+ coordination_strategy: @coordination_strategy)
105
+
106
+ true
107
+ rescue StandardError => e
108
+ log_structured(:error, 'Failed to clear cache performance data',
109
+ cache_key: cache_key,
110
+ error: e.message,
111
+ coordination_strategy: @coordination_strategy)
112
+ false
113
+ end
114
+
115
+ # Export cache performance metrics for observability
116
+ #
117
+ # @return [Hash] Performance metrics summary
118
+ def export_performance_metrics
119
+ case @coordination_strategy
120
+ when :distributed_atomic, :distributed_basic
121
+ export_distributed_performance_metrics
122
+ when :local_only
123
+ export_local_performance_metrics
124
+ else
125
+ { strategy: @coordination_strategy, metrics: {} }
126
+ end
127
+ end
128
+
129
+ private
130
+
131
+ # Distributed atomic coordination (Redis with full features)
132
+ #
133
+ # @param cache_key [String] The cache key
134
+ # @param base_ttl [Integer] Base TTL in seconds
135
+ # @yield Block that generates the value
136
+ # @return [Object] The cached or generated value
137
+ def intelligent_fetch_with_atomic_coordination(cache_key, base_ttl, &)
138
+ # Get performance data atomically (no race conditions)
139
+ performance_data = fetch_atomic_performance_data(cache_key)
140
+ adaptive_ttl = @config.calculate_adaptive_ttl(base_ttl, **performance_data)
141
+
142
+ # Execute cache fetch with performance tracking
143
+ result = execute_tracked_fetch(cache_key, adaptive_ttl, &)
144
+
145
+ # Update performance metrics atomically
146
+ update_atomic_performance_metrics(cache_key, result[:hit], result[:duration])
147
+
148
+ result[:value]
149
+ end
150
+
151
+ # Distributed basic coordination (Memcached with read-modify-write)
152
+ #
153
+ # @param cache_key [String] The cache key
154
+ # @param base_ttl [Integer] Base TTL in seconds
155
+ # @yield Block that generates the value
156
+ # @return [Object] The cached or generated value
157
+ def intelligent_fetch_with_basic_coordination(cache_key, base_ttl, &)
158
+ # Get performance data with read-modify-write pattern
159
+ performance_data = fetch_basic_performance_data(cache_key)
160
+ adaptive_ttl = @config.calculate_adaptive_ttl(base_ttl, **performance_data)
161
+
162
+ # Execute cache fetch with performance tracking
163
+ result = execute_tracked_fetch(cache_key, adaptive_ttl, &)
164
+
165
+ # Update performance metrics with coordination
166
+ update_basic_performance_metrics(cache_key, result[:hit], result[:duration])
167
+
168
+ result[:value]
169
+ end
170
+
171
+ # Local-only tracking (Memory/File stores)
172
+ #
173
+ # @param cache_key [String] The cache key
174
+ # @param base_ttl [Integer] Base TTL in seconds
175
+ # @yield Block that generates the value
176
+ # @return [Object] The cached or generated value
177
+ def intelligent_fetch_with_local_tracking(cache_key, base_ttl, &)
178
+ # Get instance-specific performance data
179
+ performance_data = fetch_local_performance_data(cache_key)
180
+ adaptive_ttl = @config.calculate_adaptive_ttl(base_ttl, **performance_data)
181
+
182
+ # Execute cache fetch with local tracking
183
+ result = execute_tracked_fetch(cache_key, adaptive_ttl, &)
184
+
185
+ # Update local performance metrics
186
+ update_local_performance_metrics(cache_key, result[:hit], result[:duration])
187
+
188
+ result[:value]
189
+ end
190
+
191
+ # Execute cache fetch with comprehensive tracking
192
+ #
193
+ # @param cache_key [String] The cache key
194
+ # @param adaptive_ttl [Integer] Calculated adaptive TTL
195
+ # @yield Block that generates the value
196
+ # @return [Hash] Result with hit status, duration, and value
197
+ def execute_tracked_fetch(cache_key, adaptive_ttl)
198
+ fetch_start = Time.current
199
+ cache_miss = false
200
+
201
+ value = Rails.cache.fetch(cache_key, expires_in: adaptive_ttl) do
202
+ cache_miss = true # This is a miss since we're in the block
203
+ yield
204
+ end
205
+
206
+ # Cache hit is the opposite of cache miss
207
+ cache_hit = !cache_miss
208
+
209
+ fetch_duration = Time.current - fetch_start
210
+
211
+ log_structured(:debug, 'Intelligent cache fetch completed',
212
+ cache_key: cache_key,
213
+ adaptive_ttl: adaptive_ttl,
214
+ cache_hit: cache_hit,
215
+ fetch_duration_ms: (fetch_duration * 1000).round(2),
216
+ coordination_strategy: @coordination_strategy)
217
+
218
+ {
219
+ value: value,
220
+ hit: cache_hit,
221
+ duration: fetch_duration
222
+ }
223
+ end
224
+
225
+ # Build performance key with strategic process isolation
226
+ #
227
+ # @param cache_key [String] The original cache key
228
+ # @return [String] Performance tracking key
229
+ def build_performance_key(cache_key)
230
+ case @coordination_strategy
231
+ when :distributed_atomic, :distributed_basic
232
+ # GLOBAL: Shared performance data across containers for system-wide optimization
233
+ "#{CACHE_PERFORMANCE_KEY_PREFIX}:#{cache_key}"
234
+ when :local_only
235
+ # LOCAL: Instance-specific performance data for single-process stores
236
+ "#{CACHE_PERFORMANCE_KEY_PREFIX}:#{@instance_id}:#{cache_key}"
237
+ else
238
+ "#{CACHE_PERFORMANCE_KEY_PREFIX}:fallback:#{cache_key}"
239
+ end
240
+ end
241
+
242
+ # Fetch performance data using atomic operations (Redis)
243
+ #
244
+ # @param cache_key [String] The cache key
245
+ # @return [Hash] Performance data for adaptive TTL calculation
246
+ def fetch_atomic_performance_data(cache_key)
247
+ performance_key = build_performance_key(cache_key)
248
+
249
+ # Use atomic operations to get consistent performance data
250
+ performance_data = Rails.cache.read(performance_key) || initialize_performance_data
251
+
252
+ # Return data in format expected by calculate_adaptive_ttl
253
+ {
254
+ hit_rate: performance_data[:hit_rate] || 0.0,
255
+ generation_time: performance_data[:avg_generation_time] || 0.0,
256
+ access_frequency: performance_data[:access_frequency] || 0
257
+ }
258
+ rescue StandardError => e
259
+ log_structured(:error, 'Failed to fetch atomic performance data',
260
+ cache_key: cache_key,
261
+ error: e.message)
262
+ default_performance_data
263
+ end
264
+
265
+ # Fetch performance data using basic read-modify-write (Memcached)
266
+ #
267
+ # @param cache_key [String] The cache key
268
+ # @return [Hash] Performance data for adaptive TTL calculation
269
+ def fetch_basic_performance_data(cache_key)
270
+ performance_key = build_performance_key(cache_key)
271
+
272
+ performance_data = Rails.cache.read(performance_key) || initialize_performance_data
273
+
274
+ {
275
+ hit_rate: performance_data[:hit_rate] || 0.0,
276
+ generation_time: performance_data[:avg_generation_time] || 0.0,
277
+ access_frequency: performance_data[:access_frequency] || 0
278
+ }
279
+ rescue StandardError => e
280
+ log_structured(:error, 'Failed to fetch basic performance data',
281
+ cache_key: cache_key,
282
+ error: e.message)
283
+ default_performance_data
284
+ end
285
+
286
+ # Fetch local performance data (Memory/File stores)
287
+ #
288
+ # @param cache_key [String] The cache key
289
+ # @return [Hash] Performance data for adaptive TTL calculation
290
+ def fetch_local_performance_data(cache_key)
291
+ performance_key = build_performance_key(cache_key)
292
+
293
+ performance_data = Rails.cache.read(performance_key) || initialize_performance_data
294
+
295
+ {
296
+ hit_rate: performance_data[:hit_rate] || 0.0,
297
+ generation_time: performance_data[:avg_generation_time] || 0.0,
298
+ access_frequency: performance_data[:access_frequency] || 0
299
+ }
300
+ rescue StandardError => e
301
+ log_structured(:error, 'Failed to fetch local performance data',
302
+ cache_key: cache_key,
303
+ error: e.message)
304
+ default_performance_data
305
+ end
306
+
307
+ # Update performance metrics using atomic operations
308
+ #
309
+ # @param cache_key [String] The cache key
310
+ # @param cache_hit [Boolean] Whether this was a cache hit
311
+ # @param duration [Float] Fetch duration in seconds
312
+ def update_atomic_performance_metrics(cache_key, cache_hit, duration)
313
+ performance_key = build_performance_key(cache_key)
314
+
315
+ # Use atomic operations for thread-safe updates
316
+ performance_data = Rails.cache.read(performance_key) || initialize_performance_data
317
+ updated_data = calculate_updated_performance_data(performance_data, cache_hit, duration)
318
+
319
+ Rails.cache.write(performance_key, updated_data, expires_in: PERFORMANCE_RETENTION_PERIOD)
320
+ rescue StandardError => e
321
+ log_structured(:error, 'Failed to update atomic performance metrics',
322
+ cache_key: cache_key,
323
+ error: e.message)
324
+ end
325
+
326
+ # Update performance metrics using basic coordination
327
+ #
328
+ # @param cache_key [String] The cache key
329
+ # @param cache_hit [Boolean] Whether this was a cache hit
330
+ # @param duration [Float] Fetch duration in seconds
331
+ def update_basic_performance_metrics(cache_key, cache_hit, duration)
332
+ performance_key = build_performance_key(cache_key)
333
+
334
+ # Read-modify-write pattern for basic coordination
335
+ performance_data = Rails.cache.read(performance_key) || initialize_performance_data
336
+ updated_data = calculate_updated_performance_data(performance_data, cache_hit, duration)
337
+
338
+ Rails.cache.write(performance_key, updated_data, expires_in: PERFORMANCE_RETENTION_PERIOD)
339
+ rescue StandardError => e
340
+ log_structured(:error, 'Failed to update basic performance metrics',
341
+ cache_key: cache_key,
342
+ error: e.message)
343
+ end
344
+
345
+ # Update local performance metrics
346
+ #
347
+ # @param cache_key [String] The cache key
348
+ # @param cache_hit [Boolean] Whether this was a cache hit
349
+ # @param duration [Float] Fetch duration in seconds
350
+ def update_local_performance_metrics(cache_key, cache_hit, duration)
351
+ performance_key = build_performance_key(cache_key)
352
+
353
+ performance_data = Rails.cache.read(performance_key) || initialize_performance_data
354
+ updated_data = calculate_updated_performance_data(performance_data, cache_hit, duration)
355
+
356
+ Rails.cache.write(performance_key, updated_data, expires_in: PERFORMANCE_RETENTION_PERIOD)
357
+ rescue StandardError => e
358
+ log_structured(:error, 'Failed to update local performance metrics',
359
+ cache_key: cache_key,
360
+ error: e.message)
361
+ end
362
+
363
+ # Calculate updated performance data with smoothing
364
+ #
365
+ # @param current_data [Hash] Current performance data
366
+ # @param cache_hit [Boolean] Whether this was a cache hit
367
+ # @param duration [Float] Fetch duration in seconds
368
+ # @return [Hash] Updated performance data
369
+ def calculate_updated_performance_data(current_data, cache_hit, duration)
370
+ # Apply smoothing factors from configuration
371
+ smoothing_factor = @config.hit_rate_smoothing_factor
372
+ decay_rate = @config.access_frequency_decay_rate
373
+
374
+ # Ensure current_data has required keys with defaults
375
+ current_hit_rate = current_data[:hit_rate] || 0.0
376
+ current_avg_generation_time = current_data[:avg_generation_time] || 0.0
377
+ current_access_frequency = current_data[:access_frequency] || 0
378
+ current_total_accesses = current_data[:total_accesses] || 0
379
+ current_cache_hits = current_data[:cache_hits] || 0
380
+ current_cache_misses = current_data[:cache_misses] || 0
381
+
382
+ # Update hit rate with exponential smoothing
383
+ hit_value = cache_hit ? 1.0 : 0.0
384
+ new_hit_rate = (current_hit_rate * smoothing_factor) + (hit_value * (1 - smoothing_factor))
385
+
386
+ # Update average generation time (only for misses)
387
+ new_avg_generation_time = if cache_hit
388
+ current_avg_generation_time * decay_rate
389
+ else
390
+ (current_avg_generation_time * smoothing_factor) + (duration * (1 - smoothing_factor))
391
+ end
392
+
393
+ # Update access frequency with decay
394
+ new_access_frequency = (current_access_frequency * decay_rate) + 1
395
+
396
+ {
397
+ hit_rate: new_hit_rate.clamp(0.0, 1.0),
398
+ avg_generation_time: new_avg_generation_time,
399
+ access_frequency: new_access_frequency,
400
+ last_updated: Time.current,
401
+ total_accesses: current_total_accesses + 1,
402
+ cache_hits: current_cache_hits + (cache_hit ? 1 : 0),
403
+ cache_misses: current_cache_misses + (cache_hit ? 0 : 1)
404
+ }
405
+ end
406
+
407
+ # Initialize performance data structure
408
+ #
409
+ # @return [Hash] Initial performance data
410
+ def initialize_performance_data
411
+ {
412
+ hit_rate: 0.0,
413
+ avg_generation_time: 0.0,
414
+ access_frequency: 0,
415
+ last_updated: Time.current,
416
+ total_accesses: 0,
417
+ cache_hits: 0,
418
+ cache_misses: 0
419
+ }
420
+ end
421
+
422
+ # Default performance data for error cases
423
+ #
424
+ # @return [Hash] Safe default performance data
425
+ def default_performance_data
426
+ {
427
+ hit_rate: 0.0,
428
+ generation_time: 0.0,
429
+ access_frequency: 0
430
+ }
431
+ end
432
+
433
+ # Export distributed performance metrics
434
+ #
435
+ # @return [Hash] Distributed performance metrics
436
+ def export_distributed_performance_metrics
437
+ {
438
+ strategy: @coordination_strategy,
439
+ instance_id: @instance_id,
440
+ cache_store: @cache_capabilities[:store_class],
441
+ coordination_config: @coordination_config,
442
+ metrics: gather_distributed_metrics
443
+ }
444
+ end
445
+
446
+ # Export local performance metrics
447
+ #
448
+ # @return [Hash] Local performance metrics
449
+ def export_local_performance_metrics
450
+ {
451
+ strategy: @coordination_strategy,
452
+ instance_id: @instance_id,
453
+ cache_store: @cache_capabilities[:store_class],
454
+ metrics: gather_local_metrics,
455
+ warning: 'Local-only metrics - not shared across containers'
456
+ }
457
+ end
458
+
459
+ # Gather distributed metrics from shared cache
460
+ #
461
+ # @return [Hash] Gathered metrics
462
+ def gather_distributed_metrics
463
+ # Implementation would scan for performance keys and aggregate
464
+ # For now, return basic structure
465
+ {
466
+ total_keys_tracked: 0,
467
+ avg_hit_rate: 0.0,
468
+ coordination_overhead: 'minimal'
469
+ }
470
+ end
471
+
472
+ # Gather local metrics from instance cache
473
+ #
474
+ # @return [Hash] Local metrics
475
+ def gather_local_metrics
476
+ {
477
+ total_keys_tracked: 0,
478
+ avg_hit_rate: 0.0,
479
+ instance_specific: true
480
+ }
481
+ end
482
+
483
+ # Configure coordination parameters based on strategy
484
+ #
485
+ # @return [Hash] Coordination configuration
486
+ def configure_coordination_parameters
487
+ {
488
+ retry_attempts: COORDINATION_RETRY_ATTEMPTS,
489
+ timeout: coordination_timeout_for_strategy,
490
+ retention_window: PERFORMANCE_RETENTION_PERIOD,
491
+ batch_size: @config.respond_to?(:coordination_batch_size) ? @config.coordination_batch_size : 50
492
+ }
493
+ end
494
+
495
+ # Get appropriate timeout for coordination strategy
496
+ #
497
+ # @return [Integer] Timeout in seconds
498
+ def coordination_timeout_for_strategy
499
+ case @coordination_strategy
500
+ when :distributed_atomic then ATOMIC_OPERATION_TIMEOUT
501
+ when :distributed_basic then BASIC_COORDINATION_TIMEOUT
502
+ when :local_only then LOCAL_COORDINATION_TIMEOUT
503
+ else 5.seconds
504
+ end
505
+ end
506
+ end
507
+ end
508
+ end