digitalkin 1.0.0.dev24__tar.gz → 1.0.0.dev25__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.dev24 → digitalkin-1.0.0.dev25}/PKG-INFO +1 -1
  2. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/pyproject.toml +1 -1
  3. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/__version__.py +1 -1
  4. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/gateway_servicer.py +5 -37
  5. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/module_servicer.py +6 -1
  6. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +4 -1
  7. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/gateway.py +4 -0
  8. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/communication/grpc_communication.py +48 -26
  9. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/services_config.py +8 -0
  10. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin.egg-info/PKG-INFO +1 -1
  11. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/LICENSE +0 -0
  12. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/README.md +0 -0
  13. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/base_server/__init__.py +0 -0
  14. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/base_server/mock/__init__.py +0 -0
  15. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/base_server/mock/mock_pb2.py +0 -0
  16. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  17. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/base_server/server_async_insecure.py +0 -0
  18. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/base_server/server_async_secure.py +0 -0
  19. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/base_server/server_sync_insecure.py +0 -0
  20. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/base_server/server_sync_secure.py +0 -0
  21. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/bench_module/__init__.py +0 -0
  22. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/bench_module/echo_module.py +0 -0
  23. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/bench_module/models/__init__.py +0 -0
  24. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/bench_module/models/input.py +0 -0
  25. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/bench_module/models/output.py +0 -0
  26. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/bench_module/models/secret.py +0 -0
  27. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/bench_module/models/setup.py +0 -0
  28. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/bench_module/server.py +0 -0
  29. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/bench_module/triggers/__init__.py +0 -0
  30. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/bench_module/triggers/message_trigger.py +0 -0
  31. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/modules/__init__.py +0 -0
  32. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/modules/archetype_with_tools_module.py +0 -0
  33. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/modules/cpu_intensive_module.py +0 -0
  34. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/modules/dynamic_setup_module.py +0 -0
  35. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/modules/minimal_llm_module.py +0 -0
  36. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/modules/text_transform_module.py +0 -0
  37. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  38. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  39. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  40. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  41. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  42. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/monitoring/tests/test_metrics.py +0 -0
  43. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/redis_demo/client.py +0 -0
  44. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/redis_demo/echo_module.py +0 -0
  45. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/redis_demo/models/__init__.py +0 -0
  46. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/redis_demo/models/input.py +0 -0
  47. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/redis_demo/models/output.py +0 -0
  48. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/redis_demo/models/secret.py +0 -0
  49. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/redis_demo/models/setup.py +0 -0
  50. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/redis_demo/server.py +0 -0
  51. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/redis_demo/triggers/__init__.py +0 -0
  52. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/redis_demo/triggers/message_trigger.py +0 -0
  53. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/services/filesystem_module.py +0 -0
  54. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/examples/services/storage_module.py +0 -0
  55. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/setup.cfg +0 -0
  56. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/__init__.py +0 -0
  57. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/community/__init__.py +0 -0
  58. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/community/agno/__init__.py +0 -0
  59. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/community/agno/agno_adapter.py +0 -0
  60. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/community/agno/agui_tools.py +0 -0
  61. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/community/agno/hitl.py +0 -0
  62. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/community/agno/models.py +0 -0
  63. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/__init__.py +0 -0
  64. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/common/__init__.py +0 -0
  65. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/common/factories.py +0 -0
  66. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/exceptions.py +0 -0
  67. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/job_manager/__init__.py +0 -0
  68. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  69. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
  70. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/profiling/__init__.py +0 -0
  71. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/profiling/step_timer.py +0 -0
  72. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/profiling/task_profiler.py +0 -0
  73. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/resilience/__init__.py +0 -0
  74. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/resilience/bulkhead.py +0 -0
  75. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
  76. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/__init__.py +0 -0
  77. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
  78. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
  79. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/module_runner.py +0 -0
  80. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
  81. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -0
  82. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
  83. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
  84. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
  85. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
  86. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
  87. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/task_executor.py +0 -0
  88. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/core/task_manager/task_session.py +0 -0
  89. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/exceptions.py +0 -0
  90. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/__init__.py +0 -0
  91. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/_base_server.py +0 -0
  92. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/exceptions.py +0 -0
  93. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  94. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
  95. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
  96. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/m2m_call_registry.py +0 -0
  97. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/module_server.py +0 -0
  98. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
  99. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/stream_session.py +0 -0
  100. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  101. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
  102. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
  103. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
  104. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
  105. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/logger.py +0 -0
  106. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/mixins/__init__.py +0 -0
  107. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/mixins/agui_mixin.py +0 -0
  108. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/mixins/base_mixin.py +0 -0
  109. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/mixins/cost_mixin.py +0 -0
  110. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/mixins/file_history_mixin.py +0 -0
  111. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
  112. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/mixins/logger_mixin.py +0 -0
  113. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/mixins/storage_mixin.py +0 -0
  114. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/__init__.py +0 -0
  115. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/core/__init__.py +0 -0
  116. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/core/job_manager_models.py +0 -0
  117. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/core/redis.py +0 -0
  118. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/core/task_monitor.py +0 -0
  119. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/events/__init__.py +0 -0
  120. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/events/agent_events.py +0 -0
  121. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  122. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
  123. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
  124. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/grpc_servers/models.py +0 -0
  125. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
  126. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/grpc_servers/types.py +0 -0
  127. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/__init__.py +0 -0
  128. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/ag_ui.py +0 -0
  129. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/base_types.py +0 -0
  130. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/module.py +0 -0
  131. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/module_context.py +0 -0
  132. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/module_types.py +0 -0
  133. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/request_metadata.py +0 -0
  134. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/select_schema.py +0 -0
  135. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/setup_types.py +0 -0
  136. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/tool_cache.py +0 -0
  137. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/tool_reference.py +0 -0
  138. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/module/utility.py +0 -0
  139. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/services/__init__.py +0 -0
  140. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/services/cost.py +0 -0
  141. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/services/registry.py +0 -0
  142. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/services/services.py +0 -0
  143. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/services/storage.py +0 -0
  144. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/__init__.py +0 -0
  145. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/grpc_client.py +0 -0
  146. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/log.py +0 -0
  147. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/module.py +0 -0
  148. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/profiling.py +0 -0
  149. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/queue.py +0 -0
  150. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/redis.py +0 -0
  151. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/resilience.py +0 -0
  152. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/server/__init__.py +0 -0
  153. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/server/channel.py +0 -0
  154. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/server/grpc.py +0 -0
  155. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/server/server.py +0 -0
  156. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/server/servicer.py +0 -0
  157. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/task_manager.py +0 -0
  158. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  159. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/settings/utils/channel.py +0 -0
  160. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/utils/__init__.py +0 -0
  161. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
  162. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/modules/__init__.py +0 -0
  163. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/modules/_base_module.py +0 -0
  164. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/modules/archetype_module.py +0 -0
  165. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/modules/tool_module.py +0 -0
  166. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/modules/trigger_handler.py +0 -0
  167. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/modules/triggers/__init__.py +0 -0
  168. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
  169. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
  170. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
  171. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/py.typed +0 -0
  172. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/__init__.py +0 -0
  173. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/base_strategy.py +0 -0
  174. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/communication/__init__.py +0 -0
  175. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/communication/communication_strategy.py +0 -0
  176. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/communication/default_communication.py +0 -0
  177. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/communication/exceptions.py +0 -0
  178. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/cost/__init__.py +0 -0
  179. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  180. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/cost/default_cost.py +0 -0
  181. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/cost/exceptions.py +0 -0
  182. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/cost/grpc_cost.py +0 -0
  183. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/filesystem/__init__.py +0 -0
  184. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
  185. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/filesystem/exceptions.py +0 -0
  186. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
  187. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
  188. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/identity/__init__.py +0 -0
  189. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/identity/default_identity.py +0 -0
  190. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  191. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/registry/__init__.py +0 -0
  192. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/registry/default_registry.py +0 -0
  193. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/registry/exceptions.py +0 -0
  194. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/registry/grpc_registry.py +0 -0
  195. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/registry/registry_models.py +0 -0
  196. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/registry/registry_strategy.py +0 -0
  197. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/secret/__init__.py +0 -0
  198. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/secret/default_secret.py +0 -0
  199. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/secret/exceptions.py +0 -0
  200. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/secret/grpc_secret.py +0 -0
  201. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/secret/secret_strategy.py +0 -0
  202. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/services_models.py +0 -0
  203. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/setup/__init__.py +0 -0
  204. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/setup/default_setup.py +0 -0
  205. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/setup/exceptions.py +0 -0
  206. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/setup/grpc_setup.py +0 -0
  207. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/setup/setup_strategy.py +0 -0
  208. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/storage/__init__.py +0 -0
  209. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/storage/default_storage.py +0 -0
  210. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/storage/exceptions.py +0 -0
  211. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/storage/grpc_storage.py +0 -0
  212. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  213. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/task_manager/__init__.py +0 -0
  214. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
  215. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/task_manager/exceptions.py +0 -0
  216. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
  217. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  218. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/user_profile/__init__.py +0 -0
  219. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
  220. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/user_profile/exceptions.py +0 -0
  221. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
  222. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
  223. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/utils/__init__.py +0 -0
  224. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/utils/arg_parser.py +0 -0
  225. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/utils/conditional_schema.py +0 -0
  226. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/utils/development_mode_action.py +0 -0
  227. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/utils/dynamic_schema.py +0 -0
  228. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/utils/exceptions.py +0 -0
  229. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  230. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/utils/package_discover.py +0 -0
  231. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/utils/proto_utils.py +0 -0
  232. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin/utils/schema_splitter.py +0 -0
  233. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin.egg-info/SOURCES.txt +0 -0
  234. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  235. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin.egg-info/requires.txt +0 -0
  236. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/src/digitalkin.egg-info/top_level.txt +0 -0
  237. {digitalkin-1.0.0.dev24 → digitalkin-1.0.0.dev25}/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.dev24
