digitalkin 1.0.0.dev22__tar.gz → 1.0.0.dev24__tar.gz

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 (237) hide show
  1. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/PKG-INFO +2 -2
  2. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/pyproject.toml +2 -2
  3. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/__version__.py +1 -1
  4. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/profiling/step_timer.py +2 -2
  5. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/local_task_manager.py +0 -4
  6. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/module_runner.py +2 -13
  7. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -6
  8. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/redis_signal.py +14 -20
  9. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -4
  10. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/task_session.py +4 -4
  11. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/gateway_servicer.py +46 -69
  12. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/m2m_call_registry.py +1 -8
  13. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/module_server.py +0 -4
  14. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/module_servicer.py +13 -2
  15. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/stream_registry.py +0 -5
  16. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +2 -19
  17. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/logger.py +0 -3
  18. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/agui_mixin.py +0 -4
  19. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/tool_reference.py +3 -3
  20. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/communication/grpc_communication.py +46 -15
  21. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/cost/grpc_cost.py +0 -3
  22. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -3
  23. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/grpc_registry.py +0 -3
  24. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/secret/grpc_secret.py +13 -2
  25. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/services_config.py +6 -0
  26. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/setup/grpc_setup.py +0 -3
  27. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/storage/grpc_storage.py +0 -3
  28. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/task_manager/default_task_manager.py +1 -4
  29. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -3
  30. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin.egg-info/PKG-INFO +2 -2
  31. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin.egg-info/requires.txt +1 -1
  32. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/LICENSE +0 -0
  33. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/README.md +0 -0
  34. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/__init__.py +0 -0
  35. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/mock/__init__.py +0 -0
  36. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/mock/mock_pb2.py +0 -0
  37. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  38. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/server_async_insecure.py +0 -0
  39. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/server_async_secure.py +0 -0
  40. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/server_sync_insecure.py +0 -0
  41. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/base_server/server_sync_secure.py +0 -0
  42. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/__init__.py +0 -0
  43. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/echo_module.py +0 -0
  44. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/models/__init__.py +0 -0
  45. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/models/input.py +0 -0
  46. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/models/output.py +0 -0
  47. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/models/secret.py +0 -0
  48. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/models/setup.py +0 -0
  49. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/server.py +0 -0
  50. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/triggers/__init__.py +0 -0
  51. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/bench_module/triggers/message_trigger.py +0 -0
  52. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/__init__.py +0 -0
  53. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/archetype_with_tools_module.py +0 -0
  54. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/cpu_intensive_module.py +0 -0
  55. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/dynamic_setup_module.py +0 -0
  56. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/minimal_llm_module.py +0 -0
  57. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/modules/text_transform_module.py +0 -0
  58. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  59. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  60. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  61. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  62. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  63. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/monitoring/tests/test_metrics.py +0 -0
  64. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/client.py +0 -0
  65. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/echo_module.py +0 -0
  66. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/models/__init__.py +0 -0
  67. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/models/input.py +0 -0
  68. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/models/output.py +0 -0
  69. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/models/secret.py +0 -0
  70. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/models/setup.py +0 -0
  71. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/server.py +0 -0
  72. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/triggers/__init__.py +0 -0
  73. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/redis_demo/triggers/message_trigger.py +0 -0
  74. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/services/filesystem_module.py +0 -0
  75. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/examples/services/storage_module.py +0 -0
  76. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/setup.cfg +0 -0
  77. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/__init__.py +0 -0
  78. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/__init__.py +0 -0
  79. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/agno/__init__.py +0 -0
  80. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/agno/agno_adapter.py +0 -0
  81. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/agno/agui_tools.py +0 -0
  82. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/agno/hitl.py +0 -0
  83. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/community/agno/models.py +0 -0
  84. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/__init__.py +0 -0
  85. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/common/__init__.py +0 -0
  86. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/common/factories.py +0 -0
  87. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/exceptions.py +0 -0
  88. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/job_manager/__init__.py +0 -0
  89. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  90. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
  91. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/profiling/__init__.py +0 -0
  92. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/profiling/task_profiler.py +0 -0
  93. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/resilience/__init__.py +0 -0
  94. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/resilience/bulkhead.py +0 -0
  95. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
  96. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/__init__.py +0 -0
  97. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
  98. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
  99. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
  100. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
  101. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
  102. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/core/task_manager/task_executor.py +0 -0
  103. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/exceptions.py +0 -0
  104. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/__init__.py +0 -0
  105. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/_base_server.py +0 -0
  106. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/exceptions.py +0 -0
  107. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  108. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
  109. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
  110. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/stream_session.py +0 -0
  111. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  112. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
  113. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
  114. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
  115. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
  116. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/__init__.py +0 -0
  117. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/base_mixin.py +0 -0
  118. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/cost_mixin.py +0 -0
  119. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/file_history_mixin.py +0 -0
  120. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
  121. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/logger_mixin.py +0 -0
  122. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/mixins/storage_mixin.py +0 -0
  123. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/__init__.py +0 -0
  124. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/core/__init__.py +0 -0
  125. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/core/job_manager_models.py +0 -0
  126. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/core/redis.py +0 -0
  127. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/core/task_monitor.py +0 -0
  128. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/events/__init__.py +0 -0
  129. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/events/agent_events.py +0 -0
  130. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  131. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
  132. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
  133. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/models.py +0 -0
  134. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
  135. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/grpc_servers/types.py +0 -0
  136. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/__init__.py +0 -0
  137. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/ag_ui.py +0 -0
  138. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/base_types.py +0 -0
  139. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/module.py +0 -0
  140. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/module_context.py +0 -0
  141. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/module_types.py +0 -0
  142. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/request_metadata.py +0 -0
  143. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/select_schema.py +0 -0
  144. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/setup_types.py +0 -0
  145. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/tool_cache.py +0 -0
  146. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/module/utility.py +0 -0
  147. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/services/__init__.py +0 -0
  148. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/services/cost.py +0 -0
  149. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/services/registry.py +0 -0
  150. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/services/services.py +0 -0
  151. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/services/storage.py +0 -0
  152. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/__init__.py +0 -0
  153. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/gateway.py +0 -0
  154. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/grpc_client.py +0 -0
  155. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/log.py +0 -0
  156. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/module.py +0 -0
  157. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/profiling.py +0 -0
  158. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/queue.py +0 -0
  159. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/redis.py +0 -0
  160. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/resilience.py +0 -0
  161. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/server/__init__.py +0 -0
  162. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/server/channel.py +0 -0
  163. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/server/grpc.py +0 -0
  164. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/server/server.py +0 -0
  165. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/server/servicer.py +0 -0
  166. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/task_manager.py +0 -0
  167. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  168. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/settings/utils/channel.py +0 -0
  169. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/utils/__init__.py +0 -0
  170. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
  171. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/__init__.py +0 -0
  172. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/_base_module.py +0 -0
  173. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/archetype_module.py +0 -0
  174. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/tool_module.py +0 -0
  175. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/trigger_handler.py +0 -0
  176. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/triggers/__init__.py +0 -0
  177. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
  178. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
  179. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
  180. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/py.typed +0 -0
  181. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/__init__.py +0 -0
  182. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/base_strategy.py +0 -0
  183. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/communication/__init__.py +0 -0
  184. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/communication/communication_strategy.py +0 -0
  185. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/communication/default_communication.py +0 -0
  186. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/communication/exceptions.py +0 -0
  187. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/cost/__init__.py +0 -0
  188. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  189. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/cost/default_cost.py +0 -0
  190. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/cost/exceptions.py +0 -0
  191. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/filesystem/__init__.py +0 -0
  192. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
  193. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/filesystem/exceptions.py +0 -0
  194. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
  195. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/identity/__init__.py +0 -0
  196. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/identity/default_identity.py +0 -0
  197. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  198. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/__init__.py +0 -0
  199. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/default_registry.py +0 -0
  200. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/exceptions.py +0 -0
  201. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/registry_models.py +0 -0
  202. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/registry/registry_strategy.py +0 -0
  203. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/secret/__init__.py +0 -0
  204. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/secret/default_secret.py +0 -0
  205. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/secret/exceptions.py +0 -0
  206. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/secret/secret_strategy.py +0 -0
  207. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/services_models.py +0 -0
  208. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/setup/__init__.py +0 -0
  209. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/setup/default_setup.py +0 -0
  210. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/setup/exceptions.py +0 -0
  211. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/setup/setup_strategy.py +0 -0
  212. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/storage/__init__.py +0 -0
  213. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/storage/default_storage.py +0 -0
  214. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/storage/exceptions.py +0 -0
  215. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  216. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/task_manager/__init__.py +0 -0
  217. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/task_manager/exceptions.py +0 -0
  218. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
  219. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  220. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/user_profile/__init__.py +0 -0
  221. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
  222. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/user_profile/exceptions.py +0 -0
  223. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
  224. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/__init__.py +0 -0
  225. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/arg_parser.py +0 -0
  226. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/conditional_schema.py +0 -0
  227. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/development_mode_action.py +0 -0
  228. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/dynamic_schema.py +0 -0
  229. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/exceptions.py +0 -0
  230. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  231. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/package_discover.py +0 -0
  232. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/proto_utils.py +0 -0
  233. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin/utils/schema_splitter.py +0 -0
  234. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin.egg-info/SOURCES.txt +0 -0
  235. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  236. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/src/digitalkin.egg-info/top_level.txt +0 -0
  237. {digitalkin-1.0.0.dev22 → digitalkin-1.0.0.dev24}/tests/test_exceptions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 1.0.0.dev22
