digitalkin 1.0.4.dev2__tar.gz → 1.0.4.dev3__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 (272) hide show
  1. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/PKG-INFO +2 -2
  2. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/pyproject.toml +45 -45
  3. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/__version__.py +1 -1
  4. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/action.py +15 -47
  5. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/base.py +10 -15
  6. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/loader/action.py +1 -1
  7. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/loader/kit.py +1 -1
  8. digitalkin-1.0.4.dev3/src/digitalkin/community/agno/toolkits/registry/services/action.py +92 -0
  9. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/services/kit.py +5 -11
  10. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/job_manager/single_job_manager.py +1 -1
  11. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/profiling/task_profiler.py +3 -3
  12. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/resilience/bulkhead.py +5 -6
  13. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/base_task_manager.py +1 -1
  14. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/local_task_manager.py +1 -1
  15. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/module_runner.py +6 -6
  16. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/redis/proto_streams.py +2 -2
  17. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/redis/redis_client.py +1 -1
  18. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/redis/redis_signal.py +6 -6
  19. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/redis/redis_state.py +1 -1
  20. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/remote_task_manager.py +1 -1
  21. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/task_executor.py +3 -3
  22. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/_base_server.py +15 -15
  23. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/gateway_servicer.py +21 -21
  24. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/interceptors/permission.py +9 -9
  25. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/interceptors/request_ids.py +1 -1
  26. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/m2m_call_registry.py +2 -2
  27. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/module_server.py +18 -9
  28. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/module_servicer.py +11 -34
  29. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/stream_registry.py +3 -3
  30. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +3 -3
  31. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +7 -7
  32. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +1 -1
  33. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +2 -2
  34. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/utils/validators.py +1 -1
  35. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/logger.py +1 -1
  36. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/mixins/agui_mixin.py +1 -1
  37. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/grpc_servers/models.py +30 -39
  38. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/module_context.py +1 -1
  39. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/setup_types.py +1 -1
  40. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/services/registry.py +0 -3
  41. digitalkin-1.0.4.dev3/src/digitalkin/models/settings/certificate.py +90 -0
  42. digitalkin-1.0.4.dev3/src/digitalkin/models/settings/client/__init__.py +1 -0
  43. digitalkin-1.0.4.dev3/src/digitalkin/models/settings/client/channel.py +68 -0
  44. digitalkin-1.0.4.dev3/src/digitalkin/models/settings/client/circuit_breaker.py +19 -0
  45. digitalkin-1.0.4.dev3/src/digitalkin/models/settings/client/client.py +55 -0
  46. digitalkin-1.0.4.dev3/src/digitalkin/models/settings/client/grpc.py +148 -0
  47. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/module.py +12 -1
  48. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/profiling.py +1 -1
  49. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/redis.py +5 -1
  50. digitalkin-1.0.4.dev3/src/digitalkin/models/settings/resilience.py +61 -0
  51. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/server/channel.py +23 -3
  52. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/server/grpc.py +1 -1
  53. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/server/server.py +4 -2
  54. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/utils/channel.py +46 -8
  55. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/modules/_base_module.py +7 -7
  56. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/modules/trigger_handler.py +1 -1
  57. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +2 -2
  58. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +3 -3
  59. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +2 -2
  60. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/communication/communication_strategy.py +1 -1
  61. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/communication/default_communication.py +5 -5
  62. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/communication/exceptions.py +2 -2
  63. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/communication/grpc_communication.py +6 -6
  64. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/filesystem/default_filesystem.py +13 -13
  65. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/identity/default_identity.py +1 -1
  66. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/registry/default_registry.py +2 -5
  67. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/registry/grpc_registry.py +2 -3
  68. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/registry/registry_strategy.py +2 -2
  69. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/services_config.py +16 -4
  70. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/setup/default_setup.py +6 -66
  71. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/setup/grpc_setup.py +17 -65
  72. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/setup/setup_strategy.py +6 -43
  73. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/storage/default_storage.py +1 -1
  74. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/task_manager/default_task_manager.py +4 -4
  75. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/user_profile/default_user_profile.py +1 -1
  76. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/utils/arg_parser.py +6 -6
  77. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/utils/development_mode_action.py +12 -20
  78. digitalkin-1.0.4.dev3/src/digitalkin/utils/env_manager.py +139 -0
  79. digitalkin-1.0.4.dev3/src/digitalkin/utils/env_template.py +233 -0
  80. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/utils/llm_ready_schema.py +1 -1
  81. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/utils/package_discover.py +3 -3
  82. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/utils/schema_splitter.py +4 -4
  83. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin.egg-info/PKG-INFO +2 -2
  84. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin.egg-info/SOURCES.txt +8 -2
  85. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin.egg-info/requires.txt +1 -1
  86. digitalkin-1.0.4.dev2/src/digitalkin/community/agno/toolkits/registry/services/action.py +0 -175
  87. digitalkin-1.0.4.dev2/src/digitalkin/models/settings/grpc_client.py +0 -127
  88. digitalkin-1.0.4.dev2/src/digitalkin/models/settings/resilience.py +0 -31
  89. digitalkin-1.0.4.dev2/src/digitalkin/utils/json_structure.py +0 -169
  90. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/LICENSE +0 -0
  91. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/README.md +0 -0
  92. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/base_server/__init__.py +0 -0
  93. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/base_server/mock/__init__.py +0 -0
  94. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/base_server/mock/mock_pb2.py +0 -0
  95. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  96. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/base_server/server_async_insecure.py +0 -0
  97. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/base_server/server_async_secure.py +0 -0
  98. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/base_server/server_sync_insecure.py +0 -0
  99. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/base_server/server_sync_secure.py +0 -0
  100. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/bench_module/__init__.py +0 -0
  101. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/bench_module/echo_module.py +0 -0
  102. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/bench_module/models/__init__.py +0 -0
  103. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/bench_module/models/input.py +0 -0
  104. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/bench_module/models/output.py +0 -0
  105. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/bench_module/models/secret.py +0 -0
  106. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/bench_module/models/setup.py +0 -0
  107. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/bench_module/server.py +0 -0
  108. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/bench_module/triggers/__init__.py +0 -0
  109. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/bench_module/triggers/message_trigger.py +0 -0
  110. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/modules/__init__.py +0 -0
  111. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/modules/archetype_with_tools_module.py +0 -0
  112. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/modules/cpu_intensive_module.py +0 -0
  113. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/modules/dynamic_setup_module.py +0 -0
  114. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/modules/minimal_llm_module.py +0 -0
  115. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/modules/text_transform_module.py +0 -0
  116. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  117. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  118. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  119. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  120. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  121. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/monitoring/tests/test_metrics.py +0 -0
  122. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/redis_demo/client.py +0 -0
  123. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/redis_demo/echo_module.py +0 -0
  124. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/redis_demo/models/__init__.py +0 -0
  125. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/redis_demo/models/input.py +0 -0
  126. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/redis_demo/models/output.py +0 -0
  127. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/redis_demo/models/secret.py +0 -0
  128. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/redis_demo/models/setup.py +0 -0
  129. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/redis_demo/server.py +0 -0
  130. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/redis_demo/triggers/__init__.py +0 -0
  131. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/redis_demo/triggers/message_trigger.py +0 -0
  132. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/services/filesystem_module.py +0 -0
  133. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/examples/services/storage_module.py +0 -0
  134. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/setup.cfg +0 -0
  135. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/__init__.py +0 -0
  136. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/__init__.py +0 -0
  137. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/__init__.py +0 -0
  138. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/agno_adapter.py +0 -0
  139. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/agui_tools.py +0 -0
  140. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/hitl.py +0 -0
  141. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/models.py +0 -0
  142. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/module_toolkit.py +0 -0
  143. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
  144. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/base.py +0 -0
  145. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/chat_history.py +0 -0
  146. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
  147. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/__init__.py +0 -0
  148. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/kins/__init__.py +0 -0
  149. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/kins/action.py +0 -0
  150. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/kins/kit.py +0 -0
  151. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/loader/__init__.py +0 -0
  152. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/services/__init__.py +0 -0
  153. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/tools/__init__.py +0 -0
  154. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/tools/action.py +0 -0
  155. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/registry/tools/kit.py +0 -0
  156. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/community/agno/toolkits/user_profile.py +0 -0
  157. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/__init__.py +0 -0
  158. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/common/__init__.py +0 -0
  159. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/common/factories.py +0 -0
  160. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/exceptions.py +0 -0
  161. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/job_manager/__init__.py +0 -0
  162. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  163. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/profiling/__init__.py +0 -0
  164. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/profiling/step_timer.py +0 -0
  165. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/resilience/__init__.py +0 -0
  166. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
  167. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/__init__.py +0 -0
  168. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
  169. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
  170. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/core/task_manager/task_session.py +0 -0
  171. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/exceptions.py +0 -0
  172. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/__init__.py +0 -0
  173. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/exceptions.py +0 -0
  174. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  175. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/stream_session.py +0 -0
  176. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  177. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/mixins/__init__.py +0 -0
  178. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/mixins/base_mixin.py +0 -0
  179. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/mixins/cost_mixin.py +0 -0
  180. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/mixins/file_history_mixin.py +0 -0
  181. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
  182. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/mixins/logger_mixin.py +0 -0
  183. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/mixins/storage_mixin.py +0 -0
  184. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/__init__.py +0 -0
  185. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/core/__init__.py +0 -0
  186. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/core/job_manager_models.py +0 -0
  187. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/core/redis.py +0 -0
  188. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/core/task_monitor.py +0 -0
  189. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/events/__init__.py +0 -0
  190. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/events/agent_events.py +0 -0
  191. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  192. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
  193. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
  194. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
  195. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/grpc_servers/types.py +0 -0
  196. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/__init__.py +0 -0
  197. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/ag_ui.py +0 -0
  198. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/base_types.py +0 -0
  199. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/loaded_tools.py +0 -0
  200. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/module.py +0 -0
  201. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/module_types.py +0 -0
  202. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/request_metadata.py +0 -0
  203. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/select_schema.py +0 -0
  204. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/tool_cache.py +0 -0
  205. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/tool_reference.py +0 -0
  206. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/module/utility.py +0 -0
  207. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/services/__init__.py +0 -0
  208. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/services/cost.py +0 -0
  209. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/services/services.py +0 -0
  210. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/services/storage.py +0 -0
  211. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/__init__.py +0 -0
  212. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/gateway.py +0 -0
  213. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/log.py +0 -0
  214. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/queue.py +0 -0
  215. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/registry.py +0 -0
  216. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/server/__init__.py +0 -0
  217. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/server/servicer.py +0 -0
  218. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/task_manager.py +0 -0
  219. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  220. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/utils/__init__.py +0 -0
  221. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
  222. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/modules/__init__.py +0 -0
  223. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/modules/archetype_module.py +0 -0
  224. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/modules/tool_module.py +0 -0
  225. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/modules/triggers/__init__.py +0 -0
  226. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/py.typed +0 -0
  227. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/__init__.py +0 -0
  228. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/base_strategy.py +0 -0
  229. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/communication/__init__.py +0 -0
  230. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/cost/__init__.py +0 -0
  231. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  232. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/cost/default_cost.py +0 -0
  233. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/cost/exceptions.py +0 -0
  234. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/cost/grpc_cost.py +0 -0
  235. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/filesystem/__init__.py +0 -0
  236. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/filesystem/exceptions.py +0 -0
  237. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
  238. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
  239. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/identity/__init__.py +0 -0
  240. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  241. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/registry/__init__.py +0 -0
  242. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/registry/exceptions.py +0 -0
  243. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/registry/registry_models.py +0 -0
  244. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/secret/__init__.py +0 -0
  245. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/secret/default_secret.py +0 -0
  246. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/secret/exceptions.py +0 -0
  247. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/secret/grpc_secret.py +0 -0
  248. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/secret/secret_strategy.py +0 -0
  249. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/services_models.py +0 -0
  250. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/setup/__init__.py +0 -0
  251. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/setup/exceptions.py +0 -0
  252. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/storage/__init__.py +0 -0
  253. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/storage/exceptions.py +0 -0
  254. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/storage/grpc_storage.py +0 -0
  255. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  256. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/task_manager/__init__.py +0 -0
  257. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/task_manager/exceptions.py +0 -0
  258. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
  259. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  260. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/user_profile/__init__.py +0 -0
  261. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/user_profile/exceptions.py +0 -0
  262. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
  263. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
  264. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/utils/__init__.py +0 -0
  265. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/utils/conditional_schema.py +0 -0
  266. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/utils/dynamic_schema.py +0 -0
  267. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/utils/exceptions.py +0 -0
  268. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/utils/proto_utils.py +0 -0
  269. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin/utils/setup_content_validator.py +0 -0
  270. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  271. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/src/digitalkin.egg-info/top_level.txt +0 -0
  272. {digitalkin-1.0.4.dev2 → digitalkin-1.0.4.dev3}/tests/test_exceptions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 1.0.4.dev2