3
+ Version: 1.0.0.dev25
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
@@ -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.dev24"
40
+ version = "1.0.0.dev25"
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.dev24"
8
+ __version__ = "1.0.0.dev25"
@@ -7,7 +7,6 @@ import contextlib
7
7
  import json
8
8
  import random
9
9
  import time
10
- import uuid
11
10
  from datetime import datetime, timezone
12
11
  from typing import TYPE_CHECKING, Any
13
12
 
@@ -159,44 +158,13 @@ class GatewayServicer:
159
158
  await self._m2m.stop()
160
159
  await self._registry.shutdown()
161
160
 
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.
161
+ async def AssociateTask(self, request: Any, context: grpc.aio.ServicerContext) -> Any: # noqa: ARG002, PLR6301
162
+ """Not served by the SDK — the backend mints sub-tasks.
168
163
 
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.
164
+ Present only so the generated ``add_GatewayServiceServicer_to_server`` finds all
165
+ four RPCs; nothing dials the module for it. Callers use the backend endpoint.
175
166
  """
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)
167
+ await context.abort(grpc.StatusCode.UNIMPLEMENTED, "AssociateTask is served by the backend")
200
168
 
201
169
  async def StartStream( # noqa: PLR0911
202
170
  self,
@@ -253,7 +253,12 @@ class ModuleServicer(module_service_pb2_grpc.ModuleServiceServicer, ArgParser):
253
253
 
254
254
  from digitalkin.services.communication.grpc_communication import GrpcCommunication
255
255
 
256
- self._communication_cache = GrpcCommunication("", "", "", client_config)
256
+ gateway_backend_config = (self.module_class.services_config_params.get("user_profile") or {}).get(
257
+ "client_config"
258
+ )
259
+ self._communication_cache = GrpcCommunication(
260
+ "", "", "", client_config, gateway_backend_config=gateway_backend_config
261
+ )
257
262
  return self._communication_cache
258
263
 
259
264
  def _cache_setup(self, setup_id: str, version_data: SetupVersionData) -> None:
@@ -230,6 +230,7 @@ class GrpcClientWrapper:
230
230
  query_endpoint: str,
231
231
  request: Any,
232
232
  timeout: float | None = None,
233
+ metadata: tuple[tuple[str, str], ...] | None = None,
233
234
  ) -> Any:
234
235
  """Execute a gRPC query with circuit breaker protection and retry.
235
236
 
@@ -245,6 +246,8 @@ class GrpcClientWrapper:
245
246
  query_endpoint: rpc query name (e.g., "GetSetup", "CreateSetupVersion")
246
247
  request: gRPC protobuf request object
247
248
  timeout: Per-call timeout in seconds. ``None`` applies no client-side deadline.
249
+ metadata: Optional gRPC metadata pairs (e.g. an idempotency key); the same
250
+ metadata is sent on every retry attempt.
248
251
 
249
252
  Returns:
250
253
  gRPC protobuf response object.
@@ -279,7 +282,7 @@ class GrpcClientWrapper:
279
282
  await asyncio.sleep(backoff_delays[attempt - 1])
280
283
 
281
284
  try:
282
- response = await rpc_method(request, timeout=eff_timeout)
285
+ response = await rpc_method(request, timeout=eff_timeout, metadata=metadata)
283
286
  except grpc.RpcError as e:
284
287
  last_error = e
285
288
  if e.code() in self._RETRYABLE_CODES and attempt < max_retries:
@@ -93,6 +93,10 @@ class GatewayM2MSettings(BaseSettings):
93
93
  default=2.0,
94
94
  description="Best-effort SendSignal(CANCEL) deadline when call_module is cancelled.",
95
95
  )
96
+ call_associate_timeout_s: float = Field(
97
+ default=5.0,
98
+ description="Per-call deadline on the backend AssociateTask mint (bounded, not the 30s default).",
99
+ )
96
100
  call_queue_maxsize: int = Field(
97
101
  default=1024,
98
102
  gt=0,
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import time
7
+ import uuid
7
8
  from typing import TYPE_CHECKING, Any
8
9
 
9
10
  import grpc.aio
@@ -36,6 +37,21 @@ if TYPE_CHECKING:
36
37
  from digitalkin.grpc_servers.m2m_call_registry import M2MCallRegistry
37
38
 
38
39
 
40
+ class _GatewayBackendClient(GrpcClientWrapper):
41
+ """Resilient client to the backend GatewayService (own circuit breaker) for AssociateTask."""
42
+
43
+ service_name: str = "GatewayBackendService"
44
+
45
+ def __init__(self, client_config: ClientConfig) -> None:
46
+ """Dial the backend GatewayService and cache its stub.
47
+
48
+ Args:
49
+ client_config: Backend services-provider config (same host as user_profile).
50
+ """
51
+ self._init_channel(client_config)
52
+ self.stub = self._get_or_create_stub(gateway_service_pb2_grpc.GatewayServiceStub)
53
+
54
+
39
55
  class GrpcCommunication(CommunicationStrategy, GrpcClientWrapper):
40
56
  """gRPC client for module-to-module communication."""
41
57
 
@@ -95,6 +111,7 @@ class GrpcCommunication(CommunicationStrategy, GrpcClientWrapper):
95
111
  setup_version_id: str,
96
112
  client_config: ClientConfig,
97
113
  m2m_calls: M2MCallRegistry | None = None,
114
+ gateway_backend_config: ClientConfig | None = None,
98
115
  ) -> None:
99
116
  """Initialize the gRPC communication client.