3
+ Version: 1.0.0.dev24
4
4
  Summary: SDK to build kin used in DigitalKin
5
5
  Author-email: "DigitalKin.ai" <contact@digitalkin.ai>
6
6
  License: Attribution-NonCommercial-ShareAlike 4.0 International
@@ -453,7 +453,7 @@ Requires-Python: >=3.10
453
453
  Description-Content-Type: text/markdown
454
454
  License-File: LICENSE
455
455
  Requires-Dist: ag-ui-protocol>=0.1.18
456
- Requires-Dist: agentic-mesh-protocol==1.0.0a1
456
+ Requires-Dist: agentic-mesh-protocol==1.0.0a2
457
457
  Requires-Dist: anyio>=4.13.0
458
458
  Requires-Dist: grpcio-health-checking==1.81.0
459
459
  Requires-Dist: grpcio-reflection==1.81.0
@@ -28,7 +28,7 @@
28
28
 
29
29
  dependencies = [
30
30
  "ag-ui-protocol>=0.1.18",
31
- "agentic-mesh-protocol==1.0.0a1",
31
+ "agentic-mesh-protocol==1.0.0a2",
32
32
  "anyio>=4.13.0",
33
33
  "grpcio-health-checking==1.81.0",
34
34
  "grpcio-reflection==1.81.0",
@@ -37,7 +37,7 @@
37
37
  "pydantic-settings>=2.14.1",
38
38
  "redis[hiredis]>=7.4.0,<9",
39
39
  ]