3
+ Version: 1.0.4.dev3
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.21.dev1787220377
456
- Requires-Dist: agentic-mesh-protocol==1.0.2.dev2
456
+ Requires-Dist: agentic-mesh-protocol==1.0.1
457
457
  Requires-Dist: agno<3,>=2.8.0
458
458
  Requires-Dist: anyio>=4.13.0
459
459
  Requires-Dist: grpcio-health-checking==1.82.1
@@ -31,7 +31,7 @@
31
31
  # which is how a nested run's output is attributed to its author. Pinned exactly
32
32
  # because it is a dated prerelease; move to >=0.1.21 once that ships stable.
33
33
  "ag-ui-protocol==0.1.21.dev1787220377",
34
- "agentic-mesh-protocol==1.0.2.dev2",
34
+ "agentic-mesh-protocol==1.0.1",
35
35
  "agno>=2.8.0,<3",
36
36
  "anyio>=4.13.0",
37
37
  "grpcio-health-checking==1.82.1",
@@ -41,7 +41,7 @@
41
41
  "pydantic>=2.12.4",
42
42
  "redis[hiredis]>=7.4.0,<9",
43
43
  ]
44
- version = "1.0.4.dev2"
44
+ version = "1.0.4.dev3"
45
45
 
46
46
  [project.optional-dependencies]