100
117
 
@@ -105,11 +122,16 @@ class GrpcCommunication(CommunicationStrategy, GrpcClientWrapper):
105
122
  client_config: gRPC client config.
106
123
  m2m_calls: Optional ``M2MCallRegistry``; falls back to the
107
124
  class-level slot from :meth:`set_m2m_call_registry`.
125
+ gateway_backend_config: Backend GatewayService config for AssociateTask
126
+ (same host as user_profile). Required for M2M tool calls.
108
127
  """
109
128
  BaseStrategy.__init__(self, mission_id, setup_id, setup_version_id)
110
129
  self.client_config = client_config
111
130
  self._m2m_calls = m2m_calls if m2m_calls is not None else self._shared_m2m_calls
112
131
  self._pool_keys: set[str] = set()
132
+ self._gateway_backend = (
133
+ _GatewayBackendClient(gateway_backend_config) if gateway_backend_config is not None else None
134
+ )
113
135
 
114
136
  logger.debug("Initialized GrpcCommunication (security=%s)", client_config.security)
115
137
 
@@ -146,6 +168,8 @@ class GrpcCommunication(CommunicationStrategy, GrpcClientWrapper):
146
168
  async def close(self) -> None:
147
169
  """Release all pooled gRPC channels."""
148
170
  await self.close_all_channels()
171
+ if self._gateway_backend is not None:
172
+ await self._gateway_backend.close_channel()
149
173
 
150
174
  def dial_consumer_stream(
151
175
  self,
@@ -341,37 +365,28 @@ class GrpcCommunication(CommunicationStrategy, GrpcClientWrapper):
341
365
  timer.mark("acquire_slot")
342
366
  last_mark = "acquire_slot"
343
367
 
344
- self._get_or_create_channel(module_address, module_port)
345
- timer.mark("channel_create")
346
- last_mark = "channel_create"
347
- stub = self._get_or_create_stub(gateway_service_pb2_grpc.GatewayServiceStub)
348
- timer.mark("stub_create")
349
- last_mark = "stub_create"
350
-
351
- # The gateway mints the sub-task id and links it to the running parent task.
352
- try:
353
- assoc = await stub.AssociateTask(
354
- gateway_pb2.AssociateTaskRequest(
355
- parent_task_id=RequestContext.current().get("task_id", ""),
356
- ),
357
- )
358
- except grpc.aio.AioRpcError as exc:
359
- breaker.record_failure()
360
- logger.warning(
361
- "[m2m] AssociateTask failed: [%s] %s",
362
- exc.code().name,
363
- exc.details() or "",
364
- extra=log_extra,
365
- )
366
- raise
368
+ # The BACKEND mints + registers the sub-task (linked to the running parent's
369
+ # mission), so it is a real task the tool module's CheckResourceAccess accepts.
370
+ # Resilient: deadline + retry + own breaker via exec_grpc_query; retries are safe
371
+ # because the idempotency nonce dedupes them backend-side. Fail-closed on error.
372
+ if self._gateway_backend is None:
373
+ msg = "gateway_backend_config is required for M2M AssociateTask"
374
+ raise RuntimeError(msg) # noqa: TRY301
375
+ parent_task_id = RequestContext.current().get("task_id", "")
376
+ idem_key = uuid.uuid4().hex # idempotency nonce, NOT a task_id (backend mints the id)
377
+ assoc = await self._gateway_backend.exec_grpc_query(
378
+ "AssociateTask",
379
+ gateway_pb2.AssociateTaskRequest(parent_task_id=parent_task_id),
380
+ timeout=m2m_settings.call_associate_timeout_s,
381
+ metadata=(("x-idempotency-key", idem_key),),
382
+ )
367
383
  task_id = assoc.task_id
368
384
  if not task_id:
369
- breaker.record_failure()
370
- msg = f"target {target_key} returned no task_id from AssociateTask"
385
+ msg = f"backend returned no task_id from AssociateTask (parent={parent_task_id})"
371
386
  raise RuntimeError(msg) # noqa: TRY301
372
387
  logger.info(
373
388
  "[VALIDATE AT2] AssociateTask minted: parent=%s child=%s target=%s",
374
- RequestContext.current().get("task_id", ""),
389
+ parent_task_id,
375
390
  task_id,
376
391
  target_key,
377
392
  extra=log_extra,
@@ -380,6 +395,13 @@ class GrpcCommunication(CommunicationStrategy, GrpcClientWrapper):
380
395
  timer.mark("associate_task")
381
396
  last_mark = "associate_task"
382
397
 
398
+ self._get_or_create_channel(module_address, module_port)
399
+ timer.mark("channel_create")
400
+ last_mark = "channel_create"
401
+ stub = self._get_or_create_stub(gateway_service_pb2_grpc.GatewayServiceStub)
402
+ timer.mark("stub_create")
403
+ last_mark = "stub_create"
404
+
383
405
  output_queue: asyncio.Queue[struct_pb2.Struct | None] = asyncio.Queue(
384
406
  maxsize=m2m_settings.call_queue_maxsize,
385
407
  )
@@ -84,6 +84,14 @@ class ServicesConfig(BaseModel):
84
84
  if not self._configs.get("secret"):
85
85
  self._configs["secret"] = self._configs.get("user_profile") or {}
86
86
 
87
+ # AssociateTask is minted by the backend (same services-provider as user_profile /
88
+ # CheckResourceAccess). In REMOTE mode, give the communication client that backend
89
+ # address so it can dial AssociateTask for M2M tool calls. Skipped in LOCAL (no backend,
90
+ # and DefaultCommunication takes no such arg).
91
+ up_client_config = (self._configs.get("user_profile") or {}).get("client_config")
92
+ if up_client_config is not None:
93
+ self._configs["communication"].setdefault("gateway_backend_config", up_client_config)
94
+
87
95
  @classmethod
88
96
  def valid_strategy_names(cls) -> set[str]:
89
97
  """Get the list of valid strategy names.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 1.0.0.dev24
3
+ Version: 1.0.0.dev25
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