40
- version = "1.0.0.dev22"
40
+ version = "1.0.0.dev24"
41
41
 
42
42
  [project.optional-dependencies]
43
43
  performance = [ "uvloop>=0.21" ]
@@ -5,4 +5,4 @@ from importlib.metadata import PackageNotFoundError, version
5
5
  try:
6
6
  __version__ = version("digitalkin")
7
7
  except PackageNotFoundError:
8
- __version__ = "1.0.0.dev22"
8
+ __version__ = "1.0.0.dev24"
@@ -51,9 +51,9 @@ class StepTimer:
51
51
  total = (self._last - self._t0) / 1e6
52
52
  parts.append(f"total={total:.2f}ms")
53
53
  if task_id:
54
- logger.info("[lat-audit] %s: %s task_id=%s", prefix, " ".join(parts), task_id)
54
+ logger.debug("[perf] %s: %s task_id=%s", prefix, " ".join(parts), task_id)
55
55
  else:
56
- logger.info("[lat-audit] %s: %s", prefix, " ".join(parts))
56
+ logger.debug("[perf] %s: %s", prefix, " ".join(parts))
57
57
 
58
58
  def total_ms(self) -> float:
59
59
  """Total elapsed time across all marks in milliseconds.
@@ -91,10 +91,6 @@ class LocalTaskManager(BaseTaskManager):
91
91
  else:
92
92
  # H2: this call never registered a session (e.g. duplicate task_id) —
93
93
  # undo only THIS call's admission; never touch the live task.
94
- logger.info(
95
- "[VALIDATE H2] create rejected without touching live task: '%s'",
96
- task_id,
97
- ) # TODO(validate): remove after prod validation
98
94
  self._release_admission()
99
95
  logger.exception(
100
96
  "Failed to create local task: '%s'",
@@ -113,12 +113,6 @@ class ModuleRunner:
113
113
  await self._redis_client.xadd(stream_key, {"eos": b"true"})
114
114
  await self._redis_client.expire(stream_key, stream_settings.redis_stream_ttl)
115
115
  t_eos_write_end = time.perf_counter_ns()
116
- logger.info(
117
- "[VALIDATE M4] proto stream wrote %d seq'd entries (maxlen=%d): task_id=%s",
118
- seq,
119
- stream_maxlen,
120
- task_id,
121
- ) # TODO(validate): remove after prod validation
122
116
  logger.info(
123
117
  "[close-debug] producer_eos_write: xadd_expire=%.2fms t_done_ns=%d task_id=%s",
124
118
  (t_eos_write_end - t_eos_write_start) / 1e6,
@@ -137,8 +131,8 @@ class ModuleRunner:
137
131
  # Arm a TTL on first XADD; final EXPIRE on stream.end shortens it.
138
132
  if not first_logged:
139
133
  elapsed_ms = (time.perf_counter_ns() - runner_start_ns) / 1e6
140
- logger.info(
141
- "[lat-audit] producer_first_byte_to_redis: %.1fms task_id=%s",
134
+ logger.debug(
135
+ "[perf] producer_first_byte_to_redis: %.1fms task_id=%s",
142
136
  elapsed_ms,
143
137
  task_id,
144
138
  extra=log_extra,
@@ -218,11 +212,6 @@ class ModuleRunner:
218
212
  logger.exception("ModuleRunner: backpressure timeout", extra=log_extra)
219
213
  await on_fatal(StreamErrorCode.BACKPRESSURE_TIMEOUT.value, str(exc))
220
214
  except RedisError as exc:
221
- logger.error(
222
- "[VALIDATE R2] ModuleRunner: Redis unavailable writing output: task_id=%s",
223
- task_id,
224
- extra=log_extra,
225
- ) # TODO(validate): remove after prod validation
226
215
  await on_fatal(
227
216
  StreamErrorCode.REDIS_UNAVAILABLE.value,
228
217
  f"redis unavailable: {type(exc).__name__}: {exc}",
@@ -150,12 +150,6 @@ class ProtoStreamReader:
150
150
  s.ParseFromString(pb_bytes)
151
151
  except DecodeError:
152
152
  # M6: poison entry (truncated/corrupt pb) — drop it, keep the stream alive.
153
- logger.warning(
154
- "[VALIDATE M6] dropped corrupt proto stream entry: task_id=%s seq=%d bytes=%d",
155
- self._task_id,
156
- seq,
157
- len(pb_bytes),
158
- ) # TODO(validate): remove after prod validation
159
153
  continue
160
154
  yield s
161
155
 
@@ -108,8 +108,8 @@ class SharedRedisListener:
108
108
  self._pubsub = self._redis_client.pubsub()
109
109
  await self._pubsub.psubscribe("signal_ch:*")
110
110
  psub_ms = (time.perf_counter_ns() - psub_t0) / 1e6
111
- logger.info(
112
- "[lat-audit] signal_psubscribe: psubscribe_ms=%.2f pattern=signal_ch:* phase=boot origin=%s",
111
+ logger.debug(
112
+ "[perf] signal_psubscribe: psubscribe_ms=%.2f pattern=signal_ch:* phase=boot origin=%s",
113
113
  psub_ms,
114
114
  SharedRedisListener.PROCESS_ID,
115
115
  )
@@ -142,8 +142,8 @@ class SharedRedisListener:
142
142
  task.add_done_callback(lambda _: self.unregister(task_id))
143
143
 
144
144
  self._counters["subscribed"] += 1
145
- logger.info(
146
- "[lat-audit] signal_subscribe: register_ms=%.2f active_subs=%d task_id=%s origin=%s",
145
+ logger.debug(
146
+ "[perf] signal_subscribe: register_ms=%.2f active_subs=%d task_id=%s origin=%s",
147
147
  (time.perf_counter_ns() - reg_t0) / 1e6,
148
148
  len(self._task_refs),
149
149
  task_id,
@@ -176,14 +176,11 @@ class SharedRedisListener:
176
176
  if action.startswith("invalidate_"):
177
177
  origin = data.get("origin")
178
178
  if origin is not None and origin == SharedRedisListener.PROCESS_ID:
179
- logger.debug(
180
- "[VALIDATE D3b] skipped self-originated invalidate action=%s", action
181
- ) # TODO(validate): remove after prod validation
182
179
  return True
183
180
  setup_id = data.get("setup_id", "")
184
181
  self._counters["invalidated"] += 1
185
- logger.info(
186
- "[lat-audit] signal_invalidate: e2e_ms=%.2f action=%s setup_id=%s",
182
+ logger.debug(
183
+ "[perf] signal_invalidate: e2e_ms=%.2f action=%s setup_id=%s",
187
184
  e2e_ms,
188
185
  action,
189
186
  setup_id,
@@ -196,8 +193,8 @@ class SharedRedisListener:
196
193
  inv_task.add_done_callback(log_unhandled)
197
194
  return True
198
195
 
199
- logger.info(
200
- "[lat-audit] signal_dispatch: e2e_ms=%.2f dispatch_ms=%.2f action=%s task_id=%s",
196
+ logger.debug(
197
+ "[perf] signal_dispatch: e2e_ms=%.2f dispatch_ms=%.2f action=%s task_id=%s",
201
198
  e2e_ms,
202
199
  (time.perf_counter_ns() - dispatch_t0) / 1e6,
203
200
  action,
@@ -253,8 +250,8 @@ class SharedRedisListener:
253
250
  psub_t0 = time.perf_counter_ns()
254
251
  await self._pubsub.psubscribe("signal_ch:*")
255
252
  psub_ms = (time.perf_counter_ns() - psub_t0) / 1e6
256
- logger.info(
257
- "[lat-audit] signal_psubscribe: psubscribe_ms=%.2f pattern=signal_ch:* phase=loop",
253
+ logger.debug(
254
+ "[perf] signal_psubscribe: psubscribe_ms=%.2f pattern=signal_ch:* phase=loop",
258
255
  psub_ms,
259
256
  )
260
257
  msg = await self._pubsub.get_message(ignore_subscribe_messages=True, timeout=0.5)
@@ -264,8 +261,8 @@ class SharedRedisListener:
264
261
  route_task_id, data, raw_json = parsed
265
262
  pub_ns = data.get("published_at_ns") or 0
266
263
  e2e_ms = (time.time_ns() - pub_ns) / 1e6 if pub_ns else 0.0
267
- logger.info(
268
- "[lat-audit] signal_route: e2e_ms=%.2f action=%s task_id=%s",
264
+ logger.debug(
265
+ "[perf] signal_route: e2e_ms=%.2f action=%s task_id=%s",
269
266
  e2e_ms,
270
267
  data.get("action", ""),
271
268
  route_task_id,
@@ -279,9 +276,6 @@ class SharedRedisListener:
279
276
  if self._pubsub is not None:
280
277
  with contextlib.suppress(Exception):
281
278
  await self._pubsub.aclose()
282
- logger.info(
283
- "[VALIDATE D3a] closed stale pubsub before reconnect (backoff=%.1fs)", backoff
284
- ) # TODO(validate): remove after prod validation
285
279
  self._pubsub = None
286
280
  logger.exception("SharedRedisListener iteration error, retrying in %.1fs", backoff)
287
281
  await asyncio.sleep(backoff)
@@ -290,8 +284,8 @@ class SharedRedisListener:
290
284
  now = time.monotonic()
291
285
  if now - self._last_counters_log >= 60.0: # noqa: PLR2004
292
286
  c = self._counters
293
- logger.info(
294
- "[lat-audit] signal_counters: origin=%s received=%d deduped=%d evicted=%d "
287
+ logger.debug(
288
+ "[perf] signal_counters: origin=%s received=%d deduped=%d evicted=%d "
295
289
  "dropped=%d listener_restarts=%d active_subs=%d subscribed_total=%d "
296
290
  "invalidated=%d",
297
291
  SharedRedisListener.PROCESS_ID,
@@ -72,10 +72,6 @@ class RemoteTaskManager(BaseTaskManager):
72
72
  else:
73
73
  # H2: this call never registered a session (e.g. duplicate task_id) —
74
74
  # undo only THIS call's admission; never touch the live task.
75
- logger.info(
76
- "[VALIDATE H2] remote create rejected without touching live task: '%s'",
77
- task_id,
78
- ) # TODO(validate): remove after prod validation
79
75
  self._release_admission()
80
76
  logger.exception(
81
77
  "Failed to register remote task: '%s'",
@@ -208,8 +208,8 @@ class TaskSession:
208
208
  pub_ns = self.last_signal_published_ns
209
209
  e2e_ms = (time.time_ns() - pub_ns) / 1e6 if pub_ns else 0.0
210
210
  self.last_signal_published_ns = 0
211
- logger.info(
212
- "[lat-audit] signal_handle: handler=cancel reason=%s e2e_ms=%.2f "
211
+ logger.debug(
212
+ "[perf] signal_handle: handler=cancel reason=%s e2e_ms=%.2f "
213
213
  "body_ms=%.2f ack_send_ms=%.2f ack_ok=%s task_id=%s",
214
214
  reason.value,
215
215
  e2e_ms,
@@ -263,8 +263,8 @@ class TaskSession:
263
263
  pub_ns = self.last_signal_published_ns
264
264
  e2e_ms = (time.time_ns() - pub_ns) / 1e6 if pub_ns else 0.0
265
265
  self.last_signal_published_ns = 0
266
- logger.info(
267
- "[lat-audit] signal_handle: handler=stop reason=%s e2e_ms=%.2f "
266
+ logger.debug(
267
+ "[perf] signal_handle: handler=stop reason=%s e2e_ms=%.2f "
268
268
  "body_ms=%.2f ack_send_ms=%.2f ack_ok=%s task_id=%s",
269
269
  CancellationReason.SIGNAL_SERVICE_STOP.value,
270
270
  e2e_ms,
@@ -7,6 +7,7 @@ import contextlib
7
7
  import json
8
8
  import random
9
9
  import time
10
+ import uuid
10
11
  from datetime import datetime, timezone
11
12
  from typing import TYPE_CHECKING, Any
12
13
 
@@ -158,7 +159,46 @@ class GatewayServicer:
158
159
  await self._m2m.stop()
159
160
  await self._registry.shutdown()
160
161
 
161
- async def StartStream( # noqa: PLR0911, PLR0915
162
+ async def AssociateTask(
163
+ self,
164
+ request: Any,
165
+ context: grpc.aio.ServicerContext, # noqa: ARG002
166
+ ) -> Any:
167
+ """Mint a sub-task id linked to a running parent task.
168
+
169
+ Args:
170
+ request: AssociateTaskRequest proto.
171
+ context: gRPC service context.
172
+
173
+ Returns:
174
+ AssociateTaskResponse(task_id, parent_task_id); empty ``task_id`` on rejection.
175
+ """
176
+ parent_task_id = request.parent_task_id
177
+ err = GatewayValidator.validate_id(parent_task_id, "parent_task_id")
178
+ if err is not None:
179
+ logger.warning("AssociateTask rejected: %s", err)
180
+ return gateway_pb2.AssociateTaskResponse(task_id="", parent_task_id=parent_task_id)
181
+
182
+ child_task_id = str(uuid.uuid4())
183
+ ttl = get_gateway_settings().stream.redis_stream_initial_ttl
184
+ try:
185
+ await self._redis_client.sadd(f"task:{parent_task_id}:children", child_task_id)
186
+ await self._redis_client.expire(f"task:{parent_task_id}:children", ttl)
187
+ await self._redis_client.set(f"task:{child_task_id}:parent", parent_task_id, ex=ttl)
188
+ except RedisError:
189
+ logger.warning(
190
+ "[VALIDATE AT1] AssociateTask persist failed parent=%s → task_id=''",
191
+ parent_task_id,
192
+ exc_info=True,
193
+ ) # TODO(validate): remove after prod validation
194
+ return gateway_pb2.AssociateTaskResponse(task_id="", parent_task_id=parent_task_id)
195
+
196
+ logger.info(
197
+ "[VALIDATE AT1] AssociateTask: parent=%s child=%s", parent_task_id, child_task_id
198
+ ) # TODO(validate): remove after prod validation
199
+ return gateway_pb2.AssociateTaskResponse(task_id=child_task_id, parent_task_id=parent_task_id)
200
+
201
+ async def StartStream( # noqa: PLR0911
162
202
  self,
163
203
  request: Any,
164
204
  context: grpc.aio.ServicerContext,
@@ -209,11 +249,6 @@ class GatewayServicer:
209
249
  return gateway_pb2.StartStreamResponse(accepted=False, task_id=task_id)
210
250
 
211
251
  if self._registry.get(task_id) is not None:
212
- logger.info(
213
- "[VALIDATE RD1] StartStream refused: a dial is already live for task_id=%s",
214
- task_id,
215
- extra=log_extra,
216
- ) # TODO(validate): remove after prod validation
217
252
  return gateway_pb2.StartStreamResponse(accepted=False, task_id=task_id)
218
253
  timer.mark("dedup_check")
219
254
 
@@ -224,20 +259,9 @@ class GatewayServicer:
224
259
  try:
225
260
  claim = await self._idempotency.claim(task_id, SharedRedisListener.PROCESS_ID)
226
261
  except RedisError:
227
- logger.warning(
228
- "[VALIDATE R2] StartStream claim Redis failure → accepted=False",
229
- extra=log_extra,
230
- exc_info=True,
231
- ) # TODO(validate): remove after prod validation
232
262
  return gateway_pb2.StartStreamResponse(accepted=False, task_id=task_id)
233
263
  timer.mark("idempotency_claim")
234
264
  if claim is not ClaimResult.CLAIMED:
235
- logger.info(
236
- "[VALIDATE RD1] StartStream refused: task already claimed/running task_id=%s (%s)",
237
- task_id,
238
- claim.name,
239
- extra=log_extra,
240
- ) # TODO(validate): remove after prod validation
241
265
  return gateway_pb2.StartStreamResponse(accepted=False, task_id=task_id)
242
266
 
243
267
  session = StreamSession(task_id=task_id)
@@ -272,11 +296,6 @@ class GatewayServicer:
272
296
  {"pb": start_info.SerializeToString(), "seq": "0"},
273
297
  )
274
298
  except RedisError:
275
- logger.warning(
276
- "[VALIDATE R2] StartStream xadd(stream.start) Redis failure → accepted=False",
277
- extra=log_extra,
278
- exc_info=True,
279
- ) # TODO(validate): remove after prod validation
280
299
  # Claimed + registered but the stream couldn't be seeded: undo both so a retry re-runs.
281
300
  with contextlib.suppress(RedisError):
282
301
  await self._idempotency.release(task_id)
@@ -533,8 +552,8 @@ class GatewayServicer:
533
552
  extra=log_extra,
534
553
  exc_info=True,
535
554
  )
536
- logger.info(
537
- "[lat-audit] SendSignal: %s path=cache total=%.2fms action=%s setup_id=%s",
555
+ logger.debug(
556
+ "[perf] SendSignal: %s path=cache total=%.2fms action=%s setup_id=%s",
538
557
  timer.format_steps(),
539
558
  timer.total_ms(),
540
559
  action_name,
@@ -580,8 +599,8 @@ class GatewayServicer:
580
599
  await self._redis_client.publish(f"signal_ch:{task_id}", payload)
581
600
  timer.mark("redis_publish")
582
601
  last_mark = "redis_publish"
583
- logger.info(
584
- "[lat-audit] SendSignal: %s path=redis total=%.2fms action=%s task_id=%s",
602
+ logger.debug(
603
+ "[perf] SendSignal: %s path=redis total=%.2fms action=%s task_id=%s",
585
604
  timer.format_steps(),
586
605
  timer.total_ms(),
587
606
  action_name,
@@ -690,12 +709,6 @@ class GatewayServicer:
690
709
  except StopAsyncIteration:
691
710
  return
692
711
  except asyncio.TimeoutError:
693
- logger.warning(
694
- "[VALIDATE B1] stream read idle %.0fs with no EOS (producer likely died) — "
695
- "closing stream: task_id=%s",
696
- idle,
697
- task_id,
698
- ) # TODO(validate): remove after prod validation
699
712
  yield self._sentinel(
700
713
  0,
701
714
  task_id,
@@ -707,10 +720,6 @@ class GatewayServicer:
707
720
  yield self._sentinel(0, task_id, "stream.end")
708
721
  return
709
722
  except RedisError:
710
- logger.warning(
711
- "[VALIDATE R2] stream read Redis failure — closing stream: task_id=%s",
712
- task_id,
713
- ) # TODO(validate): remove after prod validation
714
723
  yield self._sentinel(
715
724
  0,
716
725
  task_id,
@@ -791,21 +800,9 @@ class GatewayServicer:
791
800
  if deadline is None:
792
801
  deadline = now + reconnect.window_s
793
802
  if now >= deadline:
794
- logger.info(
795
- "[VALIDATE RD1] dial-back gave up after %.0fs reconnect window: task_id=%s attempts=%d",
796
- reconnect.window_s,
797
- task_id,
798
- attempt,
799
- ) # TODO(validate): remove after prod validation
800
803
  break
801
804
  attempt += 1
802
805
  delay = min(random.uniform(reconnect.backoff_base_s, reconnect.backoff_max_s), deadline - now) # noqa: S311
803
- logger.info(
804
- "[VALIDATE RD1] dial-back disconnected — re-dial attempt %d in %.1fs (resume): task_id=%s",
805
- attempt,
806
- delay,
807
- task_id,
808
- ) # TODO(validate): remove after prod validation
809
806
  await asyncio.sleep(max(0.0, delay))
810
807
  resume = True
811
808
  finally:
@@ -990,11 +987,6 @@ class GatewayServicer:
990
987
  )
991
988
  return
992
989
  except RedisError:
993
- logger.warning(
994
- "[VALIDATE R2] dial-back stream read Redis failure — closing BiDi: task_id=%s",
995
- task_id,
996
- extra=log_extra,
997
- ) # TODO(validate): remove after prod validation
998
990
  for sc in (
999
991
  self._sentinel(
1000
992
  0,
@@ -1063,14 +1055,6 @@ class GatewayServicer:
1063
1055
  if first and resume:
1064
1056
  limit = get_gateway_settings().stream.from_seq_limit
1065
1057
  resume_cursor = min(upstream.from_seq, limit)
1066
- if upstream.from_seq > limit:
1067
- logger.warning(
1068
- "[VALIDATE RESUME1] resume cursor %d exceeds limit %d, clamped: task_id=%s",
1069
- upstream.from_seq,
1070
- limit,
1071
- task_id,
1072
- extra=log_extra,
1073
- ) # TODO(validate): remove after prod validation
1074
1058
  logger.info(
1075
1059
  "← Consumer resume cursor=%d received — resuming output (no re-run)",
1076
1060
  resume_cursor,
@@ -1109,18 +1093,11 @@ class GatewayServicer:
1109
1093
  first = False
1110
1094
  continue
1111
1095
  # Follow-up multi-turn input → task's input stream.
1112
- try:
1096
+ with contextlib.suppress(RedisError):
1113
1097
  await self._redis_client.xadd(
1114
1098
  f"task:{task_id}:input",
1115
1099
  {"pb": upstream.data.SerializeToString()},
1116
1100
  )
1117
- except RedisError:
1118
- logger.warning(
1119
- "[VALIDATE R2] dropped follow-up input (redis unavailable): task_id=%s data=%s",
1120
- task_id,
1121
- str(upstream.data)[:512],
1122
- extra=log_extra,
1123
- ) # TODO(validate): remove after prod validation
1124
1101
  except grpc.aio.AioRpcError as exc:
1125
1102
  code_name = exc.code().name
1126
1103
  details = exc.details() or ""
@@ -83,10 +83,7 @@ class M2MCallRegistry:
83
83
  )
84
84
  self._breakers[target_key] = breaker
85
85
  if len(self._breakers) > 256: # noqa: PLR2004
86
- evicted, _ = self._breakers.popitem(last=False)
87
- logger.info(
88
- "[VALIDATE D4] evicted LRU m2m breaker target=%s", evicted
89
- ) # TODO(validate): remove after prod validation
86
+ self._breakers.popitem(last=False)
90
87
  return breaker
91
88
 
92
89
  async def acquire_slot(self) -> None:
@@ -222,10 +219,6 @@ class M2MCallRegistry:
222
219
  is_fatal = fatal_field is not None and fatal_field.bool_value
223
220
  if is_fatal:
224
221
  # M2: breaker outcome recorded only in call_module (was double-counted here).
225
- logger.warning(
226
- "[VALIDATE M2] fatal dial-back; breaker recorded only in call_module: task_id=%s",
227
- task_id,
228
- ) # TODO(validate): remove after prod validation
229
222
  return
230
223
  finally:
231
224
  with contextlib.suppress(asyncio.QueueFull):
@@ -197,9 +197,6 @@ class ModuleServer(BaseServer):
197
197
  from digitalkin.grpc_servers.utils.grpc_client_wrapper import GrpcClientWrapper
198
198
 
199
199
  # M9: close channels (resets ref_counts, clears stubs + breakers) instead of a bare cache clear.
200
- logger.info(
201
- "[VALIDATE M9] closing all cached gRPC channels on INVALIDATE_CHANNELS"
202
- ) # TODO(validate): remove after prod validation
203
200
  await GrpcClientWrapper.close_all_cached_channels()
204
201
  Bulkhead.clear_all()
205
202
 
@@ -331,7 +328,6 @@ class ModuleServer(BaseServer):
331
328
  if self._gateway_redis_client is not None:
332
329
  # M8: this server created the gateway's Redis client, so it closes it (owner closes;
333
330
  # the gateway only borrows). Pools were leaked on every server stop.
334
- logger.info("[VALIDATE M8] closing gateway Redis pools") # TODO(validate): remove after prod validation
335
331
  try:
336
332
  await self._gateway_redis_client.close()
337
333
  except Exception:
@@ -21,6 +21,7 @@ from digitalkin.core.job_manager.base_job_manager import BaseJobManager
21
21
  from digitalkin.core.job_manager.single_job_manager import SingleJobManager
22
22
  from digitalkin.core.task_manager.redis.redis_signal import SharedRedisListener
23
23
  from digitalkin.grpc_servers.exceptions import PermissionDeniedError, ServicerError
24
+ from digitalkin.grpc_servers.interceptors.request_ids import RequestContext
24
25
  from digitalkin.logger import logger
25
26
  from digitalkin.models.module.module import ModuleCodeModel
26
27
  from digitalkin.models.module.setup_types import SetupModel
@@ -116,7 +117,6 @@ class ModuleServicer(module_service_pb2_grpc.ModuleServiceServicer, ArgParser):
116
117
  except Exception:
117
118
  logger.exception("Error closing GrpcUserProfile channel")
118
119
  # M8: close the Redis connection pools (were leaked on every server stop).
119
- logger.info("[VALIDATE M8] closing module servicer Redis pools") # TODO(validate): remove after prod validation
120
120
  await self._redis_client.close()
121
121
 
122
122
  if isinstance(self._registry_cache, GrpcRegistry):
@@ -272,9 +272,17 @@ class ModuleServicer(module_service_pb2_grpc.ModuleServiceServicer, ArgParser):
272
272
  Raises:
273
273
  PermissionDeniedError: If access to the setup is denied.
274
274
  """