47
47
  agno = [ "agno>=2.6" ]
@@ -208,15 +208,15 @@
208
208
  ]
209
209
 
210
210
  ignore = [
211
- "any-type", # Allow typing.Any — gRPC stubs, callbacks, and dynamic APIs require it
212
- "missing-trailing-comma", # Disable because of formatter incompatibility
213
- "docstring-extraneous-exception", # Allow extraneous-exception in docstring
214
- "unused-import", # Allow unused imports — used for availability checks
215
- "invalid-function-name", # Allow PascalCase methods — gRPC servicer convention
216
- "import-outside-top-level", # Allow lazy imports — needed to break circular dependencies
217
- "bad-dunder-method-name", # Allow __get_pydantic_core_schema__ — Pydantic dunder hook
218
- "hardcoded-password-string", # Hardcoded-password
219
- "suspicious-pickle-import", # Allow pickle import
211
+ "ANN401", # Allow typing.Any — gRPC stubs, callbacks, and dynamic APIs require it
212
+ "COM812", # Disable because of formatter incompatibility
213
+ "DOC502", # Allow extraneous-exception in docstring
214
+ "F401", # Allow unused imports — used for availability checks
215
+ "N802", # Allow PascalCase methods — gRPC servicer convention
216
+ "PLC0415", # Allow lazy imports — needed to break circular dependencies
217
+ "PLW3201", # Allow __get_pydantic_core_schema__ — Pydantic dunder hook
218
+ "S105", # Hardcoded-password
219
+ "S403", # Allow pickle import
220
220
  ]
221
221
 
222
222
  fixable = [ "ALL" ]
@@ -226,40 +226,40 @@
226
226
 
227
227
  [tool.ruff.lint.per-file-ignores]
228
228
  "tests/**/*.py" = [
229
- "missing-type-function-argument",
230
- "missing-type-args",
231
- "missing-type-kwargs",
232
- "missing-return-type-undocumented-public-function",
233
- "any-type",
234
- "unused-function-argument",
235
- "unused-method-argument",
236
- "complex-structure",
237
- "undocumented-public-module",
238
- "undocumented-public-class",
239
- "undocumented-public-method",
240
- "undocumented-public-function",
241
- "undocumented-public-init",
242
- "undocumented-param",
243
- "docstring-missing-returns",
244
- "docstring-missing-exception",
245
- "line-too-long",
246
- "commented-out-code",
247
- "boolean-type-hint-positional-argument",
248
- "boolean-default-value-positional-argument",
249
- "logging-f-string",
250
- "invalid-function-name",
251
- "try-except-in-loop",
252
- "import-private-name",
253
- "too-many-return-statements",
254
- "too-many-branches",
255
- "too-many-locals",
256
- "too-many-statements",
257
- "too-many-nested-blocks",
258
- "magic-value-comparison",
259
- "no-self-use",
260
- "assert",
261
- "private-member-access",
262
- "raise-vanilla-class",
229
+ "ANN001",
230
+ "ANN002",
231
+ "ANN003",
232
+ "ANN201",
233
+ "ANN401",
234
+ "ARG001",
235
+ "ARG002",
236
+ "C901",
237
+ "D100",
238
+ "D101",
239
+ "D102",
240
+ "D103",
241
+ "D107",
242
+ "D417",
243
+ "DOC201",
244
+ "DOC501",
245
+ "E501",
246
+ "ERA001",
247
+ "FBT001",
248
+ "FBT002",
249
+ "G004",
250
+ "N802",
251
+ "PERF203",
252
+ "PLC2701",
253
+ "PLR0911",
254
+ "PLR0912",
255
+ "PLR0914",
256
+ "PLR0915",
257
+ "PLR1702",
258
+ "PLR2004",
259
+ "PLR6301",
260
+ "S101",
261
+ "SLF001",
262
+ "TRY002",
263
263
  ]
264
264
 
265
265
  [tool.ruff.lint.pylint]
@@ -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.4.dev2"
8
+ __version__ = "1.0.4.dev3"
@@ -23,7 +23,6 @@ from digitalkin.models.services.registry import (
23
23
 
24
24
  if TYPE_CHECKING:
25
25
  from digitalkin.community.agno.toolkits.registry.base import RegistryActionCtx
26
- from digitalkin.models.services.registry import SetupSummary
27
26
 
28
27
 
29
28
  class GetAction(RegistryAction):
@@ -125,36 +124,23 @@ class SearchAction(RegistryAction):
125
124
  # would both contradict ``total_returned`` and, at exactly ``cap`` rows, promise an empty
126
125
  # next page.
127
126
  truncated = len(usable) > cap
128
- rows = [self._row(setup) for setup in usable[:cap]]
127
+ rows = [
128
+ {
129
+ "setup_id": setup.setup_id,
130
+ "name": setup.name,
131
+ "module_name": setup.module_name,
132
+ "version": setup.setup_version,
133
+ # Echoed because they are filterable: a caller cannot use the ``tags``,
134
+ # ``visibilities`` or ``statuses`` filters without first seeing the values in use.
135
+ "tags": setup.tags,
136
+ "visibility": setup.visibility.value if setup.visibility else None,
137
+ "status": setup.status.value if setup.status else None,
138
+ "description": (setup.documentation or "")[: self._DOC_PREVIEW_CHARS],
139
+ }
140
+ for setup in usable[:cap]
141
+ ]
129
142
  return {"total_returned": len(rows), "truncated": truncated, "offset": self.offset, "setups": rows}
130
143
 
131
- def _row(self, setup: SetupSummary) -> dict[str, Any]:
132
- """Trim one search hit to the fields a caller can act on.
133
-
134
- Args:
135
- setup: The summary returned by the registry.
136
-
137
- Returns:
138
- The rendered row.
139
- """
140
- row: dict[str, Any] = {
141
- "setup_id": setup.setup_id,
142
- "name": setup.name,
143
- "module_name": setup.module_name,
144
- "version": setup.setup_version,
145
- # Echoed because they are filterable: a caller cannot use the ``tags``,
146
- # ``visibilities`` or ``statuses`` filters without first seeing the values in use.
147
- "tags": setup.tags,
148
- "visibility": setup.visibility.value if setup.visibility else None,
149
- "status": setup.status.value if setup.status else None,
150
- "description": (setup.documentation or "")[: self._DOC_PREVIEW_CHARS],
151
- }
152
- # Only service setups carry a map. Omitting the key rather than rendering an empty
153
- # one keeps the feature out of the tools and kins surfaces entirely.
154
- if setup.structure:
155
- row["structure"] = setup.structure
156
- return row
157
-
158
144
 
159
145
  class UpdateAction(RegistryAction):
160
146
  """Update an instance: cut a new version of its configuration, and rename it.
@@ -180,20 +166,6 @@ class UpdateAction(RegistryAction):
180
166
  "without changing what the instance currently serves, then activate it later with "
181
167
  "``set_version``.",
182
168
  )
183
- documentation: str | None = Field(
184
- default=None,
185
- description="Free text describing what this instance is for, indexed by ``search``. "
186
- "Omit to keep the text the instance already has; pass a string to replace it, or an "
187
- "empty string to clear it.",
188
- )
189
-
190
- def _type_payload(self) -> dict[str, Any]: # ruff: ignore[no-self-use]
191
- """Fields this object type adds to the update.
192
-
193
- Returns:
194
- Nothing by default; ``services_manager`` overrides it to refresh the structure map.
195
- """
196
- return {}
197
169
 
198
170
  async def execute(self, ctx: RegistryActionCtx) -> Any:
199
171
  """Cut a new version of the setup's content and rename it.
@@ -212,10 +184,6 @@ class UpdateAction(RegistryAction):
212
184
  "name": self.name,
213
185
  "content": self.content,
214
186
  "set_as_current": self.set_as_current,
215
- "documentation": (
216
- setup.current_setup_version.documentation if self.documentation is None else self.documentation
217
- ),
218
- **self._type_payload(),
219
187
  })