275
- if not await self.user_profile.check_resource_access(user_profile_pb2.RESOURCE_TYPE_SETUP, setup_id):
275
+ allowed = await self.user_profile.check_resource_access(user_profile_pb2.RESOURCE_TYPE_SETUP, setup_id)
276
+ ids = RequestContext.current()
277
+ if not allowed:
278
+ logger.info(
279
+ "[VALIDATE AC1] setup access DENIED: setup_id=%s", setup_id, extra=ids
280
+ ) # TODO(validate): remove after prod validation
276
281
  msg = f"access denied to setup {setup_id}"
277
282
  raise PermissionDeniedError(msg)
283
+ logger.info(
284
+ "[VALIDATE AC1] setup access granted: setup_id=%s", setup_id, extra=ids
285
+ ) # TODO(validate): remove after prod validation
278
286
 
279
287
  async def resolve_setup(self, setup_id: str, mission_id: str) -> SetupVersionData:
280
288
  """Return setup version data from cache or remote service.
@@ -362,6 +370,9 @@ class ModuleServicer(module_service_pb2_grpc.ModuleServiceServicer, ArgParser):
362
370
  if not await self.user_profile.check_resource_access(
363
371
  user_profile_pb2.RESOURCE_TYPE_SETUP, setup_version.setup_id
364
372
  ):
373
+ logger.info(
374
+ "[VALIDATE AC1] setup config access DENIED: setup_id=%s", setup_version.setup_id
375
+ ) # TODO(validate): remove after prod validation
365
376
  context.set_code(grpc.StatusCode.PERMISSION_DENIED)
366
377
  context.set_details(f"access denied to setup {setup_version.setup_id}")
367
378
  return lifecycle_pb2.ConfigSetupModuleResponse(success=False)
@@ -76,11 +76,6 @@ class StreamRegistry:
76
76
  settings = get_gateway_settings()
77
77
  if len(self._local_cache) >= settings.max_streams:
78
78
  # H3: reject at capacity instead of evicting a live session.
79
- logger.info(
80
- "[VALIDATE H3] stream registry at capacity (%d), rejecting task_id=%s",
81
- settings.max_streams,
82
- session.task_id,
83
- ) # TODO(validate): remove after prod validation
84
79
  return False
85
80
 
86
81
  self._local_cache[session.task_id] = session
@@ -225,7 +225,7 @@ class GrpcClientWrapper:
225
225
  cls._stub_cache.clear()
226
226
  CircuitBreaker.clear_all()
227
227
 
228
- async def exec_grpc_query( # noqa: C901, PLR0912, PLR0914, PLR0915
228
+ async def exec_grpc_query( # noqa: PLR0914
229
229
  self,
230
230
  query_endpoint: str,
231
231
  request: Any,
@@ -256,11 +256,6 @@ class GrpcClientWrapper:
256
256
  if rpc_method is None:
257
257
  # M3: validate the method before claiming the half-open probe lock,
258
258
  # so a missing method can't escape cb.check() and wedge the breaker.
259
- logger.info(
260
- "[VALIDATE M3] RPC method missing, raised before breaker probe: %s.%s",
261
- self.service_name,
262
- query_endpoint,
263
- ) # TODO(validate): remove after prod validation
264
259
  msg = f"[gRPC-client:{self.service_name}] RPC method '{query_endpoint}' not found on stub"
265
260
  raise ServerError(msg)
266
261
 
@@ -273,13 +268,6 @@ class GrpcClientWrapper:
273
268
 
274
269
  grpc_settings = get_grpc_client_settings()
275
270
  eff_timeout = timeout if timeout is not None else grpc_settings.timeout
276
- if timeout is None:
277
- logger.info(
278
- "[VALIDATE H1] default gRPC deadline applied: %.1fs (%s.%s)",
279
- eff_timeout,
280
- self.service_name,
281
- query_endpoint,
282
- ) # TODO(validate): remove after prod validation
283
271
  max_retries = grpc_settings.max_retries
284
272
  backoff_base_ms = grpc_settings.backoff_base_ms
285
273
  backoff_delays = tuple(backoff_base_ms / 1000 * (2**i) for i in range(max_retries))
@@ -342,9 +330,4 @@ class GrpcClientWrapper:
342
330
  raise ServerError(error_msg) from last_error
343
331
  finally:
344
332
  # Free a half-open probe the loop never resolved (e.g. CancelledError mid-call or backoff).
345
- if cb.release_probe():
346
- logger.info(
347
- "[VALIDATE R1] released abandoned circuit probe: %s.%s",
348
- self.service_name,
349
- query_endpoint,
350
- ) # TODO(validate): remove after prod validation
333
+ cb.release_probe()
@@ -197,9 +197,6 @@ class LoggerFactory:
197
197
  return
198
198
  if any(isinstance(h, RotatingFileHandler) for h in logger.handlers):
199
199
  # Low: idempotent — repeated setup_logger() calls must not stack handlers.
200
- logger.debug(
201
- "[VALIDATE Low-loghandler] file handler already attached, skipping"
202
- ) # TODO(validate): remove after prod validation
203
200
  return
204
201
 
205
202
  log_file = settings.file or os.path.join(log_dir, f"{logger.name}.log")
@@ -30,7 +30,6 @@ from ag_ui.core.events import ToolCallEndEvent as AgUiToolCallEndEvent
30
30
  from ag_ui.core.events import ToolCallResultEvent as AgUiToolCallResultEvent
31
31
  from ag_ui.core.events import ToolCallStartEvent as AgUiToolCallStartEvent
32
32
 
33
- from digitalkin.logger import logger
34
33
  from digitalkin.models.events import (
35
34
  AgentRunEvent,
36
35
  BaseAgentRunEvent,
@@ -408,9 +407,6 @@ class AgUiMixin:
408
407
  event: CustomEvent,
409
408
  ) -> None:
410
409
  """Handle custom event - emit AG-UI CustomEvent."""
411
- logger.info(
412
- "[VALIDATE M15] CustomEvent dispatched via AG-UI: name=%s", event.name
413
- ) # TODO(validate): remove after prod validation
414
410
  from ag_ui.core.events import CustomEvent as AgUiCustomEvent # pylint: disable=C0415
415
411
 
416
412
  from digitalkin.models.module.ag_ui import AgUiCustomEventOutput # pylint: disable=C0415
@@ -134,7 +134,7 @@ class ToolReference(BaseModel):
134
134
  Every failure path logs a ``WARNING`` with a ``reason=...`` field
135
135
  (``setup_not_found``, ``module_not_discovered``, ``schema_fetch_failed``)
136
136
  so callers don't need to re-derive the cause. Successful resolutions
137
- emit ``[lat-audit] tool_resolve`` at INFO with input/output counts.
137
+ emit ``[perf] tool_resolve`` at DEBUG with input/output counts.
138
138
  Post-filter results of zero functions emit a second ``WARNING`` naming
139
139
  the structural cause (``module_exposes_no_triggers``,
140
140
  ``all_user_triggers_unknown``, or ``post_filter_empty``).
@@ -191,8 +191,8 @@ class ToolReference(BaseModel):
191
191
  )
192
192
 
193
193
  post_count = len(available & enabled_triggers) if enabled_triggers else len(tool_info.tools)
194
- logger.info(
195
- "[lat-audit] tool_resolve: setup_id=%s slug=%s "
194
+ logger.debug(
195
+ "[perf] tool_resolve: setup_id=%s slug=%s "
196
196
  "user_triggers_enabled=%d user_triggers_total=%d "
197
197
  "module_available=%d post_filter=%d",
198
198
  entry.setup_id,