220
188
 
221
189
 
@@ -171,23 +171,22 @@ class RegistryAction(BaseAction[RegistryActionCtx], ABC):
171
171
 
172
172
  writes: ClassVar[bool] = False
173
173
 
174
- @field_validator("name", "documentation", check_fields=False)
174
+ @field_validator("name", check_fields=False)
175
175
  @classmethod
176
- def _text_has_no_control_chars(cls, value: str | None) -> str | None:
177
- """Reject control characters in user-facing free text so it fails loudly, not silently.
176
+ def _name_has_no_control_chars(cls, value: str) -> str:
177
+ """Reject control characters in a user-facing ``name`` so it fails loudly, not silently.
178
178
 
179
- ``name`` and ``documentation`` bypass the content validator, so without this a NUL byte
180
- or ANSI escape would reach persistence and be stripped there, altering the value without
181
- telling the caller. Applies to any action declaring either (update, service create).
182
- ``None`` is the "leave unchanged" marker on update and has nothing to check.
179
+ The action's ``name`` bypasses the content validator, so without this a NUL byte or ANSI
180
+ escape would reach persistence and be stripped there, altering the value without telling
181
+ the caller. Applies to any action declaring ``name`` (update, service create).
183
182
 
184
183
  Returns:
185
- The value unchanged when clean.
184
+ The name unchanged when clean.
186
185
 
187
186
  Raises:
188
- ValueError: The value carries a control character.
187
+ ValueError: The name carries a control character.
189
188
  """
190
- return value if value is None else SetupContentValidator.reject_control_chars(value)
189
+ return SetupContentValidator.reject_control_chars(value)
191
190
 
192
191
  @field_validator("content", check_fields=False)
193
192
  @classmethod
@@ -347,11 +346,7 @@ class RegistryObjectToolKit(DkToolkit):
347
346
  Also echoes ``visibility`` back in the caller's vocabulary — the input enum is
348
347
  ``public``/``private``/``internal`` but the backend returns the proto name
349
348
  ``VISIBILITY_INTERNAL``, so a naive round-trip fails. Strip the prefix and
350
- lower-case it so the field read back matches the field written. Confined to the
351
- model branch on purpose: every action carrying a real setup visibility returns a
352
- ``SetupData``, while the actions returning a plain dict return a *configuration*
353
- (``load``) or its key map (``structure``), where a key called ``visibility`` is the
354
- service's own data and rewriting it would corrupt what the caller asked for.
349
+ lower-case it so the field read back matches the field written.
355
350
 
356
351
  Args:
357
352
  value: A Pydantic model, proto message, or plain scalar/collection.
@@ -134,7 +134,7 @@ class LoadToolAction(LoadAction):
134
134
  )
135
135
  return None
136
136
 
137
- async def execute(self, ctx: LoadActionCtx) -> LoadOutcome: # ruff: ignore[complex-structure, too-many-return-statements] — each return is a distinct, LLM-readable outcome
137
+ async def execute(self, ctx: LoadActionCtx) -> LoadOutcome: # noqa: C901, PLR0911 — each return is a distinct, LLM-readable outcome
138
138
  """Resolve the setup into a ModuleToolkit and append it to the live tool list.
139
139
 
140
140
  Idempotent per ``setup_id``; never raises. The setup's family is read first so a
@@ -63,7 +63,7 @@ class LoadManager(DkToolkit):
63
63
  """
64
64
  self._base_tools = base_tools
65
65
 
66
- async def load_manager(self, action: LoadActions) -> str: # ruff: ignore[unused-method-argument] — schema-only stub, never run
66
+ async def load_manager(self, action: LoadActions) -> str: # noqa: ARG002 — schema-only stub, never run
67
67
  """Load a discovered object into the agent so it becomes usable right now.
68
68
 
69
69
  Loading is a two-step flow, and this is step two: first DISCOVER the object with its
@@ -0,0 +1,92 @@
1
+ """Actions for the ``services_manager`` dispatcher.
2
+
3
+ Adds the two service-specific actions to the shared CRUD + search set:
4
+
5
+ - ``create`` — create a shareable service from a name + configuration JSON;
6
+ - ``load`` — return the service's stored JSON configuration content (distinct from
7
+ Tool.load, which loads a live tool into the agent).
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from typing import TYPE_CHECKING, Annotated, Any, ClassVar, Literal
13
+
14
+ from pydantic import Field
15
+
16
+ from digitalkin.community.agno.toolkits.registry.action import (
17
+ ChangeVisibilityAction,
18
+ DeleteAction,
19
+ GetAction,
20
+ ListVersionsAction,
21
+ SearchAction,
22
+ SetVersionAction,
23
+ UpdateAction,
24
+ )
25
+ from digitalkin.community.agno.toolkits.registry.base import RegistryAction
26
+
27
+ if TYPE_CHECKING:
28
+ from digitalkin.community.agno.toolkits.registry.base import RegistryActionCtx
29
+
30
+
31
+ class CreateServiceAction(RegistryAction):
32
+ """Create a shareable service other kins can discover.
33
+
34
+ Only a name and the configuration JSON are needed — owner, organisation and kind
35
+ are derived server-side. Once created it is discoverable via ``search`` and
36
+ readable via ``load``.
37
+ The service is always created *private* (owner only): visibility is not a creation
38
+ parameter. Widening it to ``internal`` (whole organisation) or ``public`` (everyone)
39
+ requires a separate ``change_visibility`` call.
40
+ """
41
+
42
+ action: Literal["create"] = "create"
43
+ writes: ClassVar[bool] = True
44
+ name: str = Field(..., description="Human-readable service name.")
45
+ content: dict[str, Any] = Field(
46
+ ...,
47
+ min_length=1,
48
+ description="The service configuration (a non-empty JSON object). "
49
+ "Note: JSON numbers round-trip as floats over the wire.",
50
+ )
51
+
52
+ async def execute(self, ctx: RegistryActionCtx) -> Any:
53
+ """Create the service setup from its name and content.
54
+
55
+ Returns:
56
+ The created service setup.
57
+ """
58
+ return await ctx.setup.create_service_setup(self.name, self.content)
59
+
60
+
61
+ class LoadServiceAction(RegistryAction):
62
+ """Load a service: return its stored JSON configuration content."""
63
+
64
+ action: Literal["load"] = "load"
65
+ setup_id: str = Field(..., description="The service setup id to load (from a search result).")
66
+
67
+ async def execute(self, ctx: RegistryActionCtx) -> Any:
68
+ """Return the service's configuration content (latest version).
69
+
70
+ Guards the object type first: without it ``load`` would happily return a tool's
71
+ internal configuration — the most dangerous type-confusion, since the response
72
+ carries no field the caller could use to notice it read the wrong kind.
73
+
74
+ Returns:
75
+ The service configuration JSON object, or ``None`` when not found.
76
+ """
77
+ setup = await ctx.ensure_kind(self.setup_id)
78
+ return setup.current_setup_version.content
79
+
80
+
81
+ ServiceActions = Annotated[
82
+ GetAction
83
+ | CreateServiceAction
84
+ | SearchAction
85
+ | LoadServiceAction
86
+ | UpdateAction
87
+ | DeleteAction
88
+ | ChangeVisibilityAction
89
+ | ListVersionsAction
90
+ | SetVersionAction,
91
+ Field(discriminator="action"),
92
+ ]
@@ -37,17 +37,11 @@ class ServicesManager(RegistryObjectToolKit):
37
37
  name="services_manager",
38
38
  actions=ServiceActions,
39
39
  description=(
40
- "Manage Service SETUPS: create, search, structure, load, update, delete, "
41
- "change_visibility, plus list_versions / set_version to inspect the configuration "
42
- "history and undo a bad update. The action discriminator selects the operation. "
43
- "Configurations can be large, so read them in two steps: 'search' returns each "
44
- "result with a 'structure' map of key path -> what lives there ('structure' fetches "
45
- "the same map for an id you already hold), then 'load' with a key copied verbatim "
46
- "from it returns just that part. Copy the key, never invent one: a key the "
47
- "configuration does not have quietly returns everything. Load without a key only when "
48
- "the whole document is genuinely needed. On create and update you write that map "
49
- "yourself, describing what "
50
- "each key is for — it is how other agents find their way around the configuration."
40
+ "Manage Service SETUPS: create, search, load, update, delete, change_visibility, plus "
41
+ "list_versions / set_version to inspect the configuration history and undo a bad "
42
+ "update. The "
43
+ "action discriminator selects the operation; 'load' returns a service's configuration "
44
+ "content for use."
51
45
  ),
52
46
  entrypoint=self.services_manager,
53
47
  )
@@ -186,7 +186,7 @@ class SingleJobManager(BaseJobManager[InputModelT, OutputModelT, SetupModelT]):
186
186
  data = output_data.model_dump(mode="json")
187
187
 
188
188
  # Lock guards only the session validity check; queue.put() runs outside.
189
- async with session._write_lock: # ruff: ignore[private-member-access]
189
+ async with session._write_lock: # noqa: SLF001
190
190
  if self.tasks_sessions.get(job_id) is None:
191
191
  logger.debug("Queue write rejected - session removed during lock wait", extra={"job_id": job_id})
192
192
  return
@@ -55,7 +55,7 @@ class TaskProfiler:
55
55
  for stale in candidates[keep_n:]:
56
56
  try:
57
57
  stale.unlink()
58
- except OSError: # ruff: ignore[try-except-in-loop]
58
+ except OSError: # noqa: PERF203
59
59
  logger.debug("Profiler rotation: could not delete %s", stale)
60
60
 
61
61
  def start(self) -> None:
@@ -63,7 +63,7 @@ class TaskProfiler:
63
63
  if self._mode == ProfilerMode.NONE:
64
64
  return
65
65
 
66
- try: # ruff: ignore[too-many-statements-in-try-clause]
66
+ try: # noqa: PLW0717
67
67
  os.makedirs(self._output_dir, exist_ok=True)
68
68
 
69
69
  if self._mode == ProfilerMode.VIZTRACER:
@@ -100,7 +100,7 @@ class TaskProfiler:
100
100
  if self._profiler is None and not self._yappi_started:
101
101
  return
102
102
 
103
- try: # ruff: ignore[too-many-statements-in-try-clause]
103
+ try: # noqa: PLW0717
104
104
  timestamp = datetime.datetime.now(datetime.timezone.utc).strftime("%Y%m%dT%H%M%S%f")
105
105
  base = f"{self._task_id}_{timestamp}"
106
106
 
@@ -15,13 +15,12 @@ Usage in ModuleContext or service wrapper::
15
15
  from __future__ import annotations
16
16
 
17
17
  import asyncio
18
- import os
19
18
  from typing import ClassVar
20
19
 
21
20
  from typing_extensions import Self
22
21
 
23
22
  from digitalkin.core.exceptions import BulkheadFullError
24
- from digitalkin.models.settings.resilience import get_bulkhead_settings
23
+ from digitalkin.models.settings.resilience import BulkheadServiceSettings, get_bulkhead_settings
25
24
 
26
25
 
27
26
  class Bulkhead:
@@ -62,10 +61,10 @@ class Bulkhead:
62
61
  del cls._instances[oldest]
63
62
 
64
63
  settings = get_bulkhead_settings()
65
- # Per-service override has a dynamic env-var suffix, so it cannot be a
66
- # static settings field — read it directly, falling back to the setting.
67
- env_max = os.environ.get(f"DIGITALKIN_BULKHEAD_{service_id.upper()}_MAX")
68
- max_concurrent = int(env_max) if env_max is not None else settings.default_max
64
+ # The override carries the service id in the variable name; the settings
65
+ # class builds that prefix itself, so nothing here touches the environment.
66
+ override = BulkheadServiceSettings(service_id).max
67
+ max_concurrent = override if override is not None else settings.default_max
69
68
 
70
69
  inst = cls(
71
70
  service_id=service_id,
@@ -78,7 +78,7 @@ class BaseTaskManager(ABC):
78
78
  session = self.tasks_sessions.get(task_id)
79
79
  if session is not None:
80
80
  # Close stream under the write lock so pending writes see stream_closed.
81
- async with session._write_lock: # ruff: ignore[private-member-access]
81
+ async with session._write_lock: # noqa: SLF001
82
82
  session.close_stream()
83
83
 
84
84
  session = self.tasks_sessions.pop(task_id, None)
@@ -49,7 +49,7 @@ class LocalTaskManager(BaseTaskManager):
49
49
  """
50
50
  await self._acquire_task_slot(coro)
51
51
  registered = False
52
- try: # ruff: ignore[too-many-statements-in-try-clause]
52
+ try: # noqa: PLW0717
53
53
  async with self._tasks_lock:
54
54
  await self._validate_task_creation(task_id, mission_id, coro)
55
55
  session = self._create_session(task_id, mission_id, module)
@@ -43,7 +43,7 @@ class ModuleRunner:
43
43
  self._redis_client = redis_client
44
44
  self._servicer = servicer
45
45
 
46
- async def run( # ruff: ignore[complex-structure, too-many-locals, too-many-statements]
46
+ async def run( # noqa: C901, PLR0914, PLR0915
47
47
  self,
48
48
  query: struct_pb2.Struct,
49
49
  *,
@@ -80,11 +80,11 @@ class ModuleRunner:
80
80
 
81
81
  top_level_keys: list[str] = []
82
82
  query_byte_size = 0
83
- try: # ruff: ignore[too-many-statements-in-try-clause]
83
+ try: # noqa: PLW0717
84
84
  timer.mark("entry")
85
85
  profiler.start()
86
86
 
87
- try: # ruff: ignore[too-many-statements-in-try-clause]
87
+ try: # noqa: PLW0717
88
88
  setup_version = await self._servicer.resolve_setup(setup_id, mission_id)
89
89
  timer.mark("setup_resolve")
90
90
 
@@ -93,8 +93,8 @@ class ModuleRunner:
93
93
 
94
94
  tool_cache = self._servicer.get_tool_cache(setup_version.setup_id)
95
95
  if tool_cache is None:
96
- registry = self._servicer._get_registry() # ruff: ignore[private-member-access]
97
- communication = self._servicer._get_communication() # ruff: ignore[private-member-access]
96
+ registry = self._servicer._get_registry() # noqa: SLF001
97
+ communication = self._servicer._get_communication() # noqa: SLF001
98
98
  if registry is not None and communication is not None:
99
99
  tool_cache = await self._servicer.get_or_build_tool_cache(
100
100
  setup_version.setup_id,
@@ -207,7 +207,7 @@ class ModuleRunner:
207
207
 
208
208
  except ValidationError as exc:
209
209
  input_format_cls = (
210
- self._servicer.module_class._extended_input_format # ruff: ignore[private-member-access]
210
+ self._servicer.module_class._extended_input_format # noqa: SLF001
211
211
  or self._servicer.module_class.input_format
212
212
  )
213
213
  model_name = input_format_cls.__name__ if input_format_cls is not None else "<unknown>"
@@ -43,7 +43,7 @@ class ProtoStreamReader:
43
43
  """Initialize proto stream reader.
44
44
 
45
45
  Cursor TTL comes from ``GatewayStreamSettings.redis_cursor_ttl`` (env
46
- ``DIGITALKIN_REDIS_CURSOR_TTL``).
46
+ ``DIGITALKIN_GATEWAY_STREAM_REDIS_CURSOR_TTL``).
47
47
 
48
48
  Args:
49
49
  task_id: Unique task identifier.
@@ -69,7 +69,7 @@ class ProtoStreamReader:
69
69
  """Persist the current cursor to Redis."""
70
70
  await self._redis_client.set(self._cursor_key, self._last_id, ex=get_gateway_settings().stream.redis_cursor_ttl)
71
71
 
72
- async def read_structs( # ruff: ignore[complex-structure]
72
+ async def read_structs( # noqa: C901
73
73
  self,
74
74
  count: int = 50,
75
75
  cursor_save_interval: int = 100,
@@ -26,7 +26,7 @@ if TYPE_CHECKING:
26
26
  import builtins
27
27
 
28
28
 
29
- class RedisClient: # ruff: ignore[too-many-public-methods]
29
+ class RedisClient: # noqa: PLR0904
30
30
  """Redis connection pool manager with split read/write pools.
31
31
 
32
32
  Attributes:
@@ -10,7 +10,7 @@ import uuid
10
10
  from typing import TYPE_CHECKING, Any, ClassVar
11
11
 
12
12
  from digitalkin.core.resilience.task_supervisor import log_unhandled
13
- from digitalkin.core.task_manager.redis.redis_client import RedisClient # ruff: ignore[typing-only-first-party-import]
13
+ from digitalkin.core.task_manager.redis.redis_client import RedisClient # noqa: TC001
14
14
  from digitalkin.logger import logger
15
15
  from digitalkin.models.settings.redis import get_redis_settings
16
16
 
@@ -41,7 +41,7 @@ class SharedRedisListener:
41
41
  if key not in cls._instances:
42
42
  cls._instances[key] = cls(redis_client)
43
43
  inst = cls._instances[key]
44
- inst._refcount += 1 # ruff: ignore[private-member-access]
44
+ inst._refcount += 1 # noqa: SLF001
45
45
  return inst
46
46
 
47
47
  @classmethod
@@ -50,8 +50,8 @@ class SharedRedisListener:
50
50
  inst = cls._instances.get(key)
51
51
  if inst is None:
52
52
  return
53
- inst._refcount -= 1 # ruff: ignore[private-member-access]
54
- if inst._refcount <= 0: # ruff: ignore[private-member-access]
53
+ inst._refcount -= 1 # noqa: SLF001
54
+ if inst._refcount <= 0: # noqa: SLF001
55
55
  cls._instances.pop(key, None)
56
56
  await inst.close()
57
57
 
@@ -244,7 +244,7 @@ class SharedRedisListener:
244
244
  """Drain PubSub messages; exponential-backoff retry on transient Redis errors."""
245
245
  backoff = 0.1
246
246
  while not self._stop_event.is_set():
247
- try: # ruff: ignore[too-many-statements-in-try-clause]
247
+ try: # noqa: PLW0717
248
248
  if self._pubsub is None:
249
249
  self._pubsub = self._redis_client.pubsub()
250
250
  psub_t0 = time.perf_counter_ns()
@@ -282,7 +282,7 @@ class SharedRedisListener:
282
282
  backoff = min(backoff * 2, 10.0)
283
283
 
284
284
  now = time.monotonic()
285
- if now - self._last_counters_log >= 60.0: # ruff: ignore[magic-value-comparison]
285
+ if now - self._last_counters_log >= 60.0: # noqa: PLR2004
286
286
  c = self._counters
287
287
  logger.debug(
288
288
  "[perf] signal_counters: origin=%s received=%d deduped=%d evicted=%d "
@@ -10,7 +10,7 @@ from __future__ import annotations
10
10
  from datetime import datetime, timezone
11
11
  from typing import Any
12
12
 
13
- from digitalkin.core.task_manager.redis.redis_client import RedisClient # ruff: ignore[typing-only-first-party-import]
13
+ from digitalkin.core.task_manager.redis.redis_client import RedisClient # noqa: TC001
14
14
  from digitalkin.logger import logger
15
15
  from digitalkin.models.settings.redis import get_redis_settings
16
16
 
@@ -39,7 +39,7 @@ class RemoteTaskManager(BaseTaskManager):
39
39
  """
40
40
  await self._acquire_task_slot(coro)
41
41
  registered = False
42
- try: # ruff: ignore[too-many-statements-in-try-clause]
42
+ try: # noqa: PLW0717
43
43
  # Validate and register session atomically
44
44
  async with self._tasks_lock:
45
45
  await self._validate_task_creation(task_id, mission_id, coro)